1 个稳定版本
1.1.4 | 2023 年 9 月 4 日 |
---|---|
1.1.3 |
|
1.1.1 |
|
#71 在 科学
310KB
7.5K SLoC
SEUIF97
这是高速 IAPWS-IF97 包 seuif97 的 Rust 实现,具有 C 和 Python 绑定。它适用于计算密集型计算,如热循环计算、非稳态过程模拟、实时过程监控和优化。
通过高速包,在计算区域 1、2、3 的基本方程时,与使用 Rust 标准库中的 powi()
的 for
循环直接相比,IAPWS-IF97 的结果可以以大约 5-20 倍的速度准确产生。
快速方法
- 多步法在循环中使用
powi()
并利用编译器优化 - 递归法计算基本变量及其导数的多项式值
在该包中,可以计算 36 个热力学、输运和其他属性。
实现了以下 12 组输入
(p,t) (p,h) (p,s) (p,v)
(t,h) (t,s) (t,v)
(p,x) (t,x) (h,x) (s,x)
(h,s)
用法
安装包
cargo add seuif97
包中提供了函数类型
struct o_id_region_args {
o_id: i32,
region: i32,
}
fn<R>(f64,f64,R) -> f64
where
R: Into<o_id_region_args>,
- 第一个、第二个输入参数(f64):输入属性对
- 第三个和第四个输入参数
- 第三个:计算属性的属性 ID - o_id
- 第四个
option
参数:IAPWS-IF97 的区域
- 返回(f64):o_id 的计算属性值
pt<R>(p:f64,t:f64,o_id_region:R)->f64
ph<R>(p:f64,h:f64,o_id_region:R)->f64
ps<R>(p:f64,s:f64,o_id_region:R)->f64
pv<R>(p:f64,v:f64,o_id_region:R)->f64
th<R>(t:f64,h:f64,o_id_region:R)->f64
ts<R>(t:f64,s:f64,o_id_region:R)->f64
tv<R>(t:f64,v:f64,o_id_region:R)->f64
hs<R>(h:f64,s:f64,o_id_region:R)->f64
px(p:f64,x:f64,o_id:i32)->f64
tx(p:f64,x:f64,o_id:i32)->f64
hx(h:f64,x:f64,o_id:i32)->f64
sx(s:f64,x:f64,o_id:i32)->f64
示例
use seuif97::*;
fn main() {
let p:f64 = 3.0;
let t:f64= 300.0-273.15;
let h=pt(p,t,OH);
let s=pt(p,t,OS);
// set the region
let v=pt(p,t,(OV,1));
println!("p={p:.6} t={t:.6} h={t:.6} s={s:.6} v={v:.6}");
}
C 绑定
构建动态链接库
- cdecl
cargo build -r --features cdecl
- stdcall:Win32 API 函数
cargo build -r --features stdcall
在 ./dynamic_lib/ 提供了方便编译的动态链接库
C 语言的函数
double pt(double p,double t,short o_id);
double ph(double p,double h,short o_id);
double ps(double p,double s,short o_id);
double pv(double p,double v,short o_id);
double tv(double t,double v,short o_id);
double th(double t,double h,short o_id);
double ts(double t,double s,short o_id);
double hs(double h,double s,short o_id);
double px(double p,double x,short o_id);
double tx(double t,double x,short o_id);
double hx(double h,double x,short o_id);
double sx(double s,double x,short o_id);
示例
- ./demo_using_lib/:C,Python,C#,Excel VBA,Java,Fortran
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define OH 4
#define OS 5
extern double pt(double p,double t,short o_id);
int main(void)
{
double p = 16.0;
double t = 530.0;
double h = pt(p, t, OH);
double s = pt(p, t, OS);
printf("p,t %f,%f h= %f s= %f\n", p, t, h, s);
return EXIT_SUCCESS;
}
Rankine 循环分析示例
Python 绑定
安装
pip install seuif97
示例
from seuif97 import *
OH=4
p=16.0
t=535.1
# ??(in1,in2,o_id)
h=pt(p,t,OH)
# ??2?(in1,in2)
s=pt2s(p,t)
print(f"p={p}, t={t} h={h:.3f} s={s:.3f}")
示例
属性
属性 | 单位 | 符号 | o_id | o_id(i32) |
---|---|---|---|---|
压力 | MPa | p | OP | 0 |
温度 | °C | t | OT | 1 |
密度 | kg/m³ | ρ | OD | 2 |
比体积 | m³/kg | v | OV | 3 |
比焓 | kJ/kg | h | OH | 4 |
比熵 | kJ/(kg·K) | s | OS | 5 |
比自由能 | kJ/kg | e | OE | 6 |
比内能 | kJ/kg | u | OU | 7 |
比定压热容 | kJ/(kg·K) | cp | OCP | 8 |
比定容热容 | kJ/(kg·K) | cv | OCV | 9 |
声速 | m/s | w | OW | 10 |
绝热指数 | k | OKS | 11 | |
比亥姆霍兹自由能 | kJ/kg | f | OF | 12 |
比吉布斯自由能 | kJ/kg | g | OG | 13 |
压缩因子 | z | OZ | 14 | |
蒸汽质量 | x | OX | 15 | |
区域 | r | OR | 16 | |
等压立方膨胀系数 | 1/K | ɑv | OEC | 17 |
等温压缩系数 | 1/MPa | kT | OKT | 18 |
偏导数 (∂V/∂T)p | m³/(kg·K) | (∂V/∂T)p | ODVDT | 19 |
偏导数 (∂V/∂p)T | m³/(kg·MPa) | (∂v/∂p)t | ODVDP | 20 |
偏导数 (∂P/∂T)v | MPa/K | (∂p/∂t)v | ODPDT | 21 |
等温节流系数 | kJ/(kg·MPa) | δt | OIJTC | 22 |
焦耳-汤姆逊系数 | K/MPa | μ | OJTC | 23 |
动力粘度 | Pa·s | η | ODV | 24 |
运动粘度 | m²/s | ν | OKV | 25 |
热导率 | W/(m.K) | λ | OTC | 26 |
热扩散率 | m²/s | a | OTD | 27 |
普朗特数 | Pr | OPR | 28 | |
表面张力 | N/m | σ | OST | 29 |
介电常数 | ε | OSDC | 30 | |
等容压力系数 | 1/K | β | OPC | 31 |
等温应力系数 | kg/m³ | βp | OBETAP | 32 |
逸度系数 | fi | OFI | 33 | |
逸度 | MPa | f* | OFU | 34 |
相对压力系数 | 1/K | αp | OAFLAP | 35 |
引用方式
- 程茂华. (2023). 高速 IAPWS-IF97 包的 Rust 实现:SEUIF97 (1.0.9). Zenodo. https://doi.org/10.5281/zenodo.8246380
依赖项
~0–5MB
~12K SLoC