2017-07-02 10 views
0

私は、超音速ノズルの最小ノズル長を計算するプログラム(Method of Characteristics)を開発中です。私は私のコードは私の出力ファイル(行「書き込み(6,1000)....)に書き込めない理由を把握することができないよう私のコードは以下の通りです:。Fortranコードがファイルに書き込まない

 program tester 
c----------------------------------------------------------------------c 
     implicit real (a-h,o-z) 
     integer count 
     real kminus(0:100),kplus(0:100),theta(0:100),nu(0:100),mach(0:100) 
    +  ,mu(0:100) 
     open (5,file='tester.in') 
     open (6,file='tester.out') 
     read (5,*) me 
     read (5,*) maxturn 
     read (5,*) nchar 
     read (5,*) theta0 
     close(5) 
c.....set count to 0 and calculate dtheta 
     count=0 
     dtheta=(maxturn-theta0)/nchar 
c.....first characteristic 
     do 10 an=1,nchar+1 
     count=count+1 
c........these are already known 
     theta(count)=theta0+dtheta*(an-1) 
     nu(count)=theta(count) 
c........trivial, but we will "calculate" them anyways 
     kminus(count)=2*theta(count) 
     kplus(count)=0 
c........we feed it nu(count) and get m out 
     call pm_hall_approx(nu(count),m) 
     mach(count)=m 
c........does not work with sqrt(...) for some reason 
     mu(count)=atan((1/(mach(count)**2)-1)**0.5) 
     write (6,1000) count,kminus(count),kplus(count),theta(count) 
    +     ,nu(count),mach(count),mu(count) 
    10 continue 
c.....the other characteristics 
     do 30 bn=1,nchar 
     do 20 cn=1,(nchar+1-bn) 
      count=count+1 
c...........these are given 
      kminus(count)=kminus(cn+bn) 
      kplus(count)=-1*kplus(bn+1) 
c...........if this is the last point, copy the previous values 
      if (cn.eq.(nchar+1-bn)) then 
       kminus(count)=kminus(count-1) 
       kplus(count)=kplus(count-1) 
      endif 
c...........calculate theta and nu 
      theta(count)=0.5*(kminus(count)+kplus(count)) 
      nu(count)=0.5*(kminus(count)-kplus(count)) 
c...........calculate m 
      call pm_hall_approx(nu(count),m) 
      mach(count)=m 
      mu(count)=atan((1/(mach(count)**2)-1)**0.5) 
      write (6,1000) count,kminus(count),kplus(count),theta(count) 
    +      ,nu(count),mach(count),mu(count) 
    20 continue 
    30 continue 
     close(6) 
     stop 
1000 format (11(1pe12.4)) 
     end 
c======================================================================c 

     include 'pm_hall_approx.f' 

そして、私のサブルーチンここに与えられます。

 subroutine pm_hall_approx(nu,mach) 
c----------------------------------------------------------------------c 
c  Given a Mach number, use the Hall Approximation to calculate the 
c  Prandtl-Meyer Function. 
c----------------------------------------------------------------------c 
     implicit real (a-h,o-z) 
c.....set constants 
     parameter (a=1.3604,b=0.0962,c=-0.5127,d=-0.6722,e=-0.3278) 
     parameter (numax=2.2769) 
     y=nu/numax 
     mach=(1+a*y+b*y*y+c*y*y*y)/(1+d*y+e*y*y) 
     return 
     end 

そしてここでは、Fortranでtester.in

2.4  = mache 
5.0  = maxturn 
7  = nchar 
0.375 = theta0 
+0

'tester.in'の内容は何ですか? –

+0

@ m-chinouneを追加しました。 Ch。ありがとう! – rxc370

+0

@ M.Chinouneありがとう! – rxc370

答えて

0

の内容は、ユニット番号6は、画面用に予約されているユニット番号としてあることを絶対に使用しないでくださいにそれを変更してみてください。他の番号、write(7,1000)などそれは動作するはずです。

+0

Fortranはユニット6を "予約"していません。 – francescalus

+0

@francescalus:正しい単語を使用するのが悪いようです。 [this](http://www.oc.nps.edu/~bird/oc3030_online/fortran/io/io.html)を参照してください。 – Peaceful

+0

@francescalus、多くのコンパイラは出力のためにユニット= 6を予約します。単に試してみてください。iso_fortran_env; print *、output_unit' –

関連する問題