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