2017-02-01 15 views
1

Я пытаюсь использовать подпрограмму REFPROPs HSFLSH для вычисления свойств для пара.Странное поведение при вызове свойств из файлов REFPROP FORTRAN

Когда же состояние свойство вычисляется по множеству итераций
(фиксированная энтальпии и энтропии (Enthalpy = 50000 J/mol & Entropy = 125 J/mol),
время, необходимое для вычисления с помощью HSFLSH после каждых 4-й/5-е итерации увеличивается до примерно 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 ФАЙЛЫ, которые, к сожалению я не могу разделить, так как REFPROP не является открытым исходным кодом)
Может кто-то помочь мне понять, почему это происходит.?

P.S: Приведенный выше код был скомпилирован с использованием gfortran -fdefault реальном 8

UPDATE
Я попытался с помощью system_clock ко времени мои расчеты, как было предложено @Ross ниже. Результаты однородны по петле (изображение ниже). Я должен найти альтернативные пути для улучшения скорости вычислений я думаю (Вздох!)

enter image description here

+1

Где находится 'implicit none'? Сделайте двойную точность 'tstart' и' tstop'. –

+0

Я скомпилировал с помощью -fdefault-real-8, чтобы все было в двойной точности. (Обновлено также) –

+0

Без других, способных воспроизвести это, я думаю, что кому-то будет трудно помочь. Вы пробовали связаться со службой поддержки программного обеспечения? Возможно, было бы полезно узнать, какую систему вы используете (например, сколько физических ядер доступно/используется, многопользовательская/однопользовательская машина и т. Д.). –

ответ

1

У меня нет конкретного ответа, но такое поведение выглядит как то, что я хотел бы ожидать, если все звонки на самом деле заняло около 3 мс, но ваш звонок CPU_TIME не регистрирует ничего ниже около 15 мс. Вы видите любой результат с затраченным временем меньше, скажем, 10 мс? Особый интерес для меня представляет собой приблизительно равномерное расстояние между вызовами, которые возвращают ненулевое время - это примерно равно 5.

Время синхронизации может быть сложным делом. Я рекомендовал в комментарии, что вы попробуете system_clock, который может быть более высокой точности, чем CPU_TIME. Вы сказали, что это не сработает, но я не убежден. Прошли ли вы длинное целое число до system_clock? Что представляет собой count_rate для вашей системы? Были ли все еще 15 или 0 мс?

+0

Возможный вопрос [здесь] (http://scicomp.stackexchange.com/q/6812), который дает пример использования 'system_clock'. В принятом ответе на это рекомендуется использовать 'mpi_wtime' и дает минимальный пример его использования (обратите внимание, что пример слишком минимален, ему не нужен вызов' mpi_init'). –

+1

Неплохо, я не передал длинные целые числа в 'system_clock'. Принятое время равномерное для всех итераций. Я уточню вопрос. –