From 24ff52f47e21aad5f696d10614155affe10a538d Mon Sep 17 00:00:00 2001
From: Juan Escobar <juan.escobar@aero.obs-mip.fr>
Date: Thu, 10 Jun 2021 18:57:20 +0200
Subject: [PATCH] Juan 10/06/2021: rain_ice_sedimentation_split.f90 , replace
 allocate -> MNH_ALLOCATE_IT1D

---
 src/MNH/rain_ice_sedimentation_split.f90 | 150 +++++++++++++++--------
 1 file changed, 102 insertions(+), 48 deletions(-)

diff --git a/src/MNH/rain_ice_sedimentation_split.f90 b/src/MNH/rain_ice_sedimentation_split.f90
index f926782c1..bc3b2bad4 100644
--- a/src/MNH/rain_ice_sedimentation_split.f90
+++ b/src/MNH/rain_ice_sedimentation_split.f90
@@ -48,6 +48,12 @@ USE MODI_BITREP
 #endif
 use MODI_BUDGET
 
+#ifdef MNH_OPENACC
+USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT1DP , MNH_REL_ZT1D , &
+                            MNH_ALLOCATE_GT3D , MNH_ALLOCATE_GT2D, MNH_REL_GT3D, &
+                            MNH_ALLOCATE_IT1D , MNH_REL_IT1D
+#endif
+
 IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments :
@@ -96,21 +102,26 @@ INTEGER                                :: ISEDIMR, ISEDIMC, ISEDIMI, ISEDIMS, IS
 INTEGER                                :: JI, JJ, JK    ! Loop indices on grid
 INTEGER                                :: JN            ! Temporal loop index for the rain sedimentation
 INTEGER                                :: JL
-INTEGER, DIMENSION(:),     ALLOCATABLE :: IC1, IC2, IC3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:),     ALLOCATABLE :: IR1, IR2, IR3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:),     ALLOCATABLE :: IS1, IS2, IS3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:),     ALLOCATABLE :: II1, II2, II3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:),     ALLOCATABLE :: IG1, IG2, IG3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:),     ALLOCATABLE :: IH1, IH2, IH3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     POINTER, CONTIGUOUS :: IC1, IC2, IC3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     POINTER, CONTIGUOUS :: IR1, IR2, IR3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     POINTER, CONTIGUOUS :: IS1, IS2, IS3 ! Used to replace the COUNT
+INTEGER :: IIC1, IIC2, IIC3, IIR1, IIR2, IIR3, IIS1, IIS2, IIS3
+INTEGER, DIMENSION(:),     POINTER, CONTIGUOUS :: II1, II2, II3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     POINTER, CONTIGUOUS :: IG1, IG2, IG3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     POINTER, CONTIGUOUS :: IH1, IH2, IH3 ! Used to replace the COUNT
+INTEGER :: III1, III2, III3, IIG1, IIG2, IIG3, IIH1, IIH2, IIH3
+
 LOGICAL                                :: GPRESENT_PFPR, GPRESENT_PSEA
-LOGICAL, DIMENSION(:,:),   ALLOCATABLE :: GDEP
-LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: GSEDIMR, GSEDIMC, GSEDIMI, GSEDIMS, GSEDIMG, GSEDIMH ! Where to compute the SED processes
+LOGICAL, DIMENSION(:,:),   POINTER, CONTIGUOUS :: GDEP
+LOGICAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: GSEDIMR, GSEDIMC, GSEDIMI, GSEDIMS, GSEDIMG, GSEDIMH ! Where to compute the SED processes
+INTEGER :: IGDEP,IGSEDIMR, IGSEDIMC, IGSEDIMI, IGSEDIMS, IGSEDIMG, IGSEDIMH
 REAL                                   :: ZINVTSTEP
 REAL                                   :: ZTSPLITR            ! Small time step for rain sedimentation
 REAL                                   :: ZTMP1, ZTMP2, ZTMP3 ! Intermediate variables
 REAL                                   :: ZRHODREFLOC         ! RHO Dry REFerence
 REAL                                   :: ZRSLOC, ZRTLOC      ! Intermediate variables
-REAL,    DIMENSION(:), ALLOCATABLE     :: ZRTMIN
+REAL,    DIMENSION(:), POINTER, CONTIGUOUS     :: ZRTMIN
+
 ! XRTMIN = Minimum value for the mixing ratio
 ! ZRTMIN = Minimum value for the source (tendency)
 REAL                                   :: ZCC,      & ! terminal velocity
@@ -121,15 +132,18 @@ REAL                                   :: ZCC,      & ! terminal velocity
                                           ZWLBDA,   & ! Free mean path
                                           ZZT,      & ! Temperature
                                           ZPRES       ! Pressure
