Fortran 分配的嵌套类型内的数组持久性
我正在尝试使用以下声明构建嵌套类型结构:Fortran 分配的嵌套类型内的数组持久性,fortran,Fortran,我正在尝试使用以下声明构建嵌套类型结构: TYPE T_ORCH_DISCR REAL(r_std), ALLOCATABLE, DIMENSION (:,:) :: simp ! REAL(r_std), ALLOCATABLE, DIMENSION (:,:,:) :: disc ! CONTAINS PROCEDURE :: initialize END TYPE T_ORCH_DISCR t\u orch\u discr初始化: SUBROUTINE init
TYPE T_ORCH_DISCR
REAL(r_std), ALLOCATABLE, DIMENSION (:,:) :: simp !
REAL(r_std), ALLOCATABLE, DIMENSION (:,:,:) :: disc !
CONTAINS
PROCEDURE :: initialize
END TYPE T_ORCH_DISCR
t\u orch\u discr
初始化:
SUBROUTINE initialize(this, kjpindex, argsec, discrdim)
CLASS(T_ORCH_DISCR), INTENT(inout) :: this
INTEGER(i_std), INTENT(in) :: kjpindex
INTEGER(i_std), INTENT(in) :: argsec
INTEGER(i_std), INTENT(in), OPTIONAL :: discrdim
INTEGER(i_std) :: ier
has_discretization = .FALSE.
IF (PRESENT(discrdim)) THEN
has_discretization = discrdim
ENDIF
IF (.NOT. has_discretization) THEN
ALLOCATE (this%simp(kjpindex,argsec),stat=ier)
ELSE
ALLOCATE (this%disc(kjpindex,argsec,discrdim),stat=ier)
ENDIF
END SUBROUTINE initialize
将分配simp
或disc
,但不会同时分配两者
以及:
t\u mc\u hydro
初始化:
SUBROUTINE initialize(this, kjpindex, nslm, nstm, nvm)
CLASS(T_MC_HYDRO), INTENT(inout) :: this
INTEGER(i_std), INTENT(in) :: kjpindex
INTEGER(i_std), INTENT(in) :: nslm
INTEGER(i_std), INTENT(in), OPTIONAL :: nstm
INTEGER(i_std), INTENT(in), OPTIONAL :: nvm
INTEGER(i_std) :: ier
has_discretization = .FALSE.
IF (PRESENT(nvm) .AND. PRESENT(nstm)) THEN
has_discretization = .TRUE.
ENDIF
IF (has_discretization) THEN
CALL this%mc_layh%initialize(kjpindex, nslm, nstm)
CALL this%mcl_layh%initialize(kjpindex, nslm, nstm)
CALL this%soilmoist%initialize(kjpindex, nslm, nvm)
ELSE
CALL this%mc_layh%initialize(kjpindex, nslm)
CALL this%mcl_layh%initialize(kjpindex, nslm)
CALL this%soilmoist%initialize(kjpindex, nslm)
ENDIF
END SUBROUTINE initialize
在全局模块作用域的其他位置声明:
TYPE(T_MC_HYDRO), SAVE :: t_mc_hydrol
其目的是在模块超出范围时使t_mc_hydrol
持久化。但现行法规并没有产生这样的效果。我正在努力理解最好的方法
更新:
为了重现该问题:
主程序:
PROGRAM unittests
USE types_tests
IMPLICIT NONE
TYPE(T_MC_HYDRO), SAVE :: torch_test
INTEGER(i_std), PARAMETER :: kjpindex=20, nslm=10
CALL torch_test%initialize(kjpindex, nslm)
CALL types_tests_init(torch_test)
CALL types_tests_main(torch_test)
END PROGRAM unittests
原始代码中使用的中间模块:
MODULE types_tests
USE ioipsl_para
USE type_moisture_content_hydro
IMPLICIT NONE
CONTAINS
SUBROUTINE types_tests_init(torch_test)
TYPE(T_MC_HYDRO), INTENT(out) :: torch_test
torch_test%mc_layh%simp = 22.0
torch_test%mcl_layh%simp = 23.0
END SUBROUTINE types_tests_init
SUBROUTINE types_tests_main(torch_test)
TYPE(T_MC_HYDRO), INTENT(out) :: torch_test
INTEGER(i_std) :: ji, jl
DO ji=1, 20 ! kjpindex ! 20
DO jl=1, 10 ! nslm
torch_test%mc_layh%simp(ji,jl) = 25.0 !! <--- code fails here
torch_test%mcl_layh%simp(ji,jl) = 24.0
ENDDO
ENDDO
END SUBROUTINE types_tests_main
END MODULE types_tests
TYPE(T\u MC\u HYDRO),INTENT(out)::torch\u test
在该子例程的后面引用一个伪参数(带有INTENT(out)
),而不是一个模块/“全局”变量。我倾向于投票以打字错误结束,或者你对参数有什么不理解吗?我确实错过了关于intent(out)及其与type语句交互的要点,正如@francescalus所述,通过将参数定义更改为intent(inout)有效。
MODULE types_tests
USE ioipsl_para
USE type_moisture_content_hydro
IMPLICIT NONE
CONTAINS
SUBROUTINE types_tests_init(torch_test)
TYPE(T_MC_HYDRO), INTENT(out) :: torch_test
torch_test%mc_layh%simp = 22.0
torch_test%mcl_layh%simp = 23.0
END SUBROUTINE types_tests_init
SUBROUTINE types_tests_main(torch_test)
TYPE(T_MC_HYDRO), INTENT(out) :: torch_test
INTEGER(i_std) :: ji, jl
DO ji=1, 20 ! kjpindex ! 20
DO jl=1, 10 ! nslm
torch_test%mc_layh%simp(ji,jl) = 25.0 !! <--- code fails here
torch_test%mcl_layh%simp(ji,jl) = 24.0
ENDDO
ENDDO
END SUBROUTINE types_tests_main
END MODULE types_tests
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
unittests.exe 00000000005B3E14 Unknown Unknown Unknown
libpthread-2.17.s 00002B1D3DDE35E0 Unknown Unknown Unknown
unittests.exe 0000000000410F9B types_tests_mp_ty 78 types_tests.f90
unittests.exe 000000000040CEB5 MAIN__ 64 unittests.f90
unittests.exe 000000000040C95E Unknown Unknown Unknown
libc-2.17.so 00002B1D3E215C05 __libc_start_main Unknown Unknown
unittests.exe 000000000040C869 Unknown Unknown Unknown
srun: error: irene1124: task 0: Exited with exit code 174