From 24e9635736878ea1d0fc413a5c18cc48445ff358 Mon Sep 17 00:00:00 2001
From: Wautelet Philippe <waup@aeropc45.aero.obs-mip.fr>
Date: Tue, 26 Oct 2021 15:53:23 +0200
Subject: [PATCH] Philippe 26/10/2021: OpenACC: create GT1DFLAT buffer that can
 be used for any size and shape arrays (logical)

---
 src/MNH/mode_mnh_zwork.f90 | 276 +++++++++++++++++++++++++++++++++++--
 1 file changed, 261 insertions(+), 15 deletions(-)

diff --git a/src/MNH/mode_mnh_zwork.f90 b/src/MNH/mode_mnh_zwork.f90
index 792661a9a..50c16b4b5 100644
--- a/src/MNH/mode_mnh_zwork.f90
+++ b/src/MNH/mode_mnh_zwork.f90
@@ -76,14 +76,39 @@ MODULE MODE_MNH_ZWORK
   INTEGER,SAVE    , ALLOCATABLE, TARGET , DIMENSION(:)         :: IT1D_OSIZE
 
 
+  INTEGER, PARAMETER                                 :: JPPOOLSTEP_FLAT = 10 !Number of elements added to the pool when too small
+
+  !------ Logical 1DFLAT pool
+  INTEGER, PARAMETER                                 :: JPMAX_T1DFLAT_G = 10       !Used to determine max size of buffer GT1DFLAT
+                                                                                   !(3D size of the mesh * JPMAX_T1DFLAT_G)
+  INTEGER,                SAVE                       :: NPMAX_POOL_T1DFLAT_G = 100 !Maximum size of the pool (max number of arrays)
+  INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: NT1DFLAT_POOL_G   !Position in ZT1DFLAT of the beginning of each array
+  INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: NT1DFLAT_SIZE_G   !Size of each array
+  INTEGER(KIND=MNHINT64), SAVE                       :: NT1DFLAT_MAXSIZE_G                      !Total allocated size of ZT1DFLAT
+  INTEGER,                SAVE                       :: NT1DFLAT_TOP_G, NT1DFLAT_TOP_G_MAX = 0  !Position in the pool
+  INTEGER(KIND=MNHINT64), SAVE                       :: NT1DFLAT_POS_G, NT1DFLAT_POS_G_MAX = 0  !Position in the array
+  LOGICAl, SAVE, ALLOCATABLE, TARGET, DIMENSION(:)   :: GT1DFLAT
+
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_GET_GT1DFLAT      = 0
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_REL_GT1DFLAT      = 0
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_GT1DFLAT = 0
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_GT2DFLAT = 0
+  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
+
+
 !------ Real 1DFLAT pool
   INTEGER, PARAMETER                                 :: JPMAX_T1DFLAT_R = 10       !Used to determine max size of buffer ZT1DFLAT
                                                                                    !(3D size of the mesh * JPMAX_T1DFLAT_R)
-  INTEGER, PARAMETER                                 :: JPPOOLSTEP_FLAT = 10 !Number of elements added to the pool when too small
   INTEGER,                SAVE                       :: NPMAX_POOL_T1DFLAT_R = 100 !Maximum size of the pool (max number of arrays)
   INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: NT1DFLAT_POOL_R   !Position in ZT1DFLAT of the beginning of each array
   INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: NT1DFLAT_SIZE_R   !Size of each array
-  INTEGER(KIND=MNHINT64), SAVE                       :: NT1DFLAT_MAXSIZE                        !Total allocated size of ZT1DFLAT
+  INTEGER(KIND=MNHINT64), SAVE                       :: NT1DFLAT_MAXSIZE_R                      !Total allocated size of ZT1DFLAT
   INTEGER,                SAVE                       :: NT1DFLAT_TOP_R, NT1DFLAT_TOP_R_MAX = 0  !Position in the pool
   INTEGER(KIND=MNHINT64), SAVE                       :: NT1DFLAT_POS_R, NT1DFLAT_POS_R_MAX = 0  !Position in the array
   REAL, SAVE, ALLOCATABLE, TARGET, DIMENSION(:)      :: ZT1DFLAT