-REAL,    DIMENSION(:,:),   ALLOCATABLE :: ZCONC_TMP   ! Weighted concentration
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZCONC3D     ! Doplet condensation
-REAL,    DIMENSION(:,:),   ALLOCATABLE :: ZOMPSEA,ZTMP1_2D,ZTMP2_2D,ZTMP3_2D,ZTMP4_2D !Work arrays
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZRAY,   &   ! Cloud Mean radius
+REAL,    DIMENSION(:,:),   POINTER, CONTIGUOUS :: ZCONC_TMP   ! Weighted concentration
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZCONC3D     ! Doplet condensation
+REAL,    DIMENSION(:,:),   POINTER, CONTIGUOUS :: ZOMPSEA,ZTMP1_2D,ZTMP2_2D,ZTMP3_2D,ZTMP4_2D !Work arrays
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRAY,   &   ! Cloud Mean radius
                                           ZLBC,   &   ! XLBC weighted by sea fraction
                                           ZFSEDC
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS   ! Mixing ratios created during the time step
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZW          ! Work array
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZWSED       ! sedimentation fluxes
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS   ! Mixing ratios created during the time step
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZW          ! Work array
+REAL,    DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZWSED       ! sedimentation fluxes
+INTEGER :: IZCONC_TMP,IZCONC3D,IZOMPSEA,IZTMP1_2D,IZTMP2_2D,IZTMP3_2D,IZTMP4_2D,IZRAY,IZLBC,IZFSEDC
+
+INTEGER :: IIU,IJU,IKU, IIJKU
 !
 !-------------------------------------------------------------------------------
 !
@@ -173,41 +187,68 @@ IF (MPPDB_INITIALIZED) THEN
   CALL MPPDB_CHECK(PRGS,"RAIN_ICE_SEDIMENTATION_SPLIT beg:PRGS")
   IF (PRESENT(PRHS)) CALL MPPDB_CHECK(PRHS,"RAIN_ICE_SEDIMENTATION_SPLIT beg:PRHS")
 END IF
+
+IIU =  size(PRCS, 1 )
+IJU =  size(PRCS, 2 )
+IKU =  size(PRCS, 3 )
+IIJKU = IIU * IJU * IKU
+
 !
