Fortran 90,如何在子例程中使用派生类型中定义的数组

时间:2013-11-22 23:28:14

标签: fortran90 subroutine derived-types

我定义了一个派生类型如下:

  TYPE CLST_MEAN
     REAL(8), ALLOCATABLE :: OMX(:,:), OMZ(:,:)
     REAL(8), ALLOCATABLE :: U(:,:), W(:,:)
     REAL(8), ALLOCATABLE :: YO(:,:), ZO(:,:)
     REAL(8), ALLOCATABLE :: XU(:,:), ZU(:,:)
     INTEGER :: NUM
  END TYPE Clst_Mean

在主代码中,我定义了一个数组,并在子程序中输入

   TYPE(CLST_MEAN), ALLOCATABLE :: MEAN(:)
   ALLOCATE(MEAN(NCL))
   DO I = 1, NCL
      ALLOCATE(MEAN(I)%OMX(NY,NZ))
      ALLOCATE(MEAN(I)%OMZ(NY,NZ))
      ALLOCATE(MEAN(I)%YO(NY,NZ))
      ALLOCATE(MEAN(I)%ZO(NY,NZ))
      ALLOCATE(MEAN(I)%U(NX,NZ))
      ALLOCATE(MEAN(I)%W(NX,NZ))
      ALLOCATE(MEAN(I)%XU(NX,NZ))
      ALLOCATE(MEAN(I)%ZU(NX,NZ))
   END DO
   CALL K_MEAN(MEAN,SMP)

在子程序中,

SUBROUTINE K_MEAN(CL_MEAN,SMP)
  USE DATATYPE, ONLY : CLST_MEAN, SAMPLE
  IMPLICIT NONE
  TYPE(CLST_MEAN), DIMENSION(:), INTENT(OUT) :: CL_MEAN
  ....
  write(*,*) size(cl_mean), SIZE(CL_MEAN(1)%OMX)

size(cl_mean)的输出是正确的。但是size(cl_mean(1)%omx)的输出是1.这意味着编译器认为cl_mean(1)%omx是一个不是数组的变量。

如何访问阵列?谢谢。

1 个答案:

答案 0 :(得分:0)

我认为使用intent(out)会导致派生数据类型中的可分配数组被释放。使用intent(inout)使用gfortran 4.7修复了问题。