@@ -95,13 +120,17 @@ MODULE MODE_MNH_ZWORK
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_ZT3DFLAT = 0
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_GETSIZE_ZT1DFLAT       = 0 !Sum of all requested sizes in MNH_REL_ZT1DFLAT
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_GETSIZE_ZT2DFLAT       = 0 !Sum of all requested sizes in MNH_REL_ZT2DFLAT
-  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_RELSIZE_ZT3DFLAT       = 0 !Sum of all released sizes in MNH_REL_ZT1DFLAT
+  INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_RELSIZE_ZT1DFLAT       = 0 !Sum of all released sizes in MNH_REL_ZT1DFLAT
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_ZT1DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT1DFLAT
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_ZT2DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT1DFLAT
   INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_ZT3DFLAT     = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT3DFLAT
 
 
   INTERFACE MNH_ALLOCATE_FLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_GT1DFLAT_INT32
+    MODULE PROCEDURE :: MNH_ALLOCATE_GT1DFLAT_INT64
+    MODULE PROCEDURE :: MNH_ALLOCATE_GT2DFLAT
+    MODULE PROCEDURE :: MNH_ALLOCATE_GT3DFLAT
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT1DFLAT_INT32
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT1DFLAT_INT64
     MODULE PROCEDURE :: MNH_ALLOCATE_ZT2DFLAT
@@ -232,10 +261,22 @@ CONTAINS
           NT1D_POOL_I(JI) = JI
        END DO       
        
+!------ Logical 1DFLAT pool
+
+       NT1DFLAT_MAXSIZE_G = INT( IIU, KIND=MNHINT64 ) * IJU * IKU * JPMAX_T1DFLAT_G
+       ALLOCATE( GT1DFLAT(NT1DFLAT_MAXSIZE_G) )
+       !$acc enter data create( GT1DFLAT )
+
+       ALLOCATE( NT1DFLAT_POOL_G(NPMAX_POOL_T1DFLAT_G) )
+       ALLOCATE( NT1DFLAT_SIZE_G(NPMAX_POOL_T1DFLAT_G) )
+       NT1DFLAT_POOL_G(:) = NNEGUNDEF
+       NT1DFLAT_SIZE_G(:) = NNEGUNDEF
+       NT1DFLAT_TOP_G = 0
+
 !------ Real 1DFLAT pool
 
-       NT1DFLAT_MAXSIZE = INT( IIU, KIND=MNHINT64 ) * IJU * IKU * JPMAX_T1DFLAT_R
-       ALLOCATE( ZT1DFLAT(NT1DFLAT_MAXSIZE) )
+       NT1DFLAT_MAXSIZE_R = INT( IIU, KIND=MNHINT64 ) * IJU * IKU * JPMAX_T1DFLAT_R
+       ALLOCATE( ZT1DFLAT(NT1DFLAT_MAXSIZE_R) )
        !$acc enter data create( ZT1DFLAT )
 
        ALLOCATE( NT1DFLAT_POOL_R(NPMAX_POOL_T1DFLAT_R) )
@@ -260,13 +301,16 @@ CONTAINS
        IT3D  = 0.0
        IT1D  = 0.0
 
-       GT3D  = .FALSE.
+       GT3D(:,:,:,:) = .FALSE.
+       GT1DFLAT(:)   = .FALSE.
 
        !$acc end kernels
 
        !$acc update host (ZPSRC_HALO2_WEST,ZPSRC_HALO2_SOUTH)
        !$acc update host (ZUNIT3D)
        !$acc update host (ZT3D,ZT1D,ZT1DFLAT)
+       !$acc update host (IT3D, IT1D)
+       !$acc update host (GT3D, GT1DFLAT)
 
     END IF
 
@@ -1001,6 +1045,184 @@ CONTAINS
 
   ! End Integer 1D management
 
