From a50aac04b5b6c8e1536c6a3296b51cccd02c5358 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 16 Jan 2017 16:30:30 +0100 Subject: [PATCH] Philippe 16/01/2017: OpenACC: several corrections + improvements => compute correctly Hector testcase on NVIDIA (WENO 3) --- src/MNH/advection_metsv.f90 | 4 ++ src/MNH/advecuvw_rk.f90 | 14 ++--- src/MNH/tke_eps_sources.f90 | 46 ++++++-------- src/MNH/turb.f90 | 102 +++++++++++++++---------------- src/MNH/turb_ver.f90 | 12 +--- src/MNH/turb_ver_dyn_flux.f90 | 16 ++--- src/MNH/turb_ver_thermo_flux.f90 | 4 +- 7 files changed, 86 insertions(+), 112 deletions(-) diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 39b1b0a38..5d4090684 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -754,6 +754,10 @@ DO JSV=1,KSV END DO ! IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN +#ifdef _OPENACC + PRINT *,'OPENACC: ADVECTION_METSV::HCLOUD=''KHKO'' OR ''C2R2'' not yet implemented' + CALL ABORT +#endif ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) diff --git a/src/MNH/advecuvw_rk.f90 b/src/MNH/advecuvw_rk.f90 index 0c4c518d4..5e45e462d 100644 --- a/src/MNH/advecuvw_rk.f90 +++ b/src/MNH/advecuvw_rk.f90 @@ -467,15 +467,15 @@ ZRWS = 0. !$acc update device(ZRUS(:,:,:,JS),ZRVS(:,:,:,JS),ZRWS(:,:,:,JS)) ! IF ( JS /= ISPL ) THEN -! - ZUT = PU - ZVT = PV - ZWT = PW -! -!$acc kernels present(ZUT,ZVT,ZWT) present(ZBUT) & +!$acc kernels present(ZUT,ZVT,ZWT) present(ZBUT) present(PU,PV,PW) & !$acc & present(ZRUS,ZRVS,ZRWS) present(PRUS_OTHER,PRVS_OTHER,PRWS_OTHER) & !$acc & present(PMXM_RHODJ,PMYM_RHODJ,PMZM_RHODJ) - DO JI = 1, JS +! + ZUT = PU + ZVT = PV + ZWT = PW +! + DO JI = 1, JS ! ! Intermediate guesses inside the RK loop ! diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90 index 5d7faa508..5d49b954e 100644 --- a/src/MNH/tke_eps_sources.f90 +++ b/src/MNH/tke_eps_sources.f90 @@ -56,7 +56,8 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport prod. of TKE REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipati prod. of TKE !$acc declare present(PTKEM,PLM,PLEPS,PDP,PTRH, & !$acc & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & -!$acc & PTP,PRTKES,PRTKESM, PRTHLS,PCOEF_DISS) +!$acc & PTP,PRTKES,PRTKESM, PRTHLS,PCOEF_DISS, & +!$acc & PTR,PDISS) ! ! ! @@ -106,8 +107,6 @@ END MODULE MODI_TKE_EPS_SOURCES !! MXF,MXM.MYF,MYM,MZF,MZM: Shuman functions (mean operators) !! DZF : Shuman functions (difference operators) !! -!! SUBROUTINE TRIDIAG : to solve an implicit temporal scheme -!! !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -252,7 +251,8 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport prod. of TKE REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipati prod. of TKE !$acc declare present(PTKEM,PLM,PLEPS,PDP,PTRH, & !$acc & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & -!$acc & PTP,PRTKES,PRTKESM, PRTHLS,PCOEF_DISS) +!$acc & PTP,PRTKES,PRTKESM, PRTHLS,PCOEF_DISS, & +!$acc & PTR,PDISS) ! ! ! @@ -267,7 +267,6 @@ REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: & ! temporarily store some diagnostics stored in FM file ZFLX, & ! horizontal or vertical flux of the treated variable ZSOURCE, & ! source of evolution for the treated variable - ZTR, & ! turbulent transport of TKE ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) !LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG ! ! 3D mask .T. if TKE < XTKEMIN @@ -283,7 +282,7 @@ CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file ! TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange INTEGER :: IINFO_ll ! return code of parallel routine -!$acc declare create(ZA,ZRES,ZFLX,ZSOURCE,ZTR,ZKEFF) +!$acc declare create(ZA,ZRES,ZFLX,ZSOURCE,ZKEFF) ! #ifdef _OPENACC REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE @@ -317,9 +316,9 @@ ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ! Complete the sources of TKE with the horizontal turbulent explicit transport ! IF (HTURBDIM=='3DIM') THEN - ZTR=PTRH + PTR=PTRH ELSE - ZTR=0. + PTR=0. END IF ! ! @@ -336,7 +335,7 @@ PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+KKL)/PDZZ(:,:,IKB)) ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) ZSOURCE(:,:,:) = PRTKES(:,:,:) / PRHODJ(:,:,:) + PRTKESM(:,:,:) / PRHODJ(:,:,:) & - PTKEM(:,:,:) / PTSTEP & - + PDP(:,:,:) + PTP(:,:,:) + ZTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:) + + PDP(:,:,:) + PTP(:,:,:) + PTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:) !$acc end kernels ! !* 2.2 implicit vertical TKE transport @@ -416,13 +415,13 @@ IF ( LLES_CALL .OR. & ! Compute the whole turbulent TRansport of TKE: ! #ifndef _OPENACC - ZTR(:,:,:)= ZTR - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL,PRHODJ) * ZFLX / PDZZ ) /PRHODJ + PTR(:,:,:)= PTR - DZF(KKA,KKU,KKL, MZM(KKA,KKU,KKL,PRHODJ) * ZFLX / PDZZ ) /PRHODJ #else ZTMP1_DEVICE = ZTMP2_DEVICE * ZFLX / PDZZ !Re-use of ZTMP2_DEVICE !$acc end kernels CALL DZF_DEVICE(KKA,KKU,KKL,ZTMP1_DEVICE,ZTMP2_DEVICE) !$acc kernels - ZTR(:,:,:)= ZTR - ZTMP2_DEVICE / PRHODJ + PTR(:,:,:)= PTR - ZTMP2_DEVICE / PRHODJ !$acc end kernels #endif ! @@ -431,13 +430,13 @@ IF ( LLES_CALL .OR. & IF (LLES_CALL) THEN #ifndef _OPENACC CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,ZFLX), X_LES_SUBGRID_WTke ) - CALL LES_MEAN_SUBGRID( -ZTR, X_LES_SUBGRID_ddz_WTke ) + CALL LES_MEAN_SUBGRID( -PTR, X_LES_SUBGRID_ddz_WTke ) #else !$acc data copy(X_LES_SUBGRID_WTke,X_LES_SUBGRID_ddz_WTke) CALL MZF_DEVICE(KKA,KKU,KKL,ZFLX,ZTMP1_DEVICE) CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE, X_LES_SUBGRID_WTke ) !$acc kernels - ZTMP1_DEVICE = -ZTR + ZTMP1_DEVICE = -PTR !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE, X_LES_SUBGRID_ddz_WTke ) #endif @@ -498,6 +497,7 @@ END IF !$acc kernels PRTHLS(:,:,:) = PRTHLS(:,:,:) + XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:) +PDISS(:,:,:) = -XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) !$acc end kernels ! !---------------------------------------------------------------------------- @@ -527,42 +527,32 @@ IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN ! ! stores the whole turbulent transport ! -!$acc update self(ZTR) +!$acc update self(PTR) YRECFM ='TR' YCOMMENT='X_Y_Z_TR (M**2/S**3)' IGRID = 1 ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZTR,IGRID,ILENCH,YCOMMENT,IRESP) + CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PTR,IGRID,ILENCH,YCOMMENT,IRESP) ! ! stores the dissipation of TKE ! +!$acc update self(PDISS) YRECFM ='DISS' YCOMMENT='X_Y_Z_DISS (M**2/S**3)' IGRID = 1 ILENCH=LEN(YCOMMENT) -!$acc kernels - ZFLX(:,:,:) =-XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) -!$acc end kernels -!$acc update self(ZFLX) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLX,IGRID,ILENCH,YCOMMENT,IRESP) + CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PDISS,IGRID,ILENCH,YCOMMENT,IRESP) END IF ! ! Storage in the LES configuration of the Dynamic Production of TKE and ! the dissipation of TKE ! IF (LLES_CALL ) THEN -!$acc kernels - ZFLX(:,:,:) =-XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) -!$acc end kernels !$acc data copy(X_LES_SUBGRID_DISS_Tke) - CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_DISS_Tke ) + CALL LES_MEAN_SUBGRID( PDISS, X_LES_SUBGRID_DISS_Tke ) !$acc end data END IF ! -PTR=0. -PDISS=0. -PTR(:,:,:) = ZTR(:,:,:) -PDISS(:,:,:) = -XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) !---------------------------------------------------------------------------- ! ! diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index 3d4fd8de1..d14e2af30 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -119,11 +119,11 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZTHVMF REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDYP ! Dynamical production of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTHP ! Thermal production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT):: PTR ! Transport production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT):: PDISS ! Dissipation of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PLEM ! Mixing length +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDYP ! Dynamical production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHP ! Thermal production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipation of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLEM ! Mixing length ! !------------------------------------------------------------------------------- @@ -486,11 +486,11 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZTHVMF REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDYP ! Dynamical production of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTHP ! Thermal production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT):: PTR ! Transport production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT):: PDISS ! Dissipation of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PLEM ! Mixing length +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDYP ! Dynamical production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHP ! Thermal production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipation of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLEM ! Mixing length ! ! IN variables ! @@ -506,7 +506,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT):: PLEM ! Mixing length ! ! OUT variables ! -!$acc declare create(PSIGS,PWTH,PWRC,PWSV) +!$acc declare create(PSIGS,PWTH,PWRC,PWSV,PDYP,PTHP,PTR,PDISS,PLEM) ! ! !------------------------------------------------------------------------------- @@ -518,9 +518,8 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT):: PLEM ! Mixing length ! ZEXN, & ! EXN at t-1 ! ZT, & ! T at t-1 ! ZLOCPEXNM, & ! Lv/Cp/EXNREF at t-1 -! ZLM, & ! Turbulent mixing length ! ZLEPS, & ! Dissipative length -! ZDP,ZTP, ZTRH, & ! Dynamic and Thermal Production of TKE +! ZTRH, & ! Dynamic and Thermal Production of TKE ! ZATHETA,ZAMOIST, & ! coefficients for s = f (Thetal,Rnp) ! ZCOEF_DISS, & ! 1/(Cph*Exner) for dissipative heating ! ZFRAC_ICE, & ! ri fraction of rc+ri @@ -532,18 +531,17 @@ REAL,DIMENSION(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ::& ZEXN, & ! EXN at t-1 ZT, & ! T at t-1 ZLOCPEXNM, & ! Lv/Cp/EXNREF at t-1 - ZLM, & ! Turbulent mixing length ZLEPS, & ! Dissipative length - ZDP,ZTP, ZTRH, & ! Dynamic and Thermal Production of TKE + ZTRH, & ! Dynamic and Thermal Production of TKE ZATHETA,ZAMOIST, & ! coefficients for s = f (Thetal,Rnp) ZCOEF_DISS, & ! 1/(Cph*Exner) for dissipative heating ZFRAC_ICE, & ! ri fraction of rc+ri ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,& ! 3rd order moments ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,& ! opposite of verticale derivate of 3rd order moments ZTHLM, ZTR, ZDISS ! initial potential temp. -!$acc declare create(ZCP,ZEXN,ZT,ZLOCPEXNM,ZLM,ZLEPS,ZDP,ZTP,ZTRH, & -!$acc & ZAMOIST,ZATHETA,ZCOEF_DISS,ZFRAC_ICE, & -!$acc & ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR, & +!$acc declare create(ZCP,ZEXN,ZT,ZLOCPEXNM,ZLEPS,ZTRH, & +!$acc & ZAMOIST,ZATHETA,ZCOEF_DISS,ZFRAC_ICE, & +!$acc & ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR, & !$acc & ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,ZTHLM ) ! REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: & @@ -602,10 +600,7 @@ REAL, DIMENSION(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) :: ZTMP1_DEVICE,ZTMP2 ! ZEXN(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & ! ZT(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & ! ZLOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & -! ZLM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & ! ZLEPS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & -! ZDP(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & -! ZTP(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & ! ZTRH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & ! ZATHETA(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & ! ZAMOIST(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & @@ -808,7 +803,7 @@ SELECT CASE (HTURBLEN) PRINT *,'OPENACC: TURB::HTURBLEN=BL89 not yet implemented' CALL ABORT #endif - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZLM) + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,PLEM) ! !* 3.2 Delta mixing length ! ------------------- @@ -818,13 +813,13 @@ SELECT CASE (HTURBLEN) PRINT *,'OPENACC: TURB::HTURBLEN=DELT not yet implemented' CALL ABORT #endif - CALL DELT(ZLM) + CALL DELT(PLEM) ! !* 3.3 Deardorff mixing length ! ----------------------- ! CASE ('DEAR') - CALL DEAR(ZLM) + CALL DEAR(PLEM) ! !* 3.4 Blackadar mixing length ! ----------------------- @@ -835,18 +830,18 @@ SELECT CASE (HTURBLEN) CALL ABORT #endif ZL0 = 100. - ZLM(:,:,:) = ZL0 + PLEM(:,:,:) = ZL0 ZALPHA=0.5**(-1.5) ! DO JK=IKTB,IKTE - ZLM(:,:,JK) = ( 0.5*(PZZ(:,:,JK)+PZZ(:,:,JK+KKL)) - & + PLEM(:,:,JK) = ( 0.5*(PZZ(:,:,JK)+PZZ(:,:,JK+KKL)) - & & PZZ(:,:,KKA+JPVEXT_TURB*KKL) ) * PDIRCOSZW(:,:) - ZLM(:,:,JK) = ZALPHA * ZLM(:,:,JK) * ZL0 / ( ZL0 + ZALPHA*ZLM(:,:,JK) ) + PLEM(:,:,JK) = ZALPHA * PLEM(:,:,JK) * ZL0 / ( ZL0 + ZALPHA*PLEM(:,:,JK) ) END DO ! - ZLM(:,:,IKTB-1) = ZLM(:,:,IKTB) - ZLM(:,:,IKTE+1) = ZLM(:,:,IKTE) + PLEM(:,:,IKTB-1) = PLEM(:,:,IKTB) + PLEM(:,:,IKTE+1) = PLEM(:,:,IKTE) ! ! ! @@ -869,7 +864,7 @@ END IF ! ------------------ ! !$acc kernels -ZLEPS(:,:,:)=ZLM(:,:,:) +ZLEPS(:,:,:)=PLEM(:,:,:) ! !* 3.7 Correction in the Surface Boundary Layer (Redelsperger 2001) ! ---------------------------------------- @@ -877,7 +872,7 @@ ZLEPS(:,:,:)=ZLM(:,:,:) ZLMO=XUNDEF !$acc end kernels IF (ORMC01) THEN -!$acc update self(ZLM,ZLEPS) +!$acc update self(PLEM,ZLEPS) #ifdef _OPENACC PRINT *,'OPENACC: TURB::ORMC01 not yet implemented' CALL ABORT @@ -890,15 +885,15 @@ IF (ORMC01) THEN ZSFRV=0. ZLMO=LMO(ZUSTAR,ZTHLM(:,:,IKB),ZRVM,PSFTH,ZSFRV) END IF - CALL RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,ZLMO,ZLM,ZLEPS) -!$acc update device(ZLM,ZLEPS) + CALL RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,ZLMO,PLEM,ZLEPS) +!$acc update device(PLEM,ZLEPS) END IF ! !* 3.8 Mixing length in external points (used if HTURBDIM="3DIM") ! ---------------------------------------------------------- ! IF (HTURBDIM=="3DIM") THEN - CALL UPDATE_LM(HLBCX,HLBCY,ZLM,ZLEPS) + CALL UPDATE_LM(HLBCX,HLBCY,PLEM,ZLEPS) END IF !---------------------------------------------------------------------------- ! @@ -1025,12 +1020,12 @@ CALL TURB_VER(KKA,KKU,KKL,KRR, KRRL, KRRI, & PSFTH,PSFRV,PSFSV,PSFTH,PSFRV,PSFSV, & ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU33M, & PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT, & - PTKET,ZLM,ZLEPS, & + PTKET,PLEM,ZLEPS, & ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE, & ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,PBL_DEPTH, & PSBL_DEPTH,ZLMO, & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & - ZDP,ZTP,PSIGS,PWTH,PWRC,PWSV ) + PDYP,PTHP,PSIGS,PWTH,PWRC,PWSV ) !$acc update self(PWTH,PWRC,PWSV) ! #ifdef _OPENACC @@ -1094,9 +1089,9 @@ IF (HTURBDIM=='3DIM') THEN PSFTH,PSFRV,PSFSV, & ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M, & PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT, & - PTKET,ZLM,ZLEPS, & + PTKET,PLEM,ZLEPS, & ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE, & - ZDP,ZTP,PSIGS, & + PDYP,PTHP,PSIGS, & ZTRH, & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) END IF @@ -1149,25 +1144,25 @@ IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9,'HTURB_BU_RRI') ! 6.1 Contribution of mass-flux in the TKE buoyancy production if ! cloud computation is not statistical #ifndef _OPENACC - ZTP = ZTP + XG / PTHVREF * MZF(KKA,KKU,KKL, PFLXZTHVMF ) + PTHP = PTHP + XG / PTHVREF * MZF(KKA,KKU,KKL, PFLXZTHVMF ) #else CALL MZF_DEVICE(KKA,KKU,KKL,PFLXZTHVMF,ZTMP1_DEVICE) !$acc kernels - ZTP(:,:,:) = ZTP(:,:,:) + XG / PTHVREF(:,:,:) * ZTMP1_DEVICE(:,:,:) + PTHP(:,:,:) = PTHP(:,:,:) + XG / PTHVREF(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels #endif ! 6.2 TKE evolution equation !$acc update device(PRTKES) -CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKET,ZLM,ZLEPS,ZDP,ZTRH, & +CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKET,PLEM,ZLEPS,PDYP,ZTRH, & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & PTSTEP,PIMPL,ZEXPL, & HTURBLEN,HTURBDIM, & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG, & - ZTP,PRTKES,PRTKEMS,PRTHLS,ZCOEF_DISS,PTR,PDISS ) + PTHP,PRTKES,PRTKEMS,PRTHLS,ZCOEF_DISS,PTR,PDISS ) ! -PDYP = ZDP -PTHP = ZTP +!$acc update self(PTR,PDISS) +!$acc update self(PDYP,PTHP) ! !$acc update self(PRTKES) IF (LBUDGET_TH) THEN @@ -1187,19 +1182,18 @@ END IF !* 7. STORES SOME INFORMATIONS RELATED TO THE TURBULENCE SCHEME ! --------------------------------------------------------- ! -PLEM = ZLM +!$acc update self(PLEM) ! IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN YCOMMENT=' ' ! ! stores the mixing length ! -!$acc update self(ZLM) YRECFM ='LM' YCOMMENT='X_Y_Z_LM (M)' IGRID = 1 ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZLM,IGRID,ILENCH,YCOMMENT,IRESP) + CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PLEM,IGRID,ILENCH,YCOMMENT,IRESP) ! IF (KRR /= 0) THEN ! @@ -1389,15 +1383,15 @@ IF (LLES_CALL) THEN ! ------------------------------------------------------- ! !$acc data copy(X_LES_SUBGRID_LMix,X_LES_SUBGRID_LDiss,X_LES_SUBGRID_WP) - CALL LES_MEAN_SUBGRID(ZLM,X_LES_SUBGRID_LMix) + CALL LES_MEAN_SUBGRID(PLEM,X_LES_SUBGRID_LMix) CALL LES_MEAN_SUBGRID(ZLEPS,X_LES_SUBGRID_LDiss) ! !* presso-correlations for subgrid Tke are equal to zero. ! !$acc kernels - ZLM = 0. + ZLEPS = 0. !ZLEPS is used as a work array (not used anymore) !$acc end kernels - CALL LES_MEAN_SUBGRID(ZLM,X_LES_SUBGRID_WP) + CALL LES_MEAN_SUBGRID(ZLEPS,X_LES_SUBGRID_WP) !$acc end data ! CALL SECOND_MNH(ZTIME2) @@ -1908,7 +1902,7 @@ WHERE ( PCEI(:,:,:) < PCEI_MAX .AND. & ! ------------------------------------------ ! IF (HTURBLEN_CL == HTURBLEN) THEN - ZLM_CLOUD(:,:,:) = ZLM(:,:,:) + ZLM_CLOUD(:,:,:) = PLEM(:,:,:) ELSE SELECT CASE (HTURBLEN_CL) ! @@ -1939,16 +1933,16 @@ IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN YCOMMENT='X_Y_Z_LM CLEAR SKY (M)' IGRID = 1 ILENCH = LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZLM,IGRID,ILENCH,YCOMMENT,IRESP) + CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PLEM,IGRID,ILENCH,YCOMMENT,IRESP) ENDIF ! ! Amplification of the mixing length when the criteria are verified ! -WHERE (ZCOEF_AMPL(:,:,:) /= 1.) ZLM(:,:,:) = ZCOEF_AMPL(:,:,:)*ZLM_CLOUD(:,:,:) +WHERE (ZCOEF_AMPL(:,:,:) /= 1.) PLEM(:,:,:) = ZCOEF_AMPL(:,:,:)*ZLM_CLOUD(:,:,:) ! ! Cloud mixing length in the clouds at the points which do not verified the CEI ! -WHERE (PCEI(:,:,:) == -1.) ZLM(:,:,:) = ZLM_CLOUD(:,:,:) +WHERE (PCEI(:,:,:) == -1.) PLEM(:,:,:) = ZLM_CLOUD(:,:,:) ! ! !* 5. IMPRESSION diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90 index 339fc13ad..33f90e3f2 100644 --- a/src/MNH/turb_ver.f90 +++ b/src/MNH/turb_ver.f90 @@ -631,11 +631,6 @@ END IF ! !* 4. TURBULENT CORRELATIONS : <w Rc>, <THl THl>, <THl Rnp>, <Rnp Rnp> ! ---------------------------------------------------------------- -! -! -!$acc kernels -PTP (:,:,:) = 0. -!$acc end kernels ! CALL TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & OCLOSE_OUT,OTURB_FLX,HTURBDIM,HTOM, & @@ -682,11 +677,6 @@ PTP (:,:,:) = 0. !* 7. DIAGNOSTIC COMPUTATION OF THE 1D <W W> VARIANCE ! ----------------------------------------------- ! -! -!$acc kernels -PDP (:,:,:) = 0. -!$acc end kernels -! CALL TURB_VER_DYN_FLUX(KKA,KKU,KKL, & OCLOSE_OUT,OTURB_FLX,KRR, & HTURBDIM,PIMPL,PEXPL,PTSTEP, & @@ -698,7 +688,7 @@ CALL TURB_VER_DYN_FLUX(KKA,KKU,KKL, & PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & PTKEM,PLM,ZWU,ZWV, & PRUS,PRVS,PRWS, & - PDP,PTP ) + PDP ) ! !---------------------------------------------------------------------------- ! diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index 56ff5c7b2..0304e7e56 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -25,7 +25,7 @@ INTERFACE PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & PTKEM,PLM,PWU,PWV, & PRUS,PRVS,PRWS, & - PDP,PTP ) + PDP ) ! ! INTEGER, INTENT(IN) :: KKA !near ground array index @@ -81,8 +81,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWV ! momentum flux v'w' REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! cumulated sources for the prognostic variables ! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP,PTP ! Dynamic and thermal - ! TKE production terms +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production term ! !$acc declare present(PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & !$acc & PCOSSLOPE,PSINSLOPE, & @@ -91,7 +90,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP,PTP ! Dynamic and thermal !$acc & PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & !$acc & PTKEM,PLM,PWU,PWV, & !$acc & PRUS,PRVS,PRWS, & -!$acc & PDP,PTP ) +!$acc & PDP ) ! END SUBROUTINE TURB_VER_DYN_FLUX ! @@ -113,7 +112,7 @@ END MODULE MODI_TURB_VER_DYN_FLUX PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & PTKEM,PLM,PWU,PWV, & PRUS,PRVS,PRWS, & - PDP,PTP ) + PDP ) ! ############################################################### ! ! @@ -383,8 +382,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWV ! momentum flux v'w' REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! cumulated sources for the prognostic variables ! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP,PTP ! Dynamic and thermal - ! TKE production terms +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production term ! !$acc declare present(PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & !$acc & PCOSSLOPE,PSINSLOPE, & @@ -393,7 +391,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP,PTP ! Dynamic and thermal !$acc & PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & !$acc & PTKEM,PLM,PWU,PWV, & !$acc & PRUS,PRVS,PRWS, & -!$acc & PDP,PTP ) +!$acc & PDP ) ! ! !* 0.2 declaration of local variables @@ -1291,8 +1289,6 @@ IF ( OTURB_FLX .AND. OCLOSE_OUT .AND. HTURBDIM == '1DIM') THEN -XCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*ZTMP1_DEVICE !$acc end kernels #endif - ! to be tested & - ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) ! stores the W variance !$acc update self(ZFLXZ) YRECFM ='W_VVAR' diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index 19f671a97..9c66901d6 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -111,7 +111,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! cumulated source for rt REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRP ! guess of r at t+ deltat ! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTP ! Dynamic and thermal +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTP ! Dynamic and thermal ! TKE production terms ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux @@ -458,7 +458,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! cumulated source for rt REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRP ! guess of r at t+ deltat ! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTP ! Dynamic and thermal +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTP ! Dynamic and thermal ! TKE production terms ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux -- GitLab