Skip to content
Snippets Groups Projects
mode_elec_tendencies.f90 149 KiB
Newer Older
!MNH_LIC Copyright 2022-2023 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_ELEC_TENDENCIES
!     ###########################
!
INTERFACE
      SUBROUTINE ELEC_TENDENCIES (D, KRR, KMICRO, PTSTEP, ODMICRO,                            &
                                  PRHODREF, PRHODJ, PZT, PCIT,                                &
                                  PRVT, PRCT, PRRT, PRIT, PRST, PRGT,                         &
                                  PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT,                 &
                                  PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS,                 &
                                  PRVHENI, PRRHONG, PRIMLTC,                                  &
                                  PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG,                &
                                  PRCAUTR, PRCACCR, PRREVAV,                                  &
                                  PRCRIMSS, PRCRIMSG, PRSRIMCG, PRRACCSS, PRRACCSG, PRSACCRG, &
                                  PRSMLTG, PRICFRRG, PRRCFRIG,                                &
                                  PRCWETG, PRIWETG, PRRWETG, PRSWETG,                         &
                                  PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG,                         &
                                  PRGMLTR, PRCBERI,                                           & 
                                  PRCMLTSR, PRICFRR,                                          & !- opt. param. for ICE3 
                                  PCCT, PCRT, PCST, PCGT,                                     & !-- optional
                                  PRVHENC, PRCHINC, PRVHONH,                                  & !| parameters 
                                  PRRCVRC, PRICNVI, PRVDEPI, PRSHMSI, PRGHMGI,                & !|    for
                                  PRICIBU, PRIRDSF,                                           & !|    LIMA
                                  PRCCORR2, PRRCORR2, PRICORR2,                               & !--
                                  PRWETGH, PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH,       & !--  optional
                                  PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH,                & !|  parameters
                                  PRHMLTR, PRDRYHG,                                           & !|     for
                                  PRHT, PRHS, PCHT, PQHT, PQHS)                                 !--    hail                          
!
USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
!
TYPE(DIMPHYEX_t),                     INTENT(IN)    :: D
!
INTEGER,                              INTENT(IN)    :: KMICRO
REAL,                                 INTENT(IN)    :: PTSTEP  ! Double Time step
                                                               ! (single if cold start)
INTEGER,                              INTENT(IN)    :: KRR     ! Number of moist variable
!
LOGICAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)   :: ODMICRO ! mask to limit computation
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRHODREF! Reference density
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PZT     ! Temperature (K)
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PCIT    ! Pristine ice n.c. at t
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRCT    ! Cloud water m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRRT    ! Rain water m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRIT    ! Pristine ice m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRST    ! Snow/aggregate m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRGT    ! Graupel/hail m.r. at t
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQPIT   ! Positive ion (Nb/kg) at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQNIT   ! Negative ion (Nb/kg) at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQCT    ! Cloud water charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQRT    ! Raindrops charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQIT    ! Pristine ice charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQST    ! Snow/aggregates charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQGT    ! Graupel charge at t
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQPIS   ! Positive ion (Nb/kg) source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQNIS   ! Negative ion (Nb/kg) source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQCS    ! Cloud water charge source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQRS    ! Raindrops charge source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQIS    ! Pristine ice charge source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQSS    ! Snow/aggregates charge source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQGS    ! Graupel charge source
!
! microphysics rates common to ICE3 and LIMA
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRVHENI, &  ! heterogeneous nucleation mixing ratio change (HIND for LIMA)
                                                       PRCHONI, &  ! Homogeneous nucleation
                                                       PRRHONG, &  ! Spontaneous freezing mixing ratio change
                                                       PRVDEPS, &  ! Deposition on r_s,
                                                       PRIAGGS, &  ! Aggregation on r_s
                                                       PRIAUTS, &  ! Autoconversion of r_i for r_s production (CNVS for LIMA)
                                                       PRVDEPG, &  ! Deposition on r_g
                                                       PRCAUTR, &  ! Autoconversion of r_c for r_r production
                                                       PRCACCR, &  ! Accretion of r_c for r_r production
                                                       PRREVAV, &  ! Evaporation of r_r
                                                       PRIMLTC, &  ! Cloud ice melting mixing ratio change
                                                       PRCBERI, &  ! Bergeron-Findeisen effect
                                                       PRSMLTG, &  ! Conversion-Melting of the aggregates
                                                       PRRACCSS, PRRACCSG, PRSACCRG, & ! Rain accretion onto the aggregates
                                                       PRCRIMSS, PRCRIMSG, PRSRIMCG, & ! Cloud droplet riming of the aggregates
                                                       PRICFRRG, PRRCFRIG,           & ! Rain contact freezing
                                                       PRCWETG, PRIWETG, PRRWETG, PRSWETG, &  ! Graupel wet growth
                                                       PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, &  ! Graupel dry growth
                                                       PRGMLTR     ! Melting of the graupel
! microphysics rates specific to ICE3 (knmoments==1)
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRCMLTSR,&  ! Cld droplet collection onto aggregates by pos. temp.
                                                               PRICFRR     ! Rain contact freezing (part of ice crystals converted to rain)
! microphysics rates specific to LIMA (knmoments==2)
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRVHENC, &  ! Cld droplet formation
                                                               PRCHINC, &  ! Heterogeneous nucleation of coated IFN
                                                               PRVHONH, &  ! Nucleation of haze
                                                               PRRCVRC, &  ! Conversion of small drops into droplets
                                                               PRICNVI, &  ! Conversion snow --> ice
                                                               PRVDEPI, &  ! Deposition on r_i
                                                               PRSHMSI, PRGHMGI, & ! Hallett Mossop for snow and graupel
                                                               PRICIBU, &  ! Collisional ice breakup
                                                               PRIRDSF, &  ! Raindrop shattering by freezing
                                                               PRCCORR2, PRRCORR2, PRICORR2 ! Correction inside LIMA splitting
! microphysics rates related to hail (krr == 7, lhail = .t.)
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRWETGH, &  ! Conversion of graupel into hail
                                                               PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & ! Dry growth of hail
                                                               PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, & ! Wet growth of hail
                                                               PRHMLTR, &                                     ! Melting of hail  
                                                               PRDRYHG     ! Conversion of hail into graupel
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCCT   ! Cloud droplets conc. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCRT   ! Raindrops conc. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCST   ! Snow conc. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCGT   ! Graupel conc. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCHT   ! Hail conc. at t
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRHT   ! Hail m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS   ! Hail m.r. source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PQHT   ! Hail charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PQHS   ! Hail charge source
!
END SUBROUTINE ELEC_TENDENCIES
END INTERFACE
END MODULE MODI_ELEC_TENDENCIES
!
!
!     #########################################################################################
      SUBROUTINE ELEC_TENDENCIES (D, KRR, KMICRO, PTSTEP, ODMICRO,                            &
                                  PRHODREF, PRHODJ, PZT, PCIT,                                &
                                  PRVT, PRCT, PRRT, PRIT, PRST, PRGT,                         &
                                  PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT,                 &
                                  PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS,                 &
                                  PRVHENI, PRRHONG, PRIMLTC,                                  &
                                  PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG,                &
                                  PRCAUTR, PRCACCR, PRREVAV,                                  &
                                  PRCRIMSS, PRCRIMSG, PRSRIMCG, PRRACCSS, PRRACCSG, PRSACCRG, &
                                  PRSMLTG, PRICFRRG, PRRCFRIG,                                &
                                  PRCWETG, PRIWETG, PRRWETG, PRSWETG,                         &
                                  PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG,                         &
                                  PRGMLTR, PRCBERI,                                           & 
                                  PRCMLTSR, PRICFRR,                                          & !- opt. param. for ICE3 
                                  PCCT, PCRT, PCST, PCGT,                                     & !-- optional
                                  PRVHENC, PRCHINC, PRVHONH,                                  & !| parameters 
                                  PRRCVRC, PRICNVI, PRVDEPI, PRSHMSI, PRGHMGI,                & !|    for
                                  PRICIBU, PRIRDSF,                                           & !|    LIMA
                                  PRCCORR2, PRRCORR2, PRICORR2,                               & !--
                                  PRWETGH, PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH,       & !--  optional
                                  PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH,                & !|  parameters
                                  PRHMLTR, PRDRYHG,                                           & !|     for
                                  PRHT, PRHS, PCHT, PQHT, PQHS)                                 !--    hail
