From a3af077d11fe01675d78c45e4019568eab34dd4c Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Mon, 14 Feb 2022 11:19:31 +0100
Subject: [PATCH] Quentin 14/02/2022: Merge from main commit fef9ac31 + correct
 use of MODE in ini_ice_c1r3 + ini_param_elec

---
 src/mesonh/micro/ini_ice_c1r3.f90   |    6 +-
 src/mesonh/micro/ini_param_elec.f90 | 1093 +++++++++++++++++++++++++++
 2 files changed, 1096 insertions(+), 3 deletions(-)
 create mode 100644 src/mesonh/micro/ini_param_elec.f90

diff --git a/src/mesonh/micro/ini_ice_c1r3.f90 b/src/mesonh/micro/ini_ice_c1r3.f90
index a622f405e..8de2f998d 100644
--- a/src/mesonh/micro/ini_ice_c1r3.f90
+++ b/src/mesonh/micro/ini_ice_c1r3.f90
@@ -114,9 +114,9 @@ USE MODI_GAMMA_INC
 USE MODE_READ_XKER_RACCS, ONLY: READ_XKER_RACCS
 USE MODE_READ_XKER_RDRYG, ONLY: READ_XKER_RDRYG
 USE MODE_READ_XKER_SDRYG, ONLY: READ_XKER_SDRYG
-USE MODI_RRCOLSS
-USE MODI_RSCOLRG
-USE MODI_RZCOLX
+USE MODE_RRCOLSS, ONLY: RRCOLSS
+USE MODE_RSCOLRG, ONLY: RSCOLRG
+USE MODE_RZCOLX,  ONLY: RZCOLX
 !
 !
 IMPLICIT NONE
