从REFPROP FORTRAN文件调用属性时出现奇怪的行为

时间:2017-02-01 07:09:26

标签: fortran gfortran

我正在尝试使用REFPROPs HSFLSH子例程来计算steam的属性。

当在多次迭代中计算相同的状态属性时 (固定焓和熵(Enthalpy = 50000 J/mol & Entropy = 125 J/mol)
在每次第4次/第5次迭代后使用HSFLSH计算所需的时间增加到大约0.15 ms,而其他迭代的时间可以忽略不计。这是有问题的,因为我的程序调用这个子程序几千次。从而导致异常庞大的程序运行时间。

enter image description here

用于生成上述日志的程序如下:

 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的建议计算我的计算时间。结果在整个循环中是均匀的(下图)。我必须找到提高计算速度的其他方法我猜(叹气!)

enter image description here

1 个答案:

答案 0 :(得分:1)

我没有具体的答案,但这种行为看起来像我所期望的,如果所有电话真的需要大约3毫秒,但是你对CPU_TIME的呼叫没有注册任何东西低于15毫秒。您是否看到任何输出的时间少于10毫秒?对我来说特别感兴趣的是,返回非零时间的呼叫之间大约均匀间隔 - 即使在5时也是如此。

CPU时序可能是一件棘手的事情。我在评论中建议您尝试system_clock,其精度可能高于CPU_TIME。你说它不起作用,但我不相信。您是否将长整数传递给system_clock?您系统的count_rate是多少?是否所有时间仍然是15或0毫秒?