Ada语言实现-水和水蒸气热力性质IAPWS-IF1997

Ada语言实现-水和水蒸气热力性质IAPWS-IF1997

对外接口文件:IF97-Interfaces.ads

-- File: IF97.ads

with Ada.Numerics.Generic_Elementary_Functions;

package IF97 is

   subtype Double is Long_Float;

   package Double_Math is new Ada.Numerics.Generic_Elementary_Functions(Double);
   use Double_Math;

   -- 普通水的气体常数R=0.461526kJ/(kg*K)
   R:constant:=0.461_526;

   -- 临界温度
   Tc:constant:=647.096;

   -- 临界压力
   Pc:constant:=22.064;

   -- 临界密度ρc=322
   Rho_c:constant:=322.0;

   function "**"(a,b:double) return Double;
   pragma import(c,"**","pow");


end IF97;
-----------------------------------------------------------------------------------------

-- File: IF97-Region1.ads
package IF97.Region1 is

   --
   -- 1区为常规水,T in 273.15..623.15K,p in Region4.Eq.(30) Ps(T)..100.0MPa
   --

   --
   -- 下列方程参数压力单位为MPa,温度单位为K
   --

   -- Gibbs自由能
   function g(p,T:Double) return Double;

   -- γ(p,T)=g(p,T)/RT
   function gamma(p,T:Double) return Double;

   -- 比容
   function v(p,T:Double) return Double;

   -- 比内能
   function u(p,T:Double) return Double;

   -- 比熵
   function s(p,T:Double) return Double;

   -- 比焓
   function h(p,T:Double) return Double;

   -- 比等压热容
   function cp(p,T:Double) return Double;

   -- 等容热容
   function cv(p,T:Double) return Double;

   -- 声速
   function w(p,T:Double) return Double;

   --
   -- 导出方程
   --

   -- 根据压力与焓求温度
   function T_ph(p,h:Double) return Double;


   -- 根据压力与熵求温度
   function T_ps(p,s:Double) return Double;



end IF97.Region1;
-----------------------------------------------------------------------------------

-- File: IF97-Region1.adb



package body IF97.Region1 is


   package Table1 is
      I:constant array(1..34) of Double:=(1..8=>0.0,
                                          9..14=>1.0,
                                          15..19=>2.0,
                                          20..22=>3.0,
                                          23..25=>4.0,
                                          26=>5.0,
                                          27..28=>8.0,
                                          29=>21.0,
                                          30=>23.0,
                                          31=>29.0,
                                          32=>30.0,
                                          33=>31.0,
                                          34=>32.0);

      J:constant array(1..34) of Double:=(1=>-2.0,
                                          2=>-1.0,
                                          3=>0.0,
                                          4=>1.0,
                                          5=>2.0,
                                          6=>3.0,
                                          7=>4.0,
                                          8=>5.0,
                                          9=>-9.0,
                                          10=>-7.0,
                                          11=>-1.0,
                                          12=>0.0,
                                          13=>1.0,
                                          14=>3.0,
                                          15=>-3.0,
                                          16=>0.0,
                                          17=>1.0,
                                          18=>3.0,
                                          19=>17.0,
                                          20=>-4.0,
                                          21=>0.0,
                                          22=>6.0,
                                          23=>-5.0,
                                          24=>-2.0,
                                          25=>10.0,
                                          26=>-8.0,
                                          27=>-11.0,
                                          28=>-6.0,
                                          29=>-29.0,
                                          30=>-31.0,
                                          31=>-38.0,
                                          32=>-39.0,
                                          33=>-40.0,
                                          34=>-41.0);

      n:constant array(1..34) of Double:=(0.146_329_712_131_67,
                                          -0.845_481_871_691_14,
                                          -0.375_636_036_720_40e1,
                                          0.338_551_691_683_85e1,
                                          -0.957_919_633_878_72,
                                          0.157_720_385_132_28,
                                          -0.166_164_171_995_01e-1,
                                          0.812_146_299_835_68e-3,
                                          0.283_190_801_238_04e-3,
                                          -0.607_063_015_658_71e-3,
                                          -0.189_900_682_184_19e-1,
                                          -0.325_297_487_705_05e-1,
                                          -0.218_417_171_754_14e-1,
                                          -0.528_383_579_699_30e-4,
                                          -0.471_843_210_732_67e-3,
                                          -0.300_017_807_930_26e-3,
                                          0.476_613_939_069_87e-4,
                                          -0.441_418_453_308_46e-5,
                                          -0.726_949_962_975_94e-15,
                                          -0.316_796_448_450_54e-4,
                                          -0.282_707_979_853_12e-5,
                                          -0.852_051_281_201_03e-9,
                                          -0.224_252_819_080_00e-5,
                                          -0.651_712_228_956_01e-6,
                                          -0.143_417_299_379_24e-12,
                                          -0.405_169_968_601_17e-6,
                                          -0.127_343_017_416_41e-8,
                                          -0.174_248_712_306_34e-9,
                                          -0.687_621_312_955_31e-18,
                                          0.144_783_078_285_21e-19,
                                          0.263_357_816_627_95e-22,
                                          -0.119_476_226_400_71e-22,
                                          0.182_280_945_814_04e-23,
                                          -0.935_370_872_924_58e-25
                                         );
   end Table1;

   package Table2 is
      I:constant array(1..20) of Double:=(1..6=>0.0,
                                          7..13=>1.0,
                                          14..15=>2.0,
                                          16..17=>3.0,
                                          18=>4.0,
                                          19=>5.0,
                                          20=>6.0
                                         );

      J:constant array(1..20) of Double:=(0.0,1.0,2.0,6.0,22.0,32.0,
                                          0.0,1.0,2.0,3.0,4.0,10.0,
                                          32.0,10.0,32.0,10.0,
                                          32.0,32.0,32.0,32.0
                                         );

      n:constant array(1..20) of Double:=(-0.238_724_899_245_21e3,
                                          +0.404_211_886_379_45e3,
                                          +0.113_497_468_817_18e3,
                                          -0.584_576_160_480_39e1,
                                          -0.152_854_824_131_40e-3,
                                          -0.108_667_076_953_77e-5,
                                          -0.133_917_448_726_02e2,
                                          +0.432_110_391_835_59e2,
                                          -0.540_100_671_705_06e2,
                                          +0.305_358_922_039_16e2,

                                          -0.659_647_494_236_38e1,
                                          +0.939_654_008_783_63e-2,
                                          +0.115_736_475_053_40e-6,
                                          -0.258_586_412_820_73e-4,
                                          -0.406_443_630_847_99e-8,
                                          +0.664_561_861_916_35e-7,
                                          +0.806_707_341_030_27e-10,
                                          -0.934_777_712_139_47e-12,
                                          +0.582_654_420_206_01e-14,
                                          -0.150_201_859_535_03e-16
                                         );



   end Table2;

   package Table3 is
      I:constant array(1..20) of Double:=(1..6=>0.0,
                                          7..12=>1.0,
                                          13..17=>2.0,
                                          18..19=>3.0,
                                          20=>4.0
                                         );

      J:constant array(1..20) of Double:=(0.0,1.0,2.0,3.0,11.0,31.0,
                                          0.0,1.0,2.0,3.0,12.0,31.0,
                                          0.0,1.0,2.0,9.0,31.0,10.0,
                                          32.0,32.0
                                         );

      n:constant array(1..20) of Double:=(+0.174_782_680_583_07e3,
                                          +0.348_069_308_928_73e2,
                                          +0.652_925_849_784_55e1,
                                          +0.330_399_817_754_89,
                                          -0.192_813_829_231_96e-6,
                                          -0.249_091_972_445_73e-22,
                                          -0.261_076_364_893_32,
                                          +0.225_929_659_815_86,
                                          -0.642_564_633_952_26e-1,
                                          +0.788_762_892_705_26e-2,

                                          +0.356_721_106_073_66e-9,
                                          +0.173_324_969_948_95e-23,
                                          +0.566_089_006_548_37e-3,
                                          -0.326_354_831_397_17e-3,
                                          +0.447_782_866_906_32e-4,
                                          -0.513_221_569_085_07e-9,
                                          -0.425_226_570_422_07e-25,
                                          +0.264_004_413_606_89e-12,
                                          +0.781_246_004_597_23e-28,
                                          -0.307_321_999_036_68e-30
                                         );


   end Table3;

   -- Gibbs自由能
   function g(p:Double;T:Double) return Double is
      use Table1;
      Pi:Double:=p/16.53;
      tau:Double:=T/1386.0;
      sum:Double:=0.0;
   begin
      for L in 1..34 loop
         sum:=sum+n(L)*((7.1-Pi)**I(L))*((tau-1.222)**J(L));
      end loop;
      return sum*R*T;
   end g;

   function gamma(p:Double;T:Double) return Double is
      use Table1;
      Pi:Double:=p/16.53;
      tau:Double:=1386.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..34 loop
         sum:=sum+n(L)*((7.1-Pi)**I(L))*((tau-1.222)**J(L));
      end loop;
      return sum;
   end gamma;

   function Gamma_Pi(p,T:Double) return Double is
      use Table1;
      Pi:Double:=p/16.53;
      tau:Double:=1386.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..34 loop
         sum:=sum-(n(L))*I(L)*((7.1-Pi)**(I(L)-1.0))*((tau-1.222)**J(L));
      end loop;
      return sum;
   end Gamma_Pi;

   function Gamma_Pi_Pi(p,T:Double) return Double is
      use Table1;
      Pi:Double:=p/16.53;
      tau:Double:=1386.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..34 loop
         sum:=sum+n(L)*I(L)*(I(L)-1.0)*((7.1-Pi)**(I(L)-2.0))*((tau-1.222)**J(L));
      end loop;
      return sum;
   end Gamma_Pi_Pi;

   function Gamma_Pi_Tau(p,T:Double) return Double is
      use Table1;
      Pi:Double:=p/16.53;
      tau:Double:=1386.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..34 loop
         sum:=sum-n(L)*I(L)*((7.1-Pi)**(I(L)-1.0))*J(L)*((tau-1.222)**(J(L)-1.0));
      end loop;
      return sum;
   end Gamma_Pi_Tau;

   function Gamma_tau(p,T:Double) return Double is
      use Table1;
      Pi:Double:=p/16.53;
      tau:Double:=1386.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..34 loop
         sum:=sum+n(L)*((7.1-Pi)**I(L))*J(L)*((tau-1.222)**(J(L)-1.0));
      end loop;
      return sum;
   end Gamma_tau;

   function Gamma_tau_tau(p,T:Double) return Double is
      use Table1;
      Pi:Double:=p/16.53;
      tau:Double:=1386.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..34 loop
         sum:=sum+n(L)*((7.1-Pi)**I(L))*J(L)*(J(L)-1.0)*((tau-1.222)**(J(L)-2.0));
      end loop;
      return sum;
   end Gamma_tau_tau;

   function v(p,T:Double) return Double is
      Gp:Double:=Gamma_Pi(p,T);
   begin
      return ((p/16.53)*Gp*R*1000.0*T/(p*1.0e6));
   end v;

   function u(p,T:Double) return Double is
      Gp:Double:=Gamma_Pi(p,T);
      Gt:Double:=Gamma_tau(p,T);
   begin
      return ((1386.0/T)*Gt-(p/16.53)*Gp)*R*T;
   end u;

   function s(p,T:Double) return Double is
      G:Double:=gamma(p,T);
      Gt:Double:=Gamma_tau(p,T);
   begin
      return ((1386.0/T)*Gt-G)*R;
   end s;

   function h(p,T:Double) return Double is
      Gt:Double:=Gamma_tau(p,T);
   begin
      return ((1386.0/T)*Gt)*R*T;
   end h;

   function cp(p,T:Double) return Double is
      Gtt:Double:=Gamma_tau_tau(p,T);
   begin
      return (-(1386.0/T)**2.0)*Gtt*R;
   end cp;

   function cv(p,T:Double) return Double is
      Gp:Double:=Gamma_Pi(p,T);
      Gpp:Double:=Gamma_Pi_Pi(p,T);
      Gpt:Double:=Gamma_Pi_Tau(P,T);
      Gtt:Double:=Gamma_tau_tau(p,T);
      tau:Double:=1386.0/T;
   begin
      return (-(tau**2.0)*Gtt+(Gp-tau*Gpt)**2.0/Gpp)*R;
   end cv;

   function w(p,T:Double) return Double is
      Gp:Double:=Gamma_Pi(p,T);
      Gpp:Double:=Gamma_Pi_Pi(p,T);
      Gpt:Double:=Gamma_Pi_Tau(P,T);
      Gtt:Double:=Gamma_tau_tau(p,T);
      tau:Double:=1386.0/T;
   begin
      return (R*1000.0*T*Gp**2.0/(((Gp-tau*Gpt)**2.0/(tau**2.0*Gtt)-Gpp)))**0.5;
   end w;

   function T_ph(p,h:Double) return Double is
      use Table2;
      pi:Double:=p/1.0;
      eta:Double:=h/2500.0;
      sum:Double:=0.0;
   begin
      for L in 1..20 loop
         sum:=sum+n(L)*(pi**I(L))*((eta+1.0)**J(L));
      end loop;
      return sum*1.0;
   end T_ph;


   function T_ps(p,s:Double) return Double is
      use Table3;
      pi:Double:=p/1.0;
      sigma:Double:=s/1.0;
      sum:Double:=0.0;
   begin
      for L in 1..20 loop
         sum:=sum+n(L)*(pi**I(L))*((sigma+2.0)**J(L));
      end loop;
      return sum*1.0;
   end T_ps;



