From 9a2ec7e3d70891298689d462eb8913944381d4f4 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 26 Jan 2022 10:02:16 +0100 Subject: [PATCH] Philippe 26/01/2022: OpenACC: workaround CCE compiler problem: report modifications in ZSOLVER directory --- src/ZSOLVER/advection_metsv.f90 | 9 ++++--- src/ZSOLVER/advecuvw_rk.f90 | 47 ++++++++++++++++++--------------- src/ZSOLVER/turb.f90 | 25 ++++++++++++------ 3 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/ZSOLVER/advection_metsv.f90 b/src/ZSOLVER/advection_metsv.f90 index 058b0e18f..bda429f84 100644 --- a/src/ZSOLVER/advection_metsv.f90 +++ b/src/ZSOLVER/advection_metsv.f90 @@ -327,6 +327,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 ) @@ -471,6 +472,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') @@ -568,9 +571,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/ZSOLVER/advecuvw_rk.f90 b/src/ZSOLVER/advecuvw_rk.f90 index e08e0bddc..6a4b8117c 100644 --- a/src/ZSOLVER/advecuvw_rk.f90 +++ b/src/ZSOLVER/advecuvw_rk.f90 @@ -232,6 +232,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, & @@ -258,6 +260,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 @@ -406,7 +411,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 @@ -415,15 +420,15 @@ IF ( LIBM ) THEN !$acc end kernels 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 +!$acc kernels + 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. +!$acc end kernels ENDIF ! +!$acc kernels present(PRUS_ADV,PRVS_ADV,PRWS_ADV) present(ZUT,ZVT,ZWT) present(PU,PV,PW) PRUS_ADV = 0. PRVS_ADV = 0. PRWS_ADV = 0. @@ -498,13 +503,13 @@ RKLOOP: DO JS = 1, ISPL !* 4. Advection with WENO ! -------------------------- ! + IF (GIBM .AND. CIBM_ADV=='LOWORD') THEN !$acc kernels - IF (LIBM .AND. CIBM_ADV=='LOWORD') THEN ZIBM(:,:,:,1)=ZRUS(:,:,:,JS) ZIBM(:,:,:,2)=ZRVS(:,:,:,JS) ZIBM(:,:,:,3)=ZRWS(:,:,:,JS) - ENDIF !$acc end kernels + ENDIF ! !!$TZHALO2_UT => TZHALO2MT_ll ! 1rst add3dfield in model_n !!$TZHALO2_VT => TZHALO2MT_ll%NEXT ! 2nd add3dfield in model_n @@ -527,7 +532,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, & @@ -543,9 +548,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 ! @@ -564,13 +569,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) @@ -580,7 +585,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) @@ -604,7 +609,7 @@ RKLOOP: DO JS = 1, ISPL ! ! Intermediate guesses inside the RK loop ! - IF ( .NOT. LIBM ) THEN + IF ( .NOT. GIBM ) THEN ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:) ZVT(:,:,:) = ZVT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & diff --git a/src/ZSOLVER/turb.f90 b/src/ZSOLVER/turb.f90 index bb9d6007e..66b8ae380 100644 --- a/src/ZSOLVER/turb.f90 +++ b/src/ZSOLVER/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 @@ -1514,8 +1517,8 @@ IF (LLES_CALL) THEN !$acc end kernels CALL LES_MEAN_SUBGRID(ZTMP1_DEVICE,X_LES_SUBGRID_U2) !$acc kernels - X_LES_SUBGRID_V2 = X_LES_SUBGRID_U2 - X_LES_SUBGRID_W2 = X_LES_SUBGRID_U2 + X_LES_SUBGRID_V2(:,:,:) = X_LES_SUBGRID_U2(:,:,:) + X_LES_SUBGRID_W2(:,:,:) = X_LES_SUBGRID_U2(:,:,:) !$acc end kernels CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PTHLT,PDZZ,ZTMP2_DEVICE) CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) @@ -2124,6 +2127,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 @@ -2148,6 +2152,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 @@ -2237,7 +2243,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 @@ -2369,6 +2375,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 ) @@ -2394,6 +2401,8 @@ JIU = size(pthlt, 1 ) JJU = size(pthlt, 2 ) JKU = size(pthlt, 3 ) +GOCEAN = LOCEAN + !------------------------------------------------------------------------------- #ifndef MNH_OPENACC allocate( ZWORK2D(JIU,JJU) ) @@ -2502,7 +2511,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)* & @@ -2523,7 +2532,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) @@ -2546,7 +2555,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)) @@ -2587,7 +2596,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 -- GitLab