Я пытаюсь преобразовать следующий цикл Fortran в python. Цель состоит в том, чтобы установить abs(ETP-ET)=0.0. Однако мое решение не сходится к 0,0. Что не так в моем подходе?
код Фортран
ET(I) = TDEW_F
TSTAR = (ET(I)+TDEW_F)*0.5
BETA = 0.255-(8.5E-3*TSTAR)+(2.04E-4*TSTAR*TSTAR)
FW = ACONV*AFW(JW)+BCONV*BFW(JW)*WIND2M**CFW(JW)
CSHE(I) = 15.7+(0.26+BETA)*FW
RA = 3.1872E-08*(TAIR_F+459.67)**4
ETP = (SRO_BR+RA-1801.0)/CSHE(I)+(CSHE(I)-15.7)*(0.26*TAIR_F+BETA*TDEW_F)/(CSHE(I)*(0.26+BETA))
J = 0
DO WHILE (ABS(ETP-ET(I)) > 0.05 .AND. J < 10)
ET(I) = ETP
TSTAR = (ET(I)+TDEW_F)*0.5
BETA = 0.255-(8.5E-3*TSTAR)+(2.04E-4*TSTAR*TSTAR)
CSHE(I) = 15.7+(0.26+BETA)*FW
ETP = (SRO_BR+RA-1801.0)/CSHE(I)+(CSHE(I)-15.7)*(0.26*TAIR_F+BETA*TDEW_F)/(CSHE(I)*(0.26+BETA))
J = J+1
END DO
RETURN
Код Python
ET = TDEW_F
TSTAR = (ET+TDEW_F)*0.5
BETA = 0.255-(8.5E-3*TSTAR)+(2.04E-4*TSTAR*TSTAR)
FW = ACONV*AFW(JW)+BCONV*BFW(JW)*WIND2M**CFW(JW)
CSHE = 15.7+(0.26+BETA)*FW
RA = 3.1872E-08*(AirT_F+459.67)**4
ETP = (SRO_BR+RA-1801.0)/CSHE+(CSHE-15.7)*(0.26*AirT_F+BETA*DewPt_F)/(CSHE*(0.26+BETA))
j = 0
while True:
ET = ETP
TSTAR = (ET+TDEW_F)*0.5
BETA = 0.255-(8.5E-3*TSTAR)+(2.04E-4*TSTAR*TSTAR)
CSHE = 15.7+(0.26+BETA)*FW
ETP = (SRO_BR+RA+RA-1801.0)/CSHE+(CSHE-15.7)*(0.26*AirT_F+BETA*TDEW_F)/(CSHE*(0.26+BETA))
j+=1
if abs(ETP-ET) < 0.05 and j>10:
break
OUT = (ET-ETP)
return OUT
return OUT в цикле безоговорочно не работает
Я не вижу причин, почему бы просто не следовать Фортрану как можно ближе. Все это while True кажется мне ненужным, запутанным. Если в цикле Fortran есть условное выражение, просто сделайте то же самое в Python while (condition):. Кроме того, в Фортране, даже если вы не видите необходимых объявлений, ET выглядит как массив. Почему бы вам не сохранить массив в Python? На самом деле, просто следуйте оригиналу как можно ближе. Это должно быть довольно просто, в этом коде нет ничего сложного. То же самое во многих языках программирования.






Замените if abs(ETP-ET) < 0.05 and j>10: на if abs(ETP-ET) < 0.05 or j>10: и удалите отступ в return OUT, чтобы он не попал в цикл while.
while Trueне может быть эквивалентен циклу с условной проверкой (если только ваше условие не является тупым и никогда не может быть выполнено)