From 84d5f207d264c46c582c40fb4aac16796f59e4be Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 31 Jan 2022 15:13:35 +0100 Subject: [PATCH] Philippe 31/01/2022: OpenACC: add support for 4D arrays in real flat pool --- src/MNH/mode_mnh_zwork.f90 | 52 ++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/src/MNH/mode_mnh_zwork.f90 b/src/MNH/mode_mnh_zwork.f90 index 2458d99da..2cb5509b4 100644 --- a/src/MNH/mode_mnh_zwork.f90 +++ b/src/MNH/mode_mnh_zwork.f90 @@ -1,5 +1,5 @@ #ifdef MNH_OPENACC -!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2013-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -103,7 +103,7 @@ MODULE MODE_MNH_ZWORK !------ Real 1DFLAT pool - INTEGER, PARAMETER :: JPMAX_T1DFLAT_R = 20 !Used to determine max size of buffer ZT1DFLAT + INTEGER, PARAMETER :: JPMAX_T1DFLAT_R = 60 !Used to determine max size of buffer ZT1DFLAT !(3D size of the mesh * JPMAX_T1DFLAT_R) 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 @@ -118,12 +118,13 @@ MODULE MODE_MNH_ZWORK INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_ZT1DFLAT = 0 INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_ZT2DFLAT = 0 INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_ZT3DFLAT = 0 + INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NCALL_MNH_ALLOCATE_ZT4DFLAT = 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_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 + INTEGER(KIND=MNHINT64), PRIVATE, SAVE :: NTOT_ALLOCSIZE_ZT4DFLAT = 0 !Sum of all requested sizes in MNH_ALLOCATE_ZT4DFLAT INTERFACE MNH_ALLOCATE_FLAT @@ -135,6 +136,7 @@ MODULE MODE_MNH_ZWORK MODULE PROCEDURE :: MNH_ALLOCATE_ZT1DFLAT_INT64 MODULE PROCEDURE :: MNH_ALLOCATE_ZT2DFLAT MODULE PROCEDURE :: MNH_ALLOCATE_ZT3DFLAT + MODULE PROCEDURE :: MNH_ALLOCATE_ZT4DFLAT END INTERFACE MNH_ALLOCATE_FLAT INTERFACE MNH_RELEASE_FLAT @@ -1398,6 +1400,44 @@ CONTAINS END FUNCTION MNH_ALLOCATE_ZT3DFLAT + FUNCTION MNH_ALLOCATE_ZT4DFLAT( PTAB, KIB, KIE, KJB, KJE, KKB, KKE, KPB, KPE ) RESULT ( KINDEX ) + + REAL, 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, INTENT(IN) :: KPB + INTEGER, INTENT(IN) :: KPE + INTEGER :: KINDEX + + INTEGER(KIND=MNHINT64) :: ISIZE + INTEGER(KIND=MNHINT64) :: IIB, IIE, IJB, IJE, IKB, IKE, IPB, IPE + + NCALL_MNH_ALLOCATE_ZT4DFLAT = NCALL_MNH_ALLOCATE_ZT4DFLAT + 1 + + IIB = KIB + IIE = KIE + IJB = KJB + IJE = KJE + IKB = KKB + IKE = KKE + IPB = KPB + IPE = KPE + + ISIZE = ( IIE - IIB + 1_MNHINT64 ) * ( IJE - IJB + 1_MNHINT64 ) * ( IKE - IKB + 1_MNHINT64 ) * ( IPE - IPB + 1_MNHINT64 ) + + NTOT_ALLOCSIZE_ZT4DFLAT = NTOT_ALLOCSIZE_ZT4DFLAT + ISIZE + + kindex = MNH_Get_zt1dflat( isize ) + + ptab(KIB:KIE, KJB:KJE, KKB:KKE, KPB:KPE ) => zt1dflat( NT1DFLAT_POOL_R(kindex) : NT1DFLAT_POOL_R(kindex)+isize-1 ) + + END FUNCTION MNH_ALLOCATE_ZT4DFLAT + + ! End Real 1DFLAT management @@ -1432,7 +1472,8 @@ CONTAINS Write( cmnhmsg(3), "( ' MNH_ALLOCATE_ZT1DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_ZT1DFLAT Write( cmnhmsg(4), "( ' MNH_ALLOCATE_ZT2DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_ZT2DFLAT Write( cmnhmsg(5), "( ' MNH_ALLOCATE_ZT3DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_ZT3DFLAT - Write( cmnhmsg(6), "( ' MNH_REL_ZT1DFLAT = ', I20 )" ) NCALL_MNH_REL_ZT1DFLAT + Write( cmnhmsg(6), "( ' MNH_ALLOCATE_ZT4DFLAT = ', I20 )" ) NCALL_MNH_ALLOCATE_ZT4DFLAT + Write( cmnhmsg(7), "( ' MNH_REL_ZT1DFLAT = ', I20 )" ) NCALL_MNH_REL_ZT1DFLAT call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' ) cmnhmsg(1) = 'REAL flat pool: Maximum sizes:' @@ -1447,7 +1488,8 @@ CONTAINS 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_ZT1DFLAT + Write( cmnhmsg(6), "( ' 4D = ', I20 )" ) NTOT_ALLOCSIZE_ZT4DFLAT + Write( cmnhmsg(7), "( ' Released = ', I20 )" ) NTOT_RELSIZE_ZT1DFLAT call Print_msg( NVERB_INFO, 'GEN', 'FLAT_STATS' ) END SUBROUTINE PRINT_FLATPOOL_STATS -- GitLab