python - 将 Fortran DO WHILE 循环转换为 Python
问题描述
我正在尝试将以下 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
解决方案
更改if abs(ETP-ET) < 0.05 and j>10:
并if abs(ETP-ET) < 0.05 or j>10:
删除缩进,return OUT
使其脱离 while 循环。
推荐阅读
- r - dplyr group_by 在两列的元素上
- asp.net - iis 托管网站不同于本地网站
- python - 将过滤器字典匹配到另一个 - Python
- angular - 错误类型错误:“_co.bankId 未定义”(Angular 7)
- java - 带有 Kafka 源和 Dataflow 运行器的 Beam java SDK 2.10.0:窗口化的 Count.perElement 永远不会触发数据
- python - 如何通过聚合循环运行数据框列表?
- java - 使用模拟服务进行 H2 数据库测试会产生空指针异常
- sql - 使用多个布尔运算符的 SQL 搜索
- javascript - 如何解析在javascript中嵌套了转义JSON的JSON?
- c# - 无法将 C# 类型正确代理到 F# WebSharper 应用程序中的客户端代码