用于水和水蒸汽物性计算的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(T, P)
- _Region2(T, P)
- _Region3(rho, T)
- _Region4(P, x)
- _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
用于水和水蒸汽物性计算的Python模块——iapws的更多相关文章
- Anaconda 用于科学计算的 Python 发行版
用于科学计算的 Python 发行版: 1.Anaconda https://www.continuum.io/ 公司continuum. 有商业版本. Anaconda is the le ...
- 【Anaconda】:科学计算的Python发行版
[背景] Python易用,但包管理和Python不同版本的问题比较头疼,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python,比如WinPython.Anaconda等, ...
- 科学计算:Python 分析数据找问题,并图形化
对于记录的数据,如何用 Python 进行分析.或图形化呢? 本文将介绍 numpy, matplotlib, pandas, scipy 几个包,进行数据分析.与图形化. 准备环境 Python 环 ...
- 栈应用之 后缀表达式计算 (python 版)
栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1. 中缀表达式.前缀表达式.后缀表达式区别 中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...
- 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块
简介 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 举个例子: ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘 ...
- python 学习第五天,python模块
一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py ...
- Python基础篇【第5篇】: Python模块基础(一)
模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...
- python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fal ...
- python模块介绍- multi-mechanize 性能测试工具
python模块介绍- multi-mechanize 性能测试工具 2013-09-13 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 3739 ...
随机推荐
- PAT 输出华氏-摄氏温度转换表
输入2个正整数lower和upper(lower≤upper≤100),请输出一张取值范围为[lower,upper].且每次增加2华氏度的华氏-摄氏温度转换表. 温度转换的计算公式:C=5×(F−3 ...
- redis基本类型和使用
redis存储数据的基本类型有:string(字符串类型).hash(散列类型).list(列表类型).set(集合类型).zset(有序集合类型). 依次做一些练习.redis命令不区分大小写. k ...
- PPT分享 | 怎么在区块链上保护隐私?
艾伯特AI人工智能(公众号:aibbtcom)按: (编者按:在12月3日的亚太区以太坊社区培训和交流Meetup深圳站上,Vitalik作了<怎么在区块链上保护隐私>的演讲,谈到了区块链 ...
- passwd命令使用
2018-03-01 10:01:06 例1:passwd username 直接修改用户的密码普通用户可以且只能修改自己的密码,root用户可以修改任何人的密码[root@localhost ~] ...
- sort命令与cat区别25.1 由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile [root@shiyan a]# cat a.txt aaaaaa [root@shiyan a]# sort a.txt >c.txt ------------- 在重定向前会自动创建c.txt这个文件。 [root@shiyan
25.1 由于sort默认是把结果按照行排序后输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile[root@shiyan a]# cat a. ...
- 优先级队列用法详解(priority_queue)
由于优先级队列的内部数据结构为 堆,所以这里先介绍堆的一些操作. 堆的一些函数操作在algorithm头文件中 //在[first, last)范围内构造最大堆,first,last 可以是vecto ...
- videojs双击全屏幕观看,videojs动态加载视频
前段时间闲来无事弄了弄video.js,感觉蛮好玩,能应用到各个应用端,自己在最后玩耍的时候,需要注意的只剩下两方面了,1,动态加载播放视频内容2,双击全屏观看, var urlRoad = &quo ...
- 理解 dispatch_get_specific
这篇文章原来在用 Github Pages 搭建的博客上,现在决定重新用回博客园,所以把文章搬回来. dispatch_queue_set_specific用于给一个队列设置相关的上下文数据,disp ...
- SpringBoot工作机制
1:前言 回顾探索Spring框架 1.spring ioc IoC其实有两种方式,一种就是DI,而另一种是DL,即Dependency Lookup(依赖查找),前者是当前软件实体被动接受其依赖的其 ...
- Java面试宝典笔记录
1.一个.java文件中可以有多个类(不是内部类),但是只能有一个public类,且类名和文件同名.(一般不提倡这么写,一类一文件) 2.java保留字:goto, const. 3.访问权限控制 访 ...