我正在嘗試使用FortranFile來獲取可在我的F95編寫的仿真代碼中使用的輸出。我遇到麻煩讓fortranfile正常工作。也許這是因爲我不明白它是如何工作的。這裏是我的問題:Fortran的未格式化輸入/輸出
如果我想寫使用FortranFile一維數組,它工作正常:
以上1Dnx = 128
bxo = np.zeros(nx, dtype=float)
bxo = something
import fortranfile as fofi
bxf=fofi.FortranFile('Fbx.dat',mode='w')
bxf.writeReals(bxo,prec='d')
bxf.close()
版本的作品就像一個魅力。當我嘗試做了一個二維數組,我得到的問題
nx = 128; ny = 128
bxo = np.zeros((nx,ny), dtype=float)
bxo = something
import fortranfile as fofi
bxf=fofi.FortranFile('Fbx.dat',mode='w')
bxf.writeReals(bxo,prec='d')
bxf.close()
當我嘗試這樣做,我得到以下錯誤:
---------------------------------------------------------------------------
error Traceback (most recent call last)
/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/IPython/utils/py3compat.py in execfile(fname, *where)
173 else:
174 filename = fname
--> 175 __builtin__.execfile(filename, *where)
/Users/parashar/Dropbox/sandbox/test2d.py in <module>()
130 vyf=fofi.FortranFile('Fvy.dat',mode='w')
131 vzf=fofi.FortranFile('Fvz.dat',mode='w')
--> 132 bxf.writeReals(bxo,prec='d')
133 byf.writeReals(byo,prec='d')
134 bzf.writeReals(bzo,prec='d')
/Users/parashar/Dropbox/sandbox/fortranfile.py in writeReals(self, reals, prec)
215 _fmt = self.ENDIAN + prec
216 for r in reals:
--> 217 self.write(struct.pack(_fmt,r))
218 self._write_check(length_bytes)
219
error: required argument is not a float
任何想法可能是怎麼回事?
謝謝!
直接訪問文件**可能**沒有記錄標記。那裏有一些處理器仍然會爲這些文件添加記錄標記,而Fortran標準明確允許這樣做。改爲使用Fortran 2003的未格式化流訪問。 – IanH 2013-04-05 02:52:11
感謝您的信息@IanH!我在2004年至2005年至少有5-6臺不同的超級計算機上生成了直接訪問文件,並且能夠像IDL文件一樣在IDL中讀取它們。所以我沒有意識到這一點。你能否提供一些指導來閱讀這一點?謝謝! – toylas 2013-04-05 02:59:10
這種處理器的一個例子是帶有-vms編譯標誌的英特爾Fortran。我見過的另一個放置/期望在文件的頭文件中匹配RECL以進行錯誤檢查。允許的標準擴展到第9條 - 尋找「依賴於處理器」/「處理器可能」,並且您很快就會意識到任何事情都會發生。這絕不是常見的情況,但它的可能性正是流式訪問被添加到語言中的原因。有關流訪問的描述,請參閱F2003或您最喜愛的當前編譯器手冊 - 大量的問題/答案也在本站上討論。 – IanH 2013-04-05 03:16:57