diff --git a/docs/TODO b/docs/TODO index eb46ff8bb1c42921906761f37106db3184de1c94..554b8b70b9d34c97b6939622e2276ad8c6bd1c89 100644 --- a/docs/TODO +++ b/docs/TODO @@ -14,3 +14,15 @@ Clé de compilation REPRO48 ajoutée pour permettre de reproduire le cycle 48, e - contourne des corrections de bug - modifie l'organisation de calculs Cette clé devra être supprimée + +Merge pb: +- ice4_nucleation_wrapper: + Tableaux allocatable introduits par Philippe dans meso-nh. + Pas introduits (pour l'instant?) dans version common. + Ryad doit faire des tests pour regarder impact des allaocatble sur CPU. + si test OK, on passe en alloacatble + si test KO, arbitrage entre Philippe et Riad + +Etape 2: array syntax -> loop +- en profiter pour supprimer args PA/PB des routines appelées depuis ice4_tendencies, comme pour nucleation +- si possible, modifier ice4_sedimentation_split* dans le même esprit que stat diff --git a/src/arome/gmkpack_ignored_files b/src/arome/gmkpack_ignored_files index c6c3c26b934fded65e85ad7abe1450c3ce6f0839..af931924e666f45f5bedc8ebe931c3b30bb8ccdd 100644 --- a/src/arome/gmkpack_ignored_files +++ b/src/arome/gmkpack_ignored_files @@ -42,3 +42,7 @@ phyex/micro/ice4_rimltc.F90 phyex/micro/modi_ice4_rimltc.F90 phyex/micro/ice4_rrhong.F90 phyex/micro/modi_ice4_rrhong.F90 +phyex/micro/ice4_nucleation.F90 +phyex/micro/modi_ice4_nucleation.F90 +phyex/micro/ice4_nucleation_wrapper.F90 +phyex/micro/modi_ice4_nucleation_wrapper.F90 diff --git a/src/arome/micro/ice4_nucleation.F90 b/src/arome/micro/ice4_nucleation.F90 deleted file mode 100644 index d60dd6f92fae263e1ae5dd0250170dbaf66a9358..0000000000000000000000000000000000000000 --- a/src/arome/micro/ice4_nucleation.F90 +++ /dev/null @@ -1,125 +0,0 @@ -SUBROUTINE ICE4_NUCLEATION(KSIZE, LDSOFT, LDCOMPUTE, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) -!! -!!** PURPOSE -!! ------- -!! Computes the nucleation -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR, ONLY : XRTMIN -USE MODD_PARAM_ICE, ONLY : LFEEDBACKT -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: LDCOMPUTE -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(INOUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI -! -!* 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)! -! -PRVHENI_MR(:)=0. -IF(.NOT. LDSOFT) THEN - GNEGT(:)=PT(:)<XTT .AND. PRVT>XRTMIN(1) .AND. LDCOMPUTE(:) - PRVHENI_MR(:)=0. - ZSSI(:)=0. - 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 - 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 - 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 - ELSE - ZW(:)=1. - ENDIF - PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:) - PCIT(:)=MAX(ZZW(:)*ZW(:)+PCIT(:), PCIT(:)) - ! - PB_RI(:)=PB_RI(:) + PRVHENI_MR(:) - PB_RV(:)=PB_RV(:) - PRVHENI_MR(:) - PB_TH(:)=PB_TH(:) + PRVHENI_MR(:)*PLSFACT(:) -ENDIF -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 1, ZHOOK_HANDLE) -END SUBROUTINE ICE4_NUCLEATION diff --git a/src/arome/micro/ice4_nucleation_wrapper.F90 b/src/arome/micro/ice4_nucleation_wrapper.F90 deleted file mode 100644 index b1d401f38fc18849a9c790321c966633ebf4482a..0000000000000000000000000000000000000000 --- a/src/arome/micro/ice4_nucleation_wrapper.F90 +++ /dev/null @@ -1,124 +0,0 @@ -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 -!! ------------- -!! -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY : XTT -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 -! -INTEGER :: JL ! and PACK intrinsics -REAL(KIND=JPRB) :: ZHOOK_HANDLE -LOGICAL, DIMENSION(KIT, KJT, KKT) :: GNEGT ! Test where to compute the HEN process -INTEGER :: INEGT -INTEGER, DIMENSION(COUNT(PT<XTT .AND. LDMASK)) :: I1,I2,I3 ! Used to replace the COUNT -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, & - ZB_TH, ZB_RV, ZB_RI -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER', 0, ZHOOK_HANDLE)! -! -! -! optimization by looking for locations where -! the temperature is negative only !!! -! -GNEGT(:,:,:)=PT(:,:,:)<XTT .AND. LDMASK -INEGT=0 -IF(COUNT(GNEGT)/=0) INEGT=ICE4_NUCLEATION_COUNTJV(GNEGT(:,:,:), KIT, KJT, KKT, SIZE(I1), I1(:), I2(:), I3(:)) -PRVHENI_MR(:,:,:)=0. -IF(INEGT>=1) THEN - DO JL=1, INEGT - ZRVT(JL)=PRVT(I1(JL), I2(JL), I3(JL)) - ZCIT(JL)=PCIT(I1(JL), I2(JL), I3(JL)) - ZZT(JL)=PT(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)) - ENDDO - ZB_TH(:)=0. - ZB_RV(:)=0. - ZB_RI(:)=0. - CALL ICE4_NUCLEATION(INEGT, .FALSE., ZZT(:)<XTT, & - ZTHT, ZPRES, ZRHODREF, ZEXN, ZLSFACT, ZZT, & - ZRVT, & - ZCIT, ZRVHENI_MR, ZB_TH, ZB_RV, ZB_RI) - PRVHENI_MR(:,:,:)=UNPACK(ZRVHENI_MR(:), MASK=GNEGT(:,:,:), FIELD=0.0) - PCIT(:,:,:)=UNPACK(ZCIT(:), MASK=GNEGT(:,:,:), FIELD=PCIT(:,:,:)) -END IF -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER', 1, ZHOOK_HANDLE) - -CONTAINS - FUNCTION ICE4_NUCLEATION_COUNTJV(LTAB,KIT,KJT,KKT,KSIZE,I1,I2,I3) RESULT(IC) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - IMPLICIT NONE - INTEGER, INTENT(IN) :: KIT, KJT, KKT, KSIZE - LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: LTAB ! Mask - INTEGER, DIMENSION(KSIZE), INTENT(OUT) :: I1, I2, I3 ! Used to replace the COUNT and PACK - INTEGER :: IC - INTEGER :: JI, JJ, JK - REAL(KIND=JPRB) :: ZHOOK_HANDLE - ! - IF(LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER:ICE4_NUCLEATION_COUNTJV', 0, ZHOOK_HANDLE) - IC=0 - DO JK=1, SIZE(LTAB,3) - DO JJ=1, SIZE(LTAB,2) - DO JI=1, SIZE(LTAB,1) - IF(LTAB(JI,JJ,JK)) THEN - IC=IC+1 - I1(IC)=JI - I2(IC)=JJ - I3(IC)=JK - END IF - END DO - END DO - END DO - IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER:ICE4_NUCLEATION_COUNTJV', 1, ZHOOK_HANDLE) - END FUNCTION ICE4_NUCLEATION_COUNTJV - ! -END SUBROUTINE ICE4_NUCLEATION_WRAPPER diff --git a/src/arome/micro/ice4_tendencies.F90 b/src/arome/micro/ice4_tendencies.F90 index 23d6bf57dfa01dc348f96f435fc8993ce74218b4..32fdfd6ce5470794df73a137f874f07eb8dd3d8c 100644 --- a/src/arome/micro/ice4_tendencies.F90 +++ b/src/arome/micro/ice4_tendencies.F90 @@ -1,3 +1,18 @@ +! +! +! +! +! +! +!!! NOTE: quand l'array syntax sera remplacée par des boucles, en profiter +!!! pour supprimer les arguments PA et PB des différentes routines +!!! pour calquer le fonctionnement de nucleation, rimltc et rrhong +! +! +! +! +! +! SUBROUTINE ICE4_TENDENCIES(KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, & &KRR, LDSOFT, PCOMPUTE, & &OWARM, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, HSUBG_AUCV_RC, HSUBG_PR_PDF, & @@ -223,6 +238,9 @@ ELSE ZTHT, PPRES, PRHODREF, PEXN, PLSFACT, ZT, & ZRVT, & PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) + PB_RI(:)=PB_RI(:) + PRVHENI_MR(:) + PB_RV(:)=PB_RV(:) - PRVHENI_MR(:) + PB_TH(:)=PB_TH(:) + PRVHENI_MR(:)*PLSFACT(:) DO JL=1, KSIZE ZRIT(JL)=ZRIT(JL) + PRVHENI_MR(JL) ZRVT(JL)=ZRVT(JL) - PRVHENI_MR(JL) @@ -232,7 +250,7 @@ ELSE ! !* 3.3 compute the spontaneous freezing source: RRHONG ! - CALL ICE4_RRHONG(KSIZE, LDSOFT, PCOMPUTE, & + CALL ICE4_RRHONG(KSIZE, PCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &ZT, ZRRT, & &ZTHT, & @@ -251,7 +269,7 @@ ELSE ! !* 7.1 cloud ice melting ! - CALL ICE4_RIMLTC(KSIZE, LDSOFT, PCOMPUTE, & + CALL ICE4_RIMLTC(KSIZE, PCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &ZT, & &ZTHT, ZRIT, & diff --git a/src/arome/micro/modi_ice4_compute_pdf.F90 b/src/arome/micro/modi_ice4_compute_pdf.F90 deleted file mode 100644 index 389362917aad7a09a9ca5e3e7f68516ff8b92ac1..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_compute_pdf.F90 +++ /dev/null @@ -1,23 +0,0 @@ -MODULE MODI_ICE4_COMPUTE_PDF -INTERFACE -SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV, HSUBG_PR_PDF, & - PRHODREF, PRCT, PCF, PSIGMA_RC,& - PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, PRF) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV ! Kind of Subgrid autoconversion method -CHARACTER*80, INTENT(IN) :: HSUBG_PR_PDF ! pdf for subgrid precipitation -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF ! Cloud fraction -REAL, DIMENSION(KSIZE), INTENT(IN) :: PSIGMA_RC ! Standard deviation of rc at time t -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid - ! note that PCF = PHLC_HCF + PHLC_LCF -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid - ! note that PRC = PHLC_HRC + PHLC_LRC -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRF ! Rain fraction -END SUBROUTINE ICE4_COMPUTE_PDF -END INTERFACE -END MODULE MODI_ICE4_COMPUTE_PDF diff --git a/src/arome/micro/modi_ice4_nucleation.F90 b/src/arome/micro/modi_ice4_nucleation.F90 deleted file mode 100644 index 82db29ac7d9829e9971f0397a2dadec1641f51a6..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_nucleation.F90 +++ /dev/null @@ -1,25 +0,0 @@ -MODULE MODI_ICE4_NUCLEATION -INTERFACE -SUBROUTINE ICE4_NUCLEATION(KSIZE, LDSOFT, LDCOMPUTE, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: LDCOMPUTE -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(INOUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI -END SUBROUTINE ICE4_NUCLEATION -END INTERFACE -END MODULE MODI_ICE4_NUCLEATION diff --git a/src/arome/micro/modi_ice4_nucleation_wrapper.F90 b/src/arome/micro/modi_ice4_nucleation_wrapper.F90 deleted file mode 100644 index 264f6f9352b2107863847282ee15a8a71a174c2d..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_nucleation_wrapper.F90 +++ /dev/null @@ -1,21 +0,0 @@ -MODULE MODI_ICE4_NUCLEATION_WRAPPER -INTERFACE -SUBROUTINE ICE4_NUCLEATION_WRAPPER(KIT, KJT,KKT, LDMASK, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) -IMPLICIT NONE -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 -END SUBROUTINE ICE4_NUCLEATION_WRAPPER -END INTERFACE -END MODULE MODI_ICE4_NUCLEATION_WRAPPER diff --git a/src/arome/micro/modi_ice4_rainfr_vert.F90 b/src/arome/micro/modi_ice4_rainfr_vert.F90 deleted file mode 100644 index 2ec6cd0ff2ef2a40d0fe4a505f494deab5bf03ce..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_rainfr_vert.F90 +++ /dev/null @@ -1,10 +0,0 @@ -MODULE MODI_ICE4_RAINFR_VERT -INTERFACE -SUBROUTINE ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL -REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PPRFR !Precipitation fraction -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRR !Rain field -END SUBROUTINE ICE4_RAINFR_VERT -END INTERFACE -END MODULE MODI_ICE4_RAINFR_VERT diff --git a/src/arome/micro/modi_ice4_rimltc.F90 b/src/arome/micro/modi_ice4_rimltc.F90 deleted file mode 100644 index 2a3e6ddc5a58328de66bccac9f4d8bc8efcc09dd..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_rimltc.F90 +++ /dev/null @@ -1,24 +0,0 @@ -MODULE MODI_ICE4_RIMLTC -INTERFACE -SUBROUTINE ICE4_RIMLTC(KSIZE, LDSOFT, PCOMPUTE, & - &PEXN, PLVFACT, PLSFACT, & - &PT, & - &PTHT, PRIT, & - &PRIMLTC_MR, PB_TH, PB_RC, PB_RI) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Cloud ice at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIMLTC_MR ! Mixing ratio change due to cloud ice melting -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI -END SUBROUTINE ICE4_RIMLTC -END INTERFACE -END MODULE MODI_ICE4_RIMLTC diff --git a/src/arome/micro/modi_ice4_rrhong.F90 b/src/arome/micro/modi_ice4_rrhong.F90 deleted file mode 100644 index 41e74d22a877d2f122dd9c25fd675ad24c4eafd1..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_rrhong.F90 +++ /dev/null @@ -1,24 +0,0 @@ -MODULE MODI_ICE4_RRHONG -INTERFACE -SUBROUTINE ICE4_RRHONG(KSIZE, LDSOFT, PCOMPUTE, & - &PEXN, PLVFACT, PLSFACT, & - &PT, PRRT, & - &PTHT, & - &PRRHONG_MR, PB_TH, PB_RR, PB_RG) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRHONG_MR ! Mixing ratio change due to spontaneous freezing -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RR -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG -END SUBROUTINE ICE4_RRHONG -END INTERFACE -END MODULE MODI_ICE4_RRHONG diff --git a/src/arome/micro/modi_ice4_slow.F90 b/src/arome/micro/modi_ice4_slow.F90 deleted file mode 100644 index 0ef8030217b3a24c2da817c7489484c6093625d7..0000000000000000000000000000000000000000 --- a/src/arome/micro/modi_ice4_slow.F90 +++ /dev/null @@ -1,41 +0,0 @@ -MODULE MODI_ICE4_SLOW -INTERFACE -SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT,& - &PSSI, PLVFACT, PLSFACT, & - &PRVT, PRCT, PRIT, PRST, PRGT,& - &PLBDAS, PLBDAG,& - &PAI, PCJ,& - &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & - &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature -REAL, DIMENSION(KSIZE), INTENT(IN) :: PSSI ! Supersaturation over ice -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution -REAL, DIMENSION(KSIZE), INTENT(IN) :: PAI ! Thermodynamical function -REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCHONI ! Homogeneous nucleation -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPS ! Deposition on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAGGS ! Aggregation on r_s -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAUTS ! Autoconversion of r_i for r_s production -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPG ! Deposition on r_g -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG -END SUBROUTINE ICE4_SLOW -END INTERFACE -END MODULE MODI_ICE4_SLOW diff --git a/src/arome/micro/rain_ice.F90 b/src/arome/micro/rain_ice.F90 index 5d6581159be4932e0722948d6fbf1240ad941883..74496592a92b778164d80db44f8c4a59334d7d78 100644 --- a/src/arome/micro/rain_ice.F90 +++ b/src/arome/micro/rain_ice.F90 @@ -166,7 +166,7 @@ USE MODI_BUDGET USE MODI_ICE4_RAINFR_VERT USE MODI_ICE4_SEDIMENTATION_STAT USE MODI_ICE4_SEDIMENTATION_SPLIT -USE MODI_ICE4_NUCLEATION_WRAPPER +USE MODE_ICE4_NUCLEATION_WRAPPER, ONLY: ICE4_NUCLEATION_WRAPPER USE MODI_ICE4_TENDENCIES USE DDH_MIX, ONLY : TYP_DDH USE YOMLDDH, ONLY : TLDDH @@ -1032,7 +1032,7 @@ ENDIF ! ---------------------------------------------------------------- ! CALL ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, .NOT. LDMICRO, & - PTHT, PPABST, PRHODREF, PEXN, ZZ_LSFACT/PEXN, ZT, & + PTHT, PPABST, PRHODREF, PEXN, ZZ_LSFACT, ZT, & PRVT, & PCIT, ZZ_RVHENI_MR) DO JK = 1, KKT diff --git a/src/arome/modset_Ryad/mpa/micro/internals/ice4_nucleation_wrapper.F90 b/src/arome/modset_Ryad/mpa/micro/internals/ice4_nucleation_wrapper.F90 deleted file mode 100644 index 0c4c433b143a3e9b72fee38e5fcee2f855b3eb42..0000000000000000000000000000000000000000 --- a/src/arome/modset_Ryad/mpa/micro/internals/ice4_nucleation_wrapper.F90 +++ /dev/null @@ -1,123 +0,0 @@ -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 -!! ------------- -!! -!! R. El Khatib 24-Aug-2021 Optimizations -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY : XTT -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 -! -INTEGER :: JL ! and PACK intrinsics -REAL(KIND=JPRB) :: ZHOOK_HANDLE -LOGICAL, DIMENSION(KIT, KJT, KKT) :: GNEGT ! Test where to compute the HEN process -INTEGER :: INEGT -LOGICAL, DIMENSION(COUNT(PT<XTT .AND. LDMASK)) :: LLCOMPUTE ! computation criterium -INTEGER, DIMENSION(COUNT(PT<XTT .AND. LDMASK)) :: I1,I2,I3 ! Used to replace the COUNT -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 -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER', 0, ZHOOK_HANDLE)! -! -! -! optimization by looking for locations where -! the temperature is negative only !!! -! -GNEGT(:,:,:)=PT(:,:,:)<XTT .AND. LDMASK -INEGT=0 -IF(COUNT(GNEGT)/=0) INEGT=ICE4_NUCLEATION_COUNTJV(GNEGT(:,:,:), KIT, KJT, KKT, SIZE(I1), I1(:), I2(:), I3(:)) -PRVHENI_MR(:,:,:)=0. -IF(INEGT>=1) THEN - DO JL=1, INEGT - ZRVT(JL)=PRVT(I1(JL), I2(JL), I3(JL)) - ZCIT(JL)=PCIT(I1(JL), I2(JL), I3(JL)) - ZZT(JL)=PT(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)) - ENDDO - LLCOMPUTE(:)=(ZZT(:)<XTT) - CALL ICE4_NUCLEATION(INEGT, LLCOMPUTE, & - ZTHT, ZPRES, ZRHODREF, ZEXN, ZLSFACT, ZZT, & - ZRVT, & - ZCIT, ZRVHENI_MR) - PRVHENI_MR(:,:,:)=UNPACK(ZRVHENI_MR(:), MASK=GNEGT(:,:,:), FIELD=0.0) - PCIT(:,:,:)=UNPACK(ZCIT(:), MASK=GNEGT(:,:,:), FIELD=PCIT(:,:,:)) -END IF -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER', 1, ZHOOK_HANDLE) - -CONTAINS - FUNCTION ICE4_NUCLEATION_COUNTJV(LTAB,KIT,KJT,KKT,KSIZE,I1,I2,I3) RESULT(IC) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - IMPLICIT NONE - INTEGER, INTENT(IN) :: KIT, KJT, KKT, KSIZE - LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: LTAB ! Mask - INTEGER, DIMENSION(KSIZE), INTENT(OUT) :: I1, I2, I3 ! Used to replace the COUNT and PACK - INTEGER :: IC - INTEGER :: JI, JJ, JK - REAL(KIND=JPRB) :: ZHOOK_HANDLE - ! - IF(LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER:ICE4_NUCLEATION_COUNTJV', 0, ZHOOK_HANDLE) - IC=0 - DO JK=1, SIZE(LTAB,3) - DO JJ=1, SIZE(LTAB,2) - DO JI=1, SIZE(LTAB,1) - IF(LTAB(JI,JJ,JK)) THEN - IC=IC+1 - I1(IC)=JI - I2(IC)=JJ - I3(IC)=JK - END IF - END DO - END DO - END DO - IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER:ICE4_NUCLEATION_COUNTJV', 1, ZHOOK_HANDLE) - END FUNCTION ICE4_NUCLEATION_COUNTJV - ! -END SUBROUTINE ICE4_NUCLEATION_WRAPPER diff --git a/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_nucleation.F90 b/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_nucleation.F90 deleted file mode 100644 index bdb9ebf10fa128b3dce49d38d0502e2b4f5d4178..0000000000000000000000000000000000000000 --- a/src/arome/modset_Ryad/mpa/micro/module/modi_ice4_nucleation.F90 +++ /dev/null @@ -1,21 +0,0 @@ -MODULE MODI_ICE4_NUCLEATION -INTERFACE -SUBROUTINE ICE4_NUCLEATION(KSIZE, LDCOMPUTE, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: LDCOMPUTE -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(INOUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation -END SUBROUTINE ICE4_NUCLEATION -END INTERFACE -END MODULE MODI_ICE4_NUCLEATION diff --git a/src/common/aux/tools.f90 b/src/common/aux/tools.f90 new file mode 100644 index 0000000000000000000000000000000000000000..5ecd4e2f8888e21d97dbb1b6e9c83fef1a87382a --- /dev/null +++ b/src/common/aux/tools.f90 @@ -0,0 +1,139 @@ +!MNH_LIC Copyright 2019-2020 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_tools +!################ +! +! Purpose +! ------- +! +! The Purpose of this module is to provide useful tools for MesoNH +! +! Author +! ------ +! P. Wautelet 14/02/2019 +! +! Modifications: +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 17/01/2020: move Quicksort to tools.f90 + +implicit none + +private + +public :: Countjv +public :: Quicksort +public :: Upcase + +interface Countjv + module procedure Countjv2d, Countjv3d +end interface + + +contains + +function Countjv2d(ltab,i1,i2) result(ic) + logical, dimension(:,:), intent(in) :: ltab ! Mask + integer, dimension(:), intent(out) :: i1, i2 ! Positions of elements with 'true' value + integer :: ic ! Total number of 'true' values + + integer :: ji, jj + + ic = 0 + + do jj = 1, size( ltab, 2 ) + do ji = 1, size( ltab, 1 ) + if ( ltab(ji, jj ) ) then + ic = ic +1 + i1(ic) = ji + i2(ic) = jj + end if + end do + end do +end function Countjv2d + + +function Countjv3d(ltab,i1,i2,i3) result(ic) + logical, dimension(:,:,:), intent(in) :: ltab ! Mask + integer, dimension(:), intent(out) :: i1, i2, i3 ! Positions of elements with 'true' value + integer :: ic ! Total number of 'true' values + + integer :: ji, jj, jk + + ic = 0 + + do jk = 1, size( ltab, 3 ) + do jj = 1, size( ltab, 2 ) + do ji = 1, size( ltab, 1 ) + if ( ltab(ji, jj, jk ) ) then + ic = ic +1 + i1(ic) = ji + i2(ic) = jj + i3(ic) = jk + end if + end do + end do + end do +end function Countjv3d + + +recursive subroutine Quicksort( ka, kbeg, kend, kpos ) + integer, dimension(:), intent(inout) :: ka + integer, intent(in) :: kbeg, kend + integer, dimension(:), optional, intent(inout) :: kpos + + integer :: ji, jj + integer :: itmp, itmp2, ival + + ival = ka( ( kbeg + kend ) / 2 ) + ji = kbeg + jj = kend + do + do while ( ka(ji) < ival ) + ji = ji + 1 + end do + do while ( ival < ka(jj) ) + jj = jj - 1 + end do + if ( ji >= jj ) exit + + itmp = ka(ji) + ka(ji) = ka(jj) + ka(jj) = itmp + + if ( present( kpos ) ) then + itmp2 = kpos(ji) + kpos(ji) = kpos(jj) + kpos(jj) = itmp2 + end if + + ji=ji+1 + jj=jj-1 + end do + if ( kbeg < ji - 1 ) call Quicksort( ka, kbeg, ji - 1, kpos ) + if ( jj + 1 < kend ) call Quicksort( ka, jj + 1, kend, kpos ) +end subroutine Quicksort + + +function Upcase(hstring) + character(len=*), intent(in) :: hstring + character(len=len(hstring)) :: upcase + + integer :: jc + integer, parameter :: iamin = iachar("a") + integer, parameter :: iamaj = iachar("A") + + do jc = 1,len(hstring) + if ( hstring(jc:jc) >= "a" .and. hstring(jc:jc) <= "z" ) then + upcase(jc:jc) = achar( iachar( hstring(jc:jc) ) - iamin + iamaj ) + else + upcase(jc:jc) = hstring(jc:jc) + end if + end do +end function Upcase + +end module mode_tools diff --git a/src/arome/modset_Ryad/mpa/micro/internals/ice4_nucleation.F90 b/src/common/micro/mode_ice4_nucleation.F90 similarity index 79% rename from src/arome/modset_Ryad/mpa/micro/internals/ice4_nucleation.F90 rename to src/common/micro/mode_ice4_nucleation.F90 index cef11b2a1d605953e1cd0048c00ecdafe94adfb6..7d54233276052d05f4deec25e9ae7c072c6f4b7a 100644 --- a/src/arome/modset_Ryad/mpa/micro/internals/ice4_nucleation.F90 +++ b/src/common/micro/mode_ice4_nucleation.F90 @@ -1,4 +1,12 @@ -SUBROUTINE ICE4_NUCLEATION(KSIZE, LDCOMPUTE, & +!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) @@ -20,10 +28,10 @@ SUBROUTINE ICE4_NUCLEATION(KSIZE, LDCOMPUTE, & !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST -USE MODD_RAIN_ICE_PARAM -USE MODD_RAIN_ICE_DESCR, ONLY : XRTMIN -USE MODD_PARAM_ICE, ONLY : LFEEDBACKT +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 ! @@ -32,7 +40,7 @@ IMPLICIT NONE !* 0.1 Declarations of dummy arguments : ! INTEGER, INTENT(IN) :: KSIZE -LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: LDCOMPUTE +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 @@ -55,14 +63,14 @@ REAL, DIMENSION(KSIZE) :: ZZW, & ! Work array ! IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 0, ZHOOK_HANDLE)! ! -GNEGT(:)=PT(:)<XTT .AND. PRVT(:)>XRTMIN(1) .AND. LDCOMPUTE(:) +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 + ZZW(:)=EXP(XALPI - XBETAI/PT(:) - XGAMI*ZZW(:)) ! es_i END WHERE ZSSI(:)=0. @@ -110,11 +118,10 @@ IF(LFEEDBACKT) THEN MAX(PRVHENI_MR(:), 1.E-20) END WHERE PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:) - PCIT(:)=MAX(ZZW(:)*ZW(:)+PCIT(:), PCIT(:)) -ELSE - ZW(:)=1. - PCIT(:)=MAX(ZZW(:)+PCIT(:), PCIT(:)) + ZZW(:)=ZZW(:)*ZW(:) ENDIF +PCIT(:)=MAX(ZZW(:)+PCIT(:), PCIT(:)) ! IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 1, ZHOOK_HANDLE) END SUBROUTINE ICE4_NUCLEATION +END MODULE MODE_ICE4_NUCLEATION diff --git a/src/mesonh/micro/ice4_nucleation_wrapper.f90 b/src/common/micro/mode_ice4_nucleation_wrapper.F90 similarity index 56% rename from src/mesonh/micro/ice4_nucleation_wrapper.f90 rename to src/common/micro/mode_ice4_nucleation_wrapper.F90 index 2e08a2cd779c2e1088d4e23fdf7fec12017c684f..f16f0225517060c7d5175a9e4f643174b653d7b4 100644 --- a/src/mesonh/micro/ice4_nucleation_wrapper.f90 +++ b/src/common/micro/mode_ice4_nucleation_wrapper.F90 @@ -3,27 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -MODULE MODI_ICE4_NUCLEATION_WRAPPER -INTERFACE -SUBROUTINE ICE4_NUCLEATION_WRAPPER(KIT, KJT,KKT, LDMASK, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) +MODULE MODE_ICE4_NUCLEATION_WRAPPER IMPLICIT NONE -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 -END SUBROUTINE ICE4_NUCLEATION_WRAPPER -END INTERFACE -END MODULE MODI_ICE4_NUCLEATION_WRAPPER +CONTAINS SUBROUTINE ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, LDMASK, & PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & PRVT, & @@ -41,16 +23,18 @@ SUBROUTINE ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, LDMASK, & !! ------------- ! 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_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 : @@ -69,14 +53,13 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio chang ! !* 0.2 declaration of local variables ! -INTEGER :: IDX, JI, JJ, JK +REAL(KIND=JPRB) :: ZHOOK_HANDLE INTEGER :: JL -INTEGER :: INEGT, INEGT_TMP -INTEGER, DIMENSION(:), ALLOCATABLE :: I1,I2,I3 -LOGICAL :: GDSOFT -LOGICAL, DIMENSION(:), ALLOCATABLE :: GLDCOMPUTE -LOGICAL, DIMENSION(KIT,KJT,KKT) :: GNEGT ! Test where to compute the HEN process -REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature +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 @@ -84,11 +67,23 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature ZRHODREF, & ZEXN, & ZLSFACT, & - ZRVHENI_MR, & - ZB_TH, ZB_RV, ZB_RI + 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)! ! ! ! optimization by looking for locations where @@ -97,53 +92,48 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature GNEGT(:,:,:)=PT(:,:,:)<XTT .AND. LDMASK INEGT = COUNT(GNEGT(:,:,:)) ! -ALLOCATE(GLDCOMPUTE(INEGT)) -ALLOCATE(I1(INEGT),I2(INEGT),I3(INEGT)) -ALLOCATE(ZZT(INEGT)) -ALLOCATE(ZPRES(INEGT)) -ALLOCATE(ZRVT(INEGT)) -ALLOCATE(ZCIT(INEGT)) -ALLOCATE(ZTHT(INEGT)) -ALLOCATE(ZRHODREF(INEGT)) -ALLOCATE(ZEXN(INEGT)) -ALLOCATE(ZLSFACT(INEGT)) -ALLOCATE(ZRVHENI_MR(INEGT)) -ALLOCATE(ZB_TH(INEGT)) -ALLOCATE(ZB_RV(INEGT)) -ALLOCATE(ZB_RI(INEGT)) -! -IF(INEGT>0) INEGT_TMP=COUNTJV(GNEGT(:,:,:), I1(:), I2(:), I3(:)) +!! 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)) - ZZT(JL)=PT(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)) + 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 - GDSOFT = .FALSE. - GLDCOMPUTE(:) = ZZT(:)<XTT - ZB_TH(:) = 0. - ZB_RV(:) = 0. - ZB_RI(:) = 0. - CALL ICE4_NUCLEATION(INEGT, GDSOFT, GLDCOMPUTE, & + CALL ICE4_NUCLEATION(INEGT, GLDCOMPUTE, & ZTHT, ZPRES, ZRHODREF, ZEXN, ZLSFACT, ZZT, & ZRVT, & - ZCIT, ZRVHENI_MR, ZB_TH, ZB_RV, ZB_RI) - PRVHENI_MR(:,:,:)= 0.0 + 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 ! -DEALLOCATE(GLDCOMPUTE) -DEALLOCATE(I1,I2,I3) -DEALLOCATE(ZZT,ZPRES,ZRVT,ZCIT,ZTHT,ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR,ZB_TH,ZB_RV,ZB_RI) +!! 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) + END SUBROUTINE ICE4_NUCLEATION_WRAPPER +END MODULE MODE_ICE4_NUCLEATION_WRAPPER diff --git a/src/common/micro/mode_ice4_rimltc.F90 b/src/common/micro/mode_ice4_rimltc.F90 index 9a6e7f0772642982a70c7b73a0fd0c0cbf75c5ac..eec978566f405fd7695ee6ba98d3d27af4978bf7 100644 --- a/src/common/micro/mode_ice4_rimltc.F90 +++ b/src/common/micro/mode_ice4_rimltc.F90 @@ -7,7 +7,7 @@ MODULE MODE_ICE4_RIMLTC IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_RIMLTC(KSIZE, LDSOFT, PCOMPUTE, & +SUBROUTINE ICE4_RIMLTC(KSIZE, PCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &PT, & &PTHT, PRIT, & @@ -39,7 +39,6 @@ IMPLICIT NONE !* 0.1 Declarations of dummy arguments : ! INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) @@ -61,20 +60,18 @@ IF (LHOOK) CALL DR_HOOK('ICE4_RIMLTC',0,ZHOOK_HANDLE) !* 7.1 cloud ice melting ! PRIMLTC_MR(:)=0. -IF(.NOT. LDSOFT) THEN +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., -PRIT(JL))) * & ! PRIT(:)>0. + &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! PT(:)>XTT + &PCOMPUTE(JL) + PRIMLTC_MR(JL)=PRIT(JL) * ZMASK(JL) +ENDDO + +IF(LFEEDBACKT) THEN + !Limitation due to 0 crossing of temperature DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., -PRIT(JL))) * & ! PRIT(:)>0. - &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! PT(:)>XTT - &PCOMPUTE(JL) - PRIMLTC_MR(JL)=PRIT(JL) * ZMASK(JL) + PRIMLTC_MR(JL)=MIN(PRIMLTC_MR(JL), MAX(0., (PTHT(JL)-XTT/PEXN(JL)) / (PLSFACT(JL)-PLVFACT(JL)))) ENDDO - - IF(LFEEDBACKT) THEN - !Limitation due to 0 crossing of temperature - DO JL=1, KSIZE - PRIMLTC_MR(JL)=MIN(PRIMLTC_MR(JL), MAX(0., (PTHT(JL)-XTT/PEXN(JL)) / (PLSFACT(JL)-PLVFACT(JL)))) - ENDDO - ENDIF ENDIF IF (LHOOK) CALL DR_HOOK('ICE4_RIMLTC', 1, ZHOOK_HANDLE) diff --git a/src/common/micro/mode_ice4_rrhong.F90 b/src/common/micro/mode_ice4_rrhong.F90 index 942e4e3281d1f530286705266be4b18b36a3124b..0dde4062887f9af811ae6139a88241d6375c61e5 100644 --- a/src/common/micro/mode_ice4_rrhong.F90 +++ b/src/common/micro/mode_ice4_rrhong.F90 @@ -6,7 +6,7 @@ MODULE MODE_ICE4_RRHONG IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_RRHONG(KSIZE, LDSOFT, PCOMPUTE, & +SUBROUTINE ICE4_RRHONG(KSIZE, PCOMPUTE, & &PEXN, PLVFACT, PLSFACT, & &PT, PRRT, & &PTHT, & @@ -39,7 +39,6 @@ IMPLICIT NONE !* 0.1 Declarations of dummy arguments : ! INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: LDSOFT REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) @@ -61,19 +60,17 @@ IF (LHOOK) CALL DR_HOOK('ICE4_RRHONG',0,ZHOOK_HANDLE) !* 3.3 compute the spontaneous freezing source: RRHONG ! PRRHONG_MR(:) = 0. -IF(.NOT. LDSOFT) THEN +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(XTT-35.0))) * & ! PT(:)<XTT-35.0 + &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + &PCOMPUTE(JL) + PRRHONG_MR(JL)=PRRT(JL) * ZMASK(JL) +ENDDO +IF(LFEEDBACKT) THEN + !Limitation due to -35 crossing of temperature DO JL=1, KSIZE - ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(XTT-35.0))) * & ! PT(:)<XTT-35.0 - &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) - &PCOMPUTE(JL) - PRRHONG_MR(JL)=PRRT(JL) * ZMASK(JL) + PRRHONG_MR(JL)=MIN(PRRHONG_MR(JL), MAX(0., ((XTT-35.)/PEXN(JL)-PTHT(JL))/(PLSFACT(JL)-PLVFACT(JL)))) ENDDO - IF(LFEEDBACKT) THEN - !Limitation due to -35 crossing of temperature - DO JL=1, KSIZE - PRRHONG_MR(JL)=MIN(PRRHONG_MR(JL), MAX(0., ((XTT-35.)/PEXN(JL)-PTHT(JL))/(PLSFACT(JL)-PLVFACT(JL)))) - ENDDO - ENDIF ENDIF ! IF (LHOOK) CALL DR_HOOK('ICE4_RRHONG', 1, ZHOOK_HANDLE) diff --git a/src/mesonh/micro/ice4_nucleation.f90 b/src/mesonh/micro/ice4_nucleation.f90 deleted file mode 100644 index 98459b317087abc474b33d03a27b19c72245a490..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/ice4_nucleation.f90 +++ /dev/null @@ -1,152 +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 MODI_ICE4_NUCLEATION -INTERFACE -SUBROUTINE ICE4_NUCLEATION(KSIZE, ODSOFT, ODCOMPUTE, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) -IMPLICIT NONE -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: ODSOFT -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 -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI -END SUBROUTINE ICE4_NUCLEATION -END INTERFACE -END MODULE MODI_ICE4_NUCLEATION -SUBROUTINE ICE4_NUCLEATION(KSIZE, ODSOFT, ODCOMPUTE, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) -!! -!!** PURPOSE -!! ------- -!! Computes the nucleation -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -! -! -!* 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 MODE_MPPDB -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, INTENT(IN) :: ODSOFT -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 -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RV -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI -! -!* 0.2 declaration of local variables -! -REAL, DIMENSION(KSIZE) :: ZW ! work array -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 -!------------------------------------------------------------------------------- -! -! -PRVHENI_MR(:)=0. -IF(.NOT. ODSOFT) THEN - GNEGT(:)=PT(:)<XTT .AND. PRVT>XRTMIN(1) .AND. ODCOMPUTE(:) - PRVHENI_MR(:)=0. - ZSSI(:)=0. - 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 - 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 - 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 - ELSE - ZW(:)=1. - ENDIF - PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:) - PCIT(:)=MAX(ZZW(:)*ZW(:)+PCIT(:), PCIT(:)) - ! - PB_RI(:)=PB_RI(:) + PRVHENI_MR(:) - PB_RV(:)=PB_RV(:) - PRVHENI_MR(:) - PB_TH(:)=PB_TH(:) + PRVHENI_MR(:)*PLSFACT(:) -ENDIF -! -END SUBROUTINE ICE4_NUCLEATION