我正在尝试使用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 FILES,遗憾的是我不能分享,因为REFPROP不是开源的)
有人可以帮我弄清楚为什么会这样。?
P.S:上面的代码是使用gfortran -fdefault-real-8
编译的 更新
我尝试使用system_clock
按照下面@Ross的建议计算我的计算时间。结果在整个循环中是均匀的(下图)。我必须找到提高计算速度的其他方法我猜(叹气!)
答案 0 :(得分:1)
我没有具体的答案,但这种行为看起来像我所期望的,如果所有电话真的需要大约3毫秒,但是你对CPU_TIME
的呼叫没有注册任何东西低于15毫秒。您是否看到任何输出的时间少于10毫秒?对我来说特别感兴趣的是,返回非零时间的呼叫之间大约均匀间隔 - 即使在5时也是如此。
CPU时序可能是一件棘手的事情。我在评论中建议您尝试system_clock
,其精度可能高于CPU_TIME
。你说它不起作用,但我不相信。您是否将长整数传递给system_clock
?您系统的count_rate
是多少?是否所有时间仍然是15或0毫秒?