!     ##########################################################################################
!
!!****  * - compute the explicit cloud electrification sources
!!
!!    This routine is adapted from rain_ice_elec.f90.
!!    To avoid duplicated routines, the cloud electrification routine is now called 
!!    at the end of the microphysics scheme but needs the microphysical tendencies as arguments.
!!    The sedimentation source for electric charges is treated separately.
!!
!!    AUTHOR
!!    ------
!!      C. Barthe    * LAERO *
!!
!!    MODIFICATIONS
!!    -------------
!!      Original    February 2022
!!
!!      Modifications
!! C. Barthe   12/04/2022   include electrification from LIMA
!! C. Barthe   22/03/2023   5-6: take into account news from LIMA (Ns, Ng, Nh, CIBU and RDSF) and PHYEX
!! C. Barthe   13/07/2023   5-6: Ns, Ng and Nh can be pronostic variables (LIMA2)
!! C. Barthe   22/11/2023   initialize Nx to 0 when 1-moment
!!
!------------------------------------------------------------------
!
!*      0.    DECLARATIONS
!             ------------
!
use modd_budget,          only: lbu_enable,                                                 &
                                lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, &
                                lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv,             &
                                NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, &
                                NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1,            &
                                tbudgets
!
USE MODD_CONF
USE MODD_CST
USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
USE MODD_ELEC_DESCR
USE MODD_ELEC_n
USE MODD_ELEC_PARAM
USE MODD_LES
USE MODE_ll
USE MODD_NSV,              ONLY: NSV_ELECBEG, NSV_ELECEND ! Scalar variables for budgets
USE MODD_PARAMETERS
USE MODD_PARAM_LIMA,       ONLY: XALPHAI_L=>XALPHAI, XNUI_L=>XNUI,   &
                                 XCEXVT_L=>XCEXVT, XRTMIN_L=>XRTMIN, &
                                 LCIBU, LRDSF,                       &
                                 NMOM_C, NMOM_R, NMOM_I, NMOM_S, NMOM_G, NMOM_H
USE MODD_PARAM_LIMA_COLD,  ONLY: XAI_L=>XAI, XBI_L=>XBI,   &
                                 XDS_L=>XDS, XCXS_L=>XCXS, &
                                 XCOLEXIS_L=>XCOLEXIS
USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG, XCXG_L=>XCXG,                           &
                                 XCOLIG_L=>XCOLIG, XCOLEXIG_L=>XCOLEXIG,             &
                                 XCOLSG_L=>XCOLSG, XCOLEXSG_L=>XCOLEXSG,             &
                                 NGAMINC_L=>NGAMINC,                                 &
                                 NACCLBDAR_L=>NACCLBDAR, NACCLBDAS_L=>NACCLBDAS,     &
                                 XACCINTP1S_L=>XACCINTP1S, XACCINTP2S_L=>XACCINTP2S, &
                                 XACCINTP1R_L=>XACCINTP1R, XACCINTP2R_L=>XACCINTP2R, &
                                 NDRYLBDAR_L=>NDRYLBDAR, NDRYLBDAS_L=>NDRYLBDAS,     &
                                 NDRYLBDAG_L=>NDRYLBDAG,                             &
                                 XDRYINTP1R_L=>XDRYINTP1R, XDRYINTP2R_L=>XDRYINTP2R, &
                                 XDRYINTP1S_L=>XDRYINTP1S, XDRYINTP2S_L=>XDRYINTP2S, &
                                 XDRYINTP1G_L=>XDRYINTP1G, XDRYINTP2G_L=>XDRYINTP2G, &
                                 XRIMINTP1_L=>XRIMINTP1,   XRIMINTP2_L=>XRIMINTP2

USE MODD_PARAM_n,         ONLY: CCLOUD
USE MODD_RAIN_ICE_DESCR_n,ONLY: XCEXVT_I=>XCEXVT, XRTMIN_I=>XRTMIN,                       &
                                XALPHAI_I=>XALPHAI, XNUI_I=>XNUI, XAI_I=>XAI, XBI_I=>XBI, &
                                XDS_I=>XDS, XDG_I=>XDG,                                   &
                                XCXS_I=>XCXS, XCXG_I=>XCXG
USE MODD_RAIN_ICE_PARAM_n,ONLY: XCOLIS_I=>XCOLIS, XCOLEXIS_I=>XCOLEXIS,             &
                                XCOLIG_I=>XCOLIG, XCOLEXIG_I=>XCOLEXIG,             &
                                XCOLSG_I=>XCOLSG, XCOLEXSG_I=>XCOLEXSG,             &
                                NGAMINC_I=>NGAMINC,                                 &                                
                                NACCLBDAR_I=>NACCLBDAR, NACCLBDAS_I=>NACCLBDAS,     &
                                XACCINTP1S_I=>XACCINTP1S, XACCINTP2S_I=>XACCINTP2S, &
                                XACCINTP1R_I=>XACCINTP1R, XACCINTP2R_I=>XACCINTP2R, &
                                NDRYLBDAR_I=>NDRYLBDAR, NDRYLBDAS_I=>NDRYLBDAS,     &
                                NDRYLBDAG_I=>NDRYLBDAG,                             &
                                XDRYINTP1R_I=>XDRYINTP1R, XDRYINTP2R_I=>XDRYINTP2R, &
                                XDRYINTP1S_I=>XDRYINTP1S, XDRYINTP2S_I=>XDRYINTP2S, &
                                XDRYINTP1G_I=>XDRYINTP1G, XDRYINTP2G_I=>XDRYINTP2G, &
                                XRIMINTP1_I=>XRIMINTP1,   XRIMINTP2_I=>XRIMINTP2
USE MODD_REF,             ONLY: XTHVREFZ
!
#ifdef MNH_PGI
USE MODE_PACK_PGI
#endif
use mode_tools,           only: Countjv
use mode_budget,          only: Budget_store_add, Budget_store_init, Budget_store_end
!
USE MODI_COMPUTE_LAMBDA
USE MODI_ELEC_COMPUTE_EX
USE MODI_MOMG
!
IMPLICIT NONE
!
!
!*      0.1   Declaration of dummy arguments
!
TYPE(DIMPHYEX_t),                     INTENT(IN)    :: D
!
INTEGER,                              INTENT(IN)    :: KMICRO
REAL,                                 INTENT(IN)    :: PTSTEP  ! Double Time step
                                                               ! (single if cold start)
