我正在使用Force 2.0编译器和编辑器。我想在以下子例程中调用现有数组KM(1:M)
的值,以便在主程序EIKM(1:M)
中进行计算,但获得的值与数组的值不一致。你能告诉我什么是错的,我该怎么办?
PROGRAM GENERATES_EIKM
IMPLICIT NONE
INTEGER I, M, N
PARAMETER (M=65, N=3)
REAL EIKM(1:M)
REAL ALFA, EPSILON, NU, PI
REAL U2RMS, KE, KEFISIENSI, KALI, KALE
REAL KM(1:M), LS
REAL KMLOW, KMHIGH, DELTAKM
KMLOW=100
KMHIGH = 10000
DELTAKM = (KMHIGH-KMLOW)/(M-1)
PI = 3.14
ALFA = 1.453
EPSILON = 10
NU = 7
LS = 23
KE = ALFA*9*PI/(55*LS)
KEFISIENSI = (EPSILON**(1/4))/(NU**(-3/4))
CALL CALLING_THE_VALUE_OF_KM (M)
WRITE (*,*) 'CHECKING THE VALUE OF KM AT DATA NUMBER 2 : ', KM(2)
DO I=1,M
U2RMS = (2/3*KM(I))**2
KALI = KM(I)/KE
KALE = KM(I)/KEFISIENSI
EIKM(I) = ALFA*(U2RMS/KE)*((KALI**4)/((1+KALI**2)**(17/6)))*
& EXP(-2*(KALE**2))
WRITE (*,*) 'THE VALUE OF EIKM AT (I) ', I, EIKM(I)
END DO
PAUSE
END
SUBROUTINE CALLING_THE_VALUE_OF_KM (M)
REAL KM(1:M)
INTEGER I
REAL KMLOW, KMHIGH, DELTAKM
KMLOW=100
KMHIGH = 10000
DELTAKM = (KMHIGH-KMLOW)/(M-1)
WRITE(*,*) 'START OF CALLING_THE_VALUE_OF_KM'
DO I=1,M
KM(I) = KMLOW + DELTAKM*(I-1)
WRITE(*,*) I, KM(I)
END DO
WRITE(*,*) 'END OF CALLING_THE_VALUE_OF_KM'
WRITE(*,*) '--------------------'
RETURN
END
答案 0 :(得分:1)
我会在你的子程序中放入IMPLICIT NONE。如果M被定义为整数,那么这将有所帮助。您也可以在M上放置INTENT(IN)并查看编译器是否也执行fortran90。如果子程序应该输出一些东西,那么你需要在()内部。你想要......:
F90:
Subroutine Callingthevalue_of_KM(M, KM)
IMPLICIT NONE
INTEGER , INTENT(IN ) :: M
REAL, DIMENSION (M), INTENT(INOUT) :: kM
如果编译那么它必须是强制2.0.9+ 然后你可能不需要M
Subroutine Callingthevalue_of_KM(KM)
IMPLICIT NONE
REAL, DIMENSION (:), INTENT(INOUT) :: kM
INTEGER :: M
M = Size(kM)
... Or do the loops a DO I = 1, SIZE(kM)
F77:
Subroutine Callingthevalue_of_KM(M, KM)
IMPLICIT NONE
INTEGER M
REAL kM(M)
在所有这些情况下,km将通过km的引用“返回”km,并且主要知道km的更新值。
让kM在内部和外部被人知道的另一种方式是COMMON,但我相信在概念上它在这一点上更容易回避它们。