From 70b0e1fe38353b1cae6fcbb41331683df5e793f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Riette?= <sebastien.riette@meteo.fr> Date: Thu, 19 Jan 2023 12:47:35 +0100 Subject: [PATCH] S. Riette 19 Jan 2022: enable rain_ice to run without packing --- docs/TODO | 2 +- src/arome/ext/aro_rain_ice.F90 | 8 +- src/arome/ext/aro_rain_ice.h | 8 +- src/arome/ext/aroini_micro.F90 | 1 + src/common/micro/modd_param_ice.F90 | 5 +- src/common/micro/mode_ice4_budgets.F90 | 7 +- src/common/micro/mode_ice4_pack.F90 | 397 +++++++++++++---------- src/common/micro/mode_ice4_stepping.F90 | 21 +- src/common/micro/modi_rain_ice.F90 | 8 +- src/common/micro/rain_ice.F90 | 51 +-- src/mesonh/ext/default_desfmn.f90 | 1 + src/testprogs/rain_ice/main_rain_ice.F90 | 6 +- 12 files changed, 298 insertions(+), 217 deletions(-) diff --git a/docs/TODO b/docs/TODO index 419bcb0ab..a67078606 100644 --- a/docs/TODO +++ b/docs/TODO @@ -48,7 +48,7 @@ Pb identifiés à corriger plus tard: - th_r_from_thl_rt appelée partout, il faudrait limiter à OTEST - La taille du buffer utilisé pour th_r_from_thl_rt doit être mise en module et utilisée pour déclarer le buffer dans les routines appelantes et dans th_r_from_thl_rt - - rain_ice: coder d'autres implémentations de ice4_pack (filtre LLMICRO seul et/ou découpage en sous-blocs, rien) + - l'option LPACK_MICRO=FALSE ne fonctionne pas dans Méso-NH (commentaire dans default_desfmn) - shuman, turb, shuman_mf, apl_arome - peut-on remettre à jour la partie sous le sol des variables pronostiques avant d'entrer dans EDKFi dans Méso-NH? Si oui, on devrait pouvoir récrire les shuman_mf pour qu'ils produisent les mêmes résultats qu'aujourd'hui mais sans utiliser les valeurs sous le sol ou dans "l'espace infini" diff --git a/src/arome/ext/aro_rain_ice.F90 b/src/arome/ext/aro_rain_ice.F90 index a1ffbacc4..9fbb93287 100644 --- a/src/arome/ext/aro_rain_ice.F90 +++ b/src/arome/ext/aro_rain_ice.F90 @@ -144,10 +144,10 @@ REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PEXNREF ! Reference Exner functi ! ! REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt -REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLC_HRC -REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLC_HCF -REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLI_HRI -REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLI_HCF +REAL, DIMENSION(KLON,1,KLEV), INTENT(INOUT):: PHLC_HRC +REAL, DIMENSION(KLON,1,KLEV), INTENT(INOUT):: PHLC_HCF +REAL, DIMENSION(KLON,1,KLEV), INTENT(INOUT):: PHLI_HRI +REAL, DIMENSION(KLON,1,KLEV), INTENT(INOUT):: PHLI_HCF REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(KLON,1,KLEV,KRR), INTENT(INOUT):: PRT ! Moist variables at time t REAL, DIMENSION(KLON,1,KLEV), INTENT(IN) :: PSIGS ! Sigma_s at time t diff --git a/src/arome/ext/aro_rain_ice.h b/src/arome/ext/aro_rain_ice.h index e2fa8e26d..8f60c9152 100644 --- a/src/arome/ext/aro_rain_ice.h +++ b/src/arome/ext/aro_rain_ice.h @@ -38,10 +38,10 @@ REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PRHODJ REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PRHODREF REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PEXNREF REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PPABSM -REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLC_HRC -REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLC_HCF -REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLI_HRI -REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PHLI_HCF +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PHLC_HRC +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PHLC_HCF +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PHLI_HRI +REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PHLI_HCF REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PTHT REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV,KRR), INTENT(INOUT):: PRT REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(IN) :: PSIGS diff --git a/src/arome/ext/aroini_micro.F90 b/src/arome/ext/aroini_micro.F90 index 2c58dac78..faee8673b 100644 --- a/src/arome/ext/aroini_micro.F90 +++ b/src/arome/ext/aroini_micro.F90 @@ -151,6 +151,7 @@ LSEDIC=LDSEDIC LSNOW_T=.FALSE. LRED=CMICRO=='ICE3' .OR. CMICRO=='ICE4' LPACK_INTERP=.TRUE. +LPACK_MICRO=.TRUE. CALL INI_RAIN_ICE (KULOUT, PTSTEP, 20.,KSPLITR,CMICRO) CALL INI_TIWMX diff --git a/src/common/micro/modd_param_ice.F90 b/src/common/micro/modd_param_ice.F90 index 948129a68..8f7ea8f52 100644 --- a/src/common/micro/modd_param_ice.F90 +++ b/src/common/micro/modd_param_ice.F90 @@ -81,6 +81,7 @@ REAL :: XSPLIT_MAXCFL ! Maximum CFL number allowed for SPLIT scheme LOGICAL :: LSNOW_T ! Snow parameterization from Wurtz (2021) ! LOGICAL :: LPACK_INTERP !To pack arrays before computing the different interpolations (kernels and other) +LOGICAL :: LPACK_MICRO !To pack arrays before computing the process tendencies END TYPE PARAM_ICE_t ! TYPE(PARAM_ICE_t), SAVE, TARGET :: PARAM_ICE @@ -101,7 +102,8 @@ LOGICAL, POINTER :: LWARM => NULL(), & LADJ_AFTER => NULL(), & LSEDIM_AFTER => NULL(),& LSNOW_T => NULL(),& - LPACK_INTERP => NULL() + LPACK_INTERP => NULL(),& + LPACK_MICRO => NULL() REAL, POINTER :: XVDEPOSC => NULL(), & XFRACM90 => NULL(), & @@ -142,6 +144,7 @@ SUBROUTINE PARAM_ICE_ASSOCIATE() LSEDIM_AFTER => PARAM_ICE%LSEDIM_AFTER LSNOW_T => PARAM_ICE%LSNOW_T LPACK_INTERP => PARAM_ICE%LPACK_INTERP + LPACK_MICRO => PARAM_ICE%LPACK_MICRO ! XVDEPOSC => PARAM_ICE%XVDEPOSC XFRACM90 => PARAM_ICE%XFRACM90 diff --git a/src/common/micro/mode_ice4_budgets.F90 b/src/common/micro/mode_ice4_budgets.F90 index c6b32dee9..99cf34f31 100644 --- a/src/common/micro/mode_ice4_budgets.F90 +++ b/src/common/micro/mode_ice4_budgets.F90 @@ -7,7 +7,7 @@ MODULE MODE_ICE4_BUDGETS IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, KPROMA, PTSTEP, KRR, K1, K2, & +SUBROUTINE ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, PTSTEP, KRR, K1, K2, & PLVFACT, PLSFACT, PRHODJ, PEXNREF, & PRVHENI, PBU_PACK, & TBUDGETS, KBUDGETS) @@ -38,11 +38,10 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF INTEGER, INTENT(IN) :: KSIZE -INTEGER, INTENT(IN) :: KPROMA REAL, INTENT(IN) :: PTSTEP INTEGER, INTENT(IN) :: KRR -INTEGER, DIMENSION(KPROMA), INTENT(IN) :: K1 -INTEGER, DIMENSION(KPROMA), INTENT(IN) :: K2 +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K1 +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K2 REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PLVFACT REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PLSFACT REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PRHODJ diff --git a/src/common/micro/mode_ice4_pack.F90 b/src/common/micro/mode_ice4_pack.F90 index 486cd66ce..e955a223d 100644 --- a/src/common/micro/mode_ice4_pack.F90 +++ b/src/common/micro/mode_ice4_pack.F90 @@ -7,19 +7,18 @@ MODULE MODE_ICE4_PACK IMPLICIT NONE CONTAINS SUBROUTINE ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF, & - KPROMA, KSIZE, & + KPROMA, KSIZE, KSIZE2, & HSUBG_AUCV_RC, HSUBG_AUCV_RI, & PTSTEP, KRR, ODMICRO, PEXN, & PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & - PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PEVAP3D, & PRAINFR, PSIGS, & PRVHENI, PLVFACT, PLSFACT, & PWR, & TBUDGETS, KBUDGETS, & - PRHT, PRHS ) + PRHS ) ! ----------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -52,6 +51,23 @@ USE MODE_ICE4_STEPPING, ONLY: ICE4_STEPPING USE MODE_ICE4_BUDGETS, ONLY: ICE4_BUDGETS ! IMPLICIT NONE + +!NOTES ON SIZES +!If we pack: +! - KSIZE is the number of relevant point (with mixing ratio different from 0) +! - KPROMA is the size of bloc of points +! - ZSIZE2 has the same value as KPROMA +!If we do not pack: +! - KSIZE is the total number of points +! - KPROMA is null for memory saving +! - KSIZE2 has the same value as KSIZE +! +!When we do not pack, we can transmit directly the 3D arrays to the ice4_stepping subroutine, we do not need +!to copy the values. It is why KPROMA is null because we do not need these arrays. +!But some arrays must me manipulated before being transmitted and we need temporary arrays for this. +!KSIZE2 is used for those arrays that must be dimensioned KPROMA if we pack or with the total size if not. + + ! !* 0.1 Declarations of dummy arguments : ! @@ -65,6 +81,7 @@ TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF INTEGER, INTENT(IN) :: KPROMA ! cache-blocking factor for microphysic loop INTEGER, INTENT(IN) :: KSIZE +INTEGER, INTENT(IN) :: KSIZE2 CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) @@ -79,17 +96,10 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PCLDFR ! Cloud fraction -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HRC -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HCF -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HRI -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HCF -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HRC +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HRI +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HCF ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PTHS ! Theta source REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRVS ! Water vapor m.r. source @@ -108,7 +118,6 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLSFACT REAL, DIMENSION(D%NIJT,D%NKT,0:7), INTENT(OUT) :: PWR TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS INTEGER, INTENT(IN) :: KBUDGETS -REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source ! ! @@ -133,21 +142,21 @@ REAL, DIMENSION(KPROMA) :: & & ZRHODREF, & ! RHO Dry REFerence & ZPRES, & ! Pressure & ZEXN, & ! EXNer Pressure - & ZSIGMA_RC,& ! Standard deviation of rc at time t & ZCF, & ! Cloud fraction & ZHLC_HCF, & ! HLCLOUDS : fraction of High Cloud Fraction in grid & ZHLC_HRC, & ! HLCLOUDS : LWC that is High LWC in grid & ZHLI_HCF, & & ZHLI_HRI, & & ZRREVAV +REAL, DIMENSION(KSIZE2) :: ZSIGMA_RC ! Standard deviation of rc at time t +LOGICAL, DIMENSION(KPROMA) :: LLMICRO ! !Output packed tendencies (for budgets only) REAL, DIMENSION(KPROMA, IBUNUM-IBUNUM_EXTRA) :: ZBU_SUM ! !For mixing-ratio-splitting -REAL, DIMENSION(KPROMA,0:7) :: & - & ZVART, & !Packed variables - & ZEXTPK !To take into acount external tendencies inside the splitting +REAL, DIMENSION(KPROMA,0:7) :: ZVART !Packed variables +REAL, DIMENSION(KSIZE2,0:7) :: ZEXTPK !To take into acount external tendencies inside the splitting ! INTEGER, DIMENSION(KPROMA) :: I1,I2 ! Used to replace the COUNT and PACK intrinsics on variables INTEGER, DIMENSION(KSIZE) :: I1TOT, I2TOT ! Used to replace the COUNT and PACK intrinsics @@ -169,176 +178,226 @@ GEXT_TEND=.TRUE. LLSIGMA_RC=(HSUBG_AUCV_RC=='PDF ' .AND. PARAMI%CSUBG_PR_PDF=='SIGM') LL_AUCV_ADJU=(HSUBG_AUCV_RC=='ADJU' .OR. HSUBG_AUCV_RI=='ADJU') ! -IF(KPROMA /= KSIZE) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see code for explanation') - ! Microphyscs was optimized by introducing chunks of KPROMA size - ! Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present - ! We cannot rebuild the entire 3D arrays in the subroutine, so we cannot call ice4_rainfr_vert in it - ! A solution would be to suppress optimisation in this case by setting KPROMA=KSIZE in rain_ice - ! Another solution would be to compute column by column? - ! Another one would be to cut tendencies in 3 parts: before rainfr_vert, rainfr_vert, after rainfr_vert -ENDIF -! -IF(BUCONF%LBU_ENABLE) THEN - DO JV=1, IBUNUM-IBUNUM_EXTRA - ZBU_PACK(:, JV)=0. - ENDDO -ENDIF -! -!* 2. POINT SELECTION -! --------------- -! -! optimization by looking for locations where -! the microphysical fields are larger than a minimal value only !!! -! -IF (KSIZE /= COUNT(ODMICRO(IIJB:IIJE,IKTB:IKTE))) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'RAIN_ICE : KSIZE /= COUNT(ODMICRO)') -ENDIF - -IF (KSIZE > 0) THEN +IF(PARAMI%LPACK_MICRO) THEN + IF(KPROMA /= KSIZE) THEN + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see comments in code for explanation') + ! Microphyscs was optimized by introducing chunks of KPROMA size + ! Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present + ! We cannot rebuild the entire 3D arrays in the subroutine, so we cannot call ice4_rainfr_vert in it + ! A solution would be to suppress optimisation in this case by setting KPROMA=KSIZE in rain_ice + ! Another solution would be to compute column by column? + ! Another one would be to cut tendencies in 3 parts: before rainfr_vert, rainfr_vert, after rainfr_vert + ENDIF ! - !* 3. CACHE-BLOCKING LOOP - ! ------------------- + IF(BUCONF%LBU_ENABLE) THEN + DO JV=1, IBUNUM-IBUNUM_EXTRA + ZBU_PACK(:, JV)=0. + ENDDO + ENDIF ! - - ! starting indexes : - IC=0 - ISTK=IKTB - ISTIJ=IIJB - - DO JMICRO=1,KSIZE,KPROMA - - IMICRO=MIN(KPROMA,KSIZE-JMICRO+1) + !* 2. POINT SELECTION + ! --------------- + ! + ! optimization by looking for locations where + ! the microphysical fields are larger than a minimal value only !!! + ! + IF (KSIZE /= COUNT(ODMICRO(IIJB:IIJE,IKTB:IKTE))) THEN + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'ICE4_PACK', 'ICE4_PACK : KSIZE /= COUNT(ODMICRO)') + ENDIF + + IF (KSIZE > 0) THEN ! - !* 4. PACKING - ! ------- + !* 3. CACHE-BLOCKING LOOP + ! ------------------- ! - - ! Setup packing parameters - OUTER_LOOP: DO JK = ISTK, IKTE - IF (ANY(ODMICRO(:,JK))) THEN - DO JIJ = ISTIJ, IIJE - IF (ODMICRO(JIJ,JK)) THEN - IC=IC+1 - ! Initialization of variables in packed format : - ZVART(IC, ITH)=PTHT(JIJ, JK) - ZVART(IC, IRV)=PRVT(JIJ, JK) - ZVART(IC, IRC)=PRCT(JIJ, JK) - ZVART(IC, IRR)=PRRT(JIJ, JK) - ZVART(IC, IRI)=PRIT(JIJ, JK) - ZVART(IC, IRS)=PRST(JIJ, JK) - ZVART(IC, IRG)=PRGT(JIJ, JK) - IF (KRR==7) THEN - ZVART(IC, IRH)=PRHT(JIJ, JK) - ENDIF - IF (GEXT_TEND) THEN - !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here - ZEXTPK(IC, ITH)=PTHS(JIJ, JK) - ZEXTPK(IC, IRV)=PRVS(JIJ, JK) - ZEXTPK(IC, IRC)=PRCS(JIJ, JK) - ZEXTPK(IC, IRR)=PRRS(JIJ, JK) - ZEXTPK(IC, IRI)=PRIS(JIJ, JK) - ZEXTPK(IC, IRS)=PRSS(JIJ, JK) - ZEXTPK(IC, IRG)=PRGS(JIJ, JK) + + ! starting indexes : + IC=0 + ISTK=IKTB + ISTIJ=IIJB + + DO JMICRO=1,KSIZE,KPROMA + + IMICRO=MIN(KPROMA,KSIZE-JMICRO+1) + ! + !* 4. PACKING + ! ------- + ! + + ! Setup packing parameters + OUTER_LOOP: DO JK = ISTK, IKTE + IF (ANY(ODMICRO(:,JK))) THEN + DO JIJ = ISTIJ, IIJE + IF (ODMICRO(JIJ,JK)) THEN + IC=IC+1 + LLMICRO(IC)=.TRUE. + ! Initialization of variables in packed format : + ZVART(IC, ITH)=PWR(JIJ, JK, ITH) + ZVART(IC, IRV)=PWR(JIJ, JK, IRV) + ZVART(IC, IRC)=PWR(JIJ, JK, IRC) + ZVART(IC, IRR)=PWR(JIJ, JK, IRR) + ZVART(IC, IRI)=PWR(JIJ, JK, IRI) + ZVART(IC, IRS)=PWR(JIJ, JK, IRS) + ZVART(IC, IRG)=PWR(JIJ, JK, IRG) IF (KRR==7) THEN - ZEXTPK(IC, IRH)=PRHS(JIJ, JK) + ZVART(IC, IRH)=PWR(JIJ, JK, IRH) ENDIF - ENDIF - ZCIT (IC)=PCIT (JIJ, JK) - ZCF (IC)=PCLDFR (JIJ, JK) - ZRHODREF (IC)=PRHODREF(JIJ, JK) - ZPRES (IC)=PPABST (JIJ, JK) - ZEXN (IC)=PEXN (JIJ, JK) - IF(LLSIGMA_RC) THEN - ZSIGMA_RC(IC)=PSIGS (JIJ, JK) - ENDIF - IF (LL_AUCV_ADJU) THEN - ZHLC_HCF(IC) = PHLC_HCF(JIJ, JK) - ZHLC_HRC(IC) = PHLC_HRC(JIJ, JK) - ZHLI_HCF(IC) = PHLI_HCF(JIJ, JK) - ZHLI_HRI(IC) = PHLI_HRI(JIJ, JK) - ENDIF - ! Save indices for later usages: - I1(IC) = JIJ - I2(IC) = JK - I1TOT(JMICRO+IC-1)=JIJ - I2TOT(JMICRO+IC-1)=JK - IF (IC==IMICRO) THEN - ! the end of the chunk has been reached, then reset the starting index : - ISTIJ=JIJ+1 - IF (ISTIJ <= IIJE) THEN - ISTK=JK - ELSE - ! end of line, restart from 1 and increment upper loop - ISTK=JK+1 - IF (ISTK > IKTE) THEN - ! end of line, restart from 1 - ISTK=IKTB + IF (GEXT_TEND) THEN + !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here + ZEXTPK(IC, ITH)=PTHS(JIJ, JK) + ZEXTPK(IC, IRV)=PRVS(JIJ, JK) + ZEXTPK(IC, IRC)=PRCS(JIJ, JK) + ZEXTPK(IC, IRR)=PRRS(JIJ, JK) + ZEXTPK(IC, IRI)=PRIS(JIJ, JK) + ZEXTPK(IC, IRS)=PRSS(JIJ, JK) + ZEXTPK(IC, IRG)=PRGS(JIJ, JK) + IF (KRR==7) THEN + ZEXTPK(IC, IRH)=PRHS(JIJ, JK) ENDIF ENDIF - IC=0 - EXIT OUTER_LOOP + ZCIT (IC)=PCIT (JIJ, JK) + ZCF (IC)=PCLDFR (JIJ, JK) + ZRHODREF (IC)=PRHODREF(JIJ, JK) + ZPRES (IC)=PPABST (JIJ, JK) + ZEXN (IC)=PEXN (JIJ, JK) + IF(LLSIGMA_RC) THEN + ZSIGMA_RC(IC)=PSIGS (JIJ, JK) + ENDIF + IF (LL_AUCV_ADJU) THEN + ZHLC_HCF(IC) = PHLC_HCF(JIJ, JK) + ZHLC_HRC(IC) = PHLC_HRC(JIJ, JK) + ZHLI_HCF(IC) = PHLI_HCF(JIJ, JK) + ZHLI_HRI(IC) = PHLI_HRI(JIJ, JK) + ENDIF + ! Save indices for later usages: + I1(IC) = JIJ + I2(IC) = JK + I1TOT(JMICRO+IC-1)=JIJ + I2TOT(JMICRO+IC-1)=JK + IF (IC==IMICRO) THEN + ! the end of the chunk has been reached, then reset the starting index : + ISTIJ=JIJ+1 + IF (ISTIJ <= IIJE) THEN + ISTK=JK + ELSE + ! end of line, restart from 1 and increment upper loop + ISTK=JK+1 + IF (ISTK > IKTE) THEN + ! end of line, restart from 1 + ISTK=IKTB + ENDIF + ENDIF + IC=0 + EXIT OUTER_LOOP + ENDIF ENDIF - ENDIF + ENDDO + ENDIF + ! restart inner loop on JIJ : + ISTIJ=IIJB + ENDDO OUTER_LOOP + + ! + !* 5. TENDENCIES COMPUTATION + ! ---------------------- + ! + CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & + &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, & + &KPROMA, IMICRO, LLMICRO, PTSTEP, & + &KRR, & + &HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + &ZEXN, ZRHODREF, I1, I2, & + &ZPRES, ZCF, ZSIGMA_RC, & + &ZCIT, & + &ZVART, & + &ZHLC_HCF, ZHLC_HRC, & + &ZHLI_HCF, ZHLI_HRI, PRAINFR, & + &ZEXTPK, ZBU_SUM, ZRREVAV) + ! + !* 6. UNPACKING + ! --------- + ! + DO JL=1, IMICRO + PCIT (I1(JL),I2(JL))=ZCIT (JL) + IF(PARAMI%LWARM) THEN + PEVAP3D(I1(JL),I2(JL))=ZRREVAV(JL) + ENDIF + PWR(I1(JL),I2(JL),IRV)=ZVART(JL, IRV) + PWR(I1(JL),I2(JL),IRC)=ZVART(JL, IRC) + PWR(I1(JL),I2(JL),IRR)=ZVART(JL, IRR) + PWR(I1(JL),I2(JL),IRI)=ZVART(JL, IRI) + PWR(I1(JL),I2(JL),IRS)=ZVART(JL, IRS) + PWR(I1(JL),I2(JL),IRG)=ZVART(JL, IRG) + IF (KRR==7) THEN + PWR(I1(JL),I2(JL),IRH)=ZVART(JL, IRH) + ENDIF + ENDDO + IF(BUCONF%LBU_ENABLE) THEN + DO JV=1, IBUNUM-IBUNUM_EXTRA + DO JL=1, IMICRO + ZBU_PACK(JMICRO+JL-1, JV) = ZBU_SUM(JL, JV) + ENDDO ENDDO ENDIF - ! restart inner loop on JIJ : - ISTIJ=IIJB - ENDDO OUTER_LOOP + + + ENDDO ! JMICRO + ENDIF ! KSIZE > 0 - ! - !* 5. TENDENCIES COMPUTATION - ! ---------------------- - ! - CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & - &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, & - &KPROMA, IMICRO, PTSTEP, & - &KRR, & - &HSUBG_AUCV_RC, HSUBG_AUCV_RI, & - &ZEXN, ZRHODREF, I1, I2, & - &ZPRES, ZCF, ZSIGMA_RC, & - &ZCIT, & - &ZVART, & - &ZHLC_HCF, ZHLC_HRC, & - &ZHLI_HCF, ZHLI_HRI, PRAINFR, & - &ZEXTPK, ZBU_SUM, ZRREVAV) - ! - !* 6. UNPACKING - ! --------- - ! - DO JL=1, IMICRO - PCIT (I1(JL),I2(JL))=ZCIT (JL) - IF(PARAMI%LWARM) THEN - PEVAP3D(I1(JL),I2(JL))=ZRREVAV(JL) - ENDIF - PWR(I1(JL),I2(JL),IRV)=ZVART(JL, IRV) - PWR(I1(JL),I2(JL),IRC)=ZVART(JL, IRC) - PWR(I1(JL),I2(JL),IRR)=ZVART(JL, IRR) - PWR(I1(JL),I2(JL),IRI)=ZVART(JL, IRI) - PWR(I1(JL),I2(JL),IRS)=ZVART(JL, IRS) - PWR(I1(JL),I2(JL),IRG)=ZVART(JL, IRG) - IF (KRR==7) THEN - PWR(I1(JL),I2(JL),IRH)=ZVART(JL, IRH) +ELSE ! PARAMI%LPACK_MICRO + IF (KSIZE /= D%NIJT*D%NKT) THEN + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'ICE4_PACK', 'ICE4_PACK : KSIZE /= NIJT*NKT') + ENDIF + + IC=0 + DO JK = IKTB, IKTE + DO JIJ = IIJB, IIJE + IC=IC+1 + I1TOT(IC)=JIJ + I2TOT(IC)=JK + IF (GEXT_TEND) THEN + !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here + ZEXTPK(IC, ITH)=PTHS(JIJ, JK) + ZEXTPK(IC, IRV)=PRVS(JIJ, JK) + ZEXTPK(IC, IRC)=PRCS(JIJ, JK) + ZEXTPK(IC, IRR)=PRRS(JIJ, JK) + ZEXTPK(IC, IRI)=PRIS(JIJ, JK) + ZEXTPK(IC, IRS)=PRSS(JIJ, JK) + ZEXTPK(IC, IRG)=PRGS(JIJ, JK) + IF (KRR==7) THEN + ZEXTPK(IC, IRH)=PRHS(JIJ, JK) + ENDIF + IF(LLSIGMA_RC) THEN + ZSIGMA_RC(IC)=PSIGS(JIJ, JK) + ENDIF ENDIF ENDDO - IF(BUCONF%LBU_ENABLE) THEN - DO JV=1, IBUNUM-IBUNUM_EXTRA - DO JL=1, IMICRO - ZBU_PACK(JMICRO+JL-1, JV) = ZBU_SUM(JL, JV) - ENDDO - ENDDO - ENDIF - + ENDDO + ! + !* 5bis. TENDENCIES COMPUTATION + ! ---------------------- + ! + CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & + &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, & + &KSIZE, KSIZE, ODMICRO, PTSTEP, & + &KRR, & + &HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + &PEXN, PRHODREF, I1TOT, I2TOT, & + &PPABST, PCLDFR, ZSIGMA_RC, & + &PCIT, & + &PWR, & + &PHLC_HCF, PHLC_HRC, & + &PHLI_HCF, PHLI_HRI, PRAINFR, & + &ZEXTPK, ZBU_PACK, PEVAP3D) - ENDDO ! JMICRO -ENDIF ! KSIZE > 0 +ENDIF ! PARAMI%LPACK_MICRO ! !* 7. BUDGETS ! ------- ! IF(BUCONF%LBU_ENABLE) THEN !Budgets for the different processes - CALL ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, KPROMA, PTSTEP, KRR, I1TOT, I2TOT, & + CALL ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, PTSTEP, KRR, I1TOT, I2TOT, & PLVFACT, PLSFACT, PRHODJ, PEXNREF, & PRVHENI, ZBU_PACK, & TBUDGETS, KBUDGETS) diff --git a/src/common/micro/mode_ice4_stepping.F90 b/src/common/micro/mode_ice4_stepping.F90 index fdd598b18..8a438a799 100644 --- a/src/common/micro/mode_ice4_stepping.F90 +++ b/src/common/micro/mode_ice4_stepping.F90 @@ -8,7 +8,7 @@ IMPLICIT NONE CONTAINS SUBROUTINE ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & &LDSIGMA_RC, LDAUCV_ADJU, LDEXT_TEND, & - &KPROMA, KMICRO, PTSTEP, & + &KPROMA, KMICRO, LDMICRO, PTSTEP, & &KRR, & &HSUBG_AUCV_RC, HSUBG_AUCV_RI, & &PEXN, PRHODREF, K1, K2, & @@ -66,6 +66,7 @@ LOGICAL, INTENT(IN) :: LDAUCV_ADJU LOGICAL, INTENT(IN) :: LDEXT_TEND INTEGER, INTENT(IN) :: KPROMA ! cache-blocking factor for microphysic loop INTEGER, INTENT(IN) :: KMICRO ! Case r_x>0 locations +LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDMICRO REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method @@ -194,7 +195,13 @@ ENDIF ! ! IITER(1:KMICRO)=0 -ZTIME(1:KMICRO)=0. ! Current integration time (all points may have a different integration time) +DO JL=1, KMICRO + IF(LDMICRO(JL)) THEN + ZTIME(JL)=0. ! Current integration time (all points may have a different integration time) + ELSE + ZTIME(JL)=PTSTEP ! Nothing to do on this point, it has already reached the end of the timestep + ENDIF +ENDDO DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies @@ -358,14 +365,16 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies ! DO JV=0, KRR DO JL=1, KMICRO - PVART(JL, JV)=PVART(JL, JV)+ZA(JL, JV)*ZMAXTIME(JL)+ZB(JL, JV) + IF(LDMICRO(JL)) THEN + PVART(JL, JV)=PVART(JL, JV)+ZA(JL, JV)*ZMAXTIME(JL)+ZB(JL, JV) + ENDIF ENDDO ENDDO DO JL=1, KMICRO #ifdef REPRO55 PCIT(JL)=PCIT(JL) * MAX(0., -SIGN(1., -PVART(JL,IRI))) #else - IF (PVART(JL,IRI)<=0.) PCIT(JL) = 0. + IF (PVART(JL,IRI)<=0. .AND. LDMICRO(JL)) PCIT(JL) = 0. #endif ZTIME(JL)=ZTIME(JL)+ZMAXTIME(JL) ENDDO @@ -408,7 +417,9 @@ IF(LDEXT_TEND) THEN !Z..T variables contain the external tendency, we substract it DO JV=0, KRR DO JL=1, KMICRO - PVART(JL, JV) = PVART(JL, JV) - PEXTPK(JL, JV) * PTSTEP + IF(LDMICRO(JL)) THEN + PVART(JL, JV) = PVART(JL, JV) - PEXTPK(JL, JV) * PTSTEP + ENDIF ENDDO ENDDO ENDIF diff --git a/src/common/micro/modi_rain_ice.F90 b/src/common/micro/modi_rain_ice.F90 index 349c22192..bf65a39d5 100644 --- a/src/common/micro/modi_rain_ice.F90 +++ b/src/common/micro/modi_rain_ice.F90 @@ -47,10 +47,10 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PCLDFR ! Cloud fraction -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HRC -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HCF -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HRI -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HRC +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HRI +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HCF ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t diff --git a/src/common/micro/rain_ice.F90 b/src/common/micro/rain_ice.F90 index 9d61ccb5b..2008e76f6 100644 --- a/src/common/micro/rain_ice.F90 +++ b/src/common/micro/rain_ice.F90 @@ -234,10 +234,10 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PCLDFR ! Cloud fraction -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HRC -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HCF -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HRI -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HRC +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HRI +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HCF ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t @@ -296,7 +296,7 @@ REAL :: ZDEVIDE, ZRICE REAL, DIMENSION(D%NIJT,D%NKT) :: ZW3D LOGICAL, DIMENSION(D%NIJT,D%NKT) :: LLW3D REAL, DIMENSION(KRR) :: ZRSMIN -INTEGER :: ISIZE, IPROMA, IGPBLKS +INTEGER :: ISIZE, IPROMA, IGPBLKS, ISIZE2 ! !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 0, ZHOOK_HANDLE) @@ -367,7 +367,6 @@ DO JK = IKTB,IKTE ENDIF ENDDO ENDDO -ISIZE=COUNT(LLMICRO) ! Number of points with active microphysics ! ! !------------------------------------------------------------------------------- @@ -394,7 +393,8 @@ ENDIF ! DO JK = IKTB,IKTE - !Backup of T variables + !Copy of T variables to keep untouched the prognostic variables + ZWR(:,JK,ITH)=PTHT(:,JK) ZWR(:,JK,IRV)=PRVT(:,JK) ZWR(:,JK,IRC)=PRCT(:,JK) ZWR(:,JK,IRR)=PRRT(:,JK) @@ -451,33 +451,40 @@ ENDDO !* 5. TENDENCIES COMPUTATION ! ---------------------- ! -!KPROMA is the requested size for cache_blocking loop -!IPROMA is the effective size -!This parameter must be computed here because it is used for array dimensioning in ice4_pack -IF (KPROMA > 0 .AND. ISIZE > 0) THEN - ! Cache-blocking is active - ! number of chunks : - IGPBLKS = (ISIZE-1)/MIN(KPROMA,ISIZE)+1 - ! Adjust IPROMA to limit the number of small chunks - IPROMA=(ISIZE-1)/IGPBLKS+1 +IF(PARAMI%LPACK_MICRO) THEN + ISIZE=COUNT(LLMICRO) ! Number of points with active microphysics + !KPROMA is the requested size for cache_blocking loop + !IPROMA is the effective size + !This parameter must be computed here because it is used for array dimensioning in ice4_pack + IF (KPROMA > 0 .AND. ISIZE > 0) THEN + ! Cache-blocking is active + ! number of chunks : + IGPBLKS = (ISIZE-1)/MIN(KPROMA,ISIZE)+1 + ! Adjust IPROMA to limit the number of small chunks + IPROMA=(ISIZE-1)/IGPBLKS+1 + ELSE + IPROMA=ISIZE ! no cache-blocking + ENDIF + ISIZE2=IPROMA ELSE - IPROMA=ISIZE ! no cache-blocking + ISIZE=D%NIJT*D%NKT + IPROMA=0 + ISIZE2=ISIZE ENDIF !This part is put in another routine to separate pack/unpack operations from computations CALL ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF, & - IPROMA, ISIZE, & + IPROMA, ISIZE, ISIZE2, & HSUBG_AUCV_RC, HSUBG_AUCV_RI, & PTSTEP, KRR, LLMICRO, PEXN, & PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & - PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PEVAP3D, & PRAINFR, PSIGS, & ZZ_RVHENI, ZZ_LVFACT, ZZ_LSFACT, & ZWR, & TBUDGETS, KBUDGETS, & - PRHT, PRHS ) + PRHS ) ! !------------------------------------------------------------------------------- ! @@ -493,7 +500,7 @@ DO JK = IKTB, IKTE ZZ_LSFACT(JIJ,JK)=ZZ_LSFACT(JIJ,JK)/PEXNREF(JIJ,JK) ZZ_LVFACT(JIJ,JK)=ZZ_LVFACT(JIJ,JK)/PEXNREF(JIJ,JK) - !Hydrometeor tendencies is the difference between old state and new state (can be negative) + !Hydrometeor tendencies is the difference between new state and old state (can be negative) ZWR(JIJ,JK,IRV)=(ZWR(JIJ,JK,IRV)-PRVT(JIJ,JK))*ZINV_TSTEP ZWR(JIJ,JK,IRC)=(ZWR(JIJ,JK,IRC)-PRCT(JIJ,JK))*ZINV_TSTEP ZWR(JIJ,JK,IRR)=(ZWR(JIJ,JK,IRR)-PRRT(JIJ,JK))*ZINV_TSTEP diff --git a/src/mesonh/ext/default_desfmn.f90 b/src/mesonh/ext/default_desfmn.f90 index 66209eaca..8e1727695 100644 --- a/src/mesonh/ext/default_desfmn.f90 +++ b/src/mesonh/ext/default_desfmn.f90 @@ -881,6 +881,7 @@ IF (KMI == 1) THEN XVDEPOSC= 0.02 ! 2 cm/s LSNOW_T=.FALSE. LPACK_INTERP=.TRUE. + LPACK_MICRO=.TRUE. ! Meso-NH does not work with LPACK_MICRO=.FALSE. END IF ! !------------------------------------------------------------------------------- diff --git a/src/testprogs/rain_ice/main_rain_ice.F90 b/src/testprogs/rain_ice/main_rain_ice.F90 index 12c5e951e..21e51992e 100644 --- a/src/testprogs/rain_ice/main_rain_ice.F90 +++ b/src/testprogs/rain_ice/main_rain_ice.F90 @@ -241,14 +241,13 @@ JBLK2 = (NGPBLKS * (ITID+1)) / NTID #endif IPROMA=COUNT(LLMICRO(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE,IBL)) -ISIZE=IPROMA CALL RAIN_ICE (D, CST, PARAM_ICE, RAIN_ICE_PARAM, & & RAIN_ICE_DESCR, TBUCONF, & - & IPROMA, ISIZE, & + & IPROMA, & & OCND2=OCND2, & & HSUBG_AUCV_RC=CSUBG_AUCV_RC, HSUBG_AUCV_RI=CSUBG_AUCV_RI,& & PTSTEP=2*PTSTEP, & - & KRR=KRR, ODMICRO=LLMICRO(:,:,:,IBL), PEXN=PEXNREF(:,:,:,IBL), & + & KRR=KRR, PEXN=PEXNREF(:,:,:,IBL), & & PDZZ=PDZZ(:,:,:,IBL), PRHODJ=PRHODJ(:,:,:,IBL), PRHODREF=PRHODREF(:,:,:,IBL),PEXNREF=PEXNREF2(:,:,:,IBL),& & PPABST=PPABSM(:,:,:,IBL), PCIT=PCIT(:,:,:,IBL), PCLDFR=PCLDFR(:,:,:,IBL), & & PHLC_HRC=PHLC_HRC(:,:,:,IBL), PHLC_HCF=PHLC_HCF(:,:,:,IBL), & @@ -408,6 +407,7 @@ XSPLIT_MAXCFL=0.8 LDEPOSC=.FALSE. ! water deposition on vegetation XVDEPOSC=0.02 ! deposition speed (2 cm.s-1) LPACK_INTERP=.TRUE. +LPACK_MICRO=.TRUE. ! ! 2. Set implicit default values for MODD_RAIN_ICE_DESCR ! et MODD_RAIN_ICE_PARAM -- GitLab