INTEGER,                              INTENT(IN)    :: KRR     ! Number of moist variable
!
LOGICAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)   :: ODMICRO ! mask to limit computation
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRHODREF! Reference density
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PZT     ! Temperature (K)
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PCIT    ! Pristine ice n.c. at t
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRCT    ! Cloud water m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRRT    ! Rain water m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRIT    ! Pristine ice m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRST    ! Snow/aggregate m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRGT    ! Graupel/hail m.r. at t
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQPIT   ! Positive ion (Nb/kg) at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQNIT   ! Negative ion (Nb/kg) at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQCT    ! Cloud water charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQRT    ! Raindrops charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQIT    ! Pristine ice charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQST    ! Snow/aggregates charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PQGT    ! Graupel charge at t
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQPIS   ! Positive ion (Nb/kg) source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQNIS   ! Negative ion (Nb/kg) source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQCS    ! Cloud water charge source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQRS    ! Raindrops charge source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQIS    ! Pristine ice charge source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQSS    ! Snow/aggregates charge source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(INOUT) :: PQGS    ! Graupel charge source
!
! microphysics rates common to ICE3 and LIMA
REAL, DIMENSION(D%NIT,D%NJT,D%NKT),   INTENT(IN)    :: PRVHENI, &  ! heterogeneous nucleation mixing ratio change (HIND for LIMA)
                                                       PRCHONI, &  ! Homogeneous nucleation
                                                       PRRHONG, &  ! Spontaneous freezing mixing ratio change
                                                       PRVDEPS, &  ! Deposition on r_s,
                                                       PRIAGGS, &  ! Aggregation on r_s
                                                       PRIAUTS, &  ! Autoconversion of r_i for r_s production (CNVS for LIMA)
                                                       PRVDEPG, &  ! Deposition on r_g
                                                       PRCAUTR, &  ! Autoconversion of r_c for r_r production
                                                       PRCACCR, &  ! Accretion of r_c for r_r production
                                                       PRREVAV, &  ! Evaporation of r_r
                                                       PRIMLTC, &  ! Cloud ice melting mixing ratio change
                                                       PRCBERI, &  ! Bergeron-Findeisen effect
                                                       PRSMLTG, &  ! Conversion-Melting of the aggregates
                                                       PRRACCSS, PRRACCSG, PRSACCRG, & ! Rain accretion onto the aggregates
                                                       PRCRIMSS, PRCRIMSG, PRSRIMCG, & ! Cloud droplet riming of the aggregates
                                                       PRICFRRG, PRRCFRIG,           & ! Rain contact freezing
                                                       PRCWETG, PRIWETG, PRRWETG, PRSWETG, &  ! Graupel wet growth
                                                       PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, &  ! Graupel dry growth
                                                       PRGMLTR     ! Melting of the graupel
! microphysics rates specific to ICE3 (knmoments==1)
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRCMLTSR,&  ! Cld droplet collection onto aggregates by pos. temp.
                                                               PRICFRR     ! Rain contact freezing (part of ice crystals converted to rain)
! microphysics rates specific to LIMA (knmoments==2)
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRVHENC, &  ! Cld droplet formation
                                                               PRCHINC, &  ! Heterogeneous nucleation of coated IFN
                                                               PRVHONH, &  ! Nucleation of haze
                                                               PRRCVRC, &  ! Conversion of small drops into droplets
                                                               PRICNVI, &  ! Conversion snow --> ice
                                                               PRVDEPI, &  ! Deposition on r_i
                                                               PRSHMSI, PRGHMGI, & ! Hallett Mossop for snow and graupel
                                                               PRICIBU, &  ! Collisional ice breakup
                                                               PRIRDSF, &  ! Raindrop shattering by freezing
                                                               PRCCORR2, PRRCORR2, PRICORR2 ! Correction inside LIMA splitting
! microphysics rates related to hail (krr == 7, lhail = .t.)
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRWETGH, &  ! Conversion of graupel into hail
                                                               PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & ! Dry growth of hail
                                                               PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, & ! Wet growth of hail
                                                               PRHMLTR, &                                     ! Melting of hail  
                                                               PRDRYHG     ! Conversion of hail into graupel
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCCT   ! Cloud droplets conc. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCRT   ! Raindrops conc. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCST   ! Snow conc. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCGT   ! Graupel conc. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PCHT   ! Hail conc. at t
!
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRHT   ! Hail m.r. at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS   ! Hail m.r. source
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PQHT   ! Hail charge at t
REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PQHS   ! Hail charge source
!
!
!*      0.2   Declaration of local variables    
!
INTEGER :: II, JJ, JL     ! Loop indexes
INTEGER :: IIB, IIE, &    ! Define the domain
           IJB, IJE, &    ! where the microphysical sources
           IKB, IKE       ! must be computed
