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