将Fortran DO WHILE循环转换为Python

时间:2019-03-02 14:10:48

标签: python while-loop fortran

我正在尝试将以下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

1 个答案:

答案 0 :(得分:0)

if abs(ETP-ET) < 0.05 and j>10:更改if abs(ETP-ET) < 0.05 or j>10:并删除return OUT中的缩进,这样就不会出现while循环了。

相关问题