diff --git a/src/MNH/etheta.f90 b/src/MNH/etheta.f90 index b9f0fa5d184c9d90d9999f43e360a1ef9a991666..74620d7669887a855b58312a415aff303d6384e2 100644 --- a/src/MNH/etheta.f90 +++ b/src/MNH/etheta.f90 @@ -193,7 +193,7 @@ ELSE !$acc end kernels IF ( KRRI>0 ) THEN ! rc and ri case - !$acc kernels + !$acc kernels present(ZA) ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,3) !$acc loop seq DO JRR=5,KRR diff --git a/src/MNH/gradient_m.f90 b/src/MNH/gradient_m.f90 index 4bcc5378ac1b61badb6eb83d287702861f7c0e40..8ae6247196dff65f3c8f347faf1f3609c0c25cd0 100644 --- a/src/MNH/gradient_m.f90 +++ b/src/MNH/gradient_m.f90 @@ -323,7 +323,7 @@ IF (.NOT. LFLAT) THEN CALL DXF_DEVICE( ZTMP1(:,:,:), ZTMP2(:,:,:) ) CALL MXF_DEVICE( PDZX, ZTMP1(:,:,:) ) CALL DZM_DEVICE( PA(:,:,:), ZTMP3(:,:,:) ) - !$acc kernels + !$acc kernels present(ZTMP4) ZTMP4(:,:,:) = ZTMP1(:,:,:) * ZTMP3(:,:,:) / PDZZ(:,:,:) !$acc end kernels CALL MZF_DEVICE( ZTMP4(:,:,:), ZTMP1(:,:,:) ) @@ -500,7 +500,7 @@ IF (.NOT. LFLAT) THEN CALL DYF_DEVICE( ZTMP1(:,:,:), ZTMP2(:,:,:) ) CALL MYF_DEVICE( PDZY, ZTMP1(:,:,:) ) CALL DZM_DEVICE( PA, ZTMP3(:,:,:) ) - !$acc kernels + !$acc kernels present(ZTMP4) ZTMP4(:,:,:) = ZTMP1(:,:,:) * ZTMP3(:,:,:) / PDZZ(:,:,:) !$acc end kernels CALL MZF_DEVICE( ZTMP4(:,:,:), ZTMP1(:,:,:) ) diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90 index 262fd50fed1d75c6003960c69b8b245bca554e48..50bf57bf14c697c5ee35b7c21b84c7055fe0249b 100644 --- a/src/MNH/mode_prandtl.f90 +++ b/src/MNH/mode_prandtl.f90 @@ -100,6 +100,7 @@ SUBROUTINE PHI3(PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PPHI3) INTEGER :: JIU,JJU,JKU INTEGER :: JI,JJ,JK + LOGICAL :: LTURBDIM_3DIM !$acc data present( PREDTH1, PREDR1, PRED2TH3, PRED2R3, PRED2THR3, PPHI3 ) @@ -110,6 +111,8 @@ JIU = size( predth1, 1 ) JJU = size( predth1, 2 ) JKU = size( predth1, 3 ) +LTURBDIM_3DIM = (HTURBDIM=='3DIM') + #ifndef MNH_OPENACC allocate( zw1 ( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) ) allocate( zw2 ( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) ) @@ -125,8 +128,8 @@ CALL MNH_MEM_GET( gphi3logic, JIU,JJU,JKU ) !$acc data present( zw1, zw2, gphi3logic ) -!$acc kernels -IF (HTURBDIM=='3DIM') THEN +!$acc kernels present(GPHI3LOGIC,PPHI3) +IF (LTURBDIM_3DIM) THEN !* 3DIM case IF (OUSERV) THEN #ifndef MNH_BITREP @@ -302,14 +305,16 @@ SUBROUTINE D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,O REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)), INTENT(OUT) :: PD_PHI3DTDZ_O_DDTDZ #endif INTEGER :: IKB, IKE,JL,JK,JJ + LOGICAL :: LTURBDIM_3DIM !$acc data present( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, PD_PHI3DTDZ_O_DDTDZ ) IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB +LTURBDIM_3DIM = (HTURBDIM=='3DIM') ! !$acc kernels -IF (HTURBDIM=='3DIM') THEN +IF (LTURBDIM_3DIM) THEN !* 3DIM case IF (OUSERV) THEN WHERE (PPHI3(:,:,:)<=XPHI_LIM) @@ -394,15 +399,17 @@ SUBROUTINE D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,O REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)), INTENT(OUT) :: PD_PHI3DRDZ_O_DDRDZ #endif INTEGER :: IKB, IKE + LOGICAL :: LTURBDIM_3DIM !$acc data present( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, PD_PHI3DRDZ_O_DDRDZ ) IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB +LTURBDIM_3DIM = (HTURBDIM=='3DIM') ! ! !$acc kernels -IF (HTURBDIM=='3DIM') THEN +IF (LTURBDIM_3DIM) THEN !* 3DIM case IF (OUSERV) THEN WHERE (PPHI3(:,:,:)<=XPHI_LIM) @@ -468,7 +475,8 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTU #ifdef MNH_OPENACC REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE #endif - + LOGICAL :: LTURBDIM_3DIM + !$acc data present( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, PDTDZ, PD_PHI3DTDZ2_O_DDTDZ ) #ifdef MNH_OPENACC @@ -482,9 +490,10 @@ CALL MNH_MEM_GET( ztmp1_device, size( predth1, 1 ), size( predth1, 2 ), size( pr IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB +LTURBDIM_3DIM = (HTURBDIM=='3DIM') ! ! -IF (HTURBDIM=='3DIM') THEN +IF (LTURBDIM_3DIM) THEN ! by derivation of (phi3 dtdz) * dtdz according to dtdz we obtain: #ifndef MNH_OPENACC PD_PHI3DTDZ2_O_DDTDZ(:,:,:) = PDTDZ * (PPHI3 + & diff --git a/src/MNH/shuman_device.f90 b/src/MNH/shuman_device.f90 index d33acba5d2596bb0f7a04875abb4689c0906464d..f9158420a88803f8a1104c72e351b08c82d15517 100644 --- a/src/MNH/shuman_device.f90 +++ b/src/MNH/shuman_device.f90 @@ -413,7 +413,7 @@ IIU = SIZE(PA,1) IJU = SIZE(PA,2) IKU = SIZE(PA,3) ! -!$acc kernels present(PA,PMYF) +!$acc kernels present(PA,PMYF,JPHEXT) #ifndef _OPT_LINEARIZED_LOOPS !$acc loop independent collapse(3) DO JK=1,IKU @@ -531,7 +531,7 @@ IJU = SIZE(PA,2) IKU = SIZE(PA,3) ! #ifndef _OPT_LINEARIZED_LOOPS -!$acc kernels present(PA,PMYM) +!$acc kernels present(PA,PMYM,JPHEXT) !$acc loop independent collapse(3) DO JK=1,IKU DO JJ=2,IJU !TODO: remplacer le 1+1 par 1+JPHEXT ? @@ -545,7 +545,7 @@ JIJKOR = 1 + IIU JIJKEND = IIU*IJU*IKU !CDIR NODEP !OCL NOVREC -!$acc kernels present(PA,PMYM) +!$acc kernels present(PA,PMYM,JPHEXT) DO JIJK=JIJKOR , JIJKEND PMYM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-IIU,1,1) ) END DO @@ -1118,7 +1118,7 @@ IIU = SIZE(PA,1) IJU = SIZE(PA,2) IKU = SIZE(PA,3) ! -!$acc kernels present(PA,PDYF) +!$acc kernels present(PA,PDYF,JPHEXT) #ifndef _OPT_LINEARIZED_LOOPS !$acc loop independent collapse(3) DO JK=1,IKU @@ -1233,7 +1233,7 @@ IJU=SIZE(PA,2) IKU=SIZE(PA,3) ! #ifndef _OPT_LINEARIZED_LOOPS -!$acc kernels present(PA,PDYM) +!$acc kernels present(PA,PDYM,JPHEXT) !$acc loop independent collapse(3) DO JK=1,IKU DO JJ=2,IJU !TODO: remplacer le 2 par JPHEXT+1 ? diff --git a/src/MNH/turb_hor_tke.f90 b/src/MNH/turb_hor_tke.f90 index dac1e826edf89f16feb60d21e4b6746eb82e856a..4e42a64a53bd2f3c38438007683bce55a3dd6397 100644 --- a/src/MNH/turb_hor_tke.f90 +++ b/src/MNH/turb_hor_tke.f90 @@ -254,7 +254,7 @@ ZFLX(:,:,IKB:IKB) = & CALL MXM_DEVICE( PK(:,:,IKB:IKB), ZTMP1_DEVICE(:,:,1:1) ) CALL DXM_DEVICE( PTKEM(:,:,IKB:IKB), ZTMP2_DEVICE(:,:,1:1) ) CALL MXM_DEVICE( ZFLX (:,:,IKB:IKB), ZTMP3_DEVICE(:,:,1:1) ) -!$acc kernels +!$acc kernels present(ZFLX) ZFLX(:,:,IKB) = & - XCET * ZTMP1_DEVICE(:,:,1) * ( & ZTMP2_DEVICE(:,:,1) * PINV_PDXX(:,:,IKB) & @@ -384,7 +384,7 @@ IF (.NOT. L2D) THEN ! ! special case near the ground ( uncentred gradient ) ! -!$acc kernels +!$acc kernels present(ZFLX) ZFLX(:,:,IKB) = ZCOEFF(:,:,IKB+2)*PTKEM(:,:,IKB+2) & + ZCOEFF(:,:,IKB+1)*PTKEM(:,:,IKB+1) & + ZCOEFF(:,:,IKB )*PTKEM(:,:,IKB ) @@ -400,7 +400,7 @@ IF (.NOT. L2D) THEN CALL MYM_DEVICE( PK(:,:,IKB:IKB), ZTMP1_DEVICE(:,:,1:1) ) CALL DYM_DEVICE( PTKEM(:,:,IKB:IKB), ZTMP2_DEVICE(:,:,1:1) ) CALL MYM_DEVICE( ZFLX (:,:,IKB:IKB), ZTMP3_DEVICE(:,:,1:1) ) -!$acc kernels +!$acc kernels present(ZFLX) ZFLX(:,:,IKB) = & - XCET * ZTMP1_DEVICE(:,:,1) * ( & ZTMP2_DEVICE(:,:,1) * PINV_PDYY(:,:,IKB) & diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90 index 2d15fd75f5434180c314b9307d60bcd618ba6877..1720e36ed9c56aaefed47f78934a7bbe1ef2c916 100644 --- a/src/MNH/turb_hor_uv.f90 +++ b/src/MNH/turb_hor_uv.f90 @@ -395,18 +395,18 @@ CALL DYM_DEVICE(PUM(:,:,IKB:IKB),ZTMP1_DEVICE(:,:,1:1)) CALL MXM_DEVICE(PDZZ(:,:,IKB+1:IKB+1),ZTMP2_DEVICE(:,:,1:1)) CALL MXM_DEVICE(PDZZ(:,:,IKB:IKB),ZTMP3_DEVICE(:,:,1:1)) ! -!$acc kernels +!$acc kernels present(ZTMP5_DEVICE) ZTMP5_DEVICE(:,:,1) = (PUM(:,:,IKB+1)-PUM(:,:,IKB))*(1./ZTMP2_DEVICE(:,:,1)+1./ZTMP3_DEVICE(:,:,1)) !$acc end kernels CALL MYM_DEVICE(ZTMP5_DEVICE(:,:,1:1),ZTMP4_DEVICE(:,:,1:1)) ! -!$acc kernels +!$acc kernels present(ZTMP5_DEVICE) ZTMP5_DEVICE(:,:,1) = PDZY(:,:,IKB+1) + PDZY(:,:,IKB) !$acc end kernels CALL MXM_DEVICE(ZTMP5_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1)) ! CALL MXM_DEVICE(PDYY(:,:,IKB:IKB),ZTMP3_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZTMP5_DEVICE) ZTMP5_DEVICE(:,:,1) = ( ZTMP1_DEVICE(:,:,1) - ZTMP4_DEVICE(:,:,1)*0.5*ZTMP2_DEVICE(:,:,1) ) & / ZTMP3_DEVICE(:,:,1) !$acc end kernels @@ -416,7 +416,7 @@ CALL DXM_DEVICE(PVM(:,:,IKB:IKB),ZTMP1_DEVICE(:,:,1:1)) ! CALL MYM_DEVICE(PDZZ(:,:,IKB:IKB),ZTMP2_DEVICE(:,:,1:1)) CALL MYM_DEVICE(PDZZ(:,:,IKB+1:IKB+1),ZTMP3_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZTMP6_DEVICE) ZTMP6_DEVICE(:,:,1) = (PVM(:,:,IKB+1)-PVM(:,:,IKB))*(1./ZTMP3_DEVICE(:,:,1)+1./ZTMP2_DEVICE(:,:,1)) !$acc end kernels CALL MXM_DEVICE(ZTMP6_DEVICE(:,:,1:1),ZTMP4_DEVICE(:,:,1:1)) @@ -427,7 +427,7 @@ ZTMP6_DEVICE(:,:,1:1) = (PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB)) CALL MYM_DEVICE(ZTMP6_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1)) ! CALL MYM_DEVICE(PDXX(:,:,IKB:IKB),ZTMP3_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZTMP6_DEVICE) ZTMP6_DEVICE(:,:,1) = ( ZTMP1_DEVICE(:,:,1) - ZTMP4_DEVICE(:,:,1)*0.5*ZTMP2_DEVICE(:,:,1) ) & / ZTMP3_DEVICE(:,:,1) !$acc end kernels @@ -435,13 +435,13 @@ ZTMP6_DEVICE(:,:,1) = ( ZTMP1_DEVICE(:,:,1) - ZTMP4_DEVICE(:,:,1)*0.5*ZTMP2_DEVI CALL MXM_DEVICE(PK(:,:,IKB:IKB),ZTMP1_DEVICE(:,:,1:1)) CALL MYM_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1)) ! -!$acc kernels +!$acc kernels present(ZFLX) ZFLX(:,:,IKB) = - XCMFS * ZTMP2_DEVICE(:,:,1) * ( ZTMP5_DEVICE(:,:,1) + ZTMP6_DEVICE(:,:,1) ) !$acc end kernels #endif ! ! extrapolates this flux under the ground with the surface flux -!$acc kernels +!$acc kernels present(ZFLX) #ifndef MNH_BITREP ZFLX(:,:,IKB-1) = & PTAU11M(:,:) * PCOSSLOPE(:,:) * PSINSLOPE(:,:) * PDIRCOSZW(:,:)**2 & @@ -479,7 +479,7 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) ) & #else CALL MYM_DEVICE(ZFLX(:,:,IKB-1:IKB-1),ZTMP1_DEVICE(:,:,1:1)) CALL MXM_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZFLX) ZFLX(:,:,IKB-1) = 2. * ZTMP2_DEVICE(:,:,1) - ZFLX(:,:,IKB) !$acc end kernels #endif @@ -728,7 +728,7 @@ IF (KSPLT==1) THEN ) / MXF(MYM( 0.5*(PDXX(:,:,IKB:IKB)+PDXX(:,:,IKB+1:IKB+1)) ) )& ) #else - !$acc kernels + !$acc kernels present(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,1) = 0.5 * (ZFLX(:,:,IKB+1)+ZFLX(:,:,IKB)) !$acc end kernels CALL MYF_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1)) @@ -750,27 +750,27 @@ IF (KSPLT==1) THEN ZTMP2_DEVICE(:,:,1) = 0.5*(PDXX(:,:,IKB)+PDXX(:,:,IKB+1)) !$acc end kernels CALL MYM_DEVICE(ZTMP2_DEVICE(:,:,1:1),ZTMP6_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,1) = ZTMP3_DEVICE(:,:,1) / ZTMP4_DEVICE(:,:,1) + ZTMP5_DEVICE(:,:,1) / ZTMP6_DEVICE(:,:,1) !$acc end kernels CALL MYF_DEVICE(ZTMP2_DEVICE(:,:,1:1),ZTMP3_DEVICE(:,:,1:1)) CALL MXF_DEVICE(ZTMP3_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1)) ! CALL MXM_DEVICE(PDZZ(:,:,IKB+1:IKB+1),ZTMP3_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZTMP5_DEVICE) ZTMP5_DEVICE(:,:,1) = (PUM(:,:,IKB+1)-PUM(:,:,IKB)) / ZTMP3_DEVICE(:,:,1) * PDZY(:,:,IKB+1) !$acc end kernels CALL MXF_DEVICE(ZTMP5_DEVICE(:,:,1:1),ZTMP3_DEVICE(:,:,1:1)) CALL MYF_DEVICE(ZTMP4_DEVICE(:,:,1:1),ZTMP5_DEVICE(:,:,1:1)) !Re-use of ZTMP4_DEVICE ! CALL MYM_DEVICE(PDZZ(:,:,IKB+1:IKB+1),ZTMP4_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZTMP7_DEVICE) ZTMP7_DEVICE(:,:,1) = (PVM(:,:,IKB+1)-PVM(:,:,IKB)) / ZTMP4_DEVICE(:,:,1) * PDZX(:,:,IKB+1) !$acc end kernels CALL MYF_DEVICE(ZTMP7_DEVICE(:,:,1:1),ZTMP4_DEVICE(:,:,1:1)) CALL MXF_DEVICE(ZTMP6_DEVICE(:,:,1:1),ZTMP7_DEVICE(:,:,1:1)) !Re-use of ZTMP6_DEVICE ! -!$acc kernels +!$acc kernels present(ZWORK) ZWORK(:,:,IKB) = - ZTMP1_DEVICE(:,:,1) * (ZTMP2_DEVICE(:,:,1) & - ZTMP3_DEVICE(:,:,1) / ZTMP5_DEVICE(:,:,1) & - ZTMP4_DEVICE(:,:,1) / ZTMP7_DEVICE(:,:,1) ) diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90 index 3be5e10613fde6a02f86eb6cf4f0292593cb5266..aaf35a767e3529b55b48ebb9389008173d6cad46 100644 --- a/src/MNH/turb_hor_uw.f90 +++ b/src/MNH/turb_hor_uw.f90 @@ -476,7 +476,7 @@ IF (KSPLT==1) THEN /(PDZZ(:,:,IKB+1)+PDZZ(:,:,IKB)) !$acc end kernels CALL MXM_DEVICE( ZTMP3_DEVICE(:,:,1:1), ZTMP4_DEVICE(:,:,1:1) ) - !$acc kernels + !$acc kernels present(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,1) = ZFLX(:,:,IKB+1) * & ( (PUM(:,:,IKB+1)-PUM(:,:,IKB)) / ZTMP1_DEVICE(:,:,1) & + ( ZTMP2_DEVICE(:,:,1) & @@ -486,7 +486,7 @@ IF (KSPLT==1) THEN ) !$acc end kernels CALL MXF_DEVICE( ZTMP3_DEVICE(:,:,1:1), ZTMP1_DEVICE(:,:,1:1) ) - !$acc kernels + !$acc kernels present(ZWORK) ZWORK(:,:,IKB) = - ZTMP1_DEVICE(:,:,1) !$acc end kernels #endif diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90 index 6e6a7fab1aeed4956d27bc70a13ac6608cf40375..cd411e778a030734f90d0b6257ba60dc084e5069 100644 --- a/src/MNH/turb_hor_vw.f90 +++ b/src/MNH/turb_hor_vw.f90 @@ -496,7 +496,7 @@ IF (KSPLT==1) THEN /(PDZZ(:,:,IKB+1)+PDZZ(:,:,IKB)) !$acc end kernels CALL MYM_DEVICE( ZTMP3_DEVICE(:,:,1:1), ZTMP4_DEVICE(:,:,1:1) ) - !$acc kernels + !$acc kernels present(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,1) = ZFLX(:,:,IKB+1) * & ( (PVM(:,:,IKB+1)-PVM(:,:,IKB)) / ZTMP1_DEVICE(:,:,1) & + ( ZTMP2_DEVICE(:,:,1) & @@ -505,7 +505,7 @@ IF (KSPLT==1) THEN ) !$acc end kernels CALL MYF_DEVICE( ZTMP3_DEVICE(:,:,1:1), ZTMP1_DEVICE(:,:,1:1) ) - !$acc kernels + !$acc kernels present(ZWORK) ZWORK(:,:,IKB) = - ZTMP1_DEVICE(:,:,1) !$acc end kernels #endif diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index ada6514b9e771552853c05c1c4eb3700f3ffd00d..b75fcc15fd997d603353bf1712563866bc180cdd 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -577,7 +577,7 @@ CALL MXM_DEVICE( ZKEFF, ZTMP1_DEVICE ) CALL MZM_DEVICE(PRHODJ, ZTMP2_DEVICE ) CALL MXM_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE) CALL MXM_DEVICE( PDZZ, ZTMP4_DEVICE ) -!$acc kernels +!$acc kernels present(ZA) #ifndef MNH_BITREP ZA(:,:,:) = -PTSTEP * XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP3_DEVICE(:,:,:) / ZTMP4_DEVICE(:,:,:)**2 #else @@ -596,7 +596,7 @@ END DO ! ! compute the coefficient between the vertical flux and the 2 components of the ! wind following the slope -!$acc kernels +!$acc kernels present(ZCOEFFLXU) #ifndef MNH_BITREP ZCOEFFLXU(:,:,1) = PCDUEFF(:,:) * (PDIRCOSZW(:,:)**2 - ZDIRSINZW(:,:)**2) & * PCOSSLOPE(:,:) @@ -662,7 +662,7 @@ ELSE !ATMOS MODEL ONLY * 0.5 * ( 1. + MXM(PRHODJ(:,:,KKA:KKA)) / MXM(PRHODJ(:,:,IKB:IKB)) ) ELSE ! compute the explicit tangential flux at the W point -!$acc kernels +!$acc kernels present(ZSOURCE,ZTMP1_DEVICE,ZTMP2_DEVICE) ZSOURCE(:,:,IKB) = & PTAU11M(:,:) * PCOSSLOPE(:,:) * PDIRCOSZW(:,:) * ZDIRSINZW(:,:) & -PTAU12M(:,:) * PSINSLOPE(:,:) * ZDIRSINZW(:,:) & @@ -690,7 +690,7 @@ ELSE !ATMOS MODEL ONLY CALL MXM_DEVICE( ZTMP2_DEVICE(:,:,1:1), ZTMP4_DEVICE(:,:,1:1) ) CALL MXM_DEVICE(PRHODJ(:,:,KKA:KKA),ZTMP1_DEVICE(:,:,KKA:KKA)) CALL MXM_DEVICE(PRHODJ(:,:,IKB:IKB),ZTMP2_DEVICE(:,:,IKB:IKB)) -!$acc kernels +!$acc kernels present(ZSOURCE) ZSOURCE(:,:,IKB) = ( ZTMP3_DEVICE(:,:,1) + ZTMP4_DEVICE(:,:,1) - ZCOEFS(:,:,1) * PUM(:,:,IKB) * PIMPL & ) * 0.5 * ( 1. + ZTMP1_DEVICE(:,:,KKA) / ZTMP2_DEVICE(:,:,IKB) ) !$acc end kernels @@ -764,7 +764,7 @@ ZFLXZ(:,:,IKB:IKB) = MXM(PDZZ(:,:,IKB:IKB)) * & CALL MXM_DEVICE(PDZZ(:,:,IKB:IKB),ZTMP1_DEVICE(:,:,IKB:IKB)) CALL MXM_DEVICE(PRHODJ(:,:,KKA:KKA),ZTMP2_DEVICE(:,:,KKA:KKA)) CALL MXM_DEVICE(PRHODJ(:,:,IKB:IKB),ZTMP3_DEVICE(:,:,IKB:IKB)) -!$acc kernels +!$acc kernels present(ZFLXZ) ZFLXZ(:,:,IKB:IKB) = ZTMP1_DEVICE(:,:,IKB:IKB) * & ( ZSOURCE(:,:,IKB:IKB) & +ZCOEFS(:,:,1:1) * ZRES(:,:,IKB:IKB) * PIMPL & @@ -833,7 +833,7 @@ PDP(:,:,IKB:IKB) = - MXF ( ) #else CALL MXM_DEVICE(PDZZ(:,:,IKB+KKL:IKB+KKL),ZTMP1_DEVICE(:,:,IKB+KKL:IKB+KKL)) -!$acc kernels +!$acc kernels present(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,IKB:IKB) = ZFLXZ(:,:,IKB+KKL:IKB+KKL) * (PUM(:,:,IKB+KKL:IKB+KKL)-PUM(:,:,IKB:IKB)) & / ZTMP1_DEVICE(:,:,IKB+KKL:IKB+KKL) !$acc end kernels @@ -1017,13 +1017,13 @@ IF(HTURBDIM=='3DIM') THEN /(PDZZ(:,:,IKB+KKL)+PDZZ(:,:,IKB )) !$acc end kernels CALL MXM_DEVICE(ZTMP2_DEVICE(:,:,1:1),ZTMP3_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,1) = ZFLXZ(:,:,IKB+KKL) * & ( ZTMP1_DEVICE(:,:,1) - ZTMP3_DEVICE(:,:,1) * PDZX(:,:,IKB+KKL) ) & / (0.5*(PDXX(:,:,IKB+KKL)+PDXX(:,:,IKB))) !$acc end kernels CALL MXF_DEVICE(ZTMP2_DEVICE(:,:,1:1),ZTMP4_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZA) ZA(:,:,IKB:IKB) = - ZTMP4_DEVICE(:,:,1:1) !$acc end kernels #endif @@ -1134,7 +1134,7 @@ CALL MYM_DEVICE( ZKEFF, ZTMP1_DEVICE ) CALL MYM_DEVICE( PDZZ, ZTMP2_DEVICE ) CALL MZM_DEVICE(PRHODJ, ZTMP3_DEVICE ) CALL MYM_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) -!$acc kernels +!$acc kernels present(ZA,ZCOEFFLXU) #ifndef MNH_BITREP ZA(:,:,:) = - PTSTEP * XCMFS * ZTMP1_DEVICE(:,:,:) * ZTMP4_DEVICE(:,:,:) / ZTMP2_DEVICE(:,:,:)**2 #else @@ -1203,7 +1203,7 @@ IF (GOCEAN) THEN ! Ocean case ELSE ! Atmos case IF (.NOT.LCOUPLES) THEN ! only atmosp without coupling ! compute the explicit tangential flux at the W point -!$acc kernels +!$acc kernels present(ZSOURCE,ZTMP1_DEVICE) ZSOURCE(:,:,IKB) = & PTAU11M(:,:) * PSINSLOPE(:,:) * PDIRCOSZW(:,:) * ZDIRSINZW(:,:) & +PTAU12M(:,:) * PCOSSLOPE(:,:) * ZDIRSINZW(:,:) & @@ -1223,7 +1223,7 @@ ELSE ! Atmos case ZTMP1_DEVICE(:,:,1) = ZSOURCE(:,:,IKB) / PDZZ(:,:,IKB) !$acc end kernels CALL MYM_DEVICE( ZTMP1_DEVICE(:,:,1:1), ZTMP2_DEVICE(:,:,1:1) ) -!$acc kernels +!$acc kernels present(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,1) = ZCOEFFLXU(:,:,1) / PDZZ(:,:,IKB) & *ZUSLOPEM(:,:,1) & +ZCOEFFLXV(:,:,1) / PDZZ(:,:,IKB) & @@ -1232,7 +1232,7 @@ ELSE ! Atmos case CALL MYM_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZTMP3_DEVICE(:,:,1:1)) CALL MYM_DEVICE(PRHODJ(:,:,KKA:KKA),ZTMP1_DEVICE(:,:,1:1)) CALL MYM_DEVICE(PRHODJ(:,:,IKB:IKB),ZTMP4_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZSOURCE) ZSOURCE(:,:,IKB) = ( ZTMP2_DEVICE(:,:,1) + ZTMP3_DEVICE(:,:,1) - ZCOEFS(:,:,1) * PVM(:,:,IKB) * PIMPL ) & * 0.5 * ( 1. + ZTMP1_DEVICE(:,:,1) / ZTMP4_DEVICE(:,:,1) ) !$acc end kernels @@ -1309,7 +1309,7 @@ END DO CALL MYM_DEVICE(PDZZ(:,:,IKB:IKB),ZTMP1_DEVICE(:,:,1:1)) CALL MYM_DEVICE(PRHODJ(:,:,KKA:KKA),ZTMP2_DEVICE(:,:,1:1)) CALL MYM_DEVICE(PRHODJ(:,:,IKB:IKB),ZTMP3_DEVICE(:,:,1:1)) -!$acc kernels +!$acc kernels present(ZFLXZ) ZFLXZ(:,:,IKB) = ZTMP1_DEVICE(:,:,1) * & ( ZSOURCE(:,:,IKB) & +ZCOEFS(:,:,1) * ZRES(:,:,IKB) * PIMPL & @@ -1384,11 +1384,11 @@ ZFLXZ(:,:,IKB+KKL:IKB+KKL) * (PVM(:,:,IKB+KKL:IKB+KKL)-PVM(:,:,IKB:IKB)) & ) #else CALL MYM_DEVICE( PDZZ(:,:,IKB+KKL:IKB+KKL), ZTMP1_DEVICE(:,:,1:1) ) -!$acc kernels +!$acc kernels present(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,1) = ZFLXZ(:,:,IKB+KKL) * (PVM(:,:,IKB+KKL)-PVM(:,:,IKB)) / ZTMP1_DEVICE(:,:,1) !$acc end kernels CALL MYF_DEVICE( ZTMP2_DEVICE(:,:,1:1), ZTMP1_DEVICE(:,:,1:1) ) -!$acc kernels +!$acc kernels present(ZA) ZA(:,:,IKB) = - ZTMP1_DEVICE(:,:,1) !$acc end kernels #endif @@ -1567,13 +1567,13 @@ IF(HTURBDIM=='3DIM') THEN /(PDZZ(:,:,IKB+KKL)+PDZZ(:,:,IKB )) !$acc end kernels CALL MYM_DEVICE( ZTMP2_DEVICE(:,:,1:1), ZTMP3_DEVICE(:,:,1:1) ) -!$acc kernels +!$acc kernels present(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,1) = ZFLXZ(:,:,IKB+KKL) * & ( ZTMP1_DEVICE(:,:,1) - ZTMP3_DEVICE(:,:,1) * PDZY(:,:,IKB+KKL) ) & / (0.5*(PDYY(:,:,IKB+KKL)+PDYY(:,:,IKB))) !$acc end kernels CALL MYF_DEVICE( ZTMP2_DEVICE(:,:,1:1), ZTMP1_DEVICE(:,:,1:1) ) -!$acc kernels +!$acc kernels present(ZA) ZA(:,:,IKB:IKB) = - ZTMP1_DEVICE(:,:,1:1) !$acc end kernels #endif diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90 index c6460dcee8af51e0c6dd1f571243bb21fd04ca2e..8d61bacab7cb2fe6069e2fd30fcf250ce071cd32 100644 --- a/src/MNH/turb_ver_thermo_corr.f90 +++ b/src/MNH/turb_ver_thermo_corr.f90 @@ -728,7 +728,7 @@ END IF END DO !$acc end kernels CALL MZF_DEVICE( ZTMP3_DEVICE(:,:,:), ZTMP4_DEVICE(:,:,:) ) - !$acc kernels + !$acc kernels present(ZFLXZ) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif @@ -1409,7 +1409,7 @@ END IF END DO !$acc end kernels CALL MZF_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) ) - !$acc kernels + !$acc kernels present(ZFLXZ) #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index 0752d12fd69b685e3175842e4a8e483e642b09b5..0e02f50cdf89a01a1d1a792fd8ef53afc652ce52 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -1114,7 +1114,7 @@ END IF #else IF ( KRRL >= 1 ) THEN IF ( KRRI >= 1 ) THEN -!$acc kernels +!$acc kernels present(ZTMP2_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:) * PATHETA(:,:,:) * 2. * PSRCM(:,:,:) ZTMP2_DEVICE(:,:,:) = ZFLXZ(:,:,:) / PDZZ(:,:,:) !$acc end kernels @@ -1124,7 +1124,7 @@ IF ( KRRL >= 1 ) THEN PRRS(:,:,:,4) = PRRS(:,:,:,4) - ZTMP1_DEVICE(:,:,:) * ZTMP3_DEVICE * PFRAC_ICE(:,:,:) !$acc end kernels ELSE -!$acc kernels +!$acc kernels present(ZTMP2_DEVICE) !dir$ concurrent ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:) * PATHETA(:,:,:) * 2. * PSRCM(:,:,:) ZTMP2_DEVICE(:,:,:) = ZFLXZ(:,:,:) / PDZZ(:,:,:) @@ -1562,7 +1562,7 @@ END DO ZA(JI,JJ,JK) = PBETA(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) END DO !$acc end kernels -!$acc kernels +!$acc kernels present(ZA) #endif ZA(:,:,IKB) = PBETA(:,:,IKB) * PEMOIST(:,:,IKB) * & 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) @@ -1610,7 +1610,7 @@ END DO #else IF ( KRRL >= 1 ) THEN IF ( KRRI >= 1 ) THEN - !$acc kernels + !$acc kernels present(ZTMP2_DEVICE) !dir$ concurrent ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*2.*PSRCM(:,:,:) ZTMP2_DEVICE(:,:,:) = ZFLXZ(:,:,:)/PDZZ(:,:,:) @@ -1621,7 +1621,8 @@ END DO PRRS(:,:,:,4) = PRRS(:,:,:,4) - ZTMP1_DEVICE(:,:,:) * ZTMP3_DEVICE(:,:,:) * PFRAC_ICE(:,:,:) !$acc end kernels ELSE -!$acc kernels + !$acc kernels present(ZTMP2_DEVICE) + !dir$ concurrent ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*2.*PSRCM(:,:,:) ZTMP2_DEVICE(:,:,:) = ZFLXZ(:,:,:)/PDZZ(:,:,:) !$acc end kernels