INTEGER                    :: IMICRO   ! nb of pts where r_x > 0
INTEGER, DIMENSION(KMICRO) :: I1
INTEGER, DIMENSION(KMICRO) :: II1, II2, II3
!
LOGICAL, DIMENSION(KMICRO) :: GMASK    !          Mask 
!REAL,    DIMENSION(KMICRO) :: ZMASK    !       to reduce
INTEGER                    :: IGMASK   ! the computation domain
!
REAL, DIMENSION(KMICRO) :: ZRHODREF  ! Reference density
REAL, DIMENSION(KMICRO) :: ZRHODJ    ! RHO times Jacobian
REAL, DIMENSION(KMICRO) :: ZZT     ! Temperature
!
REAL, DIMENSION(KMICRO) :: ZRVT    ! Water vapor m.r. at t 
REAL, DIMENSION(KMICRO) :: ZRCT    ! Cloud water m.r. at t 
REAL, DIMENSION(KMICRO) :: ZRRT    ! Rain water m.r. at t 
REAL, DIMENSION(KMICRO) :: ZRIT    ! Pristine ice m.r. at t
REAL, DIMENSION(KMICRO) :: ZRST    ! Snow/aggregate m.r. at t
REAL, DIMENSION(KMICRO) :: ZRGT    ! Graupel m.r. at t
REAL, DIMENSION(KMICRO) :: ZRHT    ! Hail m.r. at t
REAL, DIMENSION(KMICRO) :: ZCCT    ! Cloud water conc. at t
REAL, DIMENSION(KMICRO) :: ZCRT    ! Raindrops conc. at t
REAL, DIMENSION(KMICRO) :: ZCIT    ! Pristine ice conc. at t
REAL, DIMENSION(KMICRO) :: ZCST    ! Snow/aggregate conc. at t
REAL, DIMENSION(KMICRO) :: ZCGT    ! Graupel conc. at t
REAL, DIMENSION(KMICRO) :: ZCHT    ! Hail conc. at t
!
REAL, DIMENSION(KMICRO) :: ZQPIT   ! Positive ion (/kg) at t
REAL, DIMENSION(KMICRO) :: ZQNIT   ! Negative ion (/kg) at t
REAL, DIMENSION(KMICRO) :: ZQCT    ! Cloud water charge at t
REAL, DIMENSION(KMICRO) :: ZQRT    ! Raindrops charge at t
REAL, DIMENSION(KMICRO) :: ZQIT    ! Pristine ice charge at t
REAL, DIMENSION(KMICRO) :: ZQST    ! Snow/aggregate charge at t
REAL, DIMENSION(KMICRO) :: ZQGT    ! Graupel charge at t
REAL, DIMENSION(KMICRO) :: ZQHT    ! Hail charge at t
!
REAL, DIMENSION(KMICRO) :: ZQPIS   ! Positive ion (/kg) source
REAL, DIMENSION(KMICRO) :: ZQNIS   ! Negative ion (/kg) source
REAL, DIMENSION(KMICRO) :: ZQCS    ! Cloud water charge source
REAL, DIMENSION(KMICRO) :: ZQRS    ! Raindrops charge source
REAL, DIMENSION(KMICRO) :: ZQIS    ! Pristine ice charge source
REAL, DIMENSION(KMICRO) :: ZQSS    ! Snow/aggregate charge source
REAL, DIMENSION(KMICRO) :: ZQGS    ! Graupel charge source
REAL, DIMENSION(KMICRO) :: ZQHS    ! Hail charge source
!
REAL, DIMENSION(KMICRO) :: ZLBDAC  ! Slope parameter of the droplets distribution
REAL, DIMENSION(KMICRO) :: ZLBDAR  ! Slope parameter of the raindrop distribution
REAL, DIMENSION(KMICRO) :: ZLBDAI  ! Slope parameter of the pristine ice distribution
REAL, DIMENSION(KMICRO) :: ZLBDAS  ! Slope parameter of the aggregate distribution
REAL, DIMENSION(KMICRO) :: ZLBDAG  ! Slope parameter of the graupel distribution
REAL, DIMENSION(KMICRO) :: ZLBDAH  ! Slope parameter of the hail distribution
!
REAL, DIMENSION(KMICRO) :: ZECT    !
REAL, DIMENSION(KMICRO) :: ZERT    !     e_x coef
REAL, DIMENSION(KMICRO) :: ZEIT    !      in the 
REAL, DIMENSION(KMICRO) :: ZEST    ! q_x - D_x relation
REAL, DIMENSION(KMICRO) :: ZEGT    !
REAL, DIMENSION(KMICRO) :: ZEHT    !
!
LOGICAL, DIMENSION(KMICRO,4) :: GELEC  ! Mask for non-inductive charging
!
REAL, DIMENSION(:), ALLOCATABLE :: ZDQ, ZDQ_IS, ZDQ_IG, ZDQ_SG
!
! Non-inductive charging process following Gardiner et al. (1995)
REAL, DIMENSION(:), ALLOCATABLE :: ZDELTALWC ! Gap between LWC and a critical LWC
REAL, DIMENSION(:), ALLOCATABLE :: ZFT       ! Fct depending on temperature
!
! Non-inductive charging process following Saunders et al. (1991) / EW
REAL, DIMENSION(:), ALLOCATABLE :: ZEW      ! Effective liquid water content
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSK  ! constant B 
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIM  !  d_i exponent
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIN  !  v_g/s-v_i
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSM  !  d_s exponent
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSN  !  v_g-v_s
REAL, DIMENSION(:), ALLOCATABLE :: ZFQIAGGS, ZFQIDRYGBS
REAL, DIMENSION(:), ALLOCATABLE :: ZLBQSDRYGB1S, ZLBQSDRYGB2S, ZLBQSDRYGB3S
!
! Non-inductive charging process following Saunders and Peck (1998) / RAR
REAL, DIMENSION(:), ALLOCATABLE :: ZRAR        ! Rime accretion rate
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIM_IS  !  d_i exponent
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIN_IS  !  v_g/s-v_i
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIM_IG  !  d_i exponent
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIN_IG  !  v_g/s-v_i
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSK_SG  ! constant B 
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSM_SG  !  d_s exponent
REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSN_SG  !  v_g-v_s
!
! Inductive charging process (Ziegler et al., 1991)
REAL, DIMENSION(:), ALLOCATABLE :: ZEFIELDW  ! Vertical component of the electric field
!
REAL, DIMENSION(KMICRO) :: ZLIMIT   ! Used to limit the charge separated during NI process 
REAL, DIMENSION(KMICRO) :: ZQCOLIS  ! Collection efficiency between ice and snow
REAL, DIMENSION(KMICRO) :: ZQCOLIG  ! Collection efficiency between ice and graupeln
REAL, DIMENSION(KMICRO) :: ZQCOLSG  ! Collection efficiency between snow and graupeln
!
REAL                    :: ZRHO00, ZCOR00   ! Surface reference air density
REAL, DIMENSION(KMICRO) :: ZRHOCOR  ! Density correction for fallspeed
!
INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1, IVEC2                   ! Vectors of indices for interpolation
REAL,    DIMENSION(:), ALLOCATABLE :: ZVEC1, ZVEC2, ZVEC3            ! Work vectors for interpolation
REAL,    DIMENSION(:), ALLOCATABLE :: ZVECQ1, ZVECQ2, ZVECQ3, ZVECQ4 ! Work vectors for interpolation
!
REAL,    DIMENSION(KMICRO)   :: ZWQ, ZWQ_NI                    !  Work arrays
REAL,    DIMENSION(KMICRO)   :: ZWQ1, ZWQ2, ZWQ3, ZWQ4         !      for 
REAL,    DIMENSION(KMICRO,9) :: ZWQ5                           ! charge transfer
!
! variables used to select between common parameters between ICEx and LIMA
INTEGER :: IMOM_C, IMOM_R, IMOM_I, IMOM_S, IMOM_G, IMOM_H ! number of moments for each hydrometeor
INTEGER :: IGAMINC,              &
           IACCLBDAR, IACCLBDAS, &
           IDRYLBDAR, IDRYLBDAS, IDRYLBDAG
!
REAL    :: ZCEXVT,                                               &
           ZALPHAI, ZNUI, ZAI, ZBI, ZDS, ZDG, ZCXS, ZCXG,        &
           ZCOLIS, ZCOLEXIS, ZCOLIG, ZCOLEXIG, ZCOLSG, ZCOLEXSG, &
           ZACCINTP1S, ZACCINTP2S, ZACCINTP1R, ZACCINTP2R,       &
           ZDRYINTP1R, ZDRYINTP2R, ZDRYINTP1S, ZDRYINTP2S,       &
           ZDRYINTP1G, ZDRYINTP2G,                               &
           ZRIMINTP1,  ZRIMINTP2
REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN
!
! microphysical tendencies have to be transformed in 1D arrays
REAL, DIMENSION(KMICRO) :: ZRVHENI, ZRCHONI, ZRRHONG, ZRVDEPS, ZRIAGGS,      &
                           ZRIAUTS, ZRVDEPG, ZRCAUTR, ZRCACCR, ZRREVAV,      &
                           ZRIMLTC, ZRCBERI, ZRSMLTG, ZRRACCSS, ZRRACCSG,    &
                           ZRSACCRG, ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRICFRRG, &
                           ZRRCFRIG, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG,     &
                           ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, ZRGMLTR
