我正在尝试将以下Fortran循环转换为python。目的是设置abs(ETP-ET)=0.0
。但是,我的解决方案不能收敛到0.0。我的方法有什么问题?
Fortran代码
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
答案 0 :(得分:0)
用if abs(ETP-ET) < 0.05 and j>10:
更改if abs(ETP-ET) < 0.05 or j>10:
并删除return OUT
中的缩进,这样就不会出现while循环了。