如何在fortran 95中使用子程序?

时间:2014-06-16 18:25:16

标签: fortran subroutine fortran95

我写了这段代码,但我不知道为什么它不起作用。我认为这主要是因为滥用子程序。我知道子程序的格式是什么,但不知道这有什么问题。任何人都可以为我调试此代码吗?感谢。

PROGRAM AKI
IMPLICIT NONE 
INTEGER:: i,j,k,l,m,n
REAL :: R2,R1,dteta,dr
REAL ,DIMENSION (0:100) :: teta,r
REAL,DIMENSION(0:100,0:100) :: x,y

CALL SETUP
CALL GRID
CALL SAVING

PAUSE
END PROGRAM



SUBROUTINE SETUP
REAL , DIMENSION (0:100) :: teta,r
R2 = 10
R1 = 5
dr = (R2 - R1) / 9

r(1) = 5
DO i = 1,9
    r(i+1) = r(i) + dr
END DO
RETURN
END


SUBROUTINE GRID

REAL , DIMENSION(0:100) :: teta,r

REAL , DIMENSION(0:100,0:100) :: x,y
dteta = (2 * 3.1415)/9
teta(1) = 0
DO j= 1 , 9
    teta(j+1) = teta (j) + dteta
END DO

DO i = 1 , 10
    DO j = 0 , 10
        x(i,j) = r(i)*cos(teta(j))
        y(i,j) = r(i)*sin(teta(j))
    END DO
END DO

RETURN
END

SUBROUTINE SAVING
REAL , DIMENSION(0:100,0:100) :: x,y
OPEN( 1, file= "solution.dat")
DO i = 1,10
    DO j = 1,10

    WRITE(1, *) x(i,j),y(i,j)
    END DO
END DO
CLOSE(1)

RETURN
END

1 个答案:

答案 0 :(得分:3)

您的问题是您没有将参数传递给子例程。您对SETUPGRIDSAVING的来电均使用自己的本地范围变量。您使用隐式类型进一步混淆了这种情况,允许您使用未明确声明的变量。试试这个:

subroutine SETUP(r)
   implicit none
   REAL , DIMENSION (0:100), intent(out) :: r
   real :: R2, R1, dr

   R2 = 10
   R1 = 5
   dr = (R2 - R1) / 9

   r(1) = 5
   DO i = 1,9
      r(i+1) = r(i) + dr
   END DO
   RETURN
END subroutine

并将其命名为

call SETUP(r)

您需要对其他子例程进行类似的调整。

如果您想要使用这些变量而不将它们传递给每个子例程,您可以使用主机范围并在contains语句之后和end program语句之前在主程序中包含子例程。在这种情况下,你根本不会在子程序中声明它们,你只需要使用它们。