! optional microphysical tendencies
REAL, DIMENSION(:), ALLOCATABLE :: ZRCMLTSR, ZRICFRR, ZRVHENC, ZRCHINC, ZRVHONH,     &
                                   ZRRCVRC, ZRICNVI, ZRVDEPI, ZRSHMSI, ZRGHMGI,      &
                                   ZRICIBU, ZRIRDSF, ZRCCORR2, ZRRCORR2, ZRICORR2,   &
                                   ZRWETGH, ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH,      &
                                   ZRRWETH, ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH,      &
                                   ZRGDRYH, ZRHMLTR, ZRDRYHG 
!
!------------------------------------------------------------------
!
!*      1.    INITIALIZATIONS
!             ---------------
!
!*      1.1   compute the loop bounds
!
IIB = D%NIB
IIE = D%NIE
IJB = D%NJB
IJE = D%NJE
IKB = D%NKB
IKE = D%NKE
!
!
!*      1.2   select parameters between ICEx and LIMA
!
IF (CCLOUD(1:3) == 'ICE') THEN
  ZCEXVT = XCEXVT_I
  IMOM_C = 1
  IMOM_R = 1
  IMOM_I = 2 ! Ni is diagnostic and always available
  IMOM_S = 1
  IMOM_G = 1
  IF (KRR == 7) THEN
    IMOM_H = 1
  ELSE
    IMOM_H = 0
  END IF
ELSE IF (CCLOUD == 'LIMA') THEN
  ZCEXVT = XCEXVT_L
  IMOM_C = NMOM_C
  IMOM_R = NMOM_R
  IMOM_I = 2 ! Ni is diagnostic and always available
  IMOM_S = NMOM_S
  IMOM_G = NMOM_G
  IMOM_H = NMOM_H
