From 9eddf1dc514467fcaafd8f905eb566b6c48a9529 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 9 Feb 2022 16:27:42 +0100 Subject: [PATCH] Naima + Philippe 09/02/2022: OpenACC: workaround CCE compiler problem: problems with character arrays in kernels regions --- src/MNH/ice4_compute_pdf.f90 | 29 +++++++++++++++++++++++++---- src/MNH/ice4_warm.f90 | 8 +++++++- src/MNH/rain_ice_red.f90 | 7 ++++++- src/MNH/rain_ice_warm.f90 | 8 +++++++- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/MNH/ice4_compute_pdf.f90 b/src/MNH/ice4_compute_pdf.f90 index c8164539c..5eff4c083 100644 --- a/src/MNH/ice4_compute_pdf.f90 +++ b/src/MNH/ice4_compute_pdf.f90 @@ -106,6 +106,8 @@ REAL, DIMENSION(:), allocatable :: ZRCRAUTC, & !RC value to begin rain f ! note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL ! = PHLC_HRC/HCF+ PHLC_LRC/LCF ZSUMRC, ZSUMRI +! +INTEGER :: IHSUBG_PR_PDF ! temporary variable for OpenCC character limitation (Cray CCE) ! !------------------------------------------------------------------------------- @@ -257,6 +259,20 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN ZCOEFFRCM=4. END IF !$acc update device(ZCOEFFRCM) + +SELECT CASE( HSUBG_PR_PDF ) + CASE ( 'HLCRECTPDF' ) + IHSUBG_PR_PDF = 1 + CASE ( 'HLCTRIANGPDF' ) + IHSUBG_PR_PDF = 2 + CASE ( 'HLCQUADRAPDF' ) + IHSUBG_PR_PDF = 3 + CASE ( 'HLCISOTRIPDF' ) + IHSUBG_PR_PDF = 4 + CASE DEFAULT + IHSUBG_PR_PDF = 0 +END SELECT + !$acc kernels GWORK(:) = PRCT(:)>0. .AND. PCF(:)>0. WHERE(GWORK(:)) @@ -265,18 +281,21 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN ! Split available water and cloud fraction in two parts ! Calculate local mean values int he low and high parts for the 3 PDF forms: GWORK(:) = PRCT(:)>0. .AND. PCF(:)>0. .AND. ZHLC_RCMAX(:)>ZRCRAUTC(:) - IF(HSUBG_PR_PDF=='HLCRECTPDF') THEN + !IF(HSUBG_PR_PDF=='HLCRECTPDF') THEN + IF (IHSUBG_PR_PDF==1) THEN WHERE(GWORK(:)) ZHLC_LRCLOCAL(:)=0.5*ZRCRAUTC(:) ZHLC_HRCLOCAL(:)=( ZHLC_RCMAX(:) + ZRCRAUTC(:))/2.0 END WHERE - ELSE IF(HSUBG_PR_PDF=='HLCTRIANGPDF') THEN + !ELSE IF(HSUBG_PR_PDF=='HLCTRIANGPDF') THEN + ELSE IF (IHSUBG_PR_PDF==2) THEN WHERE(GWORK(:)) ZHLC_LRCLOCAL(:)=( ZRCRAUTC(:) *(3.0 * ZHLC_RCMAX(:) - 2.0 * ZRCRAUTC(:) ) ) & / (3.0 * (2.0 * ZHLC_RCMAX(:) - ZRCRAUTC(:) ) ) ZHLC_HRCLOCAL(:)=(ZHLC_RCMAX(:) + 2.0*ZRCRAUTC(:)) / 3.0 END WHERE - ELSE IF(HSUBG_PR_PDF=='HLCQUADRAPDF') THEN + !ELSE IF(HSUBG_PR_PDF=='HLCQUADRAPDF') THEN + ELSE IF (IHSUBG_PR_PDF==3) THEN WHERE(GWORK(:)) #ifndef MNH_BITREP ZHLC_LRCLOCAL(:)=(3.0 *ZRCRAUTC(:)**3 - 8.0 *ZRCRAUTC(:)**2 * ZHLC_RCMAX(:) & @@ -293,7 +312,8 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN #endif ZHLC_HRCLOCAL(:)=(ZHLC_RCMAX(:) + 3.0*ZRCRAUTC(:))/4.0 END WHERE - ELSE IF(HSUBG_PR_PDF=='HLCISOTRIPDF') THEN + !ELSE IF(HSUBG_PR_PDF=='HLCISOTRIPDF') THEN + ELSE IF (IHSUBG_PR_PDF==4) THEN GWORK2(:) = PRCT(:) <= ZRCRAUTC(:)*PCF(:) WHERE(GWORK(:)) WHERE(GWORK2(:)) @@ -443,3 +463,4 @@ END IF !$acc end data END SUBROUTINE ICE4_COMPUTE_PDF + diff --git a/src/MNH/ice4_warm.f90 b/src/MNH/ice4_warm.f90 index 95a0c756c..a07d25cd7 100644 --- a/src/MNH/ice4_warm.f90 +++ b/src/MNH/ice4_warm.f90 @@ -128,6 +128,8 @@ REAL, DIMENSION(:), allocatable :: ZUSW ! Undersaturation over water REAL, DIMENSION(:), allocatable :: ZTHLT ! Liquid potential temperature REAL, DIMENSION(:), allocatable :: ZMASK, ZMASK1, ZMASK2 +LOGICAL :: GHSUBG_RR_EVAP ! temporary variable for OpenACC character limitation (Cray CCE) + !$acc data present(PCOMPUTE,PRHODREF,PLVFACT,PT,PPRES,PTHT, & !$acc& PLBDAR,PLBDAR_RF,PKA,PDV,PCJ,PHLC_LCF,PHLC_HCF,PHLC_LRC,PHLC_HRC,PCF,PRF, & !$acc& PRVT,PRCT,PRRT,PRCAUTR,PRCACCR,PRREVAV,PA_TH,PA_RV,PA_RC,PA_RR ) @@ -340,12 +342,15 @@ IF (HSUBG_RR_EVAP=='NONE') THEN !$acc end kernels ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN +GHSUBG_RR_EVAP=.false. +IF (HSUBG_RR_EVAP=='CLFR') GHSUBG_RR_EVAP=.true. !$acc kernels !Evaporation in clear sky part !With CLFR, rain is diluted over the grid box !With PRFR, rain is concentrated in its fraction !Use temperature and humidity in clear sky part like Bechtold et al. (1993) - IF (HSUBG_RR_EVAP=='CLFR') THEN + !IF (HSUBG_RR_EVAP=='CLFR') THEN + IF (GHSUBG_RR_EVAP) THEN ZZW4(:)=1. !Precipitation fraction ZZW3(:)=PLBDAR(:) ELSE @@ -435,3 +440,4 @@ END IF !$acc end data END SUBROUTINE ICE4_WARM + diff --git a/src/MNH/rain_ice_red.f90 b/src/MNH/rain_ice_red.f90 index f82d14821..08462db53 100644 --- a/src/MNH/rain_ice_red.f90 +++ b/src/MNH/rain_ice_red.f90 @@ -520,6 +520,7 @@ REAL, DIMENSION(:), allocatable :: ZSSI REAL, DIMENSION(:,:,:), allocatable :: & &ZW_RVS, ZW_RCS, ZW_RRS, ZW_RIS, ZW_RSS, ZW_RGS, ZW_RHS, ZW_THS ! +LOGICAL :: GTEST ! temporary variable for OpenACC character limitation (Cray CCE) !$acc data present( ODMICRO, PEXN, PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & !$acc & PHLC_HRC, PTHT, PRVT, & @@ -991,6 +992,8 @@ IMICRO=COUNTJV(ODMICRO(:,:,:), I1(:), I2(:), I3(:)) CALL COUNTJV_DEVICE(ODMICRO(:,:,:),I1(:),I2(:),I3(:),IMICRO) #endif !Packing +GTEST=.false. +IF(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM') GTEST=.true. !$acc kernels IF(IMICRO>0) THEN DO JL=1, IMICRO @@ -1035,7 +1038,8 @@ IF(IMICRO>0) THEN !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here ENDDO ENDIF - IF(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM') THEN + !IF(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM') THEN + IF (GTEST) THEN DO JL=1, IMICRO ZSIGMA_RC(JL) = PSIGS(I1(JL),I2(JL),I3(JL))*2. ENDDO @@ -2414,3 +2418,4 @@ CONTAINS ! END SUBROUTINE RAIN_ICE_RED + diff --git a/src/MNH/rain_ice_warm.f90 b/src/MNH/rain_ice_warm.f90 index 4dbce2154..a524b3949 100644 --- a/src/MNH/rain_ice_warm.f90 +++ b/src/MNH/rain_ice_warm.f90 @@ -92,6 +92,8 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZZW4 ! Work array ! INTEGER :: JLU ! +LOGICAL :: GCSUBG_RR_EVAP ! temporary variable for OpenCC character limitation (Cray CCE) +! !------------------------------------------------------------------------------- ! ! IN variables @@ -312,12 +314,15 @@ ALLOCATE( ZZW4 (size(PRHODREF)) ) #ifdef MNH_OPENACC CALL PRINT_MSG(NVERB_WARNING,'GEN','RAIN_ICE_WARM','OPENACC: CSUBG_RR_EVAP=="CLFR" or "PRFR" not yet tested') #endif +GCSUBG_RR_EVAP=.false. +IF (CSUBG_RR_EVAP=='CLFR') GCSUBG_RR_EVAP=.true. !$acc kernels !Evaporation in clear sky part !With CLFR, rain is diluted over the grid box !With PRFR, rain is concentrated in its fraction !Use temperature and humidity in clear sky part like Bechtold et al. (1993) - IF (CSUBG_RR_EVAP=='CLFR') THEN + !IF (CSUBG_RR_EVAP=='CLFR') THEN + IF (GCSUBG_RR_EVAP) THEN ZZW4(:)=1. !Precipitation fraction ZZW3(:)=PLBDAR(:) ELSE @@ -409,3 +414,4 @@ END IF END SUBROUTINE RAIN_ICE_WARM END MODULE MODE_RAIN_ICE_WARM + -- GitLab