python - 这段 Fortran 77 代码的意图是什么?

标签 python fortran fortran77

我正在尝试对 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 的目标是循环外的一行,因此类似于 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)

关于python - 这段 Fortran 77 代码的意图是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45719258/

相关文章:

python - 按 Pandas 中的多个日期对数据进行分组

fortran - 从接口(interface)访问参数 (Fortran)

python - f2py 不喜欢子程序中的显式数组

c++ - MinGW:链接 LAPACK 和 BLAS 导致 C++ 异常无法处理

fortran - 无法在 f77 中初始化无类型字符

fortran - 使用 Julia 编译 Fortran77

python - 如何计算每个月或某个月份的事件日期

python - scipy.optimize.fmin 的简单并行化

python - 在 python 上使用 geojson 和 vincent

fortran - 在 Fortran 主文件头中包含 .f 和 .F90 文件