在 fortran 中传递数组的问题
Problems with passing an array in fortran
我正在对 Fortran 子例程进行函数调用:
CALL EGFpar(T_e,X_e,Y_e,cpi(1:nx,1:Nspec),WEG,IWEG)
这里 IWEG 在初始化例程中用整数值初始化。
IWEG 和 WEG 在包含文件中声明:
INTEGER LIWEGmax, LWEGMAX
PARAMETER (LIWEGmax=400, LWEGMAX=6000000)
INTEGER IWEG(LIWEGmax)
DOUBLE PRECISION WEG(LWEGmax)
COMMON/EGINI/ IWEG, WEG
在使用 VSCode 进行调试时,我可以看到我用它初始化的值。
然而,当我进入 EGFpar 时,所有传递的数组都有它们的初始化值,除了 IWEG。
IWEG什么都没有。不是零,而是空白。下面给出子程序EGFpar
C-----------------------------------------------------------------------
SUBROUTINE EGFPAR ( NP, T, X, Y, CP, WEG, IWEG )
C-----------------------------------------------------------------------
C
C This subroutine initializes the thermomolecular
C parameters that are needed in order to evaluate
C the transport linear systems.
C The parameters that have to be evaluated depend on the transport
C coefficients that will be subsequently computed, as indicated
C by JFLAG. This flag has been initialized when calling EGINI.
C
C Input
C -----
C NP number of nodes
C T(NP) temperature
C X(NP,NS) species mole fractions
C Y(NP,NS) species mass fractions
C CP(NP,NS) species heat capacities at constant pressure
C per unit mass
C WEG double precision work array for EGLIB
C IWEG integer work array for EGLIB
C
C-----------------------------------------------------------------------
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
IMPLICIT INTEGER (I-N)
DIMENSION WEG(*), IWEG(*)
C-----------------------------------------------------------------------
INCLUDE 'eg.cmn'
C-----------------------------------------------------------------------
CALL LFPAR ( NP, JFLAG, WEG(IEGPA),
& T, WEG(IDLT1), WEG(IDLT2), WEG(IDLT3),
& WEG(IDLT4), WEG(IDLT5), WEG(IDLT6),
& WEG(IEGRU), NS, WEG(IAAA), WEG(IBBB),
& WEG(IEGWT), WEG(IBIN), WEG(IETA),
& WEG(IETALG), WEG(ICTAIJ), WEG(IFITA),
& WEG(ICINT), CP, WEG(ICXI),
& WEG(IEPSIJ), WEG(IEGEPS), WEG(IEGCFD), WEG(IEGCFE),
& WEG(IEGZRT), WEG(IEGDIP), IWEG(IEGLIN) )
C-----------------------------------------------------------------------
CALL EGFXY ( NP, NS, WEG(IXTR), WEG(IYTR), WEG(IAUX), X, Y )
C-----------------------------------------------------------------------
RETURN
END
这里出了什么问题?
子程序调用
CALL EGFpar(T_e,X_e,Y_e,cpi(1:nx,1:Nspec),WEG,IWEG)
缺少第一个整数参数 NP
而应该是
CALL EGFpar(NP, T_e,X_e,Y_e,cpi(1:nx,1:Nspec),WEG,IWEG)
如果您有一个显式接口,这个错误可能已经被编译器捕捉到。
这可以通过多种方式完成:
- 手动定义接口块
- 在现代 Fortran 中,通过将过程放在模块中
- 将程序放在
contains
部分(例如子程序、子程序)
查看 this answer 以获取有关显式接口的更多深入信息。
我正在对 Fortran 子例程进行函数调用:
CALL EGFpar(T_e,X_e,Y_e,cpi(1:nx,1:Nspec),WEG,IWEG)
这里 IWEG 在初始化例程中用整数值初始化。 IWEG 和 WEG 在包含文件中声明:
INTEGER LIWEGmax, LWEGMAX
PARAMETER (LIWEGmax=400, LWEGMAX=6000000)
INTEGER IWEG(LIWEGmax)
DOUBLE PRECISION WEG(LWEGmax)
COMMON/EGINI/ IWEG, WEG
在使用 VSCode 进行调试时,我可以看到我用它初始化的值。 然而,当我进入 EGFpar 时,所有传递的数组都有它们的初始化值,除了 IWEG。 IWEG什么都没有。不是零,而是空白。下面给出子程序EGFpar
C-----------------------------------------------------------------------
SUBROUTINE EGFPAR ( NP, T, X, Y, CP, WEG, IWEG )
C-----------------------------------------------------------------------
C
C This subroutine initializes the thermomolecular
C parameters that are needed in order to evaluate
C the transport linear systems.
C The parameters that have to be evaluated depend on the transport
C coefficients that will be subsequently computed, as indicated
C by JFLAG. This flag has been initialized when calling EGINI.
C
C Input
C -----
C NP number of nodes
C T(NP) temperature
C X(NP,NS) species mole fractions
C Y(NP,NS) species mass fractions
C CP(NP,NS) species heat capacities at constant pressure
C per unit mass
C WEG double precision work array for EGLIB
C IWEG integer work array for EGLIB
C
C-----------------------------------------------------------------------
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
IMPLICIT INTEGER (I-N)
DIMENSION WEG(*), IWEG(*)
C-----------------------------------------------------------------------
INCLUDE 'eg.cmn'
C-----------------------------------------------------------------------
CALL LFPAR ( NP, JFLAG, WEG(IEGPA),
& T, WEG(IDLT1), WEG(IDLT2), WEG(IDLT3),
& WEG(IDLT4), WEG(IDLT5), WEG(IDLT6),
& WEG(IEGRU), NS, WEG(IAAA), WEG(IBBB),
& WEG(IEGWT), WEG(IBIN), WEG(IETA),
& WEG(IETALG), WEG(ICTAIJ), WEG(IFITA),
& WEG(ICINT), CP, WEG(ICXI),
& WEG(IEPSIJ), WEG(IEGEPS), WEG(IEGCFD), WEG(IEGCFE),
& WEG(IEGZRT), WEG(IEGDIP), IWEG(IEGLIN) )
C-----------------------------------------------------------------------
CALL EGFXY ( NP, NS, WEG(IXTR), WEG(IYTR), WEG(IAUX), X, Y )
C-----------------------------------------------------------------------
RETURN
END
这里出了什么问题?
子程序调用
CALL EGFpar(T_e,X_e,Y_e,cpi(1:nx,1:Nspec),WEG,IWEG)
缺少第一个整数参数 NP
而应该是
CALL EGFpar(NP, T_e,X_e,Y_e,cpi(1:nx,1:Nspec),WEG,IWEG)
如果您有一个显式接口,这个错误可能已经被编译器捕捉到。 这可以通过多种方式完成:
- 手动定义接口块
- 在现代 Fortran 中,通过将过程放在模块中
- 将程序放在
contains
部分(例如子程序、子程序)
查看 this answer 以获取有关显式接口的更多深入信息。