-ALLOCATE( IC1(size(PRCS)), IC2(size(PRCS)), IC3(size(PRCS)) )
-ALLOCATE( IR1(size(PRCS)), IR2(size(PRCS)), IR3(size(PRCS)) )
-ALLOCATE( IS1(size(PRCS)), IS2(size(PRCS)), IS3(size(PRCS)) )
-ALLOCATE( II1(size(PRCS)), II2(size(PRCS)), II3(size(PRCS)) )
-ALLOCATE( IG1(size(PRCS)), IG2(size(PRCS)), IG3(size(PRCS)) )
-ALLOCATE( IH1(size(PRCS)), IH2(size(PRCS)), IH3(size(PRCS)) )
-ALLOCATE( GDEP(SIZE(PRCS,1),SIZE(PRCS,2)) )
-ALLOCATE( GSEDIMR(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( GSEDIMC(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( GSEDIMI(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( GSEDIMS(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( GSEDIMG(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( GSEDIMH(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
+#ifndef MNH_OPENACC
+ALLOCATE( IC1(IIJKU), IC2(IIJKU), IC3(IIJKU) )
+ALLOCATE( IR1(IIJKU), IR2(IIJKU), IR3(IIJKU) )
+ALLOCATE( IS1(IIJKU), IS2(IIJKU), IS3(IIJKU) )
+ALLOCATE( II1(IIJKU), II2(IIJKU), II3(IIJKU) )
+ALLOCATE( IG1(IIJKU), IG2(IIJKU), IG3(IIJKU) )
+ALLOCATE( IH1(IIJKU), IH2(IIJKU), IH3(IIJKU) )
+#else
+IIC1 = MNH_ALLOCATE_IT1D(IC1,IIJKU)
+IIC2 = MNH_ALLOCATE_IT1D(IC2,IIJKU)
+IIC3 = MNH_ALLOCATE_IT1D(IC3,IIJKU)
+IIR1 = MNH_ALLOCATE_IT1D(IR1,IIJKU)
+IIR2 = MNH_ALLOCATE_IT1D(IR2,IIJKU)
+IIR3 = MNH_ALLOCATE_IT1D(IR3,IIJKU)
+IIS1 = MNH_ALLOCATE_IT1D(IS1,IIJKU)
+IIS2 = MNH_ALLOCATE_IT1D(IS2,IIJKU)
+IIS3 = MNH_ALLOCATE_IT1D(IS3,IIJKU)
+III1 = MNH_ALLOCATE_IT1D(II1,IIJKU)
+III2 = MNH_ALLOCATE_IT1D(II2,IIJKU)
+III3 = MNH_ALLOCATE_IT1D(II3,IIJKU) 
+IIG1 = MNH_ALLOCATE_IT1D(IG1,IIJKU)
+IIG2 = MNH_ALLOCATE_IT1D(IG2,IIJKU)
+IIG3 = MNH_ALLOCATE_IT1D(IG3,IIJKU)
+IIH1 = MNH_ALLOCATE_IT1D(IH1,IIJKU)
+IIH2 = MNH_ALLOCATE_IT1D(IH2,IIJKU)
+IIH3 = MNH_ALLOCATE_IT1D(IH3,IIJKU)
+#endif
+ALLOCATE( GDEP(IIU,IJU) )
+ALLOCATE( GSEDIMR(IIU,IJU,IKU) )
+ALLOCATE( GSEDIMC(IIU,IJU,IKU) )
+ALLOCATE( GSEDIMI(IIU,IJU,IKU) )
+ALLOCATE( GSEDIMS(IIU,IJU,IKU) )
+ALLOCATE( GSEDIMG(IIU,IJU,IKU) )
+ALLOCATE( GSEDIMH(IIU,IJU,IKU) )
 ALLOCATE( ZRTMIN(SIZE(XRTMIN)) )
-ALLOCATE( ZCONC_TMP(SIZE(PRCS,1),SIZE(PRCS,2)) )
-ALLOCATE( ZOMPSEA  (SIZE(PRCS,1),SIZE(PRCS,2)) )
-ALLOCATE( ZTMP1_2D (SIZE(PRCS,1),SIZE(PRCS,2)) )
-ALLOCATE( ZTMP2_2D (SIZE(PRCS,1),SIZE(PRCS,2)) )
-ALLOCATE( ZTMP3_2D (SIZE(PRCS,1),SIZE(PRCS,2)) )
-ALLOCATE( ZTMP4_2D (SIZE(PRCS,1),SIZE(PRCS,2)) )
-ALLOCATE( ZCONC3D(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZRAY   (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZLBC   (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZFSEDC (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZPRCS  (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZPRRS  (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZPRSS  (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZPRGS  (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZPRHS  (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZW     (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
-ALLOCATE( ZWSED  (SIZE(PRCS,1),SIZE(PRCS,2),0:SIZE(PRCS,3)+1) )
+ALLOCATE( ZCONC_TMP(IIU,IJU) )
+ALLOCATE( ZOMPSEA  (IIU,IJU) )
+ALLOCATE( ZTMP1_2D (IIU,IJU) )
+ALLOCATE( ZTMP2_2D (IIU,IJU) )
+ALLOCATE( ZTMP3_2D (IIU,IJU) )
+ALLOCATE( ZTMP4_2D (IIU,IJU) )
+ALLOCATE( ZCONC3D(IIU,IJU,IKU) )
+ALLOCATE( ZRAY   (IIU,IJU,IKU) )
+ALLOCATE( ZLBC   (IIU,IJU,IKU) )
+ALLOCATE( ZFSEDC (IIU,IJU,IKU) )
+ALLOCATE( ZPRCS  (IIU,IJU,IKU) )
+ALLOCATE( ZPRRS  (IIU,IJU,IKU) )
+ALLOCATE( ZPRSS  (IIU,IJU,IKU) )
+ALLOCATE( ZPRGS  (IIU,IJU,IKU) )
+ALLOCATE( ZPRHS  (IIU,IJU,IKU) )
+ALLOCATE( ZW     (IIU,IJU,IKU) )
+ALLOCATE( ZWSED  (IIU,IJU,0:IKU+1) )
 
-!$acc data create( IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3, &
-!$acc &            GDEP, GSEDIMR, GSEDIMC,  GSEDIMI,  GSEDIMS,  GSEDIMG,  GSEDIMH,                           &
+!$acc data present( IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3) &
+!$acc &    create( GDEP, GSEDIMR, GSEDIMC,  GSEDIMI,  GSEDIMS,  GSEDIMG,  GSEDIMH,                           &
 !$acc &            ZRTMIN, ZCONC_TMP,                                                                        &
 !$acc &            ZOMPSEA, ZTMP1_2D, ZTMP2_2D, ZTMP3_2D, ZTMP4_2D, ZCONC3D,                                 &
 !$acc &            ZRAY, ZLBC, ZFSEDC,                                                                       &
@@ -686,6 +727,19 @@ END IF
 
 !$acc end data
 
+#ifndef MNH_OPENACC
+DEALLOCATE(IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3)
+#else
+CALL MNH_REL_IT1D(IIC1, IIC2, IIC3, IIR1, IIR2, IIR3, IIS1, IIS2, IIS3,&
+                  III1, III2, III3, IIG1, IIG2, IIG3, IIH1, IIH2, IIH3)
+#endif
+
+DEALLOCATE(GDEP, GSEDIMR, GSEDIMC,  GSEDIMI,  GSEDIMS,  GSEDIMG,  GSEDIMH)
+DEALLOCATE(ZRTMIN)
+DEALLOCATE(ZCONC_TMP,ZOMPSEA, ZTMP1_2D, ZTMP2_2D, ZTMP3_2D, ZTMP4_2D, ZCONC3D)
+DEALLOCATE(ZRAY, ZLBC, ZFSEDC,ZPRCS, ZPRRS, ZPRSS, ZPRGS, ZPRHS, ZW)
+DEALLOCATE(ZWSED)
+
 !$acc end data
 
 END SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT
-- 
GitLab