我正在尝试对 FORTRAN77 代码进行 Python 化。有一段代码我似乎无法理解其意图。
ZM 只是 0 到 1 之间的标量。Z 是由 0 到 1 之间的数字组成的一维数组,其中包含 NJ 个元素。 J、J1 和 J1M 是 INTEGER 类型。 PDFZ 是另一个具有 NJ 元素的一维数组。我在绘制执行流程时遇到了困难。
DO 18 J=2,NJ
IF(ZM.GT.Z(J)) GOTO 18
J1=J
J1M=J-1
GOTO 20
18 CONTINUE
20 CONTINUE
DO 22 J=1,NJ
PDFZ(J)=0.D0
22 CONTINUE
PDFZ(J1)=(ZM-Z(J1M))/(Z(J1)-Z(J1M))
PDFZ(J1M)=1.D0-PDFZ(J1)
我创建了我认为在 Python2.7 中等效的东西。但我不再确定我的 python 代码是否捕获了 Fortran77 代码的行为。
loc = np.where(z < z_mean)[0][0]
pdf_z[loc] = (z_mean - z[loc-1])/(z[loc] - z[loc-1])
pdf_z[loc-1] = 1.0 - pdf_z[loc]
最佳答案
当 1977 年到来时,我已经编程了大约八年。幸运的是,这些代码是基础代码,没有任何深奥或复杂的内容。我也无法辨别它的作用。
不过,我可以翻译它。这里是您可以尝试的形式。
- Fortran 数组是 1 相关的;即,一维数组的第一个元素是第一个元素。
- 正如您所知,Python float 是 double 。
- 与 Python for 循环变量不同,Fortran DO 循环变量假定从第一个到最后一个的每个值。
GOTO 18
的目标是 DO 循环的末尾。循环将继续执行 DO 循环变量的下一个值J
。- 相比之下,
GOTO 20
的目标是循环外的一行,因此类似于 Pythonbreak
。
def sample(ZM):
Z = [_/10 for _ in range(0,11)]
NJ = len(Z)
for J in range(1, NJ):
if ZM > Z[J]:
continue
J1 = J
J1M = J - 1
break
PDFZ = NJ * [0]
PDFZ[J1] = (ZM - Z[J1M])/(Z[J1] - Z[J1M])
PDFZ[J1M] = 1 - PDFZ[J1]
print (ZM, PDFZ)
for ZM in [0, .1, .2, .3, ]:
sample(ZM)
关于python - 这段 Fortran 77 代码的意图是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45719258/