Fortran中的错误:当需要过程时,尝试将参数为4的例程调用为实数(kind = 1)

时间:2014-03-30 12:48:58

标签: fortran fortran90 fortran77 fortran95

我从来没有在我的生活中编程,这是我的第一个单一分配代码,我在编译阶段没有错误但是myh程序没有运行说我在标题中有错误,猜测问题是我打电话给子程序的时候。谁能帮我?这是我的第一个代码,真的令人沮丧。谢谢。

!NUMERICAL COMPUTATION OF INCOMPRESSIBLE COUETTE FLOW USING FINITE DIFFERENCE METHOD

!IMPLICIT APPROACH

!MODEL EQUATION
!PARTIAL(U)/PARTIAL(T)=1/RE*(PARTIAL(U) SQUARE/PARTIAL(Y) SQUARE)

!DEFINE VARIABLES

    IMPLICIT NONE

!VELOCITY U AT TIME T, VELOCITY UNEW AT TIME T+1, TIME T
!MAXIMUM 1000 POINTS

    REAL V(1000)
    REAL VNEW(1000)
    REAL T

!GRID SPACING DY, GRID POINTS N+1
    REAL DY
    INTEGER N

!TIME STEP

    REAL DT

!FLOW REYNOLDS NUMBER IN THE MODEL EQUATION

    REAL ALPHA

!TOTAL SIMULATION TIME - LOOP NUMBER

    INTEGER REP, I, J

!COEFFICIENTS IN LINEAR EQUATION MATRIX, SOURCE TERM K, DIAGONAL B, NON-DIAGONAL A

    REAL S(1000), B, A

!INITIALIZATION OF DATA

    DATA ALPHA/5000.0/
    DATA N/100/
    DATA REP/3000/

!CALCULATION OF GRID SPACING

    DY=1.0/N

!CALCULATION OF TIME STEP DELTA T, CAN BE LARGER THAN THAT IN AN EXPLICIT METHOD 

        DT=0.5*RE*DY*DY
    DT=ALPHA*DY*DY

!INITIAL CONDITIONS OF VELOCITY PROFILE
!BOTTOM AND INNER POINTS

    DO I=1,N
    V(I)=0.0
    ENDDO

!POINT AT MOVING PLATE

    V(N+1)=1.0

!BOUNDARY CONDITIONS AT LOWER AND UPPER POINTS ON PLATE 

    V(1)=0.0
    V(N+1)=1.0

!CALCULATION OF DIAGONAL B AND NON-DIAGONAL A IN LINEAR EQUATION MATRIX

    B=1.0+DT/DY/DY/ALPHA
    A=-(DT)/2.0/DY/DY/ALPHA

!INITIAL COMPUTATION TIME 

    T=0.0

!ENTER MAIN LOOP TO MARCH IN TIME DIRECTION

    DO I=1,REP
!SIMULATION TIME INCREASE BY DELTA T EACH STEP

    T=T+DT

!USE IMPLICIT METHOD TO UPDATE GRID POINT VALUES FOR ALL INTERNAL GRIDS ONLY
!TWO BOUNDARY GRID POINTS VALUES ARE CONSTANT WITHIN THE WHOLE SIMULATION       

!CALCULATION OF SOURCE TERM IN LINEAR EQUATION

    DO J=2,N
    S(J)=(1.0-DT/DY/DY/ALPHA)*V(J)+DT/2.0/DY/DY/ALPHA*V(J+1)+V(J-1)
    ENDDO

!INCLUDE BOUNDARY CONDITIONS FOR TWO POINTS NEAR BOUDNARY

    S(2)=S(2)-A*V(1)
    S(N)=S(N)-A*V(N+1)

!USE SOURCE TERM K, DIAGONAL B, NON-DIAGONAL A, ORDER OF MATRIX N, TO SOLVE LINEAR EQUATION TO GET UPDATED VELOCITY
!CHECK ON INTERNET HOW TO SOLVE THIS BECUASE THIS COMPILER
!DOES NOT SOLVE IT, SOLVE LINEAR EQUATIONS BY A LINEAR SOLVER, FIND AND DOWNLOAD THE MATH LIBRARY FOR THIS COMPILER

    CALL SR1(A,B,N,S,VNEW)

!REPLACE OLD VELOCITY VALUES WITH NEW VALUES. 
!SINCE UNEW IS FROM UNEW(1), UNEW(2)......., UNEW(N-1), WE SHOULD RE-ARRANGE NUMBERS AS FOLLOWS

    DO J=1,N-1
    V(J+1)=VNEW(J)
    ENDDO

