zoukankan      html  css  js  c++  java
  • 用于水和水蒸汽物性计算的Python模块——iapws

    在进行热力循环分析、流动传热计算时,需获得水和水蒸汽的物性参数。网上主流的水蒸汽物性计算程序是上海成套所的杨宇教授开发的,有Fortran、C、C#、VB等多个语言版本,还有桌面版本,被本专业学生和研究人员广泛使用。可以说杨教授为同行的便利做了很大贡献,本想贴一下他的个人博客的,但发现他的博客链接挂了。

    最近打算使用混合编程,写个Python版本的水蒸汽物性计算的接口程序,搞个在线查询的web,然而google后发现已经有了用于水和水蒸汽物性计算的Python模块——iapws,不得不安利给大家。其实工科领域用Python的不多,要是有人用的话希望别重复造轮子。

    iapws官网:https://github.com/jjgomera/iapws/tree/master/docs

    1、简介

    iapws是IAPWS标准的Python实现,包含一下几个模块:

    • IAPWS-IF97——水蒸汽
    • IAPWS-95——水蒸汽
    • IAPWS-06——冰
    • IAPWS-08——海水
    • IAPWS-17—— 重水
    • ......

    iapws依赖于numpy-scipy科学计算模块。本文主要介绍IAPWS-IF97模块的使用。IAPWS-IF97实现了5个区域的基本方程(下图)。可以看出压力、温度的范围是很宽的,足够满足工程需要。

    2、使用

    直接在控制台执行:pip install iapws,安装iapws时会自动安装numpy scipy这两个模块。

    2.1 IAPWS97类

    可以使用该IAPWS97类创建一个特定热力学状态的对象,该类的构造函数的关键字参数包括:

    • T:温度[K]
    • P:压力[MPa]
    • h:比焓[kJ/kg]
    • s:比熵[kJ/kgK]
    • x:干度[-]

    有效的参数组合有:

    • T, P: 对两相无效
    • P, h
    • P, s
    • h, s
    • T, x: 仅适用于两相
    • P, x: 仅适用于两相

    计算的物性参数如下表所示。我将自己认为常用的参数列在前面了。许多参数不知道什么意思,翻译也不知道有没有问题。可参考:http://iapws.readthedocs.io/en/latest/iapws.iapws97.html

    P:压力[MPa] a:亥姆霍兹自由能[kJ / kg] joule:焦耳 - 汤姆森系数[K / MPa]
    T:温度[K] Z:压缩系数[ - ] deltat:等温节流系数[kJ / kg·MPa]
    v:比容量[m³/ kg] fi:逸度系数[ - ] region:地区
    rho:密度[kg /m³] f:逸度[MPa] v0:理想比容[m³/ kg]
    h:比焓[kJ / kg] γ:等熵指数[ - ] u0:理想的内能[kJ / kg]
    u:特定内能[kJ / kg] alfav:等压膨胀系数[1 / K] h0:理想比焓[kJ / kg]
    s:比熵[kJ / kg·K] xkappa:等温压缩率[1 / MPa] s0:理想比熵[kJ / kg·K]
    cp:定压比热[kJ / kg·K] kappas:绝热可压缩率[1 / MPa] a0:理想亥姆霍兹自由能[kJ / kg]
    cv:定容比热[kJ / kg·K] alfap:相对压力系数[1 / K] g0:理想比吉布斯自由能[kJ / kg]
    g:比Gibbs自由能[kJ / kg] betap:等温应力系数[kg /m³] cp0:理想定压比热[kJ / kg·K]
    n:折射率[ - ] Pr:折算压力[ - ] cv0:理想定容比热[kJ / kg·K]
    Prandt:普朗特数[ - ] Tr:折算温度[ - ] Svap:蒸发熵[kJ / kg·K]
    μ:动态粘度[Pa·s] w0:理想音速[m / s] gamma0:理想等熵指数[ - ]
    nu:运动粘度[m²/ s] k:导热系数[W / m·K] epsilon:介电常数[ - ]
    w:音速[m / s] alfa:热扩散系数[m²/ s]  
    Hvap:汽化热[kJ / kg] sigma:表面张力[N / m]  

    查看源码发现,使用IAPWS97类进行物性查询时,先执行calculable方法判断输入条件是否可计算,若可以计算则执行calculo方法,判断输入参数确定的物性状态所处的区域,随后计算各物性。下面是示例:

    >>> from iapws import IAPWS97
    #>>>> 常压常温水 <<<<
    >>> water=IAPWS97(T=24+273.15,P=0.013)
    # 焓值
    >>> water.h
    100.66509664191254
    # 密度
    >>> water.rho
    997.2595184928771
    #>>>> 高压蒸汽 <<<<
    >>> vapor = IAPWS97(P=15.5, x=1.0)
    # 温度
    >>> vapor.T
    617.9415516035506
    # 饱和汽焓
    >>> vapor.h
    2596.2167214338015
    # 饱和水焓
    >>> IAPWS97(P=15.5, x=0).h
    1629.8502994294881

    当输入无效的参数组合时,实例会正常产生但不进行物性计算,实例的calculable方法返回空字符串;当输入有效的参数组合时,若可查询则calculable方法返回查询组合,若超出查询范围则抛出异常。

    #>>>> 无效的输入 <<<<
    >>> test1 = IAPWS97(h=2000.0, T=300.0)
    # 未绑定属性h
    >>> test1.h
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'IAPWS97' object has no attribute 'h'
    # calculable返回空字符串
    >>> test1.calculable
    ''
    #>>>> 有效的输入 <<<<
    >>> vapor = IAPWS97(P=15.5, x=1.0)
    # calculable返回输入的组合
    >>> vapor.calculable
    'Px'
    #>>>> 超出查询范围的输入 <<<<
    >>> test2 = IAPWS97(P=100.0, T=45.0)
    Traceback (most recent call last):
    ...
    NotImplementedError: Incoming out of bound

    IAPWS97类提供了丰富的物性计算,若仅是为了查询物性,直接使用该类就行了。但在瞬态计算或其他需要频繁计算物性的场合下,通过IAPWS97类计算物性是不够明智的。因为一般情况下仅仅需要输出一个物性参数就足够了,如根据压力、焓值计算温度,而IAPWS97类计算了许多我们不需要的参数,这会拖慢程序的运行效率。本来程序具有超实时的运行能力,由于物性查询方法的错误使用,程序可能变得巨慢。物性查询成为程序的性能瓶颈,这显然是不合理的。

    iapws.iapws97模块提供了一系列的基本方程(fundamental equations)和向后方程(backward equation),用于特定场合下的物性计算。

    2.2 基本方程

    iapws.iapws97模块提供了如下基本方程,用于不同区域内的物性计算。形如_Regionr()的函数,根据输入的参数,确定区域r内的状态,返回一个字典;_TSat_P、_PSat_T这两个函数计算饱和线上的物性。

    • _Region1(TP)
    • _Region2(TP)
    • _Region3(rhoT)
    • _Region4(Px)
    • _Region5(s)
    • _TSat_P(P)
    • _PSat_T(s)

    _Region1和_Region2的输入均是T、P,那么在使用时要预先判断T、P所指示的区域:

    from iapws import iapws97
    # >>>> 区域1计算示例 <<<<
    # 确定区域
    >>> iapws97._Bound_TP(300,3)
    1
    # 获得比容
    >>> iapws97._Region1(300,3)['v']
    0.0010021516796866943
    # 获得比焓
    >>> iapws97._Region1(300,3)['h']
    115.3312730214384
    # >>>> 区域2计算示例 <<<<
    # 确定区域
    >>> iapws97._Bound_TP(700,3)
    2
    # 获得比容
    >>> iapws97._Region1(300,3)['v']
    0.0010021516796866943
    # 获得比熵
    >>> iapws97._Region1(300,3)['s']
    0.39229479240262427

    饱和线上的物性计算:

    # 计算饱和温度
    >>> iapws97._TSat_P(15.5)
    617.9415516035506
    # 计算饱和压力
    >>> iapws97._PSat_T(100+273.15)
    0.10141797792131013
    >>>

    2.3 向后方程

    向后方程指形如_Backwardr_x_yz的方程,其中r为物性区域,yz为输入参数,x为返回参数。

    • _Backward1_T_Ph
    • _Backward1_T_Ps
    • _Backward1_P_hs
    • _Backward2_T_Ph
    • ...

    需要注意,和基本方程一样,向后方程也不进行区域判断。当选择错误的函数时,将输出离奇的计算结果:

    >>> from iapws import iapws97
    # 错误的使用示例
    >>> iapws97._Backward2_T_Ph(3,500)
    4.1313215739117547e+21
    # 错误的使用示例
    >>> iapws97._Backward3_T_Ph(3,500)
    -1637746.3600011615
    # 判断区域
    >>> iapws97._Bound_Ph(3,500)
    1
    # 正确的使用示例
    >>> iapws97._Backward1_T_Ph(3,500)
    391.7985087624256
  • 相关阅读:
    邮件系列3 --- 安全传输
    配置postfix支持虚拟域和虚拟用户
    Postfix+Sasl+Courier-authlib+Dovecot+MySQL+extmail 邮件系统部署
    在switch中的case语句中声明变量编译出错的解决方案
    关于自控力
    PUTTY使用Ctrl+s僵死的问题
    sqlite3里类似top的用法
    二维数组、行指针、指针数组、二级指针
    sqlite3_exec函数的使用
    基于s5pv210嵌入式linux使用其他动态、静态库文件程序的交叉编译
  • 原文地址:https://www.cnblogs.com/ik-heu/p/8719560.html
Copyright © 2011-2022 走看看