2017-08-16 43 views
1

我想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

所以你做任何一致性測試或什麼? –

回答

2

當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