diff --git a/src/MNH/gradient_m.f90 b/src/MNH/gradient_m.f90 index a31398eb734c7c8259b6cba9fefca8c169553b8c..25bd46fee85fce4a936a36d92010997ec19b176c 100644 --- a/src/MNH/gradient_m.f90 +++ b/src/MNH/gradient_m.f90 @@ -859,8 +859,8 @@ INTEGER IIU,IJU,IKU,JI IIU=SIZE(PY,1) IJU=SIZE(PY,2) IKU=SIZE(PY,3) -IF (.NOT. LFLAT) THEN !$acc kernels +IF (.NOT. LFLAT) THEN PGX_M_U(1+JPHEXT:IIU,1:IJU,1+JPVEXT_TURB:IKU-JPVEXT_TURB) = & ( PY(1+JPHEXT:IIU,1:IJU,1+JPVEXT_TURB:IKU-JPVEXT_TURB)-PY(JPHEXT:IIU-1,1:IJU,1+JPVEXT_TURB:IKU-JPVEXT_TURB) & -( (PY(1+JPHEXT:IIU,1:IJU,1+JPVEXT_TURB:IKU-JPVEXT_TURB)-PY(1+JPHEXT:IIU,1:IJU,JPVEXT_TURB:IKU-JPVEXT_TURB-1)) & @@ -877,21 +877,16 @@ PGX_M_U(1+JPHEXT:IIU,1:IJU,1+JPVEXT_TURB:IKU-JPVEXT_TURB) = & ! DO JI=1+JPHEXT,IIU PGX_M_U(JI,:,KKU)= ( PY(JI,:,KKU)-PY(JI-1,:,KKU) ) / PDXX(JI,:,KKU) - PGX_M_U(JI,:,KKA)= -999. + PGX_M_U(JI,:,KKA)= PGX_M_U(JI,:,KKU) ! -999. END DO -! - PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) -!$acc end kernels - ELSE -!$acc kernels - PGX_M_U(1+JPHEXT:IIU,:,:) = ( PY(1+JPHEXT:IIU,:,:)-PY(JPHEXT:IIU-1,:,:) ) & - / PDXX(1+JPHEXT:IIU,:,:) -! - PGX_M_U(1,:,:)=PGX_M_U(IIU-2*JPHEXT+1,:,:) -!$acc end kernels -! + PGX_M_U(1+1:IIU,:,:) = ( PY(1+1:IIU,:,:)-PY(1:IIU-1,:,:) ) & ! +JPHEXT + / PDXX(1+1:IIU,:,:) ENDIF +DO JI=1,JPHEXT + PGX_M_U(JI,:,:)=PGX_M_U(IIU-2*JPHEXT+JI,:,:) ! for reprod JPHEXT <> 1 +END DO +!$acc end kernels ! !------------------------------------------------------------------------------- @@ -1061,8 +1056,8 @@ INTEGER IJU,IKU,JJ,JK ! IJU=SIZE(PY,2) IKU=SIZE(PY,3) -IF (.NOT. LFLAT) THEN !$acc kernels +IF (.NOT. LFLAT) THEN DO JK=1+JPVEXT_TURB,IKU-JPVEXT_TURB DO JJ=1+JPHEXT,IJU PGY_M_V(:,JJ,JK)= & @@ -1079,19 +1074,16 @@ IF (.NOT. LFLAT) THEN ! DO JJ=1+JPHEXT,IJU PGY_M_V(:,JJ,KKU)= ( PY(:,JJ,KKU)-PY(:,JJ-1,KKU) ) / PDYY(:,JJ,KKU) - PGY_M_V(:,JJ,KKA)= -999. + PGY_M_V(:,JJ,KKA)= PGY_M_V(:,JJ,KKU) ! -999. END DO -! - PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) -!$acc end kernels ELSE -!$acc kernels - PGY_M_V(:,1+JPHEXT:IJU,:) = ( PY(:,1+JPHEXT:IJU,:)-PY(:,JPHEXT:IJU-1,:) ) & - / PDYY(:,1+JPHEXT:IJU,:) -! - PGY_M_V(:,1,:)=PGY_M_V(:,IJU-2*JPHEXT+1,:) -!$acc end kernels + PGY_M_V(:,1+1:IJU,:) = ( PY(:,1+1:IJU,:)-PY(:,1:IJU-1,:) ) & ! +JPHEXT + / PDYY(:,1+1:IJU,:) ENDIF +DO JJ=1,JPHEXT + PGY_M_V(:,JJ,:)=PGY_M_V(:,IJU-2*JPHEXT+JJ,:) +END DO +!$acc end kernels ! !------------------------------------------------------------------------------- ! @@ -1230,7 +1222,7 @@ PGZ_M_W(:,:,IKTB:IKTE) = (PY(:,:,IKTB:IKTE)-PY(:,:,IKTB-KL:IKTE-KL)) & / PDZZ(:,:,IKTB:IKTE) PGZ_M_W(:,:,KKU)= (PY(:,:,KKU)-PY(:,:,KKU-KL)) & / PDZZ(:,:,KKU) -PGZ_M_W(:,:,KKA)=-999. +PGZ_M_W(:,:,KKA)= PGZ_M_W(:,:,KKU) ! -999. !$acc end kernels ! !------------------------------------------------------------------------------- diff --git a/src/MNH/shuman_device.f90 b/src/MNH/shuman_device.f90 index 5c10471b615f41267373d04db84a631193d1b03e..46a2227806186f5e512a0745d5ecd08ee7392614 100644 --- a/src/MNH/shuman_device.f90 +++ b/src/MNH/shuman_device.f90 @@ -143,6 +143,8 @@ END MODULE MODI_SHUMAN_DEVICE !! Original 04/07/94 !! Modification to include the periodic case 13/10/94 J.Stein !! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -184,7 +186,7 @@ IKU = SIZE(PA,3) !$acc kernels present(PMXF,PA) DO JK = 1, IKU DO JJ = 1, IJU - DO JI = 1 + JPHEXT, IIU + DO JI = 1 + 1, IIU PMXF(JI-1,JJ,JK) = 0.5*( PA(JI-1,JJ,JK)+PA(JI,JJ,JK) ) ENDDO ENDDO @@ -193,7 +195,7 @@ ENDDO PMXF(IIU,:,:) = PMXF(2*JPHEXT,:,:) !$acc end kernels #else -JIJKOR = 1 + JPHEXT +JIJKOR = 1 + 1 JIJKEND = IIU*IJU*IKU ! !$acc kernels present(PMXF,PA) @@ -205,8 +207,10 @@ END DO ! !CDIR NODEP !OCL NOVREC -DO JJK=1,IJU*IKU - PMXF(IIU,JJK,1) = PMXF(2*JPHEXT,JJK,1) +DO JI=1,JPHEXT + DO JJK=1,IJU*IKU + PMXF(IIU-JPHEXT+JI,JJK,1) = PMXF(JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1 + END DO END DO !$acc end kernels #endif @@ -260,6 +264,8 @@ END SUBROUTINE MXF_DEVICE !! Original 04/07/94 !! Modification to include the periodic case 13/10/94 J.Stein !! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -303,7 +309,7 @@ IKU = SIZE(PA,3) !$acc kernels present(PA,PMXM) DO JK = 1, IKU DO JJ = 1, IJU - DO JI = 1 + JPHEXT, IIU + DO JI = 1 + 1, IIU PMXM(JI,JJ,JK) = 0.5*( PA(JI,JJ,JK)+PA(JI-1,JJ,JK) ) ENDDO ENDDO @@ -316,7 +322,7 @@ DO JK = 1, IKU ENDDO !$acc end kernels #else -JIJKOR = 1 + JPHEXT +JIJKOR = 1 + 1 JIJKEND = IIU*IJU*IKU ! !CDIR NODEP @@ -328,8 +334,10 @@ END DO ! !CDIR NODEP !OCL NOVREC -DO JJK=1,IJU*IKU - PMXM(1,JJK,1) = PMXM(IIU-2*JPHEXT+1,JJK,1) +DO JI=1,JPHEXT + DO JJK=1,IJU*IKU + PMXM(JI,JJK,1) = PMXM(IIU-2*JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1 + END DO END DO !$acc end kernels #endif @@ -383,6 +391,8 @@ END SUBROUTINE MXM_DEVICE !! Original 04/07/94 !! Modification to include the periodic case 13/10/94 J.Stein !! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -419,8 +429,8 @@ IIU = SIZE(PA,1) IJU = SIZE(PA,2) IKU = SIZE(PA,3) ! -#ifndef _OPT_LINEARIZED_LOOPS !$acc kernels present(PA,PMYF) +#ifndef _OPT_LINEARIZED_LOOPS DO JK=1,IKU DO JJ=1,IJU-1 DO JI=1,IIU !TODO: remplacer le 1 par JPHEXT ? @@ -428,23 +438,22 @@ DO JK=1,IKU END DO END DO END DO -! -PMYF(:,IJU,:) = PMYF(:,2*JPHEXT,:) -!$acc end kernels #else JIJKOR = 1 + IIU JIJKEND = IIU*IJU*IKU ! -!$acc kernels present(PA,PMYF) !CDIR NODEP !OCL NOVREC DO JIJK=JIJKOR , JIJKEND PMYF(JIJK-IIU,1,1) = 0.5*( PA(JIJK-IIU,1,1)+PA(JIJK,1,1) ) END DO +#endif ! -PMYF(:,IJU,:) = PMYF(:,2*JPHEXT,:) +DO JJ=1,JPHEXT + PMYF(:,IJU-JPHEXT+JJ,:) = PMYF(:,JPHEXT+JJ,:) ! for reprod JPHEXT <> 1 +END DO !$acc end kernels -#endif +! ! !------------------------------------------------------------------------------- ! @@ -495,6 +504,8 @@ END SUBROUTINE MYF_DEVICE !! Original 04/07/94 !! Modification to include the periodic case 13/10/94 J.Stein !! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -542,9 +553,6 @@ DO JK=1,IKU END DO END DO END DO -! -PMYM(:,1,:) = PMYM(:,IJU-2*JPHEXT+1,:) -!$acc end kernels #else JIJKOR = 1 + IIU JIJKEND = IIU*IJU*IKU @@ -554,10 +562,12 @@ JIJKEND = IIU*IJU*IKU DO JIJK=JIJKOR , JIJKEND PMYM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-IIU,1,1) ) END DO +#endif ! -PMYM(:,1,:) = PMYM(:,IJU-2*JPHEXT+1,:) +DO JJ=1,JPHEXT + PMYM(:,JJ,:) = PMYM(:,IJU-2*JPHEXT+JJ,:) ! for reprod JPHEXT <> 1 +END DO !$acc end kernels -#endif ! !------------------------------------------------------------------------------- ! @@ -661,7 +671,7 @@ END DO !CDIR NODEP !OCL NOVREC DO JIJ=1,IIU*IJU - PMZF(JIJ,1,IKU) = -999. + PMZF(JIJ,1,IKU) = PMZF(JIJ,1,IKU-1) !-999. END DO !$acc end kernels #endif @@ -825,6 +835,8 @@ END SUBROUTINE MZM_DEVICE !! Original 05/07/94 !! Modification to include the periodic case 13/10/94 J.Stein !! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -866,7 +878,7 @@ IKU = SIZE(PA,3) !$acc kernels present(PA,PDXF) DO JK=1,IKU DO JJ=1,IJU - DO JI=1+JPHEXT,IIU + DO JI=1+1,IIU PDXF(JI-1,JJ,JK) = PA(JI,JJ,JK) - PA(JI-1,JJ,JK) END DO END DO @@ -879,7 +891,7 @@ DO JK=1,IKU ENDDO !$acc end kernels #else -JIJKOR = 1 + JPHEXT +JIJKOR = 1 + 1 JIJKEND = IIU*IJU*IKU ! !$acc kernels present(PA,PDXF) @@ -891,8 +903,10 @@ END DO ! !CDIR NODEP !OCL NOVREC -DO JJK=1,IJU*IKU - PDXF(IIU,JJK,1) = PDXF(2*JPHEXT,JJK,1) +DO JI=1,JPHEXT + DO JJK=1,IJU*IKU + PDXF(IIU-JPHEXT+JI,JJK,1) = PDXF(JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1 + END DO END DO !$acc end kernels #endif @@ -1011,8 +1025,10 @@ END DO ! !CDIR NODEP !OCL NOVREC -DO JJK=1,IJU*IKU - PDXM(1,JJK,1) = PDXM(IIU-2*JPHEXT+1,JJK,1) +DO JI=1,JPHEXT + DO JJK=1,IJU*IKU + PDXM(JI,JJK,1) = PDXM(IIU-2*JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1 + END DO END DO !$acc end kernels #endif @@ -1066,6 +1082,8 @@ END SUBROUTINE DXM_DEVICE !! Original 05/07/94 !! Modification to include the periodic case 13/10/94 J.Stein !! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -1101,8 +1119,8 @@ IIU = SIZE(PA,1) IJU = SIZE(PA,2) IKU = SIZE(PA,3) ! -#ifndef _OPT_LINEARIZED_LOOPS !$acc kernels present(PA,PDYF) +#ifndef _OPT_LINEARIZED_LOOPS DO JK=1,IKU DO JJ=1,IJU-1 !TODO: remplacer le 1 par JPHEXT ? DO JI=1,IIU @@ -1110,23 +1128,21 @@ DO JK=1,IKU END DO END DO END DO -! -PDYF(:,IJU,:) = PDYF(:,2*JPHEXT,:) -!$acc end kernels #else JIJKOR = 1 + IIU JIJKEND = IIU*IJU*IKU ! -!$acc kernels present(PA,PDYF) !CDIR NODEP !OCL NOVREC DO JIJK=JIJKOR , JIJKEND PDYF(JIJK-IIU,1,1) = PA(JIJK,1,1) - PA(JIJK-IIU,1,1) END DO +#endif ! -PDYF(:,IJU,:) = PDYF(:,2*JPHEXT,:) +DO JJ=1,JPHEXT + PDYF(:,IJU-JPHEXT+JJ,:) = PDYF(:,JPHEXT+JJ,:) ! for reprod JPHEXT <> 1 +END DO !$acc end kernels -#endif ! !------------------------------------------------------------------------------- ! @@ -1177,6 +1193,8 @@ END SUBROUTINE DYF_DEVICE !! Original 05/07/94 !! Modification to include the periodic case 13/10/94 J.Stein !! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -1222,8 +1240,9 @@ DO JK=1,IKU END DO END DO ! -PDYM(:,1,:) = PDYM(:,IJU-2*JPHEXT+1,:) -!$acc end kernels +DO JJ=1,JPHEXT + PDYM(:,JJ,:) = PDYM(:,IJU-2*JPHEXT+JJ,:) ! for reprod JPHEXT <> 1 +END DO #else JIJKOR = 1 + IIU JIJKEND = IIU*IJU*IKU @@ -1232,12 +1251,14 @@ JIJKEND = IIU*IJU*IKU !CDIR NODEP !OCL NOVREC DO JIJK=JIJKOR , JIJKEND - PDYM(JIJK,1,1) = PA(JIJK,1,1) - PA(JIJK-IIU,1,1) + PDYM(JIJK,1,1) = PA(JIJK,1,1) - PA(JIJK-IIU,1,1) END DO +#endif ! -PDYM(:,1,:) = PDYM(:,IJU-2*JPHEXT+1,:) +DO JJ=1,JPHEXT + PDYM(:,JJ,:) = PDYM(:,IJU-2*JPHEXT+JJ,:) ! for reprod JPHEXT <> 1 +END DO !$acc end kernels -#endif ! ! !-------------------------------------------------------------------------------