end IF97.Region1;

----------------------------------------------------------------

-- File: IF97-B23.ads

-- IF97 2区与3区边界

package IF97.B23 is

   -- 饱和蒸汽与过热蒸汽分界

   -- 区2与区3边界为简单的压力与温度关系
   -- 压力单位1MPa,温度单位K

   -- Eq.(5) 根据给定的温度求区2与区3边界上的压力
   function P(T:double) return double with Pre=>(T>=623.15);

   -- Eq.(6) 根据给定的压力求区2与区3边界上的温度
   function T(P:double) return double with Pre=>(P>=16.5291642526);


end IF97.B23;

---------------------------------------------------------------------

-- File: IF97-B23.adb

package body IF97.B23 is

   n1:constant:=+0.348_051_856_289_69e+3;
   n2:constant:=-0.116_718_598_799_75e+1;
   n3:constant:=+0.101_929_700_393_26e-2;
   n4:constant:=+0.572_544_598_627_46e+3;
   n5:constant:=+0.139_188_397_788_70e+2;

   function P(T:double) return double is
   begin
      return n1+n2*T+n3*T**2;
   end P;

   function T(P:double) return double is
      use Double_Math;
   begin
      return n4+((P-n5)/n3)**0.5;
   end T;


end IF97.B23;

-------------------------------------------------------------------

-- File: IF97-Region4.ads

package IF97.Region4 is

   -- Eq.(30) 根据饱和温度求饱和压力
   function Ps(T:Double) return Double with Pre=>T<=647.096;

   -- Eq.(31) 根据饱和压力求饱和温度
   function Ts(p:Double) return Double with Pre=>p<=22.064;


end IF97.Region4;

-------------------------------------------------------------------

-- File: IF97-Region4.adb

package body IF97.Region4 is

   package Table34 is
      n:constant array(1..10) of Double:=(+0.116_705_214_527_67e4,
                                          -0.724_213_167_032_06e6,
                                          -0.170_738_469_400_92e2,
                                          +0.120_208_247_024_70e5,
                                          -0.323_255_503_223_33e7,
                                          +0.149_151_086_135_30e2,
                                          -0.482_326_573_615_91e4,
                                          +0.405_113_405_420_57e6,
                                          -0.238_555_575_678_49,
                                          +0.650_175_348_447_98e3
                                         );
   end Table34;


   function Ps(T:Double) return Double is
      use Table34;
      Thita:Double:=T+n(9)/(T-n(10));
      A:Double:=Thita**2+n(1)*Thita+n(2);
      B:Double:=n(3)*Thita**2+n(4)*Thita+n(5);
      C:Double:=n(6)*Thita**2+n(7)*Thita+n(8);
   begin
      return (2.0*C/(-B+(B**2-4.0*A*C)**0.5))**4;
   end Ps;

   -- 根据饱和压力求饱和温度
   function Ts(p:Double) return Double is
      use Table34;
      beta:Double:=p**0.25;
      E:Double:=beta**2+n(3)*beta+n(6);
      F:Double:=n(1)*beta**2+n(4)*beta+n(7);
      G:Double:=n(2)*beta**2+n(5)*beta+n(8);
      D:Double:=2.0*G/(-F-(F**2-4.0*E*G)**0.5);
   begin
      return (n(10)+D-((n(10)+D)**2-4.0*(n(9)+n(10)*D))**0.5)/2.0;
   end Ts;


end IF97.Region4;
------------------------------------------------------------------------

-- File: IF97-Region2.ads

package IF97.Region2 is

   --
   -- 以下的基本方程均考虑了单相稳定区与亚稳定区
   --

   -- Gibbs自由能
   function g(p,T:Double) return Double;
   function gamma(p,T:Double) return Double;


   -- 比体积
   function v(p,T:Double) return Double;

   -- 比内能
   function u(p,T:Double) return Double;

   -- 比熵
   function s(p,T:Double) return Double;

   -- 比焓
   function h(p,T:Double) return Double;

   -- 比等压热容
   function cp(p,T:Double) return Double;

   -- 比等体积热容
   function cv(p,T:Double) return Double;

   -- 声速
   function w(p,T:Double) return Double;

   --
   -- 导出方程
   --

   -- 根据压力与焓求温度
   function T_ph(p,h:Double) return Double;

   -- 根据压力与熵求温度
   function T_ps(p,s:Double) return Double;


end IF97.Region2;

--------------------------------------------------------------------

-- File: IF97-Region2.adb


with IF97.B23;        use IF97.B23;
with IF97.Region4;    use IF97.Region4;

