diff --git a/src/MNH/mode_mnh_zwork.f90 b/src/MNH/mode_mnh_zwork.f90 index e1d826d1de6a04d14b08fc0c68d1b44b431e693f..8bcc98143e064b910a26f3b392f14edd2aa21acd 100644 --- a/src/MNH/mode_mnh_zwork.f90 +++ b/src/MNH/mode_mnh_zwork.f90 @@ -7,6 +7,7 @@ ! Modifications: ! P. Wautelet 10/07/2019: bugfix: MNH_REL_ZT3D_N0: access outside of array was possible ! P. Wautelet 20/10/2021: create ZT1DFLAT buffer that can be used for any size and shape arrays (real) +! P. Wautelet 31/01/2022: add new functionalities for integers, logicals and real flat pools !----------------------------------------------------------------- MODULE MODE_MNH_ZWORK @@ -96,10 +97,10 @@ MODULE MODE_MNH_ZWORK INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_GT3DFLAT = 0 INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_GETSIZE_GT1DFLAT = 0 !Sum of all requested sizes in MNH_REL_GT1DFLAT INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_GETSIZE_GT2DFLAT = 0 !Sum of all requested sizes in MNH_REL_GT2DFLAT - INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_RELSIZE_GT1DFLAT = 0 !Sum of all released sizes in MNH_REL_ZT1DFLAT - INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT1DFLAT = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT1DFLAT - INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT2DFLAT = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT1DFLAT - INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT3DFLAT = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT3DFLAT + INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_RELSIZE_GT1DFLAT = 0 !Sum of all released sizes in MNH_REL_GT1DFLAT + INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT1DFLAT = 0 !Sum of all requested sizes in MNH_ALLOCATE_GT1DFLAT + INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT2DFLAT = 0 !Sum of all requested sizes in MNH_ALLOCATE_GT2DFLAT + INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_GT3DFLAT = 0 !Sum of all requested sizes in MNH_ALLOCATE_GT3DFLAT !------ Integer 1DFLAT pool @@ -155,16 +156,23 @@ MODULE MODE_MNH_ZWORK MODULE PROCEDURE :: MNH_ALLOCATE_GT1DFLAT_INT32 MODULE PROCEDURE :: MNH_ALLOCATE_GT1DFLAT_INT64 MODULE PROCEDURE :: MNH_ALLOCATE_GT2DFLAT + MODULE PROCEDURE :: MNH_ALLOCATE_GT2DFLAT_SIZE MODULE PROCEDURE :: MNH_ALLOCATE_GT3DFLAT + MODULE PROCEDURE :: MNH_ALLOCATE_GT3DFLAT_SIZE MODULE PROCEDURE :: MNH_ALLOCATE_IT1DFLAT_INT32 MODULE PROCEDURE :: MNH_ALLOCATE_IT1DFLAT_INT64 MODULE PROCEDURE :: MNH_ALLOCATE_IT2DFLAT + MODULE PROCEDURE :: MNH_ALLOCATE_IT2DFLAT_SIZE MODULE PROCEDURE :: MNH_ALLOCATE_IT3DFLAT + MODULE PROCEDURE :: MNH_ALLOCATE_IT3DFLAT_SIZE MODULE PROCEDURE :: MNH_ALLOCATE_ZT1DFLAT_INT32 MODULE PROCEDURE :: MNH_ALLOCATE_ZT1DFLAT_INT64 MODULE PROCEDURE :: MNH_ALLOCATE_ZT2DFLAT + MODULE PROCEDURE :: MNH_ALLOCATE_ZT2DFLAT_SIZE MODULE PROCEDURE :: MNH_ALLOCATE_ZT3DFLAT + MODULE PROCEDURE :: MNH_ALLOCATE_ZT3DFLAT_SIZE MODULE PROCEDURE :: MNH_ALLOCATE_ZT4DFLAT + MODULE PROCEDURE :: MNH_ALLOCATE_ZT4DFLAT_SIZE END INTERFACE MNH_ALLOCATE_FLAT INTERFACE MNH_RELEASE_FLAT @@ -1173,20 +1181,20 @@ CONTAINS END SUBROUTINE MNH_REL_GT1DFLAT - FUNCTION MNH_ALLOCATE_GT1DFLAT_INT32( PTAB, KSIZE ) RESULT( KINDEX ) + FUNCTION MNH_ALLOCATE_GT1DFLAT_INT32( OTAB, KSIZE ) RESULT( KINDEX ) - LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: PTAB + LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: OTAB INTEGER(KIND=MNHINT32), INTENT(IN) :: KSIZE INTEGER :: KINDEX - kindex = MNH_Allocate_gt1dflat_int64( ptab, Int( ksize, kind = MNHINT64 ) ) + kindex = MNH_Allocate_gt1dflat_int64( otab, Int( ksize, kind = MNHINT64 ) ) END FUNCTION MNH_ALLOCATE_GT1DFLAT_INT32 - FUNCTION MNH_ALLOCATE_GT1DFLAT_INT64( PTAB, KSIZE ) RESULT( KINDEX ) + FUNCTION MNH_ALLOCATE_GT1DFLAT_INT64( OTAB, KSIZE ) RESULT( KINDEX ) - LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: PTAB + LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: OTAB INTEGER(KIND=MNHINT64), INTENT(IN) :: KSIZE INTEGER :: KINDEX @@ -1194,14 +1202,14 @@ CONTAINS NTOT_ALLOCSIZE_GT1DFLAT = NTOT_ALLOCSIZE_GT1DFLAT + KSIZE kindex = MNH_Get_gt1dflat( ksize ) - ptab(1:KSIZE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+ksize-1 ) + otab(1:KSIZE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+ksize-1 ) END FUNCTION MNH_ALLOCATE_GT1DFLAT_INT64 - FUNCTION MNH_ALLOCATE_GT2DFLAT( PTAB, KIB, KIE, KJB, KJE ) RESULT ( KINDEX ) + FUNCTION MNH_ALLOCATE_GT2DFLAT( OTAB, KIB, KIE, KJB, KJE ) RESULT ( KINDEX ) - LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: PTAB + LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: OTAB INTEGER, INTENT(IN) :: KIB INTEGER, INTENT(IN) :: KIE INTEGER, INTENT(IN) :: KJB @@ -1224,14 +1232,26 @@ CONTAINS kindex = MNH_Get_gt1dflat( isize ) - ptab(KIB:KIE, KJB:KJE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+isize-1 ) + otab(KIB:KIE, KJB:KJE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+isize-1 ) END FUNCTION MNH_ALLOCATE_GT2DFLAT - FUNCTION MNH_ALLOCATE_GT3DFLAT( PTAB, KIB, KIE, KJB, KJE, KKB, KKE ) RESULT ( KINDEX ) + FUNCTION MNH_ALLOCATE_GT2DFLAT_SIZE( OTAB, KISIZE, KJSIZE ) RESULT ( KINDEX ) - LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB + LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: OTAB + INTEGER, INTENT(IN) :: KISIZE + INTEGER, INTENT(IN) :: KJSIZE + INTEGER :: KINDEX + + KINDEX = MNH_ALLOCATE_GT2DFLAT( OTAB, 1, KISIZE, 1, KJSIZE ) + + END FUNCTION MNH_ALLOCATE_GT2DFLAT_SIZE + + + FUNCTION MNH_ALLOCATE_GT3DFLAT( OTAB, KIB, KIE, KJB, KJE, KKB, KKE ) RESULT ( KINDEX ) + + LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: OTAB INTEGER, INTENT(IN) :: KIB INTEGER, INTENT(IN) :: KIE INTEGER, INTENT(IN) :: KJB @@ -1258,11 +1278,24 @@ CONTAINS kindex = MNH_Get_gt1dflat( isize ) - ptab(KIB:KIE, KJB:KJE, KKB:KKE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+isize-1 ) + otab(KIB:KIE, KJB:KJE, KKB:KKE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+isize-1 ) END FUNCTION MNH_ALLOCATE_GT3DFLAT + FUNCTION MNH_ALLOCATE_GT3DFLAT_SIZE( OTAB, KISIZE, KJSIZE, KKSIZE ) RESULT ( KINDEX ) + + LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: OTAB + INTEGER, INTENT(IN) :: KISIZE + INTEGER, INTENT(IN) :: KJSIZE + INTEGER, INTENT(IN) :: KKSIZE + INTEGER :: KINDEX + + KINDEX = MNH_ALLOCATE_GT3DFLAT( OTAB, 1, KISIZE, 1, KJSIZE, 1, KKSIZE ) + + END FUNCTION MNH_ALLOCATE_GT3DFLAT_SIZE + + ! End Logical 1DFLAT management @@ -1407,6 +1440,18 @@ CONTAINS END FUNCTION MNH_ALLOCATE_IT2DFLAT + FUNCTION MNH_ALLOCATE_IT2DFLAT_SIZE( KTAB, KISIZE, KJSIZE ) RESULT ( KINDEX ) + + INTEGER, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: KTAB + INTEGER, INTENT(IN) :: KISIZE + INTEGER, INTENT(IN) :: KJSIZE + INTEGER :: KINDEX + + KINDEX = MNH_ALLOCATE_IT2DFLAT( KTAB, 1, KISIZE, 1, KJSIZE ) + + END FUNCTION MNH_ALLOCATE_IT2DFLAT_SIZE + + FUNCTION MNH_ALLOCATE_IT3DFLAT( KTAB, KIB, KIE, KJB, KJE, KKB, KKE ) RESULT ( KINDEX ) INTEGER, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: KTAB @@ -1441,6 +1486,19 @@ CONTAINS END FUNCTION MNH_ALLOCATE_IT3DFLAT + FUNCTION MNH_ALLOCATE_IT3DFLAT_SIZE( KTAB, KISIZE, KJSIZE, KKSIZE ) RESULT ( KINDEX ) + + INTEGER, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: KTAB + INTEGER, INTENT(IN) :: KISIZE + INTEGER, INTENT(IN) :: KJSIZE + INTEGER, INTENT(IN) :: KKSIZE + INTEGER :: KINDEX + + KINDEX = MNH_ALLOCATE_IT3DFLAT( KTAB, 1, KISIZE, 1, KJSIZE, 1, KKSIZE ) + + END FUNCTION MNH_ALLOCATE_IT3DFLAT_SIZE + + ! End Integer 1DFLAT management @@ -1619,6 +1677,18 @@ CONTAINS END FUNCTION MNH_ALLOCATE_ZT2DFLAT + FUNCTION MNH_ALLOCATE_ZT2DFLAT_SIZE( PTAB, KISIZE, KJSIZE ) RESULT ( KINDEX ) + + REAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: PTAB + INTEGER, INTENT(IN) :: KISIZE + INTEGER, INTENT(IN) :: KJSIZE + INTEGER :: KINDEX + + KINDEX = MNH_ALLOCATE_ZT2DFLAT( PTAB, 1, KISIZE, 1, KJSIZE ) + + END FUNCTION MNH_ALLOCATE_ZT2DFLAT_SIZE + + FUNCTION MNH_ALLOCATE_ZT3DFLAT( PTAB, KIB, KIE, KJB, KJE, KKB, KKE ) RESULT ( KINDEX ) REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB @@ -1653,6 +1723,19 @@ CONTAINS END FUNCTION MNH_ALLOCATE_ZT3DFLAT + FUNCTION MNH_ALLOCATE_ZT3DFLAT_SIZE( PTAB, KISIZE, KJSIZE, KKSIZE ) RESULT ( KINDEX ) + + REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB + INTEGER, INTENT(IN) :: KISIZE + INTEGER, INTENT(IN) :: KJSIZE + INTEGER, INTENT(IN) :: KKSIZE + INTEGER :: KINDEX + + KINDEX = MNH_ALLOCATE_ZT3DFLAT( PTAB, 1, KISIZE, 1, KJSIZE, 1, KKSIZE ) + + END FUNCTION MNH_ALLOCATE_ZT3DFLAT_SIZE + + FUNCTION MNH_ALLOCATE_ZT4DFLAT( PTAB, KIB, KIE, KJB, KJE, KKB, KKE, KPB, KPE ) RESULT ( KINDEX ) REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:,:), INTENT(INOUT) :: PTAB @@ -1691,6 +1774,20 @@ CONTAINS END FUNCTION MNH_ALLOCATE_ZT4DFLAT + FUNCTION MNH_ALLOCATE_ZT4DFLAT_SIZE( PTAB, KISIZE, KJSIZE, KKSIZE, KPSIZE ) RESULT ( KINDEX ) + + REAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:,:), INTENT(INOUT) :: PTAB + INTEGER, INTENT(IN) :: KISIZE + INTEGER, INTENT(IN) :: KJSIZE + INTEGER, INTENT(IN) :: KKSIZE + INTEGER, INTENT(IN) :: KPSIZE + INTEGER :: KINDEX + + KINDEX = MNH_ALLOCATE_ZT4DFLAT( PTAB, 1, KISIZE, 1, KJSIZE, 1, KKSIZE, 1, KPSIZE ) + + END FUNCTION MNH_ALLOCATE_ZT4DFLAT_SIZE + + ! End Real 1DFLAT management