咨询热线:0731-88808590
切换到宽版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 46026|回复: 52

[建议]2区的一个函数没有(6.2 Supplementary Equation for the Metastable-Vapor

[复制链接]
发表于 2007-8-7 14:20:00 | 显示全部楼层 |阅读模式

2区的Supplementary Equation for the Metastable-Vapor Region(亚稳态水汽区增补公式)这个区没有编。

测试数据不对,见IF97.PDF的20页。

T = 450 K, T = 440 K T = 450 K

p = 1MPa , p = 1MPa , p = 1.5 MPa

v / (m3 kg–1) 0.192 516 540 0.186 212 297 0.121 685 206

.....................................

杨宇的程序好像也没有这个区,计算都不对。

[此贴子已经被uesoft于2007-8-9 11:26:19编辑过]
回复

使用道具 举报

匿名  发表于 2007-8-7 19:03:00

没想到临近饱和区水的密度这么小!这应该是那些科学家做过实验得来的吧。

怎么办呢?人家公式都出来了,我们还没有编这个函数。办法有3:

1,既然杨宇先生已经开发了6.0版,那就买他的用吧。但是,这样没有VC++源代码。

2,看得出hrbrlz也是研究很深入的,你

回复 支持 反对

使用道具

发表于 2007-8-7 19:07:00 | 显示全部楼层

没想到临近饱和区水的密度这么小!科学家应该作了实验才修正的。

既然公式有了,编程序还得靠大家,因为我们是免费维护。下面的几种方案供参考:

1,直接买杨宇先生的6.0版本。

2,hrbrlz可以自己编一个函数,加到源代码里面。我们可以收购,无奈经费有限,只有500元。

3,收购杨宇先生的函数,改编为VC++代码,可以给1000元。因为杨宇先生投入的精力多,所以经费多些。

4,我们目前只能做到这一步。自己暂时还没有时间去开发。

[此贴子已经被作者于2007-8-7 19:14:36编辑过]
回复 支持 反对

使用道具 举报

发表于 2007-8-7 22:00:00 | 显示全部楼层

欢迎大家去杨先生的网站下载使用。

很多年以前,我也曾象杨工这样,做很多这样的小软件,但没有杨先生成就大,比如水蒸气软件,杨工就做得非常出色。后来,我反思为什么,觉得问题是没有抓住大多数客户最难解决的问题,没有解决用户最迫切和最繁重的问题。理清思路以后,找准目标,我花的时间一样多,成绩却好多了,但是做起来比较麻烦。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-9 09:09:00 | 显示全部楼层

亚稳区指在热力学上不稳定,而在动力学上能暂时稳定的状态。

热动一般都计算蒸汽的稳态,基本用不到亚稳态。如果在水蒸汽表中包含这部分反而容易造成其他使用水蒸汽表计算程序的不收敛(热动程序很多都需要迭代,迭代过程中进入亚稳区,本来认为是水却被算出汽,程序会不收敛)。

研究汽液两相流可能需要这里。

但应该知道这个区的特点,印象中苏联核电汽轮机出现过由于过冷造成蒸汽进入亚稳区而引起水滴爆裂,造成汽轮机损失比较重。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-9 09:19:00 | 显示全部楼层

虽说亚稳区对我们用途不大,为程序完整性,上传一个我原来用fortran语言编的计算2MV区的源代码,我的常用工具是visual Fortran,对c++不熟练,还是请UE翻译吧,还可以保持程序风格一致。

2007899243225681.rar (2 KB, 下载次数: 2350)
[此贴子已经被作者于2007-8-9 9:24:38编辑过]
回复 支持 反对

使用道具 举报

发表于 2007-8-9 11:10:00 | 显示全部楼层
以下是引用hrbrlz在2007-8-9 9:09:00的发言:

热动一般都计算蒸汽的稳态,基本用不到亚稳态。如果在水蒸汽表中包含这部分反而容易造成其他使用水蒸汽表计算程序的不收敛(热动程序很多都需要迭代,迭代过程中进入亚稳区,本来认为是水却被算出汽,程序会不收敛)。

非常感谢hrbrlz的无私奉献,我们会认真研究并改写你的代码,加入VC++源代码库,让大家工作起来会更方便准确。但我有点不懂,如果象上面这样说,程序会不会潜藏很多危险?杨宇先生既然做出来了,一定知道其中究竟,希望发表高见,我们是否现在就开始按hrbrlz的代码动手改呢?另外,请将您的建行卡号发到13707311224。谢谢。

回复 支持 反对

使用道具 举报

发表于 2007-8-9 11:23:00 | 显示全部楼层

还想问hrbrlz一下:IF97有这个公式,IFC67好像没有?应该只需要在IF97里面加就行了吧。

回复 支持 反对

使用道具 举报

发表于 2007-8-9 11:53:00 | 显示全部楼层

现在的问题是,我们怎么样把它加入到2区:以求焓为例,

double PT2HReg2(double Pressure , double Temperature )
{
double Tau , Pi ;

Tau = 540.0 / Temperature;
Pi = 0.1 * Pressure;
return 0.001 * RGas_Water * Temperature * Tau * (Gamma0TauReg2(Tau, Pi) + GammarTauReg2(Tau, Pi));
}

double Gamma0TauReg2(double Tau , double Pi)
{
int I;
double Result;

Result= 0;
for(I =1;I<=9;I++)
Result= Result + N0Reg2 * J0Reg2 * pow(Tau , (J0Reg2 - 1));
return Result;
}


double Gamma0TauTauReg2(double Tau , double Pi)
{
int I;
double Result;

Result= 0;
for(I =1;I<=9;I++)
Result= Result + N0Reg2 * J0Reg2 * (J0Reg2 - 1) * pow(Tau , (J0Reg2 - 2));
return Result;
}

而且我看好像杨宇先生的程序跟您的一样,怎么您的就能获得正确结果呢?真的需要你们不吝赐教。同事都在说我不务正业了。还望大家多帮忙。既然hrbrlz说的这么严重,汽轮机都可能破坏,我们在这里做些工作,也许是值得的。

回复 支持 反对

使用道具 举报

发表于 2007-8-9 13:26:00 | 显示全部楼层

Range of validity
Equation (18) is valid in the metastable-vapor region from the saturated vapor line to the
5 % equilibrium moisture line (determined from the equilibrium h¢ and h¢¢ values) at pressures
from the triple-point pressure, see Eq. (9), up to 10 MPa.

“5 % equilibrium moisture line”是指(按焓值算)5%的饱和水或饱和汽都可以吗?还是由饱和线与5%的饱和水线包围的区间?

回复 支持 反对

使用道具 举报

发表于 2007-8-9 18:44:00 | 显示全部楼层

Fortran代码已经翻译成VC++了,运行结果也正确。但我不知道边界条件怎么定。就是上面的

“5 % equilibrium moisture line”是指(按焓值算)5%的饱和水或饱和汽都可以吗?还是由饱和线与5%的饱和水线包围的区间?

不知道什么意思?

如果这么做对不对:

1,给定P,T

2,根据P计算饱和温度Ts,计算饱和水焓h'、饱和汽焓h",

3,按照he=5%h'+(1-5%)h",计算he

4,按照P,T,Eq.18计算焓h

5,如果h<he,远离亚稳态,按Eq.15计算;否则,h即是所求的焓;

6,根据5,计算其他参数:熵、内能、比容、...etc.

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-10 10:02:00 | 显示全部楼层

谢谢,不用经费了,你们把源代码共享,非常不错,我做点贡献也是应该的。

可以按照你的方法确定区间,he也可以直接用he=px2h97(p,0.95)确定,两种算法he的数值是一样的。

正如杨宇所说,不能完全这样修过,稳态的T=450K P=1MPa还要计算(也是常用的)。可以像杨宇做的,说明一下在这个参数下存在亚稳态的蒸汽,并给出数值。可以再做一个单独的求亚稳态的函数,给需要的人用,这样原来的程序可以不用改。

[此贴子已经被作者于2007-8-10 10:05:52编辑过]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-10 11:43:00 | 显示全部楼层

还发现另外一个问题:PS()运算错误

P=15MPa的饱和汽熵为5.3108。

当P=15MPa,S小于5.3108时用PS2T和PS2H等能正确求温度和焓,用PS(P,T,H,S,V,X,R)也可以正确求解。

当P=15MPa,S大于5.3108时用PS2T和PS2H等能正确求温度和焓,用PS(P,T,H,S,V,X,R)计算就错误了。

15MPa只是个例子,用其他压力和熵,只要熵大于饱和汽熵,PS()运算就错误。

回复 支持 反对

使用道具 举报

发表于 2007-8-10 14:54:00 | 显示全部楼层

现在还有一件事很头痛:

如何保证用户接口不动,也不增加函数,这样用户代码就不用改了。我想在那个参数Range上做文章,比如以前获得的数值就是稳态下的区域索引,现在如果给它加上128,就可以获得亚稳态的值了。这样用户就可以随心所欲的调用到自己想要的数据。对此做法,杨工有何高见?

void SubRangeByPT(double Pressure ,double Temperature ,int* SubRange)
{
if(*SubRange >=128)//求亚稳态

{//判断如果在子区域2

if(IsRegion2(P,T))

{

*SubRange =128+2;

return;

}

}


*SubRange = 0;

if ( (Temperature < T000C-DeltaVal) || (Pressure <= 0-DeltaVal) || (Pressure > 1000.0+DeltaVal) || (Temperature > 2273.15+DeltaVal) )
return;
//exit(1);
if ( (Temperature > 1073.15+DeltaVal) && (Pressure > 100.0+DeltaVal) )
return;
//exit(1);
if ( (Temperature > 1073.15+DeltaVal) && (Temperature <= 2273.15+DeltaVal) && (Pressure >= 0-DeltaVal) && (Pressure <= 100.0+DeltaVal) )
{
*SubRange = 5;
return;
//exit(1);
}

if ( (Temperature <= Tc_Water+DeltaVal) )
{
if ( fabs(1 - T2P(Temperature) / Pressure) < 0.0005 )
{
*SubRange = 4;
return;
//exit(1);
}
if ( (Temperature >= T000C-DeltaVal) && (Temperature <= T350C) && (Pressure >= T2P(Temperature)-DeltaVal) && (Pressure <= 1000.0) )
*SubRange = 1;
else if ( (Temperature >= T000C) && (Temperature <= T350C) && (Pressure > 0) && (Pressure <= T2P(Temperature)) )
*SubRange = 2;
else if ( (Temperature >= T350C) && (Pressure > 0) && (Pressure <= T2PBound23(Temperature)) )
*SubRange = 2;
else if ( (Temperature >= T350C) && (Pressure >= T2PBound23(Temperature)) && (Pressure <= 1000.0) )
*SubRange = 3;
}
else
{
if ( (Temperature >= Tc_Water) && (Temperature <= 863.15) && (Pressure > 0) && (Pressure <= T2PBound23(Temperature)) )
*SubRange = 2;
else if ( (Temperature >= 863.15) && (Temperature <= 1073.15+DeltaVal) && (Pressure > 0-DeltaVal) && (Pressure <= 1000.0+DeltaVal) )
*SubRange = 2;
else if ( (Temperature >= Tc_Water) && (Temperature <= P2TBound23(Pressure)) && (Pressure >= T2PBound23(Temperature)) && (Pressure <= 1000.0) )
*SubRange = 3;
}
}

发现水蒸气程序真的不容易做,工作量很大,难度也大,杨宇先生的贡献真的太大了,还有那些为程序添砖加瓦的人们,比如hrbrlz、fordao等等,发现错误的人们如niche等等,大家都要感谢他们。

回复 支持 反对

使用道具 举报

发表于 2007-8-10 15:01:00 | 显示全部楼层
我们的主力客户对管道设计、应力分析、支吊架设计逼得太紧,这边WaterPro可能还得请VC++高人且懂IAPWS-IF97的人仔细分析一下,根据这个工作量,至少可以提供3000元经费开发,把这个亚稳态求解比较完美地集成到源代码库。当然是要满足:不改编接口。
回复 支持 反对

使用道具 举报

发表于 2007-8-10 15:18:00 | 显示全部楼层

6.2 Supplementary Equation for the Metastable-Vapor Region

根据hrbrlz的Fortran代码改写的VC++代码,用于亚稳态增补公式。

200781015172760281.rar (20 KB, 下载次数: 1761)
回复 支持 反对

使用道具 举报

匿名  发表于 2007-8-10 21:23:00
以下是引用uesoft在2007-8-10 14:54:00的发言:

现在还有一件事很头痛:

如何保证用户接口不动,也不增加函数,这样用户代码就不用改了。我想在那个参数Range上做文章,比如以前获得的数值就是稳态下的区域索引,现在如果给它加上128,就可以获得亚稳态的值了。这样用户就可以随心所欲的调用到自己想要的数据。对此做法,杨工有何高见?

void SubRangeByPT(double Pressure ,double Temperature ,int* SubRange)
{
if(*SubRange >=128)//求亚稳态

{//判断如果在子区域2

if(IsRegion2(P,T))

{

*SubRange =128+2;

return;

}

}


*SubRange = 0;

if ( (Temperature < T000C-DeltaVal) || (Pressure <= 0-DeltaVal) || (Pressure > 1000.0+DeltaVal) || (Temperature > 2273.15+DeltaVal) )
return;
//exit(1);
if ( (Temperature > 1073.15+DeltaVal) && (Pressure > 100.0+DeltaVal) )
return;
//exit(1);
if ( (Temperature > 1073.15+DeltaVal) && (Temperature <= 2273.15+DeltaVal) && (Pressure >= 0-DeltaVal) && (Pressure <= 100.0+DeltaVal) )
{
*SubRange = 5;
return;
//exit(1);
}

if ( (Temperature <= Tc_Water+DeltaVal) )
{
if ( fabs(1 - T2P(Temperature) / Pressure) < 0.0005 )
{
*SubRange = 4;
return;
//exit(1);
}
if ( (Temperature >= T000C-DeltaVal) && (Temperature <= T350C) && (Pressure >= T2P(Temperature)-DeltaVal) && (Pressure <= 1000.0) )
*SubRange = 1;
else if ( (Temperature >= T000C) && (Temperature <= T350C) && (Pressure > 0) && (Pressure <= T2P(Temperature)) )
*SubRange = 2;
else if ( (Temperature >= T350C) && (Pressure > 0) && (Pressure <= T2PBound23(Temperature)) )
*SubRange = 2;
else if ( (Temperature >= T350C) && (Pressure >= T2PBound23(Temperature)) && (Pressure <= 1000.0) )
*SubRange = 3;
}
else
{
if ( (Temperature >= Tc_Water) && (Temperature <= 863.15) && (Pressure > 0) && (Pressure <= T2PBound23(Temperature)) )
*SubRange = 2;
else if ( (Temperature >= 863.15) && (Temperature <= 1073.15+DeltaVal) && (Pressure > 0-DeltaVal) && (Pressure <= 1000.0+DeltaVal) )
*SubRange = 2;
else if ( (Temperature >= Tc_Water) && (Temperature <= P2TBound23(Pressure)) && (Pressure >= T2PBound23(Temperature)) && (Pressure <= 1000.0) )
*SubRange = 3;
}
}

发现水蒸气程序真的不容易做,工作量很大,难度也大,杨宇先生的贡献真的太大了,还有那些为程序添砖加瓦的人们,比如hrbrlz、fordao等等,发现错误的人们如niche等等,大家都要感谢他们。

这样可能不行,对于T=450K P=1MPa 就同时存在稳态的水和亚稳态的蒸汽。PT2H的计算结果应该有两个差异很大的解。但是你又如何能同时得到呢?

看来必须修改接口了!

回复 支持 反对

使用道具

匿名  发表于 2007-8-10 21:29:00
以下是引用hrbrlz在2007-8-10 11:43:00的发言:

还发现另外一个问题:PS()运算错误

P=15MPa的饱和汽熵为5.3108。

当P=15MPa,S小于5.3108时用PS2T和PS2H等能正确求温度和焓,用PS(P,T,H,S,V,X,R)也可以正确求解。

当P=15MPa,S大于5.3108时用PS2T和PS2H等能正确求温度和焓,用PS(P,T,H,S,V,X,R)计算就错误了。

15MPa只是个例子,用其他压力和熵,只要熵大于饱和汽熵,PS()运算就错误。

在 “WASPCN”中没有发现这个问题,可能又是从Delphi->C的过程出现问题。可能又是出现了整除的问题。
回复 支持 反对

使用道具

发表于 2007-8-11 09:15:00 | 显示全部楼层

我的意思是:

1,先判断Range。如果Range>128,说明外部想求解亚稳态参数,否则就是按普通求解稳态参数。

2,对于API来说,保证接口稳定是极其重要的。试想,Win32 API如果各个版本接口经常变动,用户怎么开发程序?我觉得水蒸气性质API也要保证接口稳定,这样用户代码不用改变。

回复 支持 反对

使用道具 举报

发表于 2007-8-11 10:25:00 | 显示全部楼层

虽然Range是传入参数,这并不妨碍给它赋值,进入之后,先判断,然后<128就可以丢弃了;如果大于128,继续往下一级传递。接口不用变,Range还是指针类型,只是它如果>128,具有了新的意义。这不影响老程序。

现在我主要不理解他影响的范围有多大?到底这样做,修改的地方多;还是新增加函数,修改的地方多?需要比较了解的人,比如您,才能做出准确判断。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们

长沙优易软件开发有限公司(中文简称:优易软件,英文简称:UESOFT)是三维管道CAD/CAE一体化设计软件开发商,也是新一代三维工厂设计管理系统的开创者。公司开发的自主知识产权的管道应力分析软件AutoPSA居于中国大陆市场前2名。UESOFT于2000年10月23日经湖南省长沙市工商行政管理局核准登记设立。

联系我们

  • 地址: 中国湖南省长沙市高新区桐梓坡西路保利麓谷林语中心i区1栋718-725
  • 电话: 0731-88808590
  • Email: uesoft@163.com
© 2001-2021  Powered by Discuz! X3.4 永益科技
快速回复 返回顶部 返回列表