文件打开时Fortran不写入屏幕

时间:2017-02-20 15:30:32

标签: fortran stdout fortran90

上下文: 我打算将某个Fortran子例程放到某些测试中,看看它有什么问题。这是一个数值模拟,结果与理论不匹配。我使用write语句进行一些简单的调试。

问题: 当我的主程序中打开一个文件时,我似乎无法在屏幕上写任何东西(所以我无法检查哪些东西被错误地传递给某个子程序链等等。它在我打开文件之前写的都很好,但不在里面(打开后和关闭之后)。

以下是我所指的代码:

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文件之后,虽然......但事实并非如此。依赖于条件的WRITE语句是我想要查看的语句,但Fortran 甚至不编写那些不依赖于这些条件的语句。另外,请查看最后一个WRITE语句 - 它写入文件没有问题。

有关如何修复/修整此问题的任何想法?

我正在使用Fortran 90。

1 个答案:

答案 0 :(得分:3)

您不应该使用较小的数字作为单位数字。您从1开始循环,步长为1.您几乎可以保证按标准输出和标准输入的预连接单元。另请参阅Standard input and output units in Fortran 90?

从一些较大的数字循环,比如100,或使用newunit=并将单位数存储在某个数组中。

另请注意,pN+1处的值为WRITE(p, *) ...