diff --git a/src/mesonh/micro/ini_param_elec.f90 b/src/mesonh/micro/ini_param_elec.f90
new file mode 100644
index 000000000..d1eeb198f
--- /dev/null
+++ b/src/mesonh/micro/ini_param_elec.f90
@@ -0,0 +1,1093 @@
+!MNH_LIC Copyright 1994-2019 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_INI_PARAM_ELEC
+!      	##########################
+!
+INTERFACE
+!
+        SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVM, PRHO00,       &
+                                   KRR, KND, PFDINFTY, IIU, IJU, IKU )
+!
+USE MODD_IO, ONLY : TFILEDATA
+!
+TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE ! Initial file
+CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVM
+INTEGER, INTENT(IN) :: KND      ! Number of intervals to integrate kernels
+INTEGER, INTENT(IN) :: KRR      ! Number of moist variables
+REAL,    INTENT(IN) :: PRHO00   ! Pressure at ground level
+REAL,    INTENT(IN) :: PFDINFTY ! Factor used to define the "infinite" diameter
+INTEGER, INTENT(IN) :: IIU      ! Upper dimension in x direction (local)
+INTEGER, INTENT(IN) :: IJU      ! Upper dimension in y direction (local)
+INTEGER, INTENT(IN) :: IKU      ! Upper dimension in z direction
+!
+END SUBROUTINE INI_PARAM_ELEC
+END INTERFACE
+END MODULE MODI_INI_PARAM_ELEC
+!
+!       ##############################################################
+        SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVM, PRHO00,       &
+                                   KRR, KND, PFDINFTY, IIU, IJU, IKU )
+!       ##############################################################
+!
+!!****  *INI_PARAM_ELEC* -  initialize the constants necessary 
+!!                          for the electrical scheme.
+!!
+!!    PURPOSE
+!!    -------
+!!        The purpose of this routine is to initialize the constants used to 
+!!	resolve the electrical scheme.
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      None
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!	Helsdon and Farley, 1987: A numerical study of a Montana thunderstorm: 
+!!	  2. Model results versus observations involving electrical aspects.
+!!	  J. Geophys. Res., 92, 5661-5675.
+!!
+!!	Takahashi, 1978: Riming electrification as a charge generation 
+!!	  mechanism in thunderstorms. J. Atmos. Sci., 35, 1536-1548.
+!!
+!!	Gardiner et al., 1985: Measurements of initial potential gradient and
+!!	  particles charges in a Montana supercell thunderstorm.
+!!	  J. Geophys. Res., 90, 6079-6086.
+!!
+!!	Saunders et al., 1991: The effect of liquid water on thunderstorm
+!!	  charging. J. Geophys. Res., 96, 11007-11017.
+!!
+!!    AUTHOR
+!!    ------
+!!      Gilles Molinie      * Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!        C. Barthe  01/02/2004 coefficients f/b
+!!        C. Barthe  21/05/2004 Add limitations for the NI processes
+!!        C. Barthe  31/05/2004 Add constants for the inductive process
+!!        C. Barthe  10/11/2009 Update to Masdev 4.8.1
+!!        M. Chong      26/01/10  Small ions parameters 
+!!                               +Fair weather field from Helsdon-Farley
+!!                                (JGR, 1987, 5661-5675)
+!!        J.-P. Pinty jan 2015  tabulate the equations for Saunders
+!!        J. Escobar 8/01/2016 bug , missing YDIR='XY' in READ 
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
+!
+!-------------------------------------------------------------------------------
+!
+!*	0.	DECLARATIONS
+!		------------
+!
+USE MODD_CST
+USE MODD_ELEC_n
+USE MODD_ELEC_DESCR
+USE MODD_ELEC_PARAM
+USE MODD_IO,             ONLY: TFILEDATA
+USE MODD_NSV,            ONLY: NSV_ELECEND
+USE MODD_PARAMETERS
+USE MODD_PARAM_ICE
+USE MODD_RAIN_ICE_DESCR
+USE MODD_RAIN_ICE_PARAM
+USE MODD_VAR_ll
+!
+USE MODE_IO_FIELD_READ,  only: IO_Field_read
+!
+USE MODI_MOMG
+USE MODE_RRCOLSS, ONLY: RRCOLSS
+USE MODE_RSCOLRG, ONLY: RSCOLRG
+USE MODE_RZCOLX,  ONLY: RZCOLX
+USE MODI_VQZCOLX
+!
+IMPLICIT NONE
+!
+!*	0.1	 Declaration of dummy arguments
+!
+TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE ! Initial file
+CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVM
+INTEGER, INTENT(IN) :: KND      ! Number of intervals to integrate kernels
+INTEGER, INTENT(IN) :: KRR      ! Number of moist variables
+REAL,    INTENT(IN) :: PRHO00   ! Pressure at ground level
+REAL,    INTENT(IN) :: PFDINFTY ! Factor used to define the "infinite" diameter
+INTEGER, INTENT(IN) :: IIU      ! Upper dimension in x direction (local)
+INTEGER, INTENT(IN) :: IJU      ! Upper dimension in y direction (local)
+INTEGER, INTENT(IN) :: IKU      ! Upper dimension in z direction
+!
+!*	0.2	 Declaration of local variables
+!
+REAL    :: ZESR               ! Mean efficiency of rain-aggregate collection
+REAL    :: ZEGS               !  
+REAL    :: ZEGR
+REAL, DIMENSION(:,:), ALLOCATABLE :: ZMANSELL1, ZMANSELL2 ! Used to initialize
+                                                          ! XMANSELL array
+!
+INTEGER             :: JLWC, JTEMP
+REAL, DIMENSION(:), ALLOCATABLE :: ZT, ZLWCC, ZEW
+!
+!-------------------------------------------------------------------------------
+! constants for electricity
+!
+XEPSILON = 8.85E-12     ! Dielectric permittivity of the air
+XECHARGE = 1.6E-19      ! Elementary charge (C) 
+!
+!*	1.	SHAPE PARAMETERS
+!		----------------
+!
+XCXR = -1.0 ! Raindrop characteristic : XCXR (not declared in ini_rain_ice.f90)
+!
+! Individual charge  q(d) = e_x * d ** f_x with f_x = XFx 
+!
+XFC = 0.5   ! cloud 
+XFR = 1.3   ! rain 
+XFI = 0.5   ! pristine ice 
+XFS = 1.3   ! snow
+XFG = 2.0   ! graupel
+XFH = 2.0   ! hail
+!
+! Min/max values of e_x
+!
+XEGMIN = 1.E-12
+XEGMAX = 1.E-3 
+!
+XESMIN = 1.E-14
+XESMAX = 1.E-4 
+!
+XEIMIN = 1.E-12
+XEIMAX = 1.E-3 
+!
+XECMIN = 1.E-12
+XECMAX = 1.E-3
+! 
+XERMIN = 1.E-14
+XERMAX = 1.E-4
+!
+XEHMIN = 1.E-14
+XEHMAX = 1.E-4 
+!
+!  E=E_0 * exp(k_e*z)
+XE_0 = -100.
+XKEF = -2.E-4            !  229.E-6
+!
+!  E=E_0 (b1 exp(-a1 z) + b2 exp(-a2 z) + b3 exp(-a3 z) : Helsdon-Farley, 1987
+XE0_HF = -80.
+XA1_HF = 4.5E-3
+XB1_HF = 0.5
+XA2_HF = 3.8E-4
+XB2_HF = 0.65
+XA3_HF = 1.0E-4
+XB3_HF = 0.1
+!
+XIONCOMB = 1.6E-12
+XF_POS = 1.4E-4
+XF_NEG = 1.9E-4
+XEXPMOB = 1.4E-4
+!
+XFCORONA = 2.E-20
+XECORONA = 5000.
+!
+XJCURR_FW = -2.7E-12
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	2.	COEFFICIENTS FOR CHARGE TRANSFERS
+!		---------------------------------
+!
+! proportionality coefficient between mass transfer and charge transfer rates
+! the mixing ratio is proportional to the volume of the particle
+! the electric charge is proportional to the surface of the particle
+!
+XCOEF_RQ_V = 1
+XCOEF_RQ_C = XFC / 3.0  ! XBC=3
+XCOEF_RQ_R = XFR / XBR
+XCOEF_RQ_I = XFI / XBI
+XCOEF_RQ_S = XFS / XBS
+XCOEF_RQ_G = XFG / XBG
+XCOEF_RQ_H = XFH / XBH
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	3.	HOMOGENEOUS NUCLEATION
+!		----------------------
+!
+XALPHACQ = 3.         !>
+XNUCQ    = 1.         ! >--- generic values
+XLBDACQ  = 1.1E5      !>
+!
+XQHON = (1. / XRHOLW)
+XQHON = XQHON * MOMG(XALPHACQ,XNUCQ,XFC+3.)
+XQHON = XQHON / MOMG(XALPHACQ,XNUCQ,3.)
+XQHON = XQHON / (XLBDACQ**XFC)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	4.	SEDIMENTATION
+!		-------------
+IF (ALLOCATED(XQTMIN)) DEALLOCATE(XQTMIN)       
+IF (ALLOCATED(XRTMIN_ELEC)) DEALLOCATE(XRTMIN_ELEC)
+!
+IF (KRR == 6) THEN
+  ALLOCATE( XQTMIN(6) )
+  ALLOCATE( XRTMIN_ELEC(6) )
+ELSE IF (KRR == 7) THEN
+  ALLOCATE( XQTMIN(7) )
+  ALLOCATE( XRTMIN_ELEC(7) )
+END IF
+!
+XQTMIN(1) = 1.0E-17  !
+XQTMIN(2) = 1.0E-17  !
+XQTMIN(3) = 1.0E-17  ! ten particles per cubic meter that carried a charge
+XQTMIN(4) = 1.0E-17  ! of one electron
+XQTMIN(5) = 1.0E-17  !
+XQTMIN(6) = 1.0E-17  !
+IF (KRR == 7) XQTMIN(7) = 1.0E-17  !
+!
+XRTMIN_ELEC(1) = 1.0E-6  
+XRTMIN_ELEC(2) = 1.0E-6 
+XRTMIN_ELEC(3) = 1.0E-6
+XRTMIN_ELEC(4) = 1.0E-6
+XRTMIN_ELEC(5) = 1.0E-6
+XRTMIN_ELEC(6) = 1.0E-6
+IF (KRR == 7) XRTMIN_ELEC(7) = 1.0E-6
+!
+XLBDAR_MAXE = 2.E3 ! Less than 10000 particles in cube meter of cloud. 
+XLBDAS_MAXE = 2.E3 ! Less than 10000 particles in cube meter of cloud. 
+XLBDAG_MAXE = 2.E3 !
+XLBDAH_MAXE = 2.E3 !
+!
+! Rain
+!
+XCEXVT = 0.4
+XEXQSEDR = (XCXR - XFR - XDR) / (XCXR - XBR)
+XFQSEDR  = XCR * (XCCR**(1 - XEXQSEDR)) * MOMG(XALPHAR,XNUR,XDR+XFR) * &
+         ((XAR * MOMG(XALPHAR,XNUR,XBR))**(-XEXQSEDR)) * (PRHO00)**XCEXVT
+!
+! Ice
+!
+XEXQSEDI = (XDI + XFI) / XBI
+XFQSEDI  = XC_I * MOMG(XALPHAI,XNUI,XDI+XFI) * (PRHO00**XCEXVT) * &
+           (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XEXQSEDI)  
+!
+! Snow
+!
+XEXQSEDS = (XCXS - XFS - XDS) / (XCXS - XBS)    
+XFQSEDS  = XCS * (XCCS**(1 - XEXQSEDS)) * MOMG(XALPHAS,XNUS,XDS+XFS) * &
+         ((XAS * MOMG(XALPHAS,XNUS,XBS))**(-XEXQSEDS)) * (PRHO00)**XCEXVT
+!
+! Graupeln 
+!
+XEXQSEDG = (XCXG - XFG - XDG) / (XCXG - XBG)    
+XFQSEDG  = XCG * (XCCG**(1 - XEXQSEDG)) * MOMG(XALPHAG,XNUG,XDG+XFG) * &
+         ((XAG * MOMG(XALPHAG,XNUG,XBG))**(-XEXQSEDG)) * (PRHO00)**XCEXVT
+!
+! Hail
+!
+XEXQSEDH = (XCXH - XFH - XDH) / (XCXH - XBH)    
+XFQSEDH  = XCH * (XCCH**(1 - XEXQSEDH)) * MOMG(XALPHAH,XNUH,XDH+XFH) * &
+         ((XAH * MOMG(XALPHAH,XNUH,XBH))**(-XEXQSEDH)) * (PRHO00)**XCEXVT
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	5.	EVAPORATION OF RAINDROPS
+!		------------------------
+!
+XQREVAV1 = (2. / XPI) * MOMG(XALPHAR,XNUR,XFR) / MOMG(XALPHAR,XNUR,2.)
+XQREVAV2 = (XPI / XAR) * (MOMG(XALPHAR,XNUR,2.) / MOMG(XALPHAR,XNUR,XBR)) * &
+           (XCXR - 2.) / (XCXR - XBR)
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	6.	RIMING OF CLOUD DROPLETS ON SNOW
+!		--------------------------------
+!
+XEXQSRIMCG = XCXS - XFS
+XQSRIMCG   = XCCS * MOMG(XALPHAS,XNUS,XFS)
+!
+! The array containing the tabulated function M(fs,D_cs^lim)/M(fs) 
+! is implemented in ini_rain_ice.f90
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	7.	CONTACT FREEZING BETWEEN RAINDROPS AND PRISTINE ICE
+!		---------------------------------------------------
+!
+XEXQRCFRIG = XCXR - XDR - XFR - 2.0
+XQRCFRIG   = (XPI / 4.0) * XCR * XCCR * MOMG(XALPHAR,XNUR,XDR+XFR+2.) * &
+              PRHO00**XCEXVT
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	8.	INITIALIZATIONS FOR THE NON INDUCTIVE PROCESSES
+!		-----------------------------------------------
+!
+! arrays allocation for NI charging rate
+!
+ALLOCATE( XNI_SDRYG(IIU, IJU, IKU) )
+ALLOCATE( XNI_IDRYG(IIU, IJU, IKU) )
+ALLOCATE( XNI_IAGGS(IIU, IJU, IKU) )
+ALLOCATE( XIND_RATE(IIU, IJU, IKU) )
+ALLOCATE( XEW(IIU, IJU, IKU) )
+XEW(:,:,:) = 0.
+!
+SELECT CASE(HGETSVM(NSV_ELECEND))
+  CASE ('READ')
+    CALL IO_Field_read(TPINIFILE,'NI_IAGGS',XNI_IAGGS)
+    CALL IO_Field_read(TPINIFILE,'NI_IDRYG',XNI_IDRYG)
+    CALL IO_Field_read(TPINIFILE,'NI_SDRYG',XNI_SDRYG)
+    CALL IO_Field_read(TPINIFILE,'INDUC_CG',XIND_RATE)
+  CASE ('INIT')
+    XNI_IAGGS(:,:,:) = 0.
+    XNI_IDRYG(:,:,:) = 0.
+    XNI_SDRYG(:,:,:) = 0.
+    XIND_RATE(:,:,:) = 0.
+END SELECT
+
+!
+!*      8.1     Gardiner et al. (1985) parameterization
+!
+IF (CNI_CHARGING == 'GARDI') THEN
+  XLWCC = 0.1   ! g.m^-3
+END IF
+!
+!
+!*      8.2     Saunders et al. (1991) and 
+!*              Saunders and Peck (1998) parameterizations
+!
+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
+!
+! ice particle = the smallest particle (I-S and I-G collisions)
+  XIMP = 3.76     ! for positive charge
+  XINP = 2.5
+  XIKP = 4.92E13
+  XIKP_TAK = 6.1E12     ! for Takahashi
+  XIMN = 2.54     ! for negative charge   
+  XINN = 2.8
+  XIKN = 5.25E8
+  XIKN_TAK = 4.3E7      ! for Takahashi
+! 
+! snow = the smallest particle (S-G collisions)
+  XSMP = 0.44     ! for positive charge
+  XSNP = 2.5
+  XSKP = 52.8
+  XSKP_TAK = 6.5     ! for Takahashi
+  XSMN = 0.5      ! for negative charge
+  XSNN = 2.8
+  XSKN = 24.
+  XSKN_TAK = 2.0        ! for Takahashi
+!
+  XFQIAGGSP = XIKP * XCS**(1. + XINP) *                 &
+                MOMG(XALPHAS, XNUS, 2.+XDS*(1.+XINP)) * &
+                MOMG(XALPHAI, XNUI, XIMP)
+  XFQIAGGSN = XIKN * XCS**(1. + XINN) *                 &
+                MOMG(XALPHAS, XNUS, 2.+XDS*(1.+XINN)) * &
+                MOMG(XALPHAI, XNUI, XIMN)
+!
+  XFQIDRYGBSP = XIKP * XCG**(1. + XINP) *               &
+                MOMG(XALPHAG, XNUG, 2.+XDG*(1.+XINP)) * &
+                MOMG(XALPHAI, XNUI, XIMP)
+  XFQIDRYGBSN = XIKN * XCG**(1. + XINN) *               &
+                MOMG(XALPHAG, XNUG, 2.+XDG*(1.+XINN)) * &
+                MOMG(XALPHAI, XNUI, XIMN)
+!
+  XFQIAGGSP_TAK = XFQIAGGSP * XIKP_TAK / XIKP
+  XFQIAGGSN_TAK = XFQIAGGSN * XIKN_TAK / XIKN
+  XFQIDRYGBSP_TAK = XFQIDRYGBSP * XIKP_TAK / XIKP
+  XFQIDRYGBSN_TAK = XFQIDRYGBSN * XIKN_TAK / XIKN
+!
+  XAIGAMMABI      = XAI * MOMG(XALPHAI, XNUI, XBI)
+!
+  XLBQSDRYGB1SP = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS, XNUS, XSMP)
+  XLBQSDRYGB1SN = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS, XNUS, XSMN)
+  XLBQSDRYGB2SP = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS, XNUS, 1.+XSMP)
+  XLBQSDRYGB2SN = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS, XNUS, 1.+XSMN)
+  XLBQSDRYGB3SP =                              MOMG(XALPHAS, XNUS, 2.+XSMP)
+  XLBQSDRYGB3SN =                              MOMG(XALPHAS, XNUS, 2.+XSMN)
+ENDIF
+!
+IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'TERAR' .OR. &
+    CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN
+  XVSCOEF = XCS * MOMG(XALPHAS, XNUS, XBS+XDS) / MOMG(XALPHAS, XNUS, XBS)
+  XVGCOEF = XCG * MOMG(XALPHAG, XNUG, XBG+XDG) / MOMG(XALPHAG, XNUG, XBG)
+END IF
+!
+!
+!*      8.3    Takahashi (1978) parameterization
+!
+IF (CNI_CHARGING == 'TAKAH') THEN
+!
+! last column and line are duplicated for interpolation
+  NIND_TEMP = 31
+  NIND_LWC  = 28
+  IF( .NOT.ALLOCATED(XMANSELL)) ALLOCATE( XMANSELL(NIND_LWC+1,NIND_TEMP+1))
+  ALLOCATE( ZMANSELL1(29,16) )
+  ALLOCATE( ZMANSELL2(29,16) )
+  ZMANSELL1 = RESHAPE( &
+(/  0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.0 ,  1.65,  3.3 ,  &
+    4.95, 13.2 , 19.8 , 26.4 , 31.02, 33.0 , 42.9 , 46.2 , 49.5 ,  &
+   52.8 , 49.5 , 39.6 , 36.3 , 32.34, 32.01, 32.01, 31.68, 31.35, 31.35, 31.35,&
+    0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.33,  2.64,  4.95,  6.6 ,  &
+    6.93, 15.18, 23.1 , 29.7 , 33.0 , 36.3 , 49.5 , 52.8 , 52.8 ,  &
+   52.8 , 49.5 , 36.3 , 33.0 , 32.34, 32.01, 32.01, 31.35, 31.35, 31.35, 31.35,&
+    0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.33,  3.3 ,  4.95,  6.6 ,  7.59,  &
+    9.24, 17.16, 26.4 , 32.34, 36.3 , 39.6 , 52.8 , 56.1 , 56.1 ,  &
+   56.1 , 42.9 , 33.0 , 32.01, 32.01, 31.68, 31.68, 31.02, 31.02, 30.36, 30.36,&
+    0.0 ,  0.0 ,  0.0 ,  0.33,  2.97,  5.61,  7.26,  8.25,  9.9 ,  &
+   10.56, 19.8 , 28.71, 36.3 , 39.6 , 46.2 , 56.1 , 59.4 , 59.4 ,  &
+   59.4 , 42.9 , 31.35, 31.35, 31.68, 31.35, 30.69, 30.36, 31.02, 30.03, 30.03,&
+    0.0 ,  0.0 ,  0.33,  2.64,  5.61,  7.59,  9.24,  9.9 , 11.22,  &
+   11.88, 22.44, 31.35, 39.6 , 47.2 , 52.8 , 59.4 , 62.7 , 62.7 ,  &
+   52.8 , 33.0 , 30.69, 30.69, 30.36, 30.69, 30.36, 30.03, 30.36, 30.03, 30.03,&
+    0.0 ,  0.0 ,  0.33,  4.29,  7.26,  8.91, 10.23, 11.55, 12.21,  &
+   13.2 , 24.09, 33.0 , 39.6 , 49.5 , 56.1 , 56.1 , 56.1 , 66.0 ,  &
+   49.5 , 31.35, 30.03, 29.7 , 29.37, 29.37, 29.37, 29.04, 30.03, 29.04, 29.04,&
+    0.0 ,  0.0 ,  2.31,  6.6 ,  8.91,  9.9 , 11.22, 13.2 , 13.2 ,  &
+   14.85, 25.08, 36.3 , 42.9 , 49.5 , 52.8 , 46.2 , 42.9 , 52.8 ,  &
+   42.9 , 28.05, 28.05, 29.71, 28.38, 28.71, 28.71, 28.71, 29.37, 28.71, 28.71,&
+    0.0 ,  0.0 ,  4.29,  7.59,  9.9 , 10.23, 11.22, 14.85, 14.85,  &
+   16.5 , 26.4 , 36.3 , 42.9 , 42.9 , 46.2 , 42.9 , 39.6 , 46.2 ,  &
+   33.0 , 24.75, 26.4 , 27.39, 27.39, 27.72, 28.05, 28.38, 29.04, 28.05, 28.05,&
+    0.0 ,  0.0 ,  6.27,  9.24, 10.56, 12.21, 11.88, 15.18, 15.84,  &
+   16.5 , 27.39, 33.0 , 39.6 , 39.6 , 39.6 , 36.3 , 33.0 , 39.6 ,  &
+   19.8 , 16.5 , 23.1 , 25.74, 26.73, 27.06, 27.39, 27.39, 28.38, 27.39, 27.39,&
+    0.0 ,  0.66,  6.93,  9.57, 11.22, 12.87, 12.54, 15.51, 16.5 ,  &
+   18.15, 27.39, 31.02, 36.3 , 33.0 , 29.7 , 23.1 , 19.8 , 26.4 ,  &
+    9.9 ,  0.99, 20.46, 23.43, 25.41, 26.4 , 27.06, 27.06, 27.39, 27.06, 27.06,&
+    0.0 ,  2.64,  7.59, 10.23, 11.88, 13.53, 13.2 , 15.84, 16.5 ,  &
+   19.14, 27.06, 28.71, 33.0 , 26.4 , 21.45, 16.5 ,  9.9 ,  3.3 ,  &
+    0.0 , -6.6 , 18.15, 21.45, 23.76, 25.08, 26.07, 26.73, 26.73, 26.73, 26.73,&
+    0.0 ,  3.3 ,  8.25, 10.89, 11.88, 13.53, 13.86, 15.84, 16.83,  &
+   18.81, 26.73, 27.39, 28.71, 21.45, 16.5 ,  3.3 ,  0.99, -0.99,  &
+   -4.95,-16.5 , 16.5 , 19.8 , 22.77, 24.09, 25.08, 25.41, 25.74, 26.4 , 26.4 ,&
+    0.0 ,  4.62,  8.91, 11.22, 12.21, 13.53, 14.85, 16.17, 16.83,  &
+   18.81, 25.74, 26.4 , 26.4 , 16.5 ,  2.97,  0.0 , -1.98, -9.9 ,  &
+  -11.55,-19.8 ,  3.3 , 18.15, 20.13, 23.1 , 23.76, 24.42, 25.41, 25.41, 25.41,&
+    0.0 ,  5.8 ,  9.24, 11.22, 12.54, 13.86, 15.18, 15.84, 16.83,  &
+   18.48, 24.42, 23.43, 22.44,  3.3 ,  0.0 , -1.98, -4.29, -9.9 ,  &
+  -13.2 ,-26.4 ,  0.0 , 16.83, 19.14, 21.45, 23.1 , 23.76, 24.42, 24.75, 24.75,&
+    0.0 ,  5.94,  9.57, 11.22, 12.54, 13.86, 14.85, 15.84, 16.5 ,  &
+   17.82, 23.1 , 20.79, 19.47,  0.33, -1.32, -3.3 , -6.6 , -9.9 ,  &
+  -14.85,-33.0 , -0.33, 14.85, 18.48, 19.8 , 21.78, 23.1 , 23.76, 24.42, 24.42,&
+    0.0 ,  5.94,  9.57, 11.22, 12.54, 13.53, 14.85, 15.51, 16.5 ,  &
+   16.83, 21.45, 17.82,  9.9 , -0.33, -2.31, -3.3 , -8.25, -9.99,  &
+  -14.85,-33.0 , -1.32,  4.95, 17.49, 19.47, 20.79, 22.44, 23.43, 24.09, 24.09/)&
+    ,(/29, 16/))
+  ZMANSELL2 = RESHAPE( &
+(/  0.0 ,  6.27,  9.57, 10.89, 12.21, 13.53, 14.52, 15.18, 15.84,  &
+   16.17, 19.47,  9.9 ,  0.0 , -0.99, -2.97, -4.95, -9.99, -9.99,  &
+  -14.85,-29.7 , -2.97,  3.3 , 16.83, 19.14, 19.47, 21.12, 22.44, 23.43, 23.43,&
+    0.0 ,  5.94,  9.57, 10.89, 12.21, 13.2 , 14.19, 14.85, 15.18,  &
+   15.51, 17.16,  3.3 , -0.33, -1.65, -3.3 , -6.6 , -9.99, -9.99,  &
+  -13.2 ,-28.1 , -3.3 ,  2.64, 16.5 , 17.82, 19.14, 20.13, 21.45, 22.77, 22.77,&
+    0.0 ,  5.61,  8.91, 10.89, 11.88, 13.2 , 13.86, 14.52, 14.85,  &
+   14.85,  9.9 ,  1.65, -0.99, -1.98, -3.3 , -6.6 , -9.99, -9.99,  &
+  -13.2 ,-26.4 , -3.3 ,  1.65, 13.2 , 17.49, 18.81, 19.8 , 20.79, 22.11, 22.11,&
+    0.0 ,  5.28,  8.58, 10.56, 11.55, 12.54, 13.2 , 13.86, 14.19,  &
+   13.86,  6.6 ,  0.0 , -1.32, -2.31, -3.3 , -6.6 , -9.99, -9.99,  &
+  -13.2 ,-24.8 , -3.3 ,  1.32,  6.6 , 17.16, 18.48, 19.47, 20.46, 21.45, 21.45,&
+    0.0 ,  4.95,  8.25,  9.9 , 11.22, 11.88, 12.54, 12.87, 13.2 ,  &
+   13.2 ,  3.3 , -0.66, -1.98, -2.64, -3.3 , -6.6 , -9.9 , -9.9 ,  &
+  -13.2 ,-23.1 , -3.3 ,  0.66,  4.95, 16.5 , 17.82, 18.81, 19.8 , 20.46, 20.46,&
+    0.0 ,  4.29,  7.59,  9.57, 10.56, 11.55, 11.88, 11.88, 12.21,  &
+   11.88,  2.64, -0.66, -2.31, -2.64, -3.3 , -6.6 , -9.9 , -9.9 ,  &
+  -13.2 ,-21.5 , -3.3 ,  0.0 ,  4.29, 14.85, 17.16, 18.48, 19.47, 20.13, 20.13,&
+    0.0 ,  3.96,  6.93,  8.91,  9.9 , 10.89, 10.89, 10.89, 10.89,  &
+   10.56,  0.99, -0.66, -2.31, -2.64, -3.3 , -6.6 , -9.9 , -9.99,  &
+  -13.2 ,-19.8 , -6.6 ,  0.0 ,  3.3 , 13.2 , 16.83, 18.15, 19.47, 19.8 , 19.8 ,&
+    0.0 ,  2.97,  6.27,  8.25,  9.24,  9.9 , 10.23, 10.23,  9.9 ,  &
+    9.57,  0.0 , -0.99, -2.31, -2.64, -3.3 , -6.6 , -9.9 , -9.99,  &
+  -11.55,-18.2 , -9.9 ,  0.0 ,  3.3 , 11.55, 16.5 , 17.82, 18.81, 19.8 , 19.8 ,&
+    0.0 ,  0.66,  5.61,  7.59,  8.91,  9.24,  9.24,  9.24,  8.91,  &
+    8.58,  0.0 , -0.99, -1.98, -2.64, -3.3 , -6.6 , -9.9 , -9.9 ,  &
+  -11.55,-17.5 , -6.6 ,  0.0 ,  2.97,  8.25, 16.5 , 17.16, 18.48, 19.47, 19.47,&
+    0.0 ,  0.0 ,  4.29,  6.6 ,  7.59,  8.25,  8.25,  7.59,  7.92,  &
+    7.59, -0.33, -1.32, -1.98, -2.64, -3.3 , -4.95, -9.9 , -9.9 ,  &
+   -9.9 ,-16.5 , -6.6 ,  0.0 ,  2.97,  6.6 , 14.85, 16.83, 18.15, 19.47, 19.47,&
+    0.0 ,  0.0 ,  2.64,  5.28,  6.93,  7.26,  7.59,  7.26,  6.93,  &
+    6.6 , -0.66, -1.32, -1.98, -2.64, -3.3 , -4.29, -8.25, -9.9 ,  &
+   -9.9 ,-16.5 , -6.6 ,  0.0 ,  2.64,  6.6 , 14.85, 16.5 , 17.82, 19.14, 19.14,&
+    0.0 ,  0.0 ,  0.33,  3.63,  5.61,  6.6 ,  6.6 ,  6.6 ,  4.95,  &
+    3.63, -0.66, -1.32, -1.98, -2.64, -3.3 , -3.3 , -6.6 , -8.25,  &
+   -8.25,-16.5 , -6.6 ,  0.0 ,  2.64,  6.6 , 13.2 , 16.5 , 17.49, 18.81, 18.81,&
+    0.0 ,  0.0 ,  0.0 ,  0.99,  3.3 ,  4.29,  4.29,  4.62,  3.3 ,  &
+    2.97, -0.66, -1.32, -1.98, -2.64, -2.97, -2.97, -3.3 , -4.95,  &
+   -4.95,-15.8 , -4.95,  0.0 ,  2.31,  6.6 , 11.55, 16.5 , 17.49, 18.15, 18.15,&
+    0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.99,  3.3 ,  2.64,  2.31,  2.31,  &
+    2.31, -0.66, -1.32, -1.98, -2.31, -2.97, -2.64, -2.97, -3.63,  &
+   -4.95, -9.99, -4.95,  0.0 ,  2.31,  6.6 ,  9.9 , 14.85, 17.16, 18.15, 18.15,&
+    0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.66,  0.99,  1.65,  1.98,  &
+    1.65, -0.66, -1.32, -1.65, -2.31, -2.64, -2.64, -2.97, -2.97,  &
+   -3.3 , -9.99, -3.3 ,  0.0 ,  2.31,  6.6 ,  9.9 , 14.85, 17.16, 18.15, 18.15,&
+    0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.0 ,  0.66,  0.99,  1.65,  1.98,  &
+    1.65, -0.66, -1.32, -1.65, -2.31, -2.64, -2.64, -2.97, -2.97,  &
+   -3.3 , -9.99, -3.3 ,  0.0 ,  2.31,  6.6 ,  9.9 , 14.85, 17.16, 18.15, 18.15/)&        
+    ,(/29, 16/)) 
+  XMANSELL(:, 1:16) = ZMANSELL1(:,:)
+  XMANSELL(:,17:32) = ZMANSELL2(:,:)
+  DEALLOCATE(ZMANSELL1)
+  DEALLOCATE(ZMANSELL2)
+!
+  XMANSELL(:,:) = XMANSELL(:,:) * 1.E-15 ! in C
+END IF
+!
+!
+!*      8.4    Saunders et al. (1991) parameterization
+!              Idem for Brooks et al. (1997), but with EW = ZRAR/3.
+!
+!
+IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR.  &
+    CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2')  THEN
+!
+  NIND_TEMP = 31
+  NIND_LWC  = 28
+!
+  IF( .NOT.ALLOCATED(XSAUNDER)) ALLOCATE(XSAUNDER(NIND_LWC+1,NIND_TEMP+1))
+  ALLOCATE(ZT(NIND_TEMP+1))    ! Kelvin
+  ALLOCATE(ZLWCC(NIND_TEMP+1))
+  DO JTEMP = 1, NIND_TEMP+1
+    ZT(JTEMP)=1.0-REAL(JTEMP)+XTT
+  END DO
+  ZLWCC(:) = MIN( MAX( -0.49 + 6.64E-2*(XTT-ZT(:)),0.22 ),1.1 )   ! (g m^-3)
+  ALLOCATE(ZEW(NIND_LWC+1))
+!
+!                       LWC index (0.01 g.m^-3 --> 10 g.m^-3)
+!                                  0.01 to 0.09 every 0.01 (9 values)
+!                                  0.10 to 0.90 every 0.10 (9 values)
+!                                  1.00 to 10.0 every 1.00 (10 values)
+  DO JLWC = 1, 9
+    ZEW(JLWC)=0.01*REAL(JLWC)
+  END DO
+  DO JLWC = 10, 18
+    ZEW(JLWC)=0.1 + 0.1*REAL(JLWC-10)
+  END DO
+  DO JLWC = 19, NIND_LWC+1
+    ZEW(JLWC)=1.0 + REAL(JLWC-19)
+  END DO
+!
+!
+  XSAUNDER(:,:) = 0.0
+  DO JTEMP = 1, NIND_TEMP+1
+    DO JLWC = 1, NIND_LWC+1
+!
+! region S4 : positive
+      IF (ZT(JTEMP) <= (XTT-7.35) .AND. ZT(JTEMP) > (XTT-23.9458) .AND. &
+          ZEW(JLWC) > ZLWCC(JTEMP)) THEN
+        XSAUNDER(JLWC,JTEMP) = MAX( 0.,                                        &
+                                    20.22*ZEW(JLWC)+1.36*(ZT(JTEMP)-XTT)+10.05 )
+      ENDIF
+!
+! region S1 : positive --> linear interpolation
+      IF (ZT(JTEMP) > (XTT-7.35) .AND. ZT(JTEMP) < XTT .AND. &
+          ZEW(JLWC) > ZLWCC(JTEMP)) THEN
+        XSAUNDER(JLWC,JTEMP) = MAX( 0.,-(2.75*ZEW(JLWC)+0.007)*(ZT(JTEMP)-XTT) )
+      ENDIF
+!
+! region S8 : positive
+      IF (ZT(JTEMP) <= (XTT-23.9458) .AND. ZT(JTEMP) > (XTT-40.0) .AND. &
+          ZEW(JLWC) > ZLWCC(JTEMP)) THEN
+        XSAUNDER(JLWC,JTEMP)  = MAX( 0.,20.22*ZEW(JLWC)-22.26 )
+      ENDIF
+!
+! region S7 : negative
+      IF (ZT(JTEMP) <= (XTT-7.35) .AND. ZT(JTEMP) > (XTT-40.0) .AND. &
+          ZEW(JLWC) >= 0.104149   .AND. ZEW(JLWC) < ZLWCC(JTEMP)) THEN
+        XSAUNDER(JLWC,JTEMP) = MIN( 0.,3.02-31.76*ZEW(JLWC)+26.53*ZEW(JLWC)**2 )
+      ENDIF
+    END DO
+  END DO
+END IF
+!
+! SAUN1 doesn't take into account marginal positive and negative regions at
+! low LWC
+!
+IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'BSMP1') THEN
+  DO JTEMP = 1, NIND_TEMP+1
+    DO JLWC = 1, NIND_LWC+1
+!
+! region S1 : negative --> linear interpolation
+      IF (ZT(JTEMP) > (XTT-7.35)   .AND. ZT(JTEMP) < XTT .AND. &
+          ZEW(JLWC) < ZLWCC(JTEMP) .AND. ZEW(JLWC) >= 0.104149) THEN
+        XSAUNDER(JLWC,JTEMP) = MIN( 0.,                                        &
+                      (-0.41+4.32*ZEW(JLWC)-3.61*ZEW(JLWC)**2)*(ZT(JTEMP)-XTT) )
+      ENDIF
+    END DO
+  END DO
+!
+  XSAUNDER(:,:) = XSAUNDER(:,:) * 1.E-15 ! in C
+!
+END IF
+!
+! SAUN2 takes into account marginal positive and negative regions at low LWC
+!
+IF (CNI_CHARGING == 'SAUN2' .OR. CNI_CHARGING == 'BSMP2') THEN
+  DO JTEMP = 1, NIND_TEMP+1
+    DO JLWC = 1, NIND_LWC+1
+!
+! region S2 : negative
+      IF (ZT(JTEMP) <= (XTT-7.35) .AND. ZT(JTEMP) > (XTT-16.0) .AND. &
+          ZEW(JLWC) >= 0.026      .AND. ZEW(JLWC) < 0.14) THEN
+        XSAUNDER(JLWC,JTEMP) = MIN( 0.,-314.4*ZEW(JLWC) + 7.92 )
+      ENDIF
+!
+! region S3 : negative
+      IF (ZT(JTEMP) <= (XTT-7.35) .AND. ZT(JTEMP) > (XTT-16.0) .AND. &
+          ZEW(JLWC) >= 0.14       .AND. ZEW(JLWC) < 0.22) THEN
+        XSAUNDER(JLWC,JTEMP) = MIN( 0.,419.4 * ZEW(JLWC) - 92.64 )
+      ENDIF
+!
+! region S5 : positive
+      IF (ZT(JTEMP) < (XTT-20.0) .AND. ZT(JTEMP) > (XTT-40.0) .AND. &
+          ZEW(JLWC) >= 0.063034  .AND. ZEW(JLWC) < 0.12) THEN
+        XSAUNDER(JLWC,JTEMP) = MAX( 0.,2041.76*ZEW(JLWC) - 128.7 )
+      ENDIF
+!
+! region S6 : positive
+      IF (ZT(JTEMP) < (XTT-20.0) .AND. ZT(JTEMP) > (XTT-40.0) .AND. &
+          ZEW(JLWC)  >= 0.12      .AND. ZEW(JLWC)  < 0.1596) THEN
+        XSAUNDER(JLWC,JTEMP) = MAX( 0.,-2900.22*ZEW(JLWC) + 462.91 )
+      ENDIF
+!
+! region S1 : negative --> linear interpolation of S3
+      IF (ZT(JTEMP) > (XTT-7.35) .AND. ZT(JTEMP) < XTT .AND. &
+          ZEW(JLWC)  >= 0.14      .AND. ZEW(JLWC)  < ZLWCC(JTEMP)) THEN
+        XSAUNDER(JLWC,JTEMP) = MIN( 0.,(-57.06*ZEW(JLWC)+12.6)*(ZT(JTEMP)-XTT) )
+      ENDIF
+!
+! region S1 : negative --> linear interpolation of S2
+      IF (ZT(JTEMP) > (XTT-7.35) .AND. ZT(JTEMP) < XTT .AND. &
+          ZEW(JLWC)  >= 0.026     .AND. ZEW(JLWC)  < 0.14) THEN
+        XSAUNDER(JLWC,JTEMP) = MIN( 0.,(42.8*ZEW(JLWC)-1.08)*(ZT(JTEMP)-XTT) )
+      ENDIF
+    END DO
+  END DO
+!
+  XSAUNDER(:,:) = XSAUNDER(:,:) * 1.E-15 ! in C
+!
+END IF
+!
+!*      8.5    Takahashi with EW or ZRAR (Tsenova and Mitzeva, 2009, 2011)
+!                       here ZRAR = 9 * EW
+!                       Temperature index (0C --> -30C)
+!                       LWC index (0.01 g.m^-3 --> 10 g.m^-3)
+!                                  0.01 to 0.09 every 0.01 (9 values)
+!                                  0.10 to 0.90 every 0.10 (9 values)
+!                                  1.00 to 10.0 every 1.00 (10 values)
+!
+IF (CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN
+!
+  NIND_TEMP = 31
+  NIND_LWC  = 28
+!
+  IF( .NOT.ALLOCATED(XTAKA_TM)) ALLOCATE(XTAKA_TM(NIND_LWC+1,NIND_TEMP+1))
+  ALLOCATE(ZT(NIND_TEMP+1))    ! Kelvin
+  ALLOCATE(ZEW(NIND_LWC+1))
+  DO JTEMP = 1, NIND_TEMP+1
+    ZT(JTEMP) = 1.0 - REAL(JTEMP) + XTT
+  END DO
+
+  DO JLWC = 1, 9
+    ZEW(JLWC) = 0.01 * REAL(JLWC)
+  END DO
+  DO JLWC = 10, 18
+    ZEW(JLWC) = 0.1 + 0.1 * REAL(JLWC-10)
+  END DO
+  DO JLWC = 19, NIND_LWC+1
+    ZEW(JLWC) = 1.0 + REAL(JLWC-19)
+  END DO
+!
+  XTAKA_TM(:,:) = 0.0
+  DO JTEMP = 1, NIND_TEMP+1
+    DO JLWC = 1, NIND_LWC+1
+!
+! Eq. 1: >0
+      IF ( ZT(JTEMP) > (XTT - 10.) .AND. ZEW(JLWC) <= 1.6) THEN
+        XTAKA_TM(JLWC, JTEMP) = 146.981 * ZEW(JLWC) - 116.37 * ZEW(JLWC)**2  &
+                               + 29.76 * ZEW(JLWC)**3                        &
+                               - 0.03 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC)     &
+                               - 2.58 * (ZT(JTEMP) - XTT)                    &
+                               - 0.21 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC)**3  &
+                               + 0.36 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC)**2  &
+                               + 0.15 * (ZT(JTEMP) - XTT)**2                 &
+                               + 2.92 * (ZT(JTEMP) - XTT)  * ZEW(JLWC)**3    &
+                               - 4.22 * (ZT(JTEMP) - XTT)  * ZEW(JLWC) - 8.506
+      END IF
+!
+!  Eq. 2: >0
+      IF ( ZT(JTEMP) > (XTT - 10.) .AND. &
+             ZEW(JLWC) > 1.6 .AND. ZEW(JLWC) <= 8.) THEN
+        XTAKA_TM(JLWC, JTEMP) = 4.179 * (ZT(JTEMP) - XTT)                    &
+                               - 0.005 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC)**2 &
+                               + 0.916 * ZEW(JLWC)**2                        &
+                               - 1.333 * (ZT(JTEMP) - XTT)    * ZEW(JLWC)    &
+                               - 7.465 * ZEW(JLWC)                           &
+                               + 0.109 * (ZT(JTEMP) - XTT)    * ZEW(JLWC)**2 &
+                               + 0.001 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC)**3 &
+                               - 0.035 * ZEW(JLWC)**3  + 50.84454
+      END IF
+!
+!  Eq. 8: > 0
+      IF ( ZEW(JLWC) <= 0.4 .AND. &
+              ZT(JTEMP) <= (XTT - 10.) .AND. ZT(JTEMP) >= (XTT - 40.)) THEN
+        XTAKA_TM(JLWC, JTEMP) = - 3.3515 * (ZT(JTEMP) - XTT)                   &
+                                + 95.957 * (ZT(JTEMP) - XTT)    * ZEW(JLWC)**2 &
+                                + 511.83 * ZEW(JLWC)                           &
+                                + 17.448 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC)**3 &
+                                - 0.0007 * (ZT(JTEMP) - XTT)**3                &
+                                + 20.570 * (ZT(JTEMP) - XTT)    * ZEW(JLWC)    &
+                                + 0.1656 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC)    &
+                                + 0.4954 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC)**3 &
+                                - 0.0975 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC)**2 &
+                                + 67.457 * (ZT(JTEMP) - XTT)    * ZEW(JLWC)**3 &
+                                - 0.1066 * (ZT(JTEMP) - XTT)**2 - 24.5715
+      END IF
+!
+! Eq. 9: < 0
+      IF ( ZT(JTEMP) <= (XTT - 10.) .AND. ZT(JTEMP) >= (XTT - 40.) .AND. &
+             ZEW(JLWC) > 0.4 .AND. ZEW(JLWC) <= 3.2) THEN
+        XTAKA_TM(JLWC, JTEMP) = - 1.5676 * (ZT(JTEMP) - XTT) * ZEW(JLWC)      &
+                                + 0.2484 * (ZT(JTEMP) - XTT)   * ZEW(JLWC)**3 &
+                                + 0.0112 * (ZT(JTEMP) - XTT)**3               &
+                                + 19.199 * (ZT(JTEMP) - XTT)                  &
+                                + 0.8051 * (ZT(JTEMP) - XTT)**2               &
+                                - 83.4 * ZEW(JLWC)                            &
+                                + 15.4 * ZEW(JLWC)**2                         &
+                                + 5.97 * ZEW(JLWC)**3 + 167.9278
+      END IF
+!
+!  Eq. 10: > 0
+      IF ( ZT(JTEMP) <= (XTT - 10.) .AND. ZT(JTEMP) >= (XTT - 40.) .AND. &
+           ZEW(JLWC) > 3.2 .AND. ZEW(JLWC) <= 8. ) THEN
+        XTAKA_TM(JLWC, JTEMP) = 4.2127 * (ZT(JTEMP) - XTT)                 &
+                              - 0.8311 * (ZT(JTEMP) - XTT) * ZEW(JLWC)     &
+                              + 0.0670 * (ZT(JTEMP) - XTT) * ZEW(JLWC) **2 &
+                              + 0.0042 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC)  &
+                              + 40.9642
+      END IF
+    END DO
+  END DO
+!
+  XTAKA_TM(:,:) = XTAKA_TM(:,:) * 1.E-15 ! in C
+!
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	9.	NON_INDUCTIVE PROCESS: AGGREGATION OF ICE ON SNOW
+!		-------------------------------------------------
+!
+!*      9.1     Helsdon and Farley (1987) parameterization
+!
+XFQIAGGSBH = 2.E-14  ! (C.) Constant for ice-snow charging process 
+!
+!
+!*      9.2     Gardiner et al. (1985) parameterization
+!
+XFQIAGGSBG = (XPI / 4.0) * XCCS * XCS**4. * PRHO00**(4. * XCEXVT) * &
+              MOMG(XALPHAS,XNUS,2.+4.*XDS) * 7.3 *          &
+              MOMG(XALPHAI,XNUI,4.)
+!
+!
+!*      9.3     Saunders et al.(1991) parameterization
+!
+XFQIAGGSBS = (XPI / 4.0) * XCCS
+!
+!
+!*      9.4     Takahashi (1978) parameterization
+!
+IF (CNI_CHARGING == 'TAKAH') THEN
+  XFQIAGGSBT1 = (XPI / 4.0) * XCCS * XCS
+  XFQIAGGSBT2 = 10 * MOMG(XALPHAS,XNUS,2.+XDS)
+  XFQIAGGSBT3 = 5. * XCS * MOMG(XALPHAI,XNUI,2.) *               &
+                MOMG(XALPHAS,XNUS,2.+2*XDS) / ((1.E-4)**2 * 8. * & 
+                (XAI * MOMG(XALPHAI,XNUI,XBI))**(2 / XBI))  
+END IF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	10.	ACCRETION OF RAINDROPS ON SNOW
+!		------------------------------
+!
+IF( .NOT.ALLOCATED(XKER_Q_RACCSS)) ALLOCATE( XKER_Q_RACCSS(NACCLBDAS,NACCLBDAR) )
+IF( .NOT.ALLOCATED(XKER_Q_RACCS)) ALLOCATE( XKER_Q_RACCS (NACCLBDAS,NACCLBDAR) )
+IF( .NOT.ALLOCATED(XKER_Q_SACCRG)) ALLOCATE( XKER_Q_SACCRG(NACCLBDAR,NACCLBDAS) )
+!
+XFQRACCS = (XPI / 4.0) * XCCS * XCCR * (PRHO00**XCEXVT)
+!
+XLBQRACCS1  =      MOMG(XALPHAR,XNUR,2.+XFR)
+XLBQRACCS2  = 2. * MOMG(XALPHAR,XNUR,1.+XFR) * MOMG(XALPHAS,XNUS,1.)
+XLBQRACCS3  =      MOMG(XALPHAR,XNUR,XFR)    * MOMG(XALPHAS,XNUS,2.)
+!
+XLBQSACCRG1 =      MOMG(XALPHAS,XNUS,2.+XFS)
+XLBQSACCRG2 = 2. * MOMG(XALPHAS,XNUS,1.+XFS) * MOMG(XALPHAR,XNUR,1.)
+XLBQSACCRG3 =      MOMG(XALPHAS,XNUS,XFS)    * MOMG(XALPHAR,XNUR,2.)
+!
+ZESR = 1.0
+!
+CALL RRCOLSS (KND, XALPHAS, XNUS, XALPHAR, XNUR,                          &
+              ZESR, XFR, XCS, XDS, XCR, XDR,                              &
+              XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, &
+              PFDINFTY, XKER_Q_RACCSS, XAG, XBS, XAS                      )
+!
+CALL RZCOLX  (KND, XALPHAS, XNUS, XALPHAR, XNUR,                          &
+              ZESR, XFR, XCS, XDS, XCR, XDR,                              &
+              XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, &
+              PFDINFTY, XKER_Q_RACCS                                      )
+!
+CALL RSCOLRG (KND, XALPHAS, XNUS, XALPHAR, XNUR,                          &
+              ZESR, XFS, XCS, XDS, XCR, XDR,                              &
+              XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, &
+              PFDINFTY, XKER_Q_SACCRG, XAG, XBS, XAS                      )
+!
+!-------------------------------------------------------------------------------
+!
+!*	11.	DRY GROWTH OF GRAUPELN BY CAPTURE OF SNOW OR ICE
+!		------------------------------------------------
+!
+!*      11.1    charge transfer associated to mass transfer
+!
+IF( .NOT.ALLOCATED(XKER_Q_SDRYG)) ALLOCATE( XKER_Q_SDRYG(NDRYLBDAG,NDRYLBDAS) )
+!
+XFQSDRYG = (XPI / 4.0) * XCCS * XCCG * (PRHO00**XCEXVT)
+!
+XLBQSDRYG1 =      MOMG(XALPHAS,XNUS,2.+XFS)
+XLBQSDRYG2 = 2. * MOMG(XALPHAS,XNUS,1.+XFS) * MOMG(XALPHAG,XNUG,1.)
+XLBQSDRYG3 =      MOMG(XALPHAS,XNUS,XFS)    * MOMG(XALPHAG,XNUG,2.)
+!
+ZEGS = 1. ! also initialized in ini_rain_ice_elec
+!
+CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS,                          &
+             ZEGS, XFS, XCG, XDG, XCS, XDS,                              &
+             XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, &
+             PFDINFTY, XKER_Q_SDRYG                                      )
+!
+!
+!*      11.2    NI process: Heldson et Farley (1987) parameterization
+!
+IF (CNI_CHARGING == 'HELFA') THEN
+  XHIDRYG = 2.E-15   ! Charge exchanged per collision between ice and graupel
+  XHSDRYG = 2.E-14
+!
+  XFQSDRYGBH   = (XPI / 4.0) * XCCG * XCCS * (PRHO00**(XCEXVT)) * XHSDRYG 
+! 
+  XLBQSDRYGB4H =      MOMG(XALPHAS,XNUS,2.)  
+  XLBQSDRYGB5H = 2. * MOMG(XALPHAS,XNUS,1.) * MOMG(XALPHAG,XNUG,1.) 
+  XLBQSDRYGB6H =      MOMG(XALPHAG,XNUG,2.) 
+!
+  IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) )
+  CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS,                          &
+               ZEGS, 0., XCG, XDG, XCS, XDS,                               &
+               XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, &
+               PFDINFTY, XKER_Q_SDRYGB                                     )
+! Delta vqb1_sg
+ENDIF
+!
+!
+!*      11.3    NI process: Gardiner et al. (1985) parameterization
+!
+IF (CNI_CHARGING == 'GARDI') THEN 
+  XFQIDRYGBG   = (XPI / 4.0) * XCCG * (PRHO00**(4. * XCEXVT)) * XCG**4. * &
+                  7.3
+  XLBQIDRYGBG  = MOMG(XALPHAI,XNUI,4.) * MOMG(XALPHAG,XNUG,2.+4.*XDG)
+!
+  XFQSDRYGBG   = (XPI / 4.0) * XCCS * XCCG * (PRHO00**(4. * XCEXVT)) *    &
+                  7.3
+  XLBQSDRYGB4G =      MOMG(XALPHAS,XNUS,4.) * MOMG(XALPHAG,XNUG,2.)
+  XLBQSDRYGB5G = 2. * MOMG(XALPHAS,XNUS,5.) * MOMG(XALPHAG,XNUG,1.)
+  XLBQSDRYGB6G =      MOMG(XALPHAS,XNUS,6.)    
+!
+  IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) )
+  CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS,                          &
+                ZEGS, 4., XCG, XDG, XCS, XDS, 4.,                           &
+                XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, &
+                PFDINFTY, XKER_Q_SDRYGB                                     )
+END IF
+!
+!
+!*      11.4    NI process: Saunders et al. (1991) and 
+!*                          Saunders and Peck (1998) parameterizations
+!
+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
+  XFQIDRYGBS   = (XPI / 4.0) * XCCG
+  XFQSDRYGBS   = (XPI / 4.0) * XCCS * XCCG
+  XLBQSDRYGB1S = MOMG(XALPHAG,XNUG,2.)
+  XLBQSDRYGB2S = 2. * MOMG(XALPHAG,XNUG,1.)
+!
+  IF( .NOT.ALLOCATED(XKER_Q_SDRYGB1)) ALLOCATE( XKER_Q_SDRYGB1(NDRYLBDAG,NDRYLBDAS) )
+  IF( .NOT.ALLOCATED(XKER_Q_SDRYGB2)) ALLOCATE( XKER_Q_SDRYGB2(NDRYLBDAG,NDRYLBDAS) )
+!
+! Positive charging region
+  CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS,                          &
+                ZEGS, XSMP, XCG, XDG, XCS, XDS, (1.+XSNP),                  &
+                XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, &
+                PFDINFTY, XKER_Q_SDRYGB1                                    )
+!
+! Negative charging region
+  CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS,                          &
+                ZEGS, XSMN, XCG, XDG, XCS, XDS, (1.+XSNN),                  &
+                XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, &
+                PFDINFTY, XKER_Q_SDRYGB2                                    )
+ENDIF
+!
+!
+!*      11.5    NI process: Takahashi (1978) parameterization
+!
+IF (CNI_CHARGING == 'TAKAH') THEN
+!
+! IDRYG_boun
+  XFQIDRYGBT1 = (XPI / 4.0) * XCCG * XCG
+  XFQIDRYGBT2 = 10.0 * MOMG(XALPHAG,XNUG,2.+XDG) 
+  XFQIDRYGBT3 = 5.0 * XCG * MOMG(XALPHAI,XNUI,2.) *               &
+                MOMG(XALPHAG,XNUG,2.+2.*XDG) / ((2.E-4)**2 * 8. * & 
+               (XAI * MOMG(XALPHAI,XNUI,XBI))**(2 / XBI))  
+!
+! SDRYG_boun
+  XFQSDRYGBT1  = (XPI / 4.0) * XCCG * XCCS
+  XFQSDRYGBT2  = XCG * MOMG(XALPHAG,XNUG,XDG) * MOMG(XALPHAS,XNUS,2.)
+  XFQSDRYGBT3  = XCS * MOMG(XALPHAS,XNUS,2.+XDS)
+  XFQSDRYGBT4  = XCG * MOMG(XALPHAG,XNUG,2.+XDG)
+  XFQSDRYGBT5  = XCS * MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS,XNUS,XDS)
+  XFQSDRYGBT6  = 2. * XCG * MOMG(XALPHAG,XNUG,1.+XDG) * MOMG(XALPHAS,XNUS,1.)
+  XFQSDRYGBT7  = 2. * XCS * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS,XNUS,1.+XDS)
+  XFQSDRYGBT8  = 5. / ((1.E-4)**2 * 8.)
+  XFQSDRYGBT9  = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS,XNUS,2.)
+  XFQSDRYGBT10 = MOMG(XALPHAS,XNUS,4.)
+  XFQSDRYGBT11 = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS,XNUS,3.)
+!
+  IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) )
+  CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS,                          &
+                ZEGS, 2., XCG, XDG, XCS, XDS, 2.,                           &
+                XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, &
+                PFDINFTY, XKER_Q_SDRYGB                                     )
+END IF
+!
+!
+!*      11.6    NI process: limit the charge exchanged during QSDRYG_boun
+!
+IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'SAP98' .OR. &
+    CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. &
+    CNI_CHARGING == 'GARDI' .OR.                              &
+    CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. &
+    CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN
+  XAUX_LIM  = (XPI / 4.0) * XCCG * XCCS
+  XAUX_LIM1 =      MOMG(XALPHAS,XNUS,2.)  
+  XAUX_LIM2 = 2. * MOMG(XALPHAS,XNUS,1.) * MOMG(XALPHAG,XNUG,1.) 
+  XAUX_LIM3 =      MOMG(XALPHAG,XNUG,2.)
+  IF( .NOT.ALLOCATED(XKER_Q_LIMSG)) ALLOCATE( XKER_Q_LIMSG(NDRYLBDAG,NDRYLBDAS) )
+  CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS,                          &
+               ZEGS, 0., XCG, XDG, XCS, XDS,                               &
+               XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, &
+               PFDINFTY, XKER_Q_LIMSG)
+ENDIF
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	12.	DRY GROWTH OF GRAUPELN BY CAPTURE OF RAINDROP
+!		---------------------------------------------
+!
+IF( .NOT.ALLOCATED(XKER_Q_RDRYG)) ALLOCATE( XKER_Q_RDRYG(NDRYLBDAG,NDRYLBDAR) ) 
+!
+XFQRDRYG = (XPI / 4.0) * XCCG * XCCR * (PRHO00**XCEXVT)
+!
+XLBQRDRYG1 =      MOMG(XALPHAR,XNUR,2.+XFR)
+XLBQRDRYG2 = 2. * MOMG(XALPHAR,XNUR,1.+XFR) * MOMG(XALPHAG,XNUG,1.)
+XLBQRDRYG3 =      MOMG(XALPHAR,XNUR,XFR)    * MOMG(XALPHAG,XNUG,2.)
+!
+ZEGR = 1.0 
+!
+CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAR, XNUR,                            & 
+             ZEGR, XFR, XCG, XDG, XCR, XDR,                                &
+             XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN,   &
+             PFDINFTY, XKER_Q_RDRYG                                        )
+!
+!
+!-------------------------------------------------------------------------------
+!
+!*	13.	UPDATE THE Q=f(D) RELATION
+!		--------------------------
+!
+XFQUPDC   = 400.E6 * MOMG(XALPHACQ,XNUCQ,XFC) / XLBDACQ**XFC ! Nc~400E6 m-3 as 
+                                                          ! proposed for RCHONI
+!
+XFQUPDR   = XCCR * MOMG(XALPHAR,XNUR,XFR)
+XEXFQUPDI = (XFI/XBI)
+XFQUPDI   = MOMG(XALPHAI,XNUI,XFI) * (XAI*MOMG(XALPHAI,XNUI,XBI))**(-XEXFQUPDI)
+XFQUPDS   = XCCS * MOMG(XALPHAS,XNUS,XFS)
+XFQUPDG   = XCCG * MOMG(XALPHAG,XNUG,XFG)
+XFQUPDH   = XCCH * MOMG(XALPHAH,XNUH,XFH)
+!
+!
+!------------------------------------------------------------------------------
+!
+!*      14.     INDUCTIVE PROCESS
+!               -----------------
+!
+! d = 15 microns and N_c = 400 cm**(-3)
+!
+XCOLCG_IND = 0.8
+XEBOUND    = 0.1
+XALPHA_IND = 0.07    ! moderate inductive charging
+XCOS_THETA = 0.2  
+!
+XIND1 = (XPI**3 / 8.) * (15.E-6)**2 * &
+         XCG * 400.E6 * XCCG *        &
+        XCOLCG_IND * XEBOUND * XALPHA_IND
+XIND2 = XPI * XEPSILON * XCOS_THETA * MOMG(XALPHAG,XNUG,2.+XDG)
+XIND3 = MOMG(XALPHAG,XNUG,XDG+XFG) / 3.
+!
+!-------------------------------------------------------------------------------
+!
+!*	15.	LIGHTNING FLASHES
+!		-----------------
+! 
+XFQLIGHTC  = 660. * MOMG(3.,3.,2.) / MOMG(3.,3.,3.)   ! PI/A*lbda^(b-2) = 660.
+!
+XFQLIGHTR  = XPI * XCCR * MOMG(XALPHAR,XNUR,2.)
+XEXQLIGHTR = XCXR - 2.
+!
+XEXQLIGHTI = 2. / XBI
+XFQLIGHTI  = XPI / 4. * MOMG(XALPHAI,XNUI,2.) *                   &
+            (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XEXQLIGHTI)
+!
+XFQLIGHTS  = XPI * XCCS * MOMG(XALPHAS,XNUS,2.)
+XEXQLIGHTS = XCXS - 2.
+!
+XFQLIGHTG  = XPI * XCCG * MOMG(XALPHAG,XNUG,2.)
+XEXQLIGHTG = XCXG - 2.
+!
+XFQLIGHTH  = XPI * XCCH * MOMG(XALPHAH,XNUH,2.)
+XEXQLIGHTH = XCXH - 2.
+!
+IF( .NOT.ALLOCATED(XNEUT_POS)) ALLOCATE( XNEUT_POS(NLGHTMAX) )
+IF( .NOT.ALLOCATED(XNEUT_NEG)) ALLOCATE( XNEUT_NEG(NLGHTMAX) )
+XNEUT_POS(:) = 0.
+XNEUT_NEG(:) = 0.
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE INI_PARAM_ELEC
-- 
GitLab