从 REFPROP FORTRAN 文件调用属性时的奇怪行为
Strange behavior while calling properties from REFPROP FORTRAN files
我正在尝试使用 REFPROPs HSFLSH
子例程来计算 steam 的属性。
当多次迭代计算出相同的状态属性时
(固定焓和熵 (Enthalpy = 50000 J/mol & Entropy = 125 J/mol)
,
在每第 4 次/第 5 次迭代后使用 HSFLSH
进行计算所花费的时间增加到大约 0.15 ms
而其他迭代的时间量可以忽略不计。这变成了问题,因为我的程序对这个子例程进行了数千次调用。从而导致异常庞大的程序 运行 次。
生成上述日志的程序在这里:
C refprop check
program time_check
parameter(ncmax=20)
dimension x(ncmax)
real hkj,skj
character hrf*3, herr*255
character*255 hf(ncmax),hfmix
C
C SETUP FOR WATER
C
nc=1 !Number of components
hf(1)='water.fld' !Fluid name
hfmix='hmx.bnc' !Mixture file name
hrf='DEF' !Reference state (DEF means default)
call setup(nc,hf,hfmix,hrf,ierr,herr)
if (ierr.ne.0) write (*,*) herr
call INFO(1,wm,ttp,tnbp,tc,pc,dc,zc,acf,dip,rgas)
write(*,*) 'Mol weight ', wm
h = 50000.0
s = 125.0
c
C
DO I=1,NCMAX
x(I) = 0
END DO
C ******************************************************
C THIS IS THE ACTUAL CALL PLACE
C ******************************************************
do I=1,100
call cpu_time(tstrt)
CALL HSFLSH(h,s,x,T_TEMP,P_TEMP,RHO_TEMP,dl,dv,xliq,xvap,
& WET_TEMP,e,
& cv,cp,VS_TEMP,ierr,herr)
call cpu_time(tstop)
write(*,*),I,' time taken to run hsflsh routine= ',tstop - tstrt
end do
stop
end
(当然你需要 FORTRAN 文件,不幸的是我不能分享,因为 REFPROP 不是开源的)
谁能帮我弄清楚为什么会这样。?
P.S : 上面的代码是使用 gfortran -fdefault-real-8
编译的
更新
我尝试按照下面@Ross 的建议使用 system_clock
来计算我的计算时间。结果在整个循环中是一致的(下图)。我想我将不得不找到其他方法来提高计算速度(叹息!)
我没有具体的答案,但如果所有调用真的花费了大约 3 毫秒,这种行为看起来就像我期望的那样,但是你对 CPU_TIME
的调用没有注册以下任何内容15 毫秒。您是否看到 any 输出的时间少于 10 毫秒?我特别感兴趣的是 return 非零时间的调用之间的间隔大致均匀 - 它大约在 5.
CPU 时机可能是一件棘手的事情。我在评论中推荐你试试system_clock
,它可以比CPU_TIME
精度更高。你说这行不通,但我不服气。您是否将长整数传递给 system_clock
?您的系统的 count_rate
是什么?一直是 15 毫秒还是 0 毫秒?
我正在尝试使用 REFPROPs HSFLSH
子例程来计算 steam 的属性。
当多次迭代计算出相同的状态属性时
(固定焓和熵 (Enthalpy = 50000 J/mol & Entropy = 125 J/mol)
,
在每第 4 次/第 5 次迭代后使用 HSFLSH
进行计算所花费的时间增加到大约 0.15 ms
而其他迭代的时间量可以忽略不计。这变成了问题,因为我的程序对这个子例程进行了数千次调用。从而导致异常庞大的程序 运行 次。
生成上述日志的程序在这里:
C refprop check
program time_check
parameter(ncmax=20)
dimension x(ncmax)
real hkj,skj
character hrf*3, herr*255
character*255 hf(ncmax),hfmix
C
C SETUP FOR WATER
C
nc=1 !Number of components
hf(1)='water.fld' !Fluid name
hfmix='hmx.bnc' !Mixture file name
hrf='DEF' !Reference state (DEF means default)
call setup(nc,hf,hfmix,hrf,ierr,herr)
if (ierr.ne.0) write (*,*) herr
call INFO(1,wm,ttp,tnbp,tc,pc,dc,zc,acf,dip,rgas)
write(*,*) 'Mol weight ', wm
h = 50000.0
s = 125.0
c
C
DO I=1,NCMAX
x(I) = 0
END DO
C ******************************************************
C THIS IS THE ACTUAL CALL PLACE
C ******************************************************
do I=1,100
call cpu_time(tstrt)
CALL HSFLSH(h,s,x,T_TEMP,P_TEMP,RHO_TEMP,dl,dv,xliq,xvap,
& WET_TEMP,e,
& cv,cp,VS_TEMP,ierr,herr)
call cpu_time(tstop)
write(*,*),I,' time taken to run hsflsh routine= ',tstop - tstrt
end do
stop
end
(当然你需要 FORTRAN 文件,不幸的是我不能分享,因为 REFPROP 不是开源的)
谁能帮我弄清楚为什么会这样。?
P.S : 上面的代码是使用 gfortran -fdefault-real-8
编译的更新
我尝试按照下面@Ross 的建议使用 system_clock
来计算我的计算时间。结果在整个循环中是一致的(下图)。我想我将不得不找到其他方法来提高计算速度(叹息!)
我没有具体的答案,但如果所有调用真的花费了大约 3 毫秒,这种行为看起来就像我期望的那样,但是你对 CPU_TIME
的调用没有注册以下任何内容15 毫秒。您是否看到 any 输出的时间少于 10 毫秒?我特别感兴趣的是 return 非零时间的调用之间的间隔大致均匀 - 它大约在 5.
CPU 时机可能是一件棘手的事情。我在评论中推荐你试试system_clock
,它可以比CPU_TIME
精度更高。你说这行不通,但我不服气。您是否将长整数传递给 system_clock
?您的系统的 count_rate
是什么?一直是 15 毫秒还是 0 毫秒?