!RETURN TO MAIN LOOP HERE

    ENDDO

    PRINT*,'HERE'


!OUTPUT VELOCITY PROFILES AT THE END OF COMPUTATION
!CREATE OUPUT FILE NAME

    OPEN(15,FILE='PLEASEWORK')
!WRITE GRID POINTS AND VELOCITY VALUES

    DO I=1,N+1
    WRITE(15,10) V(I),(I-1)*DY
10  FORMAT(2F12.3)
    ENDDO
    CLOSE(15)

!DISPLAY INFORMATION ON SCREEN 
!WRITE(*,*) 'THE OUTPUT VELOCITY IS AFTER', ITER, '     TIME STEPS'

!TERMINATION OF COMPUTER PROGRAM

    STOP

    END     

!!!!!!!!
!!!!!!!!!!!!
!!!!!!!!!

    SUBROUTINE SR1(A,B,N,S,VNEW)
    REAL DIAGM(N), DIAGU(N), DIAGL(N)
    REAL SS(N)
    DO J=1,N-1
    SS(J)=S(J+1)
    ENDDO

    DO I=1,N
    DIAGM(i)=B        

!Sets main diagonal as B for every value of i

    IF (I==0) then
    DIAGU(I)=A
    DIAGL(I)=0  

! No lower diagonal coefficient when i = 0

    ELSE IF (I==N) THEN
    DIAGU(I)=0  

! No upper diagonal coefficient when i = Num

    DIAGL(I)=A
    ELSE 
    DIAGU(I)=A 

! For all other points there is an upper diagonal coefficient

    DIAGL(I)=A 

! For all other points there is a lower diagonal coefficient

    ENDIF

    ENDDO

!CALL STANDARD FORTRAN MATH LIBRARY TO SOLVE LINEAR EQUATION AND GET SOLUTION VECTOR X(N-1)

    CALL SR2 (DIAGL,DIAGM,DIAGU,SS,VNEW,N-2)

!RETURN TO MAIN PROGRAM AND X(N-1) IS FEEDED INTO UNEW(N-1)

    RETURN
    END SUBROUTINE

!!!!!!!!!!!!!!!
!!!!!!!!!!!
!!!!!!!!!!!

    SUBROUTINE SR2 (A,B,C,D,Z,N)

!a - sub-diagonal (means it is the diagonal below the main diagonal)
!b - the main diagonal
!c - sup-diagonal (means it is the diagonal above the main diagonal)
!K - right part
!UNEW - the answer
!E - number of equations

    INTEGER N
    REAL A(N), B(N), C(N), D(N)
    REAL CP(N), DP(N), Z(N)
    REAL M
    INTEGER I
    DATA M/1/

!initialize c-prime and d-prime

    CP(1) = C(1)/B(1)
    DP(1) = D(1)/B(1)
!solve for vectors c-prime and d-prime

    DO I=2,N
    M=b(i)-CP(I-1)*(A(I))
    CP(I)=C(I)/M
    DP(I)=(D(I)-DP(I-1)*A(I))/M
    ENDDO

!initialize UNEW

    Z(N)=DP(N)

!solve for x from the vectors c-prime and d-prime

    DO I=N-1, 1, -1
    Z(I)=DP(I)-CP(I)*Z(I+1)
    ENDDO

    END SUBROUTINE

1 个答案:

答案 0 :(得分:1)

正如乔治在评论中所说,问题在于子程序SR1。因此,这不仅仅是一个CW窃取评论的答案,我还会稍微扩展一下。

事物的结构方式SR1与主程序的范围不同。主程序中的IMPLICIT NONE不适用于子例程,因此ABNSVNEW都是隐式输入的。除了N,它是一个整数,它们是(标量)实数。

正如乔治所说,对S(J+1)的引用意味着S不仅是标量真实,而且是一种功能。请记住,SR1是一个不同的范围,并且没有信息从调用者传递给被调用者关于类型,形状等。此外,SR1中称为A的伪参数恰好发生在与呼叫中的实际参数同名并不代表被呼叫者"知道"的东西。由于同样的原因,您使用SR2拨打VNEW也是一个问题。

这个问题标记为" fortran77"所以你不能做太多确保进行大量的检查,但可能有编译器选项,因为你可以使用IMPLICIT NONE(不是Fortran 77)来检测你的问题

但是,这个问题也被贴上标签" fortran"和" fortran95"所以我要指出,使用更现代的功能有更好的方法来检测问题。查看接口,模块和内部过程。