diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index a54dc3d1adc87c4172af4bf4de5dcf79599e94f9..6aa9852404122334f2335a53165bcc230eb85d36 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -587,13 +587,13 @@ END DO ! CONCURRENT #else IF (.NOT. L2D) THEN !$acc kernels - !$mnh_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))) !$mnh_end_do() !$acc end kernels ELSE !$acc kernels - !$mnh_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))) !$mnh_end_do() !$acc end kernels @@ -606,8 +606,8 @@ ELSE !if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) #if !defined(MNH_BITREP) ZCFL(:,:,:) = SQRT(ZCFLW(:,:,:)**2) -#else - !$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU,JK=1:JKU ) +#else + !$mnh_do_concurrent ( JI=1:JIU,JJ=1:JJU,JK=1:JKU ) ZCFL(JI,JJ,JK) = SQRT(BR_P2(ZCFLW(JI,JJ,JK))) !$mnh_end_do() #endif @@ -698,11 +698,13 @@ ZCFLU_MAX = 0.0 ; ZCFLV_MAX = 0.0 ; ZCFLW_MAX = 0.0 ; ZCFL_MAX = 0.0 !$acc end parallel #endif ! +#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, & @@ -964,7 +966,7 @@ DO JSPL=1,KSPLIT !$acc end kernels END IF !$acc kernels - !$mnh_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) !$mnh_end_do() !CONCURRENT diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90 index bffd4fdeef32fe864c39dc147a14c58b727aea6a..55069401400eeca413c3a215d71aba3a2bd74791 100644 --- a/src/MNH/advection_uvw.f90 +++ b/src/MNH/advection_uvw.f90 @@ -436,17 +436,20 @@ DO JSPL=1,ISPLIT ! ! Tendencies on wind !$acc kernels -!$mnh_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 !$mnh_end_do() +!$acc end kernels + IF (JSPL<ISPLIT) THEN +!$acc kernels ! ! Guesses for next time splitting loop ! ! -!$mnh_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) * & @@ -454,8 +457,8 @@ DO JSPL=1,ISPLIT ZW(JI,JJ,JK) = ZW(JI,JJ,JK) + ZTSTEP / ZMZM_RHODJ(JI,JJ,JK) * & (ZRWS_OTHER(JI,JJ,JK) + ZRWS_ADV(JI,JJ,JK)) !$mnh_end_do() -END IF !$acc end kernels +END IF ! ! Top and bottom Boundaries ! diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90 index 340947ef192b8f135ff653cd435529671ccdc315..7db6ad59e30c4f1ec7fe59628aea7969e107be59 100644 --- a/src/MNH/advection_uvw_cen.f90 +++ b/src/MNH/advection_uvw_cen.f90 @@ -404,7 +404,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/call_rttov13.f90 b/src/MNH/call_rttov13.f90 index 97ccf20af2a1a608ad00478b2f05046572cef425..362d018b272d60bfbcbcb9805452ce75dd9271ec 100644 --- a/src/MNH/call_rttov13.f90 +++ b/src/MNH/call_rttov13.f90 @@ -39,7 +39,7 @@ LOGICAL, INTENT(IN) :: OUSERI ! logical switch to compute both ! INTEGER, DIMENSION(:,:), INTENT(IN) :: KRTTOVINFO ! platform, satellite, sensor, ! and selection calculations -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics +TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! File characteristics ! END SUBROUTINE CALL_RTTOV13 END INTERFACE @@ -169,7 +169,7 @@ LOGICAL, INTENT(IN) :: OUSERI ! logical switch to compute both !!! INTEGER, DIMENSION(:,:), INTENT(IN) :: KRTTOVINFO ! platform, satellite, sensor, ! and selection calculations -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics +TYPE(TFILEDATA), INTENT(INOUT) :: TPFILE ! File characteristics ! #ifdef MNH_RTTOV_13 !!! diff --git a/src/MNH/condensation.f90 b/src/MNH/condensation.f90 index d4bc2503409420b3bd37d62e71b0b84a89c6481a..6c8d331cf942b2e1c62aa08b6e6c4260a436bee5 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 ! @@ -500,11 +502,10 @@ IF (OUSERI) CALL COMPUTE_FRAC_ICE3D_DEVICE(HFRAC_ICE, ZFRAC, PT) #endif ! !$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 +705,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 3a2b4a79261b5f39b2f1317ec46c0d3e74db1b53..494cf6b1bf69889d09c7fd71e67a7fed147492d0 100644 --- a/src/MNH/get_halo.f90 +++ b/src/MNH/get_halo.f90 @@ -439,7 +439,7 @@ END MODULE MODD_HALO_D ! ######################### SUBROUTINE GET_HALO_D(PSRC,HDIR,HNAME) ! ######################### -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D @@ -484,7 +484,7 @@ SUBROUTINE GET_HALO_START_D(PSRC,KNB_REQ,KREQ,& KIIB,KIIE,KIJB,KIJE,KIIU,KIJU,KIKU,KIHALO_1,& HDIR) ! ######################### -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D @@ -721,7 +721,7 @@ SUBROUTINE GET_HALO_STOP_D(PSRC,KNB_REQ,KREQ,& KIIB,KIIE,KIJB,KIJE,KIIU,KIJU,KIKU,& HDIR) ! ######################### -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D @@ -841,7 +841,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 @@ -1125,7 +1125,7 @@ END SUBROUTINE GET_HALO_DD ! ######################################## SUBROUTINE GET_2D_HALO_DD(PSRC, HDIR, HNAME) ! ######################################## -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D USE MODE_ll @@ -1410,7 +1410,7 @@ END SUBROUTINE GET_2D_HALO_DD ! ######################################## SUBROUTINE GET_HALO_DDC(PSRC, HDIR, HNAME) ! ######################################## -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D USE MODE_ll @@ -1727,7 +1727,7 @@ END SUBROUTINE GET_HALO_DDC ! ######################################## SUBROUTINE GET_2D_HALO_DDC(PSRC, HDIR, HNAME) ! ######################################## -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D USE MODE_ll @@ -2044,7 +2044,7 @@ END SUBROUTINE GET_2D_HALO_DDC ! ######################################## SUBROUTINE GET_HALO2_DD(PSRC, TP_PSRC_HALO2_ll, HNAME) ! ######################################## -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D USE MODE_ll @@ -2323,7 +2323,7 @@ END SUBROUTINE GET_HALO2_DD ! ######################################## SUBROUTINE GET_HALO2_DF(PSRC, TP_PSRC_HALO2F_ll, HNAME) ! ######################################## -#define MNH_GPUDIRECT +!define MNH_GPUDIRECT ! USE MODD_HALO_D USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll diff --git a/src/MNH/gradient_m.f90 b/src/MNH/gradient_m.f90 index 2b558170cdf544fd07faa58bcf890a39dc6e33ad..0a5fa93268dc88af4ecde5be0b4035e73560077d 100644 --- a/src/MNH/gradient_m.f90 +++ b/src/MNH/gradient_m.f90 @@ -1089,10 +1089,9 @@ ELSE / PDYY(:,1+1:IJU,:) 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 8e65513d3040dd3b5078ce53929348c746d52a53..f4e1102b9fcb1c509db21e48548e6f400f052162 100644 --- a/src/MNH/gradient_u.f90 +++ b/src/MNH/gradient_u.f90 @@ -239,21 +239,15 @@ IF (.NOT. LFLAT) THEN CALL DXF_DEVICE(PA,ZTMP1_DEVICE) CALL DZM_DEVICE( PA, 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) = 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) @@ -435,33 +429,24 @@ IF (.NOT. LFLAT) THEN CALL DZM_DEVICE( PA, ZTMP1_DEVICE ) CALL MXM_DEVICE(PDZZ,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) = 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) !$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) = 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) CALL MXM_DEVICE(PDYY,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) 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 2daf81dcdda27f0d81068ab293532270365a96dc..624ec1e21bf62eada67a8d9836b9fc442138c7aa 100644 --- a/src/MNH/gradient_v.f90 +++ b/src/MNH/gradient_v.f90 @@ -241,21 +241,15 @@ IF (.NOT. LFLAT) THEN CALL DYF_DEVICE(PA,ZTMP1_DEVICE) CALL DZM_DEVICE( PA, 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) = 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) @@ -436,32 +430,23 @@ IF (.NOT. LFLAT) THEN CALL MYM_DEVICE(PDZZ,ZTMP2_DEVICE) CALL DZM_DEVICE( PA, 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) 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) !$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) 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) !$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) 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 9b8f6087ede4aa45d09e3bdbfd609bdc9d68e7f0..63f86857964996005d034ba866a4e7287cf7fd3e 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 a1329e53d11346ed5a0976ba4f5824e340ba8f7f..78b5a90c9fa5ebd0eb50dfcdef19a6bb8c4e1580 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& present( 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( 'ICE4_FAST_RG' ) #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 8ffab3db7a68ca1a2ab1fe376d531e71c6aa2751..8094310c6fe7d6439d98b962ae23f2ddcc515ee9 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 75c76b335defc087a5dd2c7c8c5830efe575fd08..e4630fa297a5ccf76547cafb09991f1b463c6aaf 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 8abfaed13e9f8cfec25b2a06a31a53af3382f637..d72de99e3e9f9942384b8af86923a561be2d9dfc 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 38f6ad05de23a77a6fdb2f20f16f7cd72de0b2ac..52d13f1ccfbd381ce191630ba541beabfac78411 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 @@ -647,8 +646,8 @@ DO WHILE (ANY(ZREMAINT>0.)) !$acc kernels !******* for cloud ZWSED(:,:,:) = 0. -!$acc loop independent private(JI,JJ,JK,JL,ZZWLBDC,ZRAY,ZZT,ZZWLBDA,ZZCC) - DO CONCURRENT( JL = 1 : ISEDIM ) +! acc loop independent private(JI,JJ,JK,JL,ZZWLBDC,ZRAY,ZZT,ZZWLBDA,ZZCC) + !$mnh_do_concurrent( JL = 1 : ISEDIM ) JI=I1(JL) JJ=I2(JL) JK=I3(JL) @@ -673,14 +672,14 @@ DO WHILE (ANY(ZREMAINT>0.)) BR_POW(ZZWLBDC,-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PRXT(JI,JJ,JK) #endif ENDIF - ENDDO + !$mnh_end_do() !$acc end kernels ELSEIF(KSPE==4) THEN !$acc kernels ! ******* for pristine ice ZWSED(:,:,:) = 0. -!$acc loop independent private(JI,JJ,JK,JL) - DO CONCURRENT( JL = 1 : ISEDIM ) +! acc loop independent private(JI,JJ,JK,JL) + !$mnh_do_concurrent( JL = 1 : ISEDIM ) JI=I1(JL) JJ=I2(JL) JK=I3(JL) @@ -697,7 +696,7 @@ DO WHILE (ANY(ZREMAINT>0.)) & BR_LOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK))),XEXCSEDI) #endif ENDIF - ENDDO + !$mnh_end_do() !$acc end kernels ELSE !acc kernels @@ -730,8 +729,8 @@ DO WHILE (ANY(ZREMAINT>0.)) ! !$acc kernels ZWSED(:,:,:) = 0. -!$acc loop independent private(JI,JJ,JK,JL) - DO CONCURRENT( JL = 1 : ISEDIM ) +! acc loop independent private(JI,JJ,JK,JL) + !$mnh_do_concurrent( JL = 1 : ISEDIM ) JI=I1(JL) JJ=I2(JL) JK=I3(JL) @@ -744,13 +743,13 @@ DO WHILE (ANY(ZREMAINT>0.)) * BR_POW(PRHODREF(JI, JJ, JK),ZEXSED-XCEXVT) #endif ENDIF - ENDDO + !$mnh_end_do() !$acc end kernels ENDIF !$acc kernels ZMAX_TSTEP(:,:) = ZREMAINT(:,:) -!acc loop independent private(JI,JJ,JK,JL) - DO CONCURRENT( JL = 1 : ISEDIM ) +! acc loop independent private(JI,JJ,JK,JL) + !$mnh_do_concurrent( JL = 1 : ISEDIM ) JI=I1(JL) JJ=I2(JL) JK=I3(JL) @@ -760,19 +759,16 @@ DO WHILE (ANY(ZREMAINT>0.)) PRXT(JI, JJ, JK) * PDZZ(JI, JJ, JK) / ZWSED(JI, JJ, JK)) !acc end atomic ENDIF - ENDDO + !$mnh_end_do() ZREMAINT(:,:) = ZREMAINT(:,:) - ZMAX_TSTEP(:,:) !$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 ad36fcb3b282c47f1659d04131bdf15edd3ec6d5..4ccb0613056c4844ebb85626e4eecb82088a2248 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 4862751471f0f9b62a631c1e3ca5529e64c6ba8e..e1b74ed1940dab6d2fc172d9f82f82d9afb6a6e9 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 126d3d898298b3282409101a869ad9c876a17f1a..243d0b8cb317b8d986fb59f62fd313dc4edb6660 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/pressurez.f90 b/src/MNH/pressurez.f90 index 128661e9b7df7476f9332362561b975e116704b5..d27cce3771b9dbdb5774abf3fb827c7f53be2f49 100644 --- a/src/MNH/pressurez.f90 +++ b/src/MNH/pressurez.f90 @@ -276,6 +276,11 @@ USE MODI_SHUMAN_DEVICE USE MODI_ZSOLVER #endif +#if defined(MNH_COMPILER_CCE) && defined(MNH_BITREP_OMP) +!$mnh_undef(LOOP) +!$mnh_undef(OPENACC) +#endif + IMPLICIT NONE ! !* 0.1 declarations of arguments @@ -667,13 +672,13 @@ IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN #endif #else !$acc kernels - DO CONCURRENT ( JI=1:IIU,JJ=1:IJU,JK=1:IKU ) + !$mnh_do_concurrent ( JI=1:IIU,JJ=1:IJU,JK=1:IKU ) #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZPHIT(JI,JJ,JK)=(PPABST(JI,JJ,JK)/XP00)**(XRD/XCPD)-PEXNREF(JI,JJ,JK) #else ZPHIT(JI,JJ,JK)=BR_POW((PPABST(JI,JJ,JK)/XP00),(XRD/XCPD))-PEXNREF(JI,JJ,JK) #endif - END DO + !$mnh_end_do() !$acc end kernels #endif ! @@ -843,30 +848,20 @@ IF ( GWEST ) THEN !!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! !!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! !$acc kernels async -#ifdef MNH_COMPILER_NVHPC - !$acc loop independent collapse(2) -#else - !$acc loop independent -#endif - DO CONCURRENT (JJ=1:IJU , JK=2:IKU-1) + !$mnh_do_concurrent (JJ=1:IJU , JK=2:IKU-1) ZDV_SOURCE(IIB,JJ,JK)= & (ZPHIT(IIB,JJ,JK) - ZPHIT(IIB-1,JJ,JK) - 0.5 * ( & PDZX(IIB,JJ,JK) * (ZPHIT(IIB,JJ,JK)-ZPHIT(IIB,JJ,JK-1)) / PDZZ(IIB,JJ,JK) & +PDZX(IIB,JJ,JK+1) * (ZPHIT(IIB,JJ,JK+1)-ZPHIT(IIB,JJ,JK)) / PDZZ(IIB,JJ,JK+1) & ) & ) / PDXX(IIB,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels ENDIF ! IF( GEAST ) THEN !$acc kernels async -#ifdef MNH_COMPILER_NVHPC - !$acc loop independent collapse(2) -#else - !$acc loop independent -#endif - DO CONCURRENT (JJ=1:IJU , JK=2:IKU-1) + !$mnh_do_concurrent (JJ=1:IJU , JK=2:IKU-1) ZDV_SOURCE(IIE+1,JJ,JK)= & (ZPHIT(IIE+1,JJ,JK) - ZPHIT(IIE+1-1,JJ,JK) - 0.5 * ( & PDZX(IIE+1,JJ,JK) * (ZPHIT(IIE+1-1,JJ,JK)-ZPHIT(IIE+1-1,JJ,JK-1)) & @@ -875,7 +870,7 @@ IF( GEAST ) THEN / PDZZ(IIE+1-1,JJ,JK+1) & ) & ) / PDXX(IIE+1,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels END IF !$acc wait @@ -918,30 +913,20 @@ IF(.NOT. L2D) THEN !!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! !!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! !$acc kernels async -#ifdef MNH_COMPILER_NVHPC - !$acc loop independent collapse(2) -#else - !$acc loop independent -#endif - DO CONCURRENT (JI=1:IIU , JK=2:IKU-1) + !$mnh_do_concurrent (JI=1:IIU , JK=2:IKU-1) ZDV_SOURCE(JI,IJB,JK)= & (ZPHIT(JI,IJB,JK) - ZPHIT(JI,IJB-1,JK) - 0.5 * ( & PDZY(JI,IJB,JK) * (ZPHIT(JI,IJB,JK)-ZPHIT(JI,IJB,JK-1)) / PDZZ(JI,IJB,JK) & +PDZY(JI,IJB,JK+1) * (ZPHIT(JI,IJB,JK+1)-ZPHIT(JI,IJB,JK)) / PDZZ(JI,IJB,JK+1) & ) & ) / PDYY(JI,IJB,JK) - END DO + !$mnh_end_do() !$acc end kernels END IF ! IF ( GNORTH ) THEN !$acc kernels async -#ifdef MNH_COMPILER_NVHPC - !$acc loop independent collapse(2) -#else - !$acc loop independent -#endif - DO CONCURRENT (JI=1:IIU , JK=2:IKU-1) + !$mnh_do_concurrent (JI=1:IIU , JK=2:IKU-1) ZDV_SOURCE(JI,IJE+1,JK)= & (ZPHIT(JI,IJE+1,JK) - ZPHIT(JI,IJE+1-1,JK) - 0.5 * ( & PDZY(JI,IJE+1,JK) * (ZPHIT(JI,IJE+1-1,JK)-ZPHIT(JI,IJE+1-1,JK-1)) & @@ -950,7 +935,7 @@ IF(.NOT. L2D) THEN / PDZZ(JI,IJE+1-1,JK+1) & ) & ) / PDYY(JI,IJE+1,JK) - END DO + !$mnh_end_do() !$acc end kernels END IF !$acc wait @@ -1095,9 +1080,9 @@ IF ((ZMAX_ll > 1.E-12) .AND. KTCOUNT >0 ) THEN #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) PPABST(:,:,:)=XP00*(ZPHIT(:,:,:)+PEXNREF(:,:,:))**(XCPD/XRD) #else - DO CONCURRENT(JI=1:IIU,JJ=1:IJU,JK=1:IKU) + !$mnh_do_concurrent(JI=1:IIU,JJ=1:IJU,JK=1:IKU) PPABST(JI,JJ,JK)=XP00*BR_POW((ZPHIT(JI,JJ,JK)+PEXNREF(JI,JJ,JK)),(XCPD/XRD)) - END DO + !$mnh_end_do() #endif !$acc end kernels ELSEIF(CEQNSYS=='LHE') THEN diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90 index cbb91af2c959f3193a2afddd18226e86facbf507..a93c8dd96595592c48c1523af76c4da355dde18e 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 14101b80037ee6d9d656237d2199ad2e71120d3c..499cb5096ee433ab44dc7897905fcd31ec770a41 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 24c30713af7d7ba6280938b1fc7fbf69e0052061..20cc4e8a069f3d1f304e388bab3f605da339c920 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 b96befdb0827ea5b9c3fe4bfb5fd3767a671d67f..9fa840bab71c42a3c6c2e8d07d3aea592dfc3107 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 8302bd5e8505f7591eae74a0deedf64fc8328633..a2e368359764e6a2bdc42dbc403b7c79b58e6001 100644 --- a/src/MNH/rain_ice_red.f90 +++ b/src/MNH/rain_ice_red.f90 @@ -688,13 +688,6 @@ REAL, DIMENSION(:,:,:), pointer, contiguous :: ZTEMP_BUD ! 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") @@ -733,6 +726,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 @@ -1277,7 +1277,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)) & @@ -1285,7 +1285,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 @@ -1521,7 +1521,6 @@ IF(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM') GTEST=.true. #endif IF(IMICRO>0) THEN -!acc loop independent !$mnh_do_concurrent(JL=1:IMICRO) ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) @@ -1742,8 +1741,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) @@ -1755,7 +1755,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 ! @@ -1780,6 +1782,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 @@ -1814,7 +1818,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 @@ -1823,7 +1828,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)) @@ -1841,7 +1848,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) @@ -1922,7 +1932,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 @@ -1940,7 +1951,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)), & @@ -1950,10 +1962,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) @@ -1966,12 +1980,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 ! @@ -2040,7 +2054,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. @@ -2116,14 +2130,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) @@ -2168,8 +2182,7 @@ end if 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 @@ -2177,14 +2190,13 @@ 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 @@ -2246,14 +2258,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 @@ -2262,7 +2274,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 @@ -2832,6 +2844,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( 'RAIN_ICE_RED' ) @@ -2859,8 +2873,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 c9478caa3c5489dead0419653fc98dca4ecd3db5..8a3e99149561270cc084633f73c344197f9903a5 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 : @@ -142,6 +147,7 @@ REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZW ! Work array REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZWSED ! sedimentation fluxes INTEGER :: IIU,IJU,IKU, IIJKU +LOGICAL :: GKRR_7,GSEDIC ! !------------------------------------------------------------------------------- ! @@ -298,6 +304,12 @@ IF ( PRESENT( PSEA ) ) THEN ELSE GPRESENT_PSEA = .FALSE. END IF +IF ( KRR == 7 ) THEN + GKRR_7 = .TRUE. +ELSE + GKRR_7 = .FALSE. +END IF +GSEDIC = OSEDIC if ( lbudget_rc .and. osedic ) call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) @@ -309,7 +321,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) ! @@ -423,21 +435,21 @@ DO JN = 1 , KSPLITR IF ( KRR == 7 ) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:) * ZTSPLITR END IF ! - !$mnh_do_concurrent( JI=KIB:KIE,JJ=KJB:KJE,JK=KKTB:KKTE ) - IF ( OSEDIC ) GSEDIMC(JI,JJ,JK) = & - PRCS(JI,JJ,JK) > ZRTMIN(2) - GSEDIMR(JI,JJ,JK) = & - PRRS(JI,JJ,JK) > ZRTMIN(3) - GSEDIMI(JI,JJ,JK) = & - PRIS(JI,JJ,JK) > ZRTMIN(4) - GSEDIMS(JI,JJ,JK) = & - PRSS(JI,JJ,JK) > ZRTMIN(5) - GSEDIMG(JI,JJ,JK) = & - PRGS(JI,JJ,JK) > ZRTMIN(6) - IF ( KRR == 7 ) GSEDIMH(JI,JJ,JK) = & - PRHS(JI,JJ,JK) > ZRTMIN(7) - !$mnh_end_do() ! CONCURRENT -!$acc end kernels + ! mnh_do_concurrent( JI=KIB:KIE,JJ=KJB:KJE,JK=KKTB:KKTE ) + IF ( GSEDIC ) GSEDIMC(:,:,:) = & + PRCS(:,:,:) > ZRTMIN(2) + GSEDIMR(:,:,:) = & + PRRS(:,:,:) > ZRTMIN(3) + GSEDIMI(:,:,:) = & + PRIS(:,:,:) > ZRTMIN(4) + GSEDIMS(:,:,:) = & + PRSS(:,:,:) > ZRTMIN(5) + GSEDIMG(:,:,:) = & + PRGS(:,:,:) > ZRTMIN(6) + IF ( GKRR_7 ) GSEDIMH(:,:,:) = & + PRHS(:,:,:) > ZRTMIN(7) + ! mnh_end_do() ! CONCURRENT + !$acc end kernels ! #ifndef MNH_OPENACC IF ( OSEDIC ) ISEDIMC = COUNTJV( GSEDIMC(:,:,:), IC1(:), IC2(:), IC3(:) ) @@ -461,8 +473,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 @@ -502,7 +513,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 @@ -521,8 +532,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)) @@ -535,7 +545,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 @@ -554,8 +564,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)) @@ -571,7 +580,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 @@ -588,8 +597,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)) @@ -601,7 +609,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 @@ -619,8 +627,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)) @@ -632,7 +639,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 @@ -651,8 +658,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)) @@ -664,7 +670,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 690cbda36b5fbe985e99272d99da77b7d18b737f..887c8d3703b0cf86755b6894a063614d5c7f68e7 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 @@ -260,8 +260,7 @@ END DO !$mnh_end_do() ! CONCURRENT 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 +274,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', & @@ -290,8 +289,7 @@ END DO !$acc kernels 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 +305,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 +319,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 @@ -353,8 +351,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 +361,10 @@ 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 +378,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 48ec7a5d07dd5a376f40eccb205e846447495727..2fb7efda00ff93ec60325e894608d7e3bff2846d 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 c08f6ffa45b66c56d2c09bbb10720463e9adc722..60a91dc4c0cf4d28e06c8704cce805044e685cf2 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 ! ! @@ -235,8 +240,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 +255,11 @@ 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 +272,13 @@ 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 +290,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 b98dcb2e81335ed15d7afcb27874f43c14416e20..c421fe7be432bcb775f143e9fe80374511f4bf61 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,29 @@ 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 +353,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 1fb7b5dc4ed0bba504b147f0c4209f0e6e3513a8..33f1de21130a0768c334059c2c5e1cefc9691454 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 ! ! @@ -347,12 +352,9 @@ IKE=KKU-JPVEXT_TURB*KKL #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) #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) 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 @@ -388,21 +390,15 @@ PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+KKL)/PDZZ(:,:,IKB)) #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) #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) ZFLX(JI,JJ,JK) = XCED * BR_POW(PTKEM(JI,JJ,JK),0.5) / PLEPS(JI,JJ,JK) -END DO -#endif -#ifdef MNH_COMPILER_NVHPC -!$acc loop independent collapse(3) +!$mnh_end_do() #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 @@ -427,10 +423,9 @@ CALL MZM_DEVICE(PRHODJ,ZTMP2_DEVICE) !Warning: re-used later ZA(:,:,:) = - PTSTEP * XCET * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) / PDZZ(:,:,:)**2 !$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 @@ -443,12 +438,9 @@ CALL TRIDIAG_TKE(KKA,KKU,KKL,PTKEM,ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,& CALL GET_HALO(ZRES) #else !$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) = 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 +548,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 +568,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 +586,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 81b1efeb290b65ba524d3be3d66924a8d7165885..bfa623c09c17160a3d4c409b71ad0bb9441620b2 100644 --- a/src/MNH/tridiag_thermo.f90 +++ b/src/MNH/tridiag_thermo.f90 @@ -262,10 +262,9 @@ CALL MZM_DEVICE(PRHODJ,ZMZM_RHODJ) #ifndef MNH_BITREP 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 +281,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 +299,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 +323,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 +360,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 @@ -396,33 +371,28 @@ END DO !CONCURRENT 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 + ! acc loop independent gang, vector collapse(2) #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 @@ -433,25 +403,20 @@ END DO !CONCURRENT 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 + ! acc loop independent gang, vector collapse(2) #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 +426,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 6187983ab9d383388d5cb9b8a4d1e3dc8fb849de..5dd1ca731939e4142a9726d0b26a596dfc9670c7 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,25 +257,20 @@ 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 !$acc loop seq DO JK = IKB+KKL,IKE-KKL,KKL #ifdef MNH_COMPILER_NVHPC - !$acc loop gang, vector collapse(2) independent -#else - !$acc loop independent + ! acc loop gang, vector collapse(2) 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 d1e733a48fa88b0aa3ae617f25bb0cefd191e574..93bf378e4214a5cfbbaf6ec864ee82732743738d 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -878,7 +878,7 @@ END IF ! loop end on KRRL >= 1 IF ( KRRL >= 1 ) THEN !$acc kernels present_cr( zlocpexnm ) IF ( KRRI >= 1 ) THEN - !$mnh_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) @@ -889,7 +889,7 @@ IF ( KRRL >= 1 ) THEN - ZLSOCPEXNM(JI,JJ,JK) * PRRS(JI,JJ,JK,4) !$mnh_end_do() ELSE - !$mnh_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) @@ -1084,7 +1084,7 @@ ENDIF ZCDUEFF(:,:) =-SQRT ( (PSFU(:,:)**2 + PSFV(:,:)**2) / & (XMNH_TINY + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) ) #else - !$mnh_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)) ) ) !$mnh_end_do() @@ -1878,7 +1878,7 @@ 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 - !$mnh_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) ) ) !$mnh_end_do() #endif @@ -1931,7 +1931,8 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) !$acc end kernels !* 1.7 Lv/Cph/Exner at t-1 ! -!$acc kernels present_cr(PLOCPEXN) +!!$acc kernels present(PLOCPEXN) +!$acc kernels !$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU,JK=1:JKU) PLOCPEXN(JI,JJ,JK) = PLOCPEXN(JI,JJ,JK) / PEXN(JI,JJ,JK) !$mnh_end_do() @@ -2214,6 +2215,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) @@ -2272,7 +2274,7 @@ IF (ODZ) THEN #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) PLM(:,:,:) = ( PLM(:,:,:) * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) ) ** (1./3.) #else -!$mnh_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. ) !$mnh_end_do() #endif @@ -2306,7 +2308,7 @@ ELSE #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) PLM(:,:,:) = ( ZTMP1_DEVICE * ZTMP2_DEVICE ) ** (1./2.) #else - !$mnh_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. ) !$mnh_end_do() #endif @@ -2330,24 +2332,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 @@ -2357,11 +2358,11 @@ IF (.NOT. ORMC01) THEN END IF ! !$acc kernels -!$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU) - PLM(JI,JJ,KKA) = PLM(JI,JJ,KKB) -! mnh_end_do() -! mnh_do_concurrent(JI=1:JIU,JJ=1:JJU) - PLM(JI,JJ,KKU) = PLM(JI,JJ,KKE) +!$mnh_do_concurrent(JI=1:JIU , JJ=1:JJU ) + PLM(JI,JJ,KKA) = PLM(JI,JJ,KKB ) +!$mnh_end_do() +!$mnh_do_concurrent(JI=1:JIU , JJ=1:JJU ) + PLM(JI,JJ,KKU ) = PLM(JI,JJ,KKE) !$mnh_end_do() !$acc end kernels @@ -2470,6 +2471,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 ) @@ -2577,7 +2579,7 @@ IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme call Mppdb_check( plm, "Dear mid1:plm" ) end if !$acc kernels -!$mnh_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. ) !$mnh_end_do() !$acc end kernels @@ -2600,8 +2602,8 @@ CALL EMOIST(KRR,KRRI,PTHLT,PRT,PLOCPEXNM,PAMOIST,PSRCT,ZEMOIST) ! !$acc kernels present(ZWORK2D,PLM) IF (KRR>0) THEN - ! acc loop private(ZVAR) - !$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU,JK=KKTB+1:KKTE-1) + ! acc_nv loop independent collapse(3) private(ZVAR) + !$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)+ & @@ -2619,8 +2621,8 @@ IF (KRR>0) THEN END IF !$mnh_end_do() ELSE! For dry atmos or unsalted ocean runs - ! acc loop private(ZVAR) - !$mnh_do_concurrent(JI=1:JIU,JJ=1:JJU,JK=KKTB+1:KKTE-1) + ! acc_nv loop independent collapse(3) private(ZVAR) + !$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 @@ -2650,7 +2652,7 @@ IF (GOCEAN) THEN ZWORK2D(:,:)=XG*(XALPHAOC*ZDTHLDZ(:,:,KKB)-XBETAOC*ZDRTDZ(:,:,KKB)) #else !PW: bug: nvhpc 21.11 does not parallelize this loop even with loop independent directive! - !$mnh_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)) !$mnh_end_do() #endif @@ -2661,7 +2663,7 @@ ELSE (ZETHETA(:,:,KKB)*ZDTHLDZ(:,:,KKB)+ZEMOIST(:,:,KKB)*ZDRTDZ(:,:,KKB)) #else !PW: bug: nvhpc 21.11 does not parallelize this loop even with loop independent directive! - !$mnh_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)) !$mnh_end_do() @@ -2681,14 +2683,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 @@ -2696,10 +2698,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 d36659eefcecfcb468ece7301982646d7f14fa02..554ac79574189ab8bd29cafd8ccae138736e3eb2 100644 --- a/src/MNH/turb_hor_thermo_flux.f90 +++ b/src/MNH/turb_hor_thermo_flux.f90 @@ -332,10 +332,9 @@ ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) 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 +373,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) @@ -398,31 +397,27 @@ END IF 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) @@ -765,10 +760,9 @@ END IF CALL MXM_DEVICE( PK, ZTMP1_DEVICE ) 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 ! @@ -804,38 +798,33 @@ END DO 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 - !$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) @@ -1140,10 +1129,9 @@ END IF CALL MYM_DEVICE( PK, ZTMP1_DEVICE ) 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 @@ -1187,38 +1175,33 @@ IF (.NOT. L2D) THEN IF (.NOT. LFLAT) 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) @@ -1507,10 +1490,9 @@ IF (KRR/=0) THEN CALL MYM_DEVICE( PK, ZTMP1_DEVICE ) 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 @@ -1553,40 +1535,35 @@ IF (KRR/=0) THEN IF (.NOT. LFLAT) 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 bc2f326e218b664e672a99c5e8e350524b427fff..f724b68e3c183261e475f1b9c9cbae2b8f0fc9e9 100644 --- a/src/MNH/turb_hor_tke.f90 +++ b/src/MNH/turb_hor_tke.f90 @@ -224,24 +224,18 @@ ZFLX = -XCET * MXM(PK) * GX_M_U(1,IKU,1,PTKEM,PDXX,PDZZ,PDZX) ! < u'e > CALL MXM_DEVICE(PK,ZTMP1_DEVICE) CALL GX_M_U_DEVICE(1,IKU,1,PTKEM,PDXX,PDZZ,PDZX,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) 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 ) ! -#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 @@ -295,48 +289,33 @@ END IF IF (.NOT. LFLAT) THEN CALL MXM_DEVICE(PRHODJ,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) * 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) @@ -377,12 +356,9 @@ IF (.NOT. L2D) THEN CALL MYM_DEVICE(PK,ZTMP1_DEVICE) CALL GY_M_V_DEVICE(1,IKU,1,PTKEM,PDYY,PDZZ,PDZY,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) 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 ! @@ -451,49 +427,34 @@ IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN CALL MYM_DEVICE(PRHODJ,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) * 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 8179cacc11d970fde619a4a35a4d5bf943fba9cb..3e6cd5654ef2120f87f7cb62a76d5cb35b39af22 100644 --- a/src/MNH/turb_hor_uw.f90 +++ b/src/MNH/turb_hor_uw.f90 @@ -286,12 +286,9 @@ ZFLX(:,:,:) = & CALL MZM_DEVICE(PK,ZTMP1_DEVICE) CALL MXM_DEVICE(ZTMP1_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) 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 ) ) @@ -329,21 +326,15 @@ PRUS(:,:,:) = PRUS(:,:,:) - DZF( ZFLX* MXM( PMZM_PRHODJ ) / MXM( PDZZ ) ) CALL MXM_DEVICE( PMZM_PRHODJ, ZTMP1_DEVICE ) CALL MXM_DEVICE( PDZZ, 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) = 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 ! @@ -359,61 +350,43 @@ END IF #else CALL MXM_DEVICE(PRHODJ,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) * 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 !$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)*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 ) !$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) 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 @@ -432,22 +405,16 @@ IF (KSPLT==1) THEN #else CALL GZ_U_UW_DEVICE(PUM,PDZZ,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) *( 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 ) !$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) 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 7792771dcc5c986e3766df2a2c5ce54664255a1a..8ed651299666b659f0c029be7dc436fcb7752edb 100644 --- a/src/MNH/turb_hor_vw.f90 +++ b/src/MNH/turb_hor_vw.f90 @@ -286,12 +286,9 @@ IF (.NOT. L2D) THEN CALL MZM_DEVICE(PK,ZTMP1_DEVICE) CALL MYM_DEVICE(ZTMP1_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) 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 @@ -336,21 +333,15 @@ IF (.NOT. L2D) THEN CALL MYM_DEVICE( PMZM_PRHODJ, ZTMP1_DEVICE ) CALL MYM_DEVICE( PDZZ, 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) = 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 @@ -371,60 +362,42 @@ IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN CALL MYM_DEVICE(PRHODJ, 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) * 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 ) !$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) 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) @@ -453,22 +426,16 @@ IF (KSPLT==1) THEN #else CALL GZ_V_VW_DEVICE(PVM,PDZZ,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) *( 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 ) !$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) 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 8cd2a2ff7880c7ea80f82c5012fa4f135615cea6..c6058cb8a0c78525ee5a2f52b6680a03766c9ee3 100644 --- a/src/MNH/turb_ver.f90 +++ b/src/MNH/turb_ver.f90 @@ -676,12 +676,9 @@ ENDIF ! Denominator factor in 3rd order terms ! !$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) 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 18fb68491560fc02eff9e2ce3c23f3436a8bba7d..b2b0f0ead0f9bb7f805ad1fc26e08e39d75db264 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -531,10 +531,9 @@ ZSOURCE(:,:,:) = 0. #ifndef MNH_BITREP 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 @@ -583,10 +582,9 @@ CALL MXM_DEVICE( PDZZ, ZTMP4_DEVICE ) #ifndef MNH_BITREP 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 @@ -601,29 +599,26 @@ END DO 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 @@ -728,19 +723,17 @@ ZFLXZ(:,:,:) = -XCMFS * MXM(ZKEFF) * & DZM (PIMPL*ZRES + PEXPL*PUM) / MXM(PDZZ) #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 ! @@ -801,10 +794,9 @@ PDP(:,:,:) = - MZF( MXF ( ZFLXZ * GZ_U_UW(PUM,PDZZ) ) ) #else 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 ) @@ -903,40 +895,35 @@ IF(HTURBDIM=='3DIM') THEN #else 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) @@ -956,18 +943,16 @@ IF(HTURBDIM=='3DIM') THEN #else 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 ! @@ -1115,10 +1100,9 @@ CALL MYM_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) #ifndef MNH_BITREP 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 ! @@ -1131,29 +1115,26 @@ END DO 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 @@ -1256,19 +1237,17 @@ ZFLXZ(:,:,IKB:IKB) = MYM(PDZZ(:,:,IKB:IKB)) * & ) / 0.5 / ( 1. + MYM(PRHODJ(:,:,KKA:KKA)) / MYM(PRHODJ(:,:,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)) @@ -1321,18 +1300,16 @@ ZA(:,:,:) = - MZF( MYF ( ZFLXZ * GZ_V_VW(PVM,PDZZ) ) ) #else 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 ! @@ -1426,40 +1403,35 @@ IF(HTURBDIM=='3DIM') THEN IF (.NOT. L2D) 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) @@ -1480,18 +1452,16 @@ IF(HTURBDIM=='3DIM') THEN #else 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 383ce40f41ff9f25094591c63348d98a47da258f..7ee5ec9af0563f6c3b05f67e2383b9616b942f98 100644 --- a/src/MNH/turb_ver_thermo_corr.f90 +++ b/src/MNH/turb_ver_thermo_corr.f90 @@ -566,22 +566,16 @@ END IF !dir$ concurrent ZTMP1_DEVICE(:,:,:) = PPHI3(:,:,:)*PDTH_DZ(:,:,:)**2 #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) 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(:,:,:) ) !$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) 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 @@ -722,12 +716,9 @@ END IF !$acc end kernels CALL DZM_DEVICE( ZTMP1_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 + !$mnh_end_do() !$acc end kernels CALL MZF_DEVICE( ZTMP3_DEVICE(:,:,:), ZTMP4_DEVICE(:,:,:) ) #ifdef MNH_COMPILER_CCE @@ -736,13 +727,10 @@ END IF #else !$acc kernels #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) 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 ! @@ -763,10 +751,7 @@ END IF !$acc end kernels #else !$acc kernels -#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 +763,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 @@ -869,12 +854,9 @@ END IF !$acc end kernels CALL MZF_DEVICE( ZTMP1_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) 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) @@ -1060,13 +1042,10 @@ END IF CALL DZM_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) ) CALL DZM_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP4_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) 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(:,:,:), & @@ -1085,15 +1064,12 @@ END IF CALL DZM_DEVICE( ZTMP8_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) 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) @@ -1103,35 +1079,26 @@ END IF CALL DZM_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) ) CALL DZM_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP4_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) 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(:,:,:) ) CALL MZF_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP4_DEVICE(:,:,:) ) CALL MZF_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP5_DEVICE(:,:,:) ) !$acc kernels present_cr(zflxz) -#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 +1116,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) @@ -1246,22 +1213,16 @@ END IF !dir$ concurrent ZTMP1_DEVICE(:,:,:) = PPSI3(:,:,:)*PDR_DZ(:,:,:)**2 #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) 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(:,:,:) ) !$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) 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 @@ -1404,21 +1365,15 @@ END IF !$acc end kernels CALL DZM_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) = 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 @@ -1426,14 +1381,11 @@ END IF #else !$acc kernels #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) 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 ! @@ -1454,10 +1406,7 @@ END IF !$acc end kernels #else !$acc kernels -#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 +1418,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 a9499222d9919943d1479fa61655acd9114dcd37..3a7e9e213b45b74a79e20cba43ad476a8a664a26 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -745,22 +745,16 @@ ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF(:,:,:)*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PR #else CALL DZM_DEVICE(PTHLM, 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) 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) !$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) ZDFDDTDZ(JI,JJ,JK) = -XCSHF*ZKEFF(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) -END DO +!$mnh_end_do() !$acc end kernels #endif ! @@ -978,12 +972,9 @@ ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:) !$acc end kernels CALL DZM_DEVICE( ZTMP1_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) 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 @@ -1055,12 +1046,9 @@ ELSE IF (KRR /= 0) THEN CALL MZM_DEVICE(PETHETA,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) * ZFLXZ(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) !$acc kernels @@ -1211,11 +1199,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 @@ -1256,22 +1244,16 @@ IF (KRR /= 0) THEN #else CALL DZM_DEVICE( PRM(:,:,:,1), 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) 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) !$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) ZDFDDRDZ(JI,JJ,JK) = -XCSHF*ZKEFF(JI,JJ,JK)*ZTMP1_DEVICE(JI,JJ,JK) - END DO + !$mnh_end_do() !$acc end kernels #endif ! @@ -1492,12 +1474,9 @@ IF (KRR /= 0) THEN !$acc end kernels CALL DZM_DEVICE( ZTMP1_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) 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 ! @@ -1555,21 +1534,15 @@ END DO #else CALL MZM_DEVICE(PEMOIST,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) * 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 +1563,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 diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90 index ea51feba2e068f73f4f09a49b7c737db1178363a..0967bc28ecc39aedeffc1d17f38d7e13b1d519fb 100644 --- a/src/MNH/write_lfifm1_for_diag_supp.f90 +++ b/src/MNH/write_lfifm1_for_diag_supp.f90 @@ -846,15 +846,15 @@ END IF ! IF (NRTTOVINFO(1,1) /= NUNDEF) THEN ! PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURE COMPUTED BY THE RTTOV CODE' -#ifdef MNH_RTTOV_8 +#if defined(MNH_RTTOV_8) CALL CALL_RTTOV8(NDLON, NFLEV, NSTATM, XEMIS(:,:,1), XTSRAD, XSTATM, XTHT, XRT, & XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB), & LUSERI, NRTTOVINFO, TPFILE ) -#elif MNH_RTTOV_11 +#elif defined(MNH_RTTOV_11) CALL CALL_RTTOV11(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT, & XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB), & LUSERI, NRTTOVINFO, TPFILE ) -#elif MNH_RTTOV_13 +#elif defined(MNH_RTTOV_13) CALL CALL_RTTOV13(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT, & XPABST, XZZ, XMFCONV, XCLDFR, XUT(:,:,IKB), XVT(:,:,IKB), & LUSERI, NRTTOVINFO, TPFILE ) diff --git a/src/Rules.LXcray.mk b/src/Rules.LXcray.mk index e1725ac089e31504e3698436663d204d78fe56da..9d23c4171761b42a1a7944cbf9b904e87bc114c0 100644 --- a/src/Rules.LXcray.mk +++ b/src/Rules.LXcray.mk @@ -255,11 +255,13 @@ MNH_MGSOLVER ?= YES MNH_GRIBAPI=no # NETCDF_SUPPFLAGS='-emf' -ECCODES_FFLAGS='-emf -hsystem_alloc' -ECCODES_CFLAGS=' -gdwarf-4 ' +ECCODES_FFLAGS='-hcpu=x86-64 -emf -hsystem_alloc' +ECCODES_CFLAGS='-hcpu=x86-64 -gdwarf-4 ' EC_CONF='-DIEEE_LE=1' CDF_CONF= CPP=cpp -HDF_CONF= CPP=cpp +HDF_CONF= CPP=cpp +HDF_OPT ?= -hcpu=x86-64 +NETCDF_OPT ?= -hcpu=x86-64 # # Bypat nvidia70 problème ifeq "$(CRAY_ACCEL_TARGET)" "nvidia70" diff --git a/src/Rules.LXgfortran.mk b/src/Rules.LXgfortran.mk index 5f4fffc6b00db2127d08950c94e897f58fcc97dc..c9c93db8f82097adfd5dc54bc4fc8c8f20ab4ec7 100644 --- a/src/Rules.LXgfortran.mk +++ b/src/Rules.LXgfortran.mk @@ -8,8 +8,6 @@ # # ########################################################## # -# Gfortran version -GFV=$(shell gfortran --version | grep -E -m1 -o ' [[:digit:]\.]{2,}( |$$)' | sed 's/\.//g' ) # #OBJDIR_PATH=/home/escj/azertyuiopqsdfghjklm/wxcvbn/azertyuiopqsdfghjklmwxcvbn # @@ -20,7 +18,7 @@ OPT_PERF2 = -O2 OPT_CHECK = -fbounds-check -finit-real=nan OPT_I8 = -fdefault-integer-8 OPT_R8 = -fdefault-real-8 -fdefault-double-8 -OPT_OPENACC = -fopenacc -foffload=-march=gfx90a +OPT_OPENACC = -fopenacc # ifeq "$(VER_USER)" "ZSOLVER" CPPFLAGS += -DCARTESIANGEOMETRY -DPIECEWISELINEAR @@ -66,8 +64,8 @@ CFLAGS += -g -O0 endif # ifeq "$(OPTLEVEL)" "OPENACC" -CPPFLAGS += -DMNH_OPENACC -fopenacc -#OPT_BASE += -foffload=-lm +CPPFLAGS += -DMNH_OPENACC +OPT_BASE += -foffload=-march=gfx90a -foffload=-g -foffload=-lm -fno-fast-math -fno-associative-math OPT = $(OPT_BASE) $(OPT_OPENACC) $(OPT_PERF2) OPT0 = $(OPT_BASE) $(OPT_OPENACC) $(OPT_PERF0) OPT_NOCB = $(OPT_BASE) $(OPT_OPENACC) $(OPT_PERF2) @@ -76,9 +74,13 @@ CXXFLAGS = $(OPT_OPENACC) #$(OBJS_REPROD) : OPT = $(OPT_BASE) $(OPT_OPENACC) $(OPT_PERF2) -Mvect=nosimd -Minfo=all -g endif # -CC = gcc -CXX = g++ -FC = gfortran +CC ?= gcc +CXX ?= g++ +FC ?= gfortran + +# Gfortran version +GFV=$(shell $(F90) --version | grep -E -m1 -o ' [[:digit:]\.]{2,}( |$$)' | sed 's/\.//g' ) + ifeq "$(VER_MPI)" "MPIAUTO" F90 = mpif90 CPPFLAGS_SURCOUCHE += -DMNH_USE_MPI_STATUSES_IGNORE @@ -87,7 +89,7 @@ ifeq "$(VER_MPI)" "MPICRAY" F90 = ftn CPPFLAGS_SURCOUCHE += -DMNH_USE_MPI_STATUSES_IGNORE else -F90 = gfortran +F90 ?= gfortran endif endif # @@ -98,7 +100,7 @@ FX90 = $(F90) FX90FLAGS = $(OPT) # #LDFLAGS = -Wl,-warn-once -LDFLAGS = $(OPT) +LDFLAGS += $(OPT) # # preprocessing flags # @@ -107,12 +109,12 @@ CPP = mnh_expand # CPPFLAGS_C += -DLITTLE_endian CPPFLAGS_SURFEX = -CPPFLAGS_SURCOUCHE += -DDEV_NULL +CPPFLAGS_SURCOUCHE += -DDEV_NULL -DMPIVIDE CPPFLAGS_RAD = CPPFLAGS_NEWLFI = -DSWAPIO -DLINUX -DLFI_INT=${LFI_INT} CPPFLAGS_MNH = -DMNH=MNH -DSFX_MNH CPPFLAGS_MNH += -imacros MNH_OPENACC_NV_CR.CPP -CPPFLAGS_MNH += -DMNH_EXPAND +CPPFLAGS_MNH += -DMNH_EXPAND -DMNH_EXPAND_LOOP ifdef VER_GA CPPFLAGS_SURCOUCHE += -DMNH_GA INC += -I${GA_ROOT}/include