这个Fortran 77代码的意图是什么?
问题描述:
我想Pythonize FORTRAN77代码。有一段代码,我似乎无法理解它的意图。这个Fortran 77代码的意图是什么?
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浮点数是双打的。
- 与Python for-loop变量不同,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)
+0
谢谢。我认为GOTO 18相当于突破声明。这是我混乱的根源。 – wandadars
所以你做任何一致性测试或什么? –