+  !-------- Logical 1DFLAT Pool Managment
+
+  FUNCTION MNH_GET_GT1DFLAT( KSIZE ) RESULT( KINDEX )
+
+    USE MODD_PARAMETERS, ONLY: NNEGUNDEF
+
+    IMPLICIT NONE
+
+    INTEGER(KIND=MNHINT64), INTENT(IN)  :: KSIZE
+    INTEGER                             :: KINDEX
+
+    CHARACTER(LEN=32) :: YAVAIL, YMAX, YSIZE
+    INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: IT1DFLAT_POOL_G
+    INTEGER(KIND=MNHINT64), ALLOCATABLE, DIMENSION (:) :: IT1DFLAT_SIZE_G
+
+    NCALL_MNH_GET_GT1DFLAT = NCALL_MNH_GET_GT1DFLAT + 1
+    NTOT_GETSIZE_GT1DFLAT  = NTOT_GETSIZE_GT1DFLAT + KSIZE
+
+    IF ( NT1DFLAT_POS_G + KSIZE > NT1DFLAT_MAXSIZE_G ) THEN
+      WRITE( YSIZE,  '( I0 )' ) KSIZE
+      WRITE( YAVAIL, '( I0 )' ) NT1DFLAT_MAXSIZE_G - NT1DFLAT_POS_G
+      WRITE( YMAX,   '( I0 )' ) NT1DFLAT_MAXSIZE_G
+      call Print_msg( NVERB_FATAL, 'GEN', 'MNH_GET_GT1DFLAT', 'GT1DFLAT too small (asked=' // Trim( ysize ) // &
+                      ', available=' // Trim( yavail ) // ', total=' // Trim( ymax ) // ')' )
+    ELSE
+      NT1DFLAT_TOP_G = NT1DFLAT_TOP_G + 1
+      KINDEX = NT1DFLAT_TOP_G
+
+      IF ( KINDEX > NPMAX_POOL_T1DFLAT_G ) THEN
+        WRITE( YSIZE,  '( I0 )' ) NPMAX_POOL_T1DFLAT_G
+        WRITE( YMAX,   '( I0 )' ) NPMAX_POOL_T1DFLAT_G+JPPOOLSTEP_FLAT
+        call Print_msg( NVERB_INFO, 'GEN', 'MNH_GET_GT1DFLAT', 'pool for GT1DFLAT was too small (' // TRIM( YSIZE ) &
+                        // '->' // TRIM( YMAX ) // ')' )
+
+        ALLOCATE( IT1DFLAT_POOL_G(NPMAX_POOL_T1DFLAT_G+JPPOOLSTEP_FLAT) )
+        ALLOCATE( IT1DFLAT_SIZE_G(NPMAX_POOL_T1DFLAT_G+JPPOOLSTEP_FLAT) )
+
+        IT1DFLAT_POOL_G(1:NPMAX_POOL_T1DFLAT_G) = NT1DFLAT_POOL_G(:)
+        IT1DFLAT_SIZE_G(1:NPMAX_POOL_T1DFLAT_G) = NT1DFLAT_SIZE_G(:)
+        IT1DFLAT_POOL_G(NPMAX_POOL_T1DFLAT_G+1:) = NNEGUNDEF
+        IT1DFLAT_SIZE_G(NPMAX_POOL_T1DFLAT_G+1:) = NNEGUNDEF
+
+        CALL MOVE_ALLOC( FROM = IT1DFLAT_POOL_G, TO = NT1DFLAT_POOL_G )
+        CALL MOVE_ALLOC( FROM = IT1DFLAT_SIZE_G, TO = NT1DFLAT_SIZE_G )
+
+        NPMAX_POOL_T1DFLAT_G = NPMAX_POOL_T1DFLAT_G + JPPOOLSTEP_FLAT
+      END IF
+
+      NT1DFLAT_POOL_G( KINDEX ) = NT1DFLAT_POS_G + 1
+      NT1DFLAT_SIZE_G( KINDEX ) = KSIZE
+
+      NT1DFLAT_POS_G = NT1DFLAT_POS_G + KSIZE
+
+      IF ( NT1DFLAT_TOP_G > NT1DFLAT_TOP_G_MAX ) NT1DFLAT_TOP_G_MAX = NT1DFLAT_TOP_G
+      IF ( NT1DFLAT_POS_G > NT1DFLAT_POS_G_MAX ) NT1DFLAT_POS_G_MAX = NT1DFLAT_POS_G
+    END IF
+
+  END FUNCTION MNH_GET_GT1DFLAT
+
+
+  SUBROUTINE MNH_REL_GT1DFLAT( KINDEX )
+
+    USE MODD_PARAMETERS, ONLY: NNEGUNDEF
+
+    IMPLICIT NONE
+
+    INTEGER :: KINDEX
+
+    NCALL_MNH_REL_GT1DFLAT = NCALL_MNH_REL_GT1DFLAT + 1
+
+    !Release only if last block
+    IF ( KINDEX /= NT1DFLAT_TOP_G ) &
+      call Print_msg( NVERB_FATAL, 'GEN', 'MNH_REL_GT1DFLAT', 'trying to release block that is not the last one' )
+
+    NTOT_RELSIZE_GT1DFLAT = NTOT_RELSIZE_GT1DFLAT + NT1DFLAT_SIZE_G( KINDEX )
+
+    NT1DFLAT_TOP_G = NT1DFLAT_TOP_G - 1
+    NT1DFLAT_POS_G = NT1DFLAT_POS_G - NT1DFLAT_SIZE_G( KINDEX )
+
+    NT1DFLAT_POOL_G( KINDEX ) = NNEGUNDEF
+    NT1DFLAT_SIZE_G( KINDEX ) = NNEGUNDEF
+
+  END SUBROUTINE MNH_REL_GT1DFLAT
+
+
+  FUNCTION MNH_ALLOCATE_GT1DFLAT_INT32( PTAB, KSIZE ) RESULT( KINDEX )
+
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: PTAB
+    INTEGER(KIND=MNHINT32),                      INTENT(IN)    :: KSIZE
+    INTEGER                                                    :: KINDEX
+
+    kindex = MNH_Allocate_gt1dflat_int64( ptab, Int( ksize, kind = MNHINT64 ) )
+
+  END FUNCTION MNH_ALLOCATE_GT1DFLAT_INT32
+
+
+  FUNCTION MNH_ALLOCATE_GT1DFLAT_INT64( PTAB, KSIZE ) RESULT( KINDEX )
+
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:), INTENT(INOUT) :: PTAB
+    INTEGER(KIND=MNHINT64),                      INTENT(IN)    :: KSIZE
+    INTEGER                                                    :: KINDEX
+
+    NCALL_MNH_ALLOCATE_GT1DFLAT = NCALL_MNH_ALLOCATE_GT1DFLAT + 1
+    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 )
+
+  END FUNCTION MNH_ALLOCATE_GT1DFLAT_INT64
+
+
+  FUNCTION MNH_ALLOCATE_GT2DFLAT( PTAB, KIB, KIE, KJB, KJE ) RESULT ( KINDEX )
+
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:), INTENT(INOUT) :: PTAB
+    INTEGER,                                       INTENT(IN)    :: KIB
+    INTEGER,                                       INTENT(IN)    :: KIE
+    INTEGER,                                       INTENT(IN)    :: KJB
+    INTEGER,                                       INTENT(IN)    :: KJE
+    INTEGER                                                      :: KINDEX
+
+    INTEGER(KIND=MNHINT64) :: ISIZE
+    INTEGER(KIND=MNHINT64) :: IIB, IIE, IJB, IJE
+
+    NCALL_MNH_ALLOCATE_GT2DFLAT = NCALL_MNH_ALLOCATE_GT2DFLAT + 1
+
+    IIB = KIB
+    IIE = KIE
+    IJB = KJB
+    IJE = KJE
+
+    ISIZE = ( IIE - IIB + 1_MNHINT64 ) * ( IJE - IJB + 1_MNHINT64 )
+
+    NTOT_ALLOCSIZE_GT2DFLAT = NTOT_ALLOCSIZE_GT2DFLAT + ISIZE
+
+    kindex = MNH_Get_gt1dflat( isize )
+
+    ptab(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 )
+
+    LOGICAL, POINTER, CONTIGUOUS , DIMENSION(:,:,:), INTENT(INOUT) :: PTAB
+    INTEGER,                                         INTENT(IN)    :: KIB
+    INTEGER,                                         INTENT(IN)    :: KIE
+    INTEGER,                                         INTENT(IN)    :: KJB
+    INTEGER,                                         INTENT(IN)    :: KJE
+    INTEGER,                                         INTENT(IN)    :: KKB
+    INTEGER,                                         INTENT(IN)    :: KKE
+    INTEGER                                                        :: KINDEX
+
+    INTEGER(KIND=MNHINT64) :: ISIZE
+    INTEGER(KIND=MNHINT64) :: IIB, IIE, IJB, IJE, IKB, IKE
+
+    NCALL_MNH_ALLOCATE_GT3DFLAT = NCALL_MNH_ALLOCATE_GT3DFLAT + 1
+
+    IIB = KIB
+    IIE = KIE
+    IJB = KJB
+    IJE = KJE
+    IKB = KKB
+    IKE = KKE
+
+    ISIZE = ( IIE - IIB + 1_MNHINT64 ) * ( IJE - IJB + 1_MNHINT64 ) * ( IKE - IKB + 1_MNHINT64 )
+
+    NTOT_ALLOCSIZE_GT3DFLAT = NTOT_ALLOCSIZE_GT3DFLAT + ISIZE
+
+    kindex = MNH_Get_gt1dflat( isize )
+
+    ptab(KIB:KIE, KJB:KJE, KKB:KKE) => gt1dflat( NT1DFLAT_POOL_G(kindex) : NT1DFLAT_POOL_G(kindex)+isize-1 )
+
+  END FUNCTION MNH_ALLOCATE_GT3DFLAT
+
+
+  ! End Logical 1DFLAT management
+
+
   !-------- Real 1DFLAT Pool Managment
 
   FUNCTION MNH_GET_ZT1DFLAT( KSIZE ) RESULT( KINDEX )
