From ea5c67b548ddd855d82c8e8cd67fc1495a5a59d2 Mon Sep 17 00:00:00 2001
From: Gaelle TANGUY <gaelle.tanguy@meteo.fr>
Date: Tue, 8 Nov 2016 15:46:54 +0100
Subject: [PATCH] M.Leriche 11/2016 : Chemistry

---
 src/MNH/ch_aqueous_sedim2mom.f90 | 304 +++++++++++++++++++++++++++++++
 src/MNH/ch_init_ice.f90          | 123 +++++++++++++
 src/MNH/modd_ch_icen.f90         |  74 ++++++++
 3 files changed, 501 insertions(+)
 create mode 100644 src/MNH/ch_aqueous_sedim2mom.f90
 create mode 100644 src/MNH/ch_init_ice.f90
 create mode 100644 src/MNH/modd_ch_icen.f90

diff --git a/src/MNH/ch_aqueous_sedim2mom.f90 b/src/MNH/ch_aqueous_sedim2mom.f90
new file mode 100644
index 000000000..eef9eff0a
--- /dev/null
+++ b/src/MNH/ch_aqueous_sedim2mom.f90
@@ -0,0 +1,304 @@
+!MNH_LIC Copyright 1994-2014 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_CH_AQUEOUS_SEDIM2MOM
+!      ################################
+!
+INTERFACE
+      SUBROUTINE CH_AQUEOUS_SEDIM2MOM (KSPLITR, HCLOUD, PTSTEP, PRTMIN_AQ,&
+                                       PZZ, PRHODREF, PRHODJ, PRRT, PRRS, &
+                                       PCRT, PCRS, PSVT, PRSVS, PINPRR    )
+!
+CHARACTER(LEN=*),         INTENT(IN)    :: HCLOUD ! kind if cloud
+INTEGER,                  INTENT(IN)    :: KSPLITR ! splitting factor
+REAL,                     INTENT(IN)    :: PTSTEP  ! Time step
+REAL,                     INTENT(IN)    :: PRTMIN_AQ ! LWC threshold liq. chem.
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRT    ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRS    ! Rain water m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCRT    ! Rain water C at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCRS    ! Rain water C. source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSVT    ! Precip. aq. species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS   ! Precip. aq. species source
+REAL, DIMENSION(:,:),     INTENT(OUT)   :: PINPRR  ! instantaneaous precip.
+!
+END SUBROUTINE CH_AQUEOUS_SEDIM2MOM
+END INTERFACE
+END MODULE MODI_CH_AQUEOUS_SEDIM2MOM
+!
+!     #####################################################################
+      SUBROUTINE CH_AQUEOUS_SEDIM2MOM (KSPLITR, HCLOUD, PTSTEP, PRTMIN_AQ,&
+                                       PZZ, PRHODREF, PRHODJ, PRRT, PRRS, &
+                                       PCRT, PCRS, PSVT, PRSVS, PINPRR    )
+!     #####################################################################
+!
+!!****  * -  compute the explicit microphysical sources 
+!!
+!!    PURPOSE
+!!    -------
+!!      The purpose of this routine is to compute the sedimentation of chemical
+!!   species in the raindrops for the C2R2 and C3R5 cloud microphysical schemes.
+!!      The sedimentation rates are computed with a time spliting technique: 
+!!    an upstream scheme, written as a difference of non-advective fluxes. 
+!!    This source term is added to the next coming time step (split-implicit 
+!!    process). see rain_c2r2.f90
+!!
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!      None
+!!     
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!      Module MODD_PARAMETERS
+!!          JPHEXT       : Horizontal external points number
+!!          JPVEXT       : Vertical external points number
+!!      Module MODD_CONF :
+!!          CCONF configuration of the model for the first time step
+!!
+!!    REFERENCE
+!!    ---------
+!!      Book1 of the documentation ( routine CH_AQUEOUS_SEDIMC2R2 )
+!!
+!!    AUTHOR
+!!    ------
+!!      M. Leriche & J.P. Pinty      * Laboratoire d'Aerologie*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    30/10/08
+!!   2014 G.Delautier : remplace MODD_RAIN_C2R2_PARAM par MODD_RAIN_C2R2_KHKO_PARAM
+!!   12/15 M.Leriche : compute instantaneous rain at the surface 
+!!    J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1      
+!!   01/16 M. Leriche : Fusion C2R2 and KHKO
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_PARAMETERS
+USE MODD_CONF
+USE MODD_CST,             ONLY : XRHOLW, XPI
+USE MODD_RAIN_C2R2_DESCR, ONLY : XRTMIN, XCTMIN
+!
+USE MODE_ll
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+CHARACTER(LEN=*),         INTENT(IN)    :: HCLOUD ! kind if cloud
+INTEGER,                  INTENT(IN)    :: KSPLITR ! splitting factor
+REAL,                     INTENT(IN)    :: PTSTEP  ! Time step          
+REAL,                     INTENT(IN)    :: PRTMIN_AQ ! LWC threshold liq. chem.
+!
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PZZ     ! Height (z)
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF! Reference density
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODJ  ! Dry density * Jacobian
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRT    ! Rain water m.r. at t
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRRS    ! Rain water m.r. source
+REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PCRT    ! Rain water C at t
+REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCRS    ! Rain water C. source
+REAL, DIMENSION(:,:,:,:), INTENT(IN)    :: PSVT    ! Precip. aq. species at t
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS   ! Precip. aq. species source
+REAL, DIMENSION(:,:),     INTENT(OUT)   :: PINPRR  ! instantaneaous precip.
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER :: JK,JI,JJ            ! Vertical loop index for the rain sedimentation 
+INTEGER :: JN            ! Temporal loop index for the rain sedimentation
+INTEGER :: IIB           !  Define the domain where is 
+INTEGER :: IIE           !  the microphysical sources have to be computed
+INTEGER :: IJB           ! 
+INTEGER :: IJE           !
+INTEGER :: IKB           ! 
+INTEGER :: IKE           !
+!
+REAL    :: ZTSPLITR      ! Small time step for rain sedimentation
+!
+INTEGER :: ISEDIM ! Case number of sedimentation
+LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) &
+                                :: GSEDIM ! where to compute the SED processes
+!REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+!                                :: ZRRS  ! Rain water m.r. source phys.tendency (*dt)
+!REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+!                                :: ZCRS  ! Rain water C source phys.tendency
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZW     ! work array
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZMVRR, ZVRR ! sedimentation velocity for rain
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZWSED  ! sedimentation fluxes for chem.
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZWSEDR  ! sedimentation fluxes
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZRR_SEDIM       ! Drain/Dt sur ZTSPLIT
+REAL,    DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3))   &
+                                :: ZSV_SEDIM_FACT  ! Cumul des Dsv/DT
+REAL, DIMENSION(:), ALLOCATABLE :: ZRRT  ! Rain water m.r. at t
+REAL, DIMENSION(:), ALLOCATABLE :: ZRHODREF, & ! RHO Dry REFerence
+                                   ZZVRR,    & ! sedimentation velocity for rain
+                                   ZZW1,ZZW2  ! Work array
+!
+INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT
+INTEGER                           :: JL       ! and PACK intrinsics
+!
+!-------------------------------------------------------------------------------
+!
+!*       1.     COMPUTE THE LOOP BOUNDS
+!   	        -----------------------
+!
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
+IKB=1+JPVEXT
+IKE=SIZE(PZZ,3) - JPVEXT
+PINPRR(:,:) = 0. ! initialize instantaneous precip.
+!
+!-------------------------------------------------------------------------------
+!
+!!*       2.     TRANSFORMATION INTO PHYSICAL TENDENCIES
+!               ---------------------------------------
+!
+!ZRRS(:,:,:) = PRRS(:,:,:) / PRHODJ(:,:,:)
+!ZCRS(:,:,:) = PCRS(:,:,:) / PRHODJ(:,:,:)
+!
+!-------------------------------------------------------------------------------
+!
+!*       3.     COMPUTE THE SEDIMENTATION (RS) SOURCE
+!	        -------------------------------------
+!
+!*       3.1    time splitting loop initialization
+!
+ZTSPLITR = PTSTEP / FLOAT(KSPLITR)       ! Small time step
+!
+!
+!*       3.2    compute the sedimentation velocities for rain
+!
+ZMVRR(:,:,:) = 0.
+ZVRR(:,:,:) = 0.
+WHERE (PCRT(:,:,:) > XCTMIN(3) .and. PRRT(:,:,:)>XRTMIN(3) )
+  ZMVRR(:,:,:) = ((3. * PRHODREF(:,:,:)*PRRT(:,:,:))/   &
+                  (4. * XPI *XRHOLW*PCRT(:,:,:)))**0.333 ! in m
+  ZVRR(:,:,:) = 0.012 * 1.0E6 * ZMVRR(:,:,:) - 0.2 ! velocity for mixing ratio
+END WHERE
+WHERE (ZVRR(:,:,:) .lt. 0.0)
+  ZVRR(:,:,:) = 0.0
+END WHERE
+!
+!*       3.4    compute the fluxes
+! 
+!  optimization by looking for locations where
+!  the precipitating fields are larger than a minimal value only !!!
+!
+ZSV_SEDIM_FACT(:,:,:) = 1.0
+DO JN = 1 , KSPLITR
+! 
+  GSEDIM(:,:,:) = .FALSE.
+  GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = PRRT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(3) .AND. &
+                                    PCRT(IIB:IIE,IJB:IJE,IKB:IKE) > XCTMIN(3)
+  ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:))
+  IF( ISEDIM >= 1 ) THEN
+    IF( JN==1 ) THEN
+      ZW(:,:,:) = 0.0
+      DO JK = IKB , IKE
+        ZW(:,:,JK) =ZTSPLITR/(PZZ(:,:,JK+1)-PZZ(:,:,JK))
+      END DO
+    END IF
+    ALLOCATE(ZRHODREF(ISEDIM))
+    ALLOCATE(ZZVRR(ISEDIM))
+    DO JL=1,ISEDIM
+      ZRHODREF(JL) =  PRHODREF(I1(JL),I2(JL),I3(JL))
+      ZZVRR(JL) = ZVRR(I1(JL),I2(JL),I3(JL))
+    ENDDO
+    ALLOCATE(ZZW1(ISEDIM)) ; ZZW1(:) = 0.0
+!
+!*      for rain/drizzle
+!
+    ZWSED(:,:,:) = 0.0
+    ZWSEDR(:,:,:) = 0.0
+    ZZW1(:) = ZZVRR(:) * ZRHODREF(:)
+    ZWSED(:,:,:) = UNPACK( ZZW1(:),MASK=GSEDIM(:,:,:),FIELD=0.0 )
+    ZRR_SEDIM(:,:,:) = 0.0
+    DO JK = IKB , IKE
+      ZRR_SEDIM(:,:,JK) = ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK))&
+                          /PRHODREF(:,:,JK)
+    END DO
+!*      compute instantaneous accumulated precipitations
+    IF ( JN == 1 ) THEN
+      ALLOCATE(ZZW2(ISEDIM)) ; ZZW2(:) = 0.0
+      ALLOCATE(ZRRT(ISEDIM))
+      DO JL=1,ISEDIM
+        ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL))
+      ENDDO
+      WHERE(ZRRT(:) > XRTMIN(3) )
+        ZZW2(:) = ZZVRR(:) * ZRRT(:) * ZRHODREF(:)
+      ENDWHERE
+      ZWSEDR(:,:,:) = UNPACK( ZZW2(:),MASK=GSEDIM(:,:,:),FIELD=0.0 )
+      DEALLOCATE(ZRRT)
+      DEALLOCATE(ZZW2)
+      PINPRR(:,:) = ZWSEDR(:,:,IKB)/XRHOLW              ! in m/s
+    ENDIF
+! end compute accumulated precip.
+    DEALLOCATE(ZRHODREF)
+    DEALLOCATE(ZZVRR)
+    DEALLOCATE(ZZW1)
+    ZSV_SEDIM_FACT(:,:,:) =   ZSV_SEDIM_FACT(:,:,:) * (1.0 + ZRR_SEDIM(:,:,:))
+!                       (1.0 + ZRR_SEDIM(:,:,:)/MAX(ZZRRS(:,:,:),XRTMIN_AQ))
+  END IF      
+END DO
+!
+! Apply the rain sedimentation rate to the WR_xxx aqueous species
+!
+DO JL= 1, SIZE(PRSVS,4)
+  PRSVS(:,:,:,JL) = MAX( 0.0,ZSV_SEDIM_FACT(:,:,:)*PRSVS(:,:,:,JL) )
+END DO
+!
+CONTAINS
+!
+!-------------------------------------------------------------------------------
+!
+  FUNCTION COUNTJV(LTAB,I1,I2,I3) RESULT(IC)
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+IMPLICIT NONE
+!
+!*       0.2  declaration of local variables
+!
+!
+LOGICAL, DIMENSION(:,:,:) :: LTAB ! Mask
+INTEGER, DIMENSION(:) :: I1,I2,I3 ! Used to replace the COUNT and PACK
+INTEGER :: IC
+INTEGER :: JI,JJ,JK
+!  
+!-------------------------------------------------------------------------------
+!
+IC = 0
+DO JK = 1,SIZE(LTAB,3)
+  DO JJ = 1,SIZE(LTAB,2)
+    DO JI = 1,SIZE(LTAB,1)
+      IF( LTAB(JI,JJ,JK) ) THEN
+        IC = IC +1
+        I1(IC) = JI
+        I2(IC) = JJ
+        I3(IC) = JK
+      END IF
+    END DO
+  END DO
+END DO
+!
+END FUNCTION COUNTJV
+!
+!-------------------------------------------------------------------------------
+!
+END SUBROUTINE CH_AQUEOUS_SEDIM2MOM
diff --git a/src/MNH/ch_init_ice.f90 b/src/MNH/ch_init_ice.f90
new file mode 100644
index 000000000..164ea7e45
--- /dev/null
+++ b/src/MNH/ch_init_ice.f90
@@ -0,0 +1,123 @@
+!MNH_LIC Copyright 1994-2014 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.
+! $Source: /home/cvsroot/MNH-V5-1-4/src/SRC_CHIMAQ/ch_init_icen.f90
+!-----------------------------------------------------------------
+!     ############################
+      MODULE MODI_CH_INIT_ICE
+!     ############################
+!
+INTERFACE
+!
+      SUBROUTINE CH_INIT_ICE(OUSECHIC, OCH_RET_ICE,      &
+                             HNAMES, HICNAMES, KEQ, KEQAQ)
+!
+INTEGER,                  INTENT(IN)    :: KEQ   ! Number of chem. spec.
+INTEGER,                  INTENT(IN)    :: KEQAQ   ! Number of liq. chem. spec.
+LOGICAL,                  INTENT(IN)    :: OUSECHIC ! flag for ice chem.
+LOGICAL,                  INTENT(IN)    :: OCH_RET_ICE ! flag for retention in ice
+!
+CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HNAMES ! name of chem. species
+CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HICNAMES ! name of ice chem. species
+!
+END SUBROUTINE CH_INIT_ICE
+!
+END INTERFACE
+!
+END MODULE MODI_CH_INIT_ICE
+!
+!
+!      ######################################################
+       SUBROUTINE CH_INIT_ICE(OUSECHIC, OCH_RET_ICE,      &
+                              HNAMES, HICNAMES, KEQ, KEQAQ)
+!      ######################################################
+!!
+!!***  *CH_INIT_ICE*
+!!
+!!    PURPOSE
+!!    -------
+!      Initialize module aqueous ice chemistry (index, )
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    REFERENCES
+!!    ----------
+!!    MesoNH-chemistry book 3
+!!
+!!    AUTHOR
+!!    ------
+!!    M. Leriche, P. Tulet
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!    Original 11/12/15
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!    None
+!----------------------------------------------------------------------------
+!
+USE MODD_CH_ICE_n, ONLY : NINDEXGI, NINDEXWI, NINDEXWG
+USE MODD_NSV, ONLY : NSV_CHGSBEG, NSV_CHGSEND, &
+                     NSV_CHACBEG, NSV_CHACEND, &
+                     NSV_CHICBEG, NSV_CHICEND
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+!
+INTEGER,                  INTENT(IN)    :: KEQ   ! Number of chem. spec.
+INTEGER,                  INTENT(IN)    :: KEQAQ   ! Number of liq. chem. spec.
+LOGICAL,                  INTENT(IN)    :: OUSECHIC ! flag for ice chem.
+LOGICAL,                  INTENT(IN)    :: OCH_RET_ICE ! flag for retention in ice
+!
+CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HNAMES ! name of chem. species
+CHARACTER(LEN=32), DIMENSION(:), INTENT(IN) :: HICNAMES ! name of ice chem. species
+!
+!*       0.2   Declarations of local variables :
+!
+INTEGER :: JI,JJ, JLI, JLW, JLG   ! loop counters
+!----------------------------------------------------------------------------
+!
+!  PREPARE INDEX ARRAY FOR ICE PHASE CHEMISTRY
+!  -------------------------------------------
+!
+
+ALLOCATE (NINDEXGI(NSV_CHICEND-NSV_CHICBEG+1))
+ALLOCATE (NINDEXWI(NSV_CHICEND-NSV_CHICBEG+1))
+ALLOCATE (NINDEXWG(NSV_CHACEND-NSV_CHACBEG+KEQAQ/2+1))
+NINDEXGI(:) = 0
+NINDEXWI(:) = 0
+NINDEXWG(:) = 0
+IF (OUSECHIC) THEN
+  DO JLI = 1, NSV_CHICEND-NSV_CHICBEG+1
+    DO JLG = 1, NSV_CHGSEND-NSV_CHGSBEG+1
+      IF ( TRIM(HICNAMES(JLI)(4:32)) == TRIM(HNAMES(JLG)) ) THEN
+         NINDEXGI(JLI) = JLG
+         EXIT
+      ENDIF
+    ENDDO
+    DO JLW = KEQ-KEQAQ+1, KEQ-KEQAQ/2  ! loop over cloud chem. species
+      IF ( TRIM(HICNAMES(JLI)(4:32)) == TRIM(HNAMES(JLW)(4:32))) THEN
+        NINDEXWI(JLI) = JLW - (KEQ-KEQAQ)
+        EXIT
+      ENDIF
+    ENDDO
+  ENDDO
+ELSE IF (.NOT.(OCH_RET_ICE)) THEN
+    DO JLW = KEQ-KEQAQ+1, KEQ-KEQAQ/2  ! loop over cloud chem. species
+      DO JLG = 1, NSV_CHGSEND-NSV_CHGSBEG+1
+        IF ( TRIM(HNAMES(JLW)(4:32)) == TRIM(HNAMES(JLG)) ) THEN
+          NINDEXWG(JLW-(KEQ-KEQAQ)) = JLG
+          EXIT
+        ENDIF
+      ENDDO
+    ENDDO
+END IF
+!
+ 
+END SUBROUTINE CH_INIT_ICE
+
diff --git a/src/MNH/modd_ch_icen.f90 b/src/MNH/modd_ch_icen.f90
new file mode 100644
index 000000000..8f9323d0c
--- /dev/null
+++ b/src/MNH/modd_ch_icen.f90
@@ -0,0 +1,74 @@
+!MNH_LIC Copyright 1994-2014 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.
+!-----------------------------------------------------------------
+!--------------- special set of characters for RCS information
+!-----------------------------------------------------------------
+! $Source: /home//MESONH/MNH-V5-1-4/src/MODIF_TMICICE/modd_ch_icen.f90
+!-----------------------------------------------------------------
+!-----------------------------------------------------------------
+!-----------------------------------------------------------------
+!-----------------------------------------------------------------------------
+!!    ########################
+      MODULE MODD_CH_ICE_n
+!!    ########################
+!!
+!!*** *MODD_CH_ICE$n*
+!!
+!!    PURPOSE
+!!    -------
+!       This module contains the index for ice phase chemistry or degassing when
+!!    the cloud microphysics scheme is ICE3/4
+!!
+!!**  AUTHOR
+!!    ------
+!!    M. Leriche      *Laboratoire d'Aerologie*
+!
+!!    MODIFICATIONS
+!!    -------------
+!!    Original 11/12/15
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!    none
+!!
+!-----------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!        -----------------
+USE MODD_PARAMETERS, ONLY: JPMODELMAX
+IMPLICIT NONE
+
+TYPE CH_ICE_t
+!
+
+  INTEGER, POINTER, DIMENSION(:)  :: NINDEXGI, NINDEXWI, NINDEXWG
+!
+!-----------------------------------------------------------------------------
+END TYPE CH_ICE_t
+
+TYPE(CH_ICE_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: CH_ICE_MODEL
+
+INTEGER, POINTER, DIMENSION(:) :: NINDEXGI=>NULL()
+INTEGER, POINTER, DIMENSION(:) :: NINDEXWI=>NULL()
+INTEGER, POINTER, DIMENSION(:) :: NINDEXWG=>NULL()
+
+CONTAINS
+
+SUBROUTINE CH_ICE_GOTO_MODEL(KFROM, KTO)
+INTEGER, INTENT(IN) :: KFROM, KTO
+!
+! Save current state for allocated arrays
+CH_ICE_MODEL(KFROM)%NINDEXGI=>NINDEXGI
+CH_ICE_MODEL(KFROM)%NINDEXWI=>NINDEXWI
+CH_ICE_MODEL(KFROM)%NINDEXWG=>NINDEXWG
+!
+! Current model is set to model KTO
+NINDEXGI=>CH_ICE_MODEL(KTO)%NINDEXGI
+NINDEXWI=>CH_ICE_MODEL(KTO)%NINDEXWI
+NINDEXWG=>CH_ICE_MODEL(KTO)%NINDEXWG
+
+END SUBROUTINE CH_ICE_GOTO_MODEL
+
+END MODULE MODD_CH_ICE_n
-- 
GitLab