我对于在Linux和Fortran上工作都是非常陌生的,如果这是一个基本问题,我深表歉意。
我试图首先使用fwrite将我在MATLAB中生成的60x150数组另存为二进制文件,然后尝试再次将其作为60x150数组加载并读入Fortran。
在Matlab中,我使用以下代码保存数组。在这种情况下,工作空间中数组的名称为VP,我将其保存到也称为“ VP”的文件中:
>> fileID = fopen('VP','w');
>> fwrite(fileID,VP,'real*8');
>> fclose(fileID)
接下来,我将文件从Windows复制到linux ssh服务器(我不确定这是否相关,但认为包括所有可能有用的内容都是值得的)。
现在,在我的Fortran代码中,我得到了:
REAL(KIND=kind(1.0D0)), DIMENSION(60,150) :: VP
...
open(unit, file="LOCATION/VP", access = "stream", form = "unformatted", iostat = stat)
if(stat /= 0) labort("Failed to open input file")
print *, wl
DO inx2=1,60
DO inx=1,150
print *,inx
READ(unit,*) VP(inx2,inx)
ENDDO
ENDDO
print *,VP(1:10,1)
现在,当我编译它时,没有错误。但是,当我运行它时,它会在失败之前准确到达第一个“ READ(unit,*)VP(inx2,inx)”(您可以从打印前的内容中看出来)。
我得到了错误:
forrtl: severe (257): formatted I/O to unit open for unformatted transfers, unit 111, file LOCATION/VP
显然,我希望我的实际结果是函数运行并以数组中的相同值结束。
现在我之前已经看到了这个问题,特别是针对此错误消息的,但是通过包含我已经拥有的access="stream"
来回答。基本上,我不确定在此过程中什么时候出现了问题,将不胜感激。
请注意,我尝试过的一些操作是更改fwrite的精度,并交换inx2和inx值(但在第一个操作上失败,因此我不认为这是错误的原因)。
同样,这可能只是我对Fortran的理解中的一个基本问题,因为我对自己正在从事的项目有所了解(我正在运行的大部分代码是由其他人制作的) ,我只是尝试编辑其中的一小部分。)
编辑:
好的,非常感谢francescalus!他发现解决方案是将行编辑为READ(unit)VP(inx2,inx)以使其运行。但是,我通过运行下一行代码获得的值:
print *,VP(1:10,1)
只有第一个值与我原始的matlab数组中的第一个值匹配。在显示matlab数组的VP(1:5,1:5)时,没有其他匹配值。我也许可以自己解决这个问题,但是由于我已经在这里,所以我还想问一问,因为我还没有完全完成原始问题(尽管遇到了很大的障碍!)。
编辑2:
好吧,接下来我已经为自己找到了答案。如果有人在搜索,那只是交换DO循环的一种情况。即
DO inx=1,150
DO inx2=1,60
print *,inx
READ(unit,*) VP(inx2,inx)
ENDDO
ENDDO
感谢您的帮助。