From 3f5363599fff283df3b7836a1c287e241a974cf9 Mon Sep 17 00:00:00 2001 From: Wautelet Philippe <waup@aeropc45.aero.obs-mip.fr> Date: Tue, 26 Oct 2021 16:28:08 +0200 Subject: [PATCH] Philippe 26/10/2021: OpenACC: use GT1DFLAT and ZT1DFLAT --- src/MNH/ice4_fast_rg.f90 | 102 ++++++++++++++++++++------- src/MNH/ice4_fast_rs.f90 | 101 +++++++++++++++++++------- src/MNH/ice4_sedimentation_split.f90 | 65 +++++++++++++---- src/MNH/ice4_tendencies.f90 | 90 +++++++++++++++++++++-- 4 files changed, 284 insertions(+), 74 deletions(-) diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90 index 94a782ef7..5e04585a9 100644 --- a/src/MNH/ice4_fast_rg.f90 +++ b/src/MNH/ice4_fast_rg.f90 @@ -106,13 +106,16 @@ USE MODD_RAIN_ICE_PARAM, ONLY: NDRYLBDAG,NDRYLBDAR,NDRYLBDAS,X0DEPG,X1DEPG,XCOLE XDRYINTP1R,XDRYINTP1S,XDRYINTP2G,XDRYINTP2R,XDRYINTP2S,XEX0DEPG,XEX1DEPG,XEXICFRR, & XEXRCFRI,XFCDRYG,XFIDRYG,XFRDRYG,XFSDRYG,XICFRR,XKER_RDRYG,XKER_SDRYG,XLBRDRYG1, & XLBRDRYG2,XLBRDRYG3,XLBSDRYG1,XLBSDRYG2,XLBSDRYG3,XRCFRI -! + +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_IT1DP, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1D +#endif +USE MODE_MPPDB + #ifdef MNH_BITREP USE MODI_BITREP #endif -! -USE MODE_MPPDB -! + IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -174,14 +177,21 @@ INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRR INTEGER :: IGDRY INTEGER :: ISIZE INTEGER :: IDX, JJ, JL -INTEGER, DIMENSION(:), allocatable :: I1 -INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2 -LOGICAL, DIMENSION(:), allocatable :: GDRY -REAL, DIMENSION(:), allocatable :: ZDRY, ZDRYG, ZMASK -REAL, DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3 -REAL, DIMENSION(:), allocatable :: ZZW, & - ZRDRYG_INIT, & !Initial dry growth rate of the graupeln - ZRWETG_INIT !Initial wet growth rate of the graupeln +INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: I1 +INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: IVEC1, IVEC2 +LOGICAL, DIMENSION(:), POINTER, CONTIGUOUS :: GDRY +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZDRY, ZDRYG, ZMASK +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZVEC1, ZVEC2, ZVEC3 +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZZW, & + ZRDRYG_INIT, & !Initial dry growth rate of the graupeln + ZRWETG_INIT !Initial wet growth rate of the graupeln +#ifdef MNH_OPENACC +INTEGER :: II1, IIVEC1, IIVEC2 +INTEGER :: IDXGDRY +INTEGER :: IZDRY, IZDRYG, IZMASK +INTEGER :: IZVEC1, IZVEC2, IZVEC3 +INTEGER :: IZZW, IZRDRYG_INIT, IZRWETG_INIT +#endif ! !------------------------------------------------------------------------------- ! @@ -232,21 +242,41 @@ END IF ISIZE = Size( PRHODREF ) -allocate( i1 ( size( prhodref ) ) ) -allocate( ivec1 ( size( prhodref ) ) ) -allocate( ivec2 ( size( prhodref ) ) ) -allocate( gdry ( size( prhodref ) ) ) -allocate( zdry ( size( prhodref ) ) ) -allocate( zdryg ( size( prhodref ) ) ) -allocate( zmask ( size( prhodref ) ) ) -allocate( zvec1 ( size( prhodref ) ) ) -allocate( zvec2 ( size( prhodref ) ) ) -allocate( zvec3 ( size( prhodref ) ) ) -allocate( zzw ( size( prhodref ) ) ) -allocate( zrdryg_init( size( prhodref ) ) ) -allocate( zrwetg_init( size( prhodref ) ) ) - -!$acc data create(I1,IVEC1,IVEC2,GDRY, ZDRY, ZDRYG, ZMASK, ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYG_INIT,ZRWETG_INIT) +#ifndef MNH_OPENACC +allocate( i1 ( isize ) ) +allocate( ivec1 ( isize ) ) +allocate( ivec2 ( isize ) ) +allocate( gdry ( isize ) ) +allocate( zdry ( isize ) ) +allocate( zdryg ( isize ) ) +allocate( zmask ( isize ) ) +allocate( zvec1 ( isize ) ) +allocate( zvec2 ( isize ) ) +allocate( zvec3 ( isize ) ) +allocate( zzw ( isize ) ) +allocate( zrdryg_init( isize ) ) +allocate( zrwetg_init( isize ) ) +#else +II1 = MNH_ALLOCATE_IT1DP( I1, ISIZE ) +IIVEC1 = MNH_ALLOCATE_IT1DP( IVEC1, ISIZE ) +IIVEC2 = MNH_ALLOCATE_IT1DP( IVEC2, ISIZE ) + +IDXGDRY = MNH_ALLOCATE_FLAT( gdry, isize ) + +IZDRY = MNH_ALLOCATE_FLAT( zdry, isize ) +IZDRYG = MNH_ALLOCATE_FLAT( zdryg, isize ) +IZMASK = MNH_ALLOCATE_FLAT( zmask, isize ) +IZVEC1 = MNH_ALLOCATE_FLAT( zvec1, isize ) +IZVEC2 = MNH_ALLOCATE_FLAT( zvec2, isize ) +IZVEC3 = MNH_ALLOCATE_FLAT( zvec3, isize ) +IZZW = MNH_ALLOCATE_FLAT( zzw, isize ) +IZRDRYG_INIT = MNH_ALLOCATE_FLAT( zrdryg_init, isize ) +IZRWETG_INIT = MNH_ALLOCATE_FLAT( zrwetg_init, isize ) +#endif + +!$acc data create ( IGDRY ) & +!$acc& present( I1, IVEC1, IVEC2, GDRY, ZDRY, ZDRYG, ZMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZRDRYG_INIT, ZRWETG_INIT ) & +!$acc& copyin ( XRTMIN ) ! !* 6.1 rain contact freezing @@ -791,6 +821,24 @@ END IF !$acc end data +#ifdef MNH_OPENACC +CALL MNH_RELEASE_FLAT( IZRWETG_INIT ) +CALL MNH_RELEASE_FLAT( IZRDRYG_INIT ) +CALL MNH_RELEASE_FLAT( IZZW ) +CALL MNH_RELEASE_FLAT( IZVEC3 ) +CALL MNH_RELEASE_FLAT( IZVEC2 ) +CALL MNH_RELEASE_FLAT( IZVEC1 ) +CALL MNH_RELEASE_FLAT( IZMASK ) +CALL MNH_RELEASE_FLAT( IZDRYG ) +CALL MNH_RELEASE_FLAT( IZDRY ) + +CALL MNH_REL_GT1DFLAT( IDXGDRY ) + +CALL MNH_REL_IT1D( IIVEC2 ) +CALL MNH_REL_IT1D( IIVEC1 ) +CALL MNH_REL_IT1D( II1 ) +#endif + !$acc end data END SUBROUTINE ICE4_FAST_RG diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90 index 6b48adced..7acd05b48 100644 --- a/src/MNH/ice4_fast_rs.f90 +++ b/src/MNH/ice4_fast_rs.f90 @@ -92,12 +92,16 @@ USE MODD_RAIN_ICE_PARAM, ONLY: NACCLBDAR,NACCLBDAS,NGAMINC,X0DEPS,X1DEPS,XACCINT XFSACCRG,XFSCVMG,XGAMINC_RIM1,XGAMINC_RIM2,XGAMINC_RIM4,XKER_RACCS, & XKER_RACCSS,XKER_SACCRG,XLBRACCS1,XLBRACCS2,XLBRACCS3,XLBSACCR1,XLBSACCR2,XLBSACCR3, & XRIMINTP1,XRIMINTP2,XSRIMCG,XSRIMCG2,XSRIMCG3 -! + +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_IT1DP, MNH_RELEASE_FLAT, MNH_REL_GT1DFLAT, MNH_REL_IT1D +#endif +USE MODE_MPPDB + #ifdef MNH_BITREP USE MODI_BITREP #endif ! -USE MODE_MPPDB ! IMPLICIT NONE ! @@ -143,13 +147,19 @@ INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5, INTEGER :: IGRIM, IGACC INTEGER :: ISIZE INTEGER :: IDX, JJ, JL -INTEGER, DIMENSION(:), allocatable :: I1 -INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2 -LOGICAL, DIMENSION(:), allocatable :: GRIM, GACC -REAL, DIMENSION(:), allocatable :: ZRIM, ZACC, ZMASK -REAL, DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3 -REAL, DIMENSION(:), allocatable :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE -! real, DIMENSION(:), allocatable :: xprov +INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: I1 +INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: IVEC1, IVEC2 +LOGICAL, DIMENSION(:), POINTER, CONTIGUOUS :: GRIM, GACC +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZRIM, ZACC, ZMASK +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZVEC1, ZVEC2, ZVEC3 +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE +#ifdef MNH_OPENACC +INTEGER :: II1, IIVEC1, IIVEC2 +INTEGER :: IDXGRIM, IDXGACC +INTEGER :: IZRIM, IZACC, IZMASK +INTEGER :: IZVEC1, IZVEC2, IZVEC3 +INTEGER :: IZZW, IZZW2, IZZW6, IZFREEZ_RATE +#endif !$acc data present( PCOMPUTE, PRHODREF, PLVFACT, PLSFACT, PPRES, PDV, PKA, PCJ, & !$acc& PLBDAR, PLBDAS, PT, PRVT, PRCT, PRRT, PRST, PRIAGGS, PRCRIMSS, PRCRIMSG, PRSRIMCG, & @@ -190,23 +200,44 @@ END IF ISIZE = Size( PRHODREF ) -allocate( i1 ( size( prhodref ) ) ) -allocate( ivec1 ( size( prhodref ) ) ) -allocate( ivec2 ( size( prhodref ) ) ) -allocate( grim ( size( prhodref ) ) ) -allocate( gacc ( size( prhodref ) ) ) -allocate( zrim ( size( prhodref ) ) ) -allocate( zacc ( size( prhodref ) ) ) -allocate( zmask ( size( prhodref ) ) ) -allocate( zvec1 ( size( prhodref ) ) ) -allocate( zvec2 ( size( prhodref ) ) ) -allocate( zvec3 ( size( prhodref ) ) ) -allocate( zzw ( size( prhodref ) ) ) -allocate( zzw2 ( size( prhodref ) ) ) -allocate( zzw6 ( size( prhodref ) ) ) -allocate( zfreez_rate ( size( prhodref ) ) ) +#ifndef MNH_OPENACC +allocate( i1 ( isize ) ) +allocate( ivec1 ( isize ) ) +allocate( ivec2 ( isize ) ) +allocate( grim ( isize ) ) +allocate( gacc ( isize ) ) +allocate( zrim ( isize ) ) +allocate( zacc ( isize ) ) +allocate( zmask ( isize ) ) +allocate( zvec1 ( isize ) ) +allocate( zvec2 ( isize ) ) +allocate( zvec3 ( isize ) ) +allocate( zzw ( isize ) ) +allocate( zzw2 ( isize ) ) +allocate( zzw6 ( isize ) ) +allocate( zfreez_rate ( isize ) ) +#else +II1 = MNH_ALLOCATE_IT1DP( I1, ISIZE ) +IIVEC1 = MNH_ALLOCATE_IT1DP( IVEC1, ISIZE ) +IIVEC2 = MNH_ALLOCATE_IT1DP( IVEC2, ISIZE ) + +IDXGRIM = MNH_ALLOCATE_FLAT( grim, ISIZE ) +IDXGACC = MNH_ALLOCATE_FLAT( gacc, ISIZE ) + +IZRIM = MNH_ALLOCATE_FLAT( zrim, ISIZE ) +IZACC = MNH_ALLOCATE_FLAT( zacc, ISIZE ) +IZMASK = MNH_ALLOCATE_FLAT( zmask, ISIZE ) +IZVEC1 = MNH_ALLOCATE_FLAT( zvec1, ISIZE ) +IZVEC2 = MNH_ALLOCATE_FLAT( zvec2, ISIZE ) +IZVEC3 = MNH_ALLOCATE_FLAT( zvec3, ISIZE ) +IZZW = MNH_ALLOCATE_FLAT( zzw, ISIZE ) +IZZW2 = MNH_ALLOCATE_FLAT( zzw2, ISIZE ) +IZZW6 = MNH_ALLOCATE_FLAT( zzw6, ISIZE ) +IZFREEZ_RATE = MNH_ALLOCATE_FLAT( zfreez_rate, ISIZE ) +#endif ! -!$acc data create( I1, IVEC1, IVEC2, GRIM, GACC, ZRIM, ZACC, ZMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZZW2, ZZW6, ZFREEZ_RATE ) +!$acc data present( I1, IVEC1, IVEC2, GRIM, GACC, ZRIM, ZACC, ZMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZZW2, ZZW6, ZFREEZ_RATE ) & +!$acc& copyin ( XRTMIN ) ! !* 5.0 maximum freezing rate @@ -693,6 +724,26 @@ END IF !$acc end data +#ifdef MNH_OPENACC +CALL MNH_RELEASE_FLAT( IZFREEZ_RATE ) +CALL MNH_RELEASE_FLAT( IZZW6 ) +CALL MNH_RELEASE_FLAT( IZZW2 ) +CALL MNH_RELEASE_FLAT( IZZW ) +CALL MNH_RELEASE_FLAT( IZVEC3 ) +CALL MNH_RELEASE_FLAT( IZVEC2 ) +CALL MNH_RELEASE_FLAT( IZVEC1 ) +CALL MNH_RELEASE_FLAT( IZMASK ) +CALL MNH_RELEASE_FLAT( IZACC ) +CALL MNH_RELEASE_FLAT( IZRIM ) + +CALL MNH_REL_GT1DFLAT( IDXGACC ) +CALL MNH_REL_GT1DFLAT( IDXGRIM ) + +CALL MNH_REL_IT1D( IIVEC2 ) +CALL MNH_REL_IT1D( IIVEC1 ) +CALL MNH_REL_IT1D( II1 ) +#endif + !$acc end data END SUBROUTINE ICE4_FAST_RS diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90 index dba66e7db..8eb745cb7 100644 --- a/src/MNH/ice4_sedimentation_split.f90 +++ b/src/MNH/ice4_sedimentation_split.f90 @@ -401,7 +401,16 @@ SUBROUTINE INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT,KKB,KKTB,KKTE,KKT,KKL,KRR USE MODD_CST, ONLY: XCPD,XP00,XRD USE MODD_RAIN_ICE_DESCR, ONLY: XCC,XCEXVT,XDC,XLBEXC,XRTMIN USE MODD_RAIN_ICE_PARAM, ONLY: XEXCSEDI,XEXSEDG,XEXSEDH,XEXSEDR,XEXSEDS,XFSEDG,XFSEDH,XFSEDI,XFSEDR,XFSEDS -! + +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_IT1D, MNH_ALLOCATE_ZT1D, & + MNH_ALLOCATE_ZT2D, MNH_ALLOCATE_ZT3DP, & + MNH_RELEASE_FLAT, MNH_REL_IT1D, MNH_REL_ZT1D, MNH_REL_ZT3D + +#endif +use mode_mppdb +use mode_msg + #ifdef MNH_BITREP USE MODI_BITREP #endif @@ -428,19 +437,23 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT), OPTIONAL :: PFPR ! upper-air pre ! !* 0.2 declaration of local variables ! -character(len=10) :: yspe ! String for error message -INTEGER :: IDX, ISEDIM -INTEGER :: JI, JJ, JK, JL -INTEGER, DIMENSION(:), allocatable :: I1,I2,I3 ! Used to replace the COUNT -LOGICAL :: GPRESENT_PFPR -REAL :: ZINVTSTEP -REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC -REAL :: ZFSED, ZEXSED -REAL, DIMENSION(:,:), allocatable :: ZMRCHANGE -REAL, DIMENSION(:,:), allocatable :: ZMAX_TSTEP ! Maximum CFL in column -REAL, DIMENSION(:), allocatable :: ZRSMIN -REAL, DIMENSION(:,:), allocatable :: ZREMAINT ! Remaining time until the timestep end -REAL, DIMENSION(:,:,:), allocatable :: ZWSED ! Sedimentation fluxes +character(len=10) :: yspe ! String for error message +INTEGER :: IDX, ISEDIM +INTEGER :: JI, JJ, JK, JL +#ifdef MNH_OPENACC +INTEGER :: II1, II2, II3 +INTEGER :: IZMRCHANGE, IZMAX_TSTEP, IZRSMIN, IZREMAINT, IZWSED +#endif +INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: I1, I2, I3 ! Used to replace the COUNT +LOGICAL :: GPRESENT_PFPR +REAL :: ZINVTSTEP +REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC +REAL :: ZFSED, ZEXSED +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZMRCHANGE +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZMAX_TSTEP ! Maximum CFL in column +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZRSMIN +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZREMAINT ! Remaining time until the timestep end +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZWSED ! Sedimentation fluxes !$acc data present(PRHODREF,POORHODZ,PDZZ,PPABST,PTHT,PRXT,PRXS,PINPRX,PPRXS, & !$acc& PRAY,PLBC,PFSEDC,PCONC3D,PFPR) @@ -463,6 +476,7 @@ IF (MPPDB_INITIALIZED) THEN IF (PRESENT(PFPR)) CALL MPPDB_CHECK(PFPR,"INTERNAL_SEDIM_SPLI beg:PFPR") END IF +#ifndef MNH_OPENACC allocate( i1(kit * kjt * kkt ) ) allocate( i2(kit * kjt * kkt ) ) allocate( i3(kit * kjt * kkt ) ) @@ -475,8 +489,22 @@ allocate( zrsmin(size( xrtmin ) ) ) allocate( zremaint(size( prhodref, 1 ), size( prhodref, 2 ) ) ) allocate( zwsed(size( prhodref, 1 ), size( prhodref, 2 ), 0 : size( prhodref, 3 ) + 1 ) ) +#else +II1 = MNH_ALLOCATE_IT1D( i1, kit * kjt * kkt ) +II2 = MNH_ALLOCATE_IT1D( i2, kit * kjt * kkt ) +II3 = MNH_ALLOCATE_IT1D( i3, kit * kjt * kkt ) -!$acc data create( i1, i2, i3, zmrchange, zmax_tstep, zrsmin, zremaint, zwsed ) +IZMRCHANGE = MNH_ALLOCATE_ZT2D( zmrchange, kit, kjt ) +IZMAX_TSTEP = MNH_ALLOCATE_ZT2D( zmax_tstep, kit, kjt ) + +IZRSMIN = MNH_ALLOCATE_FLAT( zrsmin, Size( xrtmin ) ) + +IZREMAINT = MNH_ALLOCATE_ZT2D( zremaint, Size( prhodref, 1 ), Size( prhodref, 2 ) ) + +IZWSED = MNH_ALLOCATE_FLAT( zwsed, 1, Size( prhodref, 1 ), 1, Size( prhodref, 2 ), 0, Size( prhodref, 3 ) + 1 ) +#endif + +!$acc data present( i1, i2, i3, zmrchange, zmax_tstep, zrsmin, zremaint, zwsed ) ! !------------------------------------------------------------------------------- @@ -685,6 +713,13 @@ END IF !$acc end data +#ifdef MNH_OPENACC +CALL MNH_REL_IT1D( ii1, ii2, ii3 ) +CALL MNH_RELEASE_FLAT( IZWSED ) +CALL MNH_RELEASE_FLAT( IZRSMIN ) +CALL MNH_REL_ZT3D( IZMRCHANGE, IZMAX_TSTEP, IZREMAINT ) +#endif + !$acc end data END SUBROUTINE INTERNAL_SEDIM_SPLI diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90 index df8e68246..5f2fea0d1 100644 --- a/src/MNH/ice4_tendencies.f90 +++ b/src/MNH/ice4_tendencies.f90 @@ -184,7 +184,11 @@ USE MODD_PARAMETERS, ONLY: XUNDEF USE MODD_PARAM_ICE, ONLY: CSNOWRIMING USE MODD_RAIN_ICE_DESCR, ONLY: XLBDAS_MAX,XLBEXG,XLBEXH,XLBEXR,XLBEXS,XLBG,XLBH,XLBR,XLBS,XRTMIN USE MODD_RAIN_ICE_PARAM, ONLY: XSCFAC -! + +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_FLAT, MNH_ALLOCATE_ZT3D, MNH_RELEASE_FLAT, MNH_REL_ZT3D +#endif + USE MODI_ICE4_COMPUTE_PDF USE MODI_ICE4_FAST_RG USE MODI_ICE4_FAST_RH @@ -319,16 +323,27 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction ! INTEGER :: IDX,JI,JJ,JK,JL INTEGER :: ISIZE -LOGICAL, DIMENSION(:), allocatable :: GLDCOMPUTE -REAL, DIMENSION(:), allocatable :: ZWETG ! 1. if graupel growths in wet mode, 0. otherwise -REAL, DIMENSION(:), allocatable :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & +LOGICAL, DIMENSION(:), POINTER, CONTIGUOUS :: GLDCOMPUTE +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZWETG ! 1. if graupel growths in wet mode, 0. otherwise +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & & ZT, ZTHT, ZRHT, & & ZZW, & & ZKA, ZDV, ZAI, ZCJ, & & ZRF, & & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, & & ZRGSI, ZRGSI_MR -REAL, DIMENSION(:,:,:), allocatable :: ZRRT3D, ZRST3D, ZRGT3D, ZRHT3D +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRRT3D, ZRST3D, ZRGT3D, ZRHT3D +#ifdef MNH_OPENACC +INTEGER :: IZWETG +INTEGER :: IZRVT, IZRCT, IZRRT, IZRIT, IZRST, IZRGT, & + IZT, IZTHT, IZRHT, & + IZZW, & + IZKA, IZDV, IZAI, IZCJ, & + IZRF, & + IZLBDAR, IZLBDAS, IZLBDAG, IZLBDAH, IZLBDAR_RF, & + IZRGSI, IZRGSI_MR +INTEGER :: IZRRT3D, IZRST3D, IZRGT3D, IZRHT3D +#endif ! !$acc data present(PCOMPUTE,PEXN,PRHODREF,PLVFACT,PLSFACT,K1,K2,K3,PPRES,PCF,PCIT,PT,PTHT, & !$acc& PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRHT,PSIGMA_RC,PRVHENI_MR,PRRHONG_MR,PRIMLTC_MR, & @@ -387,6 +402,7 @@ END IF isize = size( pcompute ) +#ifndef MNH_OPENACC allocate( gldcompute(isize ) ) allocate( zwetg (isize ) ) allocate( zrvt (isize ) ) @@ -416,9 +432,42 @@ allocate( zrrt3d(kit, kjt, kkt ) ) allocate( zrst3d(kit, kjt, kkt ) ) allocate( zrgt3d(kit, kjt, kkt ) ) allocate( zrht3d(kit, kjt, kkt ) ) +#else +allocate( gldcompute(isize ) ) +IZWETG = MNH_ALLOCATE_FLAT( zwetg, isize ) +IZRVT = MNH_ALLOCATE_FLAT( zrvt, isize ) +IZRCT = MNH_ALLOCATE_FLAT( zrct, isize ) +IZRRT = MNH_ALLOCATE_FLAT( zrrt, isize ) +IZRIT = MNH_ALLOCATE_FLAT( zrit, isize ) +IZRST = MNH_ALLOCATE_FLAT( zrst, isize ) +IZRGT = MNH_ALLOCATE_FLAT( zrgt, isize ) +IZT = MNH_ALLOCATE_FLAT( zt, isize ) +IZTHT = MNH_ALLOCATE_FLAT( ztht, isize ) +IZRHT = MNH_ALLOCATE_FLAT( zrht, isize ) +IZZW = MNH_ALLOCATE_FLAT( zzw, isize ) +IZKA = MNH_ALLOCATE_FLAT( zka, isize ) +IZDV = MNH_ALLOCATE_FLAT( zdv, isize ) +IZAI = MNH_ALLOCATE_FLAT( zai, isize ) +IZCJ = MNH_ALLOCATE_FLAT( zcj, isize ) +IZRF = MNH_ALLOCATE_FLAT( zrf, isize ) +IZLBDAR = MNH_ALLOCATE_FLAT( zlbdar, isize ) +IZLBDAS = MNH_ALLOCATE_FLAT( zlbdas, isize ) +IZLBDAG = MNH_ALLOCATE_FLAT( zlbdag, isize ) +IZLBDAH = MNH_ALLOCATE_FLAT( zlbdah, isize ) +IZLBDAR_RF = MNH_ALLOCATE_FLAT( zlbdar_rf, isize ) +IZRGSI = MNH_ALLOCATE_FLAT( zrgsi, isize ) +IZRGSI_MR = MNH_ALLOCATE_FLAT( zrgsi_mr, isize ) + +IZRRT3D = MNH_ALLOCATE_ZT3D( zrrt3d, kit, kjt, kkt ) +IZRST3D = MNH_ALLOCATE_ZT3D( zrst3d, kit, kjt, kkt ) +IZRGT3D = MNH_ALLOCATE_ZT3D( zrgt3d, kit, kjt, kkt ) +IZRHT3D = MNH_ALLOCATE_ZT3D( zrht3d, kit, kjt, kkt ) +#endif -!$acc data create(GLDCOMPUTE, ZWETG,ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZT,ZTHT,ZRHT,ZZW,ZKA,ZDV,ZAI,ZCJ,ZRF, & -!$acc& ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,ZLBDAR_RF,ZRGSI,ZRGSI_MR,ZRRT3D,ZRST3D,ZRGT3D,ZRHT3D) +!$acc data create( GLDCOMPUTE ) & +!$acc& present( ZWETG,ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZT,ZTHT,ZRHT,ZZW,ZKA,ZDV,ZAI,ZCJ, & +!$acc& ZRF,ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,ZLBDAR_RF,ZRGSI,ZRGSI_MR, & +!$acc& ZRRT3D,ZRST3D,ZRGT3D,ZRHT3D ) !$acc kernels PA_TH(:)=0. @@ -890,6 +939,33 @@ END IF !$acc end data +#ifdef MNH_OPENACC +CALL MNH_REL_ZT3D( IZRRT3D, IZRST3D, IZRGT3D, IZRHT3D ) +CALL MNH_RELEASE_FLAT( IZRGSI_MR ) +CALL MNH_RELEASE_FLAT( IZRGSI ) +CALL MNH_RELEASE_FLAT( IZLBDAR_RF ) +CALL MNH_RELEASE_FLAT( IZLBDAH ) +CALL MNH_RELEASE_FLAT( IZLBDAG ) +CALL MNH_RELEASE_FLAT( IZLBDAS ) +CALL MNH_RELEASE_FLAT( IZLBDAR ) +CALL MNH_RELEASE_FLAT( IZRF ) +CALL MNH_RELEASE_FLAT( IZCJ ) +CALL MNH_RELEASE_FLAT( IZAI ) +CALL MNH_RELEASE_FLAT( IZDV ) +CALL MNH_RELEASE_FLAT( IZKA ) +CALL MNH_RELEASE_FLAT( IZZW ) +CALL MNH_RELEASE_FLAT( IZRHT ) +CALL MNH_RELEASE_FLAT( IZTHT ) +CALL MNH_RELEASE_FLAT( IZT ) +CALL MNH_RELEASE_FLAT( IZRGT ) +CALL MNH_RELEASE_FLAT( IZRST ) +CALL MNH_RELEASE_FLAT( IZRIT ) +CALL MNH_RELEASE_FLAT( IZRRT ) +CALL MNH_RELEASE_FLAT( IZRCT ) +CALL MNH_RELEASE_FLAT( IZRVT ) +CALL MNH_RELEASE_FLAT( IZWETG ) +#endif + !$acc end data END SUBROUTINE ICE4_TENDENCIES -- GitLab