【发布时间】:2021-05-17 12:41:53
【问题描述】:
我有一个创建 .txt 文件('fortc.txt')的 Python 代码(我们称之为“pycode.py”)。该文件需要通过 fortran90 代码生成的 .exe ('f90code.exe') 读取。然后,fortran 代码执行一些操作并将结果写入另一个 .txt 文件(“res_tc.txt”),该文件之前通过 pycode.py 创建,pycode.py 最终将读取和打印。这是python代码:
import csv
import sys, os
import numpy as np
with open('fortc.txt', 'w') as g:
writer = csv.writer(g, delimiter=" ", quoting=csv.QUOTE_NONE, escapechar=' ')
writer.writerow(['1', '2', '3', '4'])
f = open('res_tc.txt','w+')
os.system('./f90code.exe')
readres = np.loadtxt('res_tc.txt')
tc = float(readres)
print(tc)
f.close()
如果我手动创建文件“fortc.txt”,然后只运行 f90 代码,而不通过 python,一切正常,我得到预期的结果。但是,如果我通过 python 运行所有内容,则会正确创建“fortc.txt”,但显然 fortran 无法正确读取它。事实上,'fortc.txt'中的所有内容都被读取为'0.0000000000000',执行操作时会产生以下错误:
Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DENORMAL
显然我得到一个“NaN”作为结果。此外,看起来 fortran 没有正确运行 do 循环,因为如果我尝试在 do 循环内打印某些内容,我不会打印出任何内容。以下是读取文件的 f90 代码部分:
program tc
real*8, allocatable:: ne(:), kt(:), abund(:), z(:)
integer:: i, j, ndati, n
data ab/0.,0.1,0.31623,1./
open(96,file='fortc.txt',status='old')
n=0
do
read(96,*,end=320)
n=n+1
end do
320 continue
ndat=n
allocate(ne(ndat), kt(ndat), abund(ndat), z(ndat))
rewind(96)
do j=1, ndat
read(96,*) kt(j), abund(j), ne(j), z(j)
print*, kt(j)
end do
end program
在 f90 结束时 print 调用没有结果,只有上面显示的错误和“NaN”(源自 python 代码中的打印)。另一方面,如果将 print 语句带到 do 循环之外,我会打印一些东西('0.00000000',如上所述)。同样,这仅在通过 python 运行编译的 fortran 代码时才会发生,而如果我只是从终端运行 .exe,它会按预期工作。
do 循环的处理方式有问题吗? .txt 文件中的数字没有正确读取,并且没有执行打印,这表明我可能存在问题。但是,我无法修复它。
【问题讨论】:
-
对于所有 Fortran 问题,请使用标签 fortran。您的问题不是特定于版本的,因此我们甚至根本没有为旧的 Fortran 90 指定标签。
-
ab 应该是什么?始终使用 Implicit None(并且永远不要使用 real*8 - stackoverflow.com/questions/838310/fortran-90-kind-parameter)
-
您真正的 Fortran 代码是否真的写入
res_tc.txt?您发布的 Fortran 代码根本不会写入该文件。 -
我希望您的编译器抱怨 Fortran 程序损坏(如果没有,那么您需要寻找更好的编译器),那么您是否解决了编译时发现的所有问题?如前所述,请务必使用
implicit none。 -
在这个“with open('fortc.txt', 'w') as g:”的块中,是不是有必要关闭那个块并“缩进”到第一列? (以便文件输出完成)