@@ -1019,10 +1241,10 @@ CONTAINS
     NCALL_MNH_GET_ZT1DFLAT = NCALL_MNH_GET_ZT1DFLAT + 1
     NTOT_GETSIZE_ZT1DFLAT  = NTOT_GETSIZE_ZT1DFLAT + KSIZE
 
-    IF ( NT1DFLAT_POS_R + KSIZE > NT1DFLAT_MAXSIZE ) THEN
+    IF ( NT1DFLAT_POS_R + KSIZE > NT1DFLAT_MAXSIZE_R ) THEN
       WRITE( YSIZE,  '( I0 )' ) KSIZE
-      WRITE( YAVAIL, '( I0 )' ) NT1DFLAT_MAXSIZE - NT1DFLAT_POS_R
-      WRITE( YMAX,   '( I0 )' ) NT1DFLAT_MAXSIZE
+      WRITE( YAVAIL, '( I0 )' ) NT1DFLAT_MAXSIZE_R - NT1DFLAT_POS_R
+      WRITE( YMAX,   '( I0 )' ) NT1DFLAT_MAXSIZE_R
       call Print_msg( NVERB_FATAL, 'GEN', 'MNH_GET_ZT1DFLAT', 'ZT1DFLAT too small (asked=' // Trim( ysize ) // &
                       ', available=' // Trim( yavail ) // ', total=' // Trim( ymax ) // ')' )
     ELSE
@@ -1075,7 +1297,7 @@ CONTAINS
     IF ( KINDEX /= NT1DFLAT_TOP_R ) &
       call Print_msg( NVERB_FATAL, 'GEN', 'MNH_REL_ZT1DFLAT', 'trying to release block that is not the last one' )
 
-    NTOT_RELSIZE_ZT3DFLAT = NTOT_RELSIZE_ZT3DFLAT + NT1DFLAT_SIZE_R( KINDEX )
+    NTOT_RELSIZE_ZT1DFLAT = NTOT_RELSIZE_ZT1DFLAT + NT1DFLAT_SIZE_R( KINDEX )
 
     NT1DFLAT_TOP_R = NT1DFLAT_TOP_R - 1
     NT1DFLAT_POS_R = NT1DFLAT_POS_R - NT1DFLAT_SIZE_R( KINDEX )
@@ -1181,7 +1403,31 @@ CONTAINS
 
   SUBROUTINE PRINT_FLATPOOL_STATS()
 
-    cmnhmsg(1) = 'Number of calls for real flat pool:'
+    cmnhmsg(1) = 'LOGICAL flat pool: Number of calls:'
+    Write( cmnhmsg(2), "( '  MNH_GET_GT1DFLAT        = ', I20 )" ) NCALL_MNH_GET_GT1DFLAT
+    Write( cmnhmsg(3), "( '    MNH_ALLOCATE_GT1DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_GT1DFLAT
+    Write( cmnhmsg(4), "( '    MNH_ALLOCATE_GT2DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_GT2DFLAT
+    Write( cmnhmsg(5), "( '    MNH_ALLOCATE_GT3DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_GT3DFLAT
+    Write( cmnhmsg(6), "( '  MNH_REL_GT1DFLAT        = ', I20 )" ) NCALL_MNH_REL_GT1DFLAT
+    call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
+
+    cmnhmsg(1) = 'LOGICAL flat pool: Maximum sizes:'
+    Write( cmnhmsg(2), "( '  Entries (current / max used / max avail) = ', I10, '/', I10, '/', I10, &
+            ' (max is automatically increased if necessary)' )" ) NT1DFLAT_TOP_G, NT1DFLAT_TOP_G_MAX, NPMAX_POOL_T1DFLAT_G
+    Write( cmnhmsg(3), "( '  Memory  (current / max used / max avail) = ', I20, '/', I20, '/', I20 )" ) &
+           NT1DFLAT_POS_G, NT1DFLAT_POS_G_MAX, NT1DFLAT_MAXSIZE_G
+    call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
+
+    cmnhmsg(1) = 'LOGICAL flat pool: Total provided and released sizes (in bytes):'
+    Write( cmnhmsg(2), "( '  Provided = ', I20 )" ) NTOT_GETSIZE_GT1DFLAT
+    Write( cmnhmsg(3), "( '    1D     = ', I20 )" ) NTOT_ALLOCSIZE_GT1DFLAT
+    Write( cmnhmsg(4), "( '    2D     = ', I20 )" ) NTOT_ALLOCSIZE_GT2DFLAT
+    Write( cmnhmsg(5), "( '    3D     = ', I20 )" ) NTOT_ALLOCSIZE_GT3DFLAT
+    Write( cmnhmsg(6), "( '  Released = ', I20 )" ) NTOT_RELSIZE_GT1DFLAT
+    call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
+
+
+    cmnhmsg(1) = 'REAL flat pool: Number of calls:'
     Write( cmnhmsg(2), "( '  MNH_GET_ZT1DFLAT        = ', I20 )" ) NCALL_MNH_GET_ZT1DFLAT
     Write( cmnhmsg(3), "( '    MNH_ALLOCATE_ZT1DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_ZT1DFLAT
     Write( cmnhmsg(4), "( '    MNH_ALLOCATE_ZT2DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_ZT2DFLAT
@@ -1189,19 +1435,19 @@ CONTAINS
     Write( cmnhmsg(6), "( '  MNH_REL_ZT1DFLAT        = ', I20 )" ) NCALL_MNH_REL_ZT1DFLAT
     call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
 
-    cmnhmsg(1) = 'Maximum sizes for real flat pool:'
+    cmnhmsg(1) = 'REAL flat pool: Maximum sizes:'
     Write( cmnhmsg(2), "( '  Entries (current / max used / max avail) = ', I10, '/', I10, '/', I10, &
             ' (max is automatically increased if necessary)' )" ) NT1DFLAT_TOP_R, NT1DFLAT_TOP_R_MAX, NPMAX_POOL_T1DFLAT_R
     Write( cmnhmsg(3), "( '  Memory  (current / max used / max avail) = ', I20, '/', I20, '/', I20 )" ) &
-           NT1DFLAT_POS_R, NT1DFLAT_POS_R_MAX, NT1DFLAT_MAXSIZE
+           NT1DFLAT_POS_R, NT1DFLAT_POS_R_MAX, NT1DFLAT_MAXSIZE_R
     call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
 
-    cmnhmsg(1) = 'Total provided and released sizes for real flat pool (in bytes):'
+    cmnhmsg(1) = 'REAL flat pool: Total provided and released sizes (in bytes):'
     Write( cmnhmsg(2), "( '  Provided = ', I20 )" ) NTOT_GETSIZE_ZT1DFLAT
     Write( cmnhmsg(3), "( '    1D     = ', I20 )" ) NTOT_ALLOCSIZE_ZT1DFLAT
     Write( cmnhmsg(4), "( '    2D     = ', I20 )" ) NTOT_ALLOCSIZE_ZT2DFLAT
     Write( cmnhmsg(5), "( '    3D     = ', I20 )" ) NTOT_ALLOCSIZE_ZT3DFLAT
-    Write( cmnhmsg(6), "( '  Released = ', I20 )" ) NTOT_RELSIZE_ZT3DFLAT
+    Write( cmnhmsg(6), "( '  Released = ', I20 )" ) NTOT_RELSIZE_ZT1DFLAT
     call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' )
 
   END SUBROUTINE PRINT_FLATPOOL_STATS
-- 
GitLab