2017-02-20 3 views
0

コンテキスト:私はある種のテストに特定のFortranサブルーチンを入れて何が間違っているかを知る予定です。これは数値シミュレーションであり、結果は理論と一致しません。 write文を使って簡単なデバッグを行います。ファイルが開いているときに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 

:ここ

は、私が参照しているコードです。最初の2つは画面に表示されます。 OPENの後にファイルを作成していますが...それはしません。条件に依存する WRITEの文は私が見たいものですが、Fortranは であり、それらの条件に依存しないものも書いていません。また、最後の WRITEステートメントを見てください。 ファイルに問題なく書き込みます。

この問題を解決する方法については、どのようなアイデアですか?

私はFortran 90を使用しています。

+0

からの代わりに使用するという事実を言うことがある場合、あなたはおそらく、またはコンパイラにはない、少なくとも、とにかく使用していないのFortran 90(古くなった古いバージョンではありません)、あなたが使っているコンパイラを知ることがより有益です。 –

答えて

3

ユニット番号には小さい数字を使用しないでください。あなたは1から1のステップでループしています。標準出力と標準入力のために、事前に接続されたユニットにほとんど確実に衝突します。 、いくつかのより多くからもStandard input and output units in Fortran 90?

ループを参照してください100

+0

うわー、私はこれを完全に忘れてしまった。私は、読み書き文のデフォルトのユニット番号が5と6であることを知っていますが、これが何らかの問題を引き起こすかどうかはわかりませんでした。 – DrHAL

+0

Fortran 2008準拠のコンパイラを使用している場合は、 'open(newunit = u(p)、...)'という構文を使用することもできます。ここで 'u'は整数配列です。このようにして、ファイルを開くときに自動的に「安全な」新しいユニット番号を要求することができます。 – jabirali

関連する問題