END IF
!
ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB))
ZCOR00 = ZRHO00**ZCEXVT
!
IF (LINDUCTIVE) ALLOCATE (ZEFIELDW(KMICRO))
!
!
!*      1.3   packing
!
!  optimization by looking for locations where
!  the microphysical fields are larger than a minimal value only !!!
!
IF (KMICRO >= 0) THEN
  IMICRO = COUNTJV(ODMICRO(:,:,:), II1(:), II2(:), II3(:))
  !
  ! some microphysical tendencies are optional: the corresponding 1D arrays must be allocated
  IF (CCLOUD(1:3) == 'ICE') THEN  ! ICE3 scheme
    ALLOCATE(ZRCMLTSR(IMICRO))
    ALLOCATE(ZRICFRR(IMICRO))
  END IF
  IF (CCLOUD == 'LIMA') THEN  ! LIMA scheme
    ALLOCATE(ZRVHENC(IMICRO))
    ALLOCATE(ZRCHINC(IMICRO))
    ALLOCATE(ZRVHONH(IMICRO))
    ALLOCATE(ZRRCVRC(IMICRO))
    ALLOCATE(ZRICNVI(IMICRO))
    ALLOCATE(ZRVDEPI(IMICRO))
    ALLOCATE(ZRSHMSI(IMICRO))
    ALLOCATE(ZRGHMGI(IMICRO))
    ALLOCATE(ZRICIBU(IMICRO))
    ALLOCATE(ZRIRDSF(IMICRO))
    ALLOCATE(ZRCCORR2(IMICRO))
    ALLOCATE(ZRRCORR2(IMICRO))
    ALLOCATE(ZRICORR2(IMICRO))
  END IF
  IF (KRR == 7) THEN ! hail activated
    ALLOCATE(ZRWETGH(IMICRO))
    ALLOCATE(ZRCWETH(IMICRO))
    ALLOCATE(ZRIWETH(IMICRO))
    ALLOCATE(ZRSWETH(IMICRO))
    ALLOCATE(ZRGWETH(IMICRO))
    ALLOCATE(ZRRWETH(IMICRO))
    ALLOCATE(ZRCDRYH(IMICRO))
    ALLOCATE(ZRRDRYH(IMICRO))
    ALLOCATE(ZRIDRYH(IMICRO))
    ALLOCATE(ZRSDRYH(IMICRO))
    ALLOCATE(ZRGDRYH(IMICRO))
    ALLOCATE(ZRHMLTR(IMICRO))
    ALLOCATE(ZRDRYHG(IMICRO))
  END IF
  !
  DO JL = 1, IMICRO
    ZZT(JL)      = PZT(II1(JL),II2(JL),II3(JL))
    ZRHODREF(JL) = PRHODREF(II1(JL),II2(JL),II3(JL))
    ZRHOCOR(JL)  = (ZRHO00 / ZRHODREF(JL))**ZCEXVT
    ZRHODJ(JL)   = PRHODJ(II1(JL),II2(JL),II3(JL))
    !
    ZCIT(JL)     = PCIT(II1(JL),II2(JL),II3(JL))
    IF (IMOM_C == 2) ZCCT(JL) = PCCT(II1(JL),II2(JL),II3(JL))
    IF (IMOM_R == 2) ZCRT(JL) = PCRT(II1(JL),II2(JL),II3(JL))
    IF (IMOM_S == 2) ZCST(JL) = PCST(II1(JL),II2(JL),II3(JL))
    IF (IMOM_G == 2) ZCGT(JL) = PCGT(II1(JL),II2(JL),II3(JL))
    IF (IMOM_H == 2) ZCHT(JL) = PCHT(II1(JL),II2(JL),II3(JL))
    IF (IMOM_C == 1) ZCCT(JL) = 0.
    IF (IMOM_R == 1) ZCRT(JL) = 0.
    IF (IMOM_S == 1) ZCST(JL) = 0.
    IF (IMOM_G == 1) ZCGT(JL) = 0.
    IF (IMOM_H == 1) ZCHT(JL) = 0.
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
    !
    ZRVT(JL)  = PRVT(II1(JL),II2(JL),II3(JL))
    ZRCT(JL)  = PRCT(II1(JL),II2(JL),II3(JL))
    ZRRT(JL)  = PRRT(II1(JL),II2(JL),II3(JL))
    ZRIT(JL)  = PRIT(II1(JL),II2(JL),II3(JL))
    ZRST(JL)  = PRST(II1(JL),II2(JL),II3(JL))
    ZRGT(JL)  = PRGT(II1(JL),II2(JL),II3(JL))
    IF (KRR == 7) ZRHT(JL) = PRHT(II1(JL),II2(JL),II3(JL))
    !
    ZQPIT(JL) = PQPIT(II1(JL),II2(JL),II3(JL))
    ZQNIT(JL) = PQNIT(II1(JL),II2(JL),II3(JL))
    ZQCT(JL)  = PQCT(II1(JL),II2(JL),II3(JL))
    ZQRT(JL)  = PQRT(II1(JL),II2(JL),II3(JL))
    ZQIT(JL)  = PQIT(II1(JL),II2(JL),II3(JL))
    ZQST(JL)  = PQST(II1(JL),II2(JL),II3(JL))
    ZQGT(JL)  = PQGT(II1(JL),II2(JL),II3(JL))
    IF (KRR == 7) ZQHT(JL) = PQHT(II1(JL),II2(JL),II3(JL))
    !
    ZQPIS(JL) = PQPIS(II1(JL), II2(JL), II3(JL))
    ZQNIS(JL) = PQNIS(II1(JL), II2(JL), II3(JL))
    ZQCS(JL)  = PQCS(II1(JL), II2(JL), II3(JL))
    ZQRS(JL)  = PQRS(II1(JL), II2(JL), II3(JL))
    ZQIS(JL)  = PQIS(II1(JL), II2(JL), II3(JL))
    ZQSS(JL)  = PQSS(II1(JL), II2(JL), II3(JL))
    ZQGS(JL)  = PQGS(II1(JL), II2(JL), II3(JL))
    IF (KRR == 7) ZQHS(JL) = PQHS(II1(JL), II2(JL), II3(JL))
    !
    IF (LINDUCTIVE) ZEFIELDW(JL) = XEFIELDW(II1(JL), II2(JL), II3(JL))
    !
    ! microphysical tendencies
    ZRVHENI(JL) = PRVHENI(II1(JL), II2(JL), II3(JL))
    ZRRHONG(JL) = PRRHONG(II1(JL), II2(JL), II3(JL))
    ZRIMLTC(JL) = PRIMLTC(II1(JL), II2(JL), II3(JL))
    ZRCHONI(JL) = PRCHONI(II1(JL), II2(JL), II3(JL))
    ZRVDEPS(JL) = PRVDEPS(II1(JL), II2(JL), II3(JL))
    ZRIAGGS(JL) = PRIAGGS(II1(JL), II2(JL), II3(JL))
    ZRIAUTS(JL) = PRIAUTS(II1(JL), II2(JL), II3(JL))
    ZRVDEPG(JL) = PRVDEPG(II1(JL), II2(JL), II3(JL))
    ZRCAUTR(JL) = PRCAUTR(II1(JL), II2(JL), II3(JL))
    ZRCACCR(JL) = PRCACCR(II1(JL), II2(JL), II3(JL))
    ZRREVAV(JL) = PRREVAV(II1(JL), II2(JL), II3(JL))
    ZRCRIMSS(JL) = PRCRIMSS(II1(JL), II2(JL), II3(JL))
    ZRCRIMSG(JL) = PRCRIMSG(II1(JL), II2(JL), II3(JL))
    ZRSRIMCG(JL) = PRSRIMCG(II1(JL), II2(JL), II3(JL))
    ZRRACCSS(JL) = PRRACCSS(II1(JL), II2(JL), II3(JL))
    ZRRACCSG(JL) = PRRACCSG(II1(JL), II2(JL), II3(JL))
    ZRSACCRG(JL) = PRSACCRG(II1(JL), II2(JL), II3(JL))
    ZRSMLTG(JL) = PRSMLTG(II1(JL), II2(JL), II3(JL))
    ZRICFRRG(JL) = PRICFRRG(II1(JL), II2(JL), II3(JL))
    ZRRCFRIG(JL) = PRRCFRIG(II1(JL), II2(JL), II3(JL))
    ZRCWETG(JL) = PRCWETG(II1(JL), II2(JL), II3(JL))
    ZRIWETG(JL) = PRIWETG(II1(JL), II2(JL), II3(JL))
    ZRRWETG(JL) = PRRWETG(II1(JL), II2(JL), II3(JL))
    ZRSWETG(JL) = PRSWETG(II1(JL), II2(JL), II3(JL))
    ZRCDRYG(JL) = PRCDRYG(II1(JL), II2(JL), II3(JL))
    ZRIDRYG(JL) = PRIDRYG(II1(JL), II2(JL), II3(JL))
    ZRRDRYG(JL) = PRRDRYG(II1(JL), II2(JL), II3(JL))
    ZRSDRYG(JL) = PRSDRYG(II1(JL), II2(JL), II3(JL))
    ZRGMLTR(JL) = PRGMLTR(II1(JL), II2(JL), II3(JL))
    ZRCBERI(JL) = PRCBERI(II1(JL), II2(JL), II3(JL))
    IF (CCLOUD(1:3) == 'ICE') THEN
      ZRCMLTSR(JL) = PRCMLTSR(II1(JL), II2(JL), II3(JL))
      ZRICFRR(JL)  = PRICFRR(II1(JL), II2(JL), II3(JL))
    END IF
    IF (CCLOUD == 'LIMA') THEN
      ZCST(JL)    = PCST(II1(JL), II2(JL), II3(JL))
      ZCGT(JL)    = PCGT(II1(JL), II2(JL), II3(JL))
      ZRVHENC(JL) = PRVHENC(II1(JL), II2(JL), II3(JL))
      ZRCHINC(JL) = PRCHINC(II1(JL), II2(JL), II3(JL))
      ZRVHONH(JL) = PRVHONH(II1(JL), II2(JL), II3(JL))
      ZRRCVRC(JL) = PRRCVRC(II1(JL), II2(JL), II3(JL))
      ZRICNVI(JL) = PRICNVI(II1(JL), II2(JL), II3(JL))
      ZRVDEPI(JL) = PRVDEPI(II1(JL), II2(JL), II3(JL))
      ZRSHMSI(JL) = PRSHMSI(II1(JL), II2(JL), II3(JL))
      ZRGHMGI(JL) = PRGHMGI(II1(JL), II2(JL), II3(JL))
      ZRICIBU(JL) = PRICIBU(II1(JL), II2(JL), II3(JL))
      ZRIRDSF(JL) = PRIRDSF(II1(JL), II2(JL), II3(JL))
      ZRCCORR2(JL) = PRCCORR2(II1(JL), II2(JL), II3(JL))
      ZRRCORR2(JL) = PRRCORR2(II1(JL), II2(JL), II3(JL))
      ZRICORR2(JL) = PRICORR2(II1(JL), II2(JL), II3(JL))
    END IF
    IF (KRR == 7) THEN
      ZCHT(JL)    = PCHT(II1(JL), II2(JL), II3(JL))
      ZRWETGH(JL) = PRWETGH(II1(JL), II2(JL), II3(JL))
      ZRCWETH(JL) = PRCWETH(II1(JL), II2(JL), II3(JL))
      ZRIWETH(JL) = PRIWETH(II1(JL), II2(JL), II3(JL))
      ZRSWETH(JL) = PRSWETH(II1(JL), II2(JL), II3(JL))
      ZRGWETH(JL) = PRGWETH(II1(JL), II2(JL), II3(JL))
      ZRRWETH(JL) = PRRWETH(II1(JL), II2(JL), II3(JL))
      ZRCDRYH(JL) = PRCDRYH(II1(JL), II2(JL), II3(JL))
      ZRRDRYH(JL) = PRRDRYH(II1(JL), II2(JL), II3(JL))
      ZRIDRYH(JL) = PRIDRYH(II1(JL), II2(JL), II3(JL))
      ZRSDRYH(JL) = PRSDRYH(II1(JL), II2(JL), II3(JL))
      ZRGDRYH(JL) = PRGDRYH(II1(JL), II2(JL), II3(JL))
      ZRHMLTR(JL) = PRHMLTR(II1(JL), II2(JL), II3(JL))
      ZRDRYHG(JL) = PRDRYHG(II1(JL), II2(JL), II3(JL))
    END IF
  END DO
  !
  ZRHOCOR(:) = (ZRHO00 / ZRHODREF(:))**ZCEXVT
!
!
!*      1.4   allocations for the non-inductive parameterizations
!
  IF (CNI_CHARGING == 'GARDI') THEN
    ALLOCATE( ZDELTALWC(KMICRO) )
    ALLOCATE( ZFT(KMICRO) )
  END IF
