3 个稳定版本
1.4.4 | 2023 年 8 月 10 日 |
---|---|
1.3.9 | 2023 年 8 月 9 日 |
1.0.9 | 2023 年 7 月 27 日 |
0.4.1 |
|
0.1.9 |
|
16 在 #high-speed 中排名 #16
71 每月下载量
300KB
7.5K SLoC
IF97
IF97 是 Rust 中 IAPWS-IF97 的高速包,具有 C 和 Python 绑定。它适用于计算密集型计算,如热循环计算、非稳态过程的模拟、实时过程监控和优化。
通过高速包,IAPWS-IF97 的结果在计算 1、2、3 区域的基本方程时,与使用 Rust 标准库中的 powi()
和 for
循环直接相比,可提高约 5-20 倍的速度。
快速方法
- 多步法在执行
powi()
时释放编译器优化的全部功能,并使用for
循环 - 递归方法计算基变量及其导数的多项式值
在 IF97 中,可以计算 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)
使用方法
安装 crate
cargo add if97
if97 包提供了函数的类型
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 if97::*;
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;
}
Python 绑定
安装
pip install if97
示例
from if97 import *
OH=4
OS=5
p=16.0
t=535.1
h=pt(p,t,OH)
s=pt(p,t,OS)
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 |
依赖关系
~0–5.5MB
~12K SLoC