Fortran的无格式输入/输出

2024-05-19 07:06:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用FortranFile得到一个输出,可以用在我用F95编写的模拟代码中。我很难让fortranfile正常工作。也许是因为我不明白它是怎么工作的。我的问题是:

如果我想用FortranFile编写一个1D数组,它可以很好地工作:

nx = 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()

上面的1D版本就像一个符咒。当我试着为二维数组做这件事时,我就遇到了问题

^{pr2}$

当我尝试这样做时,我得到以下错误:

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

你知道会发生什么吗?在

谢谢!在


Tags: inpyselfmode数组floatdatnx
2条回答

我从来没有必要同时使用Fortran和Python做任何事情,对它一无所知fortranfile.py文件,但我最好的猜测是fortranfile不知道numpy。在

当您使用1D numpy数组或Python数组、列表等时,堆栈跟踪的最后一部分中的迭代表明它需要一个iterable数字(“forr in reals”),而当您尝试序列化2D numpy数组时,我不确定它得到了什么(即“r”最终是什么),可能是iterable迭代器,或者是1D数组的iterable。简而言之,“r”不仅仅是期望的数字(“必需的参数不是浮点”),而是其他的东西(如1D数组、列表等)。在

我想看看fortranfile中是否有writeRes()的替代品,如果没有,就用一点复制品来处理2D数组。在

在那之前我会先做个诊断指纹”自写()“第(217)行,它告诉您“r”实际上是什么,因为它不是预期的浮点。在

我喜欢埃米特的建议,但考虑到我对python的了解非常基础,这对于一个短期目标来说将是一个很大的努力。我刚刚意识到我可以用一种稍微不同的方式来处理这种情况。在

Fortran中的直接访问文件不像通常的未格式化Fortran文件那样具有不必要的前导/尾随信息。因此,处理Fortran和Python之间交换的未格式化数据的最简单方法是在Fortran中将文件视为直接访问。下面是一个示例,说明如何使用python/fortran之间的数据。在

Python代码:

import numpy as np
nx=128; ny=128;
bxo=np.zeros((nx,ny),dtype=float)
bxo=something
bxf=open('Fbx.dat',mode='wb')
np.transpose(bxo).tofile(bxf) # We transpose the array to map indices 
                              # from python to fortran properly
bxo.close()

Fortran代码:

^{pr2}$

因为我们使用标准的二进制格式来读/写数据,所以这个方法可以处理任何大小的数组,而不像FortranFile方法。在

我意识到,在Fortran中坚持使用直接访问文件,我们可以与其他语言(如Python、IDL等)有更广泛的兼容性,这样我们就不必担心奇怪的前导尾随标记、尾数等

我希望这对我这种情况下的其他人也有帮助。在

相关问题 更多 >

    热门问题