diff --git a/src/common/micro/condensation.F90 b/src/common/micro/condensation.F90 index e07e87f180092a51b6f615a8693292e33c9d961b..b5beb21a6915d5b5620348754737804503fbf4ef 100644 --- a/src/common/micro/condensation.F90 +++ b/src/common/micro/condensation.F90 @@ -329,7 +329,7 @@ DO JK=D%NKTB,D%NKTE ZFRAC(JI) = PRI_IN(JI,JJ,JK) / (PRC_IN(JI,JJ,JK)+PRI_IN(JI,JJ,JK)) ENDIF END DO - CALL COMPUTE_FRAC_ICE(HFRAC_ICE, NEB, ZFRAC(:), PT(:,JJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization + CALL COMPUTE_FRAC_ICE(HFRAC_ICE, NEB, ZFRAC(D%NIB:D%NIE), PT(D%NIB:D%NIE,JJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization ENDIF DO JI=D%NIB,D%NIE ZQSL(JI) = CST%XRD / CST%XRV * ZPV(JI) / ( PPABS(JI,JJ,JK) - ZPV(JI) ) diff --git a/src/common/micro/mode_ice4_compute_pdf.F90 b/src/common/micro/mode_ice4_compute_pdf.F90 index 6fb091d6c2c54691f9cad6371574c0f6417049d3..cbe4a3e2e65872de922705767ba6b65eb04de449 100644 --- a/src/common/micro/mode_ice4_compute_pdf.F90 +++ b/src/common/micro/mode_ice4_compute_pdf.F90 @@ -75,6 +75,7 @@ REAL, DIMENSION(KSIZE) :: ZRCRAUTC, & !RC value to begin rain formation =XC ZSUMRC, ZSUMRI REAL :: ZCOEFFRCM REAL(KIND=JPRB) :: ZHOOK_HANDLE +INTEGER :: JI !------------------------------------------------------------------------------- ! IF (LHOOK) CALL DR_HOOK('ICE4_COMPUTE_PDF', 0, ZHOOK_HANDLE)! @@ -83,6 +84,7 @@ IF (LHOOK) CALL DR_HOOK('ICE4_COMPUTE_PDF', 0, ZHOOK_HANDLE)! ZRCRAUTC(:)=XCRIAUTC/PRHODREF(:) ! Autoconversion rc threshold IF(HSUBG_AUCV_RC=='NONE') THEN !Cloud water is entirely in low or high part + !$mnh_expand_where(JI=1:KSIZE) WHERE(PRCT(:)>ZRCRAUTC(:)) PHLC_HCF(:)=1. PHLC_LCF(:)=0. @@ -99,9 +101,11 @@ IF(HSUBG_AUCV_RC=='NONE') THEN PHLC_HRC(:)=0. PHLC_LRC(:)=0. END WHERE + !$mnh_end_expand_where(JI=1:KSIZE) ELSEIF(HSUBG_AUCV_RC=='CLFR') THEN !Cloud water is only in the cloudy part and entirely in low or high part + !$mnh_expand_where(JI=1:KSIZE) WHERE(PCF(:)>0. .AND. PRCT(:)>ZRCRAUTC(:)*PCF(:)) PHLC_HCF(:)=PCF(:) PHLC_LCF(:)=0. @@ -118,15 +122,18 @@ ELSEIF(HSUBG_AUCV_RC=='CLFR') THEN PHLC_HRC(:)=0. PHLC_LRC(:)=0. END WHERE + !$mnh_end_expand_where(JI=1:KSIZE) ELSEIF(HSUBG_AUCV_RC=='ADJU') THEN + !$mnh_expand_where(JI=1:KSIZE) ZSUMRC(:)=PHLC_LRC(:)+PHLC_HRC(:) - WHERE(ZSUMRC .GT. 0.) + WHERE(ZSUMRC(:) .GT. 0.) PHLC_LRC(:)=PHLC_LRC(:)*PRCT(:)/ZSUMRC(:) PHLC_HRC(:)=PHLC_HRC(:)*PRCT(:)/ZSUMRC(:) ELSEWHERE PHLC_LRC(:)=0. PHLC_HRC(:)=0. ENDWHERE + !$mnh_end_expand_where(JI=1:KSIZE) ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN !Cloud water is split between high and low part according to a PDF ! 'HLCRECTPDF' : rectangular PDF form @@ -136,6 +143,7 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN ! 'SIGM' : Redelsperger and Sommeria (1986) IF(HSUBG_PR_PDF=='SIGM') THEN ! Redelsperger and Sommeria (1986) but organised according to Turner (2011, 2012) + !$mnh_expand_where(JI=1:KSIZE) WHERE (PRCT(:)>ZRCRAUTC(:)+PSIGMA_RC(:)) PHLC_HCF(:)=1. PHLC_LCF(:)=0. @@ -161,9 +169,10 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN PHLC_HRC(:)=0. PHLC_LRC(:)=0. END WHERE - ! Turner (2011, 2012) + !$mnh_end_expand_where(JI=1:KSIZE) ELSEIF(HSUBG_PR_PDF=='HLCRECTPDF' .OR. HSUBG_PR_PDF=='HLCISOTRIPDF' .OR. & &HSUBG_PR_PDF=='HLCTRIANGPDF' .OR. HSUBG_PR_PDF=='HLCQUADRAPDF') THEN + ! Turner (2011, 2012) ! Calculate maximum value r_cM from PDF forms IF(HSUBG_PR_PDF=='HLCRECTPDF' .OR. HSUBG_PR_PDF=='HLCISOTRIPDF') THEN ZCOEFFRCM=2. @@ -172,6 +181,7 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN ELSE IF(HSUBG_PR_PDF=='HLCQUADRAPDF') THEN ZCOEFFRCM=4. END IF + !$mnh_expand_where(JI=1:KSIZE) WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0.) ZHLC_RCMAX(:)=ZCOEFFRCM*PRCT(:)/PCF(:) END WHERE @@ -218,13 +228,13 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN WHERE (PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) ! Calculate final values for LCF and HCF: PHLC_LCF(:)=PCF(:) & - *(ZHLC_HRCLOCAL- & + *(ZHLC_HRCLOCAL(:)- & (PRCT(:) / PCF(:))) & - / (ZHLC_HRCLOCAL-ZHLC_LRCLOCAL) + / (ZHLC_HRCLOCAL(:)-ZHLC_LRCLOCAL(:)) PHLC_HCF(:)=MAX(0., PCF(:)-PHLC_LCF(:)) ! ! Calculate final values for LRC and HRC: - PHLC_LRC(:)=ZHLC_LRCLOCAL*PHLC_LCF(:) + PHLC_LRC(:)=ZHLC_LRCLOCAL(:)*PHLC_LCF(:) PHLC_HRC(:)=MAX(0., PRCT(:)-PHLC_LRC(:)) ELSEWHERE (PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).LE.ZRCRAUTC(:)) ! Put all available cloud water and his fraction in the low part @@ -238,18 +248,20 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN PHLC_LRC(:)=0. PHLC_HRC(:)=0. END WHERE - ELSE - CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_COMPUTE_PDF','wrong HSUBG_PR_PDF case') - ENDIF + !$mnh_end_expand_where(JI=1:KSIZE) + ELSE + CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_COMPUTE_PDF','wrong HSUBG_PR_PDF case') + ENDIF ELSE CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_COMPUTE_PDF','wrong HSUBG_AUCV case') ENDIF ! !Ice water split between high and low content part is done according to autoconversion option -ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI)) ! Autoconversion ri threshold +!$mnh_expand_where(JI=1:KSIZE) + ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI)) ! Autoconversion ri threshold +!$mnh_end_expand_where(JI=1:KSIZE) IF(HSUBG_AUCV_RI=='NONE') THEN - - + !$mnh_expand_where(JI=1:KSIZE) !La raison de la non reproduction n'est pas comprise avec certitude !Il faudra vérifier que le code fait toujours ce qui est attendu !une fois tous les éléments assemblés @@ -277,8 +289,10 @@ IF(HSUBG_AUCV_RI=='NONE') THEN PHLI_LRI(:)=0. END WHERE #endif + !$mnh_end_expand_where(JI=1:KSIZE) ELSEIF(HSUBG_AUCV_RI=='CLFR') THEN !Cloud water is only in the cloudy part and entirely in low or high part + !$mnh_expand_where(JI=1:KSIZE) WHERE(PCF(:)>0. .AND. PRIT(:)>ZCRIAUTI(:)*PCF(:)) PHLI_HCF(:)=PCF(:) PHLI_LCF(:)=0. @@ -295,21 +309,26 @@ ELSEIF(HSUBG_AUCV_RI=='CLFR') THEN PHLI_HRI(:)=0. PHLI_LRI(:)=0. END WHERE + !$mnh_end_expand_where(JI=1:KSIZE) ELSEIF(HSUBG_AUCV_RI=='ADJU') THEN + !$mnh_expand_where(JI=1:KSIZE) ZSUMRI(:)=PHLI_LRI(:)+PHLI_HRI(:) - WHERE(ZSUMRI .GT. 0.) + WHERE(ZSUMRI(:) .GT. 0.) PHLI_LRI(:)=PHLI_LRI(:)*PRIT(:)/ZSUMRI(:) PHLI_HRI(:)=PHLI_HRI(:)*PRIT(:)/ZSUMRI(:) ELSEWHERE PHLI_LRI(:)=0. PHLI_HRI(:)=0. ENDWHERE + !$mnh_end_expand_where(JI=1:KSIZE) ELSE !wrong HSUBG_AUCV_RI case CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'ICE4_COMPUTE_PDF', 'wrong HSUBG_AUCV_RI case' ) ENDIF ! -PRF=MAX(PHLC_HCF,PHLI_HCF) +!$mnh_expand_where(JI=1:KSIZE) + PRF(:)=MAX(PHLC_HCF(:),PHLI_HCF(:)) +!$mnh_end_expand_where(JI=1:KSIZE) ! IF (LHOOK) CALL DR_HOOK('ICE4_COMPUTE_PDF', 1, ZHOOK_HANDLE) END SUBROUTINE ICE4_COMPUTE_PDF diff --git a/src/common/micro/mode_ice4_nucleation.F90 b/src/common/micro/mode_ice4_nucleation.F90 deleted file mode 100644 index f603022fd103f74ee2deb0dbdaa7079ae7b97323..0000000000000000000000000000000000000000 --- a/src/common/micro/mode_ice4_nucleation.F90 +++ /dev/null @@ -1,133 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -MODULE MODE_ICE4_NUCLEATION -IMPLICIT NONE -CONTAINS -SUBROUTINE ICE4_NUCLEATION(KSIZE, ODCOMPUTE, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) -!! -!!** PURPOSE -!! ------- -!! Computes the nucleation -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -!! R. El Khatib 24-Aug-2021 Optimizations -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XGAMI, XGAMW, XMD, XMV, XTT, XEPSILO -USE MODD_PARAM_ICE, ONLY: LFEEDBACKT -USE MODD_RAIN_ICE_PARAM, ONLY: XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20 -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: ODCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature at time t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation -! -!* 0.2 declaration of local variables -! -REAL, DIMENSION(KSIZE) :: ZW ! work array -REAL(KIND=JPRB) :: ZHOOK_HANDLE -LOGICAL, DIMENSION(KSIZE) :: GNEGT ! Test where to compute the HEN process -REAL, DIMENSION(KSIZE) :: ZZW, & ! Work array - ZUSW, & ! Undersaturation over water - ZSSI ! Supersaturation over ice -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 0, ZHOOK_HANDLE)! -! -CALL ICE4_NUCLEATION_ELEM(ODCOMPUTE, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) - !!!GNEGT(:)=PT(:)<XTT .AND. PRVT(:)>XRTMIN(1) .AND. ODCOMPUTE(:) - !!! - !!!ZUSW(:)=0. - !!!ZZW(:)=0. - !!!WHERE(GNEGT(:)) - !!! ZZW(:)=ALOG(PT(:)) - !!! ZUSW(:)=EXP(XALPW - XBETAW/PT(:) - XGAMW*ZZW(:)) ! es_w - !!! ZZW(:)=EXP(XALPI - XBETAI/PT(:) - XGAMI*ZZW(:)) ! es_i - !!!END WHERE - !!! - !!!ZSSI(:)=0. - !!!WHERE(GNEGT(:)) - !!! ZZW(:)=MIN(PPABST(:)/2., ZZW(:)) ! safety limitation - !!! ZSSI(:)=PRVT(:)*(PPABST(:)-ZZW(:)) / (XEPSILO*ZZW(:)) - 1.0 - !!! ! Supersaturation over ice - !!! ZUSW(:)=MIN(PPABST(:)/2., ZUSW(:)) ! safety limitation - !!! ZUSW(:)=(ZUSW(:)/ZZW(:))*((PPABST(:)-ZZW(:))/(PPABST(:)-ZUSW(:))) - 1.0 - !!! ! Supersaturation of saturated water vapor over ice - !!! ! - !!! !* 3.1 compute the heterogeneous nucleation source RVHENI - !!! ! - !!! !* 3.1.1 compute the cloud ice concentration - !!! ! - !!! ZSSI(:)=MIN(ZSSI(:), ZUSW(:)) ! limitation of SSi according to SSw=0 - !!!END WHERE - !!! - !!!ZZW(:)=0. - !!!WHERE(GNEGT(:) .AND. PT(:)<XTT-5.0 .AND. ZSSI(:)>0.0 ) - !!! ZZW(:)=XNU20*EXP(XALPHA2*ZSSI(:)-XBETA2) - !!!ELSEWHERE(GNEGT(:) .AND. PT(:)<=XTT-2.0 .AND. PT(:)>=XTT-5.0 .AND. ZSSI(:)>0.0) - !!! ZZW(:)=MAX(XNU20*EXP(-XBETA2 ), & - !!! XNU10*EXP(-XBETA1*(PT(:)-XTT))*(ZSSI(:)/ZUSW(:))**XALPHA1) - !!!END WHERE - !!!WHERE(GNEGT(:)) - !!! ZZW(:)=ZZW(:)-PCIT(:) - !!! ZZW(:)=MIN(ZZW(:), 50.E3) ! limitation provisoire a 50 l^-1 - !!!END WHERE - !!! - !!!PRVHENI_MR(:)=0. - !!!WHERE(GNEGT(:)) - !!! ! - !!! !* 3.1.2 update the r_i and r_v mixing ratios - !!! ! - !!! PRVHENI_MR(:)=MAX(ZZW(:), 0.0)*XMNU0/PRHODREF(:) - !!! PRVHENI_MR(:)=MIN(PRVT(:), PRVHENI_MR(:)) - !!!END WHERE - !!!!Limitation due to 0 crossing of temperature - !!!IF(LFEEDBACKT) THEN - !!! ZW(:)=0. - !!! WHERE(GNEGT(:)) - !!! ZW(:)=MIN(PRVHENI_MR(:), & - !!! MAX(0., (XTT/PEXN(:)-PTHT(:))/PLSFACT(:))) / & - !!! MAX(PRVHENI_MR(:), 1.E-20) - !!! END WHERE - !!! PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:) - !!! ZZW(:)=ZZW(:)*ZW(:) - !!!ENDIF - !!!PCIT(:)=MAX(ZZW(:)+PCIT(:), PCIT(:)) - !!!! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 1, ZHOOK_HANDLE) -CONTAINS -INCLUDE "ice4_nucleation_elem.func.h" -END SUBROUTINE ICE4_NUCLEATION -END MODULE MODE_ICE4_NUCLEATION diff --git a/src/common/micro/mode_ice4_nucleation_wrapper.F90 b/src/common/micro/mode_ice4_nucleation_wrapper.F90 deleted file mode 100644 index 58b77c5d608c2d6d7f4841f0c06d7d91827946ef..0000000000000000000000000000000000000000 --- a/src/common/micro/mode_ice4_nucleation_wrapper.F90 +++ /dev/null @@ -1,146 +0,0 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -MODULE MODE_ICE4_NUCLEATION_WRAPPER -IMPLICIT NONE -CONTAINS -SUBROUTINE ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, LDMASK, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) -!! -!!** PURPOSE -!! ------- -!! Computes the nucleation -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) -!! R. El Khatib 24-Aug-2021 Optimizations -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XTT -USE MODE_TOOLS, ONLY: COUNTJV -USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KIT, KJT, KKT -LOGICAL, DIMENSION(KIT,KJT,KKT),INTENT(IN) :: LDMASK -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PEXN ! Exner function -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PT ! Temperature at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation -! -!* 0.2 declaration of local variables -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE - !!!INTEGER :: JL - !!!INTEGER :: INEGT - !!!INTEGER, DIMENSION(COUNT(PT<XTT .AND. LDMASK)) :: I1,I2,I3 - !!!LOGICAL, DIMENSION(COUNT(PT<XTT .AND. LDMASK)) :: GLDCOMPUTE ! computation criterium - !!!LOGICAL, DIMENSION(KIT, KJT, KKT) :: GNEGT ! Test where to compute the HEN process - !!!REAL, DIMENSION(COUNT(PT<XTT .AND. LDMASK)) :: ZZT, & ! Temperature - !!! ZPRES, & ! Pressure - !!! ZRVT, & ! Water vapor m.r. at t - !!! ZCIT, & ! Pristine ice conc. at t - !!! ZTHT, & ! Theta at t - !!! ZRHODREF, & - !!! ZEXN, & - !!! ZLSFACT, & - !!! ZRVHENI_MR - !!!!! MNH version INTEGER, DIMENSION(:), ALLOCATABLE :: I1,I2,I3 - !!!!! MNH version LOGICAL, DIMENSION(:), ALLOCATABLE :: GLDCOMPUTE - !!!!! MNH version LOGICAL, DIMENSION(KIT,KJT,KKT) :: GNEGT ! Test where to compute the HEN process - !!!!! MNH version REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature - !!!!! MNH version ZPRES, & ! Pressure - !!!!! MNH version ZRVT, & ! Water vapor m.r. at t - !!!!! MNH version ZCIT, & ! Pristine ice conc. at t - !!!!! MNH version ZTHT, & ! Theta at t - !!!!! MNH version ZRHODREF, & - !!!!! MNH version ZEXN, & - !!!!! MNH version ZLSFACT, & - !!!!! MNH version ZRVHENI_MR -! -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER', 0, ZHOOK_HANDLE)! -! -CALL ICE4_NUCLEATION_ELEM(LDMASK, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) - !!!! - !!!! - !!!! optimization by looking for locations where - !!!! the temperature is negative only !!! - !!!! - !!!GNEGT(:,:,:)=PT(:,:,:)<XTT .AND. LDMASK - !!!INEGT = COUNT(GNEGT(:,:,:)) - !!!! - !!!!! MNH version ALLOCATE(GLDCOMPUTE(INEGT)) - !!!!! MNH version ALLOCATE(I1(INEGT),I2(INEGT),I3(INEGT)) - !!!!! MNH version ALLOCATE(ZZT(INEGT)) - !!!!! MNH version ALLOCATE(ZPRES(INEGT)) - !!!!! MNH version ALLOCATE(ZRVT(INEGT)) - !!!!! MNH version ALLOCATE(ZCIT(INEGT)) - !!!!! MNH version ALLOCATE(ZTHT(INEGT)) - !!!!! MNH version ALLOCATE(ZRHODREF(INEGT)) - !!!!! MNH version ALLOCATE(ZEXN(INEGT)) - !!!!! MNH version ALLOCATE(ZLSFACT(INEGT)) - !!!!! MNH version ALLOCATE(ZRVHENI_MR(INEGT)) - !!!! - !!!IF(INEGT>0) INEGT=COUNTJV(GNEGT(:,:,:), I1(:), I2(:), I3(:)) - !!!! - !!!PRVHENI_MR(:,:,:)=0. - !!!IF(INEGT>0) THEN - !!! DO JL=1, INEGT - !!! ZRVT(JL)=PRVT(I1(JL), I2(JL), I3(JL)) - !!! ZCIT(JL)=PCIT(I1(JL), I2(JL), I3(JL)) - !!! ZPRES(JL)=PPABST(I1(JL), I2(JL), I3(JL)) - !!! ZTHT(JL)=PTHT(I1(JL), I2(JL), I3(JL)) - !!! ZRHODREF(JL)=PRHODREF(I1(JL), I2(JL), I3(JL)) - !!! ZEXN(JL)=PEXN(I1(JL), I2(JL), I3(JL)) - !!! ZLSFACT(JL)=PLSFACT(I1(JL), I2(JL), I3(JL)) / ZEXN(JL) - !!! ZZT(JL)=PT(I1(JL), I2(JL), I3(JL)) - !!! GLDCOMPUTE(JL)=ZZT(JL)<XTT - !!! ENDDO - !!! CALL ICE4_NUCLEATION(INEGT, GLDCOMPUTE, & - !!! ZTHT, ZPRES, ZRHODREF, ZEXN, ZLSFACT, ZZT, & - !!! ZRVT, & - !!! ZCIT, ZRVHENI_MR) - !!! DO JL=1, INEGT - !!! PRVHENI_MR(I1(JL), I2(JL), I3(JL)) = ZRVHENI_MR(JL) - !!! PCIT (I1(JL), I2(JL), I3(JL)) = ZCIT (JL) - !!! END DO - !!!END IF - !!!! - !!!!! MNH versionDEALLOCATE(GLDCOMPUTE) - !!!!! MNH versionDEALLOCATE(I1,I2,I3) - !!!!! MNH versionDEALLOCATE(ZZT,ZPRES,ZRVT,ZCIT,ZTHT,ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR) -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER', 1, ZHOOK_HANDLE) - -CONTAINS -INCLUDE "ice4_nucleation_elem.func.h" -END SUBROUTINE ICE4_NUCLEATION_WRAPPER -END MODULE MODE_ICE4_NUCLEATION_WRAPPER diff --git a/src/common/micro/mode_ice4_rsrimcg_old.F90 b/src/common/micro/mode_ice4_rsrimcg_old.F90 index 23d50034330ccf8342f103271c41fe837f87e48a..ff29be25fd07ae4515f0be23d6fe76c44f126381 100644 --- a/src/common/micro/mode_ice4_rsrimcg_old.F90 +++ b/src/common/micro/mode_ice4_rsrimcg_old.F90 @@ -10,7 +10,7 @@ SUBROUTINE ICE4_RSRIMCG_OLD(KSIZE, LDSOFT, LDCOMPUTE, & &PRHODREF, & &PLBDAS, & &PT, PRCT, PRST, & - &PRSRIMCG_MR, PB_RS, PB_RG) + &PRSRIMCG_MR) !! !!** PURPOSE !! ------- @@ -50,8 +50,6 @@ REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG_MR ! Mr change due to cloud droplet riming of the aggregates -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG ! !* 0.2 declaration of local variables ! @@ -122,8 +120,6 @@ IF(.NOT. LDSOFT) THEN END WHERE END IF ENDIF -PB_RS(:) = PB_RS(:) - PRSRIMCG_MR(:) -PB_RG(:) = PB_RG(:) + PRSRIMCG_MR(:) ! IF (LHOOK) CALL DR_HOOK('ICE4_RSRIMCG_OLD', 1, ZHOOK_HANDLE) ! diff --git a/src/common/micro/mode_ice4_tendencies.F90 b/src/common/micro/mode_ice4_tendencies.F90 index ea9e8f8ae1e4fc078eded42e9adfbda498ea8c8b..065a1a0a2974bdcbd237855c4b16ce16cac478d6 100644 --- a/src/common/micro/mode_ice4_tendencies.F90 +++ b/src/common/micro/mode_ice4_tendencies.F90 @@ -6,7 +6,7 @@ MODULE MODE_ICE4_TENDENCIES IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_TENDENCIES(KPROMA, KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, & +SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, & &KRR, ODSOFT, PCOMPUTE, & &OWARM, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & &HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, & @@ -48,11 +48,12 @@ SUBROUTINE ICE4_TENDENCIES(KPROMA, KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE ! ------------ ! USE MODD_BUDGET, ONLY : LBU_ENABLE +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL -USE MODD_CST, ONLY: XALPI, XBETAI, XCI, XCPV, XEPSILO, XGAMI, XLSTT, XMD, XMV, XP00, XRV, XTT -USE MODD_PARAM_ICE, ONLY: CSNOWRIMING -USE MODD_RAIN_ICE_DESCR, ONLY: XLBDAS_MAX, XLBEXG, XLBEXH, XLBEXR, XLBEXS, XLBG, XLBH, XLBR, XLBS, XRTMIN -USE MODD_RAIN_ICE_PARAM, ONLY: XSCFAC +USE MODD_CST, ONLY: CST_t +USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t +USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t ! USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress & ITH, & ! Potential temperature @@ -64,7 +65,6 @@ USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress & IRG, & ! Graupel & IRH ! Hail ! -USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION USE MODE_ICE4_RRHONG, ONLY: ICE4_RRHONG USE MODE_ICE4_RIMLTC, ONLY: ICE4_RIMLTC USE MODE_ICE4_RSRIMCG_OLD, ONLY: ICE4_RSRIMCG_OLD @@ -84,7 +84,12 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! -INTEGER, INTENT(IN) :: KPROMA, KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(CST_t), INTENT(IN) :: CST +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +INTEGER, INTENT(IN) :: KPROMA, KSIZE INTEGER, INTENT(IN) :: KRR LOGICAL, INTENT(IN) :: ODSOFT REAL, DIMENSION(KPROMA), INTENT(IN) :: PCOMPUTE @@ -168,7 +173,7 @@ REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PHLI_HCF REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PHLI_LCF REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PHLI_HRI REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PHLI_LRI -REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRAINFR ! Rain fraction +REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT) :: PRAINFR ! Rain fraction ! !* 0.2 declaration of local variables ! @@ -177,7 +182,7 @@ REAL, DIMENSION(KPROMA) :: ZT, ZRAINFR, & & ZKA, ZDV, ZAI, ZCJ, & & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, & & ZRGSI, ZRGSI_MR -REAL, DIMENSION(KIT,KJT,KKT) :: ZRRT3D, ZRST3D, ZRGT3D, ZRHT3D +REAL, DIMENSION(D%NIT,D%NJT,D%NKT) :: ZRRT3D, ZRST3D, ZRGT3D, ZRHT3D INTEGER :: JL, JV REAL, DIMENSION(KPROMA) :: ZWETG ! 1. if graupel growths in wet mode, 0. otherwise REAL :: ZZW @@ -207,10 +212,13 @@ ELSE ! !* 2. COMPUTES THE SLOW COLD PROCESS SOURCES ! -------------------------------------- - CALL ICE4_NUCLEATION(KSIZE, LLCOMPUTE, & - ZVART(:,ITH), PPRES, PRHODREF, PEXN, PLSFACT, ZT, & - ZVART(:,IRV), & - PCIT, PRVHENI_MR) +!DIR$ VECTOR ALWAYS + DO CONCURRENT (JL=1:KSIZE) + CALL ICE4_NUCLEATION_ELEM(LLCOMPUTE(JL), & + ZVART(JL,ITH), PPRES(JL), PRHODREF(JL), PEXN(JL), PLSFACT(JL), ZT(JL), & + ZVART(JL,IRV), & + PCIT(JL), PRVHENI_MR(JL)) + ENDDO DO JL=1, KSIZE ZVART(JL,ITH)=ZVART(JL,ITH) + PRVHENI_MR(JL)*PLSFACT(JL) ZT(JL) = ZVART(JL,ITH) * PEXN(JL) @@ -245,36 +253,19 @@ ELSE ZVART(JL,IRC) = ZVART(JL,IRC) + PRIMLTC_MR(JL) ZVART(JL,IRI) = ZVART(JL,IRI) - PRIMLTC_MR(JL) ENDDO - - DO JL=1, KSIZE - PB(JL, ITH)=PB(JL, ITH) + PRVHENI_MR(JL)*PLSFACT(JL) - PB(JL, ITH)=PB(JL, ITH) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PB(JL, ITH)=PB(JL, ITH) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) - - PB(JL, IRV)=PB(JL, IRV) - PRVHENI_MR(JL) - - PB(JL, IRC)=PB(JL, IRC) + PRIMLTC_MR(JL) - - PB(JL, IRR)=PB(JL, IRR) - PRRHONG_MR(JL) - - PB(JL, IRI)=PB(JL, IRI) + PRVHENI_MR(JL) - PB(JL, IRI)=PB(JL, IRI) - PRIMLTC_MR(JL) - - PB(JL, IRG)=PB(JL, IRG) + PRRHONG_MR(JL) - ENDDO ! ! 5.1.6 riming-conversion of the large sized aggregates into graupel (old parametrisation) ! - IF(CSNOWRIMING=='OLD ') THEN + IF(PARAMI%CSNOWRIMING=='OLD ') THEN ZLBDAS(1:KSIZE)=0. WHERE(ZVART(1:KSIZE,IRS)>0.) - ZLBDAS(1:KSIZE) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(1:KSIZE)*MAX(ZVART(1:KSIZE,IRS), XRTMIN(5)))**XLBEXS) + ZLBDAS(1:KSIZE) = MIN(ICED%XLBDAS_MAX, ICED%XLBS*(PRHODREF(1:KSIZE)*MAX(ZVART(1:KSIZE,IRS), ICED%XRTMIN(5)))**ICED%XLBEXS) END WHERE CALL ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, LLCOMPUTE, & &PRHODREF, & &ZLBDAS, & &ZT, ZVART(:,IRC), ZVART(:,IRS), & - &PRSRIMCG_MR, PB(:, IRS), PB(:, IRG)) + &PRSRIMCG_MR) DO JL=1, KSIZE ZVART(JL,IRS) = ZVART(JL,IRS) - PRSRIMCG_MR(JL) ZVART(JL,IRG) = ZVART(JL,IRG) + PRSRIMCG_MR(JL) @@ -282,18 +273,38 @@ ELSE ELSE PRSRIMCG_MR(:) = 0. ENDIF - ! + + DO JL=1, KSIZE + PB(JL, ITH)=PB(JL, ITH) + PRVHENI_MR(JL)*PLSFACT(JL) + PB(JL, ITH)=PB(JL, ITH) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) + PB(JL, ITH)=PB(JL, ITH) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) + + PB(JL, IRV)=PB(JL, IRV) - PRVHENI_MR(JL) + + PB(JL, IRC)=PB(JL, IRC) + PRIMLTC_MR(JL) + + PB(JL, IRR)=PB(JL, IRR) - PRRHONG_MR(JL) + + PB(JL, IRI)=PB(JL, IRI) + PRVHENI_MR(JL) + PB(JL, IRI)=PB(JL, IRI) - PRIMLTC_MR(JL) + + PB(JL, IRS)=PB(JL, IRS) - PRSRIMCG_MR(JL) + + PB(JL, IRG)=PB(JL, IRG) + PRRHONG_MR(JL) + PB(JL, IRG)=PB(JL, IRG) + PRSRIMCG_MR(JL) + ENDDO + ! !* Derived fields ! DO JL=1, KSIZE - ZZW = EXP(XALPI-XBETAI/ZT(JL)-XGAMI*ALOG(ZT(JL))) - PSSI(JL) = ZVART(JL,IRV)*( PPRES(JL)-ZZW ) / ( XEPSILO * ZZW ) - 1.0 + ZZW = EXP(CST%XALPI-CST%XBETAI/ZT(JL)-CST%XGAMI*ALOG(ZT(JL))) + PSSI(JL) = ZVART(JL,IRV)*( PPRES(JL)-ZZW ) / ( CST%XEPSILO * ZZW ) - 1.0 ! Supersaturation over ice - ZKA(JL) = 2.38E-2 + 0.0071E-2*(ZT(JL)-XTT) ! k_a - ZDV(JL) = 0.211E-4*(ZT(JL)/XTT)**1.94 * (XP00/PPRES(JL)) ! D_v - ZAI(JL) = (XLSTT+(XCPV-XCI)*(ZT(JL)-XTT))**2 / (ZKA(JL)*XRV*ZT(JL)**2) & - + ( XRV*ZT(JL) ) / (ZDV(JL)*ZZW) - ZCJ(JL) = XSCFAC*PRHODREF(JL)**0.3 / SQRT(1.718E-5+0.0049E-5*(ZT(JL)-XTT)) + ZKA(JL) = 2.38E-2 + 0.0071E-2*(ZT(JL)-CST%XTT) ! k_a + ZDV(JL) = 0.211E-4*(ZT(JL)/CST%XTT)**1.94 * (CST%XP00/PPRES(JL)) ! D_v + ZAI(JL) = (CST%XLSTT+(CST%XCPV-CST%XCI)*(ZT(JL)-CST%XTT))**2 / (ZKA(JL)*CST%XRV*ZT(JL)**2) & + + ( CST%XRV*ZT(JL) ) / (ZDV(JL)*ZZW) + ZCJ(JL) = ICEP%XSCFAC*PRHODREF(JL)**0.3 / SQRT(1.718E-5+0.0049E-5*(ZT(JL)-CST%XTT)) ENDDO ENDIF ! ODSOFT ! @@ -330,7 +341,7 @@ IF (LLRFR) THEN ZRHT3D (K1(JL), K2(JL), K3(JL)) = ZVART(JL,IRH) ENDDO ENDIF - CALL ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PRAINFR(:,:,:), & + CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR(:,:,:), & &ZRRT3D(:,:,:), ZRST3D(:,:,:), ZRGT3D(:,:,:), ZRHT3D(:,:,:)) DO JL=1,KSIZE ZRAINFR(JL)=PRAINFR(K1(JL), K2(JL), K3(JL)) @@ -345,14 +356,14 @@ ENDIF DO JL=1, KSIZE !ZLBDAR will be used when we consider rain diluted over the grid box IF(ZVART(JL,IRR)>0.) THEN - ZLBDAR(JL)=XLBR*(PRHODREF(JL)*MAX(ZVART(JL,IRR), XRTMIN(3)))**XLBEXR + ZLBDAR(JL)=ICED%XLBR*(PRHODREF(JL)*MAX(ZVART(JL,IRR), ICED%XRTMIN(3)))**ICED%XLBEXR ELSE ZLBDAR(JL)=0. ENDIF !ZLBDAR_RF is used when we consider rain concentrated in its fraction IF(LLRFR) THEN IF(ZVART(JL,IRR)>0. .AND. ZRAINFR(JL)>0.) THEN - ZLBDAR_RF(JL)=XLBR*(PRHODREF(JL)*MAX(ZVART(JL,IRR)/ZRAINFR(JL), XRTMIN(3)))**XLBEXR + ZLBDAR_RF(JL)=ICED%XLBR*(PRHODREF(JL)*MAX(ZVART(JL,IRR)/ZRAINFR(JL), ICED%XRTMIN(3)))**ICED%XLBEXR ELSE ZLBDAR_RF(JL)=0. ENDIF @@ -360,18 +371,18 @@ DO JL=1, KSIZE ZLBDAR_RF(JL)=ZLBDAR(JL) ENDIF IF(ZVART(JL,IRS)>0.) THEN - ZLBDAS(JL)=MIN(XLBDAS_MAX, XLBS*(PRHODREF(JL)*MAX(ZVART(JL,IRS), XRTMIN(5)))**XLBEXS) + ZLBDAS(JL)=MIN(ICED%XLBDAS_MAX, ICED%XLBS*(PRHODREF(JL)*MAX(ZVART(JL,IRS), ICED%XRTMIN(5)))**ICED%XLBEXS) ELSE ZLBDAS(JL)=0. ENDIF IF(ZVART(JL,IRG)>0.) THEN - ZLBDAG(JL)=XLBG*(PRHODREF(JL)*MAX(ZVART(JL,IRG), XRTMIN(6)))**XLBEXG + ZLBDAG(JL)=ICED%XLBG*(PRHODREF(JL)*MAX(ZVART(JL,IRG), ICED%XRTMIN(6)))**ICED%XLBEXG ELSE ZLBDAG(JL)=0. ENDIF IF(KRR==7) THEN IF(ZVART(JL,IRH)>0.) THEN - ZLBDAH(JL)=XLBH*(PRHODREF(JL)*MAX(ZVART(JL,IRH), XRTMIN(7)))**XLBEXH + ZLBDAH(JL)=ICED%XLBH*(PRHODREF(JL)*MAX(ZVART(JL,IRH), ICED%XRTMIN(7)))**ICED%XLBEXH ELSE ZLBDAH(JL)=0. ENDIF @@ -497,5 +508,7 @@ CALL ICE4_FAST_RI(KSIZE, ODSOFT, PCOMPUTE, & ! IF (LHOOK) CALL DR_HOOK('ICE4_TENDENCIES', 1, ZHOOK_HANDLE) ! +CONTAINS +INCLUDE "ice4_nucleation_elem.func.h" END SUBROUTINE ICE4_TENDENCIES END MODULE MODE_ICE4_TENDENCIES diff --git a/src/common/micro/rain_ice.F90 b/src/common/micro/rain_ice.F90 index 7b3d57386352b946c5840699bda66e56af420a3b..24b1bd5a6e297c6971bd7f1b89e92a1bc4a29922 100644 --- a/src/common/micro/rain_ice.F90 +++ b/src/common/micro/rain_ice.F90 @@ -204,7 +204,6 @@ USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT USE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM, ONLY: ICE4_SEDIMENTATION_SPLIT_MOMENTUM -USE MODE_ICE4_NUCLEATION_WRAPPER, ONLY: ICE4_NUCLEATION_WRAPPER USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES ! IMPLICIT NONE @@ -311,7 +310,7 @@ REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZINPRI ! Pristine ice instant prec LOGICAL :: GEXT_TEND LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation) -REAL :: ZW1D +REAL :: ZW0D REAL :: ZTSTEP ! length of sub-timestep in case of time splitting REAL :: ZINV_TSTEP ! Inverse ov PTSTEP REAL :: ZTIME_THRESHOLD ! Time to reach threshold @@ -864,7 +863,8 @@ IF (KSIZE > 0) THEN !*** 4.1 Tendencies computation ! ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise - CALL ICE4_TENDENCIES(KPROMA, IMICRO, D%NIB, D%NIE, D%NIT, D%NJB, D%NJE, D%NJT, D%NKB, D%NKE, D%NKT, D%NKL, & + CALL ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, & + &KPROMA, IMICRO, & &KRR, LSOFT, ZCOMPUTE, & &OWARM, PARAMI%CSUBG_RC_RR_ACCR, PARAMI%CSUBG_RR_EVAP, & &HSUBG_AUCV_RC, HSUBG_AUCV_RI, PARAMI%CSUBG_PR_PDF, & @@ -1096,10 +1096,21 @@ PCIT(:,:,:)=ZCITOUT(:,:,:) !* 6. COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF ODMICRO POINTS ! ---------------------------------------------------------------- ! -CALL ICE4_NUCLEATION_WRAPPER(D%NIT, D%NJT, D%NKT, .NOT. ODMICRO, & - PTHT, PPABST, PRHODREF, PEXN, ZZ_LSFACT, ZT, & - PRVT, & - PCIT, ZZ_RVHENI_MR) +DO JK=D%NKTB,D%NKTE + DO JJ=D%NJB,D%NJE +!DIR$ VECTOR ALWAYS + DO CONCURRENT (JI=D%NIB:D%NIE) + IF (.NOT. ODMICRO(JI, JJ, JK)) THEN + ZW0D=ZZ_LSFACT(JI, JJ, JK)/PEXN(JI, JJ, JK) + ENDIF + CALL ICE4_NUCLEATION_ELEM(.NOT. ODMICRO(JI, JJ, JK), & + PTHT(JI, JJ, JK), PPABST(JI, JJ, JK), PRHODREF(JI, JJ, JK), & + PEXN(JI, JJ, JK), ZW0D, ZT(JI, JJ, JK), & + PRVT(JI, JJ, JK), & + PCIT(JI, JJ, JK), ZZ_RVHENI_MR(JI, JJ, JK)) + ENDDO + ENDDO +ENDDO ! !------------------------------------------------------------------------------- ! @@ -1111,8 +1122,7 @@ CALL ICE4_NUCLEATION_WRAPPER(D%NIT, D%NJT, D%NKT, .NOT. ODMICRO, & ! DO JK = D%NKTB, D%NKTE DO JJ = D%NJB, D%NJE -!DEC$ IVDEP - DO JI = D%NIB, D%NIE + DO CONCURRENT (JI=D%NIB:D%NIE) !LV/LS ZZ_LSFACT(JI,JJ,JK)=ZZ_LSFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK) ZZ_LVFACT(JI,JJ,JK)=ZZ_LVFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK) @@ -1766,6 +1776,7 @@ CONTAINS IF (LHOOK) CALL DR_HOOK('RAIN_ICE:CORRECT_NEGATIVITIES', 1, ZHOOK_HANDLE) ! END SUBROUTINE CORRECT_NEGATIVITIES - +! +INCLUDE "ice4_nucleation_elem.func.h" ! END SUBROUTINE RAIN_ICE diff --git a/src/mesonh/micro/rain_ice_red.f90 b/src/mesonh/micro/rain_ice_red.f90 index fd80dbca2264706d558904d4728eebf4a2b1f874..c82e76e9658a3d6d19164ca90872088a4dd4adc5 100644 --- a/src/mesonh/micro/rain_ice_red.f90 +++ b/src/mesonh/micro/rain_ice_red.f90 @@ -314,7 +314,6 @@ USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT USE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM, ONLY: ICE4_SEDIMENTATION_SPLIT_MOMENTUM -USE MODE_ICE4_NUCLEATION_WRAPPER, ONLY: ICE4_NUCLEATION_WRAPPER USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES ! IMPLICIT NONE @@ -421,7 +420,7 @@ REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZINPRI ! Pristine ice instant prec LOGICAL :: GEXT_TEND LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation) -REAL :: ZW1D +REAL :: ZW0D REAL :: ZTSTEP ! length of sub-timestep in case of time splitting REAL :: ZINV_TSTEP ! Inverse ov PTSTEP REAL :: ZTIME_THRESHOLD ! Time to reach threshold @@ -974,7 +973,8 @@ IF (KSIZE > 0) THEN !*** 4.1 Tendencies computation ! ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise - CALL ICE4_TENDENCIES(KPROMA, IMICRO, D%NIB, D%NIE, D%NIT, D%NJB, D%NJE, D%NJT, D%NKB, D%NKE, D%NKT, D%NKL, & + CALL ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, & + &KPROMA, IMICRO, & &KRR, LSOFT, ZCOMPUTE, & &OWARM, PARAMI%CSUBG_RC_RR_ACCR, PARAMI%CSUBG_RR_EVAP, & &HSUBG_AUCV_RC, HSUBG_AUCV_RI, PARAMI%CSUBG_PR_PDF, & @@ -1206,10 +1206,21 @@ PCIT(:,:,:)=ZCITOUT(:,:,:) !* 6. COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF ODMICRO POINTS ! ---------------------------------------------------------------- ! -CALL ICE4_NUCLEATION_WRAPPER(D%NIT, D%NJT, D%NKT, .NOT. ODMICRO, & - PTHT, PPABST, PRHODREF, PEXN, ZZ_LSFACT, ZT, & - PRVT, & - PCIT, ZZ_RVHENI_MR) +DO JK=D%NKTB,D%NKTE + DO JJ=D%NJB,D%NJE +!DIR$ VECTOR ALWAYS + DO CONCURRENT (JI=D%NIB:D%NIE) + IF (.NOT. ODMICRO(JI, JJ, JK)) THEN + ZW0D=ZZ_LSFACT(JI, JJ, JK)/PEXN(JI, JJ, JK) + ENDIF + CALL ICE4_NUCLEATION_ELEM(.NOT. ODMICRO(JI, JJ, JK), & + PTHT(JI, JJ, JK), PPABST(JI, JJ, JK), PRHODREF(JI, JJ, JK), & + PEXN(JI, JJ, JK), ZW0D, ZT(JI, JJ, JK), & + PRVT(JI, JJ, JK), & + PCIT(JI, JJ, JK), ZZ_RVHENI_MR(JI, JJ, JK)) + ENDDO + ENDDO +ENDDO ! !------------------------------------------------------------------------------- ! @@ -1221,8 +1232,7 @@ CALL ICE4_NUCLEATION_WRAPPER(D%NIT, D%NJT, D%NKT, .NOT. ODMICRO, & ! DO JK = D%NKTB, D%NKTE DO JJ = D%NJB, D%NJE -!DEC$ IVDEP - DO JI = D%NIB, D%NIE + DO CONCURRENT (JI=D%NIB:D%NIE) !LV/LS ZZ_LSFACT(JI,JJ,JK)=ZZ_LSFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK) ZZ_LVFACT(JI,JJ,JK)=ZZ_LVFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK) @@ -1876,6 +1886,7 @@ CONTAINS IF (LHOOK) CALL DR_HOOK('RAIN_ICE:CORRECT_NEGATIVITIES', 1, ZHOOK_HANDLE) ! END SUBROUTINE CORRECT_NEGATIVITIES - +! +INCLUDE "ice4_nucleation_elem.func.h" ! END SUBROUTINE RAIN_ICE_RED