package body IF97.Region2 is

   package Table10 is
      J:constant array(1..9) of Double:=(0.0,1.0,-5.0,-4.0,-3.0,-2.0,-1.0,2.0,3.0);
      n:constant array(1..9) of Double:=(-0.969_276_865_002_17e1,
                                         +0.100_866_559_680_18e2,
                                         -0.560_879_112_830_20e-2,
                                         +0.714_527_380_814_55e-1,
                                         -0.407_104_982_239_28,
                                         +0.142_408_191_714_44e1,
                                         -0.438_395_113_194_50e1,
                                         -0.284_086_324_607_72,
                                         +0.212_684_637_533_07e-1
                                        );

      n2:constant array(1..9) of Double:=(-0.969_372_683_930_49e1,
                                          +0.100_872_759_700_06e2,
                                          -0.560_879_112_830_20e-2,
                                          +0.714_527_380_814_55e-1,
                                          -0.407_104_982_239_28,
                                          +0.142_408_191_714_44e1,
                                          -0.438_395_113_194_50e1,
                                          -0.284_086_324_607_72,
                                          +0.212_684_637_533_07e-1
                                         );

   end Table10;

   package Table11 is
      I:constant array(1..43) of Double:=(1..5=>1.0,
                                          6..10=>2.0,
                                          11..15=>3.0,
                                          16..18=>4.0,
                                          19=>5.0,
                                          20..22=>6.0,
                                          23..25=>7.0,
                                          26..27=>8.0,
                                          28=>9.0,
                                          29..31=>10.0,
                                          32..33=>16.0,
                                          34=>18.0,
                                          35..37=>20.0,
                                          38=>21.0,
                                          39=>22.0,
                                          40=>23.0,
                                          41..43=>24.0
                                         );

      J:constant array(1..43) of Double:=(0.0,1.0,2.0,3.0,6.0,
                                          1.0,2.0,4.0,7.0,36.0,
                                          0.0,1.0,3.0,6.0,35.0,
                                          1.0,2.0,3.0,7.0,3.0,
                                          16.0,35.0,0.0,11.0,25.0,
                                          8.0,36.0,13.0,4.0,10.0,
                                          14.0,29.0,50.0,57.0,20.0,
                                          38.0,48.0,21.0,53.0,39.0,
                                          26.0,40.0,58.0
                                         );

      n:constant array(1..43) of Double:=(-0.177_317_424_732_13e-2,
                                          -0.178_348_622_923_58e-1,
                                          -0.459_960_136_963_65e-1,
                                          -0.575_812_590_834_32e-1,
                                          -0.503_252_787_279_30e-1,
                                          -0.330_326_416_702_03e-4,
                                          -0.189_489_875_163_15e-3,
                                          -0.393_927_772_433_55e-2,
                                          -0.437_972_956_505_73e-1,
                                          -0.266_745_479_140_87e-4,
                                          +0.204_817_376_923_09e-7,
                                          +0.438_706_672_844_35e-6,
                                          -0.322_776_772_385_70e-4,
                                          -0.150_339_245_421_48e-2,
                                          -0.406_682_535_626_49e-1,
                                          -0.788_473_095_593_67e-9,
                                          +0.127_907_178_522_85e-7,
                                          +0.482_253_727_185_07e-6,
                                          +0.229_220_763_376_61e-5,
                                          -0.167_147_664_510_61e-10,
                                          -0.211_714_723_213_55e-2,
                                          -0.238_957_419_341_04e2,
                                          -0.590_595_643_242_70e-17,
                                          -0.126_218_088_991_01e-5,
                                          -0.389_468_424_357_39e-1,
                                          +0.112_562_113_604_59e-110,
                                          -0.823_113_408_979_98e1,
                                          +0.198_097_128_020_88e-7,
                                          +0.104_069_652_101_74e-18,
                                          -0.102_347_470_959_29e-12,
                                          -0.100_181_793_795_11e-8,
                                          -0.808_829_086_469_85e-10,
                                          +0.106_930_318_794_09,
                                          -0.336_622_505_741_71,
                                          +0.891_858_453_554_21e-24,
                                          +0.306_293_168_762_32e-12,
                                          -0.420_024_676_982_08e-5,
                                          -0.590_560_296_856_39e-25,
                                          +0.378_269_476_134_57e-5,
                                          -0.127_686_089_346_81e-14,
                                          +0.730_876_105_950_61e-28,
                                          +0.554_147_153_507_78e-16,
                                          -0.943_697_072_412_10e-6
                                         );


   end Table11;

   package Table16 is
      I:constant array(1..13) of Double:=(1..4=>1.0,
                                          5..7=>2.0,
                                          8..9=>3.0,
                                          10..11=>4.0,
                                          12..13=>5.0
                                         );
      J:constant array(1..13) of Double:=(0.0,2.0,5.0,11.0,
                                          1.0,7.0,16.0,4.0,
                                          16.0,7.0,10.0,9.0,
                                          10.0
                                         );
      n:constant array(1..13) of Double:=(-0.733_622_601_865_06e-2,
                                          -0.882_238_319_431_46e-1,
                                          -0.723_345_552_132_45e-1,
                                          -0.408_131_785_344_55e-2,
                                          +0.200_978_033_802_07e-2,
                                          -0.530_459_218_986_42e-1,
                                          -0.761_904_090_869_70e-2,
                                          -0.634_980_376_573_13e-2,
                                          -0.860_430_930_285_88e-1,
                                          +0.753_215_815_227_70e-2,
                                          -0.792_383_754_461_39e-2,
                                          -0.228_881_607_784_47e-3,
                                          -0.264_565_014_828_10e-2
                                         );

   end Table16;

   package Table19 is
      n:constant array(1..5) of Double:=(+0.905_842_785_147_23e3,
                                         -0.679_557_863_992_41,
                                         +0.128_090_027_301_36e-3,
                                         +0.265_265_719_084_28e4,
                                         +0.452_575_789_059_48e1
                                        );
   end Table19;

   -- Table20用于子区域2a
   package Table20 is
      I:constant array(1..34) of Double:=(1..6=>0.0,
                                          7..15=>1.0,
                                          16..23=>2.0,
                                          24..25=>3.0,
                                          26..28=>4.0,
                                          29..31=>5.0,
                                          32..33=>6.0,
                                          34=>7.0
                                         );
      J:constant array(1..34) of Double:=(0.0,1.0,2.0,3.0,7.0,20.0,
                                          0.0,1.0,2.0,3.0,7.0,9.0,
                                          11.0,18.0,44.0,0.0,2.0,
                                          7.0,36.0,38.0,40.0,42.0,
                                          44.0,24.0,44.0,12.0,32.0,
                                          44.0,32.0,36.0,42.0,34.0,44.0,
                                          28.0
                                         );

      n:constant array(1..34) of Double:=(+0.108_989_523_182_88e4,
                                          +0.849_516_544_955_35e3,
                                          -0.107_817_480_918_26e3,
                                          +0.331_536_548_012_63e2,
                                          -0.742_320_167_902_48e1,
                                          +0.117_650_487_243_56e2,
                                          +0.184_457_493_557_90e1,
                                          -0.417_927_005_496_24e1,
                                          +0.624_781_969_358_12e1,
                                          -0.173_445_631_081_14e2,
                                          -0.200_581_768_620_96e3,
                                          +0.271_960_654_737_96e3,
                                          -0.455_113_182_858_18e3,
                                          +0.309_196_886_047_55e4,
                                          +0.252_266_403_578_72e6,
                                          -0.617_074_228_683_39e-2,
                                          -0.310_780_466_295_83,
                                          +0.116_708_730_771_07e2,
                                          +0.128_127_984_040_46e9,
                                          -0.985_549_096_232_76e9,
                                          +0.282_245_469_730_02e10,
                                          -0.359_489_714_107_03e10,
                                          +0.172_273_499_131_97e10,
                                          -0.135_513_342_407_75e5,
                                          +0.128_487_346_646_50e8,
                                          +0.138_657_242_832_26e1,
                                          +0.235_988_325_565_14e6,
                                          -0.131_052_365_450_54e8,
                                          +0.739_998_354_747_66e4,
                                          -0.551_966_970_300_60e6,
                                          +0.371_540_859_962_33e7,
                                          +0.191_277_292_396_60e5,
                                          -0.415_351_648_356_34e6,
                                          -0.624_598_551_925_07e2
                                         );
   end Table20;

   package Table21 is
      I:constant array(1..38) of Double:=(1..8=>0.0,
                                          9..16=>1.0,
                                          17..20=>2.0,
                                          21..24=>3.0,
                                          25..30=>4.0,
                                          31..33=>5.0,
                                          34=>6.0,
                                          35..36=>7.0,
                                          37..38=>9.0
                                         );
      J:constant array(1..38) of Double:=(0.0,1.0,2.0,12.0,18.0,24.0,28.0,40.0,
                                          0.0,2.0,6.0,12.0,18.0,24.0,28.0,40.0,
                                          2.0,8.0,18.0,40.0,
                                          1.0,2.0,12.0,24.0,
                                          2.0,12.0,18.0,24.0,28.0,40.0,
                                          18.0,24.0,40.0,28.0,2.0,28.0,1.0,40.0
                                         );
      n:constant array(1..38) of Double:=(0.148_950_410_795_16e4,
                                          0.743_077_983_140_34e3,
                                          -0.977_083_187_978_37e2,
                                          0.247_424_647_056_74e1,
                                          -0.632_813_200_160_26,
                                          0.113_859_521_296_58e1,
                                          -0.478_118_636_486_25,
                                          0.852_081_234_315_44e-2,
                                          0.937_471_473_779_32,
                                          0.335_931_186_049_16e1,
                                          0.338_093_556_014_54e1,
                                          0.168_445_396_719_04,
                                          0.738_757_452_366_95,
                                          -0.471_287_374_361_86,
                                          0.150_202_731_397_07,
                                          -0.217_641_142_197_50e-2,
                                          -0.218_107_553_247_61e-1,
                                          -0.108_297_844_036_77,
                                          -0.463_333_246_358_12e-1,
                                          0.712_803_519_595_51e-4,
                                          0.110_328_317_899_99e-3,
                                          0.189_552_483_879_02e-3,
                                          0.308_915_411_605_37e-2,
                                          0.135_555_045_549_49e-2,
                                          0.286_402_374_774_56e-6,
                                          -0.107_798_573_575_12e-4,
                                          -0.764_627_124_548_14e-4,
                                          0.140_523_928_183_16e-4,
                                          -0.310_838_143_314_34e-4,
                                          -0.103_027_382_121_03e-5,
                                          0.282_172_816_350_40e-6,
                                          0.127_049_022_719_45e-5,
                                          0.738_033_534_682_92e-7,
                                          -0.110_301_392_389_09e-7,
                                          -0.814_563_652_078_33e-13,
                                          -0.251_805_456_829_62e-10,
                                          -0.175_652_339_694_07e-17,
                                          0.869_341_563_441_63e-14
                                         );

   end Table21;

   package Table22 is
      I:constant array(1..23) of Double:=(-7.0,-7.0,-6.0,-6.0,-5.0,-5.0,
                                          -2.0,-2.0,-1.0,-1.0,0.0,0.0,
                                          1.0,1.0,2.0,6.0,6.0,6.0,6.0,
                                          6.0,6.0,6.0,6.0
                                         );
      J:constant array(1..23) of Double:=(0.0,4.0,0.0,2.0,0.0,2.0,0.0,1.0,
                                          0.0,2.0,0.0,1.0,4.0,8.0,4.0,0.0,
                                          1.0,4.0,10.0,12.0,16.0,20.0,22.0
                                         );
      n:constant array(1..23) of Double:=(-0.323_683_985_552_42e13,
                                          0.732_633_509_021_81e13,
                                          0.358_250_899_454_47e12,
                                          -0.583_401_318_515_90e12,
                                          -0.107_830_682_174_70e11,
                                          0.208_255_445_631_71e11,
                                          0.610_747_835_645_16e6,
                                          0.859_777_225_355_80e6,
                                          -0.257_457_236_041_70e5,
                                          0.310_810_884_227_14e5,
                                          0.120_823_158_659_36e4,
                                          0.482_197_551_092_55e3,
                                          0.379_660_012_724_86e1,
                                          -0.108_429_848_800_77e2,
                                          -0.453_641_726_766_60e-1,
                                          0.145_591_156_586_98e-12,
                                          0.112_615_974_072_30e-11,
                                          -0.178_049_822_406_86e-10,
                                          0.123_245_796_908_32e-6,
                                          -0.116_069_211_309_84e-5,
                                          0.278_463_670_885_54e-4,
                                          -0.592_700_384_741_76e-3,
                                          0.129_185_829_918_78e-2
                                         );
   end Table22;

   package Table25 is

      I:constant array(1..46) of Double:=(1..6=>-1.5,
                                          7..9=>-1.25,
                                          10..15=>-1.0,
                                          16..17=>-0.75,
                                          18..21=>-0.5,
                                          22..25=>-0.25,
                                          26..29=>0.25,
                                          30..36=>0.5,
                                          37..40=>0.75,
                                          41..42=>1.0,
                                          43..44=>1.25,
                                          45..46=>1.5
                                         );

      J:constant array(1..46) of Double:=(-24.0,-23.0,-19.0,-13.0,-11.0,-10.0,
                                          -19.0,-15.0,-6.0,-26.0,-21.0,-17.0,
                                          -16.0,-9.0,-8.0,-15.0,-14.0,-26.0,-13.0,
                                          -9.0,-7.0,-27.0,-25.0,-11.0,-6.0,
                                          1.0,4.0,8.0,11.0,0.0,1.0,5.0,6.0,
                                          10.0,14.0,16.0,0.0,4.0,9.0,17.0,7.0,
                                          18.0,3.0,15.0,5.0,18.0
                                         );

      n:constant array(1..46) of Double:=(-0.392_359_838_619_84e6,
                                          0.515_265_738_272_70e6,
                                          0.404_824_431_610_48e5,
                                          -0.321_937_909_239_02e3,
                                          0.969_614_242_186_94e2,
                                          -0.228_678_463_717_73e2,
                                          -0.449_429_141_243_57e6,
                                          -0.501_183_360_201_66e4,
                                          0.356_844_635_600_15,
                                          0.442_353_358_481_90e5,
                                          -0.136_733_888_117_08e5,
                                          0.421_632_602_078_64e6,
                                          0.225_169_258_374_75e5,
                                          0.474_421_448_656_46e3,
                                          -0.149_311_307_976_47e3,
                                          -0.197_811_263_204_52e6,
                                          -0.235_543_994_707_60e5,
                                          -0.190_706_163_020_76e5,
                                          0.553_756_698_831_64e5,
                                          0.382_936_914_373_63e4,
                                          -0.603_918_605_805_67e3,
                                          0.193_631_026_203_31e4,
                                          0.426_606_436_986_10e4,
                                          -0.597_806_388_727_18e4,
                                          -0.704_014_639_268_62e3,
                                          0.338_367_841_075_53e3,
                                          0.208_627_866_351_87e2,
                                          0.338_341_726_561_96e-1,
                                          -0.431_244_284_148_93e-4,
                                          0.166_537_913_564_12e3,
                                          -0.139_862_920_558_98e3,
                                          -0.788_495_479_998_72,
                                          0.721_324_117_538_72e-1,
                                          -0.597_548_393_982_83e-2,
                                          -0.121_413_589_539_04e-4,
                                          0.232_270_967_338_71e-6,
                                          -0.105_384_635_661_94e2,
                                          0.207_189_254_965_02e1,
                                          -0.721_931_552_604_27e-1,
                                          0.207_498_870_811_20e-6,
                                          -0.183_406_579_113_79e-1,
                                          0.290_362_723_486_96e-6,
                                          0.210_375_278_936_19,
                                          0.256_812_397_299_99e-3,
                                          -0.127_990_029_337_81e-1,
                                          -0.821_981_026_520_18e-5
                                         );
   end Table25;

   package Table26 is
      I:constant array(1..44) of Double:=(1..2=>-6.0,
                                          3..4=>-5.0,
                                          5..7=>-4.0,
                                          8..11=>-3.0,
                                          12..15=>-2.0,
                                          16..20=>-1.0,
                                          21..27=>0.0,
                                          28..33=>1.0,
                                          34..36=>2.0,
                                          37..39=>3.0,
                                          40..41=>4.0,
                                          42..44=>5.0
                                         );

      J:constant array(1..44) of Double:=(0.0,11.0,0.0,11.0,0.0,1.0,11.0,
                                          0.0,1.0,11.0,12.0,0.0,1.0,6.0,
                                          10.0,0.0,1.0,5.0,8.0,9.0,0.0,1.0,
                                          2.0,4.0,5.0,6.0,9.0,0.0,1.0,2.0,3.0,
                                          7.0,8.0,0.0,1.0,5.0,0.0,1.0,3.0,0.0,
                                          1.0,0.0,1.0,2.0
                                         );

      n:constant array(1..44) of Double:=(0.316_876_650_834_97e6,
                                          0.208_641_758_818_58e2,
                                          -0.398_593_998_035_99e6,
                                          -0.218_160_585_188_77e2,
                                          0.223_697_851_942_42e6,
                                          -0.278_417_034_458_17e4,
                                          0.992_074_360_714_80e1,
                                          -0.751_975_122_991_57e5,
                                          0.297_086_059_511_58e4,
                                          -0.344_068_785_485_26e1,
                                          0.388_155_642_491_15,
                                          0.175_112_950_857_50e5,
                                          -0.142_371_128_544_49e4,
                                          0.109_438_033_641_67e1,
                                          0.899_716_193_084_95,
                                          -0.337_597_400_989_58e4,
                                          0.471_628_858_183_55e3,
                                          -0.191_882_419_936_79e1,
                                          0.410_785_804_921_96,
                                          -0.334_653_781_720_97,
                                          0.138_700_347_775_05e4,
                                          -0.406_633_261_958_38e3,
                                          0.417_273_471_596_10e2,
                                          0.219_325_494_345_32e1,
                                          -0.103_200_500_090_77e1,
                                          0.358_829_435_167_03,
                                          0.525_114_537_260_66e-2,
                                          0.128_389_164_507_05e2,
                                          -0.286_424_372_193_81e1,
                                          0.569_126_836_648_55,
                                          -0.999_629_545_849_31e-1,
                                          -0.326_320_377_784_59e-2,
                                          0.233_209_225_767_23e-3,
                                          -0.153_348_098_574_50,
                                          0.290_722_882_399_02e-1,
                                          0.375_347_027_411_67e-3,
                                          0.172_966_917_024_11e-2,
                                          -0.385_560_508_445_04e-3,
                                          -0.350_177_122_926_08e-4,
                                          -0.145_663_936_314_92e-4,
                                          0.564_208_572_672_69e-5,
                                          0.412_861_500_746_05e-7,
                                          -0.206_846_711_188_24e-7,
                                          0.164_093_936_747_25e-8
                                         );
   end Table26;

   package Table27 is
      I:constant array(1..30) of Double:=(1..2=>-2.0,
                                          3=>-1.0,
                                          4..7=>0.0,
                                          8..11=>1.0,
                                          12..14=>2.0,
                                          15..17=>3.0,
                                          18..20=>4.0,
                                          21..23=>5.0,
                                          24..25=>6.0,
                                          26..30=>7.0
                                         );
      J:constant array(1..30) of Double:=(0.0,1.0,0.0,0.0,1.0,2.0,3.0,
                                          0.0,1.0,3.0,4.0,0.0,1.0,2.0,0.0,
                                          1.0,5.0,0.0,1.0,4.0,0.0,1.0,2.0,
                                          0.0,1.0,0.0,1.0,3.0,4.0,5.0
                                         );

      n:constant array(1..30) of Double:=(0.909_685_010_053_65e3,
                                          0.240_456_670_884_20e4,
                                          -0.591_623_263_871_30e3,
                                          0.541_454_041_280_74e3,
                                          -0.270_983_084_111_92e3,
                                          0.979_765_250_979_26e3,
                                          -0.469_667_729_594_35e3,
                                          0.143_992_746_047_23e2,
                                          -0.191_042_042_304_29e2,
                                          0.532_991_671_11971e1,
                                          -0.212_529_753_759_34e2,
                                          -0.311_473_344_137_60,
                                          0.603_348_408_946_23,
                                          -0.427_648_397_025_09e-1,
                                          0.581_855_972_552_59e-2,
                                          -0.145_970_082_847_53e-1,
                                          0.566_311_756_310_27e-2,
                                          -0.761_558_645_845_77e-4,
                                          0.224_403_429_193_32e-3,
                                          -0.125_610_950_134_13e-4,
                                          0.633_231_326_609_34e-6,
                                          -0.205_419_896_753_75e-5,
                                          0.364_053_703_900_82e-7,
                                          -0.297_598_977_892_15e-8,
                                          0.101_366_185_297_63e-7,
                                          0.599_257_196_923_51e-11,
                                          -0.206_778_701_051_64e-10,
                                          -0.208_742_781_818_86e-10,
                                          0.101_621_668_250_89e-9,
                                          -0.164_298_282_813_47e-9
                                         );
   end Table27;


   function bValidEq15(p,T:Double) return Boolean is
   begin
      if T in 273.15..623.15 and (p>0.0 and p<=Ps(T)) then
         return True;
      elsif T in 623.15..863.15 and (p>0.0 and p<=B23.P(T)) then
         return True;
      elsif T in 863.15..1073.15 and (p>0.0 and p<=100.0) then
         return True;
      end if;
      return false;
   end bValidEq15;

   function bValidEq18(p,T:Double) return Boolean is
   begin
      if T in 273.15..584.1495 and p in 0.0..10.0 then
         return True;
      end if;
      return False;
   end bValidEq18;


   -- 考虑单相稳定区与亚稳定区
   function g(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      sum:=sum+log(pi);
      declare
         use Table10;
      begin
         if bValidEq15(p,T) then
            for L in 1..9 loop
               sum:=sum+n(L)*tau**J(L);
            end loop;
         elsif bValidEq18(p,T) then
            for L in 1..9 loop
               sum:=sum+n2(L)*tau**J(L);
            end loop;
         end if;
      end;
      if bValidEq15(p,T) then
         declare
            use Table11;
         begin
            for L in 1..43 loop
               sum:=sum+n(L)*(pi**I(L))*((tau-0.5)**J(L));
            end loop;
         end;
      elsif bValidEq18(p,T) then
         declare
            use Table16;
         begin
            for L in 1..13 loop
               sum:=sum+n(L)*(pi**I(L))*((tau-0.5)**J(L));
            end loop;
         end;
      end if;
      return sum*R*T;
   end g;

   function gamma(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      sum:=sum+log(pi);
      declare
         use Table10;
      begin
         if bValidEq15(p,T) then
            for L in 1..9 loop
               sum:=sum+n(L)*tau**J(L);
            end loop;
         elsif bValidEq18(p,T) then
            for L in 1..9 loop
               sum:=sum+n2(L)*tau**J(L);
            end loop;
         end if;
      end;
      if bValidEq15(p,T) then
         declare
            use Table11;
         begin
            for L in 1..43 loop
               sum:=sum+n(L)*(pi**I(L))*((tau-0.5)**J(L));
            end loop;
         end;
      elsif bValidEq18(p,T) then
         declare
            use Table16;
         begin
            for L in 1..13 loop
               sum:=sum+n(L)*(pi**I(L))*((tau-0.5)**J(L));
            end loop;
         end;
      end if;
      return sum;
   end gamma;

   -- 稳定单相区与亚稳定区都包含
   function Go(p,T:Double) return Double is
      use Table10;
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
      sum:Double:=log(pi);
   begin
      if bValidEq15(p,T) then
         for L in 1..9 loop
            sum:=sum+n(L)*tau**J(L);
         end loop;
      elsif bValidEq18(p,T) then
         for L in 1..9 loop
            sum:=sum+n2(L)*tau**J(L);
         end loop;
      end if;
      return sum;
   end Go;


   function Gop(p,T:Double) return Double is
      pi:Double:=p/1.0;
   begin
      return 1.0/pi+0.0;
   end Gop;

   function Gopp(p,T:Double) return Double is
      pi:Double:=p/1.0;
   begin
      return -1.0/(pi**2)+0.0;
   end Gopp;

   function Got(p,T:Double) return Double is
      use Table10;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      if bValidEq15(p,T) then
         for L in 1..9 loop
            sum:=sum+n(L)*J(L)*(tau**(J(L)-1.0));
         end loop;
      elsif bValidEq18(p,T) then
         for L in 1..9 loop
            sum:=sum+n2(L)*J(L)*(tau**(J(L)-1.0));
         end loop;
      end if;
      return sum;
   end Got;

   function Gott(p,T:Double) return Double is
      use Table10;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      if bValidEq15(p,T) then
         for L in 1..9 loop
            sum:=sum+n(L)*J(L)*(J(L)-1.0)*(tau**(J(L)-2.0));
         end loop;
      elsif bValidEq18(p,T) then
         for L in 1..9 loop
            sum:=sum+n2(L)*J(L)*(J(L)-1.0)*(tau**(J(L)-2.0));
         end loop;
      end if;
      return sum;
   end Gott;

   function Gopt(p,T:Double) return Double is
   begin
      return 0.0;
   end Gopt;

   function Gr(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      if bValidEq15(p,T) then
         declare
            use Table11;
         begin
            for L in 1..43 loop
               sum:=sum+n(L)*(pi**I(L))*((tau-0.5)**J(L));
            end loop;
         end;
      elsif bValidEq18(p,T) then
         declare
            use Table16;
         begin
            for L in 1..13 loop
               sum:=sum+n(L)*(pi**I(L))*((tau-0.5)**J(L));
            end loop;
         end;
      end if;
      return sum;
   end Gr;

   function Grp(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      if bValidEq15(p,T) then
         declare
            use Table11;
         begin
            for L in 1..43 loop
               sum:=sum+n(L)*I(L)*(pi**(I(L)-1.0))*((tau-0.5)**J(L));
            end loop;
         end;
      elsif bValidEq18(p,T) then
         declare
            use Table16;
         begin
            for L in 1..13 loop
               sum:=sum+n(L)*I(L)*(pi**(I(L)-1.0))*((tau-0.5)**J(L));
            end loop;
         end;
      end if;
      return sum;
   end Grp;

   function Grt(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      if bValidEq15(p,T) then
         declare
            use Table11;
         begin
            for L in 1..43 loop
               sum:=sum+n(L)*(pi**I(L))*J(L)*((tau-0.5)**(J(L)-1.0));
            end loop;
         end;
      elsif bValidEq18(p,T) then
         declare
            use Table16;
         begin
            for L in 1..13 loop
               sum:=sum+n(L)*(pi**I(L))*J(L)*((tau-0.5)**(J(L)-1.0));
            end loop;
         end;
      end if;
      return sum;
   end Grt;

   function Grpp(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      if bValidEq15(p,T) then
         declare
            use Table11;
         begin
            for L in 1..43 loop
               sum:=sum+n(L)*I(L)*(I(L)-1.0)*(pi**(I(L)-2.0))*((tau-0.5)**J(L));
            end loop;
         end;
      elsif bValidEq18(p,T) then
         declare
            use Table16;
         begin
            for L in 1..13 loop
               sum:=sum+n(L)*I(L)*(I(L)-1.0)*(pi**(I(L)-2.0))*((tau-0.5)**J(L));
            end loop;
         end;
      end if;
      return sum;
   end Grpp;

   function Grtt(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      if bValidEq15(p,T) then
         declare
            use Table11;
         begin
            for L in 1..43 loop
               sum:=sum+n(L)*(pi**I(L))*J(L)*(J(L)-1.0)*((tau-0.5)**(J(L)-2.0));
            end loop;
         end;
      elsif bValidEq18(p,T) then
         declare
            use Table16;
         begin
            for L in 1..13 loop
               sum:=sum+n(L)*(pi**I(L))*J(L)*(J(L)-1.0)*((tau-0.5)**(J(L)-2.0));
            end loop;
         end;
      end if;
      return sum;
   end Grtt;

   function Grpt(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
      sum:Double:=0.0;
   begin
      if bValidEq15(p,T) then
         declare
            use Table11;
         begin
            for L in 1..43 loop
               sum:=sum+n(L)*I(L)*(pi**(I(L)-1.0))*J(L)*((tau-0.5)**(J(L)-1.0));
            end loop;
         end;
      elsif bValidEq18(p,T) then
         declare
            use Table16;
         begin
            for L in 1..13 loop
               sum:=sum+n(L)*I(L)*(pi**(I(L)-1.0))*J(L)*((tau-0.5)**(J(L)-1.0));
            end loop;
         end;
      end if;
      return sum;
   end Grpt;

   -- 比体积
   function v(p,T:Double) return Double is
      pi:Double:=p/1.0;
   begin
      return pi*(Gop(p,T)+Grp(p,T))*R*1.0e3*T/(p*1.0e6);
   end v;

   -- 比内能
   function u(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
   begin
      return R*T*(tau*(Got(p,T)+Grt(p,T))-pi*(Gop(p,T)+Grp(p,T)));
   end u;

   -- 比熵
   function s(p,T:Double) return Double is
      tau:Double:=540.0/T;
   begin
      return R*(tau*(Got(p,T)+Grt(p,T))-(Go(p,T)+Gr(p,T)));
   end s;

   -- 比焓
   function h(p,T:Double) return Double is
      tau:Double:=540.0/T;
   begin
      return R*T*(tau*(Got(p,T)+Grt(p,T)));
   end h;

   -- 比等压热容
   function cp(p,T:Double) return Double is
      tau:Double:=540.0/T;
   begin
      return R*(-(tau**2)*(Gott(p,T)+Grtt(p,T)));
   end cp;

   -- 比等体积热容
   function cv(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
   begin
      return R*(-(tau**2)*(Gott(p,T)+Grtt(p,T))-(1.0+pi*Grp(p,T)-tau*pi*Grpt(p,T))**2/(1.0-pi**2*Grpp(p,T)));
   end cv;

   -- 声速
   function w(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=540.0/T;
   begin
      return (R*1000.0*T*(1.0+2.0*pi*Grp(p,T)+pi**2*Grp(p,T)**2)/((1.0-pi**2*Grpp(p,T))+(1.0+pi*Grp(p,T)-tau*pi*Grpt(p,T))**2/(tau**2*(Gott(p,T)+Grtt(p,T)))))**0.5;
   end w;


   --
   -- 导出方程
   --

   function P_B2bc(h:Double) return Double is
      use Table19;
   begin
      return n(1)+n(2)*h+n(3)*(h**2.0);
   end P_B2bc;

   function h_B2bc(p:Double) return Double is
      use Table19;
   begin
      return n(4)+((p-n(5))/n(3))**0.5;
   end h_B2bc;


   function T2a_ph(p,h:Double) return Double is
      use Table20;
      pi:Double:=p/1.0;
      eta:Double:=h/2000.0;
      sum:Double:=0.0;
   begin
      for L in 1..34 loop
         sum:=sum+n(L)*(pi**I(L))*((eta-2.1)**J(L));
      end loop;
      return sum;
   end T2a_ph;

   function T2b_ph(p,h:Double) return Double is
      use Table21;
      pi:Double:=p/1.0;
      eta:Double:=h/2000.0;
      sum:Double:=0.0;
   begin
      for L in 1..38 loop
         sum:=sum+n(L)*(pi-2.0)**I(L)*(eta-2.6)**J(L);
      end loop;
      return sum;
   end T2b_ph;

   function T2c_ph(p,h:Double) return Double is
      use Table22;
      pi:Double:=p/1.0;
      eta:Double:=h/2000.0;
      sum:Double:=0.0;
   begin
      for L in 1..23 loop
         sum:=sum+n(L)*(pi+25.0)**I(L)*(eta-1.8)**J(L);
      end loop;
      return sum;
   end T2c_ph;

   function T2a_ps(p,s:Double) return Double is
      use Table25;
      pi:Double:=p/1.0;
      sigma:Double:=s/2.0;
      sum:Double:=0.0;
   begin
      for L in 1..46 loop
         sum:=sum+n(L)*(pi**I(L))*((sigma-2.0)**J(L));
      end loop;
      return sum;
   end T2a_ps;

   function T2b_ps(p,s:Double) return Double is
      use Table26;
      pi:Double:=p/1.0;
      sigma:Double:=s/0.7853;
      sum:Double:=0.0;
   begin
      for L in 1..44 loop
         sum:=sum+n(L)*(pi**I(L))*((10.0-sigma)**J(L));
      end loop;
      return sum;
   end T2b_ps;

   function T2c_ps(p,s:Double) return Double is
      use Table27;
      pi:Double:=p/1.0;
      sigma:Double:=s/2.9251;
      sum:Double:=0.0;
   begin
      for L in 1..30 loop
         sum:=sum+n(L)*(pi**I(L))*((2.0-sigma)**J(L));
      end loop;
      return sum;
   end T2c_ps;

   function T_ph(p,h:Double) return Double is
   begin
      if p>0.0 and p<4.0 then
         return T2a_ph(p,h);
      elsif (p>=4.0 and p<=100.0) and p<P_B2bc(h) then
         return T2b_ph(p,h);
      elsif (p>=4.0 and p<=100.0) and p>=P_B2bc(h) then
         return T2c_ph(p,h);
      end if;
      return 0.0;
   end T_ph;

   function T_ps(p,s:Double) return Double is
   begin
      if p>0.0 and p<4.0 and s>=5.85 then
         return T2a_ps(p,s);
      elsif p>=4.0 and p<=100.0 and s>=5.85 then
         return T2b_ps(p,s);
      elsif p>=4.0 and p<=100.0 and s<5.85 then
         return T2c_ps(p,s);
      end if;
      return 0.0;
   end T_ps;



end IF97.Region2;
------------------------------------------------------------------

-- File: IF97-Region3.ads

package IF97.Region3 is

   -- 霍尓姆兹自由能
   function f(rho,T:Double) return Double;

   function p(rho,T:Double) return Double; -- return MPa
   function u(rho,T:Double) return Double; -- return kJ*kg-1
   function s(rho,T:Double) return Double; -- return kJ*kg-1*K-1
   function h(rho,T:Double) return Double;
   function cv(rho,T:Double) return Double;
   function cp(rho,T:Double) return Double;
   function w(rho,T:Double) return Double;

   -- 3区根据压力温度压力求密度,unit参数表示精度
   function Rho3(p,T:Double;unit:Double:=1.0e-10) return Double;


end IF97.Region3;

-----------------------------------------------------------------------

-- File: IF97-Region3.adb


with IF97.Region4;
package body IF97.Region3 is

   package Table30 is
      I:constant array(2..40) of Double:=(2..8=>0.0,
                                          9..12=>1.0,
                                          13..18=>2.0,
                                          19..23=>3.0,
                                          24..27=>4.0,
                                          28..30=>5.0,
                                          31..33=>6.0,
                                          34=>7.0,
                                          35=>8.0,
                                          36..37=>9.0,
                                          38..39=>10.0,
                                          40=>11.0
                                         );

      J:constant array(2..40) of Double:=(0.0,1.0,2.0,7.0,10.0,12.0,
                                          23.0,2.0,6.0,15.0,17.0,0.0,
                                          2.0,6.0,7.0,22.0,26.0,0.0,
                                          2.0,4.0,16.0,26.0,0.0,2.0,
                                          4.0,26.0,1.0,3.0,26.0,0.0,
                                          2.0,26.0,2.0,26.0,2.0,26.0,0.0,
                                          1.0,26.0
                                         );

      n:constant array(1..40) of Double:=(0.106_580_700_285_13e1,
                                          -0.157_328_452_902_39e2,
                                          0.209_443_969_743_07e2,
                                          -0.768_677_078_787_16e1,
                                          0.261_859_477_879_54e1,
                                          -0.280_807_811_486_20e1,
                                          0.120_533_696_965_17e1,
                                          -0.845_668_128_125_02e-2,
                                          -0.126_543_154_777_14e1,
                                          -0.115_244_078_066_81e1,
                                          0.885_210_439_843_18,
                                          -0.642_077_651_816_07,
                                          0.384_934_601_866_71,
                                          -0.852_147_088_242_06,
                                          0.489_722_815_418_77e1,
                                          -0.305_026_172_569_65e1,
                                          0.394_205_368_791_54e-1,
                                          0.125_584_084_243_08,
                                          -0.279_993_296_987_10,
                                          0.138_997_995_694_60e1,
                                          -0.201_899_150_235_70e1,
                                          -0.821_476_371_739_63e-2,
                                          -0.475_960_357_349_23,
                                          0.439_840_744_735_00e-1,
                                          -0.444_764_354_287_39,
                                          0.905_720_707_197_33,
                                          0.705_224_500_879_67,
                                          0.107_705_126_263_32,
                                          -0.329_136_232_589_54,
                                          -0.508_710_620_411_58,
                                          -0.221_754_008_730_96e-1,
                                          0.942_607_516_650_92e-1,
                                          0.164_362_784_479_61,
                                          -0.135_033_722_413_48e-1,
                                          -0.148_343_453_524_72e-1,
                                          0.579_229_536_280_84e-3,
                                          0.323_089_047_037_11e-2,
                                          0.809_648_029_962_15e-4,
                                          -0.165_576_797_950_37e-3,
                                          -0.449_238_990_618_15e-4
                                         );
   end Table30;

   function f(rho,T:Double) return Double is
      use Table30;
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
      sum:Double:=n(1)*log(delta0);
   begin
      for L in 2..40 loop
         sum:=sum+n(L)*(delta0**I(L))*(tau**J(L));
      end loop;
      return sum*R*T;
   end f;

   function phi(rho,T:Double) return Double is
      use Table30;
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
      sum:Double:=n(1)*log(delta0);
   begin
      for L in 2..40 loop
         sum:=sum+n(L)*(delta0**I(L))*(tau**J(L));
      end loop;
      return sum;
   end phi;

   function Phi_d(rho,T:Double) return Double is
      use Table30;
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
      sum:Double:=n(1)/delta0;
   begin
      for L in 2..40 loop
         sum:=sum+n(L)*I(L)*(delta0**(I(L)-1.0))*(tau**J(L));
      end loop;
      return sum;
   end phi_d;

   function Phi_dd(rho,T:Double) return Double is
      use Table30;
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
      sum:Double:=-n(1)/(delta0**2);
   begin
      for L in 2..40 loop
         sum:=sum+n(L)*I(L)*(I(L)-1.0)*(delta0**(I(L)-2.0))*(tau**J(L));
      end loop;
      return sum;
   end phi_dd;

   function Phi_t(rho,T:Double) return Double is
      use Table30;
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
      sum:Double:=0.0;
   begin
      for L in 2..40 loop
         sum:=sum+n(L)*J(L)*(delta0**I(L))*(tau**(J(L)-1.0));
      end loop;
      return sum;
   end phi_t;

   function Phi_tt(rho,T:Double) return Double is
      use Table30;
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
      sum:Double:=0.0;
   begin
      for L in 2..40 loop
         sum:=sum+n(L)*J(L)*(J(L)-1.0)*(delta0**I(L))*(tau**(J(L)-2.0));
      end loop;
      return sum;
   end phi_tt;

   function Phi_dt(rho,T:Double) return Double is
      use Table30;
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
      sum:Double:=0.0;
   begin
      for L in 2..40 loop
         sum:=sum+n(L)*I(L)*J(L)*(delta0**(I(L)-1.0))*(tau**(J(L)-1.0));
      end loop;
      return sum;
   end phi_dt;

   function p(rho,T:Double) return Double is
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
   begin
      return rho*R*1000.0*T*(delta0*Phi_d(rho,T))/1.0e6;
   end p;


   function u(rho,T:Double) return Double is
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
   begin
      return R*T*(tau*Phi_t(rho,T));
   end u;

   function s(rho,T:Double) return Double is
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
   begin
      return R*(tau*phi_t(rho,T)-phi(rho,T));
   end s;

   function h(rho,T:Double) return Double is
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
   begin
      return R*T*(tau*phi_t(rho,T)+delta0*phi_d(rho,T));
   end h;

   function cv(rho,T:Double) return Double is
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
   begin
      return R*(-tau**2*phi_tt(rho,T));
   end cv;

   function cp(rho,T:Double) return Double is
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
   begin
      return R*(-tau**2*phi_tt(rho,T)+((delta0*Phi_d(rho,T)-delta0*tau*phi_dt(rho,T))**2.0)/(2.0*delta0*Phi_d(rho,T)+delta0**2*Phi_dd(rho,T)));
   end cp;

   function w(rho,T:Double) return Double is
      delta0:Double:=rho/322.0;
      tau:Double:=647.096/T;
   begin
      return (R*1000.0*T*(2.0*delta0*phi_d(rho,T)+delta0**2*Phi_dd(rho,T)-(delta0*Phi_d(rho,T)-delta0*tau*phi_dt(rho,T))**2/(tau**2*phi_tt(rho,T))))**0.5;
   end w;

   function Rho3(p,T:Double;unit:Double:=1.0e-10) return Double is
      use IF97.Region4;
      Rho_old,Rho_new,Rho_p,dlt:double;
   begin
      if T in 623.15..647.096 and p<Ps(T) then
         Rho_old:=100.0;
      else
         Rho_old:=600.0;
      end if;
      loop
         dlt:=Rho_old/322.0;
         Rho_p:=1000.0*R*T*(2.0*Rho_old*Phi_d(Rho_old,T)+Rho_old**2*phi_dd(Rho_old,T)/322.0);
         Rho_new:=Rho_old+(1.0e6*p-1000.0*R*T*Rho_old**2*phi_d(Rho_old,T)/322.0)/Rho_p;
         if abs(Rho_new-Rho_old)<unit then
            return Rho_new;
         end if;
         Rho_old:=Rho_new;
      end loop;
   end Rho3;


end IF97.Region3;

------------------------------------------------------------------------------------------------------------

-- File: IF97-Region5.ads

package IF97.Region5 is

   function g(p,T:Double) return Double;
   function v(p,T:Double) return Double;
   function u(p,T:Double) return Double;
   function s(p,T:Double) return Double;
   function h(p,T:Double) return Double;
   function cp(p,T:Double) return Double;
   function cv(p,T:Double) return Double;
   function w(p,T:Double) return Double;


end IF97.Region5;

-------------------------------------------------------------------------------------------------------------

-- File: IF97-Region5.adb


package body IF97.Region5 is

   package Table37 is
      J:constant array(1..6) of Double:=(0.0,1.0,-3.0,-2.0,-1.0,2.0);
      n:constant array(1..6) of Double:=(-0.131_799_836_742_01e2,
                                         0.685_408_416_344_34e1,
                                         -0.248_051_489_334_66e-1,
                                         0.369_015_349_803_33,
                                         -0.311_613_182_139_25e1,
                                         -0.329_616_265_389_17
                                        );

   end Table37;

   package Table38 is
      I:constant array(1..6) of Double:=(1.0,1.0,1.0,2.0,2.0,3.0);
      J:constant array(1..6) of Double:=(1.0,2.0,3.0,3.0,9.0,7.0);
      n:constant array(1..6) of Double:=(0.157_364_048_552_59e-2,
                                         0.901_537_616_739_44e-3,
                                         -0.502_700_776_776_48e-2,
                                         0.224_400_374_094_85e-5,
                                         -0.411_632_754_534_71e-5,
                                         0.379_194_548_229_55e-7
                                        );

   end Table38;

   function Go(p,T:Double) return Double is
      use Table37;
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
      sum:Double:=Double_Math.log(pi);
   begin
      for L in 1..6 loop
         sum:=sum+n(L)*tau**J(L);
      end loop;
      return sum;
   end Go;

   function Gop(p,T:Double) return Double is
   begin
      return 1.0/(p/1.0);
   end Gop;

   function Gopp(p,T:Double) return Double is
   begin
      return -1.0/((p/1.0)**2);
   end Gopp;

   function Gopt(p,T:Double) return Double is
   begin
      return 0.0;
   end Gopt;

   function Got(p,T:Double) return Double is
      use Table37;
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..6 loop
         sum:=sum+n(L)*J(L)*(tau**(J(L)-1.0));
      end loop;
      return sum;
   end Got;

   function Gott(p,T:Double) return Double is
      use Table37;
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..6 loop
         sum:=sum+n(L)*J(L)*(J(L)-1.0)*(tau**(J(L)-2.0));
      end loop;
      return sum;
   end Gott;

   function Gr(p,T:Double) return Double is
      use Table38;
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..6 loop
         sum:=sum+n(L)*(pi**I(L))*(tau**J(L));
      end loop;
      return sum;
   end Gr;

   function Grp(p,T:Double) return Double is
      use Table38;
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..6 loop
         sum:=sum+n(L)*I(L)*(pi**(I(L)-1.0))*(tau**J(L));
      end loop;
      return sum;
   end Grp;

   function Grpp(p,T:Double) return Double is
      use Table38;
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..6 loop
         sum:=sum+n(L)*I(L)*(I(L)-1.0)*(pi**(I(L)-2.0))*(tau**J(L));
      end loop;
      return sum;
   end Grpp;

   function Grt(p,T:Double) return Double is
      use Table38;
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..6 loop
         sum:=sum+n(L)*J(L)*(pi**I(L))*(tau**(J(L)-1.0));
      end loop;
      return sum;
   end Grt;

   function Grtt(p,T:Double) return Double is
      use Table38;
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..6 loop
         sum:=sum+n(L)*J(L)*(J(L)-1.0)*(pi**I(L))*(tau**(J(L)-2.0));
      end loop;
      return sum;
   end Grtt;

   function Grpt(p,T:Double) return Double is
      use Table38;
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
      sum:Double:=0.0;
   begin
      for L in 1..6 loop
         sum:=sum+n(L)*I(L)*J(L)*(pi**(I(L)-1.0))*(tau**(J(L)-1.0));
      end loop;
      return sum;
   end Grpt;



   function g(p,T:Double) return Double is
   begin
      return R*T*(Go(p,T)+Gr(p,T));
   end g;

   function v(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
   begin
      return R*1000.0*T*pi*(gop(p,T)+grp(p,T))/(p*1.0e6);
   end v;

   function u(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
   begin
      return R*T*(tau*(got(p,T)+grt(p,T))-pi*(gop(p,T)+grp(p,T)));
   end u;

   function s(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
   begin
      return R*(tau*(got(p,T)+grt(p,T))-(go(p,T)+gr(p,T)));
   end s;

   function h(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
   begin
      return R*T*(tau*(got(p,T)+grt(P,T)));
   end h;

   function cp(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
   begin
      return R*(-(tau**2)*(gott(p,T)+grtt(p,T)));
   end cp;

   function cv(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
   begin
      return R*(-tau**2*(gott(p,T)+grtt(p,T))-(1.0+pi*grp(p,T)-tau*pi*grpt(p,T))**2/(1.0-pi**2*grpp(p,T)));
   end cv;

   function w(p,T:Double) return Double is
      pi:Double:=p/1.0;
      tau:Double:=1000.0/T;
   begin
      return (R*1000.0*T*(1.0+2.0*pi*Grp(p,T)+(pi**2)*(grp(p,T)**2))/((1.0-pi**2*grpp(p,T))+(1.0+pi*grp(p,T)-tau*pi*grpt(p,T))**2/(tau**2*(gott(p,T)+grtt(p,T)))))**0.5;
   end w;




end IF97.Region5;

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- File: IF97-Interfaces.ads,IF97的对外接口

package IF97.Interfaces is

   -- 压力:MPa;温度:K;比容:m3/(kg*K);密度:kg/m3;

   -- 已知压力温度求比容
   function v(p,T:Double) return Double;

   -- 已知压力温度求密度
   function r(p,T:Double) return Double;

   -- 已知压力温度求内能
   function u(p,T:Double) return Double;

   -- 已知压力温度求熵
   function s(p,T:Double) return Double;

   -- 已知压力温度求焓
   function h(p,T:Double) return Double;

   -- 已知压力温度求等压热容
   function cp(p,T:Double) return Double;

   -- 已知压力温度求等容热容
   function cv(p,T:Double) return Double;

   -- 已知压力温度求声速
   function w(p,T:Double) return Double;

   -- 根据温度求饱和压力(4-2,2-3),即饱和蒸汽
   function Pss(T:Double) return Double;

   -- 根据压力求饱和温度(4-2,2-3),即饱和蒸汽
   function Tss(P:Double) return Double;

   -- 根据温度求饱和水压力(4-2,1-3)
   function Psw(T:Double) return Double;

   -- 根据压力求饱和水温度
   function Tsw(P:Double) return Double;


end IF97.Interfaces;

---------------------------------------------------

-- File: IF97-Interfaces.adb,IF97的对外接口

with IF97.B23;
with IF97.Region1;
with IF97.Region2;
with IF97.Region3;
with IF97.Region4;
with IF97.Region5;

package body IF97.Interfaces is

   function Region(p,T:Double) return Integer is
   begin
      -- 这里重叠了1区与4区<=623.15的部分
      if T in 273.15..623.15 and p>=IF97.Region4.Ps(T) and p<=100.0 then
         return 1;
      elsif T in 273.15..623.15 and p>=0.0 and p<IF97.Region4.Ps(T) then
         return 2;
      elsif T in 623.15..863.15 and p>=0.0 and p<B23.P(T) then
         return 2;
      elsif T in 863.15..1073.15 and p>=0.0 and p<=100.0 then
         return 2;
      elsif T in 623.15..B23.T(P) and p in B23.P(T)..100.0 then
         return 3;
      elsif T in 273.15..647.096 and p in 0.0..22.064 then
         return 4;
      elsif T in 1073.15..2273.15 and p in 0.0..50.0 then
         return 5;
      end if;
      return 0;
   end Region;

   function v(p,T:Double) return Double is
      R:Integer:=Region(p,T);
   begin
      if R=1 then
         return Region1.v(p,T);
      elsif R=2 then
         return Region2.v(p,T);
      elsif R=3 then
         return  1.0/Region3.Rho3(p,T);
      elsif R=4 then
         if T in 273.15..623.15 then
            return Region1.v(p,T);
         else
            return 1.0/Region3.Rho3(p,T);
         end if;
      elsif R=5 then
         return Region5.v(p,T);
      end if;
      return -1.0;
   end v;

   function r(p,T:Double) return Double is
   begin
      return 1.0/v(p,T);
   end r;

   function u(p,T:Double) return Double is
      R:Integer:=Region(p,T);
   begin
      if R=1 then
         return Region1.u(p,T);
      elsif R=2 then
         return Region2.u(p,T);
      elsif R=3 then
         return  Region3.u(Region3.Rho3(p,T),T);
      elsif R=4 then
         if T in 273.15..623.15 then
            return Region1.u(p,T);
         else
            return Region3.u(Region3.Rho3(p,T),T);
         end if;
      elsif R=5 then
         return Region5.u(p,T);
      end if;
      return -1.0;
   end u;

   function s(p,T:Double) return Double is
      R:Integer:=Region(p,T);
   begin
      if R=1 then
         return Region1.s(p,T);
      elsif R=2 then
         return Region2.s(p,T);
      elsif R=3 then
         return  Region3.s(Region3.Rho3(p,T),T);
      elsif R=4 then
         if T in 273.15..623.15 then
            return Region1.s(p,T);
         else
            return Region3.s(Region3.Rho3(p,T),T);
         end if;
      elsif R=5 then
         return Region5.s(p,T);
      end if;
      return -1.0;
   end s;

   function h(p,T:Double) return Double is
      R:Integer:=Region(p,T);
   begin
      if R=1 then
         return Region1.h(p,T);
      elsif R=2 then
         return Region2.h(p,T);
      elsif R=3 then
         return  Region3.h(Region3.Rho3(p,T),T);
      elsif R=4 then
         if T in 273.15..623.15 then
            return Region1.h(p,T);
         else
            return Region3.h(Region3.Rho3(p,T),T);
         end if;
      elsif R=5 then
         return Region5.h(p,T);
      end if;
      return -1.0;
   end h;

   function cp(p,T:Double) return Double is
      R:Integer:=Region(p,T);
   begin
      if R=1 then
         return Region1.cp(p,T);
      elsif R=2 then
         return Region2.cp(p,T);
      elsif R=3 then
         return  Region3.cp(Region3.Rho3(p,T),T);
      elsif R=4 then
         if T in 273.15..623.15 then
            return Region1.cp(p,T);
         else
            return Region3.cp(Region3.Rho3(p,T),T);
         end if;
      elsif R=5 then
         return Region5.cp(p,T);
      end if;
      return -1.0;
   end cp;

   function cv(p,T:Double) return Double is
      R:Integer:=Region(p,T);
   begin
      if R=1 then
         return Region1.cv(p,T);
      elsif R=2 then
         return Region2.cv(p,T);
      elsif R=3 then
         return  Region3.cv(Region3.Rho3(p,T),T);
      elsif R=4 then
         if T in 273.15..623.15 then
            return Region1.cv(p,T);
         else
            return Region3.cv(Region3.Rho3(p,T),T);
         end if;
      elsif R=5 then
         return Region5.cv(p,T);
      end if;
      return -1.0;
   end cv;

   function w(p,T:Double) return Double is
      R:Integer:=Region(p,T);
   begin
      if R=1 then
         return Region1.w(p,T);
      elsif R=2 then
         return Region2.w(p,T);
      elsif R=3 then
         return  Region3.w(Region3.Rho3(p,T),T);
      elsif R=4 then
         if T in 273.15..623.15 then
            return Region1.w(p,T);
         else
            return Region3.w(Region3.Rho3(p,T),T);
         end if;
      elsif R=5 then
         return Region5.w(p,T);
      end if;
      return -1.0;
   end w;

   -- 根据温度求饱和压力
   function Pss(T:Double) return Double is
   begin
      if T >= 623.15 then
         return B23.P(T);
      else
         return Region4.Ps(T);
      end if;
   end Pss;

   -- 根据压力求饱和温度
   function Tss(P:Double) return Double is
   begin
      if P>=16.5291642526 then
         return B23.T(P);
      else
         return Region4.Ts(P);
      end if;
   end Tss;

   function Psw(T:Double) return Double is
   begin
      if T > 623.15 then
         return Region3.P(Region3.Rho3(B23.P(T),623.15),623.15);
      else
         return Region4.Ps(T);
      end if;
   end Psw;

   function Tsw(P:Double) return Double is
   begin
      if p >= 16.5291642526 then
         declare
            Ts:double:=B23.T(P);
         begin
            return (if Ts<623.15 then Ts else 623.15);
         end;
      else
         return Region4.Ts(P);
      end if;
   end Tsw;



end IF97.Interfaces;

















































  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值