diff --git a/src/ZSOLVER/gdiv.f90 b/src/ZSOLVER/gdiv.f90 index b22065908c6e897d61706999fd1374582060f1d4..d548d9fa49aca7695193f55b0d6d2022574124b8 100644 --- a/src/ZSOLVER/gdiv.f90 +++ b/src/ZSOLVER/gdiv.f90 @@ -106,6 +106,10 @@ USE MODI_CONTRAV ! USE MODE_ll ! +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D +#endif +! IMPLICIT NONE ! !* 0.1 declarations of arguments @@ -145,6 +149,14 @@ INTEGER :: IKE ! indice K for the last inner mass point along z ! INTEGER :: JI,JJ,JK ! loop indexes ! +#ifdef MNH_OPENACC +INTEGER :: IIU,IJU,IKU +! +REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZTMP1,ZTMP2 +INTEGER :: IZTMP1,IZTMP2 +#endif +! +LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH ! !------------------------------------------------------------------------------- ! @@ -156,6 +168,20 @@ CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IKB=1+JPVEXT IKE=SIZE(PU,3) - JPVEXT ! +#ifdef MNH_OPENACC +IIU=SIZE(PU,1) +IJU=SIZE(PU,2) +IKU=SIZE(PU,3) +! +IZTMP1 = MNH_ALLOCATE_ZT3D( ZTMP1,IIU,IJU,IKU ) +IZTMP2 = MNH_ALLOCATE_ZT3D( ZTMP2,IIU,IJU,IKU ) +#endif +! +GWEST = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() ) +GSOUTH = ( .NOT. L2D .AND. HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) +GNORTH = ( .NOT. L2D .AND. HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() ) +! !------------------------------------------------------------------------------- ! !* 2. COMPUTE THE CONTRAVARIANT COMPONENTS @@ -164,22 +190,31 @@ IKE=SIZE(PU,3) - JPVEXT !* 2.1 prepare the boundary conditions ! ! - PU(:,:,IKB-1)=PU(:,:,IKB) - PU(:,:,IKE+1)=PU(:,:,IKE) - PV(:,:,IKB-1)=PV(:,:,IKB) - PV(:,:,IKE+1)=PV(:,:,IKE) - +!$acc kernels + DO CONCURRENT ( JI=1:IIU,JJ=1:IJU ) + PU(JI,JJ,IKB-1)=PU(JI,JJ,IKB) + PU(JI,JJ,IKE+1)=PU(JI,JJ,IKE) + PV(JI,JJ,IKB-1)=PV(JI,JJ,IKB) + PV(JI,JJ,IKE+1)=PV(JI,JJ,IKE) + END DO +!$acc end kernels ! ! !* 2.1 compute the contravariant components ! +#ifndef MNH_OPENACC CALL CONTRAV(HLBCX,HLBCY,PU,PV,PW,PDXX,PDYY,PDZZ,PDZX,PDZY,ZUC,ZVC,ZWC,4) +#else +CALL CONTRAV_DEVICE(HLBCX,HLBCY,PU,PV,PW,PDXX,PDYY,PDZZ,PDZX,PDZY,ZUC,ZVC,ZWC,4, & + ZTMP1,ZTMP2,ODATA_ON_DEVICE=.TRUE.) +#endif ! !------------------------------------------------------------------------------- ! !* 3. COMPUTE THE DIVERGENCE ! ---------------------- ! +!$acc kernels PGDIV=0. !usefull for the four corners and halo zones ! Z1(IIB:IIE,:,:)=ZUC(IIB+1:IIE+1,:,:)-ZUC(IIB:IIE,:,:) @@ -190,7 +225,8 @@ PGDIV(IIB:IIE,IJB:IJE,IKB:IKE)= Z1(IIB:IIE,IJB:IJE,IKB:IKE) + & Z2(IIB:IIE,IJB:IJE,IKB:IKE) + & Z3(IIB:IIE,IJB:IJE,IKB:IKE) ! only the divergences computed - ! in the inner mass points are meaningful + ! in the inner mass points are meaningful +!$acc end kernels ! !------------------------------------------------------------------------------- ! @@ -201,12 +237,14 @@ PGDIV(IIB:IIE,IJB:IJE,IKB:IKE)= Z1(IIB:IIE,IJB:IJE,IKB:IKE) + & ! ! we set the divergence equal to the vertical contravariant component above ! and under the physical domain +!$acc kernels async DO JJ=IJB,IJE DO JI=IIB,IIE PGDIV(JI,JJ,IKB-1)=ZWC(JI,JJ,IKB) PGDIV(JI,JJ,IKE+1)=ZWC(JI,JJ,IKE+1) END DO END DO +!$acc end kernels ! !* 4.2 set divergence at the lateral boundaries ! @@ -214,64 +252,89 @@ END DO ! the right and the left of the physical domain in both horizontal directions ! for non-periodic cases ! -IF(HLBCX(1) /= 'CYCL' .AND. LWEST_ll()) THEN - DO JK=IKB,IKE - DO JJ=IJB,IJE - PGDIV(IIB-1,JJ,JK)=ZUC(IIB,JJ,JK) - END DO - END DO +IF( GWEST ) THEN + !$acc kernels async + DO JK=IKB,IKE + DO JJ=IJB,IJE + PGDIV(IIB-1,JJ,JK)=ZUC(IIB,JJ,JK) + END DO + END DO + !$acc end kernels END IF ! -IF(HLBCX(2) /= 'CYCL' .AND. LEAST_ll()) THEN - DO JK=IKB,IKE - DO JJ=IJB,IJE - PGDIV(IIE+1,JJ,JK)=ZUC(IIE+1,JJ,JK) - END DO - END DO +IF( GEAST ) THEN + !$acc kernels async + DO JK=IKB,IKE + DO JJ=IJB,IJE + PGDIV(IIE+1,JJ,JK)=ZUC(IIE+1,JJ,JK) + END DO + END DO + !$acc end kernels END IF ! ! -IF (.NOT. L2D .AND. HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll()) THEN - DO JK=IKB,IKE - DO JI=IIB,IIE - PGDIV(JI,IJB-1,JK)=ZVC(JI,IJB,JK) - END DO - END DO +IF ( GSOUTH ) THEN + !$acc kernels async + DO JK=IKB,IKE + DO JI=IIB,IIE + PGDIV(JI,IJB-1,JK)=ZVC(JI,IJB,JK) + END DO + END DO + !$acc end kernels END IF ! -IF (.NOT. L2D .AND. HLBCY(2) /= 'CYCL' .AND. LNORTH_ll()) THEN - DO JK=IKB,IKE - DO JI=IIB,IIE - PGDIV(JI,IJE+1,JK)=ZVC(JI,IJE+1,JK) - END DO - END DO +IF ( GNORTH ) THEN + !$acc kernels async + DO JK=IKB,IKE + DO JI=IIB,IIE + PGDIV(JI,IJE+1,JK)=ZVC(JI,IJE+1,JK) + END DO + END DO + !$acc end kernels END IF ! +! wait on GPU for all boundary condition update +!$acc wait +! !* 4.3 set divergence at the corner points ! ! it is the following of the condition of copy the horizontal component ! under the bottom of the model ! -IF(HLBCX(1) /= 'CYCL' .AND. LWEST_ll()) THEN - PGDIV(IIB-1,IJB:IJE,IKB-1)=PGDIV(IIB-1,IJB:IJE,IKB) - PGDIV(IIB-1,IJB:IJE,IKE+1)=PGDIV(IIB-1,IJB:IJE,IKE) +IF( GWEST ) THEN + !$acc kernels async + PGDIV(IIB-1,IJB:IJE,IKB-1)=PGDIV(IIB-1,IJB:IJE,IKB) + PGDIV(IIB-1,IJB:IJE,IKE+1)=PGDIV(IIB-1,IJB:IJE,IKE) + !$acc end kernels END IF ! -IF (HLBCX(2) /= 'CYCL' .AND. LEAST_ll()) THEN - PGDIV(IIE+1,IJB:IJE,IKB-1)=PGDIV(IIE+1,IJB:IJE,IKB) - PGDIV(IIE+1,IJB:IJE,IKE+1)=PGDIV(IIE+1,IJB:IJE,IKE) +IF ( GEAST ) THEN + !$acc kernels async + PGDIV(IIE+1,IJB:IJE,IKB-1)=PGDIV(IIE+1,IJB:IJE,IKB) + PGDIV(IIE+1,IJB:IJE,IKE+1)=PGDIV(IIE+1,IJB:IJE,IKE) + !$acc end kernels END IF ! -IF (.NOT. L2D .AND. HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll()) THEN - PGDIV(IIB:IIE,IJB-1,IKB-1)=PGDIV(IIB:IIE,IJB-1,IKB) - PGDIV(IIB:IIE,IJB-1,IKE+1)=PGDIV(IIB:IIE,IJB-1,IKE) +IF ( GSOUTH ) THEN + !$acc kernels async + PGDIV(IIB:IIE,IJB-1,IKB-1)=PGDIV(IIB:IIE,IJB-1,IKB) + PGDIV(IIB:IIE,IJB-1,IKE+1)=PGDIV(IIB:IIE,IJB-1,IKE) + !$acc end kernels END IF ! -IF (.NOT. L2D .AND. HLBCY(2) /= 'CYCL' .AND. LNORTH_ll()) THEN - PGDIV(IIB:IIE,IJE+1,IKB-1)=PGDIV(IIB:IIE,IJE+1,IKB) - PGDIV(IIB:IIE,IJE+1,IKE+1)=PGDIV(IIB:IIE,IJE+1,IKE) +IF ( GNORTH ) THEN + !$acc kernels async + PGDIV(IIB:IIE,IJE+1,IKB-1)=PGDIV(IIB:IIE,IJE+1,IKB) + PGDIV(IIB:IIE,IJE+1,IKE+1)=PGDIV(IIB:IIE,IJE+1,IKE) + !$acc end kernels END IF ! +! wait on GPU for all corner update +!$acc wait +! +#ifdef MNH_OPENACC +CALL MNH_REL_ZT3D ( IZTMP1,IZTMP2 ) +#endif ! !------------------------------------------------------------------------------- ! diff --git a/src/ZSOLVER/pressurez.f90 b/src/ZSOLVER/pressurez.f90 index c9b2b9db971f01c05b40f5c809a24c8f18a47d18..06210d56f144c701f472cd212e5e2213779c0701 100644 --- a/src/ZSOLVER/pressurez.f90 +++ b/src/ZSOLVER/pressurez.f90 @@ -267,6 +267,15 @@ USE MODI_MASS_LEAK USE MODI_P_ABS USE MODI_RICHARDSON USE MODI_SHUMAN +#ifdef MNH_OPENACC +USE MODI_SHUMAN_DEVICE +USE MODI_GET_HALO +#endif +! +#ifdef MNH_BITREP +USE MODI_BITREP +USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D +#endif ! IMPLICIT NONE ! @@ -393,6 +402,14 @@ TYPE(LIST_ll), POINTER :: TZFIELDS_ll, TZFIELDS2_ll ! list of fields to exchang INTEGER :: IIB_I,IIE_I,IJB_I,IJE_I INTEGER :: IIMAX_ll,IJMAX_ll ! +REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZPRHODJ,ZMXM_PRHODJ,ZMZM_PRHODJ,ZGZ_M_W +INTEGER :: IZPRHODJ,IZMXM_PRHODJ,IZMZM_PRHODJ,IZGZ_M_W +REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZMYM_PRHODJ +INTEGER :: IZMYM_PRHODJ +! +! +LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH +LOGICAL :: GSOUTH2D,GNORTH2D,GPRVREF0 ! !------------------------------------------------------------------------------ !------------------------------------------------------------------------------- @@ -416,10 +433,27 @@ IKB= 1+JPVEXT IKU= SIZE(PPABST,3) IKE= IKU - JPVEXT ! +GWEST = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() ) +GSOUTH = ( .NOT. L2D .AND. HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) +GNORTH = ( .NOT. L2D .AND. HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() ) +GSOUTH2D = ( L2D .AND. LSOUTH_ll() ) +GNORTH2D = ( L2D .AND. LNORTH_ll() ) +! +GPRVREF0 = ( SIZE(PRVREF,1) == 0 ) +! +IZPRHODJ = MNH_ALLOCATE_ZT3D( ZPRHODJ,IIU,IJU,IKU ) +IZMXM_PRHODJ = MNH_ALLOCATE_ZT3D( ZMXM_PRHODJ,IIU,IJU,IKU ) +IZMZM_PRHODJ = MNH_ALLOCATE_ZT3D( ZMZM_PRHODJ,IIU,IJU,IKU ) +IZGZ_M_W = MNH_ALLOCATE_ZT3D( ZGZ_M_W,IIU,IJU,IKU ) +IZMYM_PRHODJ = MNH_ALLOCATE_ZT3D( ZMYM_PRHODJ,IIU,IJU,IKU ) +! +!$acc kernels ZPABS_S(:,:) = 0. ZPABS_N(:,:) = 0. ZPABS_E(:,:) = 0. ZPABS_W(:,:) = 0. +!$acc end kernels ! ! !------------------------------------------------------------------------------- @@ -454,15 +488,27 @@ CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRUS,PRVS,PRWS,ZDV_SOURCE) ! ! The non-homogenous Neuman problem is transformed in an homogenous Neuman ! problem in the non-periodic cases -IF (HLBCX(1) /= 'CYCL') THEN - IF (LWEST_ll()) ZDV_SOURCE(IIB-1,:,:) = 0. - IF (LEAST_ll()) ZDV_SOURCE(IIE+1,:,:) = 0. -ENDIF -! -IF (.NOT. L2D .AND. HLBCY(1) /= 'CYCL') THEN - IF (LSOUTH_ll()) ZDV_SOURCE(:,IJB-1,:) = 0. - IF (LNORTH_ll()) ZDV_SOURCE(:,IJE+1,:) = 0. -ENDIF +IF ( GWEST ) THEN + !$acc kernels async + ZDV_SOURCE(IIB-1,:,:) = 0. + !$acc end kernels +END IF +IF ( GEAST ) THEN + !$acc kernels async + ZDV_SOURCE(IIE+1,:,:) = 0. + !$acc end kernels +END IF +IF ( GSOUTH ) THEN + !$acc kernels async + ZDV_SOURCE(:,IJB-1,:) = 0. + !$acc end kernels +END IF +IF ( GNORTH ) THEN + !$acc kernels async + ZDV_SOURCE(:,IJE+1,:) = 0. + !$acc end kernels +END IF +!$acc wait ! !------------------------------------------------------------------------------- ! @@ -474,6 +520,7 @@ ENDIF ! ------------------------------------------------------- ! IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN + !$acc kernels IF(KRR > 0) THEN ! ! compute the ratio : 1 + total water mass / dry air mass @@ -489,8 +536,15 @@ IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN ! compute the virtual potential temperature when water is absent ZTHETAV(:,:,:) = PTHT(:,:,:) END IF + !$acc end kernels ! +#ifndef MNH_OPENACC ZPHIT(:,:,:)=(PPABST(:,:,:)/XP00)**(XRD/XCPD)-PEXNREF(:,:,:) +#else + !$acc kernels + ZPHIT(:,:,:)=BR_POW((PPABST(:,:,:)/XP00),(XRD/XCPD))-PEXNREF(:,:,:) + !$acc end kernels +#endif ! ELSEIF(CEQNSYS=='LHE') THEN ZPHIT(:,:,:)= ((PPABST(:,:,:)/XP00)**(XRD/XCPD)-PEXNREF(:,:,:)) & @@ -553,26 +607,48 @@ END IF !* 6. ADD THE PRESSURE GRADIENT TO THE SOURCES ! ---------------------------------------- ! -IF ( HLBCX(1) /= 'CYCL' ) THEN - IF(LWEST_ll()) ZPHIT(IIB-1,:,IKB-1) = ZPHIT(IIB,:,IKB-1) - IF(LEAST_ll()) ZPHIT(IIE+1,:,IKB-1) = ZPHIT(IIE,:,IKB-1) -ENDIF -IF ( HLBCY(1) /= 'CYCL' ) THEN - IF (LSOUTH_ll()) ZPHIT(:,IJB-1,IKB-1) = ZPHIT(:,IJB,IKB-1) - IF (LNORTH_ll()) ZPHIT(:,IJE+1,IKB-1) = ZPHIT(:,IJE,IKB-1) -ENDIF -! -IF ( L2D ) THEN - IF (LSOUTH_ll()) ZPHIT(:,IJB-1,:) = ZPHIT(:,IJB,:) - IF (LNORTH_ll()) ZPHIT(:,IJE+1,:) = ZPHIT(:,IJB,:) +IF ( GWEST ) THEN + !$acc kernels async + ZPHIT(IIB-1,:,IKB-1) = ZPHIT(IIB,:,IKB-1) + !$acc end kernels +END IF +IF ( GEAST ) THEN + !$acc kernels async + ZPHIT(IIE+1,:,IKB-1) = ZPHIT(IIE,:,IKB-1) + !$acc end kernels +END IF +IF ( GSOUTH ) THEN + !$acc kernels async + ZPHIT(:,IJB-1,IKB-1) = ZPHIT(:,IJB,IKB-1) + !$acc end kernels END IF +IF ( GNORTH ) THEN + !$acc kernels async + ZPHIT(:,IJE+1,IKB-1) = ZPHIT(:,IJE,IKB-1) + !$acc end kernels +END IF +IF ( GSOUTH2D ) THEN + !$acc kernels async + ZPHIT(:,IJB-1,:) = ZPHIT(:,IJB,:) + !$acc end kernels +END IF +IF ( GNORTH2D ) THEN + !$acc kernels async + ZPHIT(:,IJE+1,:) = ZPHIT(:,IJB,:) + !$acc end kernels +END IF +!$acc wait ! +#ifndef MNH_OPENACC ZDV_SOURCE = GX_M_U(1,IKU,1,ZPHIT,PDXX,PDZZ,PDZX) +#else +CALL GX_M_U_DEVICE(1,IKU,1,ZPHIT,PDXX,PDZZ,PDZX,ZDV_SOURCE) +#endif ! -IF ( HLBCX(1) /= 'CYCL' ) THEN - IF(LWEST_ll()) THEN +IF ( GWEST ) THEN !!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! !!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! + !$acc kernels DO JK=2,IKU-1 ZDV_SOURCE(IIB,:,JK)= & (ZPHIT(IIB,:,JK) - ZPHIT(IIB-1,:,JK) - 0.5 * ( & @@ -580,10 +656,12 @@ IF ( HLBCX(1) /= 'CYCL' ) THEN +PDZX(IIB,:,JK+1) * (ZPHIT(IIB,:,JK+1)-ZPHIT(IIB,:,JK)) / PDZZ(IIB,:,JK+1) & ) & ) / PDXX(IIB,:,JK) - END DO - ENDIF + END DO + !$acc end kernels +ENDIF ! - IF(LEAST_ll()) THEN +IF( GEAST ) THEN + !$acc kernels DO JK=2,IKU-1 ZDV_SOURCE(IIE+1,:,JK)= & (ZPHIT(IIE+1,:,JK) - ZPHIT(IIE+1-1,:,JK) - 0.5 * ( & @@ -593,27 +671,41 @@ IF ( HLBCX(1) /= 'CYCL' ) THEN / PDZZ(IIE+1-1,:,JK+1) & ) & ) / PDXX(IIE+1,:,JK) - END DO - END IF + END DO + !$acc end kernels END IF ! CALL MPPDB_CHECK3DM("before MXM PRESSUREZ :PRU/V/WS",PRECISION,PRUS,PRVS,PRWS) -IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - PRUS = PRUS - MXM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE - PRWS = PRWS - MZM(PRHODJ * XCPD * ZTHETAV) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) +IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN +!!$ PRUS = PRUS - MXM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE +!!$ PRWS = PRWS - MZM(PRHODJ * XCPD * ZTHETAV) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) + !$acc kernels + ZPRHODJ = PRHODJ * XCPD * ZTHETAV + !$acc end kernels + CALL MXM_DEVICE(ZPRHODJ, ZMXM_PRHODJ) + CALL MZM_DEVICE(ZPRHODJ, ZMZM_PRHODJ) + CALL GZ_M_W_DEVICE(1,IKU,1,ZPHIT,PDZZ,ZGZ_M_W) + !$acc kernels + PRUS = PRUS - ZMXM_PRHODJ * ZDV_SOURCE + PRWS = PRWS - ZMZM_PRHODJ * ZGZ_M_W + !$acc end kernels ELSEIF(CEQNSYS=='LHE') THEN PRUS = PRUS - MXM(PRHODJ) * ZDV_SOURCE PRWS = PRWS - MZM(PRHODJ) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) END IF ! IF(.NOT. L2D) THEN + ! +#ifndef MNH_OPENACC + ZDV_SOURCE = GY_M_V(1,IKU,1,ZPHIT,PDYY,PDZZ,PDZY) +#else + CALL GY_M_V_DEVICE(1,IKU,1,ZPHIT,PDYY,PDZZ,PDZY,ZDV_SOURCE) +#endif ! - ZDV_SOURCE = GY_M_V(1,IKU,1,ZPHIT,PDYY,PDZZ,PDZY) -! - IF ( HLBCY(1) /= 'CYCL' ) THEN - IF (LSOUTH_ll()) THEN + IF ( GSOUTH ) THEN !!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! !!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! + !$acc kernels async DO JK=2,IKU-1 ZDV_SOURCE(:,IJB,JK)= & (ZPHIT(:,IJB,JK) - ZPHIT(:,IJB-1,JK) - 0.5 * ( & @@ -621,10 +713,12 @@ IF(.NOT. L2D) THEN +PDZY(:,IJB,JK+1) * (ZPHIT(:,IJB,JK+1)-ZPHIT(:,IJB,JK)) / PDZZ(:,IJB,JK+1) & ) & ) / PDYY(:,IJB,JK) - END DO + END DO + !$acc end kernels END IF ! - IF (LNORTH_ll()) THEN + IF ( GNORTH ) THEN + !$acc kernels async DO JK=2,IKU-1 ZDV_SOURCE(:,IJE+1,JK)= & (ZPHIT(:,IJE+1,JK) - ZPHIT(:,IJE+1-1,JK) - 0.5 * ( & @@ -634,13 +728,18 @@ IF(.NOT. L2D) THEN / PDZZ(:,IJE+1-1,JK+1) & ) & ) / PDYY(:,IJE+1,JK) - END DO - END IF + END DO + !$acc end kernels END IF +!$acc wait ! CALL MPPDB_CHECK3DM("before MYM PRESSUREZ :PRU/V/WS",PRECISION,PRUS,PRVS,PRWS) IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - PRVS = PRVS - MYM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE +!!$ PRVS = PRVS - MYM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE + CALL MYM_DEVICE(ZPRHODJ,ZMYM_PRHODJ) + !$acc kernels + PRVS = PRVS - ZMYM_PRHODJ * ZDV_SOURCE + !$acc end kernels ELSEIF(CEQNSYS=='LHE') THEN PRVS = PRVS - MYM(PRHODJ) * ZDV_SOURCE END IF @@ -649,10 +748,12 @@ END IF !! same boundary conditions as in gdiv ... !! (provisory coding) !! (necessary when NVERB=1) !! + !$acc kernels PRUS(:,:,IKB-1)=PRUS(:,:,IKB) PRUS(:,:,IKE+1)=PRUS(:,:,IKE) PRVS(:,:,IKB-1)=PRVS(:,:,IKB) PRVS(:,:,IKE+1)=PRVS(:,:,IKE) + !$acc end kernels ! NULLIFY(TZFIELDS2_ll) CALL ADD3DFIELD_ll( TZFIELDS2_ll, PRUS, 'PRESSUREZ::PRUS' ) @@ -665,10 +766,14 @@ CALL CLEANLIST_ll(TZFIELDS2_ll) CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRUS,PRVS,PRWS,ZDV_SOURCE) ! IF ( CEQNSYS=='DUR' ) THEN - IF ( SIZE(PRVREF,1) == 0 ) THEN + IF ( GPRVREF0 ) THEN + !$acc kernels ZDV_SOURCE=ZDV_SOURCE/PRHODJ/XTH00*PRHODREF*PTHVREF - ELSE + !$acc end kernels + ELSE + !$acc kernels ZDV_SOURCE=ZDV_SOURCE/PRHODJ/XTH00*PRHODREF*PTHVREF*(1.+PRVREF) + !$acc end kernels END IF ELSEIF( CEQNSYS=='MAE' .OR. CEQNSYS=='LHE' ) THEN ZDV_SOURCE=ZDV_SOURCE/PRHODJ*PRHODREF @@ -729,61 +834,83 @@ IF ((ZMAX_ll > 1.E-12) .AND. KTCOUNT >0 ) THEN PRVREF, PEXNREF, ZPHIT ) ! IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - PPABST(:,:,:)=XP00*(ZPHIT+PEXNREF)**(XCPD/XRD) +#ifndef MNH_OPENACC + PPABST(:,:,:)=XP00*(ZPHIT+PEXNREF)**(XCPD/XRD) +#else + !$acc kernels + PPABST(:,:,:)=XP00*BR_POW((ZPHIT+PEXNREF),(XCPD/XRD)) + !$acc end kernels +#endif ELSEIF(CEQNSYS=='LHE') THEN PPABST(:,:,:)=XP00*(ZPHIT/(XCPD*PTHVREF)+PEXNREF)**(XCPD/XRD) ENDIF ! - IF( HLBCX(1) == 'CYCL' ) THEN - IF (LWEST_ll()) THEN - ZPABS_W(:,:)= PPABST(IIB,:,:) - END IF -! - IF (LEAST_ll()) THEN - ZPABS_E(:,:)= PPABST(IIE+1,:,:) - END IF -! + IF( GWEST ) THEN + !$acc kernels async + ZPABS_W(:,:)= PPABST(IIB,:,:) + !$acc end kernels END IF ! - IF( HLBCY(1) == 'CYCL' ) THEN - IF (LSOUTH_ll()) THEN - ZPABS_S(:,:)= PPABST(:,IJB,:) - END IF -! - IF (LNORTH_ll()) THEN - ZPABS_N(:,:)= PPABST(:,IJE+1,:) - END IF + IF ( GEAST ) THEN + !$acc kernels async + ZPABS_E(:,:)= PPABST(IIE+1,:,:) + !$acc end kernels + END IF ! + IF( GSOUTH ) THEN + !$acc kernels async + ZPABS_S(:,:)= PPABST(:,IJB,:) + !$acc end kernels END IF ! + IF ( GNORTH ) THEN + !$acc kernels async + ZPABS_N(:,:)= PPABST(:,IJE+1,:) + !$acc end kernels + END IF + ! + !$acc wait + ! +#ifndef MNH_OPENACC CALL ADD3DFIELD_ll( TZFIELDS_ll, PPABST, 'PRESSUREZ::PPABST' ) CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) CALL CLEANLIST_ll(TZFIELDS_ll) -! - IF( HLBCX(1) == 'CYCL' ) THEN - IF (LWEST_ll()) THEN - PPABST(IIB,:,:) = ZPABS_W(:,:) - END IF -! - IF (LEAST_ll()) THEN - PPABST(IIE+1,:,:) = ZPABS_E(:,:) - END IF -! +#else + CALL GET_HALO_D( PPABST,HNAME='PRESSUREZ::PPABST' ) +#endif + +! + IF( GWEST ) THEN + !$acc kernels async + PPABST(IIB,:,:) = ZPABS_W(:,:) + !$acc end kernels END IF ! - IF( HLBCY(1) == 'CYCL' ) THEN - IF (LSOUTH_ll()) THEN - PPABST(:,IJB,:) = ZPABS_S(:,:) - END IF + IF ( GEAST ) THEN + !$acc kernels async + PPABST(IIE+1,:,:) = ZPABS_E(:,:) + !$acc end kernels + END IF ! - IF (LNORTH_ll()) THEN - PPABST(:,IJE+1,:) = ZPABS_N(:,:) - END IF + IF( GSOUTH ) THEN + !$acc kernels async + PPABST(:,IJB,:) = ZPABS_S(:,:) + !$acc end kernels + END IF ! + IF ( GNORTH ) THEN + !$acc kernels async + PPABST(:,IJE+1,:) = ZPABS_N(:,:) + !$acc end kernels END IF ! +!$acc wait +! END IF ! +#ifdef MNH_OPENACC +CALL MNH_REL_ZT3D ( IZPRHODJ,IZMXM_PRHODJ,IZMZM_PRHODJ,IZGZ_M_W,IZMYM_PRHODJ ) +#endif !------------------------------------------------------------------------------- ! END SUBROUTINE PRESSUREZ diff --git a/src/ZSOLVER/qlap.f90 b/src/ZSOLVER/qlap.f90 index d4da491d97bc6c716267088375a88a11fbeac7cc..5f76e50d9b5f77db9717497307716ce2d7e2fef0 100644 --- a/src/ZSOLVER/qlap.f90 +++ b/src/ZSOLVER/qlap.f90 @@ -33,6 +33,33 @@ REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PQLAP ! final divergence ! END FUNCTION QLAP ! +! +#ifdef MNH_OPENACC +SUBROUTINE QLAP_DEVICE(PQLAP,HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,PY) +! +IMPLICIT NONE +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQLAP ! final divergence +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type +! + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual potential temp. at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! field components +! + +! +END SUBROUTINE QLAP_DEVICE +#endif END INTERFACE ! END MODULE MODI_QLAP @@ -262,3 +289,280 @@ CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,ZU,ZV,ZW,PQLAP) !------------------------------------------------------------------------------- ! END FUNCTION QLAP + +#ifdef MNH_OPENACC +! ######################################################################### + SUBROUTINE QLAP_DEVICE(PQLAP,HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,PY) +! ######################################################################### +! +!!**** *QLAP * - compute the complete quasi-laplacien QLAP of a field P +!! +!! PURPOSE +!! ------- +! This function computes the quasi-laplacien QLAP of the scalar field P +! localized at a mass point, with non-vanishing orography. +! The result is localized at a mass point and defined by: +! for Durran and MAE anelastic equations +! ( ( GX_M_U (PY) ) ) +! PQLAP = GDIV ( rho * CPd * Thetav * J ( GX_M_V (PY) ) ) +! ( ( GX_M_W (PY) ) ) +! or for Lipps and Hemler +! ( ( GX_M_U (PY) ) ) +! PQLAP = GDIV ( rho * J ( GX_M_V (PY) ) ) +! ( ( GX_M_W (PY) ) ) +! Where GX_M_.. are the cartesian components of the gradient of PY and +! GDIV is the operator acting on a vector AA: +! +! GDIV ( AA ) = J * divergence (1/J AA ) +! +!!** METHOD +!! ------ +!! First, we compute the gradients along x, y , z of the P field. The +!! result is multiplied by rhod * CPd * Thetav or rhod depending on the +!! chosen anelastic system where the suffixes indicate +!! d dry and v for virtual. +!! Then, the pseudo-divergence ( J * DIV (1/J o ) ) is computed by the +!! subroutine GDIV. The result is localized at a mass point. +!! +!! EXTERNAL +!! -------- +!! Function GX_M_U : compute the gradient along x +!! Function GY_M_V : compute the gradient along y +!! Function GZ_M_W : compute the gradient along z +!! FUNCTION MXM: compute an average in the x direction for a variable +!! at a mass localization +!! FUNCTION MYM: compute an average in the y direction for a variable +!! at a mass localization +!! FUNCTION MZM: compute an average in the z direction for a variable +!! at a mass localization +!! Subroutine GDIV : compute J times the divergence of 1/J times a vector +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: JPHEXT, JPVEXT +!! Module MODD_CONF: L2D,CEQNSYS +!! Module MODD_CST : XCPD +!! +!! REFERENCE +!! --------- +!! Pressure solver documentation ( Scientific documentation ) +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 11/07/94 +!! Modification 16/03/95 change the argument list of the gradient +!! 14/01/97 New anelastic equation ( Stein ) +!! 17/12/97 include the case of non-vanishing orography +!! at the lbc ( Stein ) +!! 06/12 V.Masson : update_halo due to CONTRAV changes +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODE_ll +! +USE MODD_PARAMETERS +USE MODD_CONF +USE MODD_CST +USE MODI_GDIV +USE MODI_GRADIENT_M +USE MODI_SHUMAN +USE MODI_SHUMAN_DEVICE +! +USE MODE_MPPDB +! +USE MODE_MNH_ZWORK , ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D +! +USE MODI_GET_HALO +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQLAP ! final divergence +! +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! x-direction LBC type +CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! y-direction LBC type +! + ! Metric coefficients: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! d*yy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference * J +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHETAV ! virtual potential temp. at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! field components +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZU ! rho*J*gradient along x +! +REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZV ! rho*J*gradient along y +! +REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZW ! rho*J*gradient along z +! +INTEGER :: IZU,IZV,IZW +! +INTEGER :: IIU,IJU,IKU ! I,J,K array sizes +INTEGER :: JK,JJ,JI ! vertical loop index +TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange +INTEGER :: IINFO_ll +INTEGER :: IIB,IIE,IJB,IJE +! +REAL, DIMENSION(:,:,:), pointer , contiguous :: ZMXM,ZMYM,ZMZM,ZRHODJ,ZGZMW +INTEGER :: IZMXM,IZMYM,IZMZM,IZRHODJ,IZGZMW +! +LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE THE GRADIENT COMPONENTS +! ------------------------------- +! +CALL GET_DIM_EXT_ll('B',IIU,IJU) +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKU=SIZE(PY,3) +! +GWEST = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() ) +GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) +GNORTH = ( HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() ) +! +IZU = MNH_ALLOCATE_ZT3D( ZU,IIU,IJU,IKU ) +IZV = MNH_ALLOCATE_ZT3D( ZV,IIU,IJU,IKU ) +IZW = MNH_ALLOCATE_ZT3D( ZW,IIU,IJU,IKU ) +! +IZMXM = MNH_ALLOCATE_ZT3D( ZMXM,IIU,IJU,IKU ) +IZMYM = MNH_ALLOCATE_ZT3D( ZMYM,IIU,IJU,IKU ) +IZMZM = MNH_ALLOCATE_ZT3D( ZMZM,IIU,IJU,IKU ) +IZRHODJ = MNH_ALLOCATE_ZT3D( ZRHODJ ,IIU,IJU,IKU ) +IZGZMW = MNH_ALLOCATE_ZT3D( ZGZMW ,IIU,IJU,IKU ) +! +CALL GX_M_U_DEVICE(1,IKU,1,PY,PDXX,PDZZ,PDZX,ZU) +CALL MPPDB_CHECK3D(ZU,'QLAP::ZU',PRECISION) +! +IF ( GWEST ) THEN + !$acc kernels async + DO JK=2,IKU-1 + DO JJ=1,IJU + ZU(IIB,JJ,JK)= (PY(IIB,JJ,JK) - PY(IIB-1,JJ,JK) - 0.5 * ( & + PDZX(IIB,JJ,JK) * (PY(IIB,JJ,JK)-PY(IIB,JJ,JK-1)) / PDZZ(IIB,JJ,JK) & + +PDZX(IIB,JJ,JK+1) * (PY(IIB,JJ,JK+1)-PY(IIB,JJ,JK)) / PDZZ(IIB,JJ,JK+1) & + ) ) / PDXX(IIB,JJ,JK) + END DO + END DO + !$acc end kernels +END IF +! +IF ( GEAST ) THEN + !$acc kernels async + DO JK=2,IKU-1 + DO JJ=1,IJU + ZU(IIE+1,JJ,JK)= (PY(IIE+1,JJ,JK) - PY(IIE+1-1,JJ,JK) - 0.5 * ( & + PDZX(IIE+1,JJ,JK) * (PY(IIE+1-1,JJ,JK)-PY(IIE+1-1,JJ,JK-1)) / PDZZ(IIE+1-1,JJ,JK) & + +PDZX(IIE+1,JJ,JK+1) * (PY(IIE+1-1,JJ,JK+1)-PY(IIE+1-1,JJ,JK)) / PDZZ(IIE+1-1,JJ,JK+1)& + ) ) / PDXX(IIE+1,JJ,JK) + END DO + END DO + !$acc end kernels +END IF +!$acc wait +! +CALL MPPDB_CHECK3D(ZU,'QLAP::ZU/W',PRECISION) +CALL MPPDB_CHECK3D(ZU,'QLAP::ZU/E',PRECISION) +! +IF(.NOT. L2D) THEN +! + CALL GY_M_V_DEVICE(1,IKU,1,PY,PDYY,PDZZ,PDZY,ZV) + CALL MPPDB_CHECK3D(ZV,'QLAP::ZV',PRECISION) +! + IF ( GSOUTH ) THEN + !$acc kernels async + DO JK=2,IKU-1 + DO JI=1,IIU + ZV(JI,IJB,JK)= (PY(JI,IJB,JK) - PY(JI,IJB-1,JK) - 0.5 * ( & + PDZY(JI,IJB,JK) * (PY(JI,IJB,JK)-PY(JI,IJB,JK-1)) / PDZZ(JI,IJB,JK) & + +PDZY(JI,IJB,JK+1) * (PY(JI,IJB,JK+1)-PY(JI,IJB,JK)) / PDZZ(JI,IJB,JK+1) & + ) ) / PDYY(JI,IJB,JK) + END DO + END DO + !$acc end kernels + END IF + + + IF ( GNORTH ) THEN + !$acc kernels async + DO JK=2,IKU-1 + DO JI=1,IIU + ZV(JI,IJE+1,JK)= (PY(JI,IJE+1,JK) - PY(JI,IJE+1-1,JK) - 0.5 * ( & + PDZY(JI,IJE+1,JK) * (PY(JI,IJE+1-1,JK)-PY(JI,IJE+1-1,JK-1)) & + / PDZZ(JI,IJE+1-1,JK) & + +PDZY(JI,IJE+1,JK+1) * (PY(JI,IJE+1-1,JK+1)-PY(JI,IJE+1-1,JK)) & + / PDZZ(JI,IJE+1-1,JK+1)& + ) ) / PDYY(JI,IJE+1,JK) + END DO + END DO + !$acc end kernels + END IF + !$acc wait + CALL MPPDB_CHECK3D(ZV,'QLAP::ZV/S',PRECISION) + CALL MPPDB_CHECK3D(ZV,'QLAP::ZV/N',PRECISION) +! +ELSE + ZV=0. +ENDIF +! +IF ( CEQNSYS == 'DUR' .OR. CEQNSYS == 'MAE' ) THEN + !$acc kernels + ZRHODJ = PRHODJ * XCPD * PTHETAV + !$acc end kernels + CALL MXM_DEVICE (ZRHODJ, ZMXM ) + !$acc kernels + ZU = ZMXM * ZU + !$acc end kernels + IF(.NOT. L2D) THEN + CALL MYM_DEVICE (ZRHODJ, ZMYM ) + !$acc kernels + ZV = ZMYM * ZV + !$acc end kernels + END IF + CALL MZM_DEVICE (ZRHODJ, ZMZM ) + CALL GZ_M_W_DEVICE(1,IKU,1,PY,PDZZ,ZGZMW) + !$acc kernels + ZW = ZMZM * ZGZMW + !$acc end kernels +ELSEIF ( CEQNSYS == 'LHE' ) THEN + ZU = MXM(PRHODJ) * ZU + IF(.NOT. L2D) THEN + ZV = MYM(PRHODJ) * ZV + ENDIF + ZW = MZM(PRHODJ) * GZ_M_W(1,IKU,1,PY,PDZZ) +END IF +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE THE DIVERGENCE +! ---------------------- +! +CALL GET_HALO_D(ZU,HNAME='QLAP::ZU') +CALL GET_HALO_D(ZV,HNAME='QLAP::ZV') +CALL GET_HALO_D(ZW,HNAME='QLAP::ZW') +! +CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,ZU,ZV,ZW,PQLAP) +! +CALL MNH_REL_ZT3D ( IZU,IZV,IZW, IZMXM,IZMYM,IZMZM,IZRHODJ,IZGZMW ) +!------------------------------------------------------------------------------- +! +END SUBROUTINE QLAP_DEVICE +#endif diff --git a/src/ZSOLVER/zsolver.f90 b/src/ZSOLVER/zsolver.f90 index 67c35779264fbbf9c63b31a89c940a7c27ad8c41..779a6b5685912b69249552d79b93337d17edd1bf 100644 --- a/src/ZSOLVER/zsolver.f90 +++ b/src/ZSOLVER/zsolver.f90 @@ -227,8 +227,13 @@ REAL :: ZDOT_DELTA ! dot product of ZDELTA by itself ! ! !* 1.1 compute the vector: r^(0) = Q(PHI) - Y -! +! +#ifndef MNH_OPENACC ZRESIDUE = QLAP(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,PPHI) - PY +#else +CALL QLAP_DEVICE(ZRESIDUE,HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,PPHI) +ZRESIDUE = ZRESIDUE - PY +#endif ! !* 1.2 compute the vector: p^(0) = F^(-1)*( Q(PHI) - Y ) ! @@ -240,7 +245,11 @@ CALL ZSOLVER_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & ! !* 1.3 compute the vector: delta^(0) = Q ( p^(0) ) ! +#ifndef MNH_OPENACC ZDELTA = QLAP(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,ZP) +#else +CALL QLAP_DEVICE(ZDELTA,HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,ZP) +#endif ! !------------------------------------------------------------------------------- ! @@ -256,15 +265,19 @@ DO JM = 1,KITR ! !* 2.2 update the pressure function PHI ! + !$acc kernels PPHI = PPHI + ZLAMBDA * ZP + !$acc end kernels ! ! IF( JM == KITR ) EXIT ! ! !* 2.3 update the residual error: r -! + ! + !$acc kernels ZRESIDUE = ZRESIDUE + ZLAMBDA * ZDELTA + !$acc end kernels ! !* 2.4 compute the vector: q = F^(-1)*( Q(PHI) - Y ) ! @@ -276,7 +289,11 @@ DO JM = 1,KITR ! !* 2.5 compute the auxiliary field: ksi = Q ( q ) ! +#ifndef MNH_OPENACC ZKSI= QLAP(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,ZQ) +#else + CALL QLAP_DEVICE(ZKSI,HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,PTHETAV,ZQ) +#endif ! -1 !* 2.6 compute the step ALPHA ! @@ -284,8 +301,10 @@ DO JM = 1,KITR ! !* 2.7 update p and DELTA ! + !$acc kernels ZP = ZQ + ZALPHA * ZP ZDELTA = ZKSI + ZALPHA * ZDELTA + !$acc end kernels ! END DO ! end of the loop for the iterative solver !