在Fortran中写入文件循环

时间:2015-09-25 08:25:15

标签: fortran

我刚刚开始学习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倍。

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

2 个答案:

答案 0 :(得分:2)

假设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事务而不是很多。但你无法确定。如果你不需要所有小数位,也要给它一个更好的机会,适当调整格式。

答案 1 :(得分:1)

为了完整性,我将发布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数组(或派生类型)。