!
  IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. &
      CNI_CHARGING == 'TAKAH' .OR.                              &
      CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. &
      CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN
    ALLOCATE( ZEW(KMICRO) )
  END IF
!
  IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. &
      CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'TEEWC') THEN
    ALLOCATE( ZDQ(KMICRO) )
  END IF
!
  IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. &
      CNI_CHARGING == 'TEEWC' )  THEN
    ALLOCATE( ZSAUNSK(KMICRO) )
    ALLOCATE( ZSAUNIM(KMICRO) )
    ALLOCATE( ZSAUNIN(KMICRO) )
    ALLOCATE( ZSAUNSM(KMICRO) )
    ALLOCATE( ZSAUNSN(KMICRO) )
  END IF
!
  IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. &
      CNI_CHARGING == 'SAP98' .OR.                              &
      CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. &
      CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN
    ALLOCATE( ZFQIAGGS(KMICRO) )
    ALLOCATE( ZFQIDRYGBS(KMICRO) )
    ALLOCATE( ZLBQSDRYGB1S(KMICRO) )
    ALLOCATE( ZLBQSDRYGB2S(KMICRO) )
    ALLOCATE( ZLBQSDRYGB3S(KMICRO) )
  END IF
!
  IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'TERAR' .OR. &
      CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN
    ALLOCATE( ZRAR(KMICRO) )
    ALLOCATE( ZDQ_IS(KMICRO) )
    ALLOCATE( ZDQ_IG(KMICRO) )
    ALLOCATE( ZDQ_SG(KMICRO) )
    ALLOCATE( ZSAUNIM_IS(KMICRO) )
    ALLOCATE( ZSAUNIN_IS(KMICRO) )
    ALLOCATE( ZSAUNIM_IG(KMICRO) )
    ALLOCATE( ZSAUNIN_IG(KMICRO) )
    ALLOCATE( ZSAUNSK_SG(KMICRO) )
    ALLOCATE( ZSAUNSM_SG(KMICRO) )
    ALLOCATE( ZSAUNSN_SG(KMICRO) )
  END IF
!
!
!*      1.5   select parameters between ICEx and LIMA
!
  ALLOCATE(ZRTMIN(KRR))
  IF (CCLOUD(1:3) == 'ICE') THEN
! in ini_rain_ice, xrtmin is initialized with dimension 6 (hail not activated) or 7 (hail activated)
    ZRTMIN(1:KRR) = XRTMIN_I(1:KRR)
    !
    ZALPHAI = XALPHAI_I
    ZNUI = XNUI_I
    ZAI = XAI_I
    ZBI = XBI_I
    ZDS = XDS_I
    ZDG = XDG_I
    ZCXS = XCXS_I
    ZCXG = XCXG_I
    !
    ZCOLIS   = XCOLIS_I
    ZCOLEXIS = XCOLEXIS_I
    ZCOLIG   = XCOLIG_I
    ZCOLEXIG = XCOLEXIG_I
    ZCOLSG   = XCOLSG_I
    ZCOLEXSG = XCOLEXSG_I
    !
    IGAMINC = NGAMINC_I
    !
    IACCLBDAR = NACCLBDAR_I
    IACCLBDAS = NACCLBDAS_I
    ZACCINTP1S = XACCINTP1S_I
    ZACCINTP2S = XACCINTP2S_I
    ZACCINTP1R = XACCINTP1R_I
    ZACCINTP2R = XACCINTP2R_I
    ! 
    IDRYLBDAR = NDRYLBDAR_I
    IDRYLBDAS = NDRYLBDAS_I
    IDRYLBDAG = NDRYLBDAG_I
    ZDRYINTP1R = XDRYINTP1R_I
    ZDRYINTP2R = XDRYINTP2R_I
    ZDRYINTP1S = XDRYINTP1S_I
    ZDRYINTP2S = XDRYINTP2S_I
    ZDRYINTP1G = XDRYINTP1G_I
    ZDRYINTP2G = XDRYINTP2G_I
    !
    ZRIMINTP1 = XRIMINTP1_I
    ZRIMINTP2 = XRIMINTP2_I
    !
  ELSE IF (CCLOUD == 'LIMA') THEN
! in ini_lima, xrtmin is initialized with dimension 7
    ZRTMIN(1:KRR) = XRTMIN_L(1:KRR)
    !
    ZALPHAI = XALPHAI_L
    ZNUI = XNUI_L
    ZAI = XAI_L
    ZBI = XBI_L
    ZDS = XDS_L
    ZDG = XDG_L
    ZCXS = XCXS_L
    ZCXG = XCXG_L
    !
    ZCOLIS   = 0.25  ! variable not defined in LIMA, the value of ICEx is used 
    ZCOLEXIS = XCOLEXIS_L
    ZCOLIG   = XCOLIG_L
    ZCOLEXIG = XCOLEXIG_L
    ZCOLSG   = XCOLSG_L
    ZCOLEXSG = XCOLEXSG_L
    !
    IGAMINC = NGAMINC_L
    !
    IACCLBDAR = NACCLBDAR_L
    IACCLBDAS = NACCLBDAS_L
    ZACCINTP1S = XACCINTP1S_L
    ZACCINTP2S = XACCINTP2S_L
    ZACCINTP1R = XACCINTP1R_L
    ZACCINTP2R = XACCINTP2R_L
    ! 
    IDRYLBDAR = NDRYLBDAR_L
    IDRYLBDAS = NDRYLBDAS_L
    IDRYLBDAG = NDRYLBDAG_L
    ZDRYINTP1R = XDRYINTP1R_L
    ZDRYINTP2R = XDRYINTP2R_L
    ZDRYINTP1S = XDRYINTP1S_L
    ZDRYINTP2S = XDRYINTP2S_L
    ZDRYINTP1G = XDRYINTP1G_L
    ZDRYINTP2G = XDRYINTP2G_L
    !
    ZRIMINTP1 = XRIMINTP1_L
    ZRIMINTP2 = XRIMINTP2_L
  END IF
!
!
!*      1.6   update the slope parameter of the distribution
!*            and compute N_x if necessary
!
  IF (CCLOUD(1:3) == 'ICE') ZCCT(:) = 0.
  CALL COMPUTE_LAMBDA(2, IMOM_C, KMICRO, ZRHODREF, ZRTMIN(2), ZRCT, ZCCT, ZLBDAC)
  CALL COMPUTE_LAMBDA(3, IMOM_R, KMICRO, ZRHODREF, ZRTMIN(3), ZRRT, ZCRT, ZLBDAR)
  CALL COMPUTE_LAMBDA(4, IMOM_I, KMICRO, ZRHODREF, ZRTMIN(4), ZRIT, ZCIT, ZLBDAI)
  CALL COMPUTE_LAMBDA(5, IMOM_S, KMICRO, ZRHODREF, ZRTMIN(5), ZRST, ZCST, ZLBDAS)
  CALL COMPUTE_LAMBDA(6, IMOM_G, KMICRO, ZRHODREF, ZRTMIN(6), ZRGT, ZCGT, ZLBDAG)
  IF (KRR == 7) CALL COMPUTE_LAMBDA(7, IMOM_H, KMICRO, ZRHODREF, ZRTMIN(7), ZRHT, ZCHT, ZLBDAH)
