Fortran编译错误764嵌套错误

时间:2017-04-10 21:33:06

标签: fortran gfortran fortran95

    !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收到一条错误消息,我无法修复。 非常感谢任何帮助。

  

编译错误:错误764 - 嵌套错误 - 第4079行的块IF构造尚未终止

第4079行:

700 if (time>1500) then

1 个答案:

答案 0 :(得分:0)

此代码存在一些问题。最直接的是你错过了一个结局。您没有看到这一点,因为如上所述,您没有始终缩进代码。您的编辑器应该自动为您执行此操作,并且会发现这很容易发现 - 我将您的代码剪切并粘贴到emacs中,自动缩进子程序并且问题很明显。然而,endif应该去的地方不是,所以接下来我不得不猜测放在哪里,而且由于你没有提供完整的程序,所以很难测试我做了什么,但即使我做了一个错误我希望我所做的事情背后的想法是明确的。

无论如何,下一期是不要使用GOTO!很少有任何需要,它通常会导致混淆,即所谓的意大利面条代码。而是学习你的控制结构并使用它们。 do循环和一些EXIT将很好地整理它。

接下来所有常量都是单精度。然而你所有的变量都是双精度的。因此,您的日常工作将不如您想要的那么精确。在双精度代码中,如果你看到没有其他限定符的1.0,那么几乎总会出现问题。

那么如何解决这个问题。 Double Precision是20世纪80年代的,所以反而要学习各种类型,在stackoverflow上多次详细介绍,或者查看你的Fortran书(你有一个?)并使用它们。无论如何把这一切都与上面的警告一起(而且我只花了5分钟,在实践中我会进一步整理,但早餐是打电话)我会写你的例程

    !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