这段 Fortran 77 代码的目的是什么?

What is the intent of this Fortran 77 code?

我正在尝试对 FORTRAN77 代码进行 Python 化处理。有一段代码我似乎无法理解其意图。

ZM 只是一个介于 0 和 1 之间的标量。Z 是一个包含 NJ 个元素的 0 和 1 之间的一维数组。 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-relative;即,一维数组的第一个元素是第一个。
  • 如您所知,Python 花车是双打。
  • Fortran DO 循环变量采用从第一个到最后一个的每个值,这与 Python for 循环变量不同。
  • GOTO 18 以 DO 循环结束为目标。循环将继续执行 DO 循环变量的下一个值,J.
  • 相比之下,GOTO 20 以循环外的一行为目标,因此类似于 Python break.
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)