在子例程中调用数组的值

时间:2016-11-21 07:01:54

标签: random numbers fortran fortran77

我正在使用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

1 个答案:

答案 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,但我相信在概念上它在这一点上更容易回避它们。