我目前正在编写一个代码来模拟粒子碰撞。我试图打开与粒子(N)一样多的文件,然后在时间积分的每个步骤中为每个文件中的位置和速度放置数据(使用欧拉方法,但这不相关)。为此,我尝试使用do循环,因此它将打开我需要的所有文件 - 然后我将所有数据放入其中,稍后使用不同的do循环 - 然后将它们全部关闭。
我首先尝试执行do循环来打开文件 - 但它给出了#34;文件已在另一个单元中打开的错误",所以我做了以下内容:
module parameters
implicit none
character :: posvel
integer :: i, j, N
real :: tmax
real, parameter :: tmin=0.0, pi=3.14159265, k=500.0*10E3, dt=10.0E-5, dx=10.0E-3, g=9.806, ro=1.5*10E3
real, dimension(:), allocatable :: xold, xnew, vold, vnew, m, F, r
end module parameters
PROGRAM Collision
use parameters
implicit none
write(*,*) 'Enter total number of particles (integer number):'
read(*,*) N
allocate(xold(N))
allocate(vold(N))
allocate(xnew(N))
allocate(vnew(N))
allocate(m(N))
allocate(F(N))
allocate(r(N))
xold(1) = 0.0
vold(1) = 0.0
m(1) = 6.283*10E-9
r(1) = 10E-4
xold(2) = 5.0
vold(2) = 0.0
m(2) = 6.283*10E-9
r(2) = 10E-4
write(*,*) 'Type total time elapsed for the simulation(real number):'
read(*,*) tmax
do i = 1, N
write(posvel,"(a,i3.3,a)") "posveldata",i,".txt"
open(unit=i,file=posvel, status="unknown")
end do
do i = 1, N
close(unit=i)
end do
END PROGRAM Collision
最后十行是关于我的问题的。
这在codeblocks中起作用 - 它只打开了我需要的文件数量,但我实际上正在使用gfortran并且它给了我和#34;记录结束"写声明中的错误。
如何让它正确执行并提供我需要的N个不同文件?
P.S。:这不是编译问题,而是在我执行程序之后。
答案 0 :(得分:3)
参数模块中的字符串只有1个字符长度,因此不能包含完整的文件名。所以请使用更长的字符串,例如
character(100) :: posvel
然后您可以将每个文件打开为
do i = 1, N
write(posvel,"(a,i0,a)") "posveldata",i,".txt"
open(unit=i,file=trim(posvel), status="unknown")
end do
这里,我使用格式i0自动确定整数的正确宽度,并使用trim()来删除文件名中不必要的空格(尽管它们可能没有必要)。写声明也可以更紧凑地编写为
write(posvel,"('posveldata',i0,'.txt')") i
将字符文字嵌入格式规范中。
错误消息"记录结束"来自上述问题。这可以通过以下代码确认
character c
write(c,"(a)") "1"
print *, "c = ", c
write(c,"(a)") "23" !! line 8 in test.f90
print *, "c = ", c
gfortran给出了
c = 1
At line 8 of file test.f90
Fortran runtime error: End of record
这意味着虽然c
用作内部文件,但此"文件"没有足够的空间容纳两个角色(这里" 23")。为了比较,ifort14给出了
c = 1
forrtl: severe (66): output statement overflows record, unit -5, file Internal Formatted Write
而Oracle Fortran12提供
c = 1
****** FORTRAN RUN-TIME SYSTEM ******
Error 1010: record too long
Location: the WRITE statement at line 8 of "test.f90"
Aborted
(有趣的是,Oracle Fortran报告记录为"太长",可能引用输入字符串。)