这个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] 
+0

所以你做任何一致性测试或什么? –

当1977年滚动时,我已经编程了大约八年。幸运的是,这段代码是没有深奥或复杂的基础。不是我可以看清它的功能。

但是,我可以翻译它。这里有一个你可以尝试的方式。

  • Fortran阵列是1相对的;即一维阵列的第一个元素是第一个元素。如你所知,Python浮点数是双打的。
  • 与Python for-loop变量不同,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) 
+0

谢谢。我认为GOTO 18相当于突破声明。这是我混乱的根源。 – wandadars