3 个稳定版本

1.4.4 2023 年 8 月 10 日
1.3.9 2023 年 8 月 9 日
1.0.9 2023 年 7 月 27 日
0.4.1 2023 年 7 月 18 日
0.1.9 2023 年 7 月 12 日

16#high-speed 中排名 #16

Download history · Rust 包仓库 414/week @ 2024-04-01 · Rust 包仓库 71/week @ 2024-07-01 · Rust 包仓库

71 每月下载量

MIT 许可证

300KB
7.5K SLoC

IF97

docs.rs Build test

IF97 是 Rust 中 IAPWS-IF97 的高速包,具有 C 和 Python 绑定。它适用于计算密集型计算,如热循环计算、非稳态过程的模拟、实时过程监控和优化。

通过高速包,IAPWS-IF97 的结果在计算 1、2、3 区域的基本方程时,与使用 Rust 标准库中的 powi()for 循环直接相比,可提高约 5-20 倍的速度。

快速方法

  1. 多步法在执行 powi() 时释放编译器优化的全部功能,并使用 for 循环
  2. 递归方法计算基变量及其导数的多项式值

在 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);

示例

#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}")

T-S 图

T-S Diagram

属性

属性 单位 符号 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