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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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 文件打开时记录结束错误_Fortran_Fortran90 - Fatal编程技术网

Fortran 文件打开时记录结束错误

Fortran 文件打开时记录结束错误,fortran,fortran90,Fortran,Fortran90,我目前正在编写一个模拟粒子碰撞的代码。我试图打开尽可能多的文件,就像有粒子(N)一样,然后在时间积分的每个步骤中,将位置和速度的数据放在每个文件中(使用Euler方法,但这并不相关)。为此,我尝试使用一个do循环,这样它将打开我需要的所有文件,然后我将所有数据放在不同的do循环中,然后关闭所有文件 我第一次尝试只做一个do循环来打开文件,但它给出了“文件已在另一个单元中打开”类型的错误,因此我执行了以下操作: module parameters implicit none character :

我目前正在编写一个模拟粒子碰撞的代码。我试图打开尽可能多的文件,就像有粒子(N)一样,然后在时间积分的每个步骤中,将位置和速度的数据放在每个文件中(使用Euler方法,但这并不相关)。为此,我尝试使用一个do循环,这样它将打开我需要的所有文件,然后我将所有数据放在不同的do循环中,然后关闭所有文件

我第一次尝试只做一个do循环来打开文件,但它给出了“文件已在另一个单元中打开”类型的错误,因此我执行了以下操作:

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
最后十行是关于我问题的

这在代码块中起作用——它只打开了我需要的文件数量,但我实际上使用的是gfortran,它在write语句中给出了“end of record”错误

我如何才能使它正确执行,并给我N个不同的文件,我需要


注意:这不是编译的问题,但在我执行程序之后。

参数模块中的字符串只有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格式来自动确定integer的正确宽度,并使用trim()删除文件名中不必要的空格(尽管它们可能不是必需的)。write语句也可以写得更紧凑,如下所示

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
格弗特兰为此付出了代价

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
而OracleFortran12

c = 1
******  FORTRAN RUN-TIME SYSTEM  ******
Error 1010:  record too long
Location:  the WRITE statement at line 8 of "test.f90"
Aborted

(有趣的是,Oracle Fortran报告记录“太长”,这可能是指输入字符串。)

参数模块中的字符串只有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格式来自动确定integer的正确宽度,并使用trim()删除文件名中不必要的空格(尽管它们可能不是必需的)。write语句也可以写得更紧凑,如下所示

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
格弗特兰为此付出了代价

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
而OracleFortran12

c = 1
******  FORTRAN RUN-TIME SYSTEM  ******
Error 1010:  record too long
Location:  the WRITE statement at line 8 of "test.f90"
Aborted

(有趣的是,Oracle Fortran报告记录“太长”,这可能是指输入字符串。)

参数模块中的字符串只有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格式来自动确定integer的正确宽度,并使用trim()删除文件名中不必要的空格(尽管它们可能不是必需的)。write语句也可以写得更紧凑,如下所示

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
格弗特兰为此付出了代价

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
而OracleFortran12

c = 1
******  FORTRAN RUN-TIME SYSTEM  ******
Error 1010:  record too long
Location:  the WRITE statement at line 8 of "test.f90"
Aborted

(有趣的是,Oracle Fortran报告记录“太长”,这可能是指输入字符串。)

参数模块中的字符串只有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格式来自动确定integer的正确宽度,并使用trim()删除文件名中不必要的空格(尽管它们可能不是必需的)。write语句也可以写得更紧凑,如下所示

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
格弗特兰为此付出了代价

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
而OracleFortran12

c = 1
******  FORTRAN RUN-TIME SYSTEM  ******
Error 1010:  record too long
Location:  the WRITE statement at line 8 of "test.f90"
Aborted

(有趣的是,Oracle Fortran报告记录“太长”,这可能是指输入字符串。)

注意,在gfortran中,单元1、5和6对应于stderr、stdin、stdout;你可能不想重击那些。一般来说,在你自己的代码中只使用10以上的单位数,你应该是安全的(或者在open语句中使用newunit=说明符)。还要注意的是,如果你有很多粒子,为每个粒子创建一个文件会变得笨拙和缓慢。最好将所有内容都放在一个文件中,例如,这样的东西编写和解析起来非常简单。编译器和操作系统都可以对打开的文件数量进行限制。你肯定不想拥有成千上万个。在真实的分子动力学模拟中,有数百万个粒子。为每个人打开一个文件是个坏主意。此外,文件系统也会不满意。打开一个包含太多文件的目录可能需要几分钟的时间。我刚开始这个项目。我是最新的