diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 1ee696f3ff82470b1da5b7c0151b013f9e2eb9c5..6ba8a05bb947b6aea209cf90970f805427beb2b4 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -325,6 +325,7 @@ TYPE(TFIELDDATA) :: TZFIELD ! INTEGER :: JIU,JJU,JKU INTEGER :: JK +REAL :: ZIBM_EPSI !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) !------------------------------------------------------------------------------- !$acc data present( PUT, PVT, PWT, PTHT, PTKET, PRHODJ, PPABST, PRT, PSVT, PTHVREF, & !$acc & PDXX, PDYY, PDZZ, PDZX, PDZY, PRTHS, PRTKES, PRRS, PRSVS, PRTHS_CLD, PRRS_CLD, PRSVS_CLD, PRTKES_ADV ) @@ -469,6 +470,8 @@ CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IKB=1+JPVEXT IKE=SIZE(PSVT,3) - JPVEXT +ZIBM_EPSI = XIBM_EPSI + #ifdef MNH_OPENACC CALL INIT_ON_HOST_AND_DEVICE(PRTKES_ADV,PVALUE=-1e99,HNAME='ADVECTION_METSV::PRTKES_ADV') CALL INIT_ON_HOST_AND_DEVICE(ZRUCPPM,PVALUE=-1e90,HNAME='ADVECTION_METSV::ZRUCPPM') @@ -566,9 +569,9 @@ IF (.NOT. L1D) THEN ZCFLW(IIB:IIE,IJB:IJE,:) = ZCFLW(IIB:IIE,IJB:IJE,:)*(1.-Br_exp(-Br_pow(XIBM_LS(IIB:IIE,IJB:IJE,:,4)/& Br_pow(XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:),1./3.),2.))) #endif - WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,2).GT.(-XIBM_EPSI)) ZCFLU(IIB:IIE,IJB:IJE,:)=0. - WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,3).GT.(-XIBM_EPSI)) ZCFLV(IIB:IIE,IJB:IJE,:)=0. - WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,4).GT.(-XIBM_EPSI)) ZCFLW(IIB:IIE,IJB:IJE,:)=0. + WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,2).GT.(-ZIBM_EPSI)) ZCFLU(IIB:IIE,IJB:IJE,:)=0. + WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,3).GT.(-ZIBM_EPSI)) ZCFLV(IIB:IIE,IJB:IJE,:)=0. + WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,4).GT.(-ZIBM_EPSI)) ZCFLW(IIB:IIE,IJB:IJE,:)=0. !$acc end kernels ENDIF #ifndef MNH_BITREP diff --git a/src/MNH/advecuvw_rk.f90 b/src/MNH/advecuvw_rk.f90 index 49c53ed6b5dc65d5ae9f7b74990821e15a0e9ed4..b8d00b9fbf3dfcbc46f131d5a18a86b0d7eb26ce 100644 --- a/src/MNH/advecuvw_rk.f90 +++ b/src/MNH/advecuvw_rk.f90 @@ -228,6 +228,8 @@ TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange TYPE(LIST_ll), POINTER :: TZFIELDS0_ll ! list of fields to exchange TYPE(LIST_ll), POINTER :: TZFIELDS4_ll ! list of fields to exchange ! +LOGICAL :: GIBM !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) +REAL :: ZIBM_EPSI !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) REAL :: ZTIME1,ZTIME2 !------------------------------------------------------------------------------- !$acc data present( PU, PV, PW, PUT, PVT, PWT, PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ, & @@ -254,6 +256,9 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRWS_OTHER,"ADVECUVW_RK beg:PRWS_OTHER") END IF +GIBM = LIBM +ZIBM_EPSI = XIBM_EPSI + #ifdef MNH_OPENACC if ( LIBM ) call Print_msg( NVERB_FATAL, 'GEN', 'ADVECUVW_RK', 'OpenACC: LIBM=T not yet implemented' ) #endif @@ -402,7 +407,7 @@ ALLOCATE(ZRVS(SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3),ISPL)) ALLOCATE(ZRWS(SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3),ISPL)) #endif -IF ( LIBM ) THEN +IF ( GIBM ) THEN #ifndef MNH_OPENACC ALLOCATE( ZIBM(SIZE(PUT,1), SIZE(PUT,2), SIZE(PWT,3), 3) ) #endif @@ -412,12 +417,10 @@ IF ( LIBM ) THEN END IF ! !$acc kernels present(PRUS_ADV,PRVS_ADV,PRWS_ADV) present(ZUT,ZVT,ZWT) present(PU,PV,PW) -IF (LIBM .AND. CIBM_ADV=='FREEZE') THEN - - WHERE (XIBM_LS(:,:,:,2).GT.-XIBM_EPSI) ZIBM(:,:,:,1) = 0. - WHERE (XIBM_LS(:,:,:,3).GT.-XIBM_EPSI) ZIBM(:,:,:,2) = 0. - WHERE (XIBM_LS(:,:,:,4).GT.-XIBM_EPSI) ZIBM(:,:,:,3) = 0. - +IF (GIBM .AND. CIBM_ADV=='FREEZE') THEN + WHERE (XIBM_LS(:,:,:,2).GT.-ZIBM_EPSI) ZIBM(:,:,:,1) = 0. + WHERE (XIBM_LS(:,:,:,3).GT.-ZIBM_EPSI) ZIBM(:,:,:,2) = 0. + WHERE (XIBM_LS(:,:,:,4).GT.-ZIBM_EPSI) ZIBM(:,:,:,3) = 0. ENDIF ! PRUS_ADV = 0. @@ -490,7 +493,7 @@ RKLOOP: DO JS = 1, ISPL ! -------------------------- ! !$acc kernels - IF (LIBM .AND. CIBM_ADV=='LOWORD') THEN + IF (GIBM .AND. CIBM_ADV=='LOWORD') THEN ZIBM(:,:,:,1)=ZRUS(:,:,:,JS) ZIBM(:,:,:,2)=ZRVS(:,:,:,JS) ZIBM(:,:,:,3)=ZRWS(:,:,:,JS) @@ -513,7 +516,7 @@ RKLOOP: DO JS = 1, ISPL TZHALO2MT_ll ) ENDIF ! - IF (LIBM .AND. CIBM_ADV=='LOWORD') THEN + IF (GIBM .AND. CIBM_ADV=='LOWORD') THEN IF (HUVW_ADV_SCHEME=='WENO_K') THEN CALL ADVECUVW_WENO_K (HLBCX, HLBCY, 3, ZUT, ZVT, ZWT, & PRUCT, PRVCT, PRWCT, & @@ -528,9 +531,9 @@ RKLOOP: DO JS = 1, ISPL CALL ADVECUVW_2ND (ZUT, ZVT, ZWT, PRUCT, PRVCT, PRWCT, & ZIBM(:,:,:,1), ZIBM(:,:,:,2), ZIBM(:,:,:,3)) ENDIF - WHERE(XIBM_LS(:,:,:,2).GT.-XIBM_EPSI) ZRUS(:,:,:,JS)=ZIBM(:,:,:,1) - WHERE(XIBM_LS(:,:,:,3).GT.-XIBM_EPSI) ZRVS(:,:,:,JS)=ZIBM(:,:,:,2) - WHERE(XIBM_LS(:,:,:,4).GT.-XIBM_EPSI) ZRWS(:,:,:,JS)=ZIBM(:,:,:,3) + WHERE(XIBM_LS(:,:,:,2).GT.-ZIBM_EPSI) ZRUS(:,:,:,JS)=ZIBM(:,:,:,1) + WHERE(XIBM_LS(:,:,:,3).GT.-ZIBM_EPSI) ZRVS(:,:,:,JS)=ZIBM(:,:,:,2) + WHERE(XIBM_LS(:,:,:,4).GT.-ZIBM_EPSI) ZRWS(:,:,:,JS)=ZIBM(:,:,:,3) ZIBM(:,:,:,:)=1. ENDIF ! @@ -549,13 +552,13 @@ RKLOOP: DO JS = 1, ISPL ! acc update device(ZRUS(:,:,:,JS),ZRVS(:,:,:,JS),ZRWS(:,:,:,JS)) #endif ! - IF (LIBM .AND. CIBM_ADV=='FREEZE') THEN - WHERE(XIBM_LS(:,:,:,2).GT.-XIBM_EPSI) ZRUS(:,:,:,JS)=ZUT(:,:,:)*PMXM_RHODJ(:,:,:)/PTSTEP - WHERE(XIBM_LS(:,:,:,3).GT.-XIBM_EPSI) ZRVS(:,:,:,JS)=ZVT(:,:,:)*PMYM_RHODJ(:,:,:)/PTSTEP - WHERE(XIBM_LS(:,:,:,4).GT.-XIBM_EPSI) ZRWS(:,:,:,JS)=ZWT(:,:,:)*PMZM_RHODJ(:,:,:)/PTSTEP + IF (GIBM .AND. CIBM_ADV=='FREEZE') THEN + WHERE(XIBM_LS(:,:,:,2).GT.-ZIBM_EPSI) ZRUS(:,:,:,JS)=ZUT(:,:,:)*PMXM_RHODJ(:,:,:)/PTSTEP + WHERE(XIBM_LS(:,:,:,3).GT.-ZIBM_EPSI) ZRVS(:,:,:,JS)=ZVT(:,:,:)*PMYM_RHODJ(:,:,:)/PTSTEP + WHERE(XIBM_LS(:,:,:,4).GT.-ZIBM_EPSI) ZRWS(:,:,:,JS)=ZWT(:,:,:)*PMZM_RHODJ(:,:,:)/PTSTEP ENDIF - IF (LIBM .AND. CIBM_ADV=='FORCIN') THEN + IF (GIBM .AND. CIBM_ADV=='FORCIN') THEN CALL SECOND_MNH(ZTIME1) CALL IBM_FORCING_ADV(ZRUS(:,:,:,JS),ZRVS(:,:,:,JS),ZRWS(:,:,:,JS)) CALL SECOND_MNH(ZTIME2) @@ -565,7 +568,7 @@ RKLOOP: DO JS = 1, ISPL ! Guesses at the end of the RK loop ! !$acc kernels present(PRUS_ADV,PRVS_ADV,PRWS_ADV,ZBUTS) present(ZRUS,ZRVS,ZRWS,ZIBM) - IF ( .NOT. LIBM ) THEN + IF ( .NOT. GIBM ) THEN PRUS_ADV(:,:,:) = PRUS_ADV(:,:,:) + ZBUTS(JS) * ZRUS(:,:,:,JS) PRVS_ADV(:,:,:) = PRVS_ADV(:,:,:) + ZBUTS(JS) * ZRVS(:,:,:,JS) PRWS_ADV(:,:,:) = PRWS_ADV(:,:,:) + ZBUTS(JS) * ZRWS(:,:,:,JS) @@ -592,7 +595,7 @@ RKLOOP: DO JS = 1, ISPL ! ! Intermediate guesses inside the RK loop ! - IF ( .NOT. LIBM ) THEN + IF ( .NOT. GIBM ) THEN !$acc kernels ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:) diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index ce9dcaf0ce9f90a64fcbb1386f23308e9862c62e..d47b8f465c35a42f183dcc347f55cbd71879a75d 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -483,6 +483,7 @@ INTEGER :: IZTMP1_DEVICE,IZTMP2_DEVICE,IZTMP3_DEVICE ! INTEGER :: JIU,JJU,JKU INTEGER :: JLU_ZRM, JLU_TURB, JJU_ORMC01, JKU_CLOUD, JKU_TURB +LOGICAL :: GOCEAN !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) ! !------------------------------------------------------------------------------------------ ! @@ -716,6 +717,8 @@ IKE=KKU-JPVEXT_TURB*KKL ZEXPL = 1.- PIMPL ZRVORD= XRV / XRD ! +GOCEAN = LOCEAN +! ! !$acc update device(PTHLT,PRT) !$acc kernels @@ -750,7 +753,7 @@ END DO ! !* 2.2 Exner function at t ! -IF (LOCEAN) THEN +IF (GOCEAN) THEN ZEXN(:,:,:) = 1. ELSE !PW: "BUG" PGI : results different on CPU and GPU due to the power function @@ -1439,7 +1442,6 @@ IF ( KRRL >= 1 ) THEN END IF END IF - ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets call Sources_neg_correct( hcloud, 'NETUR', krr, ptstep, ppabst, pthlt, prt, prthls, prrs, prsvs ) !$acc update self( PTHLT ) !PTHLT not modified in Sources_neg_correct @@ -2114,6 +2116,7 @@ LOGICAL, INTENT(IN) :: ODZ ! integer :: ji, jj, jk +LOGICAL :: GOCEAN !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) REAL :: ZALPHA ! proportionnality constant between Dz/2 and ! ! BL89 mixing length near the surface REAL :: ZD ! distance to the surface @@ -2138,6 +2141,8 @@ allocate( ztmp1_device( size( pdxx, 1 ), size( pdxx, 2 ), size( pdxx, 3 ) ) ) allocate( ztmp2_device( size( pdxx, 1 ), size( pdxx, 2 ), size( pdxx, 3 ) ) ) #endif +GOCEAN = LOCEAN + !$acc data create( ztmp1_device, ztmp2_device ) IF (ODZ) THEN @@ -2227,7 +2232,7 @@ IF (.NOT. ORMC01) THEN ! DO JJ=1,SIZE(PLM,2) DO JI=1,SIZE(PLM,1) - IF (LOCEAN) THEN + IF (GOCEAN) THEN DO JK=KKTE,KKTB,-1 ZD=ZALPHA*(PZZ(JI,JJ,KKTE+1)-PZZ(JI,JJ,JK)) IF ( PLM(JI,JJ,JK)>ZD) THEN @@ -2359,6 +2364,7 @@ REAL, DIMENSION(:,:,:), POINTER , CONTIGUOUS :: ZTMP1_DEVICE,ZTMP2_DEVICE INTEGER :: IZTMP1_DEVICE,IZTMP2_DEVICE #endif INTEGER :: JIU,JJU,JKU +LOGICAL :: GOCEAN !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) !---------------------------------------------------------------------------- !$acc data present( PDXX, PDYY, PDZZ, PZZ, PDIRCOSZW, PTHLT, PTHVREF, PTKET, PSRCT, PRT, PLOCPEXNM, PATHETA, PAMOIST, PLM ) @@ -2384,6 +2390,8 @@ JIU = size(pthlt, 1 ) JJU = size(pthlt, 2 ) JKU = size(pthlt, 3 ) +GOCEAN = LOCEAN + !------------------------------------------------------------------------------- #ifndef MNH_OPENACC allocate( ZWORK2D(JIU,JJU) ) @@ -2492,7 +2500,7 @@ IF (KRR>0) THEN (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)+ & (PRT(JI,JJ,JK ,1)-PRT(JI,JJ,JK-KKL,1))/PDZZ(JI,JJ,JK )) - IF (LOCEAN) THEN + IF (GOCEAN) THEN ZVAR=XG*(XALPHAOC*ZDTHLDZ(JI,JJ,JK)-XBETAOC*ZDRTDZ(JI,JJ,JK)) ELSE ZVAR=XG/PTHVREF(JI,JJ,JK)* & @@ -2513,7 +2521,7 @@ ELSE! For dry atmos or unsalted ocean runs DO JI=1,SIZE(PLM,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 (LOCEAN) THEN + IF (GOCEAN) THEN ZVAR= XG*XALPHAOC*ZDTHLDZ(JI,JJ,JK) ELSE ZVAR= XG/PTHVREF(JI,JJ,JK)*ZETHETA(JI,JJ,JK)*ZDTHLDZ(JI,JJ,JK) @@ -2536,7 +2544,7 @@ ELSE ZDRTDZ(:,:,KKB)=0 ENDIF ! -IF (LOCEAN) THEN +IF (GOCEAN) THEN #if 0 !PW: bug: crash with nvhpc 21.11 (OK with 21.9) ZWORK2D(:,:)=XG*(XALPHAOC*ZDTHLDZ(:,:,KKB)-XBETAOC*ZDRTDZ(:,:,KKB)) @@ -2577,7 +2585,7 @@ IF (.NOT. ORMC01) THEN ! DO JJ=1,SIZE(PLM,2) DO JI=1,SIZE(PLM,1) - IF (LOCEAN) THEN + IF (GOCEAN) THEN DO JK=KKTE,KKTB,-1 ZD=ZALPHA*(PZZ(JI,JJ,KKTE+1)-PZZ(JI,JJ,JK)) IF ( PLM(JI,JJ,JK)>ZD) THEN diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90 index ebe93d1f5c76c08c6885269248d492307fa24c66..6ed71c52957c9770148201db61508d5dad21e566 100644 --- a/src/MNH/turb_ver.f90 +++ b/src/MNH/turb_ver.f90 @@ -483,6 +483,7 @@ TYPE(TFIELDDATA) :: TZFIELD ! INTEGER :: JIU,JJU,JKU INTEGER :: JI,JJ,JK +LOGICAL :: GOCEAN !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) ! !---------------------------------------------------------------------------- @@ -559,6 +560,8 @@ JIU = size( pthlm, 1 ) JJU = size( pthlm, 2 ) JKU = size( pthlm, 3 ) +GOCEAN = LOCEAN + #ifndef MNH_OPENACC allocate( zbeta (JIU,JJU,JKU) ) allocate( zsqrt_tke(JIU,JJU,JKU) ) @@ -646,7 +649,7 @@ CALL PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_FLX, & ! Buoyancy coefficient ! !$acc kernels -IF (LOCEAN) THEN +IF (GOCEAN) THEN ZBETA(:,:,:) = XG*XALPHAOC ELSE ZBETA(:,:,:) = XG/PTHVREF(:,:,:) diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index 55355f15df882c11c4817d84b090949a8843de2d..15df973c68ecc020ae6b02d7800bd14df9aa4324 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -425,6 +425,7 @@ TYPE(TFIELDDATA) :: TZFIELD ! INTEGER :: JIU,JJU,JKU INTEGER :: JI,JJ,JK +LOGICAL :: GOCEAN !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) !---------------------------------------------------------------------------- !$acc data present( PDXX, PDYY, PDZZ, PDZX, PDZY, PDIRCOSZW, & @@ -639,7 +640,7 @@ CALL MXM_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZCOEFS(:,:,1:1)) ! ! ! ZSOURCE= FLUX /DZ -IF (LOCEAN) THEN ! OCEAN MODEL ONLY +IF (GOCEAN) THEN ! OCEAN MODEL ONLY #ifdef MNH_OPENACC call Print_msg( NVERB_FATAL, 'GEN', 'TURB_VER_DYN_FLUX', 'OpenACC: LOCEAN=T not yet implemented' ) #endif @@ -777,7 +778,7 @@ ZFLXZ(:,:,IKB:IKB) = ZTMP1_DEVICE(:,:,IKB:IKB) * & ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) !$acc end kernels -IF (LOCEAN) THEN !ocean model at phys sfc (ocean domain top) +IF (GOCEAN) THEN !ocean model at phys sfc (ocean domain top) ZFLXZ(:,:,IKE:IKE) = MXM(PDZZ(:,:,IKE:IKE)) * & ZSOURCE(:,:,IKE:IKE) & / 0.5 / ( 1. + MXM(PRHODJ(:,:,KKU:KKU)) / MXM(PRHODJ(:,:,IKE:IKE)) ) @@ -846,7 +847,7 @@ PDP(:,:,IKB:IKB) = - ZTMP3_DEVICE(:,:,IKB:IKB) !$acc end kernels #endif ! -IF (LOCEAN) THEN +IF (GOCEAN) THEN ! evaluate the dynamic production at w(IKE-KKL) in PDP(IKE) PDP(:,:,IKE:IKE) = - MXF ( & ZFLXZ(:,:,IKE-KKL:IKE-KKL) * (PUM(:,:,IKE:IKE)-PUM(:,:,IKE-KKL:IKE-KKL)) & @@ -897,7 +898,7 @@ IF(HTURBDIM=='3DIM') THEN ! used to compute the W source at the ground !$acc kernels ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation - IF (LOCEAN) THEN + IF (GOCEAN) THEN ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation END IF !$acc end kernels @@ -1031,7 +1032,7 @@ IF(HTURBDIM=='3DIM') THEN !$acc end kernels #endif ! -IF (LOCEAN) THEN +IF (GOCEAN) THEN ! evaluate the dynamic production at w(IKE-KKL) in PDP(IKE) ZA(:,:,IKE:IKE) = - MXF ( & ZFLXZ(:,:,IKE-KKL:IKE-KKL) * & @@ -1192,7 +1193,7 @@ END DO CALL MYM_DEVICE(ZTMP1_DEVICE(:,:,1:1),ZCOEFS(:,:,1:1) ) #endif ! -IF (LOCEAN) THEN ! Ocean case +IF (GOCEAN) THEN ! Ocean case IF (LCOUPLES) THEN ZSOURCE(:,:,IKE:IKE) = XSSVFL_C(:,:,1:1)/PDZZ(:,:,IKE:IKE) & *0.5 * ( 1. + MYM(PRHODJ(:,:,KKU:KKU)) / MYM(PRHODJ(:,:,IKE:IKE)) ) @@ -1322,7 +1323,7 @@ ZFLXZ(:,:,IKB) = ZTMP1_DEVICE(:,:,1) * & ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) !$acc end kernels ! -IF (LOCEAN) THEN +IF (GOCEAN) THEN ZFLXZ(:,:,IKE:IKE) = MYM(PDZZ(:,:,IKE:IKE)) * & ZSOURCE(:,:,IKE:IKE) & / 0.5 / ( 1. + MYM(PRHODJ(:,:,KKU:KKU)) / MYM(PRHODJ(:,:,IKE:IKE)) ) @@ -1396,7 +1397,7 @@ ZA(:,:,IKB) = - ZTMP1_DEVICE(:,:,1) !$acc end kernels #endif ! -IF (LOCEAN) THEN +IF (GOCEAN) THEN ! evaluate the dynamic production at w(IKE-KKL) in PDP(IKE) ZA(:,:,IKE:IKE) = - MYF ( & ZFLXZ(:,:,IKE-KKL:IKE-KKL) * (PVM(:,:,IKE:IKE)-PVM(:,:,IKE-KKL:IKE-KKL)) & @@ -1444,7 +1445,7 @@ IF(HTURBDIM=='3DIM') THEN ! Compute the source for the W wind component !$acc kernels ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation - IF (LOCEAN) THEN + IF (GOCEAN) THEN ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation END IF !$acc end kernels @@ -1581,7 +1582,7 @@ IF(HTURBDIM=='3DIM') THEN !$acc end kernels #endif ! - IF (LOCEAN) THEN + IF (GOCEAN) THEN ZA(:,:,IKE:IKE) = - MYF ( & ZFLXZ(:,:,IKE-KKL:IKE-KKL) * & ( DYM( PWM(:,:,IKE-KKL:IKE-KKL) ) & diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index 4ddaec46cce4aea2524111b817e8efd38c67979c..9b924f0ac7ea2e9a865604a97e06910081e06f25 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -529,7 +529,9 @@ INTEGER :: IZTMP1_DEVICE,IZTMP2_DEVICE,IZTMP3_DEVICE,IZTMP4_DEVICE #endif TYPE(TFIELDDATA) :: TZFIELD -INTEGER :: JIU,JJU,JKU +INTEGER :: JIU,JJU,JKU +LOGICAL :: GOCEAN !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) +REAL :: ZALTHGRAD, ZCLDTHOLD !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) !---------------------------------------------------------------------------- @@ -596,6 +598,10 @@ JIU = size( pthlm, 1 ) JJU = size( pthlm, 2 ) JKU = size( pthlm, 3 ) +GOCEAN = LOCEAN +ZALTHGRAD = XALTHGRAD +ZCLDTHOLD = XCLDTHOLD + #ifndef MNH_OPENACC allocate( za (JIU,JJU,JKU ) ) allocate( zflxz (JIU,JJU,JKU ) ) @@ -646,7 +652,7 @@ IJU=SIZE(PTHLM,2) ! !! Compute Shape of sfc flux for Oceanic Deep Conv Case ! -IF (LOCEAN .AND. LDEEPOC) THEN +IF (GOCEAN .AND. LDEEPOC) THEN #ifdef MNH_OPENACC call Print_msg( NVERB_FATAL, 'GEN', 'TURB_VER_THERMO_FLUX', 'OpenACC: LOCEAN=T not yet implemented' ) #endif @@ -892,7 +898,7 @@ END IF #endif ! compute interface flux IF (LCOUPLES) THEN ! Autocoupling O-A LES - IF (LOCEAN) THEN ! ocean model in coupled case + IF (GOCEAN) THEN ! ocean model in coupled case !$acc kernels ZF(:,:,IKE) = (XSSTFL_C(:,:,1)+XSSRFL_C(:,:,1)) & *0.5* ( 1. + PRHODJ(:,:,KKU)/PRHODJ(:,:,IKE) ) @@ -923,7 +929,7 @@ ELSE ! No coupling O and A cases !$acc end kernels END IF ! - IF (LOCEAN) THEN + IF (GOCEAN) THEN !$acc kernels ZF(:,:,IKE) = XSSTFL(:,:) *0.5*(1. + PRHODJ(:,:,KKU) / PRHODJ(:,:,IKE)) !$acc end kernels @@ -988,7 +994,7 @@ END IF ! !$acc kernels ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) -IF (LOCEAN) THEN +IF (GOCEAN) THEN ZFLXZ(:,:,KKU) = ZFLXZ(:,:,IKE) END IF ! @@ -1001,7 +1007,7 @@ END DO ! PWTH(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) ! -IF (LOCEAN) THEN +IF (GOCEAN) THEN PWTH(:,:,IKE)=0.5*(ZFLXZ(:,:,IKE)+ZFLXZ(:,:,IKE+KKL)) PWTH(:,:,KKA)=0. PWTH(:,:,KKU)=ZFLXZ(:,:,KKU) @@ -1028,7 +1034,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) THEN END IF ! ! Contribution of the conservative temperature flux to the buoyancy flux -IF (LOCEAN) THEN +IF (GOCEAN) THEN #ifndef MNH_OPENACC PTP(:,:,:)= XG*XALPHAOC * MZF(ZFLXZ ) #else @@ -1082,7 +1088,7 @@ PWTHV(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLXZ(:,:,:) PWTHV(:,:,IKB) = PETHETA(:,:,IKB) * ZFLXZ(:,:,IKB) !$acc end kernels ! -IF (LOCEAN) THEN +IF (GOCEAN) THEN ! temperature contribution to Buy flux !$acc kernels PWTHV(:,:,IKE) = PETHETA(:,:,IKE) * ZFLXZ(:,:,IKE) @@ -1390,7 +1396,7 @@ IF (KRR /= 0) THEN ! ! compute interface flux IF (LCOUPLES) THEN ! coupling NH O-A - IF (LOCEAN) THEN ! ocean model in coupled case + IF (GOCEAN) THEN ! ocean model in coupled case ! evap effect on salinity to be added later !!! !$acc kernels ZF(:,:,IKE) = 0. @@ -1423,7 +1429,7 @@ IF (KRR /= 0) THEN !$acc end kernels END IF ! - IF (LOCEAN) THEN + IF (GOCEAN) THEN ! General ocean case ! salinity/evap effect to be added later !!!!! !$acc kernels @@ -1481,15 +1487,17 @@ DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) END DO !$acc end kernels #endif +#if 1 ! ! replace the flux by the Leonard terms above ZALT and ZCLD_THOLD IF (LHGRAD) THEN !$acc kernels - WHERE ( (ZCLD_THOLD(:,:,:) >= XCLDTHOLD ) .AND. ( ZALT(:,:,:) >= XALTHGRAD ) ) + WHERE ( (ZCLD_THOLD(:,:,:) >= ZCLDTHOLD ) .AND. ( ZALT(:,:,:) >= ZALTHGRAD ) ) ZFLXZ(:,:,:) = ZF_NEW(:,:,:) END WHERE !$acc end kernels END IF +#endif ! !$acc kernels ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) @@ -1521,7 +1529,7 @@ END DO END IF ! ! Contribution of the conservative water flux to the Buoyancy flux - IF (LOCEAN) THEN + IF (GOCEAN) THEN #ifndef MNH_OPENACC ZA(:,:,:)= -XG * XBETAOC * MZF(ZFLXZ ) #else @@ -1575,7 +1583,7 @@ END DO !$acc kernels PWTHV(:,:,IKB) = PWTHV(:,:,IKB) + PEMOIST(:,:,IKB) * ZFLXZ(:,:,IKB) !$acc end kernels - IF (LOCEAN) THEN + IF (GOCEAN) THEN !$acc kernels PWTHV(:,:,IKE) = PWTHV(:,:,IKE) + PEMOIST(:,:,IKE)* ZFLXZ(:,:,IKE) !$acc end kernels @@ -1771,7 +1779,7 @@ IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN ! END IF !end of <w Rc> -IF (LOCEAN.AND.LDEEPOC) THEN +IF (GOCEAN.AND.LDEEPOC) THEN DEALLOCATE(ZXHAT_ll,ZYHAT_ll) END IF