From c53a881a38a99ab0b0a6e7c37b0941b18912fc95 Mon Sep 17 00:00:00 2001 From: Juan ESCOBAR <juan.escobar@aero.obs-mip.fr> Date: Mon, 13 Feb 2023 17:55:19 +0100 Subject: [PATCH] Juan 13/02/2023: MNH modif for compile with sourceryg/2022.09-7-orig+OPENACC + optimization for CRAY ftn --- src/MNH/advection_metsv.f90 | 22 +++-- src/MNH/advection_uvw.f90 | 8 +- src/MNH/advection_uvw_cen.f90 | 2 +- src/MNH/condensation.f90 | 14 +-- src/MNH/get_halo.f90 | 8 +- src/MNH/gradient_m.f90 | 4 +- src/MNH/gradient_u.f90 | 20 ++-- src/MNH/gradient_v.f90 | 20 ++-- src/MNH/ice4_compute_pdf.f90 | 35 +++---- src/MNH/ice4_fast_rg.f90 | 52 +++++----- src/MNH/ice4_fast_rs.f90 | 23 ++--- src/MNH/ice4_nucleation.f90 | 25 ++--- src/MNH/ice4_rsrimcg_old.f90 | 20 ++-- src/MNH/ice4_sedimentation_split.f90 | 16 ++- src/MNH/ice4_tendencies.f90 | 65 +++++------- src/MNH/ice4_warm.f90 | 16 ++- src/MNH/mode_prandtl.f90 | 16 +-- src/MNH/rain_ice.f90 | 55 +++++------ src/MNH/rain_ice_fast_rg.f90 | 57 +++++------ src/MNH/rain_ice_fast_rs.f90 | 54 +++++----- src/MNH/rain_ice_nucleation.f90 | 82 +++++++--------- src/MNH/rain_ice_red.f90 | 73 ++++++++------ src/MNH/rain_ice_sedimentation_split.f90 | 37 ++++--- src/MNH/rain_ice_slow.f90 | 28 +++--- src/MNH/rain_ice_warm.f90 | 30 +++--- src/MNH/rotate_wind.f90 | 17 ++-- src/MNH/sources_neg_correct.f90 | 16 +-- src/MNH/tke_eps_sources.f90 | 37 ++++--- src/MNH/tridiag_thermo.f90 | 93 ++++++------------ src/MNH/tridiag_tke.f90 | 66 ++++--------- src/MNH/turb.f90 | 96 +++++++++--------- src/MNH/turb_hor_thermo_flux.f90 | 96 +++++++++--------- src/MNH/turb_hor_tke.f90 | 52 +++++----- src/MNH/turb_hor_uw.f90 | 44 ++++----- src/MNH/turb_hor_vw.f90 | 44 ++++----- src/MNH/turb_ver.f90 | 4 +- src/MNH/turb_ver_dyn_flux.f90 | 120 +++++++++++------------ src/MNH/turb_ver_thermo_corr.f90 | 68 ++++++------- src/MNH/turb_ver_thermo_flux.f90 | 44 ++++----- 39 files changed, 734 insertions(+), 845 deletions(-) diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 408861cdd..90ecf0437 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -573,16 +573,16 @@ IF (.NOT. L1D) THEN IF (.NOT. L2D) THEN !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) ZCFL(JI,JJ,JK) = SQRT(BR_P2(ZCFLU(JI,JJ,JK))+BR_P2(ZCFLV(JI,JJ,JK))+BR_P2(ZCFLW(JI,JJ,JK))) - END DO + !$mnh_end_do() !$acc end kernels ELSE !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) ZCFL(JI,JJ,JK) = SQRT(BR_P2(ZCFLU(JI,JJ,JK))+BR_P2(ZCFLW(JI,JJ,JK))) - END DO + !$mnh_end_do() !$acc end kernels END IF #endif @@ -594,9 +594,9 @@ ELSE ZCFL(:,:,:) = SQRT(ZCFLW(:,:,:)**2) #else !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) ZCFL(JI,JJ,JK) = SQRT(BR_P2(ZCFLW(JI,JJ,JK))) - END DO + !$mnh_end_do() #endif !$acc end kernels END IF @@ -673,11 +673,13 @@ ZCFLW_MAX = MAXVAL(ZCFLW(IIB:IIE,IJB:IJE,IKB:IKE)) ZCFL_MAX = MAXVAL(ZCFL (IIB:IIE,IJB:IJE,IKB:IKE)) !$acc end kernels ! +#ifndef MPIVIDE CALL MPI_ALLREDUCE(MPI_IN_PLACE,ZCFLU_MAX,1,MNHREAL_MPI,MPI_MAX,NMNH_COMM_WORLD,IINFO_ll) CALL MPI_ALLREDUCE(MPI_IN_PLACE,ZCFLV_MAX,1,MNHREAL_MPI,MPI_MAX,NMNH_COMM_WORLD,IINFO_ll) CALL MPI_ALLREDUCE(MPI_IN_PLACE,ZCFLW_MAX,1,MNHREAL_MPI,MPI_MAX,NMNH_COMM_WORLD,IINFO_ll) CALL MPI_ALLREDUCE(MPI_IN_PLACE,ZCFL_MAX,1,MNHREAL_MPI,MPI_MAX,NMNH_COMM_WORLD,IINFO_ll) #endif +#endif ! WRITE(ILUOUT,FMT='(A24,F10.2,A5,F10.2,A5,F10.2,A9,F10.2)') & 'Max. CFL number for U : ',ZCFLU_MAX, & @@ -926,17 +928,17 @@ DO JSPL=1,KSPLIT END IF !$acc kernels !$acc_nv loop independent collapse(4) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU, JR=1:KRR ) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU, JR=1:KRR ) ZR(JI,JJ,JK,JR) = ZR(JI,JJ,JK,JR) + ( ZRRS_PPM(JI,JJ,JK,JR) + ZRRS_OTHER(JI,JJ,JK,JR) + PRRS_CLD(JI,JJ,JK,JR) ) & * ZTSTEP_PPM / PRHODJ(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc loop seq DO JSV = 1, KSV !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZSV(JI,JJ,JK,JSV) = ZSV(JI,JJ,JK,JSV) + ( ZRSVS_PPM(JI,JJ,JK,JSV) + ZRSVS_OTHER(JI,JJ,JK,JSV) + & PRSVS_CLD(JI,JJ,JK,JSV) ) * ZTSTEP_PPM / PRHODJ(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT END DO !$acc end kernels END IF diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90 index 3603c22ca..ef92cc975 100644 --- a/src/MNH/advection_uvw.f90 +++ b/src/MNH/advection_uvw.f90 @@ -438,11 +438,11 @@ DO JSPL=1,ISPLIT #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT (JI=1:IIU , JJ=1:IJU , JK=1:IKU ) +!$mnh_do_concurrent (JI=1:IIU , JJ=1:IJU , JK=1:IKU ) PRUS(JI,JJ,JK) = PRUS(JI,JJ,JK) + ZRUS_ADV(JI,JJ,JK) / ISPLIT PRVS(JI,JJ,JK) = PRVS(JI,JJ,JK) + ZRVS_ADV(JI,JJ,JK) / ISPLIT PRWS(JI,JJ,JK) = PRWS(JI,JJ,JK) + ZRWS_ADV(JI,JJ,JK) / ISPLIT -END DO +!$mnh_end_do() !$acc end kernels IF (JSPL<ISPLIT) THEN @@ -452,14 +452,14 @@ END DO ! ! !$acc_nv loop independent collapse(3) -DO CONCURRENT (JI=1:IIU , JJ=1:IJU , JK=1:IKU ) +!$mnh_do_concurrent (JI=1:IIU , JJ=1:IJU , JK=1:IKU ) ZU(JI,JJ,JK) = ZU(JI,JJ,JK) + ZTSTEP / ZMXM_RHODJ(JI,JJ,JK) * & (ZRUS_OTHER(JI,JJ,JK) + ZRUS_ADV(JI,JJ,JK)) ZV(JI,JJ,JK) = ZV(JI,JJ,JK) + ZTSTEP / ZMYM_RHODJ(JI,JJ,JK) * & (ZRVS_OTHER(JI,JJ,JK) + ZRVS_ADV(JI,JJ,JK)) ZW(JI,JJ,JK) = ZW(JI,JJ,JK) + ZTSTEP / ZMZM_RHODJ(JI,JJ,JK) * & (ZRWS_OTHER(JI,JJ,JK) + ZRWS_ADV(JI,JJ,JK)) -END DO +!$mnh_end_do() !$acc end kernels END IF ! diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90 index 69f0e1206..129a0f688 100644 --- a/src/MNH/advection_uvw_cen.f90 +++ b/src/MNH/advection_uvw_cen.f90 @@ -381,7 +381,7 @@ ELSEIF (HUVW_ADV_SCHEME=='CEN4TH') THEN END IF ! !$acc kernels present(ZRUS,ZRVS,ZRWS,ZMXM_RHODJ,ZMYM_RHODJ,ZMZM_RHODJ) & -!$acc present_cr(PRUS,PRVS,PRWS,PDUM,PDWM) +!$acc & present_cr(PRUS,PRVS,PRWS,PDUM,PDWM) ZUS(:,:,:) = ZRUS(:,:,:)/ZMXM_RHODJ(:,:,:)*2.*PTSTEP ZVS(:,:,:) = ZRVS(:,:,:)/ZMYM_RHODJ(:,:,:)*2.*PTSTEP ZWS(:,:,:) = ZRWS(:,:,:)/ZMZM_RHODJ(:,:,:)*2.*PTSTEP diff --git a/src/MNH/condensation.f90 b/src/MNH/condensation.f90 index d4ca85714..5dc18b098 100644 --- a/src/MNH/condensation.f90 +++ b/src/MNH/condensation.f90 @@ -234,6 +234,7 @@ LOGICAL :: GPRESENT_PLV, GPRESENT_PLS, GPRESENT_PCPH LOGICAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: GWORK CHARACTER(LEN=4) :: YLAMBDA3 !Necessary to workaround NVHPC bug (version 21.7 if OpenACC enabled) LOGICAL :: GPRESENT_PHLC_HCF, GPRESENT_PHLC_HRC, GPRESENT_PHLI_HCF, GPRESENT_PHLI_HRI +LOGICAL :: GYLAMBDA3_CB ! INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: JKPK,JKMK ! @@ -266,6 +267,7 @@ GPRESENT_PHLC_HCF = PRESENT(PHLC_HCF) GPRESENT_PHLC_HRC = PRESENT(PHLC_HRC) GPRESENT_PHLI_HCF = PRESENT(PHLI_HCF) GPRESENT_PHLI_HRI = PRESENT(PHLI_HRI) +GYLAMBDA3_CB = (YLAMBDA3=='CB') ! IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -476,7 +478,7 @@ IF ( .NOT. OSIGMAS ) THEN DO CONCURRENT (JI=KIB:KIE,JJ=KJB:KJE) IF ( ZZZP(JI,JJ) > 0.9*(PZZ(JI,JJ,JKPP(JI,JJ))-PZZ(JI,JJ,KKB)) ) & ZL(JI,JJ,JK) = .6 * ZL(JI,JJ,JK-KKL) - END DO + END DO END DO !$acc end kernels END IF @@ -487,9 +489,9 @@ END IF !Ice fraction ZFRAC(:,:,:) = 0. IF (OUSERI) THEN - DO CONCURRENT ( JI = KIB : KIE, JJ = KJB : KJE, JK = KKB : KKE ) + !$mnh_do_concurrent ( JI = KIB : KIE, JJ = KJB : KJE, JK = KKB : KKE ) IF ( PRC(JI,JJ,JK) + PRI(JI,JJ,JK) > 1.E-20 ) ZFRAC(JI,JJ,JK) = PRI(JI,JJ,JK) / ( PRC(JI,JJ,JK) + PRI(JI,JJ,JK) ) - END DO + !$mnh_end_do() ENDIF !$acc end kernels ! @@ -501,10 +503,10 @@ IF (OUSERI) CALL COMPUTE_FRAC_ICE3D_DEVICE(HFRAC_ICE, ZFRAC, PT) ! !$acc kernels !$acc_nv loop independent -DO CONCURRENT ( JK=IKTB:IKTE ) +!$mnh_do_concurrent ( JK=IKTB:IKTE ) JKPK(JK)=MAX(MIN(JK+KKL,IKTE),IKTB) JKMK(JK)=MAX(MIN(JK-KKL,IKTE),IKTB) -END DO +!$mnh_end_do() ! Bypass CCE/14++ compile bug with index in the good order !!! #if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP) DO CONCURRENT(JI=KIB:KIE,JJ=KJB:KJE,JK=IKTB:IKTE) @@ -704,7 +706,7 @@ DO CONCURRENT(JI=KIB:KIE,JJ=KJB:KJE,JK=IKTB:IKTE) ! PSIGRC(JI,JJ,JK) = 2.*PCLDFR(JI,JJ,JK) * MIN( 3. , MAX(1.,1.-ZQ1P(JI,JJ,JK)) ) ! in the 3D case lambda_3 = 1. - IF(YLAMBDA3=='CB')THEN + IF(GYLAMBDA3_CB)THEN PSIGRC(JI,JJ,JK) = PSIGRC(JI,JJ,JK)* MIN( 3. , MAX(1.,1.-ZQ1P(JI,JJ,JK)) ) ENDIF #if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP) diff --git a/src/MNH/get_halo.f90 b/src/MNH/get_halo.f90 index b56e1fcff..59931bcf1 100644 --- a/src/MNH/get_halo.f90 +++ b/src/MNH/get_halo.f90 @@ -236,7 +236,7 @@ END MODULE MODD_HALO_D ! ######################### SUBROUTINE GET_HALO_D(PSRC,HDIR,HNAME) ! ######################### -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D @@ -264,7 +264,7 @@ END SUBROUTINE GET_HALO_D ! ######################### SUBROUTINE GET_HALO_START_D(PSRC,KNB_REQ,KREQ,HDIR) ! ######################### -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D @@ -476,7 +476,7 @@ END SUBROUTINE GET_HALO_START_D ! ######################### SUBROUTINE GET_HALO_STOP_D(PSRC,KNB_REQ,KREQ,HDIR) ! ######################### -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D @@ -582,7 +582,7 @@ END SUBROUTINE GET_HALO_STOP_D ! ######################################## SUBROUTINE GET_HALO_DD(PSRC, HDIR, HNAME) ! ######################################## -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D USE MODE_ll diff --git a/src/MNH/gradient_m.f90 b/src/MNH/gradient_m.f90 index 15ced8198..fa869751c 100644 --- a/src/MNH/gradient_m.f90 +++ b/src/MNH/gradient_m.f90 @@ -1090,9 +1090,9 @@ ELSE ENDIF DO JJ=1,JPHEXT !$acc_nv loop independent collapse(2) - DO CONCURRENT ( JI=1:IIU , JK=1:IKU ) + !$mnh_do_concurrent ( JI=1:IIU , JK=1:IKU ) PGY_M_V(JI,JJ,JK)=PGY_M_V(JI,IJU-2*JPHEXT+JJ,JK) - END DO + !$mnh_end_do() END DO !$acc end kernels diff --git a/src/MNH/gradient_u.f90 b/src/MNH/gradient_u.f90 index 57d1f6c41..73ddd61e0 100644 --- a/src/MNH/gradient_u.f90 +++ b/src/MNH/gradient_u.f90 @@ -242,18 +242,18 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP2_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP2_DEVICE ) CALL MXF_DEVICE(PDXX,ZTMP3_DEVICE) @@ -438,9 +438,9 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK)/ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MYM_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE) CALL MXM_DEVICE(PDZY,ZTMP2_DEVICE) @@ -448,9 +448,9 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP2_DEVICE ) CALL DYM_DEVICE(PA,ZTMP1_DEVICE) @@ -459,9 +459,9 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PGY_U_UV_DEVICE(JI,JJ,JK)= ( ZTMP1_DEVICE(JI,JJ,JK) - ZTMP2_DEVICE(JI,JJ,JK) ) / ZTMP3_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels ELSE CALL DYM_DEVICE(PA,ZTMP1_DEVICE) diff --git a/src/MNH/gradient_v.f90 b/src/MNH/gradient_v.f90 index 57ebbd0d9..4dd8e9585 100644 --- a/src/MNH/gradient_v.f90 +++ b/src/MNH/gradient_v.f90 @@ -244,18 +244,18 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP2_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK)/PDZZ(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP2_DEVICE ) CALL MYF_DEVICE(PDYY,ZTMP3_DEVICE) @@ -439,9 +439,9 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP4_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MXM_DEVICE(ZTMP4_DEVICE,ZTMP2_DEVICE) CALL MYM_DEVICE(PDZX,ZTMP3_DEVICE) @@ -449,9 +449,9 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP4_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK) *ZTMP3_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZF_DEVICE( ZTMP4_DEVICE, ZTMP2_DEVICE ) CALL MYM_DEVICE(PDXX,ZTMP3_DEVICE) @@ -459,9 +459,9 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PGX_V_UV_DEVICE(JI,JJ,JK)= ( ZTMP1_DEVICE(JI,JJ,JK) - ZTMP2_DEVICE(JI,JJ,JK) ) / ZTMP3_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels ELSE CALL DXM_DEVICE(PA,ZTMP1_DEVICE) diff --git a/src/MNH/ice4_compute_pdf.f90 b/src/MNH/ice4_compute_pdf.f90 index 9b8f6087e..63f868579 100644 --- a/src/MNH/ice4_compute_pdf.f90 +++ b/src/MNH/ice4_compute_pdf.f90 @@ -227,10 +227,9 @@ ELSEIF(HSUBG_AUCV_RC=='CLFR') THEN ELSEIF(HSUBG_AUCV_RC=='ADJU') THEN !$acc kernels present( GWORK ) ZSUMRC(:)=PHLC_LRC(:)+PHLC_HRC(:) -!$acc loop independent - DO CONCURRENT( JI = 1 : ISIZE ) + !$mnh_do_concurrent( JI = 1 : ISIZE ) GWORK(JI) = ZSUMRC(JI) > 0. - END DO + !$mnh_end_do() WHERE(GWORK(:)) PHLC_LRC(:)=PHLC_LRC(:)*PRCT(:)/ZSUMRC(:) PHLC_HRC(:)=PHLC_HRC(:)*PRCT(:)/ZSUMRC(:) @@ -249,13 +248,12 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN IF(HSUBG_PR_PDF=='SIGM') THEN !$acc kernels present( GWORK, GWORK2, GWORK3 ) ! Redelsperger and Sommeria (1986) but organised according to Turner (2011, 2012) -!$acc loop independent - DO CONCURRENT( JI = 1 : ISIZE ) + !$mnh_do_concurrent( JI = 1 : ISIZE ) GWORK(JI) = PRCT(JI)> ZRCRAUTC(JI)+PSIGMA_RC(JI) GWORK2(JI) = PRCT(JI)> (ZRCRAUTC(JI)-PSIGMA_RC(JI)) .AND. & PRCT(JI)<=(ZRCRAUTC(JI)+PSIGMA_RC(JI)) GWORK3(JI) = PRCT(JI)>XRTMIN(2) .AND. PCF(JI)>0. - END DO + !$mnh_end_do() WHERE (GWORK(:)) PHLC_HCF(:)=1. PHLC_LCF(:)=0. @@ -308,18 +306,16 @@ SELECT CASE( HSUBG_PR_PDF ) END SELECT !$acc kernels -!$acc loop independent - DO CONCURRENT( JI = 1 : ISIZE ) + !$mnh_do_concurrent( JI = 1 : ISIZE ) IF ( PRCT(JI)>0. .AND. PCF(JI)>0. ) ZHLC_RCMAX(JI) = ZCOEFFRCM * PRCT(JI) / PCF(JI) - END DO + !$mnh_end_do() !$acc end kernels ! Split available water and cloud fraction in two parts ! Calculate local mean values int he low and high parts for the 3 PDF forms: !$acc kernels present( GWORK ) -!$acc loop independent - DO CONCURRENT( JI = 1 : ISIZE ) + !$mnh_do_concurrent( JI = 1 : ISIZE ) GWORK(JI) = PRCT(JI)>0. .AND. PCF(JI)>0. .AND. ZHLC_RCMAX(JI)>ZRCRAUTC(JI) - END DO + !$mnh_end_do() !$acc end kernels !IF(HSUBG_PR_PDF=='HLCRECTPDF') THEN IF (IHSUBG_PR_PDF==1) THEN @@ -341,8 +337,7 @@ END SELECT !ELSE IF(HSUBG_PR_PDF=='HLCQUADRAPDF') THEN ELSE IF (IHSUBG_PR_PDF==3) THEN !$acc kernels present( GWORK ) -!$acc loop independent - DO CONCURRENT( JI = 1 : ISIZE ) + !$mnh_do_concurrent( JI = 1 : ISIZE ) IF ( GWORK(JI) ) THEN #ifndef MNH_BITREP ZHLC_LRCLOCAL(JI)=(3.0 *ZRCRAUTC(JI)**3 - 8.0 *ZRCRAUTC(JI)**2 * ZHLC_RCMAX(JI) & @@ -359,13 +354,12 @@ END SELECT #endif ZHLC_HRCLOCAL(JI)=(ZHLC_RCMAX(JI) + 3.0*ZRCRAUTC(JI))/4.0 END IF - END DO + !$mnh_end_do() !$acc end kernels !ELSE IF(HSUBG_PR_PDF=='HLCISOTRIPDF') THEN ELSE IF (IHSUBG_PR_PDF==4) THEN !$acc kernels present( GWORK, GWORK2 ) -!$acc loop independent - DO CONCURRENT( JI = 1 : ISIZE ) + !$mnh_do_concurrent( JI = 1 : ISIZE ) IF ( GWORK(JI) ) THEN IF ( PRCT(JI) <= ZRCRAUTC(JI)*PCF(JI) ) THEN #ifndef MNH_BITREP @@ -395,15 +389,14 @@ END SELECT #endif END IF END IF - END DO + !$mnh_end_do() !$acc end kernels END IF !$acc kernels present( GWORK, GWORK2 ) ! Compare r_cM to r_cR to know if cloud water content is high enough to split in two parts or not -!$acc loop independent - DO CONCURRENT( JI = 1 : ISIZE ) + !$mnh_do_concurrent( JI = 1 : ISIZE ) GWORK2(JI) = PRCT(JI)>0. .AND. PCF(JI)>0. .AND. ZHLC_RCMAX(JI)<=ZRCRAUTC(JI) - END DO + !$mnh_end_do() WHERE(GWORK(:)) ! Calculate final values for LCF and HCF: PHLC_LCF(:)=PCF(:) & diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90 index 0e2e92deb..67eb2a2e3 100644 --- a/src/MNH/ice4_fast_rg.f90 +++ b/src/MNH/ice4_fast_rg.f90 @@ -188,10 +188,7 @@ REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZZW, & ! !------------------------------------------------------------------------------- ! -!$acc data present(PCOMPUTE,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ,PCIT,PLBDAR,PLBDAS,PLBDAG, & -!$acc& PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRGSI,PRGSI_MR,PWETG,PRICFRRG,PRRCFRIG,PRICFRR,PRCWETG,PRIWETG, & -!$acc& PRRWETG,PRSWETG,PRCDRYG,PRIDRYG,PRRDRYG,PRSDRYG,PRWETGH,PRWETGH_MR,PRGMLTR,PRG_TEND, & -!$acc& PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH,PB_RG,PB_RH) + IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -270,9 +267,13 @@ CALL MNH_MEM_GET( zrdryg_init, isize ) CALL MNH_MEM_GET( 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 ) +!$acc data present(PCOMPUTE,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ,PCIT,PLBDAR,PLBDAS,PLBDAG, & +!$acc & PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRGSI,PRGSI_MR,PWETG,PRICFRRG,PRRCFRIG,PRICFRR,PRCWETG,PRIWETG, & +!$acc & PRRWETG,PRSWETG,PRCDRYG,PRIDRYG,PRRDRYG,PRSDRYG,PRWETGH,PRWETGH_MR,PRGMLTR,PRG_TEND, & +!$acc & PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH,PB_RG,PB_RH) & +!$acc & 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 @@ -395,9 +396,9 @@ ELSE ENDIF -! !$acc end kernels +! !acc end kernels ! call mppdb_check(PRG_TEND,"ICE4_FAST_RG:PRG_TEND 02") -! !$acc kernels +! !acc kernels @@ -405,7 +406,7 @@ ENDIF IGDRY = 0 !$acc end kernels !$acc parallel loop private(idx) copy(IGDRY) independent -DO CONCURRENT( JJ = 1 : SIZE( GDRY ) ) +DO JJ = 1 , SIZE( GDRY ) ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) &PCOMPUTE(JJ) @@ -420,7 +421,7 @@ DO CONCURRENT( JJ = 1 : SIZE( GDRY ) ) GDRY(JJ) = .FALSE. END IF END DO -! !$acc kernels +! ! acc end kernels IF(LDSOFT) THEN !$acc kernels DO JL=1, ISIZE @@ -434,7 +435,7 @@ ELSE PRG_TEND(:, IRSWETG)=0. !$acc end kernels -!$acc update self( IGDRY ) +!$acc update host( IGDRY ) IF(IGDRY>0)THEN !$acc kernels ! @@ -450,8 +451,7 @@ ELSE ! in the geometrical set of (Lbda_g,Lbda_s) couplet use to ! tabulate the SDRYG-kernel ! -!$acc loop independent - DO CONCURRENT( JJ = 1 : IGDRY ) + !$mnh_do_concurrent( JJ = 1 : IGDRY ) ZVEC1(JJ) = MAX( 1.00001, MIN( REAL( NDRYLBDAG ) - 0.00001, & #ifndef MNH_BITREP XDRYINTP1G * LOG( ZVEC1(JJ) ) + XDRYINTP2G ) ) @@ -469,7 +469,7 @@ ELSE #endif IVEC2(JJ) = INT( ZVEC2(JJ) ) ZVEC2(JJ) = ZVEC2(JJ) - REAL( IVEC2(JJ) ) - END DO + !$mnh_end_do() ! !* 6.2.5 perform the bilinear interpolation of the normalized ! SDRYG-kernel @@ -519,7 +519,7 @@ ENDIF ! IGDRY = 0 !$acc parallel loop private(idx) copy(IGDRY) independent -DO CONCURRENT( JJ = 1 : SIZE( GDRY ) ) +DO JJ = 1 , SIZE( GDRY ) ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) &PCOMPUTE(JJ) @@ -545,14 +545,14 @@ ELSE !$acc kernels PRG_TEND(:, IRRDRYG)=0. !$acc end kernels -!$acc update self( IGDRY ) +! acc update host( IGDRY ) ! -!$acc kernels IF(IGDRY>0) THEN + !$acc kernels ! !* 6.2.8 select the (PLBDAG,PLBDAR) couplet ! -!$acc loop independent + !$acc loop independent DO JJ = 1, IGDRY ZVEC1(JJ) = PLBDAG(I1(JJ)) ZVEC2(JJ) = PLBDAR(I1(JJ)) @@ -562,7 +562,7 @@ ELSE ! in the geometrical set of (Lbda_g,Lbda_r) couplet use to ! tabulate the RDRYG-kernel ! -!$acc loop independent + !$acc loop independent DO JJ = 1, IGDRY ZVEC1(JJ) = MAX( 1.00001, MIN( REAL( NDRYLBDAG ) - 0.00001, & #ifndef MNH_BITREP @@ -586,7 +586,7 @@ ELSE !* 6.2.10 perform the bilinear interpolation of the normalized ! RDRYG-kernel ! -!$acc loop independent + !$acc loop independent DO JJ=1, IGDRY ZVEC3(JJ)= ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & @@ -596,11 +596,12 @@ ELSE *(ZVEC1(JJ) - 1.0) END DO ZZW(:) = 0. -!$acc loop independent + !$acc loop independent DO JJ = 1, IGDRY ZZW(I1(JJ)) = ZVEC3(JJ) END DO ! + !$mnh_expand_where(JJ=1:IGDRY) WHERE(GDRY(:)) #ifndef MNH_BITREP PRG_TEND(:, IRRDRYG) = XFRDRYG*ZZW(:) & ! RRDRYG @@ -617,12 +618,12 @@ ELSE XLBRDRYG2/( PLBDAG(:) * PLBDAR(:) ) + & XLBRDRYG3/ BR_P2(PLBDAR(:)) ) #endif - END WHERE + END WHERE + !$mnh_end_expand_where() + !$acc end kernels ENDIF -!$acc end kernels ENDIF !$acc kernels - DO JL=1, ISIZE ZRDRYG_INIT(JL)=PRG_TEND(JL, IRCDRYG)+PRG_TEND(JL, IRIDRYG)+ & &PRG_TEND(JL, IRSDRYG)+PRG_TEND(JL, IRRDRYG) @@ -854,6 +855,5 @@ deallocate( i1 ) CALL MNH_MEM_RELEASE() #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 4fb4434d6..3b7056e62 100644 --- a/src/MNH/ice4_fast_rs.f90 +++ b/src/MNH/ice4_fast_rs.f90 @@ -292,7 +292,7 @@ ENDDO ! IGRIM = 0 !$acc parallel loop private(idx) copy(IGRIM) independent present_cr( I1, GRIM, PCOMPUTE, PRCT, PRST, XRTMIN, ZRIM ) -DO CONCURRENT( JJ = 1 : SIZE( GRIM ) ) +DO JJ = 1 , SIZE( GRIM ) ZRIM(JJ)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JJ))) * & !WHERE(PRCT(:)>XRTMIN(2)) &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5)) &PCOMPUTE(JJ) @@ -328,8 +328,7 @@ ELSE ! 5.1.1 select the PLBDAS ! !$acc kernels copyin( CSNOWRIMING ) -!$acc loop independent - DO CONCURRENT( JJ = 1 : IGRIM ) + !$mnh_do_concurrent( JJ = 1 : IGRIM ) ZVEC1(JJ) = PLBDAS(I1(JJ)) ! ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical @@ -350,7 +349,7 @@ ELSE ! ZVEC1(JJ) = XGAMINC_RIM1( IVEC2(JJ)+1 )* ZVEC2(JJ) & - XGAMINC_RIM1( IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) - END DO + !$mnh_end_do() !$acc end kernels !$acc kernels ZZW(:) = 0. @@ -361,7 +360,7 @@ ELSE ! ! 5.1.4 riming of the small sized aggregates ! - DO CONCURRENT( JJ = 1 : ISIZE ) + !$mnh_do_concurrent( JJ = 1 : ISIZE ) IF ( GRIM(JJ) ) THEN PRS_TEND(JJ, IRCRIMSS) = XCRIMSS * ZZW(JJ) * PRCT(JJ) & ! RCRIMSS #ifndef MNH_BITREP @@ -372,7 +371,7 @@ ELSE * BR_POW(PRHODREF(JJ),-XCEXVT) #endif END IF - END DO + !$mnh_end_do() ! ! 5.1.5 perform the linear interpolation of the normalized ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) and @@ -397,8 +396,7 @@ ELSE ! 5.1.6 riming-conversion of the large sized aggregates into graupeln ! ! -!$acc loop independent - DO CONCURRENT( JJ = 1 : ISIZE ) + !$mnh_do_concurrent( JJ = 1 : ISIZE ) IF ( GRIM(JJ) ) THEN PRS_TEND(JJ, IRCRIMS)=XCRIMSG * PRCT(JJ) & ! RCRIMS #ifndef MNH_BITREP @@ -410,7 +408,7 @@ ELSE #endif ZZW6(JJ) = PRS_TEND(JJ, IRCRIMS) - PRS_TEND(JJ, IRCRIMSS) ! RCRIMSG END IF - END DO + !$mnh_end_do() IF(CSNOWRIMING=='M90 ')THEN !Murakami 1990 @@ -466,7 +464,7 @@ ENDDO ! IGACC = 0 !$acc parallel loop private(idx) copy(IGACC) independent present_cr( I1, GACC, PCOMPUTE, PRRT, PRST, XRTMIN, ZACC ) -DO CONCURRENT( JJ = 1 : SIZE( GACC ) ) +DO JJ = 1 , SIZE( GACC ) ZACC(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & !WHERE(PRRT(:)>XRTMIN(3)) &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5)) &PCOMPUTE(JJ) @@ -511,8 +509,7 @@ ELSE ! in the geometrical set of (Lbda_s,Lbda_r) couplet use to ! tabulate the RACCSS-kernel ! -!$acc loop independent - DO CONCURRENT( JJ = 1 : IGACC ) + !$mnh_do_concurrent( JJ = 1 : IGACC ) ZVEC1(JJ) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & #ifndef MNH_BITREP XACCINTP1S * LOG( ZVEC1(JJ) ) + XACCINTP2S ) ) @@ -530,7 +527,7 @@ ELSE #endif IVEC2(JJ) = INT( ZVEC2(JJ) ) ZVEC2(JJ) = ZVEC2(JJ) - REAL( IVEC2(JJ) ) - END DO + !$mnh_end_do() ! ! 5.2.3 perform the bilinear interpolation of the normalized ! RACCSS-kernel diff --git a/src/MNH/ice4_nucleation.f90 b/src/MNH/ice4_nucleation.f90 index 75c76b335..e4630fa29 100644 --- a/src/MNH/ice4_nucleation.f90 +++ b/src/MNH/ice4_nucleation.f90 @@ -151,8 +151,7 @@ IF(.NOT. ODSOFT) THEN ZSSI(:)=0. ZUSW(:)=0. ZZW(:)=0. -!$acc loop independent - DO CONCURRENT( JI = 1 : size( odcompute ) ) + !$mnh_do_concurrent( JI = 1 : size( odcompute ) ) IF ( GNEGT(ji) ) THEN #ifndef MNH_BITREP ZZW(JI)=ALOG(PT(JI)) @@ -164,9 +163,8 @@ IF(.NOT. ODSOFT) THEN ZZW(JI) = BR_EXP(XALPI - XBETAI/PT(JI) - XGAMI*ZZW(JI)) ! es_i #endif END IF - END DO -!$acc loop independent - DO CONCURRENT( JI = 1 : size( odcompute ) ) + !$mnh_end_do() + !$mnh_do_concurrent( JI = 1 : size( odcompute ) ) IF ( GNEGT(ji) ) THEN ZZW(JI)=MIN(PPABST(JI)/2., ZZW(JI)) ! safety limitation ZSSI(JI)=PRVT(JI)*(PPABST(JI)-ZZW(JI)) / (XEPSILO*ZZW(JI)) - 1.0 @@ -181,13 +179,12 @@ IF(.NOT. ODSOFT) THEN ! ZSSI(JI)=MIN(ZSSI(JI), ZUSW(JI)) ! limitation of SSi according to SSw=0 END IF - END DO + !$mnh_end_do() ZZW(:)=0. -!$acc loop independent - DO CONCURRENT( JI = 1 : size( odcompute ) ) + !$mnh_do_concurrent( JI = 1 : size( odcompute ) ) GWORK(JI) = GNEGT(JI) .AND. PT(JI)<XTT-5.0 .AND. ZSSI(JI)>0.0 GWORK2(JI) = GNEGT(JI) .AND. PT(JI)<=XTT-2.0 .AND. PT(JI)>=XTT-5.0 .AND. ZSSI(JI)>0.0 - END DO + !$mnh_end_do() #ifndef MNH_BITREP #ifndef MNH_OPENACC WHERE(GWORK(:)) @@ -227,11 +224,10 @@ IF(.NOT. ODSOFT) THEN END DO #endif #endif -!$acc loop independent - DO CONCURRENT( JI = 1 : size( odcompute ) ) + !$mnh_do_concurrent( JI = 1 : size( odcompute ) ) ZZW(JI)=ZZW(JI)-PCIT(JI) ZZW(JI)=MIN(ZZW(JI), 50.E3) ! limitation provisoire a 50 l^-1 - END DO + !$mnh_end_do() WHERE(GNEGT(:)) ! !* 3.1.2 update the r_i and r_v mixing ratios @@ -241,8 +237,7 @@ IF(.NOT. ODSOFT) THEN END WHERE !Limitation due to 0 crossing of temperature IF(LFEEDBACKT) THEN -!$acc loop independent - DO CONCURRENT( JI = 1 : size( odcompute ) ) + !$mnh_do_concurrent( JI = 1 : size( odcompute ) ) IF ( GNEGT(JI) ) THEN ZW(JI)=MIN(PRVHENI_MR(JI), & MAX(0., (XTT/PEXN(JI)-PTHT(JI))/PLSFACT(JI))) / & @@ -250,7 +245,7 @@ IF(.NOT. ODSOFT) THEN ELSE ZW(JI) = 0. END IF - END DO + !$mnh_end_do() ELSE ZW(:)=1. ENDIF diff --git a/src/MNH/ice4_rsrimcg_old.f90 b/src/MNH/ice4_rsrimcg_old.f90 index 8abfaed13..d72de99e3 100644 --- a/src/MNH/ice4_rsrimcg_old.f90 +++ b/src/MNH/ice4_rsrimcg_old.f90 @@ -162,8 +162,7 @@ IF(.NOT. ODSOFT) THEN ! ! 5.1.1 select the PLBDAS ! - !$acc loop independent - DO CONCURRENT( JL = 1 : IGRIM ) + !$mnh_do_concurrent( JL = 1 : IGRIM ) ZVEC1(JL) = PLBDAS(IVEC1(JL)) ! ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical @@ -185,21 +184,18 @@ IF(.NOT. ODSOFT) THEN ! ZVEC1(JL) = XGAMINC_RIM2( IVEC2(JL)+1 )* ZVEC2(JL) & - XGAMINC_RIM2( IVEC2(JL) )*(ZVEC2(JL) - 1.0) - END DO - !$acc loop independent - DO CONCURRENT( JL = 1 : size( prhodref ) ) + !$mnh_end_do() + !$mnh_do_concurrent( JL = 1 : size( prhodref ) ) ZZW(JL) = 0. - END DO - !$acc loop independent - DO CONCURRENT( JL = 1 : IGRIM ) + !$mnh_end_do() + !$mnh_do_concurrent( JL = 1 : IGRIM ) ZZW(IVEC1(JL)) = ZVEC1(JL) - END DO + !$mnh_end_do() ! ! 5.1.6 riming-conversion of the large sized aggregates into graupeln ! ! - !$acc loop independent - DO CONCURRENT( JL = 1 : size( prhodref ) ) + !$mnh_do_concurrent( JL = 1 : size( prhodref ) ) IF ( GRIM(JL) ) THEN #ifndef MNH_BITREP PRSRIMCG_MR(:) = XSRIMCG * PLBDAS(:)**XEXSRIMCG & ! RSRIMCG @@ -209,7 +205,7 @@ IF(.NOT. ODSOFT) THEN * (1.0 - ZZW(:) )/PRHODREF(:) PRSRIMCG_MR(:)=MIN(PRST(:), PRSRIMCG_MR(:)) END IF - END DO + !$mnh_end_do() !$acc end kernels END IF ! IGRIM ENDIF ! ODSOFT diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90 index 5d15c772c..c8b634e3c 100644 --- a/src/MNH/ice4_sedimentation_split.f90 +++ b/src/MNH/ice4_sedimentation_split.f90 @@ -173,8 +173,8 @@ REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZCONC3D, & ! droplet condensatio #endif !------------------------------------------------------------------------------- -!$acc data present( PDZZ, PRHODREF, PPABST, PTHT, PRHODJ, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT, & -!$acc& PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PSEA, PTOWN, PINPRH, PRHT, PRHS, PFPR ) +!$acc data present(PDZZ,PRHODREF,PPABST,PTHT,PRHODJ,PRCS,PRCT,PRRS,PRRT,PRIS,PRIT,PRSS,PRST,PRGS,PRGT, & +!$acc & PINPRC,PINDEP,PINPRR,PINPRI,PINPRS,PINPRG,PSEA,PTOWN,PINPRH,PRHT,PRHS,PFPR ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -310,8 +310,7 @@ IF (OSEDIC) THEN !$acc end kernels #else !$acc kernels present_cr( PSEA, PTOWN, ZCONC3D, ZFSEDC, ZLBC, ZRAY ) -!$acc loop independent - DO CONCURRENT( JI = 1 : KIT, JJ = 1 : KJT, JK = KKTB : KKTE ) + !$mnh_do_concurrent( JI = 1 : KIT, JJ = 1 : KJT, JK = KKTB : KKTE ) ZLBC(JI,JJ,JK) = PSEA(JI,JJ)*XLBC(2)+(1.-PSEA(JI,JJ))*XLBC(1) ZFSEDC(JI,JJ,JK) = (PSEA(JI,JJ)*XFSEDC(2)+(1.-PSEA(JI,JJ))*XFSEDC(1)) ZFSEDC(JI,JJ,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(JI,JJ,JK)) @@ -319,7 +318,7 @@ IF (OSEDIC) THEN ZRAY(JI,JJ,JK) = 0.5*((1.-PSEA(JI,JJ))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & PSEA(JI,JJ)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) - END DO + !$mnh_end_do() !$acc end kernels #endif ELSE @@ -765,14 +764,11 @@ DO WHILE (ANY(ZREMAINT>0.)) !$acc end kernels !$acc kernels DO JK = KKTB , KKTE -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif - DO CONCURRENT( JI = 1 : KIT, JJ = 1 : KJT ) + !$mnh_do_concurrent( JI = 1 : KIT, JJ = 1 : KJT ) ZMRCHANGE(JI,JJ) = ZMAX_TSTEP(JI,JJ) * POORHODZ(JI,JJ,JK)*(ZWSED(JI,JJ,JK+KKL)-ZWSED(JI,JJ,JK)) PRXT(JI,JJ,JK) = PRXT(JI,JJ,JK) + ZMRCHANGE(JI,JJ) + PPRXS(JI,JJ,JK) * ZMAX_TSTEP(JI,JJ) PRXS(JI,JJ,JK) = PRXS(JI,JJ,JK) + ZMRCHANGE(JI,JJ) * ZINVTSTEP - END DO + !$mnh_end_do() ENDDO !$acc end kernels !$acc kernels diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90 index 6593e4bc0..8ee10ef63 100644 --- a/src/MNH/ice4_tendencies.f90 +++ b/src/MNH/ice4_tendencies.f90 @@ -480,8 +480,7 @@ PB_RS(:)=0. PB_RG(:)=0. PB_RH(:)=0. ! -!$acc loop independent -DO CONCURRENT ( JL = 1 : ISIZE ) +!$mnh_do_concurrent ( JL = 1 : ISIZE ) ZRVT(JL)=PRVT(JL) ZRCT(JL)=PRCT(JL) ZRRT(JL)=PRRT(JL) @@ -491,7 +490,7 @@ DO CONCURRENT ( JL = 1 : ISIZE ) ZTHT(JL)=PTHT(JL) ZRHT(JL)=PRHT(JL) ZT(JL)=PT(JL) -ENDDO +!$mnh_end_do() !$acc end kernels IF(ODSOFT) THEN !$acc kernels @@ -513,13 +512,12 @@ ELSE ZRVT, & PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) !$acc kernels -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) ZRIT(JL)=ZRIT(JL) + PRVHENI_MR(JL) ZRVT(JL)=ZRVT(JL) - PRVHENI_MR(JL) ZTHT(JL)=ZTHT(JL) + PRVHENI_MR(JL)*PLSFACT(JL) ZT(JL) = ZTHT(JL) * PEXN(JL) - ENDDO + !$mnh_end_do() !$acc end kernels ! !* 3.3 compute the spontaneous freezing source: RRHONG @@ -530,13 +528,12 @@ ELSE &ZTHT, & &PRRHONG_MR, PB_TH, PB_RR, PB_RG) !$acc kernels -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) ZRGT(JL) = ZRGT(JL) + PRRHONG_MR(JL) ZRRT(JL) = ZRRT(JL) - PRRHONG_MR(JL) ZTHT(JL) = ZTHT(JL) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RRHONG)) ZT(JL) = ZTHT(JL) * PEXN(JL) - ENDDO + !$mnh_end_do() !$acc end kernels ! !* 7.1 cloud ice melting @@ -547,21 +544,19 @@ ELSE &ZTHT, ZRIT, & &PRIMLTC_MR, PB_TH, PB_RC, PB_RI) !$acc kernels -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) ZRCT(JL) = ZRCT(JL) + PRIMLTC_MR(JL) ZRIT(JL) = ZRIT(JL) - PRIMLTC_MR(JL) ZTHT(JL) = ZTHT(JL) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RIMLTC)) ZT(JL) = ZTHT(JL) * PEXN(JL) - ENDDO + !$mnh_end_do() !$acc end kernels ! ! 5.1.6 riming-conversion of the large sized aggregates into graupel (old parametrisation) ! IF(CSNOWRIMING=='OLD ') THEN !$acc kernels -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) IF ( ZRST(JL) > 0. ) THEN #ifndef MNH_BITREP ZLBDAS(JL) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(JL)*MAX(ZRST(JL), XRTMIN(5)))**XLBEXS) @@ -571,7 +566,7 @@ ELSE ELSE ZLBDAS(JL) = 0. END IF - END DO + !$mnh_end_do() !$acc end kernels CALL ICE4_RSRIMCG_OLD(ODSOFT, PCOMPUTE==1., & &PRHODREF, & @@ -579,11 +574,10 @@ ELSE &ZT, ZRCT, ZRST, & &PRSRIMCG_MR, PB_RS, PB_RG) !$acc kernels -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) ZRST(JL) = ZRST(JL) - PRSRIMCG_MR(JL) ZRGT(JL) = ZRGT(JL) + PRSRIMCG_MR(JL) - ENDDO + !$mnh_end_do() !$acc end kernels ELSE !$acc kernels @@ -686,8 +680,7 @@ IF(ISIZE>0) THEN !* compute the slope parameters ! !$acc kernels -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) IF ( ZRST(JL) > 0. ) THEN #ifndef MNH_BITREP ZLBDAS(JL) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(JL)*MAX(ZRST(JL), XRTMIN(5)))**XLBEXS) @@ -697,9 +690,8 @@ IF(ISIZE>0) THEN ELSE ZLBDAS(JL) = 0. END IF - END DO -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_end_do() + !$mnh_do_concurrent ( JL = 1 : ISIZE ) IF ( ZRGT(JL) > 0. ) THEN #ifndef MNH_BITREP ZLBDAG(JL) = XLBG*(PRHODREF(JL)*MAX(ZRGT(JL), XRTMIN(6)))**XLBEXG @@ -709,10 +701,9 @@ IF(ISIZE>0) THEN ELSE ZLBDAG(JL) = 0. END IF - END DO + !$mnh_end_do() !ZLBDAR will be used when we consider rain diluted over the grid box -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) IF ( ZRRT(JL) > 0. ) THEN #ifndef MNH_BITREP ZLBDAR(JL) = XLBR*( PRHODREF(JL)*MAX( ZRRT(JL), XRTMIN(3)))**XLBEXR @@ -722,14 +713,13 @@ IF(ISIZE>0) THEN ELSE ZLBDAR(JL) = 0. END IF - END DO + !$mnh_end_do() !$acc end kernels !ZLBDAR_RF is used when we consider rain concentrated in its fraction IF (HSUBG_RC_RR_ACCR=='PRFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN !PW: 20211012: kernels directive inside IF to prevent crash with nvhpc 21.9 !$acc kernels -!$acc loop independent - DO CONCURRENT( JL = 1 : ISIZE ) + !$mnh_do_concurrent( JL = 1 : ISIZE ) IF ( ZRRT(JL) >0. .AND. ZRF(JL) > 0. ) THEN #ifndef MNH_BITREP ZLBDAR_RF(JL) = XLBR*( PRHODREF(JL) *MAX( ZRRT(JL)/ZRF(JL) , XRTMIN(3)))**XLBEXR @@ -739,21 +729,19 @@ IF(ISIZE>0) THEN ELSE ZLBDAR_RF(JL) = 0. END IF - END DO + !$mnh_end_do() !$acc end kernels ELSE !$acc kernels ! ZLBDAR_RF(:) = ZLBDAR(:) -!$acc loop independent - DO CONCURRENT( JL = 1 : ISIZE ) + !$mnh_do_concurrent( JL = 1 : ISIZE ) ZLBDAR_RF(JL) = ZLBDAR(JL) - END DO + !$mnh_end_do() !$acc end kernels ENDIF !$acc kernels IF(KRR==7) THEN -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) IF ( PRHT(JL) > 0. ) THEN #ifndef MNH_BITREP ZLBDAH(JL) = XLBH*(PRHODREF(JL)*MAX(PRHT(JL), XRTMIN(7)))**XLBEXH @@ -763,7 +751,7 @@ IF(ISIZE>0) THEN ELSE ZLBDAH(JL) = 0. END IF - END DO + !$mnh_end_do() ENDIF !$acc end kernels ENDIF @@ -827,12 +815,11 @@ CALL ICE4_FAST_RS(ODSOFT, PCOMPUTE, & ! ------------------------------------------------------ ! !$acc kernels -!$acc loop independent -DO CONCURRENT ( JL = 1 : ISIZE ) +!$mnh_do_concurrent ( JL = 1 : ISIZE ) ZRGSI(JL) = PRVDEPG(JL) + PRSMLTG(JL) + PRRACCSG(JL) + & & PRSACCRG(JL) + PRCRIMSG(JL) + PRSRIMCG(JL) ZRGSI_MR(JL) = PRRHONG_MR(JL) + PRSRIMCG_MR(JL) -ENDDO +!$mnh_end_do() !$acc end kernels CALL ICE4_FAST_RG(ODSOFT, PCOMPUTE, KRR, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & diff --git a/src/MNH/ice4_warm.f90 b/src/MNH/ice4_warm.f90 index 486275147..e1b74ed19 100644 --- a/src/MNH/ice4_warm.f90 +++ b/src/MNH/ice4_warm.f90 @@ -270,8 +270,7 @@ ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN ! if PRF<PCF (rain is entirely falling in cloud): PRF-PHLC_HCF ! if PRF>PCF (rain is falling in cloud and in clear sky): PCF-PHLC_HCF ! => min(PCF, PRF)-PHLC_HCF -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) &PCOMPUTE(JL) @@ -344,8 +343,7 @@ IF (HSUBG_RR_EVAP=='NONE') THEN ELSE PRREVAV(:) = 0. !Evaporation only when there's no cloud (RC must be 0) -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) IF ( ZMASK(Jl) == 1. ) THEN #ifndef MNH_BITREP PRREVAV(JL) = EXP( XALPW - XBETAW/PT(JL) - XGAMW*ALOG(PT(JL) ) ) ! es_w @@ -365,7 +363,7 @@ IF (HSUBG_RR_EVAP=='NONE') THEN ( X0EVAR*BR_POW(PLBDAR(JL),XEX0EVAR)+X1EVAR*PCJ(JL)*BR_POW(PLBDAR(JL),XEX1EVAR) ) #endif END IF - END DO + !$mnh_end_do() ENDIF !$acc end kernels @@ -391,8 +389,7 @@ IF (HSUBG_RR_EVAP=='CLFR') GHSUBG_RR_EVAP=.true. !Ces variables devraient être sorties de rain_ice_slow et on mettrait le calcul de T^u, T^s !et plusieurs versions (comme actuellement, en ciel clair, en ciel nuageux) de PKA, PDV, PCJ dans rain_ice !On utiliserait la bonne version suivant l'option NONE, CLFR... dans l'évaporation et ailleurs -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) &MAX(0., -SIGN(1., PCF(JL)-ZZW4(JL))) * & ! ZZW4(:) > PCF(:) &PCOMPUTE(JL) @@ -403,8 +400,7 @@ IF (HSUBG_RR_EVAP=='CLFR') GHSUBG_RR_EVAP=.true. ENDDO ELSE PRREVAV(:) = 0. -!$acc loop independent - DO CONCURRENT ( JL = 1 : ISIZE ) + !$mnh_do_concurrent ( JL = 1 : ISIZE ) IF ( ZMASK(Jl) == 1. ) THEN ! outside the cloud (environment) the use of T^u (unsaturated) instead of T ! Bechtold et al. 1993 @@ -441,7 +437,7 @@ IF (HSUBG_RR_EVAP=='CLFR') GHSUBG_RR_EVAP=.true. ! PRREVAV(JL) = PRREVAV(JL)*(ZZW4(JL)-PCF(JL)) END IF - END DO + !$mnh_end_do() ENDIF !$acc end kernels diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90 index e8e8bb1cb..9b4db7e1a 100644 --- a/src/MNH/mode_prandtl.f90 +++ b/src/MNH/mode_prandtl.f90 @@ -133,19 +133,19 @@ IF (LTURBDIM_3DIM) THEN !* 3DIM case IF (OUSERV) THEN #ifndef MNH_BITREP - DO CONCURRENT (JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent (JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZW1(JI,JJ,JK) = 1. + 1.5* (PREDTH1(JI,JJ,JK)+PREDR1(JI,JJ,JK)) + & ( 0.5 * (PREDTH1(JI,JJ,JK)**2+PREDR1(JI,JJ,JK)**2) & + PREDTH1(JI,JJ,JK) * PREDR1(JI,JJ,JK) & ) - END DO + !$mnh_end_do() #else - DO CONCURRENT (JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent (JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZW1(JI,JJ,JK) = 1. + 1.5* (PREDTH1(JI,JJ,JK)+PREDR1(JI,JJ,JK)) + & ( 0.5 * (BR_P2(PREDTH1(JI,JJ,JK))+BR_P2(PREDR1(JI,JJ,JK))) & + PREDTH1(JI,JJ,JK) * PREDR1(JI,JJ,JK) & ) - END DO + !$mnh_end_do() #endif ZW2(:,:,:) = 0.5 * (PRED2TH3(:,:,:)-PRED2R3(:,:,:)) PPHI3(:,:,:)= 1. - & @@ -155,15 +155,15 @@ IF (LTURBDIM_3DIM) THEN ) / ZW1(:,:,:) ELSE #ifndef MNH_BITREP - DO CONCURRENT (JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent (JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZW1(JI,JJ,JK) = 1. + 1.5* PREDTH1(JI,JJ,JK) + & 0.5* PREDTH1(JI,JJ,JK)**2 - END DO + !$mnh_end_do() #else - DO CONCURRENT (JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent (JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZW1(JI,JJ,JK) = 1. + 1.5* PREDTH1(JI,JJ,JK) + & 0.5* BR_P2(PREDTH1(JI,JJ,JK)) - END DO + !$mnh_end_do() #endif ZW2(:,:,:) = 0.5* PRED2TH3(:,:,:) PPHI3(:,:,:)= 1. - & diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90 index 2c9d9a834..4b7923188 100644 --- a/src/MNH/rain_ice.f90 +++ b/src/MNH/rain_ice.f90 @@ -258,6 +258,11 @@ USE MODI_ICE4_RAINFR_VERT USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE #endif +#if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP) +!$mnh_undef(LOOP) +!$mnh_undef(OPENACC) +#endif + IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -720,8 +725,7 @@ IF( IMICRO >= 0 ) THEN ! !$acc kernels -!$acc loop independent - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) @@ -746,7 +750,7 @@ IF( IMICRO >= 0 ) THEN ZTHLT(JL) = ZTHT(JL) - XLVTT * ZTHT(JL) / XCPD / ZZT(JL) * ZRCT(JL) ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) - ENDDO + !$mnh_end_do() ! IF (KRR == 7 ) THEN !$acc loop independent @@ -764,26 +768,23 @@ IF( IMICRO >= 0 ) THEN END DO END IF ! - !$acc loop independent - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) ZZW(JL) = ZEXNREF(JL)*( XCPD+XCPV*ZRVT(JL)+XCL*(ZRCT(JL)+ZRRT(JL)) & +XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)) ) ZLSFACT(JL) = (XLSTT+(XCPV-XCI)*(ZZT(JL)-XTT))/ZZW(JL) ! L_s/(Pi_ref*C_ph) ZLVFACT(JL) = (XLVTT+(XCPV-XCL)*(ZZT(JL)-XTT))/ZZW(JL) ! L_v/(Pi_ref*C_ph) - END DO + !$mnh_end_do() #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) - !$acc loop independent - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) ZZW(JL) = EXP( XALPI - XBETAI/ZZT(JL) - XGAMI*LOG(ZZT(JL) ) ) ZSSI(JL) = ZRVT(JL)*( ZPRES(JL)-ZZW(JL) ) / ( (XMV/XMD) * ZZW(JL) ) - 1.0 - END DO + !$mnh_end_do() #else - !$acc loop independent - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) ZZW(JL) = BR_EXP( XALPI - XBETAI/ZZT(JL) - XGAMI*BR_LOG(ZZT(JL) ) ) ZSSI(JL) = ZRVT(JL)*( ZPRES(JL)-ZZW(JL) ) / ( (XMV/XMD) * ZZW(JL) ) - 1.0 - END DO + !$mnh_end_do() #endif ! Supersaturation over ice @@ -797,10 +798,9 @@ IF( IMICRO >= 0 ) THEN ! !Cloud water split between high and low content part is done here !according to autoconversion option - !$acc loop independent - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) ZRCRAUTC(JL) = XCRIAUTC/ZRHODREF(JL) ! Autoconversion rc threshold - END DO + !$mnh_end_do() !$acc end kernels #ifdef MNH_OPENACC IF (LBU_ENABLE .OR. LLES_CALL) THEN @@ -810,8 +810,7 @@ IF( IMICRO >= 0 ) THEN IF (HSUBG_AUCV == 'NONE') THEN !$acc kernels !Cloud water is entirely in low or high part -!$acc loop independent private(JL) - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) IF (ZRCT(JL) > ZRCRAUTC(JL)) THEN ZHLC_HCF(JL) = 1. ZHLC_LCF(JL) = 0.0 @@ -831,7 +830,7 @@ IF( IMICRO >= 0 ) THEN ZHLC_LRC(JL) = 0.0 ZRF(JL) = 0. END IF - END DO + !$mnh_end_do() !$acc end kernels ELSEIF (HSUBG_AUCV == 'CLFR') THEN @@ -1042,43 +1041,39 @@ IF( IMICRO >= 0 ) THEN !$acc kernels !ZLBDAR will be used when we consider rain diluted over the grid box #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) -!$acc loop independent - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) IF ( ZRRT(JL)>0.0 ) THEN ZLBDAR(JL) = XLBR * ( ZRHODREF(JL) * MAX( ZRRT(JL), XRTMIN(3) ) )**XLBEXR ELSE ZLBDAR(JL) = 0. END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT #else -!$acc loop independent - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) IF ( ZRRT(JL)>0.0 ) THEN ZLBDAR(JL) = XLBR * BR_POW( ZRHODREF(JL) * MAX( ZRRT(JL), XRTMIN(3) ), XLBEXR ) ELSE ZLBDAR(JL) = 0. END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT #endif !ZLBDAR_RF will be used when we consider rain concentrated in its fraction #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) -!$acc loop independent - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) IF ( ZRRT(JL)>0.0 .AND. ZRF(JL)>0.0 ) THEN ZLBDAR_RF(JL) = XLBR * ( ZRHODREF(JL) * MAX( ZRRT(JL)/ZRF(JL), XRTMIN(3) ) )**XLBEXR ELSE ZLBDAR_RF(JL) = 0. END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT #else -!$acc loop independent - DO CONCURRENT ( JL=1:IMICRO ) + !$mnh_do_concurrent ( JL=1:IMICRO ) IF ( ZRRT(JL)>0.0 .AND. ZRF(JL)>0.0 ) THEN ZLBDAR_RF(JL) = XLBR * BR_POW( ZRHODREF(JL) * MAX( ZRRT(JL)/ZRF(JL), XRTMIN(3) ), XLBEXR ) ELSE ZLBDAR_RF(JL) = 0. END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT #endif !Not necessary but useful for verifications ZUSW(:) = XNEGUNDEF diff --git a/src/MNH/rain_ice_fast_rg.f90 b/src/MNH/rain_ice_fast_rg.f90 index 14101b800..499cb5096 100644 --- a/src/MNH/rain_ice_fast_rg.f90 +++ b/src/MNH/rain_ice_fast_rg.f90 @@ -205,8 +205,7 @@ CALL MNH_MEM_GET( ZZW1, SIZE(PRHODREF), 7 ) !$acc end kernels #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) !$acc parallel present_cr(ZZW1,GWORK) - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN ZZW1(JL,3) = MIN( PRIS(JL),XICFRR * PRIT(JL) & ! RICFRRG * PLBDAR(JL)**XEXICFRR & @@ -219,12 +218,11 @@ CALL MNH_MEM_GET( ZZW1, SIZE(PRHODREF), 7 ) PRGS(JL) = PRGS(JL) + ZZW1(JL,3)+ZZW1(JL,4) PTHS(JL) = PTHS(JL) + ZZW1(JL,4)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*RRCFRIG) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end parallel #else !$acc parallel present_cr(ZZW1,GWORK) - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN ZZW1(JL,3) = MIN( PRIS(JL),XICFRR * PRIT(JL) & ! RICFRRG * BR_POW(PLBDAR(JL),XEXICFRR) & @@ -237,7 +235,7 @@ CALL MNH_MEM_GET( ZZW1, SIZE(PRHODREF), 7 ) PRGS(JL) = PRGS(JL) + ZZW1(JL,3)+ZZW1(JL,4) PTHS(JL) = PTHS(JL) + ZZW1(JL,4)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*RRCFRIG) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end parallel #endif @@ -383,18 +381,17 @@ END IF !* 6.2.5 perform the bilinear interpolation of the normalized ! SDRYG-kernel ! - !$acc loop independent - DO CONCURRENT ( JJ = 1:IGDRY ) + !$mnh_do_concurrent ( JJ = 1:IGDRY ) ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT ! - !$acc loop independent , private (JL) - DO CONCURRENT (JJ=1:IGDRY) + ! acc loop independent , private (JL) + !$mnh_do_concurrent (JJ=1:IGDRY) JL = I1(JJ) #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZZW1(JL,3) = MIN( PRSS(JL),XFSDRYG*ZVEC3(JJ) & ! RSDRYG @@ -413,7 +410,7 @@ END IF + XLBSDRYG2 / ( ZVECLBDAG(JJ) * ZVECLBDAS(JJ) ) & + XLBSDRYG3 / BR_P2(ZVECLBDAS(JJ)) ) ) #endif - END DO + !$mnh_end_do() !$acc end kernels IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(ZZW1,"RAIN_ICE_FAST_RG 6.2.5:ZZW1") @@ -507,17 +504,16 @@ END IF ! RDRYG-kernel ! !$acc kernels ! present_cr(ZVECLBDAG,ZVECLBDAR,ZZW1) - !$acc loop independent - DO CONCURRENT (JJ = 1:IGDRY ) + !$mnh_do_concurrent (JJ = 1:IGDRY ) ZVEC3(JJ) = ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - ( XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) - END DO ! CONCURRENT - !$acc loop independent , private (JL) - DO CONCURRENT (JJ=1:IGDRY) + !$mnh_end_do() ! CONCURRENT + ! acc loop independent , private (JL) + !$mnh_do_concurrent (JJ=1:IGDRY) JL = I1(JJ) #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZZW1(JL,4) = MIN( PRRS(JL),XFRDRYG*ZVEC3(JJ) & ! RRDRYG @@ -534,7 +530,7 @@ END IF + XLBRDRYG2/( ZVECLBDAG(JJ) * ZVECLBDAR(JJ) ) & + XLBRDRYG3/ BR_P2(ZVECLBDAR(JJ)) ) ) #endif - END DO + !$mnh_end_do() !$acc end kernels IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(ZZW1,"RAIN_ICE_FAST_RG 6.2.10:ZZW1") @@ -565,8 +561,7 @@ END IF !$acc end kernels #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) !$acc parallel present_cr(GWORK) - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN ZZW1(JL,5) = MIN( PRIS(JL), & ZZW1(JL,2) / (XCOLIG*EXP(XCOLEXIG*(PZT(JL)-XTT)) ) ) ! RIWETG @@ -587,12 +582,11 @@ END IF ( PRHODREF(JL)*(XLMTT+(XCI-XCL)*(XTT-PZT(JL))) ) ) / & ( PRHODREF(JL)*(XLMTT-XCL*(XTT-PZT(JL))) ) ) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end parallel #else !$acc parallel present_cr(GWORK) -!$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN ZZW1(JL,5) = MIN( PRIS(JL), & ZZW1(JL,2) / (XCOLIG*BR_EXP(XCOLEXIG*(PZT(JL)-XTT)) ) ) ! RIWETG @@ -613,7 +607,7 @@ END IF ( PRHODREF(JL)*(XLMTT+(XCI-XCL)*(XTT-PZT(JL))) ) ) / & ( PRHODREF(JL)*(XLMTT-XCL*(XTT-PZT(JL))) ) ) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end parallel #endif ! @@ -621,8 +615,7 @@ END IF ! !$acc kernels present_cr(GWORK) IF ( KRR == 7 ) THEN -!$acc loop independent -DO CONCURRENT (JL=1:JLU) +!$mnh_do_concurrent (JL=1:JLU) GWORK(JL) = PRGT(JL)>XRTMIN(6) .AND. PZT(JL)<XTT .and. PRDRYG(JL)>=PRWETG(JL) .AND. PRWETG(JL)>0.0 ! Wet case IF( GWORK(JL) )THEN ZZW(JL) = PRWETG(JL) - ZZW1(JL,5) - ZZW1(JL,6) ! RCWETG+RRWETG @@ -650,7 +643,7 @@ DO CONCURRENT (JL=1:JLU) PTHS(JL) = PTHS(JL) + ZZW1(JL,7)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RCWETG+RRWETG)) ENDIF -ENDDO +!$mnh_end_do() ELSE IF( KRR == 6 ) THEN !$mnh_expand_where(JL=1:JLU) GWORK(:) = PRGT(:)>XRTMIN(6) .AND. PZT(:)<XTT .AND. PRDRYG(:)>=PRWETG(:) .AND. PRWETG(:)>0.0 ! Wet case @@ -747,8 +740,7 @@ END IF !$acc end kernels #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) !$acc parallel present_cr(GWORK) - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN ZZW(JL) = PRVT(JL)*PPRES(JL)/((XMV/XMD)+PRVT(JL)) ! Vapor pressure ZZW(JL) = PKA(JL)*(XTT-PZT(JL)) + & @@ -767,12 +759,11 @@ END IF PRGS(JL) = PRGS(JL) - ZZW(JL) PTHS(JL) = PTHS(JL) - ZZW(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RGMLTR)) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end parallel #else !$acc parallel present_cr(GWORK) - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN ZZW(JL) = PRVT(JL)*PPRES(JL)/((XMV/XMD)+PRVT(JL)) ! Vapor pressure ZZW(JL) = PKA(JL)*(XTT-PZT(JL)) + & @@ -791,7 +782,7 @@ END IF PRGS(JL) = PRGS(JL) - ZZW(JL) PTHS(JL) = PTHS(JL) - ZZW(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RGMLTR)) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end parallel #endif diff --git a/src/MNH/rain_ice_fast_rs.f90 b/src/MNH/rain_ice_fast_rs.f90 index 24c30713a..20cc4e8a0 100644 --- a/src/MNH/rain_ice_fast_rs.f90 +++ b/src/MNH/rain_ice_fast_rs.f90 @@ -249,16 +249,15 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) ! 5.1.3 perform the linear interpolation of the normalized ! "2+XDS"-moment of the incomplete gamma function ! - !$acc loop independent - DO CONCURRENT (JJ=1:IGRIM) + !$mnh_do_concurrent (JJ=1:IGRIM) ZVEC1(JJ) = XGAMINC_RIM1( IVEC2(JJ)+1 )* ZVEC2(JJ) & - XGAMINC_RIM1( IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT ! ! 5.1.4 riming of the small sized aggregates ! - !$acc loop independent , private (JL) - DO CONCURRENT ( JJ = 1:IGRIM ) + ! acc loop independent , private (JL) + !$mnh_do_concurrent ( JJ = 1:IGRIM ) JL = I1(JJ) #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZZW1(JJ) = MIN( PRCS(JL), & @@ -274,7 +273,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) PRCS(JL) = PRCS(JL) - ZZW1(JJ) PRSS(JL) = PRSS(JL) + ZZW1(JJ) PTHS(JL) = PTHS(JL) + ZZW1(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RCRIMSS)) - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT ! !$acc end kernels IF (MPPDB_INITIALIZED) THEN @@ -288,17 +287,16 @@ END IF ! 5.1.5 perform the linear interpolation of the normalized ! "XBS"-moment of the incomplete gamma function ! - !$acc loop independent - DO CONCURRENT (JJ=1:IGRIM) + !$mnh_do_concurrent (JJ=1:IGRIM) ZVEC1(JJ) = XGAMINC_RIM2( IVEC2(JJ)+1 )* ZVEC2(JJ) & - XGAMINC_RIM2( IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT ! ! 5.1.6 riming-conversion of the large sized aggregates into graupeln ! ! - !$acc loop independent , private (JL) - DO CONCURRENT (JJ = 1:IGRIM ) + ! acc loop independent , private (JL) + !$mnh_do_concurrent (JJ = 1:IGRIM ) JL = I1(JJ) IF ( PRSS(JL) > 0.0 ) THEN #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) @@ -325,7 +323,7 @@ END IF PRGS(JL) = PRGS(JL) + ZZW2(JJ)+ZZW3(JJ) PTHS(JL) = PTHS(JL) + ZZW2(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RCRIMSG)) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end kernels IF (MPPDB_INITIALIZED) THEN @@ -449,20 +447,19 @@ END IF ! 5.2.3 perform the bilinear interpolation of the normalized ! RACCSS-kernel ! -!$acc loop independent - DO CONCURRENT ( JJ = 1:IGACC ) + !$mnh_do_concurrent ( JJ = 1:IGACC ) ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - ( XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT ! ! 5.2.4 raindrop accretion on the small sized aggregates ! -!$acc loop independent , private (JL) - DO CONCURRENT ( JJ = 1:IGACC ) +! acc loop independent , private (JL) + !$mnh_do_concurrent ( JJ = 1:IGACC ) JL = I1(JJ) #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZZW2(JJ) = & !! coef of RRACCS @@ -481,7 +478,7 @@ END IF PRRS(JL) = PRRS(JL) - ZZW4(JJ) PRSS(JL) = PRSS(JL) + ZZW4(JJ) PTHS(JL) = PTHS(JL) + ZZW4(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RRACCSS)) - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end kernels IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(ZVEC1,"RAIN_ICE_FAST_RS 5.2.4:IVEC1") @@ -498,8 +495,7 @@ END IF ! 5.2.4b perform the bilinear interpolation of the normalized ! RACCS-kernel ! - !$acc loop independent - DO CONCURRENT (JJ = 1:IGACC ) + !$mnh_do_concurrent (JJ = 1:IGACC ) ZVEC3(JJ) = ( XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & - XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & * ZVEC2(JJ) & @@ -507,26 +503,25 @@ END IF - XKER_RACCS(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & * (ZVEC2(JJ) - 1.0) ZZW2(JJ) = ZZW2(JJ) * ZVEC3(JJ) - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !! RRACCS! ! 5.2.5 perform the bilinear interpolation of the normalized ! SACCRG-kernel ! - !$acc loop independent - DO CONCURRENT (JJ = 1:IGACC ) + !$mnh_do_concurrent (JJ = 1:IGACC ) ZVEC3(JJ) = ( XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & - XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & * ZVEC2(JJ) & - ( XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & - XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & * (ZVEC2(JJ) - 1.0) - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT ! ! 5.2.6 raindrop accretion-conversion of the large sized aggregates ! into graupeln ! - !$acc loop independent , private (JL) - DO CONCURRENT ( JJ = 1:IGACC ) + ! acc loop independent , private (JL) + !$mnh_do_concurrent ( JJ = 1:IGACC ) JL = I1(JJ) IF ( PRSS(JL) > 0.0 ) THEN ZZW2(JJ) = MAX( MIN( PRRS(JL),ZZW2(JJ)-ZZW4(JJ) ),0.0 ) ! RRACCSG @@ -551,7 +546,7 @@ END IF ! f(L_f*(RRACCSG)) END IF END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end kernels !$acc end data @@ -591,8 +586,7 @@ END IF GWORK(:) = PRST(:)>XRTMIN(5) .AND. PRSS(:)>0.0 .AND. PZT(:)>XTT !$acc end kernels !$acc parallel present_cr(GWORK,zzw) - !$acc loop independent - DO CONCURRENT (JJ=1:JJU) + !$mnh_do_concurrent (JJ=1:JJU) IF ( GWORK(JJ) ) THEN ZZW(JJ) = PRVT(JJ)*PPRES(JJ)/((XMV/XMD)+PRVT(JJ)) ! Vapor pressure ZZW(JJ) = PKA(JJ)*(XTT-PZT(JJ)) + & @@ -619,7 +613,7 @@ END IF PRSS(JJ) = PRSS(JJ) - ZZW(JJ) PRGS(JJ) = PRGS(JJ) + ZZW(JJ) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end parallel if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'CMEL', & diff --git a/src/MNH/rain_ice_nucleation.f90 b/src/MNH/rain_ice_nucleation.f90 index dbac01ac7..f650d312d 100644 --- a/src/MNH/rain_ice_nucleation.f90 +++ b/src/MNH/rain_ice_nucleation.f90 @@ -49,6 +49,11 @@ use modi_bitrep USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE #endif +#if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP) +!$mnh_undef(LOOP) +!$mnh_undef(OPENACC) +#endif + IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -165,12 +170,9 @@ if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HENU', pris(:, #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) PT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:) / XP00 ) ** ( XRD / XCPD ) #else -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(3) -#endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PT(JI,JJ,JK) = PTHT(JI,JJ,JK) * BR_POW( PPABST(JI,JJ,JK) / XP00, XRD / XCPD ) -END DO +!$mnh_end_do() #endif ! !$acc end kernels @@ -211,54 +213,47 @@ IF( INEGT >= 1 ) THEN !$acc data present( zrvt, zcit, zzt, zpres, zzw, zusw, zssi ) !$acc kernels - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZRVT(JL) = PRVT (I1(JL),I2(JL),I3(JL)) ZCIT(JL) = PCIT (I1(JL),I2(JL),I3(JL)) ZZT(JL) = PT (I1(JL),I2(JL),I3(JL)) ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) - ENDDO + !$mnh_end_do() #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZZW(JL) = EXP( XALPI - XBETAI/ZZT(JL) - XGAMI*LOG(ZZT(JL) ) ) ! es_i - END DO + !$mnh_end_do() #else - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZZW(JL) = BR_EXP( XALPI - XBETAI/ZZT(JL) - XGAMI*BR_LOG(ZZT(JL) ) ) ! es_i - END DO + !$mnh_end_do() #endif - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZZW(JL) = MIN(ZPRES(JL)/2., ZZW(JL)) ! safety limitation ZSSI(JL) = ZRVT(JL)*( ZPRES(JL)-ZZW(JL) ) / ( (XMV/XMD) * ZZW(JL) ) - 1.0 ! Supersaturation over ice - END DO + !$mnh_end_do() #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZUSW(JL) = EXP( XALPW - XBETAW/ZZT(JL) - XGAMW*LOG(ZZT(JL) ) ) ! es_w ZUSW(JL) = MIN(ZPRES(JL)/2.,ZUSW(JL)) ! safety limitation ZUSW(JL) = ( ZUSW(JL)/ZZW(JL) )*( (ZPRES(JL)-ZZW(JL))/(ZPRES(JL)-ZUSW(JL)) ) - 1.0 ! Supersaturation of saturated water vapor over ice - END DO + !$mnh_end_do() #else - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZUSW(JL) = BR_EXP( XALPW - XBETAW/ZZT(JL) - XGAMW*BR_LOG(ZZT(JL) ) ) ! es_w ZUSW(JL) = MIN(ZPRES(JL)/2.,ZUSW(JL)) ! safety limitation ZUSW(JL) = ( ZUSW(JL)/ZZW(JL) )*( (ZPRES(JL)-ZZW(JL))/(ZPRES(JL)-ZUSW(JL)) ) - 1.0 ! Supersaturation of saturated water vapor over ice - END DO + !$mnh_end_do() #endif ! !* 3.1 compute the heterogeneous nucleation source: RVHENI ! !* 3.1.1 compute the cloud ice concentration ! -!$acc loop independent -DO CONCURRENT ( JL=1:INEGT ) +!$mnh_do_concurrent ( JL=1:INEGT ) ZZW(JL) = 0.0 ZSSI(JL) = MIN( ZSSI(JL), ZUSW(JL) ) ! limitation of SSi according to SSw=0 IF ( (ZZT(JL)<XTT-5.0) .AND. (ZSSI(JL)>0.0) ) THEN @@ -268,29 +263,26 @@ DO CONCURRENT ( JL=1:INEGT ) ZZW(JL) = XNU20 * BR_EXP( XALPHA2*ZSSI(JL)-XBETA2 ) #endif END IF -END DO +!$mnh_end_do() #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) IF ( (ZZT(JL)<=XTT-2.0) .AND. (ZZT(JL)>=XTT-5.0) .AND. (ZSSI(JL)>0.0) ) THEN ZZW(JL) = MAX( XNU20 * EXP( -XBETA2 ),XNU10 * EXP( -XBETA1*(ZZT(JL)-XTT) ) * & ( ZSSI(JL)/ZUSW(JL) )**XALPHA1 ) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT #else - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) IF ( (ZZT(JL)<=XTT-2.0) .AND. (ZZT(JL)>=XTT-5.0) .AND. (ZSSI(JL)>0.0) ) THEN ZZW(JL) = MAX( XNU20 * BR_EXP( -XBETA2 ),XNU10 * BR_EXP( -XBETA1*(ZZT(JL)-XTT) ) * & BR_POW( ZSSI(JL)/ZUSW(JL),XALPHA1 ) ) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT #endif ! WARNING COMPILER BUG NVHPC20.X/3 <-> if array syntaxe ZZW(1:INEGT) = ZZW(1:INEGT) - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZZW(JL) = ZZW(JL) - ZCIT(JL) - END DO + !$mnh_end_do() #ifndef MNH_COMPILER_NVHPC ZZWMAX = MAXVAL(ZZW(1:INEGT)) !$acc end kernels @@ -310,15 +302,13 @@ END DO ! !* 3.1.2 update the r_i and r_v mixing ratios ! - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZZW(JL) = MIN( ZZW(JL),50.E3 ) ! limitation provisoire a 50 l^-1 - END DO + !$mnh_end_do() ZW(:,:,:) = 0.0 - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZW(I1(JL), I2(JL), I3(JL)) = ZZW( JL ) - END DO + !$mnh_end_do() ZW(:,:,:) = MAX( ZW(:,:,:) ,0.0 ) *XMNU0/(PRHODREF(:,:,:)*PTSTEP) PRIS(:,:,:) = PRIS(:,:,:) + ZW(:,:,:) PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) @@ -332,15 +322,13 @@ END DO + XCI*(PRIT(:,:,:)+PRST(:,:,:)+PRGT(:,:,:)))*PEXNREF(:,:,:) ) END IF ! f(L_s*(RVHENI)) - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) ZZW(JL) = MAX( ZZW(JL)+ZCIT(JL),ZCIT(JL) ) - END DO + !$mnh_end_do() PCIT(:,:,:) = MAX( PCIT(:,:,:), 0.0 ) - !$acc loop independent - DO CONCURRENT ( JL=1:INEGT ) + !$mnh_do_concurrent ( JL=1:INEGT ) PCIT(I1(JL), I2(JL), I3(JL)) = MAX( ZZW( JL ), PCIT(I1(JL), I2(JL), I3(JL)), 0.0 ) - END DO + !$mnh_end_do() !$acc end kernels END IF diff --git a/src/MNH/rain_ice_red.f90 b/src/MNH/rain_ice_red.f90 index c598b4c69..937ac58e8 100644 --- a/src/MNH/rain_ice_red.f90 +++ b/src/MNH/rain_ice_red.f90 @@ -686,13 +686,6 @@ REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: & ! LOGICAL :: GTEST ! temporary variable for OpenACC character limitation (Cray CCE) -!$acc data present( ODMICRO, PEXN, PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & -!$acc & PHLC_HRC, PTHT, PRVT, & -!$acc & PRCT, PHLC_HCF, PHLI_HRI, PHLI_HCF, PRRT, PRIT, PRST, PRGT, PSIGS, & -!$acc & PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & -!$acc & PINPRC, PINDEP, PINPRR, PEVAP3D, PINPRS, PINPRG, PRAINFR, & -!$acc & PSEA, PTOWN, PRHT, PRHS, PINPRH, PFPR ) - IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(ODMICRO,"RAIN_ICE_RED beg:ODMICRO") @@ -731,6 +724,13 @@ IF (MPPDB_INITIALIZED) THEN IF (PRESENT(PRHS)) CALL MPPDB_CHECK(PRHS,"RAIN_ICE_RED beg:PRHS") END IF +!$acc data present( ODMICRO, PEXN, PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & +!$acc & PHLC_HRC, PTHT, PRVT, & +!$acc & PRCT, PHLC_HCF, PHLI_HRI, PHLI_HCF, PRRT, PRIT, PRST, PRGT, PSIGS, & +!$acc & PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & +!$acc & PINPRC, PINDEP, PINPRR, PEVAP3D, PINPRS, PINPRG, PRAINFR, & +!$acc & PSEA, PTOWN, PRHT, PRHS, PINPRH, PFPR ) + !$acc kernels imicro = count(odmicro) !$acc end kernels @@ -1257,7 +1257,7 @@ ELSE ENDDO ENDDO #else -DO CONCURRENT( JI = 1 : KIT, JJ = 1 : KJT, JK = 1 : KKT ) +!$mnh_do_concurrent( JI = 1 : KIT, JJ = 1 : KJT, JK = 1 : KKT ) ZT(JI,JJ,JK) = PTHT(JI,JJ,JK) * PEXN(JI,JJ,JK) ZZ_LSFACT(JI,JJ,JK)=(XLSTT+(XCPV-XCI)*(ZT(JI,JJ,JK)-XTT)) & /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK)) & @@ -1265,7 +1265,7 @@ DO CONCURRENT( JI = 1 : KIT, JJ = 1 : KJT, JK = 1 : KKT ) ZZ_LVFACT(JI,JJ,JK)=(XLVTT+(XCPV-XCL)*(ZT(JI,JJ,JK)-XTT)) & /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK)) & + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK))) -END DO +!$mnh_end_do() #endif ENDIF !$acc end kernels @@ -1626,8 +1626,9 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, & &ZHLI_HCF, ZHLI_LCF, ZHLI_HRI, ZHLI_LRI, PRAINFR) ! External tendencies -!$acc kernels +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF(GEXT_TEND) THEN +!$acc kernels !$acc loop independent DO JL=1, IMICRO ZA_TH(JL) = ZA_TH(JL) + ZEXT_TH(JL) @@ -1639,7 +1640,9 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies ZA_RG(JL) = ZA_RG(JL) + ZEXT_RG(JL) ZA_RH(JL) = ZA_RH(JL) + ZEXT_RH(JL) ENDDO - ENDIF +!$acc end kernels + ENDIF +!$acc kernels ! !*** 4.2 Integration time ! @@ -1664,6 +1667,8 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies ZW1D(JL) * MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) ENDDO ENDIF +!$acc end kernels +!$acc kernels !We need to adjust tendencies when a specy disappears !When a species is missing, only the external tendencies can be negative (and we must keep track of it) !$acc loop independent @@ -1698,7 +1703,8 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RG(JL)+ZRGT(JL))/MIN(ZA_RG(JL), -1.E-20)) ENDDO - +!$acc end kernels +!$acc kernels IF(KRR==7) THEN !$acc loop independent DO JL=1, IMICRO @@ -1707,7 +1713,9 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RH(JL)+ZRHT(JL))/MIN(ZA_RH(JL), -1.E-20)) ENDDO - ENDIF + ENDIF +!$acc end kernels +!$acc kernels !We stop when the end of the timestep is reached ZCOMPUTE(:)=ZCOMPUTE(:) * MAX(0., -SIGN(1., ZTIME(:)+ZMAXTIME(:)-PTSTEP)) @@ -1725,7 +1733,10 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies !We must recompute tendencies when the maximum allowed change is reached !When a specy is missing, only the external tendencies can be active and we do not want to recompute !the microphysical tendencies when external tendencies are negative (results won't change because specy was already missing) +!$acc end kernels + IF(XMRSTEP/=0.) THEN +!$acc kernels !$acc loop independent DO JL=1, IMICRO ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX) @@ -1806,7 +1817,8 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) ENDDO - +!$acc end kernels +!$acc kernels IF(KRR==7) THEN !$acc loop independent DO JL=1, IMICRO @@ -1824,7 +1836,8 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) ENDDO ENDIF - +!$acc end kernels +!$acc kernels !$acc loop independent DO JL=1, IMICRO ZW1D(JL)=MAX(ABS(ZB_RV(JL)), ABS(ZB_RC(JL)), ABS(ZB_RR(JL)), ABS(ZB_RI(JL)), & @@ -1834,10 +1847,12 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies ZMAXTIME(JL)=(1.-ZW1D(JL))*ZMAXTIME(JL) ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) ENDDO - ENDIF +!$acc end kernels + ENDIF ! !*** 4.3 New values of variables for next iteration ! +!$acc kernels !$acc loop independent DO JL=1, IMICRO ZTHT(JL)=ZTHT(JL)+ZA_TH(JL)*ZMAXTIME(JL)+ZB_TH(JL) @@ -1850,12 +1865,12 @@ DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies ZCIT(JL)=ZCIT(JL) * MAX(0., -SIGN(1., -ZRIT(JL))) ! WHERE(ZRIT(:)==0.) ZCIT(:) = 0. ENDDO !$acc end kernels +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF(KRR==7) THEN !$acc kernels ZRHT(:)=ZRHT(:)+ZA_RH(:)*ZMAXTIME(:)+ZB_RH(:) !$acc end kernels END IF -! !$acc end kernels ! !*** 4.4 Mixing ratio change due to each process ! @@ -1924,7 +1939,7 @@ ENDDO !* 5. UNPACKING DIAGNOSTICS ! --------------------- ! -! !$acc kernels +! ! acc kernels IF(IMICRO>0) THEN !$acc kernels present_cr( ZHLC_HCF3D, ZHLC_LCF3D, ZHLC_HRC3D, ZHLC_LRC3D, ZHLI_HCF3D, ZHLI_LCF3D, ZHLI_HRI3D, ZHLI_LRI3D ) ZHLC_HCF3D(:,:,:)=0. @@ -2000,14 +2015,14 @@ ENDDO !$acc end kernels #else !$acc kernels present_cr( PEXNREF, PRIS, PRVS, PTHS, ZZ_LSFACT, ZZ_LVFACT, ZZ_RVHENI ) -DO CONCURRENT( JI = 1 : KIT, JJ = 1 : KJT, JK = 1 : KKT ) +!$mnh_do_concurrent( JI = 1 : KIT, JJ = 1 : KJT, JK = 1 : KKT ) ZZ_LSFACT(JI,JJ,JK)=ZZ_LSFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK) ZZ_LVFACT(JI,JJ,JK)=ZZ_LVFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK) ZZ_RVHENI(JI,JJ,JK) = MIN(PRVS(JI,JJ,JK), ZZ_RVHENI_MR(JI,JJ,JK)/PTSTEP) PRIS(JI,JJ,JK)=PRIS(JI,JJ,JK)+ZZ_RVHENI(JI,JJ,JK) PRVS(JI,JJ,JK)=PRVS(JI,JJ,JK)-ZZ_RVHENI(JI,JJ,JK) PTHS(JI,JJ,JK)=PTHS(JI,JJ,JK) + ZZ_RVHENI(JI,JJ,JK)*ZZ_LSFACT(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels #endif !$acc update self(PRIS,PRVS,PTHS) @@ -2032,7 +2047,7 @@ IF(GEXT_TEND) THEN !$acc kernels !Z..T variables contain the exeternal tendency, we substract it !$acc loop independent - DO CONCURRENT ( JL = 1 : IMICRO ) + !$mnh_do_concurrent ( JL = 1 : IMICRO ) ZRVT(JL) = ZRVT(JL) - ZEXT_RV(JL) * PTSTEP ZRCT(JL) = ZRCT(JL) - ZEXT_RC(JL) * PTSTEP ZRRT(JL) = ZRRT(JL) - ZEXT_RR(JL) * PTSTEP @@ -2040,14 +2055,14 @@ IF(GEXT_TEND) THEN ZRST(JL) = ZRST(JL) - ZEXT_RS(JL) * PTSTEP ZRGT(JL) = ZRGT(JL) - ZEXT_RG(JL) * PTSTEP ZTHT(JL) = ZTHT(JL) - ZEXT_TH(JL) * PTSTEP - END DO + !$mnh_end_do() !$acc end kernels IF (KRR==7) THEN !$acc kernels !$acc loop independent - DO CONCURRENT ( JL = 1 : IMICRO ) + !$mnh_do_concurrent ( JL = 1 : IMICRO ) ZRHT(JL) = ZRHT(JL) - ZEXT_RH(JL) * PTSTEP - END DO + !$mnh_end_do() !$acc end kernels END IF END IF @@ -2109,14 +2124,14 @@ IF (KRR==7) THEN ELSE !PW: BUG: this should work... -! !$acc kernels +! ! acc kernels ! ZW_RVS(JI,JJ,JK) = 0. ! ZW_RCS(JI,JJ,JK) = 0. ! ZW_RRS(JI,JJ,JK) = 0. ! ZW_RIS(JI,JJ,JK) = 0. ! ZW_RSS(JI,JJ,JK) = 0. ! ZW_RGS(JI,JJ,JK) = 0. -! !$acc loop independent +! ! acc loop independent ! DO JL=1,IMICRO ! ZW_RVS(I1(JL), I2(JL), I3(JL)) = ( ZRVT(JL) - PRVT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP ! ZW_RCS(I1(JL), I2(JL), I3(JL)) = ( ZRCT(JL) - PRCT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP @@ -2125,7 +2140,7 @@ ELSE ! ZW_RSS(I1(JL), I2(JL), I3(JL)) = ( ZRST(JL) - PRST(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP ! ZW_RGS(I1(JL), I2(JL), I3(JL)) = ( ZRGT(JL) - PRGT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP ! END DO -! !$acc end kernels +! ! acc end kernels #if 0 !$acc kernels @@ -2695,6 +2710,8 @@ ENDIF !$acc end data +!$acc end data + #ifdef MNH_OPENACC !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN CALL MNH_MEM_RELEASE() @@ -2722,8 +2739,6 @@ IF (MPPDB_INITIALIZED) THEN IF (PRESENT(PFPR)) CALL MPPDB_CHECK(PFPR, "RAIN_ICE_RED end:PFPR") END IF -!$acc end data - CONTAINS ! SUBROUTINE CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRV, PRC, PRR, & diff --git a/src/MNH/rain_ice_sedimentation_split.f90 b/src/MNH/rain_ice_sedimentation_split.f90 index ab5091edf..91eb1eda9 100644 --- a/src/MNH/rain_ice_sedimentation_split.f90 +++ b/src/MNH/rain_ice_sedimentation_split.f90 @@ -55,6 +55,11 @@ USE MODI_BITREP USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE #endif +#if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP) +!$mnh_undef(LOOP) +!$mnh_undef(OPENACC) +#endif + IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -307,7 +312,7 @@ if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'SE ! O. Initialization of for sedimentation ! !$acc kernels present_cr(ZOMPSEA,ZTMP1_2D,zconc_tmp,ztmp3_2d,ztmp2_2d,ztmp4_2d,ZLBC,ZFSEDC) & -!$acc present_cr(zconc3d,zray,zprrs,zprss) +!$acc & present_cr(zconc3d,zray,zprrs,zprss) ZINVTSTEP=1./PTSTEP ZTSPLITR= PTSTEP / REAL(KSPLITR) ! @@ -459,8 +464,7 @@ DO JN = 1 , KSPLITR IF ( OSEDIC ) THEN ZWSED(:,:,:) = 0. IF( JN==1 ) PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP - !$acc loop independent - DO CONCURRENT (JL=1:ISEDIMC) + !$mnh_do_concurrent (JL=1:ISEDIMC) ZRSLOC = PRCS(IC1(JL),IC2(JL),IC3(JL)) ZRTLOC = PRCT(IC1(JL),IC2(JL),IC3(JL)) IF (ZRSLOC > ZRTMIN(2) .AND. ZRTLOC > XRTMIN(2)) THEN @@ -500,7 +504,7 @@ DO JN = 1 , KSPLITR * BR_POW(ZWLBDC,-XDC)*ZCC*ZFSEDC1D * ZRSLOC #endif END IF - END DO + !$mnh_end_do() DO JK = KKTB , KKTE PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) END DO @@ -519,8 +523,7 @@ DO JN = 1 , KSPLITR ! IF( JN==1 ) PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP ZWSED(:,:,:) = 0. -!$acc loop independent - DO CONCURRENT (JL=1:ISEDIMR) + !$mnh_do_concurrent (JL=1:ISEDIMR) ZRSLOC = PRRS(IR1(JL),IR2(JL),IR3(JL)) IF( ZRSLOC > ZRTMIN(3) ) THEN ZRHODREFLOC = PRHODREF(IR1(JL),IR2(JL),IR3(JL)) @@ -533,7 +536,7 @@ DO JN = 1 , KSPLITR BR_POW(ZRHODREFLOC,XEXSEDR-XCEXVT) #endif END IF - END DO + !$mnh_end_do() DO JK = KKTB , KKTE PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) END DO @@ -552,8 +555,7 @@ DO JN = 1 , KSPLITR ! IF( JN==1 ) PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP ZWSED(:,:,:) = 0. - !$acc loop independent - DO CONCURRENT (JL=1:ISEDIMI) + !$mnh_do_concurrent (JL=1:ISEDIMI) ZRSLOC = PRIS(II1(JL),II2(JL),II3(JL)) IF( ZRSLOC > MAX(ZRTMIN(4),1.0E-7 )) THEN ! limitation of the McF&H formula ZRHODREFLOC = PRHODREF(II1(JL),II2(JL),II3(JL)) @@ -569,7 +571,7 @@ DO JN = 1 , KSPLITR BR_LOG(ZRHODREFLOC*ZRSLOC) ), XEXCSEDI) #endif END IF - END DO + !$mnh_end_do() DO JK = KKTB , KKTE PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) END DO @@ -586,8 +588,7 @@ DO JN = 1 , KSPLITR ! IF( JN==1 ) PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP ZWSED(:,:,:) = 0. - !$acc loop independent - DO CONCURRENT (JL=1:ISEDIMS) + !$mnh_do_concurrent (JL=1:ISEDIMS) ZRSLOC = PRSS(IS1(JL),IS2(JL),IS3(JL)) IF( ZRSLOC > ZRTMIN(5) ) THEN ZRHODREFLOC = PRHODREF(IS1(JL),IS2(JL),IS3(JL)) @@ -599,7 +600,7 @@ DO JN = 1 , KSPLITR BR_POW(ZRHODREFLOC,XEXSEDS-XCEXVT) #endif END IF - END DO + !$mnh_end_do() DO JK = KKTB , KKTE PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) END DO @@ -617,8 +618,7 @@ DO JN = 1 , KSPLITR ! ZWSED(:,:,:) = 0. IF( JN==1 ) PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP - !$acc loop independent - DO CONCURRENT (JL=1:ISEDIMG) + !$mnh_do_concurrent (JL=1:ISEDIMG) ZRSLOC = PRGS(IG1(JL),IG2(JL),IG3(JL)) IF( ZRSLOC > ZRTMIN(6) ) THEN ZRHODREFLOC = PRHODREF(IG1(JL),IG2(JL),IG3(JL)) @@ -630,7 +630,7 @@ DO JN = 1 , KSPLITR BR_POW(ZRHODREFLOC,XEXSEDG-XCEXVT) #endif END IF - END DO + !$mnh_end_do() DO JK = KKTB , KKTE PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) END DO @@ -649,8 +649,7 @@ DO JN = 1 , KSPLITR IF ( KRR == 7 ) THEN IF( JN==1 ) PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP ZWSED(:,:,:) = 0. - !$acc loop independent - DO CONCURRENT (JL=1:ISEDIMH) + !$mnh_do_concurrent (JL=1:ISEDIMH) ZRSLOC = PRHS(IH1(JL),IH2(JL),IH3(JL)) IF( ZRSLOC > ZRTMIN(7) ) THEN ZRHODREFLOC = PRHODREF(IH1(JL),IH2(JL),IH3(JL)) @@ -662,7 +661,7 @@ DO JN = 1 , KSPLITR BR_POW(ZRHODREFLOC,XEXSEDH-XCEXVT) #endif END IF - END DO + !$mnh_end_do() DO JK = KKTB , KKTE PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) END DO diff --git a/src/MNH/rain_ice_slow.f90 b/src/MNH/rain_ice_slow.f90 index 690cbda36..ff37338cc 100644 --- a/src/MNH/rain_ice_slow.f90 +++ b/src/MNH/rain_ice_slow.f90 @@ -210,9 +210,9 @@ CALL MNH_MEM_GET( zz_diff, SIZE(PLSFACT) ) #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) PDV(:) = 0.211E-4 * (PZT(:)/XTT)**1.94 * (XP00/PPRES(:)) ! D_v #else -DO CONCURRENT ( JL=1:JLU ) +!$mnh_do_concurrent ( JL=1:JLU ) PDV(JL) = 0.211E-4 * BR_POW(PZT(JL)/XTT,1.94) * (XP00/PPRES(JL)) ! D_v -END DO +!$mnh_end_do() #endif ! !* 3.4.1 compute the thermodynamical function A_i(T,P) @@ -224,12 +224,12 @@ END DO + ( XRV*PZT(:) ) / (PDV(:)*PAI(:)) PCJ(:) = XSCFAC * PRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(PZT(:)-XTT) ) #else -DO CONCURRENT ( JL=1:JLU ) +!$mnh_do_concurrent ( JL=1:JLU ) PAI(JL) = BR_EXP( XALPI - XBETAI/PZT(JL) - XGAMI*BR_LOG(PZT(JL) ) ) ! es_i PAI(JL) = BR_P2( XLSTT + (XCPV-XCI)*(PZT(JL)-XTT) ) / (PKA(JL)*XRV*BR_P2(PZT(JL))) & + ( XRV*PZT(JL) ) / (PDV(JL)*PAI(JL)) PCJ(JL) = XSCFAC * BR_POW(PRHODREF(JL),0.3) / BR_POW( 1.718E-5+0.0049E-5*(PZT(JL)-XTT) , 0.5) -END DO +!$mnh_end_do() #endif ! !* 3.4.2 compute the riming-conversion of r_c for r_i production: RCAUTI @@ -261,7 +261,7 @@ END DO ZZW(:) = 0.0 GWORK(:) = (PRST(:)>XRTMIN(5)) .AND. (PRSS(:)>0.0) !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN ZZW(JL) = ( PSSI(JL)/(PRHODREF(JL)*PAI(JL)) ) * & #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) @@ -275,7 +275,7 @@ END DO PRVS(JL) = PRVS(JL) - ZZW(JL) PTHS(JL) = PTHS(JL) + ZZW(JL)*PLSFACT(JL) END IF - END DO + !$mnh_end_do() !$acc end kernels if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPS', & @@ -291,7 +291,7 @@ END DO ZZW(:) = 0.0 GWORK(:) = PRIT(:)>XRTMIN(4) .AND. PRST(:)>XRTMIN(5) .AND. PRIS(:)>0.0 !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZZW(JL) = MIN( PRIS(JL),XFIAGGS * EXP( XCOLEXIS*(PZT(JL)-XTT) ) & @@ -307,7 +307,7 @@ END DO PRSS(JL) = PRSS(JL) + ZZW(JL) PRIS(JL) = PRIS(JL) - ZZW(JL) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end kernels if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'AGGS', & @@ -321,9 +321,9 @@ END DO #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PZT(:)-XTT)+XBCRIAUTI)) #else -DO CONCURRENT ( JL=1:JLU ) +!$mnh_do_concurrent ( JL=1:JLU ) ZCRIAUTI(JL)=MIN(XCRIAUTI, BR_POW(10.,XACRIAUTI*(PZT(JL)-XTT)+XBCRIAUTI) ) -END DO +!$mnh_end_do() #endif ZZW(:) = 0.0 GWORK(:) = PRIT(:)>XRTMIN(4) .AND. PRIS(:)>0.0 @@ -354,7 +354,7 @@ END DO !$acc kernels GWORK(:) = PRGT(:)>0.0 !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) PLBDAG(JL) = XLBG*( PRHODREF(JL)*MAX( PRGT(JL),XRTMIN(6) ) )**XLBEXG @@ -364,11 +364,11 @@ END DO ELSE PLBDAG(JL) = 0. END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT ZZW(:) = 0.0 GWORK(:) = PRGT(:)>XRTMIN(6) .AND. PRGS(:)>0.0 !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN ZZW(JL) = ( PSSI(JL)/(PRHODREF(JL)*PAI(JL)) ) * & #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) @@ -382,7 +382,7 @@ END DO PRVS(JL) = PRVS(JL) - ZZW(JL) PTHS(JL) = PTHS(JL) + ZZW(JL)*PLSFACT(JL) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end kernels if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPG', & diff --git a/src/MNH/rain_ice_warm.f90 b/src/MNH/rain_ice_warm.f90 index 48ec7a5d0..2fb7efda0 100644 --- a/src/MNH/rain_ice_warm.f90 +++ b/src/MNH/rain_ice_warm.f90 @@ -44,6 +44,11 @@ use MODE_MSG USE MODI_BITREP #endif +#if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP) +!$mnh_undef(LOOP) +!$mnh_undef(OPENACC) +#endif + IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -202,8 +207,7 @@ zzw(JL) = 0. !$acc kernels !CLoud water and rain are diluted over the grid box GWORK(:) = PRCT(:)>XRTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. PRCS(:)>0.0 - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN ZZW(JL) = MIN( PRCS(JL), XFCACCR * PRCT(JL) & #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) @@ -216,7 +220,7 @@ zzw(JL) = 0. PRCS(JL) = PRCS(JL) - ZZW(JL) PRRS(JL) = PRRS(JL) + ZZW(JL) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end kernels ELSEIF (CSUBG_RC_RR_ACCR=='PRFR') THEN @@ -233,8 +237,7 @@ zzw(JL) = 0. ! => min(PCF, PRF)-PHLC_HCF ZZW(:) = 0. GWORK(:) = PHLC_HRC(:)>XRTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. PRCS(:)>0.0 .AND. PHLC_HCF(:)>0 - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN !Accretion due to rain falling in high cloud content ZZW(JL) = XFCACCR * ( PHLC_HRC(JL)/PHLC_HCF(JL) ) & @@ -247,10 +250,9 @@ zzw(JL) = 0. #endif * PHLC_HCF(JL) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT GWORK(:) = PHLC_LRC(:)>XRTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. PRCS(:)>0.0 .AND. PHLC_LCF(:)>0 - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN !We add acrretion due to rain falling in low cloud content #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) @@ -268,7 +270,7 @@ zzw(JL) = 0. ZZW(JL)=MIN(PRCS(JL), ZZW(JL)) PRCS(JL) = PRCS(JL) - ZZW(JL) PRRS(JL) = PRRS(JL) + ZZW(JL) - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end kernels ELSE @@ -306,8 +308,7 @@ zzw(JL) = 0. END WHERE !$mnh_end_expand_where() #else - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) IF ( GWORK(JL) ) THEN #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZZW(JL) = EXP( XALPW - XBETAW/PZT(JL) - XGAMW*LOG(PZT(JL) ) ) ! es_w @@ -332,7 +333,7 @@ zzw(JL) = 0. PRVS(JL) = PRVS(JL) + ZZW(JL) PTHS(JL) = PTHS(JL) - ZZW(JL)*PLVFACT(JL) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT #endif !$acc end kernels ELSEIF (CSUBG_RR_EVAP=='CLFR' .OR. CSUBG_RR_EVAP=='PRFR') THEN @@ -360,8 +361,7 @@ IF (CSUBG_RR_EVAP=='CLFR') GCSUBG_RR_EVAP=.true. !Ces variables devraient être sorties de rain_ice_slow et on mettrait le calcul de T^u, T^s !et plusieurs versions (comme actuellement, en ciel clair, en ciel nuageux) de PKA, PDV, PCJ dans rain_ice !On utiliserait la bonne version suivant l'option NONE, CLFR... dans l'évaporation et ailleurs - !$acc loop independent - DO CONCURRENT ( JL=1:JLU ) + !$mnh_do_concurrent ( JL=1:JLU ) GWORK(JL) = PRRT(JL)>XRTMIN(3) .AND. ZZW4(JL)>PCF(JL) IF ( GWORK(JL) ) THEN ! outside the cloud (environment) the use of T^u (unsaturated) instead of T @@ -400,7 +400,7 @@ IF (CSUBG_RR_EVAP=='CLFR') GCSUBG_RR_EVAP=.true. PRVS(JL) = PRVS(JL) + ZZW(JL) PTHS(JL) = PTHS(JL) - ZZW(JL)*PLVFACT(JL) END IF - END DO ! CONCURRENT + !$mnh_end_do() ! CONCURRENT !$acc end kernels ELSE diff --git a/src/MNH/rotate_wind.f90 b/src/MNH/rotate_wind.f90 index c08f6ffa4..f2b752afb 100644 --- a/src/MNH/rotate_wind.f90 +++ b/src/MNH/rotate_wind.f90 @@ -117,6 +117,11 @@ use mode_mppdb USE MODI_BITREP #endif ! +#if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP) +!$mnh_undef(LOOP) +!$mnh_undef(OPENACC) +#endif +! IMPLICIT NONE ! ! @@ -236,7 +241,7 @@ JLOC(:,:)=NINT(SIGN(1.,-PSINSLOPE(:,:))) ! interpolation in x direction ! !$acc_nv loop independent collapse(2) -DO CONCURRENT(JI=IIB:IIE,JJ=1:IJU) +!$mnh_do_concurrent(JI=IIB:IIE,JJ=1:IJU) ZCOEFF(JI,JJ) = & (0.5*PDXX(JI,JJ,IKB) + 0.5*PDZZ(JI,JJ,IKB)*PDIRCOSXW(JI,JJ) ) & * 2. / (PDXX(JI,JJ,IKB)+PDXX(JI+1,JJ,IKB)) @@ -251,12 +256,12 @@ DO CONCURRENT(JI=IIB:IIE,JJ=1:IJU) ZWINT(JI,JJ) = ZCOEFM(JI,JJ) * (PW(JI,JJ,IKB+1)+ZWGROUND(JI,JJ)) * 0.5 & + (1.-ZCOEFM(JI,JJ)) & *(PW(JI+ILOC(JI,JJ),JJ,IKB+1)+ZWGROUND(JI+ILOC(JI,JJ),JJ)) * 0.5 -END DO +!$mnh_end_do() ! ! interpolation in y direction ! !$acc_nv loop independent collapse(2) -DO CONCURRENT(JI=IIB:IIE,JJ=IJB:IJE) +!$mnh_do_concurrent(JI=IIB:IIE,JJ=IJB:IJE) ZCOEFF(JI,JJ) = & (0.5*PDYY(JI,JJ,IKB) + 0.5*PDZZ(JI,JJ,IKB)*PDIRCOSYW(JI,JJ) ) & * 2. / (PDYY(JI,JJ,IKB)+PDYY(JI+1,JJ,IKB)) @@ -269,14 +274,14 @@ DO CONCURRENT(JI=IIB:IIE,JJ=IJB:IJE) (1.-ZCOEFM(JI,JJ)) * ZUINT(JI,JJ+JLOC(JI,JJ)) ZWFIN(JI,JJ) = ZCOEFM(JI,JJ) * ZWINT(JI,JJ) + & (1.-ZCOEFM(JI,JJ)) * ZWINT(JI,JJ+JLOC(JI,JJ)) -END DO +!$mnh_end_do() ! !* 3. ROTATE THE WIND ! --------------- ! ! !$acc_nv loop independent collapse(2) -DO CONCURRENT(JI=IIB:IIE,JJ=IJB:IJE) +!$mnh_do_concurrent(JI=IIB:IIE,JJ=IJB:IJE) PUSLOPE(JI,JJ) = PCOSSLOPE(JI,JJ) * PDIRCOSZW(JI,JJ) * ZUFIN(JI,JJ) + & PSINSLOPE(JI,JJ) * PDIRCOSZW(JI,JJ) * ZVFIN(JI,JJ) + & #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) @@ -288,7 +293,7 @@ DO CONCURRENT(JI=IIB:IIE,JJ=IJB:IJE) PVSLOPE(JI,JJ) =-PSINSLOPE(JI,JJ) * ZUFIN(JI,JJ) + & PCOSSLOPE(JI,JJ) * ZVFIN(JI,JJ) ! -END DO +!$mnh_end_do() !$acc end kernels !$acc end data diff --git a/src/MNH/sources_neg_correct.f90 b/src/MNH/sources_neg_correct.f90 index f08c426fa..551de61db 100644 --- a/src/MNH/sources_neg_correct.f90 +++ b/src/MNH/sources_neg_correct.f90 @@ -304,14 +304,14 @@ CLOUD: select case ( hcloud ) end if !$acc kernels do jr = 4, jrmax - do concurrent( ji = 1 : jiu, jj = 1 : jju, jk = 1 : jku ) + !$mnh_do_concurrent( ji = 1 : jiu, jj = 1 : jju, jk = 1 : jku ) if ( prrs(ji, jj, jk, jr) < 0. ) then prrs(ji, jj, jk, 1) = prrs(ji, jj, jk, 1) + prrs(ji, jj, jk, jr) prths(ji, jj, jk) = prths(ji, jj, jk) - prrs(ji, jj, jk, jr) * zls(ji, jj, jk) / & ( zcph(ji, jj, jk) * zexn(ji, jj, jk) ) prrs(ji, jj, jk, jr) = 0. end if - end do + !$mnh_end_do() end do !$acc end kernels ! @@ -323,32 +323,32 @@ CLOUD: select case ( hcloud ) end if !$acc kernels do jr = 2, jrmax - do concurrent( ji = 1 : jiu, jj = 1 : jju, jk = 1 : jku ) + !$mnh_do_concurrent( ji = 1 : jiu, jj = 1 : jju, jk = 1 : jku ) if ( prrs(ji, jj, jk, jr) < 0. ) then prrs(ji, jj, jk, 1) = prrs(ji, jj, jk, 1) + prrs(ji, jj, jk, jr) prths(ji, jj, jk) = prths(ji, jj, jk) - prrs(ji, jj, jk, jr) * zlv(ji, jj, jk) / & ( zcph(ji, jj, jk) * zexn(ji, jj, jk) ) prrs(ji, jj, jk, jr) = 0. end if - end do + !$mnh_end_do() end do ! ! if rc or ri are positive, we can correct negative rv ! cloud - do concurrent( ji = 1 : jiu, jj = 1 : jju, jk = 1 : jku ) + !$mnh_do_concurrent( ji = 1 : jiu, jj = 1 : jju, jk = 1 : jku ) if ( prrs(ji, jj, jk, 1) < 0. .and. prrs(ji, jj, jk, 2) > 0. ) then prrs(ji, jj, jk, 1) = prrs(ji, jj, jk, 1) + prrs(ji, jj, jk, 2) prths(ji, jj, jk) = prths(ji, jj, jk) - prrs(ji, jj, jk, 2) * zlv(ji, jj, jk) / & ( zcph(ji, jj, jk) * zexn(ji, jj, jk) ) prrs(ji, jj, jk, 2) = 0. end if - end do + !$mnh_end_do() ! ice if ( krr > 3 ) then #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - do concurrent( ji = 1 : jiu, jj = 1 : jju, jk = 1 : jku ) + !$mnh_do_concurrent( ji = 1 : jiu, jj = 1 : jju, jk = 1 : jku ) if ( prrs(ji, jj, jk, 1) < 0. .and. prrs(ji, jj, jk, 4) > 0. ) then zcor(ji, jj, jk) = Min( -prrs(ji, jj, jk, 1), prrs(ji, jj, jk, 4) ) prrs(ji, jj, jk, 1) = prrs(ji, jj, jk, 1) + zcor(ji, jj, jk) @@ -356,7 +356,7 @@ CLOUD: select case ( hcloud ) ( zcph(ji, jj, jk) * zexn(ji, jj, jk) ) prrs(ji, jj, jk, 4) = prrs(ji, jj, jk, 4) - zcor(ji, jj, jk) end if - end do + !$mnh_end_do() end if !$acc end kernels ! diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90 index 0636775b9..68b912f64 100644 --- a/src/MNH/tke_eps_sources.f90 +++ b/src/MNH/tke_eps_sources.f90 @@ -207,6 +207,11 @@ USE MODI_SHUMAN_DEVICE #endif USE MODI_TRIDIAG_TKE ! +#if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP) +!$mnh_undef(LOOP) +!$mnh_undef(OPENACC) +#endif +! IMPLICIT NONE ! ! @@ -350,9 +355,9 @@ ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZKEFF(JI,JJ,JK) = PLM(JI,JJ,JK) * BR_POW(PTKEM(JI,JJ,JK),0.5) -END DO +!$mnh_end_do() #endif ! !$acc end kernels @@ -391,18 +396,18 @@ ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = XCED * BR_POW(PTKEM(JI,JJ,JK),0.5) / PLEPS(JI,JJ,JK) -END DO +!$mnh_end_do() #endif #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZSOURCE(JI,JJ,JK) = ( PRTKES(JI,JJ,JK) + PRTKESM(JI,JJ,JK) ) / PRHODJ(JI,JJ,JK) & - PTKEM(JI,JJ,JK) / PTSTEP & + PDP(JI,JJ,JK) + PTP(JI,JJ,JK) + PTR(JI,JJ,JK) - PEXPL * ZFLX(JI,JJ,JK) * PTKEM(JI,JJ,JK) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! !* 2.2 implicit vertical TKE transport @@ -428,9 +433,9 @@ ZA(:,:,:) = - PTSTEP * XCET * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) / PD !$mnh_end_expand_array() #else !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZA(JI,JJ,JK) = - PTSTEP * XCET * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) / BR_P2(PDZZ(JI,JJ,JK)) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT #endif !$acc end kernels #endif @@ -446,9 +451,9 @@ CALL GET_HALO(ZRES) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = PTSTEP*ZFLX(JI,JJ,JK) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels CALL TRIDIAG_TKE(KKA,KKU,KKL,PTKEM,ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,& & ZSOURCE,ZTMP3_DEVICE,ZRES) @@ -556,9 +561,9 @@ if (lbudget_tke) then end if !$acc kernels -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PRTKES(JI,JJ,JK) = ZRES(JI,JJ,JK) * PRHODJ(JI,JJ,JK) / PTSTEP - PRTKESM(JI,JJ,JK) -ENDDO +!$mnh_end_do() !$acc end kernels ! ! stores the whole turbulent transport @@ -576,10 +581,10 @@ if (lbudget_tke) call Budget_store_end( tbudgets(NBUDGET_TKE), 'TR', prtkes(:, : PRTHLS(:,:,:) = PRTHLS(:,:,:) + XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:) #else -DO CONCURRENT (JI=1:JIU, JJ=1:JJU ,JK=1:JKU) +!$mnh_do_concurrent (JI=1:JIU, JJ=1:JJU ,JK=1:JKU) PRTHLS(JI,JJ,JK) = PRTHLS(JI,JJ,JK) + XCED * BR_POW(PTKEM(JI,JJ,JK),0.5) / PLEPS(JI,JJ,JK) * & (PEXPL*PTKEM(JI,JJ,JK) + PIMPL*ZRES(JI,JJ,JK)) * PRHODJ(JI,JJ,JK) * PCOEF_DISS(JI,JJ,JK) -ENDDO +!$mnh_end_do() #endif !$acc end kernels @@ -594,9 +599,9 @@ if (lbudget_th) call Budget_store_end( tbudgets(NBUDGET_TH), 'DISSH', prthls(:, #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) PDISS(:,:,:) = -XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) #else -DO CONCURRENT (JI=1:JIU, JJ=1:JJU, JK=1:JKU) +!$mnh_do_concurrent (JI=1:JIU, JJ=1:JJU, JK=1:JKU) PDISS(JI,JJ,JK) = -XCED * BR_POW(PTKEM(JI,JJ,JK),1.5) / PLEPS(JI,JJ,JK) -ENDDO +!$mnh_end_do() #endif !$acc end kernels ! diff --git a/src/MNH/tridiag_thermo.f90 b/src/MNH/tridiag_thermo.f90 index 871581a06..2855dae8e 100644 --- a/src/MNH/tridiag_thermo.f90 +++ b/src/MNH/tridiag_thermo.f90 @@ -263,9 +263,9 @@ CALL MZM_DEVICE(PRHODJ,ZMZM_RHODJ) ZRHODJ_DFDDTDZ_O_DZ2(:,:,:) = ZMZM_RHODJ(:,:,:)*PDFDDTDZ(:,:,:)/PDZZ(:,:,:)**2 #else !$acc_nv loop independent collapse(3) -DO CONCURRENT (JK=1:JKU,JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JK=1:JKU,JJ=1:JJU,JI=1:JIU) ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK) = ZMZM_RHODJ(JI,JJ,JK)*PDFDDTDZ(JI,JJ,JK)/BR_P2(PDZZ(JI,JJ,JK)) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT #endif !$acc end kernels ! @@ -282,23 +282,17 @@ ZY=0. ! --------------------------- ! !$acc kernels ! async -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZY(JI,JJ,IKB) = PRHODJ(JI,JJ,IKB)*PVARM(JI,JJ,IKB)/PTSTEP & - ZMZM_RHODJ(JI,JJ,IKB+KKL) * PF(JI,JJ,IKB+KKL)/PDZZ(JI,JJ,IKB+KKL) & + ZMZM_RHODJ(JI,JJ,IKB ) * PF(JI,JJ,IKB )/PDZZ(JI,JJ,IKB ) & + ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKB+KKL) * PIMPL * PVARM(JI,JJ,IKB+KKL) & - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKB+KKL) * PIMPL * PVARM(JI,JJ,IKB ) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! !$acc kernels ! async -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(3) -#endif -DO CONCURRENT (JK=IKTB+1:IKTE-1,JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JK=IKTB+1:IKTE-1,JJ=1:JJU,JI=1:JIU) ZY(JI,JJ,JK) = PRHODJ(JI,JJ,JK)*PVARM(JI,JJ,JK)/PTSTEP & - ZMZM_RHODJ(JI,JJ,JK+KKL) * PF(JI,JJ,JK+KKL)/PDZZ(JI,JJ,JK+KKL) & + ZMZM_RHODJ(JI,JJ,JK ) * PF(JI,JJ,JK )/PDZZ(JI,JJ,JK ) & @@ -306,20 +300,17 @@ DO CONCURRENT (JK=IKTB+1:IKTE-1,JJ=1:JJU,JI=1:JIU) - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK+KKL) * PIMPL * PVARM(JI,JJ,JK ) & - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK ) * PIMPL * PVARM(JI,JJ,JK ) & + ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK ) * PIMPL * PVARM(JI,JJ,JK-KKL) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! !$acc kernels ! async -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZY(JI,JJ,IKE) = PRHODJ(JI,JJ,IKE)*PVARM(JI,JJ,IKE)/PTSTEP & - ZMZM_RHODJ(JI,JJ,IKE+KKL) * PF(JI,JJ,IKE+KKL)/PDZZ(JI,JJ,IKE+KKL) & + ZMZM_RHODJ(JI,JJ,IKE ) * PF(JI,JJ,IKE )/PDZZ(JI,JJ,IKE ) & - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKE ) * PIMPL * PVARM(JI,JJ,IKE ) & + ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKE ) * PIMPL * PVARM(JI,JJ,IKE-KKL) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! ! acc wait @@ -333,46 +324,34 @@ IF ( PIMPL > 1.E-10 ) THEN ! -------------- ! !$acc kernels ! async -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZB(JI,JJ,IKB) = PRHODJ(JI,JJ,IKB)/PTSTEP & - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKB+KKL) * PIMPL -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! !$acc kernels ! async -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZC(JI,JJ,IKB) = ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKB+KKL) * PIMPL -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! !$acc kernels ! async -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(3) -#endif -DO CONCURRENT (JK=IKTB+1:IKTE-1,JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JK=IKTB+1:IKTE-1,JJ=1:JJU,JI=1:JIU) ZA(JI,JJ,JK) = ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK) * PIMPL ZB(JI,JJ,JK) = PRHODJ(JI,JJ,JK)/PTSTEP & - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK+KKL) * PIMPL & - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK) * PIMPL ZC(JI,JJ,JK) = ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,JK+KKL) * PIMPL -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! !$acc kernels ! async -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZA(JI,JJ,IKE) = ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKE ) * PIMPL ZB(JI,JJ,IKE) = PRHODJ(JI,JJ,IKE)/PTSTEP & - ZRHODJ_DFDDTDZ_O_DZ2(JI,JJ,IKE ) * PIMPL -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! ! acc wait @@ -382,13 +361,10 @@ END DO !CONCURRENT ! -------- ! !$acc kernels -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZBET(JI,JJ) = ZB(JI,JJ,IKB) ! bet = b(ikb) PVARP(JI,JJ,IKB) = ZY(JI,JJ,IKB) / ZBET(JI,JJ) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! !$acc parallel @@ -397,32 +373,27 @@ DO JK = IKB+KKL,IKE-KKL,KKL #ifdef MNH_COMPILER_NVHPC ! gang+vector needed or parallisation vector only !$acc loop independent gang, vector collapse(2) -#else - !$acc loop independent #endif - DO CONCURRENT (JJ=1:JJU,JI=1:JIU) + !$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZGAM(JI,JJ,JK) = ZC(JI,JJ,JK-KKL) / ZBET(JI,JJ) ! gam(k) = c(k-1) / bet ZBET(JI,JJ) = ZB(JI,JJ,JK) - ZA(JI,JJ,JK) * ZGAM(JI,JJ,JK) ! bet = b(k) - a(k)* gam(k) PVARP(JI,JJ,JK)= ( ZY(JI,JJ,JK) - ZA(JI,JJ,JK) * PVARP(JI,JJ,JK-KKL) ) / ZBET(JI,JJ) ! res(k) = (y(k) -a(k)*res(k-1))/ bet - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT END DO !$acc end parallel !$acc kernels ! special treatment for the last level -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZGAM(JI,JJ,IKE) = ZC(JI,JJ,IKE-KKL) / ZBET(JI,JJ) ! gam(k) = c(k-1) / bet ZBET(JI,JJ) = ZB(JI,JJ,IKE) - ZA(JI,JJ,IKE) * ZGAM(JI,JJ,IKE) ! bet = b(k) - a(k)* gam(k) PVARP(JI,JJ,IKE)= ( ZY(JI,JJ,IKE) - ZA(JI,JJ,IKE) * PVARP(JI,JJ,IKE-KKL) ) / ZBET(JI,JJ) ! res(k) = (y(k) -a(k)*res(k-1))/ bet -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! !* 3.3 going down @@ -434,24 +405,19 @@ DO JK = IKE-KKL,IKB,-1*KKL #ifdef MNH_COMPILER_NVHPC ! gang+vector needed or parallisation vector only !$acc loop independent gang, vector collapse(2) -#else - !$acc loop independent #endif - DO CONCURRENT (JJ=1:JJU,JI=1:JIU) + !$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) PVARP(JI,JJ,JK) = PVARP(JI,JJ,JK) - ZGAM(JI,JJ,JK+KKL) * PVARP(JI,JJ,JK+KKL) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT END DO !$acc end parallel ! ELSE ! !$acc kernels -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(3) -#endif -DO CONCURRENT (JK=IKTB:IKTE,JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JK=IKTB:IKTE,JJ=1:JJU,JI=1:JIU) PVARP(JI,JJ,JK) = ZY(JI,JJ,JK) * PTSTEP / PRHODJ(JI,JJ,JK) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! END IF @@ -461,13 +427,10 @@ END IF ! ---------------------------------------- ! !$acc kernels -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) PVARP(JI,JJ,KKA)=PVARP(JI,JJ,IKB) PVARP(JI,JJ,KKU)=PVARP(JI,JJ,IKE) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels if ( mppdb_initialized ) then diff --git a/src/MNH/tridiag_tke.f90 b/src/MNH/tridiag_tke.f90 index 89840fb59..ba836e09c 100644 --- a/src/MNH/tridiag_tke.f90 +++ b/src/MNH/tridiag_tke.f90 @@ -221,42 +221,31 @@ IKE=KKU-JPVEXT_TURB*KKL !$acc kernels ! ! -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZY(JI,JJ,IKB) = PVARM(JI,JJ,IKB) + PTSTEP*PSOURCE(JI,JJ,IKB) - & PEXPL / PRHODJ(JI,JJ,IKB) * PA(JI,JJ,IKB+KKL) * (PVARM(JI,JJ,IKB+KKL) - PVARM(JI,JJ,IKB)) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! !$acc parallel !$acc loop seq DO JK=IKTB+1,IKTE-1 -#ifdef MNH_COMPILER_NVHPC - !$acc loop independent collapse(2) -#else - !$acc loop independent -#endif - DO CONCURRENT (JJ=1:JJU,JI=1:JIU) + !$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZY(JI,JJ,JK)= PVARM(JI,JJ,JK) + PTSTEP*PSOURCE(JI,JJ,JK) - & PEXPL / PRHODJ(JI,JJ,JK) * & ( PVARM(JI,JJ,JK-KKL)*PA(JI,JJ,JK) & -PVARM(JI,JJ,JK)*(PA(JI,JJ,JK)+PA(JI,JJ,JK+KKL)) & +PVARM(JI,JJ,JK+KKL)*PA(JI,JJ,JK+KKL) & ) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT END DO !$acc end parallel ! !$acc kernels -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZY(JI,JJ,IKE)= PVARM(JI,JJ,IKE) + PTSTEP*PSOURCE(JI,JJ,IKE) + & PEXPL / PRHODJ(JI,JJ,IKE) * PA(JI,JJ,IKE) * (PVARM(JI,JJ,IKE)-PVARM(JI,JJ,IKE-KKL)) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels ! ! @@ -268,14 +257,11 @@ IF ( PIMPL > 1.E-10 ) THEN ! ! going up ! -#ifdef MNH_COMPILER_NVHPC - !$acc loop independent collapse(2) -#endif - DO CONCURRENT (JJ=1:JJU,JI=1:JIU) + !$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZBET(JI,JJ) = 1. + PIMPL * (PDIAG(JI,JJ,IKB)-PA(JI,JJ,IKB+KKL) / PRHODJ(JI,JJ,IKB)) ! bet = b(ikb) PVARP(JI,JJ,IKB) = ZY(JI,JJ,IKB) / ZBET(JI,JJ) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT ! !$acc end kernels !$acc parallel @@ -283,10 +269,8 @@ IF ( PIMPL > 1.E-10 ) THEN DO JK = IKB+KKL,IKE-KKL,KKL #ifdef MNH_COMPILER_NVHPC !$acc loop gang, vector collapse(2) independent -#else - !$acc loop independent #endif - DO CONCURRENT (JJ=1:JJU,JI=1:JIU) + !$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZGAM(JI,JJ,JK) = PIMPL * PA(JI,JJ,JK) / PRHODJ(JI,JJ,JK-KKL) / ZBET(JI,JJ) ! gam(k) = c(k-1) / bet ZBET(JI,JJ) = 1. + PIMPL * ( PDIAG(JI,JJ,JK) - & @@ -298,15 +282,12 @@ IF ( PIMPL > 1.E-10 ) THEN * PVARP(JI,JJ,JK-KKL) & ) / ZBET(JI,JJ) ! res(k) = (y(k) -a(k)*res(k-1))/ bet - END DO + !$mnh_end_do() END DO !$acc end parallel !$acc kernels ! special treatment for the last level -#ifdef MNH_COMPILER_NVHPC - !$acc loop independent collapse(2) -#endif - DO CONCURRENT (JJ=1:JJU,JI=1:JIU) + !$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) ZGAM(JI,JJ,IKE) = PIMPL * PA(JI,JJ,IKE) / PRHODJ(JI,JJ,IKE-KKL) / ZBET(JI,JJ) ! gam(k) = c(k-1) / bet ZBET(JI,JJ) = 1. + PIMPL * ( PDIAG(JI,JJ,IKE) - & @@ -317,7 +298,7 @@ IF ( PIMPL > 1.E-10 ) THEN * PVARP(JI,JJ,IKE-KKL) & ) / ZBET(JI,JJ) ! res(k) = (y(k) -a(k)*res(k-1))/ bet - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels ! ! going down @@ -325,26 +306,18 @@ IF ( PIMPL > 1.E-10 ) THEN !$acc parallel !$acc loop seq DO JK = IKE-KKL,IKB,-1*KKL -#ifdef MNH_COMPILER_NVHPC - !$acc loop gang, vector collapse(2) -#else - !$acc loop independent -#endif - DO CONCURRENT (JJ=1:JJU,JI=1:JIU) + !$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) PVARP(JI,JJ,JK) = PVARP(JI,JJ,JK) - ZGAM(JI,JJ,JK+KKL) * PVARP(JI,JJ,JK+KKL) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT END DO !$acc end parallel ! ELSE ! !$acc kernels -#ifdef MNH_COMPILER_NVHPC - !$acc loop independent collapse(2) -#endif - DO CONCURRENT (JJ=1:JJU,JI=1:JIU) + !$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) PVARP(JI,JJ,IKTB:IKTE) = ZY(JI,JJ,IKTB:IKTE) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT ! !$acc end kernels END IF @@ -354,13 +327,10 @@ END IF ! ---------------------------------------- ! !$acc kernels -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(2) -#endif -DO CONCURRENT (JJ=1:JJU,JI=1:JIU) +!$mnh_do_concurrent (JJ=1:JJU,JI=1:JIU) PVARP(JI,JJ,KKA)=PVARP(JI,JJ,IKB) PVARP(JI,JJ,KKU)=PVARP(JI,JJ,IKE) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels if ( mppdb_initialized ) then diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index abfde1c07..9b44aed1e 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -761,9 +761,9 @@ ELSE #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZEXN(:,:,:) = (PPABST(:,:,:)/XP00) ** (XRD/XCPD) #else -DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZEXN(JI,JJ,JK) = BR_POW(PPABST(JI,JJ,JK)/XP00,XRD/XCPD) -END DO +!$mnh_end_do() #endif END IF ! @@ -812,11 +812,11 @@ IF (KRRL >=1) THEN ZLSOCPEXNM,ZAMOIST_ICE,ZATHETA_ICE) ! !$acc kernels present_cr( zamoist, zatheta, zlocpexnm, zlvocpexnm, zlsocpexnm, zamoist_ice, zatheta_ice ) - DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU,JK=1:JKU) IF (PRT(JI,JJ,JK,2)+PRT(JI,JJ,JK,4)>0.0) THEN ZFRAC_ICE(JI,JJ,JK) = PRT(JI,JJ,JK,4) / ( PRT(JI,JJ,JK,2)+PRT(JI,JJ,JK,4) ) END IF - END DO + !$mnh_end_do() ! ZLOCPEXNM(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZLVOCPEXNM(:,:,:) & +ZFRAC_ICE(:,:,:) *ZLSOCPEXNM(:,:,:) @@ -878,7 +878,7 @@ END IF ! loop end on KRRL >= 1 IF ( KRRL >= 1 ) THEN !$acc kernels present_cr( zlocpexnm ) IF ( KRRI >= 1 ) THEN - DO CONCURRENT (JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent (JI=1:JIU,JJ=1:JJU,JK=1:JKU) ! Rnp at t PRT(JI,JJ,JK,1) = PRT(JI,JJ,JK,1) + PRT(JI,JJ,JK,2) + PRT(JI,JJ,JK,4) PRRS(JI,JJ,JK,1) = PRRS(JI,JJ,JK,1) + PRRS(JI,JJ,JK,2) + PRRS(JI,JJ,JK,4) @@ -887,16 +887,16 @@ IF ( KRRL >= 1 ) THEN - ZLSOCPEXNM(JI,JJ,JK) * PRT(JI,JJ,JK,4) PRTHLS(JI,JJ,JK) = PRTHLS(JI,JJ,JK) - ZLVOCPEXNM(JI,JJ,JK) * PRRS(JI,JJ,JK,2) & - ZLSOCPEXNM(JI,JJ,JK) * PRRS(JI,JJ,JK,4) - ENDDO + !$mnh_end_do() ELSE - DO CONCURRENT (JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent (JI=1:JIU,JJ=1:JJU,JK=1:JKU) ! Rnp at t PRT(JI,JJ,JK,1) = PRT(JI,JJ,JK,1) + PRT(JI,JJ,JK,2) PRRS(JI,JJ,JK,1) = PRRS(JI,JJ,JK,1) + PRRS(JI,JJ,JK,2) ! Theta_l at t PTHLT(JI,JJ,JK) = PTHLT(JI,JJ,JK) - ZLOCPEXNM(JI,JJ,JK) * PRT(JI,JJ,JK,2) PRTHLS(JI,JJ,JK) = PRTHLS(JI,JJ,JK) - ZLOCPEXNM(JI,JJ,JK) * PRRS(JI,JJ,JK,2) - ENDDO + !$mnh_end_do() END IF !$acc end kernels END IF @@ -1085,10 +1085,10 @@ ENDIF (XMNH_TINY + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) ) #else !$acc_nv loop independent collapse(2) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZCDUEFF(JI,JJ) =-SQRT ( (BR_P2(PSFU(JI,JJ)) + BR_P2(PSFV(JI,JJ))) / & (XMNH_TINY + BR_P2(ZUSLOPE(JI,JJ)) + BR_P2(ZVSLOPE(JI,JJ)) ) ) - END DO + !$mnh_end_do() #endif !$acc end kernels ! @@ -1870,9 +1870,9 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZRVSAT(:,:,:) = EXP( PALP - PBETA/PT(:,:,:) - PGAM*ALOG( PT(:,:,:) ) ) #else - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZRVSAT(JI,JJ,JK) = BR_EXP( PALP - PBETA/PT(JI,JJ,JK) - PGAM*BR_LOG( PT(JI,JJ,JK) ) ) - END DO + !$mnh_end_do() #endif !$acc end kernels !$acc kernels present_cr(ZRVSAT,ZDRVSATDT) @@ -1909,7 +1909,7 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) #else !$acc kernels !$acc_nv loop independent collapse(3) -DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU,JK=1:JKU) PATHETA(JI,JJ,JK)= PAMOIST(JI,JJ,JK) * PEXN(JI,JJ,JK) * & ( ( ZRVSAT(JI,JJ,JK) - PRT(JI,JJ,JK,1) ) * PLOCPEXN(JI,JJ,JK) / & ( 1. + ZDRVSATDT(JI,JJ,JK) * PLOCPEXN(JI,JJ,JK) ) * & @@ -1921,7 +1921,7 @@ DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) ) & - ZDRVSATDT(JI,JJ,JK) & ) -ENDDO +!$mnh_end_do() !$acc end kernels #endif !* 1.7 Lv/Cph/Exner at t-1 @@ -1929,9 +1929,9 @@ ENDDO !!$acc kernels present(PLOCPEXN) !$acc kernels !$acc_nv loop independent collapse(3) -DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU,JK=1:JKU) PLOCPEXN(JI,JJ,JK) = PLOCPEXN(JI,JJ,JK) / PEXN(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels if ( mppdb_initialized ) then @@ -2211,6 +2211,7 @@ REAL :: ZD ! distance to the surface real, dimension(:,:,:), pointer , contiguous :: ztmp1_device, ztmp2_device #endif ! +LOGICAL :: GZD !------------------------------------------------------------------------------- JIU=SIZE(pdxx,1) JJU=SIZE(pdxx,2) @@ -2271,9 +2272,9 @@ IF (ODZ) THEN !$acc end kernels #else !$acc kernels -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PLM(JI,JJ,JK) = BR_POW( PLM(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK), 1./3. ) -ENDDO +!$mnh_end_do() !$acc end kernels #endif #endif @@ -2305,9 +2306,9 @@ ELSE #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) PLM(:,:,:) = ( ZTMP1_DEVICE * ZTMP2_DEVICE ) ** (1./2.) #else - DO CONCURRENT( JI=1:JIU, JJ=1:JJU, JK=1:JKU ) + !$mnh_do_concurrent( JI=1:JIU, JJ=1:JJU, JK=1:JKU ) PLM(JI,JJ,JK) = BR_POW( ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK), 1. / 2. ) - END DO + !$mnh_end_do() #endif !$acc end kernels #endif @@ -2329,24 +2330,23 @@ IF (.NOT. ORMC01) THEN !$acc kernels DO JJ=1,JJU DO JI=1,JIU + GZD = .TRUE. IF (GOCEAN) THEN !$acc loop seq DO JK=KKTE,KKTB,-1 ZD=ZALPHA*(PZZ(JI,JJ,KKTE+1)-PZZ(JI,JJ,JK)) - IF ( PLM(JI,JJ,JK)>ZD) THEN + IF ( (PLM(JI,JJ,JK)>ZD) .AND. GZD ) THEN PLM(JI,JJ,JK)=ZD - ELSE - EXIT + GZD = .FALSE. ENDIF END DO ELSE !$acc loop seq DO JK=KKTB,KKTE ZD = ZALPHA * ( 0.5 * ( PZZ(JI, JJ, JK) + PZZ(JI, JJ, JK+KKL) ) - PZZ(JI, JJ, KKB) ) * PDIRCOSZW(JI, JJ) - IF ( PLM(JI,JJ,JK) > ZD ) THEN + IF ( ( PLM(JI,JJ,JK) > ZD ) .AND. GZD ) THEN PLM(JI,JJ,JK) = ZD - ELSE - EXIT + GZD = .FALSE. ENDIF END DO ENDIF @@ -2356,12 +2356,12 @@ IF (.NOT. ORMC01) THEN END IF ! !$acc kernels -DO CONCURRENT(JI=1:JIU , JJ=1:JJU ) +!$mnh_do_concurrent(JI=1:JIU , JJ=1:JJU ) PLM(JI,JJ,KKA) = PLM(JI,JJ,KKB ) -END DO -DO CONCURRENT(JI=1:JIU , JJ=1:JJU ) +!$mnh_end_do() +!$mnh_do_concurrent(JI=1:JIU , JJ=1:JJU ) PLM(JI,JJ,KKU ) = PLM(JI,JJ,KKE) -END DO +!$mnh_end_do() !$acc end kernels !$acc end data @@ -2469,6 +2469,7 @@ REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZTMP1_DEVICE,ZTMP2_DEVICE #endif INTEGER :: JIU,JJU,JKU LOGICAL :: GOCEAN !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) +LOGiCAL :: GZD !---------------------------------------------------------------------------- !$acc data present( PDXX, PDYY, PDZZ, PZZ, PDIRCOSZW, PTHLT, PTHVREF, PTKET, PSRCT, PRT, PLOCPEXNM, PATHETA, PAMOIST, PLM ) @@ -2576,9 +2577,9 @@ IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme call Mppdb_check( plm, "Dear mid1:plm" ) end if !$acc kernels -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PLM(JI,JJ,JK) = BR_POW( PLM(JI,JJ,JK)*ZTMP1_DEVICE(JI,JJ,JK) *ZTMP2_DEVICE(JI,JJ,JK) , 1./3. ) -ENDDO +!$mnh_end_do() !$acc end kernels if ( mppdb_initialized ) then call Mppdb_check( plm, "Dear mid2:plm" ) @@ -2600,7 +2601,7 @@ CALL EMOIST(KRR,KRRI,PTHLT,PRT,PLOCPEXNM,PAMOIST,PSRCT,ZEMOIST) !$acc kernels present(ZWORK2D,PLM) IF (KRR>0) THEN !$acc_nv loop independent collapse(3) private(ZVAR) - DO CONCURRENT( JI=1:JIU, JJ=1:JJU, JK = KKTB+1:KKTE-1) + !$mnh_do_concurrent( JI=1:JIU, JJ=1:JJU, JK = KKTB+1:KKTE-1) ZDTHLDZ(JI,JJ,JK)= 0.5*((PTHLT(JI,JJ,JK+KKL)-PTHLT(JI,JJ,JK ))/PDZZ(JI,JJ,JK+KKL)+ & (PTHLT(JI,JJ,JK )-PTHLT(JI,JJ,JK-KKL))/PDZZ(JI,JJ,JK )) ZDRTDZ(JI,JJ,JK) = 0.5*((PRT(JI,JJ,JK+KKL,1)-PRT(JI,JJ,JK ,1))/PDZZ(JI,JJ,JK+KKL)+ & @@ -2616,10 +2617,10 @@ IF (KRR>0) THEN PLM(JI,JJ,JK)=MAX(XMNH_EPSILON,MIN(PLM(JI,JJ,JK), & 0.76* SQRT(PTKET(JI,JJ,JK)/ZVAR))) END IF - END DO + !$mnh_end_do() ELSE! For dry atmos or unsalted ocean runs !$acc_nv loop independent collapse(3) private(ZVAR) - DO CONCURRENT( JI=1:JIU, JJ=1:JJU, JK = KKTB+1:KKTE-1) + !$mnh_do_concurrent( JI=1:JIU, JJ=1:JJU, JK = KKTB+1:KKTE-1) ZDTHLDZ(JI,JJ,JK)= 0.5*((PTHLT(JI,JJ,JK+KKL)-PTHLT(JI,JJ,JK ))/PDZZ(JI,JJ,JK+KKL)+ & (PTHLT(JI,JJ,JK )-PTHLT(JI,JJ,JK-KKL))/PDZZ(JI,JJ,JK )) IF (GOCEAN) THEN @@ -2632,7 +2633,7 @@ ELSE! For dry atmos or unsalted ocean runs PLM(JI,JJ,JK)=MAX(XMNH_EPSILON,MIN(PLM(JI,JJ,JK), & 0.76* SQRT(PTKET(JI,JJ,JK)/ZVAR))) END IF - END DO + !$mnh_end_do() END IF ! special case near the surface ZDTHLDZ(:,:,KKB)=(PTHLT(:,:,KKB+KKL)-PTHLT(:,:,KKB))/PDZZ(:,:,KKB+KKL) @@ -2652,9 +2653,9 @@ IF (GOCEAN) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(2) #endif - DO CONCURRENT( JI = 1 : JIU, JJ = 1 : JJU ) + !$mnh_do_concurrent( JI = 1 : JIU, JJ = 1 : JJU ) ZWORK2D(JI,JJ)=XG*(XALPHAOC*ZDTHLDZ(JI,JJ,KKB)-XBETAOC*ZDRTDZ(JI,JJ,KKB)) - END DO + !$mnh_end_do() #endif ELSE #if 0 @@ -2666,18 +2667,18 @@ ELSE #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(2) #endif - DO CONCURRENT( JI = 1 : JIU, JJ = 1 : JJU ) + !$mnh_do_concurrent( JI = 1 : JIU, JJ = 1 : JJU ) ZWORK2D(JI,JJ)=XG/PTHVREF(JI,JJ,KKB)* & (ZETHETA(JI,JJ,KKB)*ZDTHLDZ(JI,JJ,KKB)+ZEMOIST(JI,JJ,KKB)*ZDRTDZ(JI,JJ,KKB)) - END DO + !$mnh_end_do() #endif END IF -DO CONCURRENT(JI=1:JIU,JJ=1:JJU) +!$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU) IF (ZWORK2D(JI,JJ)>0.) THEN PLM(JI,JJ,KKB)=MAX(XMNH_EPSILON,MIN( PLM(JI,JJ,KKB), & 0.76* SQRT(PTKET(JI,JJ,KKB)/ZWORK2D(JI,JJ)))) END IF -END DO +!$mnh_end_do() ! ! mixing length limited by the distance normal to the surface (with the same factor as for BL89) ! @@ -2686,14 +2687,14 @@ IF (.NOT. ORMC01) THEN ! DO JJ=1,SIZE(PLM,2) DO JI=1,SIZE(PLM,1) + GZD = .TRUE. IF (GOCEAN) THEN !$acc loop seq DO JK=KKTE,KKTB,-1 ZD=ZALPHA*(PZZ(JI,JJ,KKTE+1)-PZZ(JI,JJ,JK)) - IF ( PLM(JI,JJ,JK)>ZD) THEN + IF ( (PLM(JI,JJ,JK)>ZD) .AND. GZD ) THEN PLM(JI,JJ,JK)=ZD - ELSE - EXIT + GZD = .FALSE. ENDIF END DO ELSE @@ -2701,10 +2702,9 @@ IF (.NOT. ORMC01) THEN DO JK=KKTB,KKTE ZD=ZALPHA*(0.5*(PZZ(JI,JJ,JK)+PZZ(JI,JJ,JK+KKL))-PZZ(JI,JJ,KKB)) & *PDIRCOSZW(JI,JJ) - IF ( PLM(JI,JJ,JK)>ZD) THEN + IF ( (PLM(JI,JJ,JK)>ZD) .AND. GZD ) THEN PLM(JI,JJ,JK)=ZD - ELSE - EXIT + GZD = .FALSE. ENDIF END DO ENDIF diff --git a/src/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90 index e1fc823fd..7fbb58985 100644 --- a/src/MNH/turb_hor_thermo_flux.f90 +++ b/src/MNH/turb_hor_thermo_flux.f90 @@ -333,9 +333,9 @@ CALL MXM_DEVICE( PK, ZTMP1_DEVICE ) CALL GX_M_U_DEVICE(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX,ZTMP2_DEVICE) !$acc kernels present_cr(ZFLX) !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = -XCSHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) -END DO +!$mnh_end_do() ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) !$acc end kernels #endif @@ -374,9 +374,9 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( SPREAD( PSFTHM(:,:)* PDIRCOSXW(:,:), 3,1) ) - ZFLX(:,:,IKB:IKB) #else ! acc kernels present_cr(ZTMP1_DEVICE) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZTMP1_DEVICE(JI,JJ,1) = PSFTHM(JI,JJ)* PDIRCOSXW(JI,JJ) -END DO +!$mnh_end_do() !$acc end kernels CALL MXM_DEVICE( ZTMP1_DEVICE(:,:,1:1), ZTMP2_DEVICE(:,:,1:1) ) !$acc kernels present_cr(ZFLX) @@ -399,30 +399,30 @@ IF (.NOT. LFLAT) THEN CALL MXM_DEVICE(PRHODJ, ZTMP1_DEVICE) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DXF_DEVICE(ZTMP2_DEVICE, ZTMP3_DEVICE) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MXF_DEVICE(ZTMP2_DEVICE, ZTMP4_DEVICE) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels CALL DZF_DEVICE( ZTMP2_DEVICE, ZTMP4_DEVICE ) !$acc kernels present_cr(PRTHLS) @@ -766,9 +766,9 @@ END IF CALL GX_M_U_DEVICE(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP2_DEVICE) !$acc kernels present_cr(ZFLX) !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = -XCHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) -END DO +!$mnh_end_do() ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) !$acc end kernels ! @@ -805,37 +805,37 @@ END DO CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DZF_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PRRS(JI,JJ,JK,1) = PRRS(JI,JJ,JK,1) - ZTMP3_DEVICE(JI,JJ,JK) + ZTMP4_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels ELSE CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE) @@ -1141,9 +1141,9 @@ END IF CALL GY_M_V_DEVICE(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY,ZTMP2_DEVICE) !$acc kernels present_cr(ZFLX) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = -XCSHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) !$acc end kernels ELSE @@ -1188,37 +1188,37 @@ IF (.NOT. L2D) THEN CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZM_DEVICE(ZTMP1_DEVICE, ZTMP2_DEVICE) !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MYF_DEVICE(ZTMP1_DEVICE, ZTMP2_DEVICE) !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DZF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PRTHLS(JI,JJ,JK) = PRTHLS(JI,JJ,JK) - ZTMP3_DEVICE(JI,JJ,JK) + ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels ELSE CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) @@ -1508,9 +1508,9 @@ IF (KRR/=0) THEN CALL GY_M_V_DEVICE(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY, ZTMP2_DEVICE) !$acc kernels present_cr(ZFLX) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = -XCHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) !$acc end kernels ELSE @@ -1554,39 +1554,39 @@ IF (KRR/=0) THEN CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) ! !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE) !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MYF_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE) !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DZF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) ! !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PRRS(JI,JJ,JK,1) = PRRS(JI,JJ,JK,1) - ZTMP3_DEVICE(JI,JJ,JK) + ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels ELSE CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) diff --git a/src/MNH/turb_hor_tke.f90 b/src/MNH/turb_hor_tke.f90 index d538b366d..2e97d39d2 100644 --- a/src/MNH/turb_hor_tke.f90 +++ b/src/MNH/turb_hor_tke.f90 @@ -227,9 +227,9 @@ CALL GX_M_U_DEVICE(1,IKU,1,PTKEM,PDXX,PDZZ,PDZX,ZTMP2_DEVICE) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = -XCET * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) ! < u'e > -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT #endif ! ! special case near the ground ( uncentred gradient ) @@ -237,11 +237,11 @@ END DO !CONCURRENT #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(2) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZFLX(JI,JJ,IKB) = ZCOEFF(JI,JJ,IKB+2)*PTKEM(JI,JJ,IKB+2) & + ZCOEFF(JI,JJ,IKB+1)*PTKEM(JI,JJ,IKB+1) & + ZCOEFF(JI,JJ,IKB )*PTKEM(JI,JJ,IKB ) -END DO +!$mnh_end_do() !$acc end kernels ! #ifndef MNH_OPENACC @@ -298,45 +298,45 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL DXF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)*PINV_PDXX(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MXF_DEVICE( ZTMP2_DEVICE,ZTMP3_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL DZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PTRH(JI,JJ,JK) =-( ZTMP1_DEVICE(JI,JJ,JK) - ZTMP3_DEVICE(JI,JJ,JK) ) /PRHODJ(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels ELSE CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE) @@ -380,9 +380,9 @@ IF (.NOT. L2D) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) =-XCET * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) ! < v'e > - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels #endif ! @@ -454,46 +454,46 @@ IF (.NOT. L2D) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL DYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)*PINV_PDYY(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL DZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PTRH(JI,JJ,JK) = PTRH(JI,JJ,JK) - ( ZTMP1_DEVICE(JI,JJ,JK) - ZTMP3_DEVICE(JI,JJ,JK) ) & /PRHODJ(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels ELSE CALL MYM_DEVICE(PRHODJ,ZTMP1_DEVICE) diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90 index 186fb9de8..0c003af62 100644 --- a/src/MNH/turb_hor_uw.f90 +++ b/src/MNH/turb_hor_uw.f90 @@ -289,9 +289,9 @@ CALL MXM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = - XCMFS * ZTMP2_DEVICE(JI,JJ,JK) * GX_W_UW_PWM(JI,JJ,JK) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT #endif !! & to be tested !! - (2./3.) * XCMFB * MZM( ZVPTU * MXM( PLM / SQRT(PTKEM) * XG / PTHVREF ) ) @@ -332,18 +332,18 @@ CALL MXM_DEVICE( PDZZ, ZTMP2_DEVICE ) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)* ZTMP1_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels CALL DZF_DEVICE( ZTMP3_DEVICE, ZTMP1_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PRUS(JI,JJ,JK) = PRUS(JI,JJ,JK) - ZTMP1_DEVICE(JI,JJ,JK) -END DO !CONCURRENT +!$mnh_end_do() !CONCURRENT !$acc end kernels #endif ! @@ -362,18 +362,18 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE, ZTMP1_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL DXF_DEVICE( ZTMP2_DEVICE,ZTMP1_DEVICE) IF (.NOT. LFLAT) THEN @@ -381,18 +381,18 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)*PDZX(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK)*PINV_PDXX(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) CALL MZF_DEVICE( PDZZ, ZTMP2_DEVICE ) @@ -400,20 +400,20 @@ IF (.NOT. LFLAT) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP4_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL DZM_DEVICE( ZTMP4_DEVICE, ZTMP2_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PRWS(JI,JJ,JK) = PRWS(JI,JJ,JK) & - ZTMP1_DEVICE(JI,JJ,JK) & + ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels ELSE !$acc kernels @@ -435,9 +435,9 @@ IF (KSPLT==1) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) *( ZTMP1_DEVICE(JI,JJ,JK) + GX_W_UW_PWM(JI,JJ,JK) ) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MXF_DEVICE( ZTMP2_DEVICE,ZTMP1_DEVICE ) CALL MZF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) @@ -445,9 +445,9 @@ IF (KSPLT==1) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZWORK(JI,JJ,JK) = -ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels #endif ! diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90 index 023773412..7f67565d3 100644 --- a/src/MNH/turb_hor_vw.f90 +++ b/src/MNH/turb_hor_vw.f90 @@ -289,9 +289,9 @@ IF (.NOT. L2D) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = - XCMFS * ZTMP2_DEVICE(JI,JJ,JK) * GY_W_VW_PWM(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels #endif ELSE @@ -339,18 +339,18 @@ IF (.NOT. L2D) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK)* ZTMP1_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL DZF_DEVICE( ZTMP3_DEVICE, ZTMP1_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PRVS(JI,JJ,JK) = PRVS(JI,JJ,JK) - ZTMP1_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels ENDIF #endif @@ -374,36 +374,36 @@ IF (.NOT. L2D) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE, ZTMP1_DEVICE) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP1_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) *PDZY(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE) CALL MZF_DEVICE( PDZZ, ZTMP2_DEVICE ) @@ -411,20 +411,20 @@ IF (.NOT. L2D) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP4_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL DZM_DEVICE( ZTMP4_DEVICE, ZTMP2_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PRWS(JI,JJ,JK) = PRWS(JI,JJ,JK) & - ZTMP1_DEVICE(JI,JJ,JK) & + ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels ELSE CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) @@ -456,9 +456,9 @@ IF (KSPLT==1) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) *( ZTMP1_DEVICE(JI,JJ,JK) + GY_W_VW_PWM(JI,JJ,JK) ) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) CALL MZF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) @@ -466,9 +466,9 @@ IF (KSPLT==1) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZWORK(JI,JJ,JK) = -ZTMP2_DEVICE(JI,JJ,JK) - END DO !CONCURRENT + !$mnh_end_do() !CONCURRENT !$acc end kernels #endif ! diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90 index 21851b90b..4963175b2 100644 --- a/src/MNH/turb_ver.f90 +++ b/src/MNH/turb_ver.f90 @@ -679,9 +679,9 @@ ENDIF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZD(JI,JJ,JK) = (1.+ZREDTH1(JI,JJ,JK)+ZREDR1(JI,JJ,JK)) * (1.+0.5*(ZREDTH1(JI,JJ,JK)+ZREDR1(JI,JJ,JK))) -END DO +!$mnh_end_do() !$acc end kernels ! ! Phi3 and Psi3 Prandtl numbers diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index f608c5be7..6046b2f54 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -532,9 +532,9 @@ ZSOURCE(:,:,:) = 0. ZDIRSINZW(:,:) = SQRT(1.-PDIRCOSZW(:,:)**2) #else !$acc_nv loop independent collapse(2) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZDIRSINZW(JI,JJ) = SQRT(1.-BR_P2(PDIRCOSZW(JI,JJ))) -END DO +!$mnh_end_do() #endif !$acc end kernels @@ -584,9 +584,9 @@ CALL MXM_DEVICE( PDZZ, ZTMP4_DEVICE ) ZA(:,:,:) = -PTSTEP * XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP3_DEVICE(:,:,:) / ZTMP4_DEVICE(:,:,:)**2 #else !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZA(JI,JJ,JK) = -PTSTEP * XCMFS * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / BR_P2(ZTMP4_DEVICE(JI,JJ,JK)) -END DO +!$mnh_end_do() #endif !$acc end kernels #endif @@ -602,28 +602,28 @@ ZCOEFFLXU(:,:,1) = PCDUEFF(:,:) * (PDIRCOSZW(:,:)**2 - ZDIRSINZW(:,:)**2) & * PCOSSLOPE(:,:) #else !$acc_nv loop independent collapse(2) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZCOEFFLXU(JI,JJ,1) = PCDUEFF(JI,JJ) * (BR_P2(PDIRCOSZW(JI,JJ)) - BR_P2(ZDIRSINZW(JI,JJ))) & * PCOSSLOPE(JI,JJ) -END DO +!$mnh_end_do() #endif !$acc_nv loop independent collapse(2) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZCOEFFLXV(JI,JJ,1) = PCDUEFF(JI,JJ) * PDIRCOSZW(JI,JJ) * PSINSLOPE(JI,JJ) ! prepare the implicit scheme coefficients for the surface flux ZCOEFS(JI,JJ,1)= ZCOEFFLXU(JI,JJ,1) * PCOSSLOPE(JI,JJ) * PDIRCOSZW(JI,JJ) & +ZCOEFFLXV(JI,JJ,1) * PSINSLOPE(JI,JJ) -END DO +!$mnh_end_do() ! ! average this flux to be located at the U,W vorticity point #ifndef MNH_OPENACC ZCOEFS(:,:,1:1)=MXM(ZCOEFS(:,:,1:1) / PDZZ(:,:,IKB:IKB) ) #else !$acc_nv loop independent collapse(2) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZTMP1_DEVICE(JI,JJ,1) = ZCOEFS(JI,JJ,1) / PDZZ(JI,JJ,IKB) -END DO +!$mnh_end_do() !$acc end kernels CALL MXM_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZCOEFS(:,:,1:1)) #endif @@ -729,18 +729,18 @@ ZFLXZ(:,:,:) = -XCMFS * MXM(ZKEFF) * & #else !$acc kernels !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PIMPL*ZRES(JI,JJ,JK) + PEXPL*PUM(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels CALL MXM_DEVICE(ZKEFF,ZTMP1_DEVICE) CALL DZM_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) CALL MXM_DEVICE(PDZZ,ZTMP4_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLXZ(JI,JJ,JK) = -XCMFS * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / ZTMP4_DEVICE(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels #endif ! @@ -802,9 +802,9 @@ PDP(:,:,:) = - MZF( MXF ( ZFLXZ * GZ_U_UW(PUM,PDZZ) ) ) CALL GZ_U_UW_DEVICE(PUM,PDZZ,ZTMP1_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) ZTMP2_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels CALL MXF_DEVICE( ZTMP2_DEVICE,ZTMP3_DEVICE ) CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) @@ -904,39 +904,39 @@ IF(HTURBDIM=='3DIM') THEN CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) /PDXX(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DXF_DEVICE( ZTMP2_DEVICE,ZTMP1_DEVICE ) IF (.NOT. LFLAT) THEN CALL MZF_DEVICE( PDZZ, ZTMP2_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK)*PDZX(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) / PDXX(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MXF_DEVICE( ZTMP3_DEVICE,ZTMP4_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DZM_DEVICE( ZTMP3_DEVICE, ZTMP2_DEVICE ) !$acc kernels present_cr(PRWS) @@ -957,17 +957,17 @@ IF(HTURBDIM=='3DIM') THEN CALL GX_W_UW_DEVICE( PWM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) CALL MZF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZA(JI,JJ,JK)=-ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels #endif ! @@ -1116,9 +1116,9 @@ CALL MYM_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) ZA(:,:,:) = - PTSTEP * XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP4_DEVICE(:,:,:) / ZTMP2_DEVICE(:,:,:)**2 #else !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZA(JI,JJ,JK) = - PTSTEP * XCMFS * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) / BR_P2(ZTMP2_DEVICE(JI,JJ,JK)) -END DO +!$mnh_end_do() #endif #endif ! @@ -1132,28 +1132,28 @@ ZCOEFFLXU(:,:,1) = PCDUEFF(:,:) * (PDIRCOSZW(:,:)**2 - ZDIRSINZW(:,:)**2) & * PSINSLOPE(:,:) #else !$acc_nv loop independent collapse(2) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZCOEFFLXU(JI,JJ,1) = PCDUEFF(JI,JJ) * (BR_P2(PDIRCOSZW(JI,JJ)) - BR_P2(ZDIRSINZW(JI,JJ))) & * PSINSLOPE(JI,JJ) -END DO +!$mnh_end_do() #endif ZCOEFFLXV(:,:,1) = PCDUEFF(:,:) * PDIRCOSZW(:,:) * PCOSSLOPE(:,:) ! prepare the implicit scheme coefficients for the surface flux !$acc_nv loop independent collapse(2) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZCOEFS(JI,JJ,1)= ZCOEFFLXU(JI,JJ,1) * PSINSLOPE(JI,JJ) * PDIRCOSZW(JI,JJ) & +ZCOEFFLXV(JI,JJ,1) * PCOSSLOPE(JI,JJ) -END DO +!$mnh_end_do() ! ! average this flux to be located at the V,W vorticity point #ifndef MNH_OPENACC ZCOEFS(:,:,1:1)=MYM(ZCOEFS(:,:,1:1) / PDZZ(:,:,IKB:IKB) ) #else !$acc_nv loop independent collapse(2) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZTMP1_DEVICE(JI,JJ,1) = ZCOEFS(JI,JJ,1) / PDZZ(JI,JJ,IKB) -END DO +!$mnh_end_do() !$acc end kernels CALL MYM_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZCOEFS(:,:,1:1) ) #endif @@ -1257,18 +1257,18 @@ ZFLXZ(:,:,IKB:IKB) = MYM(PDZZ(:,:,IKB:IKB)) * & #else !$acc kernels !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PIMPL*ZRES(JI,JJ,JK) + PEXPL*PVM(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels CALL DZM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) CALL MYM_DEVICE(PDZZ,ZTMP3_DEVICE) CALL MYM_DEVICE(ZKEFF,ZTMP1_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLXZ(JI,JJ,JK) = -XCMFS * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) / ZTMP3_DEVICE(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels ! CALL MYM_DEVICE(PDZZ(:,:,IKB:IKB),ZTMP1_DEVICE(:,:,1:1)) @@ -1322,17 +1322,17 @@ ZA(:,:,:) = - MZF( MYF ( ZFLXZ * GZ_V_VW(PVM,PDZZ) ) ) CALL GZ_V_VW_DEVICE(PVM,PDZZ,ZTMP1_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels CALL MYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP1_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZA(JI,JJ,JK) = - ZTMP1_DEVICE(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels #endif ! @@ -1427,39 +1427,39 @@ IF(HTURBDIM=='3DIM') THEN CALL MYM_DEVICE(PRHODJ,ZTMP1_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) /PDYY(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DYF_DEVICE( ZTMP2_DEVICE,ZTMP1_DEVICE ) IF (.NOT. LFLAT) THEN CALL MZF_DEVICE( PDZZ, ZTMP2_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK)*PDZY(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) / PDYY(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = PRHODJ(JI,JJ,JK) / ZTMP2_DEVICE(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL DZM_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) !$acc kernels present_cr(PRWS) @@ -1481,17 +1481,17 @@ IF(HTURBDIM=='3DIM') THEN CALL GY_W_VW_DEVICE( PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLXZ(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) CALL MZF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) !$acc kernels !$acc_nv loop independent collapse(3) - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZA(JI,JJ,JK) = - ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels #endif ! diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90 index c4a205956..c78119ca5 100644 --- a/src/MNH/turb_ver_thermo_corr.f90 +++ b/src/MNH/turb_ver_thermo_corr.f90 @@ -569,9 +569,9 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PPHI3(JI,JJ,JK)*BR_P2(PDTH_DZ(JI,JJ,JK)) - END DO + !$mnh_end_do() #endif !$acc end kernels CALL MZF_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP2_DEVICE(:,:,:) ) @@ -579,9 +579,9 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZF (JI,JJ,JK) = XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately @@ -725,9 +725,9 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP3_DEVICE(JI,JJ,JK) = ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZF_DEVICE( ZTMP3_DEVICE(:,:,:), ZTMP4_DEVICE(:,:,:) ) #ifdef MNH_COMPILER_CCE @@ -739,10 +739,10 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLXZ(JI,JJ,JK) = ZF(JI,JJ,JK) & + PIMPL * ZDFDDTDZ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels #endif ! @@ -766,7 +766,7 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(2) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZFLXZ(JI,JJ,IKB) = XCTV * PPHI3(JI,JJ,IKB+KKL) * PLM(JI,JJ,IKB) & * PLEPS(JI,JJ,IKB) & *( PEXPL * & @@ -778,7 +778,7 @@ END IF +ZCOEFF(JI,JJ,IKB+KKL )*PTHLP(JI,JJ,IKB+KKL ) & +ZCOEFF(JI,JJ,IKB )*PTHLP(JI,JJ,IKB ) ) & ) - END DO + !$mnh_end_do() !$acc end kernels #endif @@ -872,9 +872,9 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZF (JI,JJ,JK) = XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels #endif !$acc kernels present_cr(ZDFDDTDZ,ZDFDDRDZ) @@ -1063,10 +1063,10 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL D_PHI3DTDZ_O_DDTDZ(PPHI3(:,:,:),PREDTH1(:,:,:),PREDR1(:,:,:),PRED2TH3(:,:,:),PRED2THR3(:,:,:), & @@ -1088,12 +1088,12 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP7_DEVICE(JI,JJ,JK) = ( ZTMP3_DEVICE(JI,JJ,JK) + ZTMP4_DEVICE(JI,JJ,JK)) * PDR_DZ(JI,JJ,JK) & * ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) & + ( ZTMP5_DEVICE(JI,JJ,JK) + ZTMP6_DEVICE(JI,JJ,JK)) * PDTH_DZ(JI,JJ,JK) & * ZTMP1_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels !!! !$acc kernels present_cr(ZTMP1_DEVICE,ZTMP2_DEVICE) @@ -1106,10 +1106,10 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP4_DEVICE(JI,JJ,JK) /PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels !!! CALL MZF_DEVICE( ZTMP7_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) ) @@ -1119,19 +1119,19 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLXZ(JI,JJ,JK) = ZF(JI,JJ,JK) & + PIMPL * XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*0.5 * ZTMP3_DEVICE(JI,JJ,JK) & + PIMPL * ZDFDDTDZ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) & + PIMPL * ZDFDDRDZ(JI,JJ,JK) * ZTMP5_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() #endif ! ! special case near the ground ( uncentred gradient ) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(2) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZFLXZ(JI,JJ,IKB) = & (XCHT1 * PPHI3(JI,JJ,IKB+KKL) + XCHT2 * PPSI3(JI,JJ,IKB+KKL)) & *( PEXPL * & @@ -1149,7 +1149,7 @@ END IF +ZCOEFF(JI,JJ,IKB+KKL )*PRP(JI,JJ,IKB+KKL ) & +ZCOEFF(JI,JJ,IKB )*PRP(JI,JJ,IKB )) & ) - END DO + !$mnh_end_do() !$acc end kernels !$acc kernels present_cr(ZFLXZ,PSIGS) ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) @@ -1249,9 +1249,9 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PPSI3(JI,JJ,JK)*BR_P2(PDR_DZ(JI,JJ,JK)) - END DO + !$mnh_end_do() #endif !$acc end kernels CALL MZF_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP2_DEVICE(:,:,:) ) @@ -1259,9 +1259,9 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZF (JI,JJ,JK) = XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() #endif ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately !$acc end kernels @@ -1407,18 +1407,18 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZF_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP1_DEVICE(:,:,:) ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP3_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZF_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) ) #ifdef MNH_COMPILER_CCE @@ -1429,11 +1429,11 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLXZ(JI,JJ,JK) = ZF(JI,JJ,JK) & + PIMPL * XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) & + PIMPL * ZDFDDRDZ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels #endif ! @@ -1457,7 +1457,7 @@ END IF #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(2) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU ) ZFLXZ(JI,JJ,IKB) = XCHV * PPSI3(JI,JJ,IKB+KKL) * PLM(JI,JJ,IKB) & * PLEPS(JI,JJ,IKB) & *( PEXPL * & @@ -1469,7 +1469,7 @@ END IF +ZCOEFF(JI,JJ,IKB+KKL )*PRP(JI,JJ,IKB+KKL ) & +ZCOEFF(JI,JJ,IKB )*PRP(JI,JJ,IKB )) & ) - END DO + !$mnh_end_do() !$acc end kernels #endif ! diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index bf4f25c3e..4dae26c8d 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -748,9 +748,9 @@ CALL DZM_DEVICE(PTHLM, ZTMP1_DEVICE ) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZF (JI,JJ,JK) = -XCSHF*PPHI3(JI,JJ,JK)*ZKEFF(JI,JJ,JK)*ZTMP1_DEVICE(JI,JJ,JK)/PDZZ(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels ! CALL D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV,ZTMP2_DEVICE) @@ -758,9 +758,9 @@ CALL D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV, #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZDFDDTDZ(JI,JJ,JK) = -XCSHF*ZKEFF(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels #endif ! @@ -981,9 +981,9 @@ CALL DZM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLXZ(JI,JJ,JK) = ZF(JI,JJ,JK) + PIMPL * ZDFDDTDZ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels #endif ! replace the flux by the Leonard terms @@ -1058,9 +1058,9 @@ ELSE #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) !$acc kernels @@ -1211,11 +1211,11 @@ IF (LLES_CALL) THEN !* diagnostic of mixing coefficient for heat CALL DZM_DEVICE( PTHLP, ZA ) !$acc kernels - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) IF (ZA(JI,JJ,JK)==0.) THEN ZA(JI,JJ,JK)=1.E-6 END IF - END DO + !$mnh_end_do() ZA(:,:,:) = - ZFLXZ(:,:,:) / ZA(:,:,:) * PDZZ(:,:,:) ZA(:,:,IKB) = XCSHF*PPHI3(:,:,IKB)*ZKEFF(:,:,IKB) !Copy ZA into ZTMP1_DEVICE to prevent aliasing in the following call to MZF_DEVICE @@ -1259,9 +1259,9 @@ IF (KRR /= 0) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZF (JI,JJ,JK) = -XCSHF*PPSI3(JI,JJ,JK)*ZKEFF(JI,JJ,JK)*ZTMP1_DEVICE(JI,JJ,JK)/PDZZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV,ZTMP1_DEVICE) !CALL D_PHI3DRDZ_O_DDRDZ_DEVICE(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV,ZTMP1_DEVICE) @@ -1269,9 +1269,9 @@ IF (KRR /= 0) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZDFDDRDZ(JI,JJ,JK) = -XCSHF*ZKEFF(JI,JJ,JK)*ZTMP1_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels #endif ! @@ -1495,9 +1495,9 @@ IF (KRR /= 0) THEN #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif -DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) +!$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLXZ(JI,JJ,JK) = ZF(JI,JJ,JK) + PIMPL * ZDFDDRDZ(JI,JJ,JK) *ZTMP2_DEVICE(JI,JJ,JK) / PDZZ(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels #endif ! @@ -1558,18 +1558,18 @@ END DO #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZA(JI,JJ,JK) = PBETA(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels #ifdef MNH_COMPILER_CCE !$acc kernels present(ZA) @@ -1590,9 +1590,9 @@ END DO #else CALL MZM_DEVICE(PEMOIST,ZTMP1_DEVICE) !$acc kernels - DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PWTHV(JI,JJ,JK) = PWTHV(JI,JJ,JK) + ZTMP1_DEVICE(JI,JJ,JK) * ZFLXZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels #endif !$acc kernels -- GitLab