2017-04-10 11 views
-2
!subroutine No.10: to calculate positive capilary pressure required 

    subroutine Pcow_positive1(sigma_ow,R,alpha,b,teta_ow,Pcow_positive,r1,time) 

    implicit none 

    !dummy argument declarations 

    double precision,intent(in)::sigma_ow 
    double precision,intent(in)::R 
    double precision,intent(in)::alpha 
    double precision,intent(in)::b 
    double precision,intent(in)::teta_ow 
    double precision,intent(out)::Pcow_positive 
    double precision,intent(out)::r1 
    double precision::omega_eff 
    double precision::A_eff 
    double precision::beta 
    double precision::Pcow 
    double precision::r2 
    double precision::error 
    double precision::error1 
    double precision::abeta 
    integer,intent(out)::time 

    !calculate Pcow_positive 

     time=0 
     r1=R 

    700 if (time>1500) then 

    goto 950 

    else 

    abeta=((b*(sin(alpha)))/(r1)) 
    if (abeta>1.0) then 

    goto 900 

    else 

    end if 
    beta=asin(abeta) 
    time=time+1 
    A_eff=(((R**2.0)/(2.0*tan(alpha))))-(((r1)*(b)*(sin(alpha+beta)))/2.0) & 
    +(((((r1)**2)*(beta))/2.0)) 
    omega_eff=(((((R)*(1.0/(tan(alpha))))-b)*(cos(teta_ow)))+((r1*beta))) 
    Pcow=(((sigma_ow)*(omega_eff))/(A_eff)) 
    r2=(sigma_ow)/(Pcow) 

    error=abs(r2-r1) 
    error1=abs((sigma_ow/r2)-(sigma_ow/r1)) 
    if (error<=0.01 .or. error1<=0.01) then 

      goto 800 

      else 
      r1=r2 
      goto 700 

      end if 

    800 r1=r2 
      Pcow_positive=Pcow 
      goto 1000 

    900 r1=(b*(sin(alpha))) 
      Pcow_positive=(sigma_ow)/(r1) 
      goto 1000 

    950 r1=(sigma_ow)/(0.0005) 
      Pcow_positive = 0.0005 

    1000 end subroutine Pcow_positive1 

コードをコンパイルすると、修正できないエラーメッセージend subroutine Pcow_positive1が表示されます。 何か助けていただければ幸いです。Fortranコンパイルエラー764ネストエラー

Compile error: error 764 - Nesting error - the block IF construct on line 4079 has not been terminated

行4079:

700 if (time>1500) then 
+3

インデントあなたのコードのようなあなたの日常に何かを書くと、上記の警告をすべて一緒にこれを入れて(とも私はこれだけで5分を費やしてきたことを、実際に私はさらに片付けるだろうが、朝食が呼んでいます) 。すべての 'if'文は対応する' endif'を持っていますか? – Ross

+0

コードの構造をよりよく理解するには、字下げを使用する必要があります。おそらくあなたは「終わり」かそれに類するものをミスヒットしているでしょう。 –

+0

ありがとうございました...!!Pcow_positive time = 0を計算するr1 = R 700 if(時間> 1500)、goto 950 else end if' –

答えて

0

このコードのいくつかの問題があります。最も直ちには、もしあなたが終わっていないということです。これは表示されていません。なぜなら、前述したように、一貫してコードをインデントしていないからです。あなたのエディタはあなたのためにこれを自動的に行うべきであり、これを見つけるのは非常に簡単です。私はあなたのコードをemacsにカットアンドペーストし、サブプログラムを自動的に字下げして、問題は明らかです。しかしendifがどこに行かなければならないのか、そしてそれに続くものでは、どこに置くべきかを推測しなければならず、完全なプログラムを提供していないので、私が行ったことをテストすることは困難です。間違い私がしたことの背後にあるアイデアがはっきりしていることを願っています。

とにかく次の問題はGOTOを使用しないことです!ごくまれに必要なことはまれであり、通常、スパゲッティコードと呼ばれる混乱を招くことがあります。代わりにあなたのコントロール構造を学び、それらを使用してください。 doループといくつかのEXITがうまく整理されます。

次のすべての定数は単精度です。しかし、すべての変数は倍精度です。その結果、あなたのルーチンは、あなたが望むほど正確ではありません。倍精度コードで1.0以外の修飾子がない場合は、ほとんど常に間違っています。

これを修正する方法。 Well Double Precisionは1980年代のことで、代わりにstackoverflowで何度も詳しく扱われる種類について学び、Fortranの本(あなたは1つ持っていますか?)を見て使います。とにかく私は

!subroutine No.10: to calculate positive capilary pressure required 

Subroutine Pcow_positive1(sigma_ow,R,alpha,b,teta_ow,Pcow_positive,r1,time) 

    Implicit None 

    !dummy argument declarations 

    Integer, Parameter :: wp = Selected_real_kind(12, 70) 

    Real(wp),Intent(in)::sigma_ow 
    Real(wp),Intent(in)::R 
    Real(wp),Intent(in)::alpha 
    Real(wp),Intent(in)::b 
    Real(wp),Intent(in)::teta_ow 
    Real(wp),Intent(out)::Pcow_positive 
    Real(wp),Intent(out)::r1 
    Real(wp)::omega_eff 
    Real(wp)::A_eff 
    Real(wp)::beta 
    Real(wp)::Pcow 
    Real(wp)::r2 
    Real(wp)::error 
    Real(wp)::error1 
    Real(wp)::abeta 
    Integer,Intent(out)::time 

    !calculate Pcow_positive 

    time=0 
    r1=R 


    Do 

    If (time>1500) Then 


     r1=(sigma_ow)/(0.0005_wp) 
     Pcow_positive = 0.0005_wp 

     Exit 

    End If 

    abeta=((b*(Sin(alpha)))/(r1)) 
    If (abeta>1.0_wp) Then 

     r1=(b*(Sin(alpha))) 
     Pcow_positive=(sigma_ow)/(r1) 
     Exit 

    Else 

    End If 
    beta=Asin(abeta) 
    time=time+1 
    A_eff=(((R**2.0_wp)/(2.0_wp*Tan(alpha))))-(((r1)*(b)*(Sin(alpha+beta)))/2.0_wp) & 
      +(((((r1)**2)*(beta))/2.0_wp)) 
    omega_eff=(((((R)*(1.0_wp/(Tan(alpha))))-b)*(Cos(teta_ow)))+((r1*beta))) 
    Pcow=(((sigma_ow)*(omega_eff))/(A_eff)) 
    r2=(sigma_ow)/(Pcow) 

    error=Abs(r2-r1) 
    error1=Abs((sigma_ow/r2)-(sigma_ow/r1)) 
    r1=r2 
    If (error<=0.01_wp .Or. error1<=0.01_wp) Then 

     Pcow_positive=Pcow 
     Exit 

    End If 

    End Do 

End Subroutine Pcow_positive1