!
!
!*      1.7   update the parameter e in the charge-diameter relationship
!
! Compute e_x at time t
  IF (CCLOUD == 'LIMA') THEN
    CALL ELEC_COMPUTE_EX(2, IMOM_C, KMICRO, 1., ZRHODREF, ZRTMIN(2), ZRCT, ZQCT, ZECT, PLBDX=ZLBDAC, PCX=ZCCT)
    CALL ELEC_COMPUTE_EX(3, IMOM_R, KMICRO, 1., ZRHODREF, ZRTMIN(3), ZRRT, ZQRT, ZERT, PLBDX=ZLBDAR, PCX=ZCRT)
    CALL ELEC_COMPUTE_EX(4, IMOM_I, KMICRO, 1., ZRHODREF, ZRTMIN(4), ZRIT, ZQIT, ZEIT, PLBDX=ZLBDAI, PCX=ZCIT)
    CALL ELEC_COMPUTE_EX(5, IMOM_S, KMICRO, 1., ZRHODREF, ZRTMIN(5), ZRST, ZQST, ZEST, PLBDX=ZLBDAS, PCX=ZCST)
    CALL ELEC_COMPUTE_EX(6, IMOM_G, KMICRO, 1., ZRHODREF, ZRTMIN(6), ZRGT, ZQGT, ZEGT, PLBDX=ZLBDAG, PCX=ZCGT)
    IF (KRR == 7) CALL ELEC_COMPUTE_EX(7, IMOM_H, KMICRO, 1., ZRHODREF, ZRTMIN(7), ZRHT, ZQHT, ZEHT, PLBDX=ZLBDAH, PCX=ZCHT)
  ELSE IF (CCLOUD(1:3) == 'ICE') THEN
    CALL ELEC_COMPUTE_EX(2, 1, KMICRO, 1., ZRHODREF, ZRTMIN(2), ZRCT, ZQCT, ZECT)
    CALL ELEC_COMPUTE_EX(3, 1, KMICRO, 1., ZRHODREF, ZRTMIN(3), ZRRT, ZQRT, ZERT, PLBDX=ZLBDAR)
    CALL ELEC_COMPUTE_EX(4, 1, KMICRO, 1., ZRHODREF, ZRTMIN(4), ZRIT, ZQIT, ZEIT, PCX=ZCIT)
    CALL ELEC_COMPUTE_EX(5, 1, KMICRO, 1., ZRHODREF, ZRTMIN(5), ZRST, ZQST, ZEST, PLBDX=ZLBDAS)
    CALL ELEC_COMPUTE_EX(6, 1, KMICRO, 1., ZRHODREF, ZRTMIN(6), ZRGT, ZQGT, ZEGT, PLBDX=ZLBDAG)
    IF (KRR == 7) CALL ELEC_COMPUTE_EX(7, 1, KMICRO, 1., ZRHODREF, ZRTMIN(7), ZRHT, ZQHT, ZEHT, PLBDX=ZLBDAH)
  END IF
!
!
!*      1.8   initialization for the non-inductive charging process
!
  SELECT CASE (CNI_CHARGING)
    ! Initialization for the parameterization of Gardiner et al. (1995)
    CASE ('GARDI')
      CALL ELEC_INIT_NOIND_GARDI()
      ! Save the effective water content
      DO JL = 1, KMICRO
        XEW(II1(JL),II2(JL),II3(JL)) = ZDELTALWC(JL) ! 
      END DO      
    !
    ! Initialization for the parameterizations of Saunders et al. (1991)
    ! with and without anomalies, and Tsenova and Mitzeva (2009)
    CASE ('SAUN1', 'SAUN2', 'TEEWC')
      CALL ELEC_INIT_NOIND_EWC()
      ! Save the effective water content
      DO JL = 1, KMICRO
        XEW(II1(JL),II2(JL),II3(JL)) = ZEW(JL) ! g/m3
      END DO
    !
    ! Initialization for the parameterizations of Saunders and Peck (1998), 
    ! Brooks et al. (1997) and Tsenova and Mitzeva (2011)
    CASE ('SAP98', 'BSMP1', 'BSMP2', 'TERAR')
      CALL ELEC_INIT_NOIND_RAR()
      ! Save the rime accretion rate (not recorded properly: 3 different RAR are computed !!!)
      DO JL = 1, KMICRO
        XEW(II1(JL),II2(JL),II3(JL)) = ZRAR(JL) ! g/m3
      END DO
    !
    ! Initialization for the parameterization of Takahashi (1978)
    CASE ('TAKAH')
      CALL ELEC_INIT_NOIND_TAKAH()
      ! Save the effective water content
      DO JL = 1, KMICRO
        XEW(II1(JL),II2(JL),II3(JL)) = ZEW(JL) ! g/m3
      END DO
  END SELECT
!
!
!------------------------------------------------------------------
!
!*      2.    COMPUTE THE SLOW COLD PROCESS SOURCES
!             -------------------------------------
!
!*      2.1   heterogeneous nucleation
!
! --> rien n'est fait pour l'elec pour le moment
! ICE3/4 : rvheni/rvhind
! LIMA : rvhenc, rchinc, rvhonh
!
!
!*      2.2   spontaneous freezing (rhong)
!
  if ( lbudget_sv ) then
    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SFR', &
                            Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'SFR', &
                            Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
  end if
!  
  ZWQ(:) = 0.
  WHERE (ZRRHONG(:) > 0. .AND. &
         ZRRT(:) > XRTMIN_ELEC(3) .AND. ABS(ZQRT(:)) > XQTMIN(3))
    ZWQ(:) = ZQRS(:)
    !
    ZQGS(:) = ZQGS(:) + ZQRS(:)
    ZQRS(:) = 0.
  END WHERE
!
  if ( lbudget_sv ) then
    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SFR', &
                           Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'SFR', &
                           Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
  end if
!
!
!*      2.3   cloud ice melting (rimltc)
!
  if ( lbudget_sv ) then
    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'IMLT', &
                            Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'IMLT', &
                            Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
  end if
!
  WHERE (ZRIMLTC(:) > 0.)
    ZQCS(:) = ZQCS(:) + ZQIS(:)
    ZQIS(:) = 0.
  END WHERE
!
  if ( lbudget_sv ) then
    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'IMLT', &
                           Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'IMLT', &
                           Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
  end if
!
!
!*      2.4   riming-conversion of the large sized aggregates into graupel ???
! ancienne param => on calcule plutot cette tendance un peu plus loin ?
!
!
!*      2.5   homogeneous nucleation (rchoni)
!
! CB : traitement different entre ice3 et lima --> a modifier eventuellement
!
  ZWQ(:) = 0.
  WHERE (ZRCHONI(:) > 0. .AND.           &
         ZRCT(:) > XRTMIN_ELEC(2) .AND.  &
         ABS(ZQCT(:)) > XQTMIN(2) .AND. ABS(ZECT(:)) > XECMIN)
    ZWQ(:) = XQHON * ZECT(:) * ZRCHONI(:)
    ZWQ(:) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQCS(:) )
    !
    ZQIS(:) = ZQIS(:) + ZWQ(:)
    ZQCS(:) = ZQCS(:) - ZWQ(:)
  END WHERE
!
  if ( lbudget_sv ) then
    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'HON', &
                           Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'HON', &
                           Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
  end if
!
!
!*      2.6   deposition on snow/aggregates (rvdeps)
!
  if ( lbudget_sv ) then