簡體   English   中英

Fortran 代碼僅在運行 python 時才會出錯

[英]Fortran code gives error only when run through python

我有一個 python 代碼(我們稱之為'pycode.py'),它創建一個.txt 文件('fortc.txt')。 該文件需要通過fortran90代碼生成的a.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 結束時的打印調用沒有結果,只有上面顯示的錯誤和“NaN”(源自 python 代碼中的打印)。 另一方面,如果將 print 語句帶到 do 循環之外,我會打印一些東西('0.00000000',如上所述)。 同樣,只有在通過 python 運行編譯的 fortran 代碼時才會發生這種情況,而如果我只是從終端運行.exe,它會按預期工作。

do循環的處理方式有什么問題嗎? .txt 文件中的數字沒有正確讀取,並且沒有執行打印,這表明我可能存在問題。 但是,我無法修復它。

當您調用 fortran 代碼時,您的輸入文件為空:

with open('fortc.txt', 'w') as g:

默認情況下,Python 將刷新寫入此文件的數據,並在退出with正文時將其關閉。 但是您在其中包含了對 fortran 代碼的調用。

如果您想使用with進行文件操作,請以這種方式重新排列您的代碼:

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+')   # not sure why the frotran program would output to "f" just because it is open.  If it does, ok, it will wrk.
os.system('./f90code.exe')
readres = np.loadtxt('res_tc.txt')
tc = float(readres)
print(tc)
f.close()  # you can use explicit open and close calls for fortc.txt as well

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM