如何逐行写一个巨大的矩阵(fortran 90)

时间:2013-09-17 07:11:22

标签: matrix fortran intel-fortran

我想逐行将包含大量数据的矩阵写入文件。例如,我有一个矩阵100 * 100,我希望在文件中以100 * 100的形式。但是,它不起作用。以下是我的代码和一些描述。 N和M是几百个左右的整数。 RECL是预期的长度我设置文件,但在这里似乎这个命令不起作用。当N设置为99时,输出为198行 并且M设置为200. Vec是双精度复数矩阵。我怎么能输出Vec的值保持其原始格式N * M?我的编译命令是“ifort -o out test.f90”。

open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace",RECL=40*M+10)
do i=1,N
 do j=1,M
  write(2, '(F)', advance='no') real(Vec(i,j)) 
 end do
  write(2, *) '' 
end do

按照@george的建议,我编写了一个这样的程序:

program test
implicit none

integer i,j

open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,500
 write(2, '(1600F14.7)')( 0.00001 ,j=1,499)
end do

close(2)

end

使用此代码,问题解决了!也许我上次没有正确编译。

2 个答案:

答案 0 :(得分:5)

扩展我的评论,你还应该使用一个隐式循环..这个:

open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,N
     write(2, '(1000F14.7)')( real(Vec(i,j)) ,j=1,M)
end do

或者对于足够现代的编译器(我不确定它有多新......)

     write(2, '(*(F14.7))')( real(Vec(i,j)) ,j=1,M)

注意,已经指出,2008年标准中(F14.7)无限格式项目需要*左右的括号。

也可以提取其他评论,你也可以这样做:

      write(2, '(*(F14.7))')real(Vec(i,:M))

答案 1 :(得分:2)

ifort使用默认记录长度80。除此之外的一切都放在下一行。您可以通过发出export FORT_FMT_RECL=250在运行时对其进行扩展,扩展到250个字符。 (当然,你需要调整这个数字)。

但我的猜测是你的写声明的格式说明符。您是否尝试逐行而不是按元素编写矩阵?然后你可以直接指定元素的数量(而不是使用advance='no')。

This post也可能有帮助!

编辑: 逐行编写可以像这样实现:

open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,N
  write(2,*) real( Vec(i,:) ) 
end do
close(2)