Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran do循环中写入文件_Fortran - Fatal编程技术网

在Fortran do循环中写入文件

在Fortran do循环中写入文件,fortran,Fortran,我刚刚开始学习fortran,我已经做了一个简单的程序,实现了Eulers方法。我注意到,do循环使用的时间与Matlab中的相同程序非常相似 在我的Fortran程序中,我在do循环中写入了一个文件。当我移除它时,速度大大提高,正如预期的那样。然后我添加了第二个do循环,在这里我放置了写入内容,并测量了两个循环组合所需的时间: open(unit=1, file='data.dat') write(1,*) t(1),' ', y(1) ! Calculating call cpu_time(

我刚刚开始学习fortran,我已经做了一个简单的程序,实现了Eulers方法。我注意到,
do
循环使用的时间与Matlab中的相同程序非常相似

在我的Fortran程序中,我在
do
循环中写入了一个文件。当我移除它时,速度大大提高,正如预期的那样。然后我添加了第二个
do
循环,在这里我放置了写入内容,并测量了两个循环组合所需的时间:

open(unit=1, file='data.dat')
write(1,*) t(1),' ', y(1)
! Calculating
call cpu_time(start)
do i = 2,n
    t(i) = t(i-1) + dt
    y(i) = y(i-1) + dt*(t(i-1)*(y(i-1)))
    !write(1,*) t(i),' ', y(i)
end do
call cpu_time(finish)
print  '("Time = ",f7.5," seconds.")',finish-start
call cpu_time(start)
do i = 2,n
    write(1,*) t(i),' ',y(i)
end do
 call cpu_time(finish)
print  '("Time = ",f7.5," seconds.")',finish-start
给定的
n
的时间在最后一个
do
循环中大约比第一个循环长10-15倍


所以,我的问题是,有没有更好的方法将我的数据写入文件?

假设t和y是真的,并且取决于编译器的实现质量,数组的大小、月亮的相位和局部中子通量类似于下面的东西可能会更快

ian-standard@barleybarber ~
$ cat t.f90
Program test

  ! Corrected program

  Implicit None

  Real, Dimension( 1:10 ) :: t, y

  Integer :: i

  Call Random_number( t )
  Call Random_number( y )

  Do i = 1, 3
     Write( *, * ) t( i ), y( i )
  End Do
  Write( *, * )

  Write( *, '( f0.9, 1x, f0.9 )' ) ( t( i ), y( i ), i = 1, 3 )

  Open( 1, file = 'stuff.dat' )
  Write( 1, '( f0.9, 1x, f0.9 )' ) ( t( i ), y( i ), i = 1, &
       Min( Size( t ), Size( y ) ) )

End Program test

ian-standard@barleybarber ~
$ gfortran -O -Wall -Wextra -pedantic -std=f95 t.f90 -o test

ian-standard@barleybarber ~
$ ./test
  0.997559547      0.217951715    
  0.566824675      0.133160353    
  0.965915322      0.900524497    

.997559547 .217951715
.566824675 .133160353
.965915322 .900524497

ian-standard@barleybarber ~
$ head stuff.dat 
.997559547 .217951715
.566824675 .133160353
.965915322 .900524497
.747927666 .386765957
.367390871 .445482254
.480636895 .661932170
.073754251 .016108274
.005355179 .650854826
.347081244 .646408796
.342243791 .322987258

因为编译器可能足够聪明,可以将这一切转换为一个I/O事务,而不是许多事务。但你不能肯定。如果您不需要所有小数点,也可以更好地调整格式。

为完整起见,我将发布2d数组复制方法:

integer,dimension(10)::x,y
integer,allocatable::tmp(:,:)
integer i
x=[(i, i=0,9)]
y=x+42
allocate(tmp(2,size(x)))
tmp(1,:)=x
tmp(2,:)=y
write(*,'(i0,'','',i0)')tmp
deallocate(tmp)
end
0,42 1,43 2,44 3,45 4,46 5,47 6,48 7,49 8,50 9,51 如果性能真的很关键,我会尝试两者


注意,最好的方法可能是首先简单地使用2d数组(或派生类型)。

如果您希望在输出文件中使用这种格式,我恐怕不会。谢谢。哪种格式更快?你可以一次写出所有的t,一次写出所有的y。然而,这仍然是相当缓慢的。格式很昂贵。通过无格式IO,您可以更快地读取文件,但是您不能再将该文件作为文本文件读取。还有两件事:1)小心使用
CPU\u时间
,因为它可能会隐藏执行IO所花费的一些时间,请参阅。我发现对于一个测试用例,
gfortran
给出了
CPU\u时间
SYSTEM\u时钟
之间30%的差异。2)我不会太担心这样做所花费的时间。当您以后遇到实际数据量的问题时,您应该将重新启动文件迁移到未格式化或hdf5或其他位置。对于您的玩具箱,我认为您应该只进行较小的IO操作。尝试将数据复制到
2,10
数组中,并编写这样的代码:您不需要将内存浪费在额外的数组中—尽管我在历史上承认这有助于编译器和I/O库优化操作。现在我的怀疑是,智能操作系统对I/O的缓冲使其变得无关紧要,但上面的内容可能会有所帮助。几乎完全无关紧要:我建议参考中微子通量(中子衰变的半衰期为15分钟);)看起来这对于n的大值来说更快,大约是do循环的0.6-0.7 0,42 1,43 2,44 3,45 4,46 5,47 6,48 7,49 8,50 9,51