文件打开时 Fortran 不写入屏幕
Fortran not writing to screen while file is open
Context: 我打算对某个 Fortran 子程序进行一些测试,看看它有什么问题。这是一个数值模拟,结果与理论不符。我用写语句做一些简单的调试。
问题: 在我的主例程中打开一个文件时,我似乎无法向屏幕写入任何内容(所以我无法检查哪些东西被错误地传递给了某个子程序链等)。当我在打开文件之前执行它时,它写得很好,但在文件内部(打开后和关闭后)却没有。
这是我指的代码:
WRITE(*,*) 'BLA !<---------------------------------------
WRITE(*,*) 'BLA BLA' !<---------------------------------------
do p=1,N !open files
write(posvel, "(a,i0,a)") "1Dposveldatacomelasticaxy1", p, ".dat"
OPEN(unit=p, file=trim(posvel), status="unknown")
end do
WRITE(*,*) 'bla' !<---------------------------------------
t = tmin
cont = 0
do while ((t + dt) < (tmax))
t = t+dt
cont = cont+1
do i = 1, N
forcax(i) = 0.0d0
forcay(i) = flagy(i)*gravidade(m(i))
do j = 1, N
call coefficients(m(i), m(j), gama_n, k_n)
Fx_elastica(j,i) = 0.0d0
Fy_elastica(j,i) = 0.0d0
Fx_viscosa(j,i) = 0.0d0
Fy_viscosa(j,i) = 0.0d0
WRITE(*,*) 'inside j loop' !<---------------------------------------
if (i .NE. j) then
if ( (abs(sqrt(((xold(i)-xold(j))**2)+(yold(i)-yold(j))**2))).LE. (a(i)+a(j)) ) then
WRITE(*,*) 'inside collision' !<---------------------------------------
call forca_elastica(k_n, a(i), a(j), xold(i), xold(j), yold(i), yold(j), Fx_elastica(j,i),&
Fy_elastica(j,i))
if (Fx_elastica(j,i) .GT. 0.0d0) then
Fx_elastica(i,j) = -Fx_elastica(j,i)
WRITE(*,*) 'elastic x is being passed' !<---------------------------------------
end if
if (Fy_elastica(j,i) .GT. 0.0d0) then
Fy_elastica(i,j) = -Fy_elastica(j,i)
WRITE(*,*) 'elastic y is being passed' !<---------------------------------------
end if
forcax(i) = forcax(i) + flagex(i)*Fx_elastica(j,i)
forcay(i) = forcay(i) + flagey(i)*Fy_elastica(j,i)
end do
call integracao_Euler_xy (xold(i),xnew(i),vxold(i),vxnew(i),forcax(i),yold(i),ynew(i),vyold(i),vynew(i),forcay(i),m(i))
if (mod (cont,5000).eq. 0) then
WRITE(p, *) int(cont/5000), t, xold(i), yold(i), forcax(i), forcay(i) !<---------------------------------------
end if
end do
end do
do p = 1,N !close files
close(unit=p)
end do
只需查看 WRITE
语句即可。前两个出现在屏幕上好吗。在 OPEN
ing 文件之后,虽然......它没有。 WRITE
依赖于条件的语句是我想看到的,但是 Fortran 甚至 都没有写那些不依赖于那些条件的语句。另外,看看最后的 WRITE
语句 - 它写入 文件 没有问题。
关于如何 fix/contour 这个问题有什么想法吗?
我正在使用 Fortran 90。
单元编号不应使用小数字。您从 1 开始循环,步长为 1。您几乎可以保证达到标准输出和标准输入的 pre-connected 单位。另见 Standard input and output units in Fortran 90?
从某个更大的数字开始循环,比如从 100 开始,或者使用 newunit=
并将单元编号存储在某个数组中。
另请注意 p
在 WRITE(p, *) ...
处的值为 N+1
。
Context: 我打算对某个 Fortran 子程序进行一些测试,看看它有什么问题。这是一个数值模拟,结果与理论不符。我用写语句做一些简单的调试。
问题: 在我的主例程中打开一个文件时,我似乎无法向屏幕写入任何内容(所以我无法检查哪些东西被错误地传递给了某个子程序链等)。当我在打开文件之前执行它时,它写得很好,但在文件内部(打开后和关闭后)却没有。
这是我指的代码:
WRITE(*,*) 'BLA !<---------------------------------------
WRITE(*,*) 'BLA BLA' !<---------------------------------------
do p=1,N !open files
write(posvel, "(a,i0,a)") "1Dposveldatacomelasticaxy1", p, ".dat"
OPEN(unit=p, file=trim(posvel), status="unknown")
end do
WRITE(*,*) 'bla' !<---------------------------------------
t = tmin
cont = 0
do while ((t + dt) < (tmax))
t = t+dt
cont = cont+1
do i = 1, N
forcax(i) = 0.0d0
forcay(i) = flagy(i)*gravidade(m(i))
do j = 1, N
call coefficients(m(i), m(j), gama_n, k_n)
Fx_elastica(j,i) = 0.0d0
Fy_elastica(j,i) = 0.0d0
Fx_viscosa(j,i) = 0.0d0
Fy_viscosa(j,i) = 0.0d0
WRITE(*,*) 'inside j loop' !<---------------------------------------
if (i .NE. j) then
if ( (abs(sqrt(((xold(i)-xold(j))**2)+(yold(i)-yold(j))**2))).LE. (a(i)+a(j)) ) then
WRITE(*,*) 'inside collision' !<---------------------------------------
call forca_elastica(k_n, a(i), a(j), xold(i), xold(j), yold(i), yold(j), Fx_elastica(j,i),&
Fy_elastica(j,i))
if (Fx_elastica(j,i) .GT. 0.0d0) then
Fx_elastica(i,j) = -Fx_elastica(j,i)
WRITE(*,*) 'elastic x is being passed' !<---------------------------------------
end if
if (Fy_elastica(j,i) .GT. 0.0d0) then
Fy_elastica(i,j) = -Fy_elastica(j,i)
WRITE(*,*) 'elastic y is being passed' !<---------------------------------------
end if
forcax(i) = forcax(i) + flagex(i)*Fx_elastica(j,i)
forcay(i) = forcay(i) + flagey(i)*Fy_elastica(j,i)
end do
call integracao_Euler_xy (xold(i),xnew(i),vxold(i),vxnew(i),forcax(i),yold(i),ynew(i),vyold(i),vynew(i),forcay(i),m(i))
if (mod (cont,5000).eq. 0) then
WRITE(p, *) int(cont/5000), t, xold(i), yold(i), forcax(i), forcay(i) !<---------------------------------------
end if
end do
end do
do p = 1,N !close files
close(unit=p)
end do
只需查看 WRITE
语句即可。前两个出现在屏幕上好吗。在 OPEN
ing 文件之后,虽然......它没有。 WRITE
依赖于条件的语句是我想看到的,但是 Fortran 甚至 都没有写那些不依赖于那些条件的语句。另外,看看最后的 WRITE
语句 - 它写入 文件 没有问题。
关于如何 fix/contour 这个问题有什么想法吗?
我正在使用 Fortran 90。
单元编号不应使用小数字。您从 1 开始循环,步长为 1。您几乎可以保证达到标准输出和标准输入的 pre-connected 单位。另见 Standard input and output units in Fortran 90?
从某个更大的数字开始循环,比如从 100 开始,或者使用 newunit=
并将单元编号存储在某个数组中。
另请注意 p
在 WRITE(p, *) ...
处的值为 N+1
。