我刚刚开始学习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倍。
所以,我的问题是,有没有更好的方法将我的数据写入文件?
答案 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数组(或派生类型)。