diff --git a/A-INSTALL b/A-INSTALL
index b24b68d83beadd3dad6fdce21619a189c8c84192..fd58dab6f265e5ed95c672869c60329b468d940b 100644
--- a/A-INSTALL
+++ b/A-INSTALL
@@ -1,8 +1,8 @@
 #
 # Version of PACKAGE MESONH "Open distribution"
-#              PACK-MNH-V5-6-2
-#              DATE : 28/11/2023
-#              VERSION : MESONH MASDEV5_6 + BUG-2
+#              PACK-MNH-V5-7-0
+#              DATE : 08/01/2024
+#              VERSION : MESONH MASDEV5_7 + BUG-0
 #
 #  MAP
 #
@@ -1022,13 +1022,9 @@ git clone -b 2014.01 https://github.com/forefireAPI/firefront.git
 # b) MNH_RTTOV for optional radiative computation
 # --------------------------------------
 #
-# The RTTOV package was not included into the open source version of Meso-NH
+# The RTTOV 13.2 package was not included into the open source version of Meso-NH
 # because it needs a licence agrement.
 #
-# ----------------------------------
-# OPTION 1: Use version 13.2 of RTTOV 
-# -----------------------------------
-#
 # Run the 'configure' script preceded with the setting of the MNH_RTTOV variable:
 #
 cd MNH.../src/
@@ -1058,63 +1054,6 @@ make ARCH=ifort        # Use Intel "ifort" compiler; other options: gfortran, NA
 cd MNH.../src/
 make
 
-# ----------------------------------
-# OPTION 2: Use version 11.3 of RTTOV 
-# -----------------------------------
-# Download the RTTOV package rttov113.tar.gz by following the instructions given on https://nwpsaf.eu/site/software/rttov/
-#
-# Install the RTTOV package rttov113.tar.gz
-cd MNH.../src/LIB
-mkdir RTTOV-11.3
-cd RTTOV-11.3
-tar xvfz rttov113.tar.gz
-cd src
-make ARCH=ifort        # Use Intel "ifort" compiler; other options: gfortran, NAG, pgf90, IBM
-#
-# And then for the compilation, run the 'configure' script preceded with the setting of the MNH_RTTOV variable:
-#
-
-cd MNH.../src/
-export MNH_RTTOV=1
-export VER_RTTOV=11.3
-./configure
-
-etc ...
-
-# ----------------------------------
-# OPTION 3: Use version 8.7 of RTTOV 
-# ----------------------------------
-# For already(old) licencied MesoNH users (MNH-4-X version with research licence see here: http://mesonh.aero.obs-mip.fr/mesonh410/UserInformation)
-#
-# the package could be reloaded in this way  
-#
-# - With cvs access
-#
-
-cd MNH.../src/LIB
-cvs up -rPACK-MNH-V4-10-3 -d -P RTTOV
-
-#
-# - With WEB access (with WEB login/pass as usually) the RTTOV package could also be retrieve in tarball with wget like this:
-#
-
-cd MNH.../src/LIB
-wget --http-user=USER  --http-password=PASS 'http://mesonh.aero.obs-mip.fr/cgi-bin/mesonh_interne/viewcvs.cgi/MNH-VX-Y-Z/src/LIB/RTTOV/?view=tar&pathrev=PACK-MNH-V4-10-3' -O RTTOV.tar.gz
-tar xvfz RTTOV.tar.gz
-
-# /!\ don't forget the ''.  Otherwise, this will not work!
-
-#
-# And then for the compilation, run the 'configure' script preceded with the setting of the MNH_RTTOV variable:
-#
-
-cd MNH.../src/
-export MNH_RTTOV=1
-export VER_RTTOV=8.7
-./configure
-
-etc ...
-
 # c) MNH_ECRAD for optional compilation of new ECRAD radiative library from ECMWF 
 # --------------------------------------
 #
diff --git a/MY_RUN/KTEST/014_LIMA/002_mesonh/EXSEG1.nam b/MY_RUN/KTEST/014_LIMA/002_mesonh/EXSEG1.nam
index 520671a7f97b4fde4022bafc66f27be5c186bfe5..626e2e3f9b91e7835674cfe896f7aabb42a9178a 100644
--- a/MY_RUN/KTEST/014_LIMA/002_mesonh/EXSEG1.nam
+++ b/MY_RUN/KTEST/014_LIMA/002_mesonh/EXSEG1.nam
@@ -38,6 +38,7 @@
                 CTURBDIM = "3DIM",
                 LTURB_DIAG = F,
                 LTURB_FLX = F
+		LTURB_PRECIP = F/
                 /
 
 &NAM_CH_MNHCn   LUSECHEM = F /
@@ -103,24 +104,28 @@
                 XIFN_CONC(1)=1000./         ! Concentration du mode 1 d'IFN (/L)
 
 
-&NAM_BU_RU      LBU_RU  = T /
+&NAM_BU_RU      LBU_RU  = F /
 
-&NAM_BU_RW      LBU_RW  = T /
+&NAM_BU_RW      LBU_RW  = F /
 
 &NAM_BU_RTH     LBU_RTH = T /
 
-&NAM_BU_RRV     LBU_RRV = T /
+&NAM_BU_RRV     LBU_RRV = F /
 
-&NAM_BU_RRC     LBU_RRC = T /
+&NAM_BU_RRC     LBU_RRC = F /
 
-&NAM_BU_RRR     LBU_RRR = T /
+&NAM_BU_RRR     LBU_RRR = T,
+		CBULIST_RRR(1) = "ALL"/
 
 &NAM_BU_RRI     LBU_RRI = T /
 
-&NAM_BU_RRS     LBU_RRS = T /
+&NAM_BU_RRS     LBU_RRS = T,
+		CBULIST_RRS(1) = "ALL"/
 
-&NAM_BU_RRG     LBU_RRG = T /
+&NAM_BU_RRG     LBU_RRG = T,
+		CBULIST_RRG(1) = "ALL"/
 
 &NAM_BU_RSV     LBU_RSV = T /
+		CBULIST_RSV(1) = "ALL"/
 &NAM_NEBn LSUBG_COND = F  /
 &NAM_PARAM_ICEn CSUBG_AUCV_RC = 'NONE'/
diff --git a/bin/Mpirun b/bin/Mpirun
index a17fb8255685db0979e45334e0c91aad8f75197b..f1da14a45e8d8206d8a0cd3de833608aadabc4d0 100755
--- a/bin/Mpirun
+++ b/bin/Mpirun
@@ -3,7 +3,7 @@
 #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.
-set -x
+#set -x
 NARGS=$#
 let "N_1=${NARGS} - 1"
 export N_1
diff --git a/bin/spll b/bin/spll
index 2fca7bbac410524360863946a1c820c5672ae4eb..58dd5438bb435dbcdaee6390b05005b7dc3e2b83 100755
--- a/bin/spll
+++ b/bin/spll
@@ -4,6 +4,7 @@
 #MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 #MNH_LIC for details. version 1.
 #set -x
+export LC_ALL=C
 if [ $# -ne 2 ]
 then
 echo ERROR USAGE :: spll NSOURCE file
@@ -33,7 +34,8 @@ turb.f90|shallow_mf.f90|rain_ice.f90|lima.f90|\
 lima_adjust_split.f90|lima_precip_scavenging.f90|ini_tiwmx.f90|\
 ini_snow.f90|ini_rain_ice.f90|ini_neb.f90|ini_cst.f90|\
 ice_adjust.f90|gradient_u.f90|gradient_v.f90|gradient_w.f90|\
-gamma.f90|gamma_inc.f90|general_gamma.f90|condensation.f90"
+gamma.f90|gamma_inc.f90|general_gamma.f90|condensation.f90|\
+minpack.f90"
 #
 
 if [ "$SUF" = "f" ]
diff --git a/bin/spll_lst b/bin/spll_lst
index 96bd5b15f838cb28c8c77a1904954b55e29d68e1..c86fcf06be5706aa9c20437845dd1cbcd49ffa75 100755
--- a/bin/spll_lst
+++ b/bin/spll_lst
@@ -4,6 +4,7 @@
 #MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 #MNH_LIC for details. version 1.
 #set -x
+export LC_ALL=C
 if [ $# -ne 2 ]
 then
 echo ERROR USAGE :: spll NSOURCE file
@@ -33,7 +34,8 @@ turb.f90|shallow_mf.f90|rain_ice.f90|lima.f90|\
 lima_adjust_split.f90|lima_precip_scavenging.f90|ini_tiwmx.f90|\
 ini_snow.f90|ini_rain_ice.f90|ini_neb.f90|ini_cst.f90|\
 ice_adjust.f90|gradient_u.f90|gradient_v.f90|gradient_w.f90|\
-gamma.f90|gamma_inc.f90|general_gamma.f90|condensation.f90"
+gamma.f90|gamma_inc.f90|general_gamma.f90|condensation.f90|\
+minpack.f90"
 #
 
 if [ "$SUF" = "f" ]
diff --git a/bin/spll_new b/bin/spll_new
index ba3f84c799656ca9bafb0ab4334cd13b87d6ab0a..2f450ebdaa82eab9bcda1311761a910654798941 100755
--- a/bin/spll_new
+++ b/bin/spll_new
@@ -4,6 +4,7 @@
 #MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 #MNH_LIC for details. version 1.
 #set -x
+export LC_ALL=C
 if [ $# -ne 2 ]
 then
 echo ERROR USAGE :: spll NSOURCE file
@@ -33,7 +34,8 @@ turb.f90|shallow_mf.f90|rain_ice.f90|lima.f90|\
 lima_adjust_split.f90|lima_precip_scavenging.f90|ini_tiwmx.f90|\
 ini_snow.f90|ini_rain_ice.f90|ini_neb.f90|ini_cst.f90|\
 ice_adjust.f90|gradient_u.f90|gradient_v.f90|gradient_w.f90|\
-gamma.f90|gamma_inc.f90|general_gamma.f90|condensation.f90"
+gamma.f90|gamma_inc.f90|general_gamma.f90|condensation.f90|\
+minpack.f90"
 #
 
 if [ "$SUF" = "f" ]
diff --git a/conf/profile_mesonh.ihm b/conf/profile_mesonh.ihm
index 54f2d6f79452ba7315511be9ffb871a408f44819..c20fbc4f98dea81aa111a659425d3fdcdcfe2214 100755
--- a/conf/profile_mesonh.ihm
+++ b/conf/profile_mesonh.ihm
@@ -176,9 +176,7 @@ export VARTTY=\`tty\`
 #
 [ ! -f \${SRC_MESONH}/conf/conf_\${ARCH} ] || . \${SRC_MESONH}/conf/conf_\${ARCH}
 #
-# Optional Environnement variable/Module  Env
-#
-${MNHENV}
+# Check 'CDFPERSO'
 #
 if [ \${VER_CDF} = 'CDFPERSO' ] ; then
 if [ -z \$NETCDF_CONFIG ] ; then
@@ -186,6 +184,9 @@ echo 'WARNING : You chose VER_CDF=CDFPERSO, please set NETCDF_CONFIG environment
 fi
 fi
 #
+#
+# Check 'OASISPERSO'
+#
 if [ -n "${VER_OASIS}" ] ; then
 if [ \${VER_OASIS} = 'OASISPERSO' ] ; then
 if [ -z \$OASISDIR ] ; then
@@ -193,3 +194,7 @@ echo 'WARNING : You chose VER_OASIS=OASISPERSO, please set OASISDIR environment
 fi
 fi
 fi
+#
+# Optional Environnement variable/Module  Env
+#
+${MNHENV}
diff --git a/src/ARCH_SRC/surfex/dummy_topd.F90 b/src/ARCH_SRC/surfex/dummy_topd.F90
index 2f35ab71a5b0ea22bf2066595c087cfe6f84f4c6..0fdc837507609a3d745a782e55e704102e579e39 100644
--- a/src/ARCH_SRC/surfex/dummy_topd.F90
+++ b/src/ARCH_SRC/surfex/dummy_topd.F90
@@ -4,6 +4,7 @@ END MODULE MODD_BUDGET_COUPL_ROUT
 !     ######################
 !     ######################      
 MODULE MODD_COUPLING_TOPD
+LOGICAL                           :: LPERT_PARAM
 END MODULE MODD_COUPLING_TOPD 
 !     ######################
 !     ######################
diff --git a/src/LIB/FOREFIRE/C_ForeFire_Interface.c b/src/LIB/FOREFIRE/C_ForeFire_Interface.c
index a2fad3353d9148479a19d72a7be8421c0836c65a..f00a1a015a7f92a5cd4a2a16ec56f00751d0cc35 100644
--- a/src/LIB/FOREFIRE/C_ForeFire_Interface.c
+++ b/src/LIB/FOREFIRE/C_ForeFire_Interface.c
@@ -1,5 +1,5 @@
 /*
-*MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+*MNH_LIC Copyright 1994-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.
diff --git a/src/LIB/FOREFIRE/F_ForeFire_Interface.f90 b/src/LIB/FOREFIRE/F_ForeFire_Interface.f90
index b9457e78139f07d2d5a26672b220a8677fd77ef7..2792cbb56ce5e377ab1914cc2ac2a6680ffd9945 100644
--- a/src/LIB/FOREFIRE/F_ForeFire_Interface.f90
+++ b/src/LIB/FOREFIRE/F_ForeFire_Interface.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-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.
diff --git a/src/LIB/FOREFIRE/coupling_forefiren.f90 b/src/LIB/FOREFIRE/coupling_forefiren.f90
index 0791f7f1cca1272e036f8a3d32cfd1ea5bec888d..6308f5c59ffa05a32c219332f07574b725f5c037 100644
--- a/src/LIB/FOREFIRE/coupling_forefiren.f90
+++ b/src/LIB/FOREFIRE/coupling_forefiren.f90
@@ -1,9 +1,8 @@
-!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-!##############################
+!############################## 
 MODULE MODI_COUPLING_FOREFIRE_n
 !############################## 
 
@@ -83,20 +82,20 @@ INTEGER											:: JSV
 	PSFTQ(:, :) = PSFTQ(:, :) + FF_VAPORFLUX(:, :)
 
 	DO JSV = 1, NSV_FF
-		CALL MNH_GET_DOUBLEARRAY(sScalarVariables(JSV), FF_SVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1)
+		CALL MNH_GET_DOUBLEARRAY(sScalarVariables(JSV), FF_SVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1) 
 		PSFSV(:, :, NSV_FFBEG-1+JSV) = PSFSV(:, :, NSV_FFBEG-1+JSV) + FF_SVFLUXES(:, :, JSV)
 	END DO
-
+	
 	IF ( LFFCHEM ) THEN
 		DO JSV = 1, NFFCHEMVAR
-			CALL MNH_GET_DOUBLEARRAY(sChemicalVariables(JSV), FF_CVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1)
+			CALL MNH_GET_DOUBLEARRAY(sChemicalVariables(JSV), FF_CVFLUXES(:, :, JSV), FF_MATRIXSIZE, 1) 
 			PSFSV(:, :, FF_CHEMINDICES(JSV)) = PSFSV(:, :, FF_CHEMINDICES(JSV)) + FF_CVFLUXES(:, :, JSV)
 		END DO
 	ENDIF
 
 END SUBROUTINE COUPLING_FOREFIRE_n
 
-
+      	
 !##############################################
 SUBROUTINE SEND_GROUND_WIND_n (U, V, KG, IINFO)
 !##############################################
@@ -139,7 +138,7 @@ TYPE(LIST_ll), POINTER           	:: FOREFIREFIELD_ll    ! list of fields to exc
 		FFOUTERWINDV(2,JFF) = V(3,JFF,KG)
 		FFOUTERWINDV(FF_NX-1,JFF) = V(FF_NX-2,JFF,KG)
 	END DO
-
+	  
 	VAL1 = INT(U(2,3,KG)*FFMULT+0.5)
 	VAL2 = INT(U(3,3,KG)*FFMULT+0.5)
 	VAL3 = INT(U(3,2,KG)*FFMULT+0.5)
@@ -177,8 +176,8 @@ TYPE(LIST_ll), POINTER           	:: FOREFIREFIELD_ll    ! list of fields to exc
 	FFOUTERWINDV(FF_NX-1,FF_NY-1) = VAL1*FFMULT*FFMULT*100 + VAL2*FFMULT*10 + VAL3
 
 	NULLIFY(FOREFIREFIELD_ll)
-	CALL ADD2DFIELD_ll( FOREFIREFIELD_ll, FFOUTERWINDU, 'SEND_GROUND_WIND_n::FFOUTERWINDU' )
-	CALL ADD2DFIELD_ll( FOREFIREFIELD_ll, FFOUTERWINDV, 'SEND_GROUND_WIND_n::FFOUTERWINDV' )
+	CALL ADD2DFIELD_ll(FOREFIREFIELD_ll,FFOUTERWINDU,'FF2D::OUTERWINDU')
+	CALL ADD2DFIELD_ll(FOREFIREFIELD_ll,FFOUTERWINDV,'FF2D::OUTERWINDU')
 	CALL UPDATE_HALO_ll(FOREFIREFIELD_ll,IINFO)
 	CALL CLEANLIST_ll(FOREFIREFIELD_ll)
 	CALL MNH_PUT_DOUBLEARRAY(sOutWindU, FF_TIME, FFOUTERWINDU, FF_MATRIXSIZE, 1)
@@ -186,7 +185,7 @@ TYPE(LIST_ll), POINTER           	:: FOREFIREFIELD_ll    ! list of fields to exc
    
 END SUBROUTINE SEND_GROUND_WIND_n
 
-
+      	
 !#####################################
 SUBROUTINE FOREFIRE_RECEIVE_PARAL_n ()
 !#####################################
@@ -209,7 +208,7 @@ IMPLICIT NONE
    
 END SUBROUTINE FOREFIRE_RECEIVE_PARAL_n
 
-
+      	
 !#######################################
 SUBROUTINE FOREFIRE_SEND_PARAL_n (IINFO)
 !#######################################
@@ -239,18 +238,18 @@ TYPE(LIST_ll), POINTER           :: FOREFIREFIELD_ll    ! list of fields to exch
 !* Calling the MNH parallel routines for the forefire-related variables
 !
 	NULLIFY(FOREFIREFIELD_ll)
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSX, 'FOREFIRE_SEND_PARAL_n::FFNODES_POSX' )
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSY, 'FOREFIRE_SEND_PARAL_n::FFNODES_POSY' )
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELX, 'FOREFIRE_SEND_PARAL_n::FFNODES_VELX' )
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELY, 'FOREFIRE_SEND_PARAL_n::FFNODES_VELY' )
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_TIME, 'FOREFIRE_SEND_PARAL_n::FFNODES_TIME' )
-	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_ID,   'FOREFIRE_SEND_PARAL_n::FFNODES_ID'   )
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSX,'FF3D::NODEPOSX')
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_POSY,'FF3D::NODEPOSY')
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELX,'FF3D::NODEVELX')
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_VELY,'FF3D::NODEVELY')
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_TIME,'FF3D::NODETIME')
+	CALL ADD3DFIELD_ll(FOREFIREFIELD_ll, FFNODES_ID,'FF3D::NODEID')
 	CALL UPDATE_HALO_ll(FOREFIREFIELD_ll, IINFO)
 	CALL CLEANLIST_ll(FOREFIREFIELD_ll)
    
 END SUBROUTINE FOREFIRE_SEND_PARAL_n
-
-
+      	
+      	
 !#####################################################
 SUBROUTINE FOREFIRE_DUMP_FIELDS_n(U, V, W, MNHSV, TH &
 									, R, PABS, TKE, NX, NY, NZ)
@@ -281,7 +280,7 @@ INTEGER :: JSV
 		FF3DOUT = 1
 		FFNUMOUT = FFNUMOUT + 1
 	END IF
-
+	
 	IF ( FF3DOUTPUTSFLOW .AND. FF3DOUT.EQ.1 ) THEN
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sU, FF_TIME, U, NX*NY*NZ, NX, NY, NZ, 1)
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sV, FF_TIME, V, NX*NY*NZ, NX, NY, NZ, 1)
@@ -291,14 +290,14 @@ INTEGER :: JSV
 				, FF_TIME, MNHSV(:, :, :, NSV_FFBEG-1+JSV), NX*NY*NZ, NX, NY, NZ, 1)
 		END DO
 	END IF
-
+	
 	IF ( FF3DOUTPUTSPHYS .AND. FF3DOUT.EQ.1 ) THEN
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sT, FF_TIME, TH, NX*NY*NZ, NX, NY, NZ, 1)
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sMoist, FF_TIME, R, NX*NY*NZ, NX, NY, NZ, 1)
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sP, FF_TIME, PABS, NX*NY*NZ, NX, NY, NZ, 1)
 		CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, sTKE, FF_TIME, TKE, NX*NY*NZ, NX, NY, NZ, 1)
 	END IF
-
+	
 	IF ( LFFCHEM .AND. FF3DOUTPUTSCHEM .AND. FF3DOUT.EQ.1 ) THEN
 		DO JSV = 1, NFFCHEMVAR
 			CALL MNH_DUMP_DOUBLEARRAY(FFNMODEL, PROCID, cast_char_to_c(CNAMES(FF_CHEMINDICES(JSV))) &
@@ -309,7 +308,7 @@ INTEGER :: JSV
 						, FF_TIME, MNHSV(:, :, :, FF_CHEMINDOUT(JSV)), NX*NY*NZ, NX, NY, NZ, 1)
 		END DO
 	END IF
-
+	
 	FF3DOUT = 0
 
 END SUBROUTINE FOREFIRE_DUMP_FIELDS_n
diff --git a/src/LIB/FOREFIRE/init_forefiren.f90 b/src/LIB/FOREFIRE/init_forefiren.f90
index 00c85c6238af9cc3d0e675fcfd4b3dce258002e0..767f92d1c5dd314339f55245b96930ee6f88ae73 100644
--- a/src/LIB/FOREFIRE/init_forefiren.f90
+++ b/src/LIB/FOREFIRE/init_forefiren.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-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.
@@ -34,6 +34,7 @@
 !!    -------
 !!      P. Tulet  CNRM
 !!      X. Pialat SPE
+!!      J.B.Filippi (SPE)
 
 USE MODD_FOREFIRE
 USE MODD_FOREFIRE_n
diff --git a/src/LIB/FOREFIRE/modd_forefire.f90 b/src/LIB/FOREFIRE/modd_forefire.f90
index 4afe973443e1e0f8c13132c7cbeda66b51c4a1e4..563962a05b53a354c2898a93761a913cb536cf31 100644
--- a/src/LIB/FOREFIRE/modd_forefire.f90
+++ b/src/LIB/FOREFIRE/modd_forefire.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-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.
@@ -12,6 +12,7 @@
 !!    ------
 !	           : P. Tulet,  LACy / CNRM
 !!            : X. Pialat, SPE
+!               J.B.Filippi (SPE)
 !	Creation   : 15.02.2012
 !
 !-------------------------------------------------------------------------------
diff --git a/src/LIB/FOREFIRE/modd_forefiren.f90 b/src/LIB/FOREFIRE/modd_forefiren.f90
index bea6c974552a5fbd6718f79f8f8ac44fc6b5ea66..6c019357d6e82de5236c2f79daff6534bd9a327c 100644
--- a/src/LIB/FOREFIRE/modd_forefiren.f90
+++ b/src/LIB/FOREFIRE/modd_forefiren.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-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.
@@ -8,7 +8,7 @@
 !!    AUTHOR
 !!    ------
 !!	P. Tulet     *Meteo France*
-!!
+!!!               J.B.Filippi (SPE)
 !!    MODIFICATIONS
 !!    -------------
 !!      Original    07/08
diff --git a/src/LIB/FOREFIRE/modn_forefire.f90 b/src/LIB/FOREFIRE/modn_forefire.f90
index a1e956163d9f898b4128677f1161619c594a1f7e..337ff931683ebeacbc246d4b9e2671d84046e60f 100644
--- a/src/LIB/FOREFIRE/modn_forefire.f90
+++ b/src/LIB/FOREFIRE/modn_forefire.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-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.
@@ -11,7 +11,8 @@
 !!    AUTHOR
 !!    ------
 !	           : P. Tulet (LACy / CNRM)
-!!              X. Pialat (SPE)
+!               X. Pialat (SPE)
+!               J.B.Filippi (SPE)
 !	Creation   : 09.10.2010
 !-------------------------------------------------------------------------------
 !
diff --git a/src/LIB/RAD/ecrad-1.4.0.tar.gz b/src/LIB/RAD/ecrad-1.4.0.tar.gz
index 23aca40b30fbe71caff28e98f33314d2d78f1be5..eae88b18d9ad03c8e6533edde21405ca414e3c1c 100644
--- a/src/LIB/RAD/ecrad-1.4.0.tar.gz
+++ b/src/LIB/RAD/ecrad-1.4.0.tar.gz
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:2fa92987214bde44613d682de4440caf766dc00b6cc04a3903afb62588e3ca0a
-size 8968642
+oid sha256:a3e35da607a7b4f5c4925bfb6bbc5bbeac37e2489f5d4b9cd079f4eb7137b3b2
+size 8930299
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/data/YBUR_ice_scattering_rrtm.nc b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YBUR_ice_scattering_rrtm.nc
new file mode 100644
index 0000000000000000000000000000000000000000..cfcaf7ff2ecada6346d89231a840851ffa998bc8
Binary files /dev/null and b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YBUR_ice_scattering_rrtm.nc differ
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/data/YCOL_ice_scattering_rrtm.nc b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YCOL_ice_scattering_rrtm.nc
new file mode 100644
index 0000000000000000000000000000000000000000..b51cdc499d6352c8d79a690fce41bef49eb95706
Binary files /dev/null and b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YCOL_ice_scattering_rrtm.nc differ
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/data/YDRO_ice_scattering_rrtm.nc b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YDRO_ice_scattering_rrtm.nc
new file mode 100644
index 0000000000000000000000000000000000000000..f6412d1704477f6d1fe5cfda9d8068ec59c7f394
Binary files /dev/null and b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YDRO_ice_scattering_rrtm.nc differ
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/data/YHBU_ice_scattering_rrtm.nc b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YHBU_ice_scattering_rrtm.nc
new file mode 100644
index 0000000000000000000000000000000000000000..127f166ddd6073d17afeb31ec962628965571cd1
Binary files /dev/null and b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YHBU_ice_scattering_rrtm.nc differ
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/data/YHCO_ice_scattering_rrtm.nc b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YHCO_ice_scattering_rrtm.nc
new file mode 100644
index 0000000000000000000000000000000000000000..3b3ad6fef7c98f08bc9d2811d298c2dc0bc1911b
Binary files /dev/null and b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YHCO_ice_scattering_rrtm.nc differ
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/data/YPLA_ice_scattering_rrtm.nc b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YPLA_ice_scattering_rrtm.nc
new file mode 100644
index 0000000000000000000000000000000000000000..92baaf1e9b331dfc351a01b1841f2bd813bd07d3
Binary files /dev/null and b/src/LIB/RAD/ecrad-1.4.0_mnh/data/YPLA_ice_scattering_rrtm.nc differ
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/ice_effective_radius.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/ice_effective_radius.F90
index bf49064711ac14753db719592bfd774e9a13b063..6e1958014c0a6c8a9016088321eef4cb45c3c91b 100644
--- a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/ice_effective_radius.F90
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/ice_effective_radius.F90
@@ -5,8 +5,8 @@ INTERFACE
 
 SUBROUTINE ICE_EFFECTIVE_RADIUS &
      & (KIDIA, KFDIA, KLON, KLEV, &
-     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, &
-     &  PRE_UM)
+     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PCIT_LIMA, &
+     &  PGEMU, PRE_UM)
 
 USE PARKIND1 , ONLY : JPIM, JPRB
 ! INPUT ARGUMENTS
@@ -24,6 +24,7 @@ REAL(KIND=JPRB),   INTENT(IN) :: PCLOUD_FRAC(KLON,KLEV)  ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_ICE(KLON,KLEV)       ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_SNOW(KLON,KLEV)      ! (kg/kg)
 
+REAL(KIND=JPRB),   INTENT(IN) :: PCIT_LIMA(KLON,KLEV)      ! (/kg)
 ! *** Single level variable
 REAL(KIND=JPRB),   INTENT(IN) :: PGEMU(KLON) ! Sine of latitude
 
@@ -37,8 +38,8 @@ END MODULE MODI_ICE_EFFECTIVE_RADIUS
 
 SUBROUTINE ICE_EFFECTIVE_RADIUS &
      & (KIDIA, KFDIA, KLON, KLEV, &
-     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, &
-     &  PRE_UM)
+     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PCIT_LIMA, &
+     &  PGEMU, PRE_UM)
 
 ! ICE_EFFECTIVE_RADIUS
 !
@@ -76,7 +77,8 @@ USE YOERDU   , ONLY : REPLOG, REPSCW
 USE YOMLUN   , ONLY : NULERR
 USE YOMCST   , ONLY : RD, RPI, RTT
 USE MODD_PARAM_ECRAD_n , ONLY : NRADIP, NMINICE, XRE2DE, XRMINICE ! ice optical properties model
-
+USE MODD_PARAM_LIMA , ONLY    : XALPHAI,XNUI ! Ice crystals distribution parameters
+USE MODD_PARAM_LIMA_COLD , ONLY    : XDELTAI,XBI,XREFFI,XLBI,XLBEXI ! Ice crystals distribution parameters
 ! -------------------------------------------------------------------
 
 IMPLICIT NONE
@@ -96,6 +98,8 @@ REAL(KIND=JPRB),   INTENT(IN) :: PCLOUD_FRAC(KLON,KLEV)  ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_ICE(KLON,KLEV)       ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_SNOW(KLON,KLEV)      ! (kg/kg)
 
+REAL(KIND=JPRB),   INTENT(IN) :: PCIT_LIMA(KLON,KLEV)      ! (/kg)
+
 ! *** Single level variable
 REAL(KIND=JPRB),   INTENT(IN) :: PGEMU(KLON) ! Sine of latitude
 
@@ -116,6 +120,8 @@ REAL(KIND=JPRB) :: ZDIAMETER_UM     ! Effective diameter in microns
 
 ! Min effective diameter in microns; may vary with latitude
 REAL(KIND=JPRB) :: ZMIN_DIAMETER_UM(KLON)
+REAL(KIND=JPRB) :: ZLBDAI(KLON,KLEV)      ! (/kg)
+
 
 INTEGER :: JL, JK
 
@@ -199,7 +205,18 @@ CASE(3)
       ENDIF
     ENDDO
   ENDDO
-  
+
+CASE(4)
+        !!!! Ice effective radius from Yang et al (2013) reff = V/A
+  ! Distribution parameters for ice and snow      
+  DO JK = 1,KLEV
+    DO JL = KIDIA,KFDIA
+      IF (PCLOUD_FRAC(JL,JK) > 0.001_JPRB &
+           &  .AND. (PQ_ICE(JL,JK)+PQ_SNOW(JL,JK)) > 0.0_JPRB) THEN      
+        PRE_UM(JL,JK) = XREFFI*( XLBI*PCIT_LIMA(JL,JK) / PQ_ICE(JL,JK) )**(XLBEXI*(XDELTAI-XBI))
+      ENDIF
+    ENDDO
+  ENDDO
 CASE DEFAULT
   WRITE(NULERR,'(A,I0,A)') 'ICE EFFECTIVE RADIUS OPTION NRADLP=',NRADIP,' NOT AVAILABLE'
   CALL ABOR1('ERROR IN ICE_EFFECTIVE_RADIUS')
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/liquid_effective_radius.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/liquid_effective_radius.F90
index 0478665d5bf3087112cb96987c4fead9674004b6..d3e1a888fe7fda8fc06a9133f4e7745339cfff11 100644
--- a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/liquid_effective_radius.F90
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/liquid_effective_radius.F90
@@ -5,6 +5,7 @@ INTERFACE
 SUBROUTINE LIQUID_EFFECTIVE_RADIUS &
      & (KIDIA, KFDIA, KLON, KLEV, &
      &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQ, PQ_RAIN, &
+     &  PCCT_LIMA, PCRT_LIMA,  &                    
      &  PLAND_FRAC, PCCN_LAND, PCCN_SEA, &
      &  PRE_UM)
 
@@ -27,6 +28,9 @@ REAL(KIND=JPRB),   INTENT(IN) :: PCLOUD_FRAC(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_LIQ(KLON,KLEV)       ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_RAIN(KLON,KLEV)      ! (kg/kg)
 
+REAL(KIND=JPRB),  INTENT (IN)   :: PCCT_LIMA(KLON,KLEV) ! cloud water concentration (LIMA)
+REAL(KIND=JPRB),  INTENT (IN)   :: PCRT_LIMA(KLON,KLEV) ! rain water concentration (LIMA)
+
 ! *** Single-level variables 
 REAL(KIND=JPRB),   INTENT(IN) :: PLAND_FRAC(KLON)        ! 1=land, 0=sea
 REAL(KIND=JPRB),   INTENT(IN) :: PCCN_LAND(KLON)
@@ -44,6 +48,7 @@ END MODULE MODI_LIQUID_EFFECTIVE_RADIUS
 SUBROUTINE LIQUID_EFFECTIVE_RADIUS &
      & (KIDIA, KFDIA, KLON, KLEV, &
      &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQ, PQ_RAIN, &
+     &  PCCT_LIMA, PCRT_LIMA,  &                    
      &  PLAND_FRAC, PCCN_LAND, PCCN_SEA, &
      &  PRE_UM)
 
@@ -84,6 +89,8 @@ USE YOM_YGFL , ONLY : YGFL
 USE YOERDU   , ONLY : REPLOG, REPSCW
 USE YOMLUN   , ONLY : NULERR
 USE YOMCST   , ONLY : RD, RPI
+USE MODD_PARAM_LIMA , ONLY    : XALPHAR,XNUR,       & ! Raindrop      distribution parameters
+                            &   XALPHAC,XNUC          ! Cloud droplet distribution parameters
 
 ! -------------------------------------------------------------------
 
@@ -104,6 +111,9 @@ REAL(KIND=JPRB),   INTENT(IN) :: PCLOUD_FRAC(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_LIQ(KLON,KLEV)       ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_RAIN(KLON,KLEV)      ! (kg/kg)
 
+REAL(KIND=JPRB),  INTENT (IN)   :: PCCT_LIMA(KLON,KLEV) ! cloud water concentration (LIMA)
+REAL(KIND=JPRB),  INTENT (IN)   :: PCRT_LIMA(KLON,KLEV) ! rain water concentration (LIMA)
+
 ! *** Single-level variables 
 REAL(KIND=JPRB),   INTENT(IN) :: PLAND_FRAC(KLON)        ! 1=land, 0=sea
 REAL(KIND=JPRB),   INTENT(IN) :: PCCN_LAND(KLON)
@@ -129,6 +139,7 @@ REAL(KIND=JPRB) :: ZSPECTRAL_DISPERSION
 REAL(KIND=JPRB) :: ZNTOT_CM3 ! Number conc in cm-3
 REAL(KIND=JPRB) :: ZRE_CUBED
 REAL(KIND=JPRB) :: ZLWC_GM3, ZRWC_GM3 ! In-cloud liquid, rain content in g m-3
+REAL(KIND=JPRB) :: PCCT_CM3 ! Droplet concentration(from lima) in  cm-3
 REAL(KIND=JPRB) :: ZAIR_DENSITY_GM3   ! Air density in g m-3
 REAL(KIND=JPRB) :: ZRAIN_RATIO        ! Ratio of rain to liquid water content
 REAL(KIND=JPRB) :: ZWOOD_FACTOR, ZRATIO
@@ -242,12 +253,53 @@ CASE(2)
         ! Cloud fraction or liquid+rain water content too low to
         ! consider this a cloud
         PRE_UM(JL,JK) = PP_MIN_RE_UM
+        
 
       ENDIF
 
     ENDDO
     
   ENDDO
+
+CASE(4)
+
+ ! Calculates effective radius from LIMA
+  DO JL = KIDIA,KFDIA
+    ! First compute the cloud droplet concentration
+    
+    DO JK = 1,KLEV
+
+      ! Only consider cloudy regions
+      IF (PCLOUD_FRAC(JL,JK) >= 0.001_JPRB &
+           &  .AND. (PQ_LIQ(JL,JK)+PQ_RAIN(JL,JK)) > 0.0_JPRB) THEN
+
+        ! Compute liquid and rain water contents
+        ZAIR_DENSITY_GM3 = 1000.0_JPRB * PPRESSURE(JL,JK) &
+             &           / (RD*PTEMPERATURE(JL,JK))
+        ! In-cloud mean water contents found by dividing by cloud
+        ! fraction
+        PCCT_CM3 = PCCT_LIMA (JL, JK) * ZAIR_DENSITY_GM3 * 1.E-9_JPRB
+        ZLWC_GM3 = ZAIR_DENSITY_GM3 * PQ_LIQ(JL,JK)  / PCLOUD_FRAC(JL,JK)
+        PRE_UM(JL,JK)=100*(4.*ZLWC_GM3*(XNUC+2)**2/(PCCT_CM3*3.*RPI*(XNUC**2+XNUC)))**(1./3.)     
+!        print*,"r_eff=",PRE_UM(JL,JK)
+        if (PRE_UM(JL,JK)>50) then
+                PRE_UM(JL,JK)=50.
+        else if (PRE_UM(JL,JK)<1.) then
+                PRE_UM(JL,JK)=1.
+        end if
+
+
+      ELSE
+        ! Cloud fraction or liquid+rain water content too low to
+        ! consider this a cloud
+        PRE_UM(JL,JK) = 1.
+
+      ENDIF
+
+    ENDDO
+    
+  ENDDO
+  
   
 CASE DEFAULT
   WRITE(NULERR,'(A,I0,A)') 'LIQUID EFFECTIVE RADIUS OPTION IRADLP=',IRADLP,' NOT AVAILABLE'
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_scheme.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_scheme.F90
index 06cd9e27126ab46ca69f02066a47b3e6115af03b..270f990cf654f92e7abcd219722adde361ec7649 100644
--- a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_scheme.F90
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_scheme.F90
@@ -25,6 +25,7 @@ SUBROUTINE RADIATION_SCHEME &
      &  PPRESSURE_H, PTEMPERATURE_H, &
      &  PQ, PCO2, PCH4, PN2O, PNO2, PCFC11, PCFC12, PHCFC22, PCCL4, PO3_DP, &
      &  PCLOUD_FRAC, PQ_LIQUID, PQ_ICE, PQ_RAIN, PQ_SNOW, &
+     &  PCCT_LIMA, PCRT_LIMA, PCIT_LIMA, &          
      &  PAEROSOL_OLD, PAEROSOL, &
      &  PFLUX_SW, PFLUX_LW, PFLUX_SW_CLEAR, PFLUX_LW_CLEAR, &
      &  PFLUX_SW_SURF, PFLUX_LW_SURF, PFLUX_SW_SURF_CLEAR, PFLUX_LW_SURF_CLEAR, &
@@ -186,6 +187,11 @@ REAL(KIND=JPRB),   INTENT(IN) :: PQ_LIQUID(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_ICE(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_RAIN(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_SNOW(KLON,KLEV)
+! *** Particle concentrations
+REAL(KIND=JPRB),  INTENT (IN)   :: PCCT_LIMA(KLON,KLEV) ! cloud water concentration (LIMA)
+REAL(KIND=JPRB),  INTENT (IN)   :: PCRT_LIMA(KLON,KLEV) ! rain water concentration (LIMA)
+REAL(KIND=JPRB),  INTENT (IN)   :: PCIT_LIMA(KLON,KLEV) ! ice crystal concentration (LIMA)
+
 
 ! *** Aerosol mass mixing ratios
 REAL(KIND=JPRB),   INTENT(IN) :: PAEROSOL_OLD(KLON,6,KLEV)
@@ -436,13 +442,14 @@ cloud%fraction(KIDIA:KFDIA,:) = PCLOUD_FRAC(KIDIA:KFDIA,:)
 ! Compute effective radii and convert to metres
 CALL LIQUID_EFFECTIVE_RADIUS(KIDIA, KFDIA, KLON, KLEV, &
      &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQUID, PQ_RAIN, &
+     &  PCCT_LIMA, PCRT_LIMA,  &               
      &  PLAND_SEA_MASK, PCCN_LAND, PCCN_SEA, &
      &  PRE_LIQUID_UM)
 cloud%re_liq(KIDIA:KFDIA,:) = PRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0e-6_JPRB
 
 CALL ICE_EFFECTIVE_RADIUS(KIDIA, KFDIA, KLON, KLEV, &
-     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, &
-     &  PRE_ICE_UM)
+     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PCIT_LIMA, &
+     &  PGEMU, PRE_ICE_UM)
 cloud%re_ice(KIDIA:KFDIA,:) = PRE_ICE_UM(KIDIA:KFDIA,:) * 1.0e-6_JPRB
 
 ! Get the cloud overlap decorrelation length (for cloud boundaries),
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_setup.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_setup.F90
index 0677d3f94c66fd2ab89ac6efee68a4e993669f38..69d2d44fc5601fa4672b0192a98d00c428d52483 100644
--- a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_setup.F90
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_setup.F90
@@ -40,7 +40,7 @@ MODULE RADIATION_SETUP
   USE radiation_config, ONLY : config_type, &
        &                       ISolverMcICA, ISolverSpartacus, &
        &                       ILiquidModelSlingo, ILiquidModelSOCRATES, &
-       &                       IIceModelFu, IIceModelBaran, &
+       &                       IIceModelFu, IIceModelBaran, IIceModelShapes, &
        &                       IOverlapExponential
   USE MODD_PARAM_ECRAD_n , ONLY : rad_config
   
@@ -161,6 +161,8 @@ CONTAINS
       rad_config%i_ice_model = IIceModelFu
     ELSEIF (NICEOPT == 4) THEN
       rad_config%i_ice_model = IIceModelBaran
+    ELSEIF (NICEOPT == 7) THEN
+      rad_config%i_ice_model = IIceModelShapes
     ELSE
       WRITE(NULERR,'(a,i0)') 'Unavailable ice optics model in modular radiation scheme: NICEOPT=', &
            &  NICEOPT
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_cloud_optics.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_cloud_optics.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f636fd604bac0b890f3dbaa2916c6a88b56b7cd4
--- /dev/null
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_cloud_optics.F90
@@ -0,0 +1,526 @@
+! radiation_cloud_optics.F90 - Computing cloud optical properties
+!
+! (C) Copyright 2014- ECMWF.
+!
+! This software is licensed under the terms of the Apache Licence Version 2.0
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+!
+! In applying this licence, ECMWF does not waive the privileges and immunities
+! granted to it by virtue of its status as an intergovernmental organisation
+! nor does it submit to any jurisdiction.
+!
+! Author:  Robin Hogan
+! Email:   r.j.hogan@ecmwf.int
+!
+! Modifications
+!   2017-07-22  R. Hogan  Added Yi et al. ice optics model
+
+module radiation_cloud_optics
+
+  implicit none
+
+  public
+
+contains
+
+  ! Provides elemental function "delta_eddington_scat_od"
+#include "radiation_delta_eddington.h"
+
+  !---------------------------------------------------------------------
+  ! Load cloud scattering data; this subroutine delegates to one
+  ! in radiation_cloud_optics_data.F90, but checks the size of
+  ! what is returned
+  subroutine setup_cloud_optics(config)
+
+    use parkind1,         only : jprb
+    use yomhook,          only : lhook, dr_hook
+
+    use radiation_io,     only : nulerr, radiation_abort
+    use radiation_config, only : config_type, IIceModelFu, IIceModelBaran, &
+         &                       IIceModelBaran2016, IIceModelBaran2017, &
+         &                       IIceModelYi,IIceModelShapes, &
+         &                       ILiquidModelSOCRATES, ILiquidModelSlingo
+    use radiation_cloud_optics_data, only  : cloud_optics_type
+    use radiation_ice_optics_fu, only    : NIceOpticsCoeffsFuSW, &
+         &                                 NIceOpticsCoeffsFuLW
+    use radiation_ice_optics_baran, only : NIceOpticsCoeffsBaran, &
+         &                                 NIceOpticsCoeffsBaran2016
+    use radiation_ice_optics_baran2017, only : NIceOpticsCoeffsBaran2017, &
+         &                                 NIceOpticsGeneralCoeffsBaran2017
+    use radiation_ice_optics_yi, only    : NIceOpticsCoeffsYiSW, &
+         &                                 NIceOpticsCoeffsYiLW
+    use radiation_ice_optics_shapes, only    : NIceOpticsCoeffsShapesSW, &
+         &                                 NIceOpticsCoeffsShapesLW
+    use radiation_liquid_optics_socrates, only : NLiqOpticsCoeffsSOCRATES
+    use radiation_liquid_optics_slingo, only : NLiqOpticsCoeffsSlingoSW, &
+         &                                     NLiqOpticsCoeffsLindnerLiLW
+
+    type(config_type), intent(inout) :: config
+
+    real(jprb) :: hook_handle
+
+    if (lhook) call dr_hook('radiation_cloud_optics:setup_cloud_optics',0,hook_handle)
+
+    call config%cloud_optics%setup(trim(config%liq_optics_file_name), &
+         &     trim(config%ice_optics_file_name), iverbose=config%iverbosesetup)
+
+    ! Check liquid coefficients
+    if (size(config%cloud_optics%liq_coeff_lw, 1) /= config%n_bands_lw) then
+      write(nulerr,'(a,i0,a,i0,a)') &
+           &  '*** Error: number of longwave bands for droplets (', &
+           &  size(config%cloud_optics%liq_coeff_lw, 1), &
+           &  ') does not match number for gases (', config%n_bands_lw, ')'
+      call radiation_abort()
+    end if
+    if (size(config%cloud_optics%liq_coeff_sw, 1) /= config%n_bands_sw) then
+      write(nulerr,'(a,i0,a,i0,a)') &
+           &  '*** Error: number of shortwave bands for droplets (', &
+           &  size(config%cloud_optics%liq_coeff_sw, 1), &
+           &  ') does not match number for gases (', config%n_bands_sw, ')'
+      call radiation_abort()        
+    end if
+
+    if (config%i_liq_model == ILiquidModelSOCRATES) then
+      if (size(config%cloud_optics%liq_coeff_lw, 2) /= NLiqOpticsCoeffsSOCRATES) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of liquid cloud optical coefficients (', &
+             &  size(config%cloud_optics%liq_coeff_lw, 2), &
+             &  ') does not match number expected (', NLiqOpticsCoeffsSOCRATES,')'
+        call radiation_abort()
+      end if
+    else if (config%i_liq_model == ILiquidModelSlingo) then
+      if (size(config%cloud_optics%liq_coeff_sw, 2) /= NLiqOpticsCoeffsSlingoSW) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of shortwave liquid cloud optical coefficients (', &
+             &  size(config%cloud_optics%liq_coeff_sw, 2), &
+             &  ') does not match number expected (', NLiqOpticsCoeffsSlingoSW,')'
+        call radiation_abort()
+      end if
+      if (size(config%cloud_optics%liq_coeff_lw, 2) /= NLiqOpticsCoeffsLindnerLiLW) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of longwave liquid cloud optical coefficients (', &
+             &  size(config%cloud_optics%liq_coeff_lw, 2), &
+             &  ') does not match number expected (', NLiqOpticsCoeffsLindnerLiLw,')'
+        call radiation_abort()
+      end if
+    end if
+
+    ! Check ice coefficients
+    if (size(config%cloud_optics%ice_coeff_lw, 1) /= config%n_bands_lw) then
+      write(nulerr,'(a,i0,a,i0,a)') &
+           &  '*** Error: number of longwave bands for ice particles (', &
+           &  size(config%cloud_optics%ice_coeff_lw, 1), &
+           &  ') does not match number for gases (', config%n_bands_lw, ')'
+      call radiation_abort()
+    end if
+    if (size(config%cloud_optics%ice_coeff_sw, 1) /= config%n_bands_sw) then
+      write(nulerr,'(a,i0,a,i0,a)') &
+           &  '*** Error: number of shortwave bands for ice particles (', &
+           &  size(config%cloud_optics%ice_coeff_sw, 1), &
+           &  ') does not match number for gases (', config%n_bands_sw, ')'
+      call radiation_abort()
+    end if
+
+    if (config%i_ice_model == IIceModelFu) then
+      if (size(config%cloud_optics%ice_coeff_lw, 2) &
+           &  /= NIceOpticsCoeffsFuLW) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of LW ice-particle optical coefficients (', &
+             &  size(config%cloud_optics%ice_coeff_lw, 2), &
+             &  ') does not match number expected (', NIceOpticsCoeffsFuLW,')'
+        call radiation_abort()
+      end if
+      if (size(config%cloud_optics%ice_coeff_sw, 2) &
+           &  /= NIceOpticsCoeffsFuSW) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of SW ice-particle optical coefficients (', &
+             &  size(config%cloud_optics%ice_coeff_sw, 2), &
+             &  ') does not match number expected (', NIceOpticsCoeffsFuSW,')'
+        call radiation_abort()
+      end if
+    else if (config%i_ice_model == IIceModelBaran &
+         &  .and. size(config%cloud_optics%ice_coeff_lw, 2) &
+         &  /= NIceOpticsCoeffsBaran) then
+      write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+           &  '*** Error: number of ice-particle optical coefficients (', &
+           &  size(config%cloud_optics%ice_coeff_lw, 2), &
+           &  ') does not match number expected (', NIceOpticsCoeffsBaran,')'
+      call radiation_abort()
+    else if (config%i_ice_model == IIceModelBaran2016 &
+         &  .and. size(config%cloud_optics%ice_coeff_lw, 2) &
+         &  /= NIceOpticsCoeffsBaran2016) then
+      write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+           &  '*** Error: number of ice-particle optical coefficients (', &
+           &  size(config%cloud_optics%ice_coeff_lw, 2), &
+           &  ') does not match number expected (', NIceOpticsCoeffsBaran2016,')'
+      call radiation_abort()
+    else if (config%i_ice_model == IIceModelBaran2017) then
+      if (size(config%cloud_optics%ice_coeff_lw, 2) &
+           &  /= NIceOpticsCoeffsBaran2017) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of ice-particle optical coefficients (', &
+             &  size(config%cloud_optics%ice_coeff_lw, 2), &
+             &  ') does not match number expected (', NIceOpticsCoeffsBaran2017,')'
+        call radiation_abort()
+      else if (.not. allocated(config%cloud_optics%ice_coeff_gen)) then
+        write(nulerr,'(a)') &
+             &  '*** Error: coeff_gen needed for Baran-2017 ice optics parameterization'
+        call radiation_abort()
+      else if (size(config%cloud_optics%ice_coeff_gen) &
+           &  /= NIceOpticsGeneralCoeffsBaran2017) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of general ice-particle optical coefficients (', &
+             &  size(config%cloud_optics%ice_coeff_gen), &
+             &  ') does not match number expected (', NIceOpticsGeneralCoeffsBaran2017,')'
+        call radiation_abort()
+      end if
+    else if (config%i_ice_model == IIceModelYi) then
+      if (size(config%cloud_optics%ice_coeff_lw, 2) &
+           &  /= NIceOpticsCoeffsYiLW) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of LW ice-particle optical coefficients (', &
+             &  size(config%cloud_optics%ice_coeff_lw, 2), &
+             &  ') does not match number expected (', NIceOpticsCoeffsYiLW,')'
+        call radiation_abort()
+      end if
+      if (size(config%cloud_optics%ice_coeff_sw, 2) &
+           &  /= NIceOpticsCoeffsYiSW) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of SW ice-particle optical coefficients (', &
+             &  size(config%cloud_optics%ice_coeff_sw, 2), &
+             &  ') does not match number expected (', NIceOpticsCoeffsYiSW,')'
+        call radiation_abort()
+      end if
+    else if (config%i_ice_model == IIceModelShapes) then
+      if (size(config%cloud_optics%ice_coeff_lw, 2) &
+           &  /= NIceOpticsCoeffsShapesLW) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of LW ice-particle optical coefficients (', &
+             &  size(config%cloud_optics%ice_coeff_lw, 2), &
+             &  ') does not match number expected (', NIceOpticsCoeffsShapesLW,')'
+        call radiation_abort()
+      end if
+      if (size(config%cloud_optics%ice_coeff_sw, 2) &
+           &  /= NIceOpticsCoeffsShapesSW) then
+        write(nulerr,'(a,i0,a,i0,a,i0,a)') &
+             &  '*** Error: number of SW ice-particle optical coefficients (', &
+             &  size(config%cloud_optics%ice_coeff_sw, 2), &
+             &  ') does not match number expected (', NIceOpticsCoeffsShapesSW,')'
+        call radiation_abort()
+      end if
+    end if
+
+    if (lhook) call dr_hook('radiation_cloud_optics:setup_cloud_optics',1,hook_handle)
+
+  end subroutine setup_cloud_optics
+
+
+  !---------------------------------------------------------------------
+  ! Compute cloud optical properties
+  subroutine cloud_optics(nlev,istartcol,iendcol, &
+       &  config, thermodynamics, cloud, & 
+       &  od_lw_cloud, ssa_lw_cloud, g_lw_cloud, &
+       &  od_sw_cloud, ssa_sw_cloud, g_sw_cloud)
+
+    use parkind1, only           : jprb
+    use yomhook,  only           : lhook, dr_hook
+
+    use radiation_io,     only : nulout, nulerr, radiation_abort
+    use radiation_config, only : config_type, IIceModelFu, IIceModelBaran, &
+         &                       IIceModelBaran2016, IIceModelBaran2017, &
+         &                       IIceModelYi,IIceModelShapes, &
+         &                       ILiquidModelSOCRATES, ILiquidModelSlingo
+    use radiation_thermodynamics, only    : thermodynamics_type
+    use radiation_cloud, only             : cloud_type
+    use radiation_constants, only         : AccelDueToGravity
+    use radiation_cloud_optics_data, only : cloud_optics_type
+    use radiation_ice_optics_fu, only     : calc_ice_optics_fu_sw, &
+         &                                  calc_ice_optics_fu_lw
+    use radiation_ice_optics_baran, only  : calc_ice_optics_baran, &
+         &                                  calc_ice_optics_baran2016
+    use radiation_ice_optics_baran2017, only  : calc_ice_optics_baran2017
+    use radiation_ice_optics_yi, only     : calc_ice_optics_yi_sw, &
+         &                                  calc_ice_optics_yi_lw
+    use radiation_ice_optics_shapes, only     : calc_ice_optics_shapes_sw, &
+         &                                  calc_ice_optics_shapes_lw
+    use radiation_liquid_optics_socrates, only:calc_liq_optics_socrates
+    use radiation_liquid_optics_slingo, only:calc_liq_optics_slingo, &
+         &                                   calc_liq_optics_lindner_li
+
+    integer, intent(in) :: nlev               ! number of model levels
+    integer, intent(in) :: istartcol, iendcol ! range of columns to process
+    type(config_type), intent(in), target :: config
+    type(thermodynamics_type),intent(in)  :: thermodynamics
+    type(cloud_type),   intent(in)        :: cloud
+
+    ! Layer optical depth, single scattering albedo and g factor of
+    ! clouds in each longwave band, where the latter two
+    ! variables are only defined if cloud longwave scattering is
+    ! enabled (otherwise both are treated as zero).
+    real(jprb), dimension(config%n_bands_lw,nlev,istartcol:iendcol), intent(out) :: &
+         &   od_lw_cloud
+    real(jprb), dimension(config%n_bands_lw_if_scattering,nlev,istartcol:iendcol), &
+         &   intent(out) :: ssa_lw_cloud, g_lw_cloud
+
+    ! Layer optical depth, single scattering albedo and g factor of
+    ! clouds in each shortwave band
+    real(jprb), dimension(config%n_bands_sw,nlev,istartcol:iendcol), intent(out) :: &
+         &   od_sw_cloud, ssa_sw_cloud, g_sw_cloud
+
+    ! Longwave and shortwave optical depth, scattering optical depth
+    ! and asymmetry factor, for liquid and ice in all bands but a
+    ! single cloud layer
+    real(jprb), dimension(config%n_bands_lw) :: &
+         &  od_lw_liq, scat_od_lw_liq, g_lw_liq, &
+         &  od_lw_ice, scat_od_lw_ice, g_lw_ice
+    real(jprb), dimension(config%n_bands_sw) :: &
+         &  od_sw_liq, scat_od_sw_liq, g_sw_liq, &
+         &  od_sw_ice, scat_od_sw_ice, g_sw_ice
+
+    ! In-cloud water path of cloud liquid or ice (i.e. liquid or ice
+    ! gridbox-mean water path divided by cloud fraction); kg m-2
+    real(jprb) :: lwp_in_cloud, iwp_in_cloud
+
+    ! Full-level temperature (K)
+    real(jprb) :: temperature
+
+    ! Factor to convert gridbox-mean mixing ratio to in-cloud water
+    ! path
+    real(jprb) :: factor
+
+    ! Pointer to the cloud optics coefficients for brevity of
+    ! access
+    type(cloud_optics_type), pointer :: ho
+
+    integer    :: jcol, jlev
+
+    real(jprb) :: hook_handle
+
+    if (lhook) call dr_hook('radiation_cloud_optics:cloud_optics',0,hook_handle)
+
+    if (config%iverbose >= 2) then
+      write(nulout,'(a)') 'Computing cloud absorption/scattering properties'
+    end if
+
+    ho => config%cloud_optics
+
+    ! Array-wise assignment
+    od_lw_cloud  = 0.0_jprb
+    od_sw_cloud  = 0.0_jprb
+    ssa_sw_cloud = 0.0_jprb
+    g_sw_cloud   = 0.0_jprb
+    if (config%do_lw_cloud_scattering) then
+      ssa_lw_cloud = 0.0_jprb
+      g_lw_cloud   = 0.0_jprb
+    end if
+
+    do jlev = 1,nlev
+      do jcol = istartcol,iendcol
+        ! Only do anything if cloud is present (assume that
+        ! cloud%crop_cloud_fraction has already been called)
+        if (cloud%fraction(jcol,jlev) > 0.0_jprb) then
+
+          ! Compute in-cloud liquid and ice water path
+          if (config%is_homogeneous) then
+            ! Homogeneous solvers assume cloud fills the box
+            ! horizontally, so we don't divide by cloud fraction
+            factor = ( thermodynamics%pressure_hl(jcol,jlev+1)    &
+                 &  -thermodynamics%pressure_hl(jcol,jlev  )  ) &
+                 &  / AccelDueToGravity
+          else
+            factor = ( thermodynamics%pressure_hl(jcol,jlev+1)    &
+                 &  -thermodynamics%pressure_hl(jcol,jlev  )  ) &
+                 &  / (AccelDueToGravity * cloud%fraction(jcol,jlev))
+          end if
+          lwp_in_cloud = factor * cloud%q_liq(jcol,jlev)
+          iwp_in_cloud = factor * cloud%q_ice(jcol,jlev)
+
+          ! Only compute liquid properties if liquid cloud is
+          ! present
+          if (lwp_in_cloud > 0.0_jprb) then
+            if (config%i_liq_model == ILiquidModelSOCRATES) then
+              ! Compute longwave properties
+              call calc_liq_optics_socrates(config%n_bands_lw, &
+                   &  config%cloud_optics%liq_coeff_lw, &
+                   &  lwp_in_cloud, cloud%re_liq(jcol,jlev), &
+                   &  od_lw_liq, scat_od_lw_liq, g_lw_liq)
+              ! Compute shortwave properties
+              call calc_liq_optics_socrates(config%n_bands_sw, &
+                   &  config%cloud_optics%liq_coeff_sw, &
+                   &  lwp_in_cloud, cloud%re_liq(jcol,jlev), &
+                   &  od_sw_liq, scat_od_sw_liq, g_sw_liq)
+            else if (config%i_liq_model == ILiquidModelSlingo) then
+              ! Compute longwave properties
+              call calc_liq_optics_lindner_li(config%n_bands_lw, &
+                   &  config%cloud_optics%liq_coeff_lw, &
+                   &  lwp_in_cloud, cloud%re_liq(jcol,jlev), &
+                   &  od_lw_liq, scat_od_lw_liq, g_lw_liq)
+              ! Compute shortwave properties
+              call calc_liq_optics_slingo(config%n_bands_sw, &
+                   &  config%cloud_optics%liq_coeff_sw, &
+                   &  lwp_in_cloud, cloud%re_liq(jcol,jlev), &
+                   &  od_sw_liq, scat_od_sw_liq, g_sw_liq)
+            else
+              write(nulerr,*) '*** Error: Unknown liquid model with code', &
+                   &          config%i_liq_model
+              call radiation_abort()
+            end if
+
+            ! Delta-Eddington scaling in the shortwave only
+            if (.not. config%do_sw_delta_scaling_with_gases) then
+              call delta_eddington_scat_od(od_sw_liq, scat_od_sw_liq, g_sw_liq)
+            end if
+            !call delta_eddington_scat_od(od_lw_liq, scat_od_lw_liq, g_lw_liq)
+
+          else
+            ! Liquid not present: set properties to zero
+            od_lw_liq = 0.0_jprb
+            scat_od_lw_liq = 0.0_jprb
+            g_lw_liq = 0.0_jprb
+
+            od_sw_liq = 0.0_jprb
+            scat_od_sw_liq = 0.0_jprb
+            g_sw_liq = 0.0_jprb
+          end if ! Liquid present
+
+          ! Only compute ice properties if ice cloud is present
+          if (iwp_in_cloud > 0.0_jprb) then
+            if (config%i_ice_model == IIceModelBaran) then
+              ! Compute longwave properties
+              call calc_ice_optics_baran(config%n_bands_lw, &
+                   &  config%cloud_optics%ice_coeff_lw, &
+                   &  iwp_in_cloud, cloud%q_ice(jcol,jlev), &
+                   &  od_lw_ice, scat_od_lw_ice, g_lw_ice)
+              ! Compute shortwave properties
+              call calc_ice_optics_baran(config%n_bands_sw, &
+                   &  config%cloud_optics%ice_coeff_sw, &
+                   &  iwp_in_cloud, cloud%q_ice(jcol,jlev), &
+                   &  od_sw_ice, scat_od_sw_ice, g_sw_ice)
+            else if (config%i_ice_model == IIceModelBaran2016) then
+              temperature = 0.5_jprb * (thermodynamics%temperature_hl(jcol,jlev) &
+                   &                   +thermodynamics%temperature_hl(jcol,jlev+1))
+              ! Compute longwave properties
+              call calc_ice_optics_baran2016(config%n_bands_lw, &
+                   &  config%cloud_optics%ice_coeff_lw, &
+                   &  iwp_in_cloud, cloud%q_ice(jcol,jlev), &
+                   &  temperature, &
+                   &  od_lw_ice, scat_od_lw_ice, g_lw_ice)
+              ! Compute shortwave properties
+              call calc_ice_optics_baran2016(config%n_bands_sw, &
+                   &  config%cloud_optics%ice_coeff_sw, &
+                   &  iwp_in_cloud, cloud%q_ice(jcol,jlev), &
+                   &  temperature, &
+                   &  od_sw_ice, scat_od_sw_ice, g_sw_ice)
+            else if (config%i_ice_model == IIceModelBaran2017) then
+              temperature = 0.5_jprb * (thermodynamics%temperature_hl(jcol,jlev) &
+                   &                   +thermodynamics%temperature_hl(jcol,jlev+1))
+              ! Compute longwave properties
+              call calc_ice_optics_baran2017(config%n_bands_lw, &
+                   &  config%cloud_optics%ice_coeff_gen, &
+                   &  config%cloud_optics%ice_coeff_lw, &
+                   &  iwp_in_cloud, cloud%q_ice(jcol,jlev), &
+                   &  temperature, &
+                   &  od_lw_ice, scat_od_lw_ice, g_lw_ice)
+              ! Compute shortwave properties
+              call calc_ice_optics_baran2017(config%n_bands_sw, &
+                   &  config%cloud_optics%ice_coeff_gen, &
+                   &  config%cloud_optics%ice_coeff_sw, &
+                   &  iwp_in_cloud, cloud%q_ice(jcol,jlev), &
+                   &  temperature, &
+                   &  od_sw_ice, scat_od_sw_ice, g_sw_ice)
+            else if (config%i_ice_model == IIceModelFu) then
+              ! Compute longwave properties
+              call calc_ice_optics_fu_lw(config%n_bands_lw, &
+                   &  config%cloud_optics%ice_coeff_lw, &
+                   &  iwp_in_cloud, cloud%re_ice(jcol,jlev), &
+                   &  od_lw_ice, scat_od_lw_ice, g_lw_ice)
+              if (config%do_fu_lw_ice_optics_bug) then
+                ! Reproduce bug in old IFS scheme
+                scat_od_lw_ice = od_lw_ice - scat_od_lw_ice
+              end if
+              ! Compute shortwave properties
+              call calc_ice_optics_fu_sw(config%n_bands_sw, &
+                   &  config%cloud_optics%ice_coeff_sw, &
+                   &  iwp_in_cloud, cloud%re_ice(jcol,jlev), &
+                   &  od_sw_ice, scat_od_sw_ice, g_sw_ice)
+            else if (config%i_ice_model == IIceModelYi) then
+              ! Compute longwave properties
+              call calc_ice_optics_yi_lw(config%n_bands_lw, &
+                   &  config%cloud_optics%ice_coeff_lw, &
+                   &  iwp_in_cloud, cloud%re_ice(jcol,jlev), &
+                   &  od_lw_ice, scat_od_lw_ice, g_lw_ice)
+              ! Compute shortwave properties
+              call calc_ice_optics_yi_sw(config%n_bands_sw, &
+                   &  config%cloud_optics%ice_coeff_sw, &
+                   &  iwp_in_cloud, cloud%re_ice(jcol,jlev), &
+                   &  od_sw_ice, scat_od_sw_ice, g_sw_ice)        
+            else if (config%i_ice_model == IIceModelShapes) then
+              ! Compute longwave properties
+              call calc_ice_optics_shapes_lw(config%n_bands_lw, &
+                   &  config%cloud_optics%ice_coeff_lw, &
+                   &  iwp_in_cloud, cloud%re_ice(jcol,jlev), &
+                   &  od_lw_ice, scat_od_lw_ice, g_lw_ice)
+              ! Compute shortwave properties
+              call calc_ice_optics_shapes_sw(config%n_bands_sw, &
+                   &  config%cloud_optics%ice_coeff_sw, &
+                   &  iwp_in_cloud, cloud%re_ice(jcol,jlev), &
+                   &  od_sw_ice, scat_od_sw_ice, g_sw_ice)
+            else
+              write(nulerr,*) '*** Error: Unknown ice model with code', &
+                   &          config%i_ice_model
+              call radiation_abort()
+            end if
+
+            ! Delta-Eddington scaling in both longwave and shortwave
+            ! (assume that particles are larger than wavelength even
+            ! in longwave)
+            if (.not. config%do_sw_delta_scaling_with_gases) then
+              call delta_eddington_scat_od(od_sw_ice, scat_od_sw_ice, g_sw_ice)
+            end if
+            call delta_eddington_scat_od(od_lw_ice, scat_od_lw_ice, g_lw_ice)
+
+          else
+            ! Ice not present: set properties to zero
+            od_lw_ice = 0.0_jprb
+            scat_od_lw_ice = 0.0_jprb
+            g_lw_ice = 0.0_jprb
+
+            od_sw_ice = 0.0_jprb
+            scat_od_sw_ice = 0.0_jprb
+            g_sw_ice = 0.0_jprb
+          end if ! Ice present
+
+          ! Combine liquid and ice 
+          if (config%do_lw_cloud_scattering) then
+            od_lw_cloud(:,jlev,jcol) = od_lw_liq + od_lw_ice
+            where (scat_od_lw_liq+scat_od_lw_ice > 0.0_jprb)
+              g_lw_cloud(:,jlev,jcol) = (g_lw_liq * scat_od_lw_liq &
+                   &  + g_lw_ice * scat_od_lw_ice) &
+                   &  / (scat_od_lw_liq+scat_od_lw_ice)
+            elsewhere
+              g_lw_cloud(:,jlev,jcol) = 0.0_jprb
+            end where
+            ssa_lw_cloud(:,jlev,jcol) = (scat_od_lw_liq + scat_od_lw_ice) &
+                 &                    / (od_lw_liq + od_lw_ice)
+          else
+            ! If longwave scattering is to be neglected then the
+            ! best approximation is to set the optical depth equal
+            ! to the absorption optical depth
+            od_lw_cloud(:,jlev,jcol) = od_lw_liq - scat_od_lw_liq &
+                 &                   + od_lw_ice - scat_od_lw_ice
+          end if
+          od_sw_cloud(:,jlev,jcol) = od_sw_liq + od_sw_ice
+          g_sw_cloud(:,jlev,jcol) = (g_sw_liq * scat_od_sw_liq &
+               &  + g_sw_ice * scat_od_sw_ice) &
+               &  / (scat_od_sw_liq + scat_od_sw_ice)
+          ssa_sw_cloud(:,jlev,jcol) &
+               &  = (scat_od_sw_liq + scat_od_sw_ice) / (od_sw_liq + od_sw_ice)
+        end if ! Cloud present
+      end do ! Loop over column
+    end do ! Loop over level
+
+    if (lhook) call dr_hook('radiation_cloud_optics:cloud_optics',1,hook_handle)
+
+  end subroutine cloud_optics
+
+end module radiation_cloud_optics
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_config.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_config.F90
new file mode 100644
index 0000000000000000000000000000000000000000..0f641bb4012cc8cf73955dd206e029fbc9632970
--- /dev/null
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_config.F90
@@ -0,0 +1,1983 @@
+! radiation_config.F90 - Derived type to configure the radiation scheme
+!
+! (C) Copyright 2014- ECMWF.
+!
+! This software is licensed under the terms of the Apache Licence Version 2.0
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+!
+! In applying this licence, ECMWF does not waive the privileges and immunities
+! granted to it by virtue of its status as an intergovernmental organisation
+! nor does it submit to any jurisdiction.
+!
+! Author:  Robin Hogan
+! Email:   r.j.hogan@ecmwf.int
+!
+! Modifications
+!   2017-07-22  R. Hogan  Added Yi et al. ice optics model
+!   2017-10-23  R. Hogan  Renamed single-character variables
+!   2018-03-15  R. Hogan  Added logicals controlling surface spectral treatment
+!   2018-08-29  R. Hogan  Added monochromatic single-scattering albedo / asymmetry factor
+!   2018-09-03  R. Hogan  Added min_cloud_effective_size
+!   2018-09-04  R. Hogan  Added encroachment_scaling
+!   2018-09-13  R. Hogan  Added IEncroachmentFractal
+!   2019-01-02  R. Hogan  Added Cloudless solvers
+!   2019-01-14  R. Hogan  Added out_of_bounds_[1,2,3]d for checker routines
+!   2019-01-18  R. Hogan  Added albedo weighting
+!   2019-02-03  R. Hogan  Added ability to fix out-of-physical-bounds inputs
+!   2019-02-10  R. Hogan  Renamed "encroachment" to "entrapment"
+!
+! Note: The aim is for ecRad in the IFS to be as similar as possible
+! to the offline version, so if you make any changes to this or any
+! files in this directory, please inform Robin Hogan.
+!
+
+module radiation_config
+  USE MODD_PARAM_LIMA,          ONLY : CPRISTINE_ICE_LIMA
+  use parkind1,                      only : jprb
+
+  use radiation_cloud_optics_data,   only : cloud_optics_type
+  use radiation_aerosol_optics_data, only : aerosol_optics_type
+  use radiation_pdf_sampler,         only : pdf_sampler_type
+  use radiation_cloud_cover,         only : OverlapName, &
+       & IOverlapMaximumRandom, IOverlapExponentialRandom, IOverlapExponential
+
+  implicit none
+  public
+
+  ! Configuration codes: use C-style enumerators to avoid having to
+  ! remember the numbers
+
+  ! Solvers: can be specified for longwave and shortwave
+  ! independently, except for "Homogeneous", which must be the same
+  ! for both
+  enum, bind(c) 
+     enumerator ISolverCloudless, ISolverHomogeneous, ISolverMcICA, &
+          &     ISolverSpartacus, ISolverTripleclouds 
+  end enum
+  character(len=*), parameter :: SolverName(0:4) = (/ 'Cloudless   ', &
+       &                                              'Homogeneous ', &
+       &                                              'McICA       ', &
+       &                                              'SPARTACUS   ', &
+       &                                              'Tripleclouds' /)
+
+  ! SPARTACUS shortwave solver can treat the reflection of radiation
+  ! back up into different regions in various ways
+  enum, bind(c) 
+     enumerator &
+       & IEntrapmentZero, &     ! No entrapment, as Tripleclouds
+       & IEntrapmentEdgeOnly, & ! Only radiation passed through cloud edge is horizontally homogenized
+       & IEntrapmentExplicit, & ! Estimate horiz migration dist, account for fractal clouds
+       & IEntrapmentExplicitNonFractal, & ! As above but ignore fractal nature of clouds
+       & IEntrapmentMaximum ! Complete horizontal homogenization within regions (old SPARTACUS assumption)
+  end enum
+  
+  ! Names available in the radiation namelist for variable
+  ! sw_entrapment_name
+  character(len=*), parameter :: EntrapmentName(0:4)   = [ 'Zero       ', &
+       &                                                   'Edge-only  ', &
+       &                                                   'Explicit   ', &
+       &                                                   'Non-fractal', &
+       &                                                   'Maximum    ' ]
+  ! For backwards compatibility, the radiation namelist also supports
+  ! the equivalent variable sw_encroachment_name with the following
+  ! names
+  character(len=*), parameter :: EncroachmentName(0:4) = [ 'Zero    ', &
+       &                                                   'Minimum ', &
+       &                                                   'Fractal ', &
+       &                                                   'Computed', &
+       &                                                   'Maximum ' ]
+
+  ! Two-stream models
+  ! This is not configurable at run-time
+
+  ! Gas models
+  enum, bind(c) 
+     enumerator IGasModelMonochromatic, IGasModelIFSRRTMG
+  end enum
+  character(len=*), parameter :: GasModelName(0:1) = (/ 'Monochromatic', &
+       &                                                'RRTMG-IFS    ' /)
+
+  ! Hydrometeor scattering models
+  enum, bind(c) 
+     enumerator ILiquidModelMonochromatic, &
+          &     ILiquidModelSOCRATES, ILiquidModelSlingo
+  end enum
+  character(len=*), parameter :: LiquidModelName(0:2) = (/ 'Monochromatic', &
+       &                                                   'SOCRATES     ', &
+       &                                                   'Slingo       ' /)
+
+  enum, bind(c) 
+     enumerator IIceModelMonochromatic, IIceModelFu, &
+          &  IIceModelBaran, IIceModelBaran2016, IIceModelBaran2017,   &
+          &  IIceModelYi, IIceModelShapes
+  end enum
+  character(len=*), parameter :: IceModelName(0:6) = (/ 'Monochromatic', &
+       &                                                'Fu-IFS       ', &
+       &                                                'Baran        ', &
+       &                                                'Baran2016    ', &
+       &                                                'Baran2017    ', &
+       &                                                'Yi           ', &
+       &                                                'Shapes       ' /)
+
+  ! Cloud PDF distribution shapes
+  enum, bind(c)
+    enumerator IPdfShapeLognormal, IPdfShapeGamma
+  end enum
+  character(len=*), parameter :: PdfShapeName(0:1) = (/ 'Lognormal', &
+       &                                                'Gamma    ' /)
+
+  ! Maximum number of different aerosol types that can be provided
+  integer, parameter :: NMaxAerosolTypes = 256
+
+  ! Maximum number of shortwave albedo and longwave emissivity
+  ! intervals
+  integer, parameter :: NMaxAlbedoIntervals = 256
+
+  ! Length of string buffer for printing config information
+  integer, parameter :: NPrintStringLen = 60
+
+  !---------------------------------------------------------------------
+  ! Derived type containing all the configuration information needed
+  ! to run the radiation scheme.  The intention is that this is fixed
+  ! for a given model run.  The parameters are to list first those
+  ! quantities that can be set directly by the user, for example using a
+  ! namelist, and second those quantities that are computed afterwards
+  ! from the user-supplied numbers, especially the details of the gas
+  ! optics model.
+  type config_type
+    ! USER-CONFIGURABLE PARAMETERS
+
+    ! Override default solar spectrum
+    logical :: use_spectral_solar_scaling = .false.
+
+    ! Directory in which gas, cloud and aerosol data files are to be
+    ! found
+    character(len=511) :: directory_name = '.'
+
+    ! Cloud is deemed to be present in a layer if cloud fraction
+    ! exceeds this value
+    real(jprb) :: cloud_fraction_threshold = 1.0e-6_jprb
+    ! ...and total cloud water mixing ratio exceeds this value
+    real(jprb) :: cloud_mixing_ratio_threshold = 1.0e-9_jprb
+
+    ! Overlap scheme
+    integer :: i_overlap_scheme = IOverlapExponentialRandom
+
+    ! Use the Shonk et al. (2010) "beta" overlap parameter, rather
+    ! than the "alpha" overlap parameter of Hogan and Illingworth
+    ! (2000)?
+    logical :: use_beta_overlap = .false.
+
+    ! Shape of sub-grid cloud water PDF
+    integer :: i_cloud_pdf_shape = IPdfShapeGamma
+
+    ! The ratio of the overlap decorrelation length for cloud
+    ! inhomogeneities to the overlap decorrelation length for cloud
+    ! boundaries.  Observations suggest this has a value of 0.5
+    ! (e.g. from the decorrelation lengths of Hogan and Illingworth
+    ! 2003 and Hogan and Illingworth 2000).
+    real(jprb) :: cloud_inhom_decorr_scaling = 0.5_jprb
+
+    ! Factor controlling how much of the cloud edge length interfaces
+    ! directly between the clear-sky region (region a) and the
+    ! optically thick cloudy region (region c).  If Lxy is the length
+    ! of the interfaces between regions x and y, and Lab and Lbc have
+    ! been computed already, then
+    !   Lac=clear_to_thick_fraction*min(Lab,Lbc).
+    real(jprb) :: clear_to_thick_fraction = 0.0_jprb
+
+    ! Factor allowing lateral transport when the sun is close to
+    ! overhead; consider atand(overhead_sun_factor) to be the number
+    ! of degrees that the sun angle is perturbed from zenith for the
+    ! purposes of computing lateral transport.  A value of up to 0.1
+    ! seems to be necessary to account for the fact that some forward
+    ! scattered radiation is treated as unscattered by delta-Eddington
+    ! scaling; therefore it ought to have the chance to escape.
+    real(jprb) :: overhead_sun_factor = 0.0_jprb
+
+    ! Minimum gas optical depth in a single layer at any wavelength,
+    ! for stability
+    real(jprb) :: min_gas_od_lw = 1.0e-15_jprb
+    real(jprb) :: min_gas_od_sw = 0.0_jprb
+
+    ! Maximum gas optical depth in a layer before that g-point will
+    ! not be considered for 3D treatment: a limit is required to avoid
+    ! expensive computation of matrix exponentials on matrices with
+    ! large elements
+    real(jprb) :: max_gas_od_3d = 8.0_jprb
+
+    ! Maximum total optical depth of a cloudy region for stability:
+    ! optical depth will be capped at this value in the SPARTACUS
+    ! solvers
+    real(jprb) :: max_cloud_od = 16.0_jprb
+
+    ! How much longwave scattering is included?
+    logical :: do_lw_cloud_scattering = .true.
+    logical :: do_lw_aerosol_scattering = .true.
+
+    ! Number of regions used to describe clouds and clear skies. A
+    ! value of 2 means one clear and one cloudy region, so clouds are
+    ! horizontally homogeneous, while a value of 3 means two cloudy
+    ! regions with different optical depth, thereby representing
+    ! inhomogeneity via the Shonk & Hogan (2008) "Tripleclouds"
+    ! method.
+    integer :: nregions = 3
+
+    ! Code specifying the solver to be used: use the enumerations
+    ! defined above
+    integer :: i_solver_sw = ISolverMcICA
+    integer :: i_solver_lw = ISolverMcICA
+
+    ! Do shortwave delta-Eddington scaling on the cloud-aerosol-gas
+    ! mixture (as in the original IFS scheme), rather than the more
+    ! correct approach of separately scaling the cloud and aerosol
+    ! scattering properties before merging with gases.  Note that
+    ! .true. is not compatible with the SPARTACUS solver.
+    logical :: do_sw_delta_scaling_with_gases = .false.
+
+    ! Codes describing the gas and cloud scattering models to use, the
+    ! latter of which is currently not used
+    integer :: i_gas_model = IGasModelIFSRRTMG
+    !     integer :: i_cloud_model    
+
+    ! Optics if i_gas_model==IGasModelMonochromatic.
+    ! The wavelength to use for the Planck function in metres. If this
+    ! is positive then the output longwave fluxes will be in units of
+    ! W m-2 um-1.  If this is zero or negative (the default) then
+    ! sigma*T^4 will be used and the output longwave fluxes will be in
+    ! W m-2.
+    real(jprb) :: mono_lw_wavelength = -1.0_jprb
+    ! Total zenith optical depth of the atmosphere in the longwave and
+    ! shortwave, distributed vertically according to the pressure.
+    ! Default is zero.
+    real(jprb) :: mono_lw_total_od = 0.0_jprb
+    real(jprb) :: mono_sw_total_od = 0.0_jprb
+    ! Single-scattering albedo and asymmetry factor: values typical
+    ! for liquid clouds with effective radius of 10 microns, at (SW)
+    ! 0.55 micron wavelength and (LW) 10.7 microns wavelength
+    real(jprb) :: mono_sw_single_scattering_albedo = 0.999999_jprb
+    real(jprb) :: mono_sw_asymmetry_factor = 0.86_jprb
+    real(jprb) :: mono_lw_single_scattering_albedo = 0.538_jprb
+    real(jprb) :: mono_lw_asymmetry_factor = 0.925_jprb
+
+    ! Codes describing particle scattering models
+    integer :: i_liq_model = ILiquidModelSOCRATES
+    integer :: i_ice_model = IIceModelBaran
+    
+    ! The mapping from albedo/emissivity intervals to SW/LW bands can
+    ! either be done by finding the interval containing the central
+    ! wavenumber of the band (nearest neighbour), or by a weighting
+    ! according to the spectral overlap of each interval with each
+    ! band
+    logical :: do_nearest_spectral_sw_albedo = .true.
+    logical :: do_nearest_spectral_lw_emiss  = .true.
+
+    ! User-defined monotonically increasing wavelength bounds (m)
+    ! between input surface albedo/emissivity intervals. Implicitly
+    ! the first interval starts at zero and the last ends at
+    ! infinity. 
+    real(jprb) :: sw_albedo_wavelength_bound(NMaxAlbedoIntervals-1) = -1.0_jprb
+    real(jprb) :: lw_emiss_wavelength_bound( NMaxAlbedoIntervals-1)  = -1.0_jprb
+    ! The index to the surface albedo/emissivity intervals for each of
+    ! the wavelength bounds specified in sw_albedo_wavelength_bound
+    ! and lw_emiss_wavelength_bound
+    integer :: i_sw_albedo_index(NMaxAlbedoIntervals) = 0
+    integer :: i_lw_emiss_index (NMaxAlbedoIntervals)  = 0
+
+    ! Do we compute longwave and/or shortwave radiation?
+    logical :: do_lw = .true.
+    logical :: do_sw = .true.
+
+    ! Do we compute clear-sky fluxes and/or solar direct fluxes?
+    logical :: do_clear = .true.
+    logical :: do_sw_direct = .true.
+
+    ! Do we include 3D effects?
+    logical :: do_3d_effects = .true.
+    
+    ! To what extent do we include "entrapment" effects in the
+    ! SPARTACUS solver? This essentially means that in a situation
+    ! like this
+    !
+    ! 000111
+    ! 222222
+    !
+    ! Radiation downwelling from region 1 may be reflected back into
+    ! region 0 due to some degree of homogenization of the radiation
+    ! in region 2.  Hogan and Shonk (2013) referred to this as
+    ! "anomalous horizontal transport" for a 1D model, although for 3D
+    ! calculations it is desirable to include at least some of it. The
+    ! options are described by the IEntrapment* parameters above.
+    integer :: i_3d_sw_entrapment = IEntrapmentExplicit
+
+    ! In the longwave, the equivalent process it either "on" (like
+    ! maximum entrapment) or "off" (like zero entrapment):
+    logical :: do_3d_lw_multilayer_effects = .false.
+
+    ! Do we account for the effective emissivity of the side of
+    ! clouds?
+    logical :: do_lw_side_emissivity = .true.
+
+    ! The 3D transfer rate "X" is such that if transport out of a
+    ! region was the only process occurring then by the base of a
+    ! layer only exp(-X) of the original flux would remain in that
+    ! region. The transfer rate computed geometrically can be very
+    ! high for the clear-sky regions in layers with high cloud
+    ! fraction.  For stability reasons it is necessary to provide a
+    ! maximum possible 3D transfer rate.
+    real(jprb) :: max_3d_transfer_rate = 10.0_jprb
+
+    ! It has also sometimes been found necessary to set a minimum
+    ! cloud effective size for stability (metres)
+    real(jprb) :: min_cloud_effective_size = 100.0_jprb
+
+    ! Given a horizontal migration distance, there is still
+    ! uncertainty about how much entrapment occurs associated with how
+    ! one assumes cloud boundaries line up in adjacent layers. This
+    ! factor can be varied between 0.0 (the boundaries line up to the
+    ! greatest extent possible given the overlap parameter) and 1.0
+    ! (the boundaries line up to the minimum extent possible). In the
+    ! Hogan et al. entrapment paper it is referred to as the overhang
+    ! factor zeta, and a value of 0 matches the Monte Carlo
+    ! calculations best.
+    real(jprb) :: overhang_factor = 0.0_jprb
+
+    ! By default, the Meador & Weaver (1980) expressions are used
+    ! instead of the matrix exponential whenever 3D effects can be
+    ! neglected (e.g. cloud-free layers or clouds with infinitely
+    ! large effective cloud size), but setting the following to true
+    ! uses the matrix exponential everywhere, enabling the two
+    ! methods to be compared. Note that Meador & Weaver will still be
+    ! used for very optically thick g points where the matrix
+    ! exponential can produce incorrect results.
+    logical :: use_expm_everywhere = .false.
+
+    ! Aerosol descriptors: aerosol_type_mapping must be of length
+    ! n_aerosol_types, and contains 0 if that type is to be ignored,
+    ! positive numbers to map on to the indices of hydrophobic
+    ! aerosols in the aerosol optics configuration file, and negative
+    ! numbers to map on to (the negative of) the indices of
+    ! hydrophilic aerosols in the configuration file.
+    logical :: use_aerosols = .false.
+    integer :: n_aerosol_types = 0
+    integer :: i_aerosol_type_map(NMaxAerosolTypes)
+
+    ! Save the gas and cloud optical properties for each g point in
+    ! "radiative_properties.nc"?
+    logical :: do_save_radiative_properties = .false.
+
+    ! Save the flux profiles in each band?
+    logical :: do_save_spectral_flux = .false.
+
+    ! Save the surface downwelling shortwave fluxes in each band?
+    logical :: do_surface_sw_spectral_flux = .true.
+
+    ! Compute the longwave derivatives needed to apply the approximate
+    ! radiation updates of Hogan and Bozzo (2015)
+    logical :: do_lw_derivatives = .false.
+
+    ! Save the flux profiles in each g-point (overrides
+    ! do_save_spectral_flux if TRUE)?
+    logical :: do_save_gpoint_flux = .false.
+
+    ! In the IFS environment, setting up RRTM has already been done
+    ! so not needed to do it again
+    logical :: do_setup_ifsrrtm = .true.
+
+    ! In the IFS environment the old scheme has a bug in the Fu
+    ! longwave ice optics whereby the single scattering albedo is one
+    ! minus what it should be.  Unfortunately fixing it makes
+    ! forecasts worse. Setting the following to true reproduces the
+    ! bug.
+    logical :: do_fu_lw_ice_optics_bug = .false.
+
+    ! Control verbosity: 0=none (no output to standard output; write
+    ! to standard error only if an error occurs), 1=warning, 2=info,
+    ! 3=progress, 4=detailed, 5=debug.  Separate settings for the
+    ! setup of the scheme and the execution of it.
+    integer :: iverbosesetup = 2
+    integer :: iverbose = 1
+
+    ! Are we doing radiative transfer in complex surface canopies
+    ! (streets/vegetation), in which case tailored downward fluxes are
+    ! needed at the top of the canopy?
+    logical :: do_canopy_fluxes_sw = .false.
+    logical :: do_canopy_fluxes_lw = .false.
+    ! If so, do we use the full spectrum as in the atmosphere, or just
+    ! the reduced spectrum in which the shortwave albedo and longwave
+    ! emissivity are provided?
+    logical :: use_canopy_full_spectrum_sw = .false.
+    logical :: use_canopy_full_spectrum_lw = .false.
+    ! Do we treat gas radiative transfer in streets/vegetation?
+    logical :: do_canopy_gases_sw = .false.
+    logical :: do_canopy_gases_lw = .false.
+
+    ! Optics file names for overriding the ones generated from the
+    ! other options. If these remain empty then the generated names
+    ! will be used (see the "consolidate_config" routine below). If
+    ! the user assigns one of these and it starts with a '/' character
+    ! then that will be used instead. If the user assigns one and it
+    ! doesn't start with a '/' character then it will be prepended by
+    ! the contents of directory_name.
+    character(len=511) :: ice_optics_override_file_name     = ''
+    character(len=511) :: liq_optics_override_file_name     = ''
+    character(len=511) :: aerosol_optics_override_file_name = ''
+
+    ! Optionally override the look-up table file for the cloud-water
+    ! PDF used by the McICA solver
+    character(len=511) :: cloud_pdf_override_file_name = ''
+
+    ! Has "consolidate" been called?  
+    logical :: is_consolidated = .false.    
+    ! COMPUTED PARAMETERS
+    ! Users of this library should not edit these parameters directly;
+    ! they are set by the "consolidate" routine
+
+    ! Wavenumber range for each band, in cm-1, which will be allocated
+    ! to be of length n_bands_sw or n_bands_lw
+    real(jprb), allocatable, dimension(:) :: wavenumber1_sw
+    real(jprb), allocatable, dimension(:) :: wavenumber2_sw
+    real(jprb), allocatable, dimension(:) :: wavenumber1_lw
+    real(jprb), allocatable, dimension(:) :: wavenumber2_lw
+
+
+    ! If the nearest surface albedo/emissivity interval is to be used
+    ! for each SW/LW band then the following arrays will be allocated
+    ! to the length of the number of bands and contain the index to
+    ! the relevant interval
+    integer, allocatable, dimension(:) :: i_albedo_from_band_sw
+    integer, allocatable, dimension(:) :: i_emiss_from_band_lw
+
+    ! ...alternatively, this matrix dimensioned
+    ! (n_albedo_intervals,n_bands_sw) providing the weights needed for
+    ! computing the albedo in each ecRad band from the albedo in each
+    ! native albedo band - see radiation_single_level.F90
+    real(jprb), allocatable, dimension(:,:) :: sw_albedo_weights
+    ! ...and similarly in the longwave, dimensioned
+    ! (n_emiss_intervals,n_bands_lw)
+    real(jprb), allocatable, dimension(:,:) :: lw_emiss_weights
+
+    ! Arrays of length the number of g-points that convert from
+    ! g-point to the band index
+    integer, allocatable, dimension(:) :: i_band_from_g_lw
+    integer, allocatable, dimension(:) :: i_band_from_g_sw
+
+    ! We allow for the possibility for g-points to be ordered in terms
+    ! of likely absorption (weakest to strongest) across the shortwave
+    ! or longwave spectrum, in order that in SPARTACUS we select only
+    ! the first n g-points that will not have too large an absorption,
+    ! and therefore matrix exponentials that are both finite and not
+    ! too expensive to compute.  The following two arrays map the
+    ! reordered g-points to the original ones.
+    integer, allocatable, dimension(:) :: i_g_from_reordered_g_lw
+    integer, allocatable, dimension(:) :: i_g_from_reordered_g_sw
+
+    ! The following map the reordered g-points to the bands
+    integer, allocatable, dimension(:) :: i_band_from_reordered_g_lw
+    integer, allocatable, dimension(:) :: i_band_from_reordered_g_sw
+
+    ! The following map the reordered g-points to the spectral
+    ! information being saved: if do_save_gpoint_flux==TRUE then this
+    ! will map on to the original g points, but if only
+    ! do_save_spectral_flux==TRUE then this will map on to the bands
+    integer, pointer, dimension(:) :: i_spec_from_reordered_g_lw
+    integer, pointer, dimension(:) :: i_spec_from_reordered_g_sw
+
+    ! Number of spectral intervals used for the canopy radiative
+    ! transfer calculation; they are either equal to
+    ! n_albedo_intervals/n_emiss_intervals or n_g_sw/n_g_lw
+    integer :: n_canopy_bands_sw = 1
+    integer :: n_canopy_bands_lw = 1
+
+    ! Data structure containing cloud scattering data
+    type(cloud_optics_type)      :: cloud_optics
+
+    ! Data structure containing aerosol scattering data
+    type(aerosol_optics_type)    :: aerosol_optics
+
+    ! Object for sampling from a gamma or lognormal distribution
+    type(pdf_sampler_type)       :: pdf_sampler
+
+    ! Optics file names
+    character(len=511) :: ice_optics_file_name, &
+         &                liq_optics_file_name, &
+         &                aerosol_optics_file_name
+
+    ! McICA PDF look-up table file name
+    character(len=511) :: cloud_pdf_file_name
+
+    ! Number of gpoints and bands in the shortwave and longwave - set
+    ! to zero as will be set properly later
+    integer :: n_g_sw = 0, n_g_lw = 0
+    integer :: n_bands_sw = 0, n_bands_lw = 0
+
+    ! Number of spectral points to save (equal either to the number of
+    ! g points or the number of bands
+    integer :: n_spec_sw = 0, n_spec_lw = 0
+
+    ! Dimensions to store variables that are only needed if longwave
+    ! scattering is included. "n_g_lw_if_scattering" is equal to
+    ! "n_g_lw" if aerosols are allowed to scatter in the longwave,
+    ! and zero otherwise. "n_bands_lw_if_scattering" is equal to
+    ! "n_bands_lw" if clouds are allowed to scatter in the longwave,
+    ! and zero otherwise.
+    integer :: n_g_lw_if_scattering = 0, n_bands_lw_if_scattering = 0
+
+    ! Treat clouds as horizontally homogeneous within the gribox
+    logical :: is_homogeneous = .false.
+
+    ! If the solvers are both "Cloudless" then we don't need to do any
+    ! cloud processing
+    logical :: do_clouds = .true.
+
+   contains
+     procedure :: read => read_config_from_namelist
+     procedure :: consolidate => consolidate_config
+     procedure :: set  => set_config
+     procedure :: print => print_config
+     procedure :: get_sw_weights
+     procedure :: define_sw_albedo_intervals
+     procedure :: define_lw_emiss_intervals
+     procedure :: consolidate_intervals
+
+  end type config_type
+
+!  procedure, private :: print_logical, print_real, print_int
+
+contains
+
+
+  !---------------------------------------------------------------------
+  ! This subroutine reads configuration data from a namelist file, and
+  ! anything that is not in the namelists will be set to default
+  ! values. If optional output argument "is_success" is present, then
+  ! on error (e.g. missing file) it will be set to .false.; if this
+  ! argument is missing then on error the program will be aborted. You
+  ! may either specify the file_name or the unit of an open file to
+  ! read, but not both.
+  subroutine read_config_from_namelist(this, file_name, unit, is_success)
+
+    use yomhook,      only : lhook, dr_hook
+    use radiation_io, only : nulout, nulerr, nulrad, radiation_abort
+
+    class(config_type), intent(inout)         :: this
+    character(*),       intent(in),  optional :: file_name
+    integer,            intent(in),  optional :: unit
+    logical,            intent(out), optional :: is_success
+
+    integer :: iosopen, iosread ! Status after calling open and read
+
+    ! The following variables are read from the namelists and map
+    ! directly onto members of the config_type derived type
+
+    ! To be read from the radiation_config namelist 
+    logical :: do_sw, do_lw, do_clear, do_sw_direct
+    logical :: do_3d_effects, use_expm_everywhere, use_aerosols
+    logical :: do_lw_side_emissivity
+    logical :: do_3d_lw_multilayer_effects, do_fu_lw_ice_optics_bug
+    logical :: do_lw_aerosol_scattering, do_lw_cloud_scattering
+    logical :: do_save_radiative_properties, do_save_spectral_flux
+    logical :: do_save_gpoint_flux, do_surface_sw_spectral_flux
+    logical :: use_beta_overlap, do_lw_derivatives
+    logical :: do_sw_delta_scaling_with_gases
+    logical :: do_canopy_fluxes_sw, do_canopy_fluxes_lw
+    logical :: use_canopy_full_spectrum_sw, use_canopy_full_spectrum_lw
+    logical :: do_canopy_gases_sw, do_canopy_gases_lw
+    integer :: n_regions, iverbose, iverbosesetup, n_aerosol_types
+    real(jprb):: mono_lw_wavelength, mono_lw_total_od, mono_sw_total_od
+    real(jprb):: mono_lw_single_scattering_albedo, mono_sw_single_scattering_albedo
+    real(jprb):: mono_lw_asymmetry_factor, mono_sw_asymmetry_factor
+    real(jprb):: cloud_inhom_decorr_scaling, cloud_fraction_threshold
+    real(jprb):: clear_to_thick_fraction, max_gas_od_3d, max_cloud_od
+    real(jprb):: cloud_mixing_ratio_threshold, overhead_sun_factor
+    real(jprb):: max_3d_transfer_rate, min_cloud_effective_size
+    real(jprb):: overhang_factor, encroachment_scaling
+    character(511) :: directory_name, aerosol_optics_override_file_name
+    character(511) :: liq_optics_override_file_name, ice_optics_override_file_name
+    character(511) :: cloud_pdf_override_file_name
+    character(63)  :: liquid_model_name, ice_model_name, gas_model_name
+    character(63)  :: sw_solver_name, lw_solver_name, overlap_scheme_name
+    character(63)  :: sw_entrapment_name, sw_encroachment_name, cloud_pdf_shape_name
+    integer :: i_aerosol_type_map(NMaxAerosolTypes) ! More than 256 is an error
+
+    logical :: do_nearest_spectral_sw_albedo = .true.
+    logical :: do_nearest_spectral_lw_emiss = .true.
+    real(jprb) :: sw_albedo_wavelength_bound(NMaxAlbedoIntervals-1)
+    real(jprb) :: lw_emiss_wavelength_bound( NMaxAlbedoIntervals-1)
+    integer :: i_sw_albedo_index(NMaxAlbedoIntervals)
+    integer :: i_lw_emiss_index (NMaxAlbedoIntervals)
+
+    integer :: iunit ! Unit number of namelist file
+
+    namelist /radiation/ do_sw, do_lw, do_sw_direct, &
+         &  do_3d_effects, do_lw_side_emissivity, do_clear, &
+         &  do_save_radiative_properties, sw_entrapment_name, sw_encroachment_name, &
+         &  do_3d_lw_multilayer_effects, do_fu_lw_ice_optics_bug, &
+         &  do_save_spectral_flux, do_save_gpoint_flux, &
+         &  do_surface_sw_spectral_flux, do_lw_derivatives, &
+         &  do_lw_aerosol_scattering, do_lw_cloud_scattering, &
+         &  n_regions, directory_name, gas_model_name, &
+         &  ice_optics_override_file_name, liq_optics_override_file_name, &
+         &  aerosol_optics_override_file_name, cloud_pdf_override_file_name, &
+         &  liquid_model_name, ice_model_name, max_3d_transfer_rate, &
+         &  min_cloud_effective_size, overhang_factor, encroachment_scaling, &
+         &  use_canopy_full_spectrum_sw, use_canopy_full_spectrum_lw, &
+         &  do_canopy_fluxes_sw, do_canopy_fluxes_lw, &
+         &  do_canopy_gases_sw, do_canopy_gases_lw, &
+         &  do_sw_delta_scaling_with_gases, overlap_scheme_name, &
+         &  sw_solver_name, lw_solver_name, use_beta_overlap, &
+         &  use_expm_everywhere, iverbose, iverbosesetup, &
+         &  cloud_inhom_decorr_scaling, cloud_fraction_threshold, &
+         &  clear_to_thick_fraction, max_gas_od_3d, max_cloud_od, &
+         &  cloud_mixing_ratio_threshold, overhead_sun_factor, &
+         &  n_aerosol_types, i_aerosol_type_map, use_aerosols, &
+         &  mono_lw_wavelength, mono_lw_total_od, mono_sw_total_od, &
+         &  mono_lw_single_scattering_albedo, mono_sw_single_scattering_albedo, &
+         &  mono_lw_asymmetry_factor, mono_sw_asymmetry_factor, &
+         &  cloud_pdf_shape_name, &
+         &  do_nearest_spectral_sw_albedo, do_nearest_spectral_lw_emiss, &
+         &  sw_albedo_wavelength_bound, lw_emiss_wavelength_bound, &
+         &  i_sw_albedo_index, i_lw_emiss_index
+
+    real(jprb) :: hook_handle
+
+    if (lhook) call dr_hook('radiation_config:read',0,hook_handle)
+
+    ! Copy default values from the original structure 
+    do_sw = this%do_sw
+    do_lw = this%do_lw
+    do_sw_direct = this%do_sw_direct
+    do_3d_effects = this%do_3d_effects
+    do_3d_lw_multilayer_effects = this%do_3d_lw_multilayer_effects
+    do_lw_side_emissivity = this%do_lw_side_emissivity
+    do_clear = this%do_clear
+    do_lw_aerosol_scattering = this%do_lw_aerosol_scattering
+    do_lw_cloud_scattering = this%do_lw_cloud_scattering
+    do_sw_delta_scaling_with_gases = this%do_sw_delta_scaling_with_gases
+    do_fu_lw_ice_optics_bug = this%do_fu_lw_ice_optics_bug
+    do_canopy_fluxes_sw = this%do_canopy_fluxes_sw
+    do_canopy_fluxes_lw = this%do_canopy_fluxes_lw
+    use_canopy_full_spectrum_sw = this%use_canopy_full_spectrum_sw
+    use_canopy_full_spectrum_lw = this%use_canopy_full_spectrum_lw
+    do_canopy_gases_sw = this%do_canopy_gases_sw
+    do_canopy_gases_lw = this%do_canopy_gases_lw
+    n_regions = this%nregions
+    directory_name = this%directory_name
+    cloud_pdf_override_file_name = this%cloud_pdf_override_file_name
+    liq_optics_override_file_name = this%liq_optics_override_file_name
+    ice_optics_override_file_name = this%ice_optics_override_file_name
+    aerosol_optics_override_file_name = this%aerosol_optics_override_file_name
+    use_expm_everywhere = this%use_expm_everywhere
+    use_aerosols = this%use_aerosols
+    do_save_radiative_properties = this%do_save_radiative_properties
+    do_save_spectral_flux = this%do_save_spectral_flux
+    do_save_gpoint_flux = this%do_save_gpoint_flux
+    do_lw_derivatives = this%do_lw_derivatives
+    do_surface_sw_spectral_flux = this%do_surface_sw_spectral_flux
+    iverbose = this%iverbose
+    iverbosesetup = this%iverbosesetup
+    cloud_fraction_threshold = this%cloud_fraction_threshold
+    cloud_mixing_ratio_threshold = this%cloud_mixing_ratio_threshold
+    use_beta_overlap = this%use_beta_overlap
+    cloud_inhom_decorr_scaling = this%cloud_inhom_decorr_scaling
+    clear_to_thick_fraction = this%clear_to_thick_fraction
+    overhead_sun_factor = this%overhead_sun_factor
+    max_gas_od_3d = this%max_gas_od_3d
+    max_cloud_od = this%max_cloud_od
+    max_3d_transfer_rate = this%max_3d_transfer_rate
+    min_cloud_effective_size = this%min_cloud_effective_size
+    overhang_factor = this%overhang_factor
+    encroachment_scaling = -1.0_jprb
+    gas_model_name = '' !DefaultGasModelName
+    liquid_model_name = '' !DefaultLiquidModelName
+    ice_model_name = '' !DefaultIceModelName
+    sw_solver_name = '' !DefaultSwSolverName
+    lw_solver_name = '' !DefaultLwSolverName
+    sw_entrapment_name = ''
+    sw_encroachment_name = ''
+    overlap_scheme_name = ''
+    cloud_pdf_shape_name = ''
+    n_aerosol_types = this%n_aerosol_types
+    mono_lw_wavelength = this%mono_lw_wavelength
+    mono_lw_total_od = this%mono_lw_total_od
+    mono_sw_total_od = this%mono_sw_total_od
+    mono_lw_single_scattering_albedo = this%mono_lw_single_scattering_albedo
+    mono_sw_single_scattering_albedo = this%mono_sw_single_scattering_albedo
+    mono_lw_asymmetry_factor = this%mono_lw_asymmetry_factor
+    mono_sw_asymmetry_factor = this%mono_sw_asymmetry_factor
+    i_aerosol_type_map = this%i_aerosol_type_map
+    do_nearest_spectral_sw_albedo = this%do_nearest_spectral_sw_albedo
+    do_nearest_spectral_lw_emiss  = this%do_nearest_spectral_lw_emiss
+    sw_albedo_wavelength_bound    = this%sw_albedo_wavelength_bound
+    lw_emiss_wavelength_bound     = this%lw_emiss_wavelength_bound
+    i_sw_albedo_index             = this%i_sw_albedo_index
+    i_lw_emiss_index              = this%i_lw_emiss_index
+
+    if (present(file_name) .and. present(unit)) then
+      write(nulerr,'(a)') '*** Error: cannot specify both file_name and unit in call to config_type%read'
+      call radiation_abort('Radiation configuration error')
+    else if (.not. present(file_name) .and. .not. present(unit)) then
+      write(nulerr,'(a)') '*** Error: neither file_name nor unit specified in call to config_type%read'
+      call radiation_abort('Radiation configuration error')
+    end if
+
+    if (present(file_name)) then
+      ! Open the namelist file
+      iunit = nulrad
+      open(unit=iunit, iostat=iosopen, file=trim(file_name))
+    else
+      ! Assume that iunit represents and open file
+      iosopen = 0
+      iunit = unit
+    end if
+
+    if (iosopen /= 0) then
+      ! An error occurred opening the file
+      if (present(is_success)) then
+        is_success = .false.
+        ! We now continue the subroutine so that the default values
+        ! are placed in the config structure
+      else
+        write(nulerr,'(a,a,a)') '*** Error: namelist file "', &
+             &                trim(file_name), '" not found'
+        call radiation_abort('Radiation configuration error')
+      end if
+    else
+      read(unit=iunit, iostat=iosread, nml=radiation)
+      if (iosread /= 0) then
+        ! An error occurred reading the file
+        if (present(is_success)) then
+          is_success = .false.
+          ! We now continue the subroutine so that the default values
+          ! are placed in the config structure
+        else if (present(file_name)) then
+          write(nulerr,'(a,a,a)') '*** Error reading namelist "radiation" from file "', &
+               &      trim(file_name), '"'
+          close(unit=iunit)
+          call radiation_abort('Radiation configuration error')
+        else
+          write(nulerr,'(a,i0)') '*** Error reading namelist "radiation" from unit ', &
+               &      iunit
+          call radiation_abort('Radiation configuration error')
+        end if
+      end if
+
+      if (present(file_name)) then
+        close(unit=iunit)
+      end if
+    end if
+
+    ! Copy namelist data into configuration object
+
+    ! Start with verbosity levels, which should be within limits
+    if (iverbose < 0) then
+      iverbose = 0
+    end if
+    this%iverbose = iverbose
+
+    if (iverbosesetup < 0) then
+      iverbosesetup = 0
+    end if
+    this%iverbosesetup = iverbosesetup
+
+    this%do_lw = do_lw
+    this%do_sw = do_sw
+    this%do_clear = do_clear
+    this%do_sw_direct = do_sw_direct
+    this%do_3d_effects = do_3d_effects
+    this%do_3d_lw_multilayer_effects = do_3d_lw_multilayer_effects
+    this%do_lw_side_emissivity = do_lw_side_emissivity
+    this%use_expm_everywhere = use_expm_everywhere
+    this%use_aerosols = use_aerosols
+    this%do_lw_cloud_scattering = do_lw_cloud_scattering
+    this%do_lw_aerosol_scattering = do_lw_aerosol_scattering
+    this%nregions = n_regions
+    this%do_surface_sw_spectral_flux = do_surface_sw_spectral_flux
+    this%do_sw_delta_scaling_with_gases = do_sw_delta_scaling_with_gases
+    this%do_fu_lw_ice_optics_bug = do_fu_lw_ice_optics_bug
+    this%do_canopy_fluxes_sw = do_canopy_fluxes_sw
+    this%do_canopy_fluxes_lw = do_canopy_fluxes_lw
+    this%use_canopy_full_spectrum_sw = use_canopy_full_spectrum_sw
+    this%use_canopy_full_spectrum_lw = use_canopy_full_spectrum_lw
+    this%do_canopy_gases_sw = do_canopy_gases_sw
+    this%do_canopy_gases_lw = do_canopy_gases_lw
+    this%mono_lw_wavelength = mono_lw_wavelength
+    this%mono_lw_total_od = mono_lw_total_od
+    this%mono_sw_total_od = mono_sw_total_od
+    this%mono_lw_single_scattering_albedo = mono_lw_single_scattering_albedo
+    this%mono_sw_single_scattering_albedo = mono_sw_single_scattering_albedo
+    this%mono_lw_asymmetry_factor = mono_lw_asymmetry_factor
+    this%mono_sw_asymmetry_factor = mono_sw_asymmetry_factor
+    this%use_beta_overlap = use_beta_overlap
+    this%cloud_inhom_decorr_scaling = cloud_inhom_decorr_scaling
+    this%clear_to_thick_fraction = clear_to_thick_fraction
+    this%overhead_sun_factor = overhead_sun_factor
+    this%max_gas_od_3d = max_gas_od_3d
+    this%max_cloud_od = max_cloud_od
+    this%max_3d_transfer_rate = max_3d_transfer_rate
+    this%min_cloud_effective_size = max(1.0e-6_jprb, min_cloud_effective_size)
+    if (encroachment_scaling >= 0.0_jprb) then
+      this%overhang_factor = encroachment_scaling
+      if (iverbose >= 1) then
+        write(nulout, '(a)') 'Warning: radiation namelist parameter "encroachment_scaling" is deprecated: use "overhang_factor"'
+      end if
+    else
+      this%overhang_factor = overhang_factor
+    end if
+    this%directory_name = directory_name
+    this%cloud_pdf_override_file_name = cloud_pdf_override_file_name
+    this%liq_optics_override_file_name = liq_optics_override_file_name
+    this%ice_optics_override_file_name = ice_optics_override_file_name
+    this%aerosol_optics_override_file_name = aerosol_optics_override_file_name
+    this%cloud_fraction_threshold = cloud_fraction_threshold
+    this%cloud_mixing_ratio_threshold = cloud_mixing_ratio_threshold
+    this%n_aerosol_types = n_aerosol_types
+    this%do_save_radiative_properties = do_save_radiative_properties
+    this%do_lw_derivatives = do_lw_derivatives
+    this%do_save_spectral_flux = do_save_spectral_flux
+    this%do_save_gpoint_flux = do_save_gpoint_flux
+    this%do_nearest_spectral_sw_albedo = do_nearest_spectral_sw_albedo
+    this%do_nearest_spectral_lw_emiss  = do_nearest_spectral_lw_emiss
+    this%sw_albedo_wavelength_bound    = sw_albedo_wavelength_bound
+    this%lw_emiss_wavelength_bound     = lw_emiss_wavelength_bound
+    this%i_sw_albedo_index             = i_sw_albedo_index
+    this%i_lw_emiss_index              = i_lw_emiss_index
+
+    if (do_save_gpoint_flux) then
+      ! Saving the fluxes every g-point overrides saving as averaged
+      ! in a band, but this%do_save_spectral_flux needs to be TRUE as
+      ! it is tested inside the solver routines to decide whether to
+      ! save anything
+      this%do_save_spectral_flux = .true.
+    end if
+
+    ! Determine liquid optics model
+    call get_enum_code(liquid_model_name, LiquidModelName, &
+         &            'liquid_model_name', this%i_liq_model)
+
+    ! Determine ice optics model
+    call get_enum_code(ice_model_name, IceModelName, &
+         &            'ice_model_name', this%i_ice_model)
+
+    ! Determine gas optics model
+    call get_enum_code(gas_model_name, GasModelName, &
+         &            'gas_model_name', this%i_gas_model)
+
+    ! Determine solvers
+    call get_enum_code(sw_solver_name, SolverName, &
+         &            'sw_solver_name', this%i_solver_sw)
+    call get_enum_code(lw_solver_name, SolverName, &
+         &            'lw_solver_name', this%i_solver_lw)
+
+    if (len_trim(sw_encroachment_name) > 1) then
+      call get_enum_code(sw_encroachment_name, EncroachmentName, &
+           &             'sw_encroachment_name', this%i_3d_sw_entrapment)
+      write(nulout, '(a)') 'Warning: radiation namelist string "sw_encroachment_name" is deprecated: use "sw_entrapment_name"'
+    else
+      call get_enum_code(sw_entrapment_name, EntrapmentName, &
+           &             'sw_entrapment_name', this%i_3d_sw_entrapment)
+    end if
+
+    ! Determine overlap scheme
+    call get_enum_code(overlap_scheme_name, OverlapName, &
+         &             'overlap_scheme_name', this%i_overlap_scheme)
+    
+    ! Determine cloud PDF shape 
+    call get_enum_code(cloud_pdf_shape_name, PdfShapeName, &
+         &             'cloud_pdf_shape_name', this%i_cloud_pdf_shape)
+
+    this%i_aerosol_type_map = 0
+    if (this%use_aerosols) then
+      this%i_aerosol_type_map(1:n_aerosol_types) &
+           &  = i_aerosol_type_map(1:n_aerosol_types)
+    end if
+
+    ! Will clouds be used at all?
+    if ((this%do_sw .and. this%i_solver_sw /= ISolverCloudless) &
+         &  .or. (this%do_lw .and. this%i_solver_lw /= ISolverCloudless)) then
+      this%do_clouds = .true.
+    else
+      this%do_clouds = .false.
+    end if
+
+    ! Normal subroutine exit
+    if (present(is_success)) then
+      is_success = .true.
+    end if
+
+    if (lhook) call dr_hook('radiation_config:read',1,hook_handle)
+
+  end subroutine read_config_from_namelist
+
+
+  !---------------------------------------------------------------------
+  ! This routine is called by radiation_interface:setup_radiation and
+  ! it converts the user specified options into some more specific
+  ! data such as data file names
+  subroutine consolidate_config(this)
+
+    use yomhook,      only : lhook, dr_hook
+    use radiation_io, only : nulout, nulerr, radiation_abort
+
+    class(config_type), intent(inout)         :: this
+
+    real(jprb) :: hook_handle
+
+    if (lhook) call dr_hook('radiation_config:consolidate',0,hook_handle)
+
+    ! Check consistency of models
+    if (this%do_canopy_fluxes_sw .and. .not. this%do_surface_sw_spectral_flux) then
+      if (this%iverbosesetup >= 1) then
+        write(nulout,'(a)') 'Warning: turning on do_surface_sw_spectral_flux as required by do_canopy_fluxes_sw'
+      end if
+      this%do_surface_sw_spectral_flux = .true.
+    end if
+
+    ! Will clouds be used at all?
+    if ((this%do_sw .and. this%i_solver_sw /= ISolverCloudless) &
+         &  .or. (this%do_lw .and. this%i_solver_lw /= ISolverCloudless)) then
+      this%do_clouds = .true.
+    else
+      this%do_clouds = .false.
+    end if
+
+    ! SPARTACUS only works with Exp-Ran overlap scheme
+    if ((       this%i_solver_sw == ISolverSPARTACUS &
+         & .or. this%i_solver_lw == ISolverSPARTACUS &
+         & .or. this%i_solver_sw == ISolverTripleclouds &
+         & .or. this%i_solver_lw == ISolverTripleclouds) &
+         & .and. this%i_overlap_scheme /= IOverlapExponentialRandom) then
+      write(nulerr,'(a)') '*** Error: SPARTACUS/Tripleclouds solvers can only do Exponential-Random overlap'
+      call radiation_abort('Radiation configuration error')
+
+    end if
+
+    ! Set aerosol optics file name
+    if (len_trim(this%aerosol_optics_override_file_name) > 0) then
+      if (this%aerosol_optics_override_file_name(1:1) == '/') then
+        this%aerosol_optics_file_name = trim(this%aerosol_optics_override_file_name)
+      else
+        this%aerosol_optics_file_name = trim(this%directory_name) &
+             &  // '/' // trim(this%aerosol_optics_override_file_name)
+      end if
+    else
+      ! In the IFS, the aerosol optics file should be specified in
+      ! ifs/module/radiation_setup.F90, not here
+      this%aerosol_optics_file_name &
+           &   = trim(this%directory_name) // "/aerosol_ifs_rrtm_45R2.nc"
+    end if
+
+    ! Set liquid optics file name
+    if (len_trim(this%liq_optics_override_file_name) > 0) then
+      if (this%liq_optics_override_file_name(1:1) == '/') then
+        this%liq_optics_file_name = trim(this%liq_optics_override_file_name)
+      else
+        this%liq_optics_file_name = trim(this%directory_name) &
+             &  // '/' // trim(this%liq_optics_override_file_name)
+      end if
+    else if (this%i_liq_model == ILiquidModelSOCRATES) then
+      this%liq_optics_file_name &
+           &  = trim(this%directory_name) // "/socrates_droplet_scattering_rrtm.nc"
+    else if (this%i_liq_model == ILiquidModelSlingo) then
+      this%liq_optics_file_name &
+           &  = trim(this%directory_name) // "/slingo_droplet_scattering_rrtm.nc"
+    end if
+
+    ! Set ice optics file name
+    if (len_trim(this%ice_optics_override_file_name) > 0) then
+      if (this%ice_optics_override_file_name(1:1) == '/') then
+        this%ice_optics_file_name = trim(this%ice_optics_override_file_name)
+      else
+        this%ice_optics_file_name = trim(this%directory_name) &
+             &  // '/' // trim(this%ice_optics_override_file_name)
+      end if
+    else if (this%i_ice_model == IIceModelFu) then
+      this%ice_optics_file_name &
+           &   = trim(this%directory_name) // "/fu_ice_scattering_rrtm.nc"
+    else if (this%i_ice_model == IIceModelBaran) then
+      this%ice_optics_file_name &
+           &   = trim(this%directory_name) // "/baran_ice_scattering_rrtm.nc"
+    else if (this%i_ice_model == IIceModelBaran2016) then
+      this%ice_optics_file_name &
+           &   = trim(this%directory_name) // "/baran2016_ice_scattering_rrtm.nc"
+    else if (this%i_ice_model == IIceModelBaran2017) then
+      this%ice_optics_file_name &
+           &   = trim(this%directory_name) // "/baran2017_ice_scattering_rrtm.nc"
+    else if (this%i_ice_model == IIceModelYi) then
+      this%ice_optics_file_name &
+           &   = trim(this%directory_name) // "/yi_ice_scattering_rrtm.nc"
+    else if (this%i_ice_model == IIceModelShapes) then
+      this%ice_optics_file_name &
+           &   = trim(this%directory_name) // "/" // CPRISTINE_ICE_LIMA // "_ice_scattering_rrtm.nc"
+    end if
+
+    ! Set cloud-water PDF look-up table file name
+    if (len_trim(this%cloud_pdf_override_file_name) > 0) then
+      if (this%cloud_pdf_override_file_name(1:1) == '/') then
+        this%cloud_pdf_file_name = trim(this%cloud_pdf_override_file_name)
+      else
+        this%cloud_pdf_file_name = trim(this%directory_name) &
+             &  // '/' // trim(this%cloud_pdf_override_file_name)
+      end if
+    elseif (this%i_cloud_pdf_shape == IPdfShapeLognormal) then
+      this%cloud_pdf_file_name = trim(this%directory_name) // "/mcica_lognormal.nc"
+    else
+      this%cloud_pdf_file_name = trim(this%directory_name) // "/mcica_gamma.nc"
+    end if
+
+    ! Aerosol data
+    if (this%n_aerosol_types < 0 &
+         &  .or. this%n_aerosol_types > NMaxAerosolTypes) then
+      write(nulerr,'(a,i0)') '*** Error: number of aerosol types must be between 0 and ', &
+           &  NMaxAerosolTypes
+      call radiation_abort('Radiation configuration error')
+    end if
+
+    if (this%use_aerosols .and. this%n_aerosol_types == 0) then
+      if (this%iverbosesetup >= 2) then
+        write(nulout, '(a)') 'Aerosols on but n_aerosol_types=0: optical properties to be computed outside ecRad'
+      end if
+    end if
+
+    ! In the monochromatic case we need to override the liquid, ice
+    ! and aerosol models to ensure compatibility
+    if (this%i_gas_model == IGasModelMonochromatic) then
+      this%i_liq_model = ILiquidModelMonochromatic
+      this%i_ice_model = IIceModelMonochromatic
+      this%use_aerosols = .false.
+    end if
+
+    ! McICA solver currently can't store full profiles of spectral fluxes
+    if (this%i_solver_sw == ISolverMcICA) then
+      this%do_save_spectral_flux = .false.
+    end if
+
+    if (this%i_solver_sw == ISolverSPARTACUS .and. this%do_sw_delta_scaling_with_gases) then
+      write(nulerr,'(a)') '*** Error: SW delta-Eddington scaling with gases not possible with SPARTACUS solver'
+      call radiation_abort('Radiation configuration error')
+    end if
+
+    if ((this%do_lw .and. this%do_sw) .and. &
+         & (     (      this%i_solver_sw == ISolverHomogeneous  &
+         &        .and. this%i_solver_lw /= ISolverHomogeneous) &
+         &  .or. (      this%i_solver_sw /= ISolverHomogeneous  &
+         &        .and. this%i_solver_lw == ISolverHomogeneous) &
+         & ) ) then
+      write(nulerr,'(a)') '*** Error: if one solver is "Homogeneous" then the other must be'
+      call radiation_abort('Radiation configuration error')
+    end if
+
+    ! Set is_homogeneous if the active solvers are homogeneous, since
+    ! this affects how "in-cloud" water contents are computed
+    if (        (this%do_sw .and. this%i_solver_sw == ISolverHomogeneous) &
+         & .or. (this%do_lw .and. this%i_solver_lw == ISolverHomogeneous)) then
+      this%is_homogeneous = .true.
+    end if
+
+    this%is_consolidated = .true.
+
+    if (lhook) call dr_hook('radiation_config:consolidate',1,hook_handle)
+
+  end subroutine consolidate_config
+
+
+  !---------------------------------------------------------------------
+  ! This subroutine sets members of the configuration object via
+  ! optional arguments, and any member not specified is left
+  ! untouched. Therefore, this should be called after taking data from
+  ! the namelist.
+  subroutine set_config(config, directory_name, &
+       &  do_lw, do_sw, &
+       &  do_lw_aerosol_scattering, do_lw_cloud_scattering, &
+       &  do_sw_direct)
+
+    class(config_type), intent(inout):: config
+    character(len=*), intent(in), optional  :: directory_name
+    logical, intent(in), optional           :: do_lw, do_sw
+    logical, intent(in), optional           :: do_lw_aerosol_scattering
+    logical, intent(in), optional           :: do_lw_cloud_scattering
+    logical, intent(in), optional           :: do_sw_direct
+
+    if (present(do_lw)) then
+       config%do_lw = do_lw
+    end if
+
+    if(present(do_sw)) then
+       config%do_sw = do_sw
+    end if
+
+    if (present(do_sw_direct)) then
+       config%do_sw_direct = do_sw_direct
+    end if
+
+    if (present(directory_name)) then
+       config%directory_name = trim(directory_name)
+    end if
+
+    if (present(do_lw_aerosol_scattering)) then
+       config%do_lw_aerosol_scattering = .true.
+    end if
+
+    if (present(do_lw_cloud_scattering)) then
+       config%do_lw_cloud_scattering = .true.
+    end if
+
+  end subroutine set_config
+
+
+  !---------------------------------------------------------------------
+  ! Print configuration information to standard output
+  subroutine print_config(this, iverbose)
+
+    use radiation_io, only : nulout
+
+    class(config_type), intent(in) :: this
+
+    integer, optional,  intent(in) :: iverbose
+    integer                        :: i_local_verbose
+
+    if (present(iverbose)) then
+      i_local_verbose = iverbose
+    else
+      i_local_verbose = this%iverbose
+    end if
+
+    if (i_local_verbose >= 2) then
+      !---------------------------------------------------------------------
+      write(nulout, '(a)') 'General settings:'
+      write(nulout, '(a,a,a)') '  Data files expected in "', &
+           &                   trim(this%directory_name), '"'
+      call print_logical('  Clear-sky calculations are', 'do_clear', this%do_clear)
+      call print_logical('  Saving intermediate radiative properties', &
+           &   'do_save_radiative_properties', this%do_save_radiative_properties)
+      call print_logical('  Saving spectral flux profiles', &
+           &   'do_save_spectral_flux', this%do_save_spectral_flux)
+      call print_enum('  Gas model is', GasModelName, 'i_gas_model', &
+           &          this%i_gas_model)
+      call print_logical('  Aerosols are', 'use_aerosols', this%use_aerosols)
+      call print_logical('  Clouds are', 'do_clouds', this%do_clouds)
+
+      !---------------------------------------------------------------------
+      write(nulout, '(a)') 'Surface settings:'
+      if (this%do_sw) then
+        call print_logical('  Saving surface shortwave spectral fluxes', &
+             &   'do_surface_sw_spectral_flux', this%do_surface_sw_spectral_flux)
+        call print_logical('  Saving surface shortwave fluxes in abledo bands', &
+             &   'do_canopy_fluxes_sw', this%do_canopy_fluxes_sw)
+      end if
+      if (this%do_lw) then
+        call print_logical('  Saving surface longwave fluxes in emissivity bands', &
+             &   'do_canopy_fluxes_lw', this%do_canopy_fluxes_lw)
+        call print_logical('  Longwave derivative calculation is', &
+             &   'do_lw_derivatives',this%do_lw_derivatives)
+      end if
+      if (this%do_sw) then
+        call print_logical('  Nearest-neighbour spectral albedo mapping', &
+             &   'do_nearest_spectral_sw_albedo', this%do_nearest_spectral_sw_albedo)
+      end if
+      if (this%do_lw) then
+        call print_logical('  Nearest-neighbour spectral emissivity mapping', &
+             &   'do_nearest_spectral_lw_emiss', this%do_nearest_spectral_lw_emiss)
+      end if
+      !---------------------------------------------------------------------
+      if (this%do_clouds) then
+        write(nulout, '(a)') 'Cloud settings:'
+        call print_real('  Cloud fraction threshold', &
+             &   'cloud_fraction_threshold', this%cloud_fraction_threshold)
+        call print_real('  Cloud mixing-ratio threshold', &
+             &   'cloud_mixing_ratio_threshold', this%cloud_mixing_ratio_threshold)
+        call print_enum('  Liquid optics scheme is', LiquidModelName, &
+             &          'i_liq_model',this%i_liq_model)
+        call print_enum('  Ice optics scheme is', IceModelName, &
+             &          'i_ice_model',this%i_ice_model)
+        if (this%i_ice_model == IIceModelFu) then
+          call print_logical('  Longwave ice optics bug in Fu scheme is', &
+               &   'do_fu_lw_ice_optics_bug',this%do_fu_lw_ice_optics_bug)
+        end if
+        call print_enum('  Cloud overlap scheme is', OverlapName, &
+             &          'i_overlap_scheme',this%i_overlap_scheme)
+        call print_logical('  Use "beta" overlap parameter is', &
+             &   'use_beta_overlap', this%use_beta_overlap)
+        call print_enum('  Cloud PDF shape is', PdfShapeName, &
+             &          'i_cloud_pdf_shape',this%i_cloud_pdf_shape)
+        call print_real('  Cloud inhom decorrelation scaling', &
+             &   'cloud_inhom_decorr_scaling', this%cloud_inhom_decorr_scaling)
+      end if
+
+      !---------------------------------------------------------------------
+      write(nulout, '(a)') 'Solver settings:'
+      if (this%do_sw) then
+        call print_enum('  Shortwave solver is', SolverName, &
+             &          'i_solver_sw', this%i_solver_sw)
+        
+        if (this%i_gas_model == IGasModelMonochromatic) then
+          call print_real('  Shortwave atmospheric optical depth', &
+               &   'mono_sw_total_od', this%mono_sw_total_od)
+          call print_real('  Shortwave particulate single-scattering albedo', &
+               &   'mono_sw_single_scattering_albedo', &
+               &   this%mono_sw_single_scattering_albedo)
+          call print_real('  Shortwave particulate asymmetry factor', &
+               &   'mono_sw_asymmetry_factor', &
+               &   this%mono_sw_asymmetry_factor)
+        end if
+        call print_logical('  Shortwave delta scaling after merge with gases', &
+             &   'do_sw_delta_scaling_with_gases', &
+             &   this%do_sw_delta_scaling_with_gases)
+      else
+        call print_logical('  Shortwave calculations are','do_sw',this%do_sw)
+      end if
+
+      if (this%do_lw) then
+        call print_enum('  Longwave solver is', SolverName, 'i_solver_lw', &
+             &          this%i_solver_lw)
+
+        if (this%i_gas_model == IGasModelMonochromatic) then
+          if (this%mono_lw_wavelength > 0.0_jprb) then
+            call print_real('  Longwave effective wavelength (m)', &
+                 &   'mono_lw_wavelength', this%mono_lw_wavelength)
+          else
+            write(nulout,'(a)') '  Longwave fluxes are broadband                              (mono_lw_wavelength<=0)'
+          end if
+          call print_real('  Longwave atmospheric optical depth', &
+               &   'mono_lw_total_od', this%mono_lw_total_od)  
+          call print_real('  Longwave particulate single-scattering albedo', &
+               &   'mono_lw_single_scattering_albedo', &
+               &   this%mono_lw_single_scattering_albedo)
+          call print_real('  Longwave particulate asymmetry factor', &
+               &   'mono_lw_asymmetry_factor', &
+               &   this%mono_lw_asymmetry_factor)
+        end if
+        call print_logical('  Longwave cloud scattering is', &
+             &   'do_lw_cloud_scattering',this%do_lw_cloud_scattering)
+        call print_logical('  Longwave aerosol scattering is', &
+             &   'do_lw_aerosol_scattering',this%do_lw_aerosol_scattering)
+      else
+        call print_logical('  Longwave calculations are','do_lw', this%do_lw)
+      end if
+
+      if (this%i_solver_sw == ISolverSpartacus &
+           &  .or. this%i_solver_lw == ISolverSpartacus) then
+        write(nulout, '(a)') '  SPARTACUS options:'
+        call print_integer('    Number of regions', 'n_regions', this%nregions)
+        call print_real('    Max cloud optical depth per layer', &
+             &   'max_cloud_od', this%max_cloud_od)
+        call print_enum('    Shortwave entrapment is', EntrapmentName, &
+             &          'i_3d_sw_entrapment', this%i_3d_sw_entrapment)
+        call print_logical('    Multilayer longwave horizontal transport is', &
+             'do_3d_lw_multilayer_effects', this%do_3d_lw_multilayer_effects)
+        call print_logical('    Use matrix exponential everywhere is', &
+             &   'use_expm_everywhere', this%use_expm_everywhere)
+        call print_logical('    3D effects are', 'do_3d_effects', &
+             &             this%do_3d_effects)
+
+        if (this%do_3d_effects) then
+          call print_logical('    Longwave side emissivity parameterization is', &
+               &  'do_lw_side_emissivity', this%do_lw_side_emissivity)
+          call print_real('    Clear-to-thick edge fraction is', &
+               &  'clear_to_thick_fraction', this%clear_to_thick_fraction)
+          call print_real('    Overhead sun factor is', &
+               &  'overhead_sun_factor', this%overhead_sun_factor)
+          call print_real('    Max gas optical depth for 3D effects', &
+               &   'max_gas_od_3d', this%max_gas_od_3d)
+          call print_real('    Max 3D transfer rate', &
+               &   'max_3d_transfer_rate', this%max_3d_transfer_rate)
+          call print_real('    Min cloud effective size (m)', &
+               &   'min_cloud_effective_size', this%min_cloud_effective_size)
+          call print_real('    Overhang factor', &
+               &   'overhang_factor', this%overhang_factor)
+        end if
+      end if
+            
+    end if
+    
+  end subroutine print_config
+
+
+
+  !---------------------------------------------------------------------
+  ! In order to estimate UV and photosynthetically active radiation,
+  ! we need weighted sum of fluxes considering wavelength range
+  ! required.  This routine returns information for how to correctly
+  ! weight output spectral fluxes for a range of input wavelengths.
+  ! Note that this is approximate; internally it may be assumed that
+  ! the energy is uniformly distributed in wavenumber space, for
+  ! example.  If the character string "weighting_name" is present, and
+  ! iverbose>=2, then information on the weighting will be provided on
+  ! nulout.
+  subroutine get_sw_weights(this, wavelength1, wavelength2, &
+       &                    nweights, iband, weight, weighting_name)
+
+    use parkind1, only : jprb
+    use radiation_io, only : nulout, nulerr, radiation_abort
+
+    class(config_type), intent(in) :: this
+    ! Range of wavelengths to get weights for (m)
+    real(jprb), intent(in) :: wavelength1, wavelength2
+    ! Output number of weights needed
+    integer,    intent(out)   :: nweights
+    ! Only write to the first nweights of these arrays: they contain
+    ! the indices to the non-zero bands, and the weight in each of
+    ! those bands
+    integer,    intent(out)   :: iband(:)
+    real(jprb), intent(out)   :: weight(:)
+    character(len=*), optional, intent(in) :: weighting_name
+
+    ! Internally we deal with wavenumber
+    real(jprb) :: wavenumber1, wavenumber2 ! cm-1
+
+    integer :: jband ! Loop index for spectral band
+
+    if (this%n_bands_sw <= 0) then
+      write(nulerr,'(a)') '*** Error: get_sw_weights called before number of shortwave bands set'
+      call radiation_abort()
+    end if
+
+    ! Convert wavelength range (m) to wavenumber (cm-1)
+    wavenumber1 = 0.01_jprb / wavelength2
+    wavenumber2 = 0.01_jprb / wavelength1
+
+    nweights = 0
+
+    do jband = 1,this%n_bands_sw
+      if (wavenumber1 < this%wavenumber2_sw(jband) &
+           &  .and. wavenumber2 > this%wavenumber1_sw(jband)) then
+        nweights = nweights+1
+        iband(nweights) = jband
+        weight(nweights) = (min(wavenumber2,this%wavenumber2_sw(jband)) &
+             &         - max(wavenumber1,this%wavenumber1_sw(jband))) &
+             & / (this%wavenumber2_sw(jband) - this%wavenumber1_sw(jband))
+      end if
+    end do
+
+    if (nweights == 0) then
+      write(nulerr,'(a,e8.4,a,e8.4,a)') '*** Error: wavelength range ', &
+           &  wavelength1, ' to ', wavelength2, ' m is outside shortwave band'
+      call radiation_abort()
+    else if (this%iverbosesetup >= 2 .and. present(weighting_name)) then
+      write(nulout,'(a,a,a,f6.0,a,f6.0,a)') 'Spectral weights for ', &
+           &  weighting_name, ' (', wavenumber1, ' to ', &
+           &  wavenumber2, ' cm-1):'
+      do jband = 1, nweights
+        write(nulout, '(a,i0,a,f6.0,a,f6.0,a,f8.4)') '  Shortwave band ', &
+             &  iband(jband), ' (', this%wavenumber1_sw(iband(jband)), ' to ', &
+             &  this%wavenumber2_sw(iband(jband)), ' cm-1): ', weight(jband)
+      end do
+    end if
+
+  end subroutine get_sw_weights
+
+
+  !---------------------------------------------------------------------
+  ! The input shortwave surface albedo coming in is likely to be in
+  ! different spectral intervals to the gas model in the radiation
+  ! scheme. We assume that the input albedo is defined within
+  ! "ninterval" spectral intervals covering the wavelength range 0 to
+  ! infinity, but allow for the possibility that two intervals may be
+  ! indexed back to the same albedo band.  
+  subroutine define_sw_albedo_intervals(this, ninterval, wavelength_bound, &
+       &                                i_intervals, do_nearest)
+
+    use radiation_io, only : nulerr, radiation_abort
+
+    class(config_type),   intent(inout) :: this
+    ! Number of spectral intervals in which albedo is defined
+    integer,              intent(in)    :: ninterval
+    ! Monotonically increasing wavelength bounds between intervals,
+    ! not including the outer bounds (which are assumed to be zero and
+    ! infinity)
+    real(jprb),           intent(in)    :: wavelength_bound(ninterval-1)
+    ! The albedo indices corresponding to each interval
+    integer,              intent(in)    :: i_intervals(ninterval)
+    logical,    optional, intent(in)    :: do_nearest
+    
+    if (ninterval > NMaxAlbedoIntervals) then
+      write(nulerr,'(a,i0,a,i0)') '*** Error: ', ninterval, &
+           &  ' albedo intervals exceeds maximum of ', NMaxAlbedoIntervals
+      call radiation_abort();
+    end if
+
+    if (present(do_nearest)) then
+      this%do_nearest_spectral_sw_albedo = do_nearest
+    else
+      this%do_nearest_spectral_sw_albedo = .false.
+    end if
+    this%sw_albedo_wavelength_bound(1:ninterval-1) = wavelength_bound(1:ninterval-1)
+    this%sw_albedo_wavelength_bound(ninterval:)    = -1.0_jprb
+    this%i_sw_albedo_index(1:ninterval)            = i_intervals(1:ninterval)
+    this%i_sw_albedo_index(ninterval+1:)           = 0
+
+    if (this%is_consolidated) then
+      call this%consolidate_intervals(.true., &
+           &  this%do_nearest_spectral_sw_albedo, &
+           &  this%sw_albedo_wavelength_bound, this%i_sw_albedo_index, &
+           &  this%wavenumber1_sw, this%wavenumber2_sw, &
+           &  this%i_albedo_from_band_sw, this%sw_albedo_weights)
+    end if
+
+  end subroutine define_sw_albedo_intervals
+
+
+  !---------------------------------------------------------------------
+  ! As define_sw_albedo_intervals but for longwave emissivity
+  subroutine define_lw_emiss_intervals(this, ninterval, wavelength_bound, &
+       &                                i_intervals, do_nearest)
+
+    use radiation_io, only : nulerr, radiation_abort
+
+    class(config_type),   intent(inout) :: this
+    ! Number of spectral intervals in which emissivity is defined
+    integer,              intent(in)    :: ninterval
+    ! Monotonically increasing wavelength bounds between intervals,
+    ! not including the outer bounds (which are assumed to be zero and
+    ! infinity)
+    real(jprb),           intent(in)    :: wavelength_bound(ninterval-1)
+    ! The emissivity indices corresponding to each interval
+    integer,              intent(in)    :: i_intervals(ninterval)
+    logical,    optional, intent(in)    :: do_nearest
+    
+    if (ninterval > NMaxAlbedoIntervals) then
+      write(nulerr,'(a,i0,a,i0)') '*** Error: ', ninterval, &
+           &  ' emissivity intervals exceeds maximum of ', NMaxAlbedoIntervals
+      call radiation_abort();
+    end if
+
+    if (present(do_nearest)) then
+      this%do_nearest_spectral_lw_emiss = do_nearest
+    else
+      this%do_nearest_spectral_lw_emiss = .false.
+    end if
+    this%lw_emiss_wavelength_bound(1:ninterval-1) = wavelength_bound(1:ninterval-1)
+    this%lw_emiss_wavelength_bound(ninterval:)    = -1.0_jprb
+    this%i_lw_emiss_index(1:ninterval)            = i_intervals(1:ninterval)
+    this%i_lw_emiss_index(ninterval+1:)           = 0
+
+    if (this%is_consolidated) then
+      call this%consolidate_intervals(.false., &
+           &  this%do_nearest_spectral_lw_emiss, &
+           &  this%lw_emiss_wavelength_bound, this%i_lw_emiss_index, &
+           &  this%wavenumber1_lw, this%wavenumber2_lw, &
+           &  this%i_emiss_from_band_lw, this%lw_emiss_weights)
+    end if
+
+  end subroutine define_lw_emiss_intervals
+
+
+  !---------------------------------------------------------------------
+  ! This routine consolidates either the input shortwave albedo
+  ! intervals with the shortwave bands, or the input longwave
+  ! emissivity intervals with the longwave bands, depending on the
+  ! arguments provided.
+  subroutine consolidate_intervals(this, is_sw, do_nearest, &
+       &  wavelength_bound, i_intervals, wavenumber1, wavenumber2, &
+       &  i_mapping, weights)
+
+    use radiation_io, only : nulout, nulerr, radiation_abort
+
+    class(config_type),   intent(inout) :: this
+    ! Is this the shortwave?  Otherwise longwave
+    logical,    intent(in)    :: is_sw
+    ! Do we find the nearest albedo interval to the centre of each
+    ! band, or properly weight the contributions? This can be modified
+    ! if there is only one albedo intervals.
+    logical, intent(inout)    :: do_nearest
+    ! Monotonically increasing wavelength bounds between intervals,
+    ! not including the outer bounds (which are assumed to be zero and
+    ! infinity)
+    real(jprb), intent(in)    :: wavelength_bound(NMaxAlbedoIntervals-1)
+    ! The albedo band indices corresponding to each interval
+    integer,    intent(in)    :: i_intervals(NMaxAlbedoIntervals)
+    ! Start and end wavenumber bounds for the ecRad bands (cm-1)
+    real(jprb), intent(in)    :: wavenumber1(:), wavenumber2(:)
+
+    ! if do_nearest is TRUE then the result is expressed in i_mapping,
+    ! which will be allocated to have the same length as wavenumber1,
+    ! and contain the index of the albedo interval corresponding to
+    ! that band
+    integer,    allocatable, intent(inout) :: i_mapping(:)
+    ! ...otherwise the result is expressed in "weights", of
+    ! size(n_intervals, n_bands) containing how much of each interval
+    ! contributes to each band.
+    real(jprb), allocatable, intent(inout) :: weights(:,:)
+
+    ! Number and loop index of ecRad bands
+    integer    :: nband, jband
+    ! Number and index of albedo/emissivity intervals
+    integer    :: ninterval, iinterval
+    ! Sometimes an albedo or emissivity value will be used in more
+    ! than one interval, so nvalue indicates how many values will
+    ! actually be provided
+    integer    :: nvalue
+    ! Wavenumber bounds of the albedo/emissivity interval
+    real(jprb) :: wavenumber1_albedo, wavenumber2_albedo
+    ! Reciprocal of the wavenumber range of the ecRad band
+    real(jprb) :: recip_dwavenumber ! cm
+    ! Midpoint/bound of wavenumber band
+    real(jprb) :: wavenumber_mid, wavenumber_bound ! cm-1
+    
+    nband = size(wavenumber1)
+
+    ! Count the number of albedo/emissivity intervals
+    ninterval = 0
+    do iinterval = 1,NMaxAlbedoIntervals
+      if (i_intervals(iinterval) > 0) then
+        ninterval = iinterval
+      else
+        exit
+      end if
+    end do
+
+    if (ninterval < 2) then
+      ! Zero or one albedo/emissivity intervals found, so we index all
+      ! bands to one interval
+      if (allocated(i_mapping)) then
+        deallocate(i_mapping)
+      end if
+      allocate(i_mapping(nband))
+      i_mapping(:) = 1
+      do_nearest = .true.
+      ninterval = 1
+      nvalue = 1
+    else
+      ! Check wavelength is monotonically increasing
+      do jband = 2,ninterval-1
+        if (wavelength_bound(jband) <= wavelength_bound(jband-1)) then
+          if (is_sw) then
+            write(nulerr, '(a,a)') '*** Error: wavelength bounds for shortwave albedo intervals ', &
+                 &  'must be monotonically increasing'
+          else
+            write(nulerr, '(a,a)') '*** Error: wavelength bounds for longwave emissivity intervals ', &
+                 &  'must be monotonically increasing'
+          end if
+          call radiation_abort()
+        end if
+      end do
+
+      ! What is the maximum index, indicating the number of
+      ! albedo/emissivity values to expect?
+      nvalue = maxval(i_intervals(1:ninterval))
+      
+      if (do_nearest) then
+        ! Simpler nearest-neighbour mapping from band to
+        ! albedo/emissivity interval
+        if (allocated(i_mapping)) then
+          deallocate(i_mapping)
+        end if
+        allocate(i_mapping(nband))
+
+        ! Loop over bands
+        do jband = 1,nband
+          ! Compute mid-point of band in wavenumber space (cm-1)
+          wavenumber_mid = 0.5_jprb * (wavenumber1(jband) &
+               &                     + wavenumber2(jband))
+          iinterval = 1
+          ! Convert wavelength (m) into wavenumber (cm-1) at the lower
+          ! bound of the albedo interval
+          wavenumber_bound = 0.01_jprb / wavelength_bound(iinterval)
+          ! Find the albedo interval that has the largest overlap with
+          ! the band; this approach assumes that the albedo intervals
+          ! are larger than the spectral bands
+          do while (wavenumber_bound >= wavenumber_mid &
+               &    .and. iinterval < ninterval)
+            iinterval = iinterval + 1
+            if (iinterval < ninterval) then
+              wavenumber_bound = 0.01_jprb / wavelength_bound(iinterval)
+            else
+              ! For the last interval there is no lower bound
+              wavenumber_bound = 0.0_jprb
+            end if
+          end do
+          ! Save the index of the band corresponding to the albedo
+          ! interval and move onto the next band
+          i_mapping(jband) = i_intervals(iinterval)
+        end do
+      else
+        ! More accurate weighting
+        if (allocated(weights)) then
+          deallocate(weights)
+        end if
+        allocate(weights(nvalue,nband))
+        weights(:,:) = 0.0_jprb
+        
+        ! Loop over bands
+        do jband = 1,nband
+          recip_dwavenumber = 1.0_jprb / (wavenumber2(jband) &
+               &                        - wavenumber1(jband))
+          ! Find the first overlapping albedo band
+          iinterval = 1
+          ! Convert wavelength (m) into wavenumber (cm-1) at the lower
+          ! bound (in wavenumber space) of the albedo/emissivty interval
+          wavenumber1_albedo = 0.01_jprb / wavelength_bound(iinterval)
+          do while (wavenumber1_albedo >= wavenumber2(jband) &
+               &    .and. iinterval < ninterval)
+            iinterval = iinterval + 1
+            wavenumber1_albedo = 0.01_jprb / wavelength_bound(iinterval)
+          end do
+          
+          wavenumber2_albedo = wavenumber2(jband)
+          
+          ! Add all overlapping bands
+          do while (wavenumber2_albedo > wavenumber1(jband) &
+               &  .and. iinterval <= ninterval)
+            weights(i_intervals(iinterval),jband) &
+                 &  = weights(i_intervals(iinterval),jband) &
+                 &  + recip_dwavenumber &
+                 &  * (min(wavenumber2_albedo,wavenumber2(jband)) &
+                 &   - max(wavenumber1_albedo,wavenumber1(jband)))
+            wavenumber2_albedo = wavenumber1_albedo
+            iinterval = iinterval + 1
+            if (iinterval < ninterval) then
+              wavenumber1_albedo = 0.01_jprb / wavelength_bound(iinterval)
+            else
+              wavenumber1_albedo = 0.0_jprb
+            end if
+          end do
+        end do
+      end if
+    end if
+
+    ! Define how many bands to use for reporting surface downwelling
+    ! fluxes for canopy radiation scheme
+    if (is_sw) then
+      if (this%use_canopy_full_spectrum_sw) then
+        this%n_canopy_bands_sw = this%n_g_sw
+      else 
+        this%n_canopy_bands_sw = nvalue
+      end if
+    else
+      if (this%use_canopy_full_spectrum_lw) then
+        this%n_canopy_bands_lw = this%n_g_lw
+      else 
+        this%n_canopy_bands_lw = nvalue
+      end if
+    end if
+
+    if (this%iverbosesetup >= 2) then
+      if (.not. do_nearest) then
+        if (is_sw) then
+          write(nulout, '(a,i0,a,i0,a)') 'Weighting of ', nvalue, ' albedo values in ', &
+             &  nband, ' shortwave bands (wavenumber ranges in cm-1):'
+        else
+          write(nulout, '(a,i0,a,i0,a)') 'Weighting of ', nvalue, ' emissivity values in ', &
+             &  nband, ' longwave bands (wavenumber ranges in cm-1):'
+        end if
+        do jband = 1,nband
+          write(nulout,'(i6,a,i6,a)',advance='no') nint(wavenumber1(jband)), ' to', &
+               &                        nint(wavenumber2(jband)), ':'
+          do iinterval = 1,nvalue
+            write(nulout,'(f5.2)',advance='no') weights(iinterval,jband)
+          end do
+          write(nulout, '()')
+        end do
+      else if (ninterval <= 1) then
+        if (is_sw) then
+          write(nulout, '(a)') 'All shortwave bands will use the same albedo'
+        else
+          write(nulout, '(a)') 'All longwave bands will use the same emissivty'
+        end if
+      else
+        if (is_sw) then
+          write(nulout, '(a,i0,a)',advance='no') 'Mapping from ', nband, &
+               &  ' shortwave bands to albedo intervals:'
+        else
+          write(nulout, '(a,i0,a)',advance='no') 'Mapping from ', nband, &
+               &  ' longwave bands to emissivity intervals:'
+        end if
+        do jband = 1,nband
+          write(nulout,'(a,i0)',advance='no') ' ', i_mapping(jband)
+        end do
+        write(nulout, '()')
+      end if
+    end if
+
+  end subroutine consolidate_intervals
+
+
+  !---------------------------------------------------------------------
+  ! Return the 0-based index for str in enum_str, or abort if it is
+  ! not found
+  subroutine get_enum_code(str, enum_str, var_name, icode)
+
+    use radiation_io, only : nulerr, radiation_abort
+
+    character(len=*), intent(in)  :: str
+    character(len=*), intent(in)  :: enum_str(0:)
+    character(len=*), intent(in)  :: var_name
+    integer,          intent(out) :: icode
+
+    integer :: jc
+    logical :: is_not_found
+
+    ! If string is empty then we don't modify icode but assume it has
+    ! a sensible default value
+    if (len_trim(str) > 1) then
+      is_not_found = .true.
+
+      do jc = 0,size(enum_str)-1
+        if (trim(str) == trim(enum_str(jc))) then
+          icode = jc
+          is_not_found = .false.
+          exit
+        end if
+      end do
+      if (is_not_found) then
+        write(nulerr,'(a,a,a,a,a)',advance='no') '*** Error: ', trim(var_name), &
+             &  ' must be one of: "', enum_str(0), '"'
+        do jc = 1,size(enum_str)-1
+          write(nulerr,'(a,a,a)',advance='no') ', "', trim(enum_str(jc)), '"'
+        end do
+        write(nulerr,'(a)') ''
+        call radiation_abort('Radiation configuration error')
+      end if
+    end if
+
+  end subroutine get_enum_code
+
+
+  !---------------------------------------------------------------------
+  ! Print one line of information: logical
+  subroutine print_logical(message_str, name, val)
+    use radiation_io, only : nulout
+    character(len=*),   intent(in) :: message_str
+    character(len=*),   intent(in) :: name
+    logical,            intent(in) :: val
+    character(4)                   :: on_or_off
+    character(NPrintStringLen)     :: str
+    if (val) then
+      on_or_off = ' ON '
+    else
+      on_or_off = ' OFF'
+    end if
+    write(str, '(a,a4)') message_str, on_or_off
+    write(nulout,'(a,a,a,a,l1,a)') str, ' (', name, '=', val,')'
+  end subroutine print_logical
+
+
+  !---------------------------------------------------------------------
+  ! Print one line of information: integer
+  subroutine print_integer(message_str, name, val)
+    use radiation_io, only : nulout
+    character(len=*),   intent(in) :: message_str
+    character(len=*),   intent(in) :: name
+    integer,            intent(in) :: val
+    character(NPrintStringLen)     :: str
+    write(str, '(a,a,i0)') message_str, ' = ', val
+    write(nulout,'(a,a,a,a)') str, ' (', name, ')'
+  end subroutine print_integer
+
+
+  !---------------------------------------------------------------------
+  ! Print one line of information: real
+  subroutine print_real(message_str, name, val)
+    use parkind1,     only : jprb
+    use radiation_io, only : nulout
+    character(len=*),   intent(in) :: message_str
+    character(len=*),   intent(in) :: name
+    real(jprb),         intent(in) :: val
+    character(NPrintStringLen)     :: str
+    write(str, '(a,a,g8.3)') message_str, ' = ', val
+    write(nulout,'(a,a,a,a)') str, ' (', name, ')'
+  end subroutine print_real
+
+
+  !---------------------------------------------------------------------
+  ! Print one line of information: enum
+  subroutine print_enum(message_str, enum_str, name, val)
+    use radiation_io, only : nulout
+    character(len=*),   intent(in) :: message_str
+    character(len=*),   intent(in) :: enum_str(0:)
+    character(len=*),   intent(in) :: name
+    integer,            intent(in) :: val
+    character(NPrintStringLen)     :: str
+    write(str, '(a,a,a,a)') message_str, ' "', trim(enum_str(val)), '"'
+    write(nulout,'(a,a,a,a,i0,a)') str, ' (', name, '=', val,')'
+  end subroutine print_enum
+
+
+  !---------------------------------------------------------------------
+  ! Return .true. if 1D allocatable array "var" is out of physical
+  ! range specified by boundmin and boundmax, and issue a warning.
+  ! "do_fix" determines whether erroneous values are fixed to lie
+  ! within the physical range. To check only a subset of the array,
+  ! specify i1 and i2 for the range.
+  function out_of_bounds_1d(var, var_name, boundmin, boundmax, do_fix, i1, i2) result (is_bad)
+
+    use radiation_io,     only : nulout
+
+    real(jprb), allocatable, intent(inout) :: var(:)
+    character(len=*),        intent(in) :: var_name
+    real(jprb),              intent(in) :: boundmin, boundmax
+    logical,                 intent(in) :: do_fix
+    integer,       optional, intent(in) :: i1, i2
+
+    logical                       :: is_bad
+
+    real(jprb) :: varmin, varmax
+
+    is_bad = .false.
+
+    if (allocated(var)) then
+
+      if (present(i1) .and. present(i2)) then
+        varmin = minval(var(i1:i2))
+        varmax = maxval(var(i1:i2))
+      else
+        varmin = minval(var)
+        varmax = maxval(var)
+      end if
+
+      if (varmin < boundmin .or. varmax > boundmax) then
+        write(nulout,'(a,a,a,g12.4,a,g12.4,a,g12.4,a,g12.4)',advance='no') &
+             &  '*** Warning: ', var_name, ' range', varmin, ' to', varmax, &
+             &  ' is out of physical range', boundmin, 'to', boundmax
+        is_bad = .true.
+        if (do_fix) then
+          if (present(i1) .and. present(i2)) then
+            var(i1:i2) = max(boundmin, min(boundmax, var(i1:i2)))
+          else
+            var = max(boundmin, min(boundmax, var))
+          end if
+          write(nulout,'(a)') ': corrected'
+        else
+          write(nulout,'(1x)')
+        end if
+      end if
+
+    end if
+    
+  end function out_of_bounds_1d
+
+
+  !---------------------------------------------------------------------
+  ! Return .true. if 2D allocatable array "var" is out of physical
+  ! range specified by boundmin and boundmax, and issue a warning.  To
+  ! check only a subset of the array, specify i1 and i2 for the range
+  ! of the first dimension and j1 and j2 for the range of the second.
+  function out_of_bounds_2d(var, var_name, boundmin, boundmax, do_fix, &
+       &                    i1, i2, j1, j2) result (is_bad)
+
+    use radiation_io,     only : nulout
+
+    real(jprb), allocatable, intent(inout) :: var(:,:)
+    character(len=*),        intent(in) :: var_name
+    real(jprb),              intent(in) :: boundmin, boundmax
+    logical,                 intent(in) :: do_fix
+    integer,       optional, intent(in) :: i1, i2, j1, j2
+
+    ! Local copies of indices
+    integer :: ii1, ii2, jj1, jj2
+
+    logical                       :: is_bad
+
+    real(jprb) :: varmin, varmax
+
+    is_bad = .false.
+
+    if (allocated(var)) then
+
+      if (present(i1) .and. present(i2)) then
+        ii1 = i1
+        ii2 = i2
+      else
+        ii1 = lbound(var,1)
+        ii2 = ubound(var,1)
+      end if
+      if (present(j1) .and. present(j2)) then
+        jj1 = j1
+        jj2 = j2
+      else
+        jj1 = lbound(var,2)
+        jj2 = ubound(var,2)
+      end if
+      varmin = minval(var(ii1:ii2,jj1:jj2))
+      varmax = maxval(var(ii1:ii2,jj1:jj2))
+
+      if (varmin < boundmin .or. varmax > boundmax) then
+        write(nulout,'(a,a,a,g12.4,a,g12.4,a,g12.4,a,g12.4)',advance='no') &
+             &  '*** Warning: ', var_name, ' range', varmin, ' to', varmax,&
+             &  ' is out of physical range', boundmin, 'to', boundmax
+        is_bad = .true.
+        if (do_fix) then
+          var(ii1:ii2,jj1:jj2) = max(boundmin, min(boundmax, var(ii1:ii2,jj1:jj2)))
+          write(nulout,'(a)') ': corrected'
+        else
+          write(nulout,'(1x)')
+        end if
+      end if
+
+    end if
+    
+  end function out_of_bounds_2d
+
+
+  !---------------------------------------------------------------------
+  ! Return .true. if 3D allocatable array "var" is out of physical
+  ! range specified by boundmin and boundmax, and issue a warning.  To
+  ! check only a subset of the array, specify i1 and i2 for the range
+  ! of the first dimension, j1 and j2 for the second and k1 and k2 for
+  ! the third.
+  function out_of_bounds_3d(var, var_name, boundmin, boundmax, do_fix, &
+       &                    i1, i2, j1, j2, k1, k2) result (is_bad)
+
+    use radiation_io,     only : nulout
+
+    real(jprb), allocatable, intent(inout) :: var(:,:,:)
+    character(len=*),        intent(in) :: var_name
+    real(jprb),              intent(in) :: boundmin, boundmax
+    logical,                 intent(in) :: do_fix
+    integer,       optional, intent(in) :: i1, i2, j1, j2, k1, k2
+
+    ! Local copies of indices
+    integer :: ii1, ii2, jj1, jj2, kk1, kk2
+
+    logical                       :: is_bad
+
+    real(jprb) :: varmin, varmax
+
+    is_bad = .false.
+
+    if (allocated(var)) then
+
+      if (present(i1) .and. present(i2)) then
+        ii1 = i1
+        ii2 = i2
+      else
+        ii1 = lbound(var,1)
+        ii2 = ubound(var,1)
+      end if
+      if (present(j1) .and. present(j2)) then
+        jj1 = j1
+        jj2 = j2
+      else
+        jj1 = lbound(var,2)
+        jj2 = ubound(var,2)
+      end if
+      if (present(k1) .and. present(k2)) then
+        kk1 = k1
+        kk2 = k2
+      else
+        kk1 = lbound(var,3)
+        kk2 = ubound(var,3)
+      end if
+      varmin = minval(var(ii1:ii2,jj1:jj2,kk1:kk2))
+      varmax = maxval(var(ii1:ii2,jj1:jj2,kk1:kk2))
+
+      if (varmin < boundmin .or. varmax > boundmax) then
+        write(nulout,'(a,a,a,g12.4,a,g12.4,a,g12.4,a,g12.4)',advance='no') &
+             &  '*** Warning: ', var_name, ' range', varmin, ' to', varmax,&
+             &  ' is out of physical range', boundmin, 'to', boundmax
+        is_bad = .true.
+        if (do_fix) then
+          var(ii1:ii2,jj1:jj2,kk1:kk2) = max(boundmin, min(boundmax, &
+               &                             var(ii1:ii2,jj1:jj2,kk1:kk2)))
+          write(nulout,'(a)') ': corrected'
+        else
+          write(nulout,'(1x)')
+        end if
+      end if
+
+    end if
+    
+  end function out_of_bounds_3d
+
+    
+end module radiation_config
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_delta_eddington.h b/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_delta_eddington.h
new file mode 100644
index 0000000000000000000000000000000000000000..04f43bafde36958c84e50a5662009d817975b3a2
--- /dev/null
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_delta_eddington.h
@@ -0,0 +1,93 @@
+! radiation_delta_eddington.h - Delta-Eddington scaling
+!
+! (C) Copyright 2015- ECMWF.
+!
+! This software is licensed under the terms of the Apache Licence Version 2.0
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+!
+! In applying this licence, ECMWF does not waive the privileges and immunities
+! granted to it by virtue of its status as an intergovernmental organisation
+! nor does it submit to any jurisdiction.
+!
+! Author:  Robin Hogan
+! Email:   r.j.hogan@ecmwf.int
+!
+! This file is intended to be included inside a module to ensure that
+! these simple functions may be inlined
+
+!---------------------------------------------------------------------
+! Perform in-place delta-Eddington scaling of the phase function
+elemental subroutine delta_eddington(od, ssa, g)
+
+  use parkind1, only : jprb
+  
+  ! Total optical depth, single scattering albedo and asymmetry
+  ! factor
+  real(jprb), intent(inout) :: od, ssa, g
+  
+  ! Fraction of the phase function deemed to be in the forward lobe
+  ! and therefore treated as if it is not scattered at all
+  real(jprb) :: f
+  
+  f   = g*g
+  od  = od * (1.0_jprb - ssa*f)
+  ssa = ssa * (1.0_jprb - f) / (1.0_jprb - ssa*f)
+  g   = g / (1.0_jprb + g)
+  
+end subroutine delta_eddington
+
+
+!---------------------------------------------------------------------
+! Perform in-place delta-Eddington scaling of the phase function, but
+! using extensive variables (i.e. the scattering optical depth,
+! scat_od, rather than the single-scattering albedo, and the
+! scattering-optical-depth-multiplied-by-asymmetry-factor, scat_od_g,
+! rather than the asymmetry factor.
+elemental subroutine delta_eddington_extensive(od, scat_od, scat_od_g)
+
+  use parkind1, only : jprb
+
+  ! Total optical depth, scattering optical depth and asymmetry factor
+  ! multiplied by the scattering optical depth
+  real(jprb), intent(inout) :: od, scat_od, scat_od_g
+
+  ! Fraction of the phase function deemed to be in the forward lobe
+  ! and therefore treated as if it is not scattered at all
+  real(jprb) :: f, g
+
+  if (scat_od > 0.0_jprb) then
+    g = scat_od_g / scat_od
+  else
+    g = 0.0
+  end if
+
+  f         = g*g
+  od        = od - scat_od * f
+  scat_od   = scat_od * (1.0_jprb - f)
+  scat_od_g = scat_od * g / (1.0_jprb + g)
+  
+end subroutine delta_eddington_extensive
+
+
+!---------------------------------------------------------------------
+! Perform in-place delta-Eddington scaling of the phase function,
+! using the scattering optical depth rather than the single scattering
+! albedo
+elemental subroutine delta_eddington_scat_od(od, scat_od, g)
+
+  use parkind1, only : jprb
+  
+  ! Total optical depth, scattering optical depth and asymmetry factor
+  real(jprb), intent(inout) :: od, scat_od, g
+
+  ! Fraction of the phase function deemed to be in the forward lobe
+  ! and therefore treated as if it is not scattered at all
+  real(jprb) :: f
+
+  f       = g*g
+  od      = od - scat_od * f
+  scat_od = scat_od * (1.0_jprb - f)
+  g       = g / (1.0_jprb + g)
+
+end subroutine delta_eddington_scat_od
+
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_ice_optics_shapes.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_ice_optics_shapes.F90
new file mode 100644
index 0000000000000000000000000000000000000000..011f2666e762e97b6c081ef98f0b1710620277db
--- /dev/null
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/radiation/radiation_ice_optics_shapes.F90
@@ -0,0 +1,142 @@
+! radiation_ice_optics_shapes.F90 - 
+!
+! (C) Copyright 2017- ECMWF.
+!
+! This software is licensed under the terms of the Apache Licence Version 2.0
+! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
+!
+! In applying this licence, ECMWF does not waive the privileges and immunities
+! granted to it by virtue of its status as an intergovernmental organisation
+! nor does it submit to any jurisdiction.
+!
+! Authors: Marie Taufour
+! Email:   marie.taufour@aero.obs-mip.fr
+!
+! The reference for this ice optics parameterization is ....
+
+module radiation_ice_optics_shapes
+
+  implicit none
+  public
+
+  ! The number of ice coefficients depends on the parameterization
+  integer, parameter :: NIceOpticsCoeffsShapesSW  = 69
+  integer, parameter :: NIceOpticsCoeffsShapesLW  = 69
+
+  integer, parameter :: NSingleCoeffs = 23
+
+contains
+
+  !---------------------------------------------------------------------
+  ! Compute shortwave ice-particle scattering properties using Yi et
+  ! al. (2013) parameterization
+  subroutine calc_ice_optics_shapes_sw(nb, coeff, ice_wp, &
+       &  re, od, scat_od, g)
+
+    use parkind1, only : jprb, jpim
+    !use yomhook,  only : lhook, dr_hook
+
+    ! Number of bands
+    integer, intent(in)  :: nb
+    ! Coefficients read from a data file
+    real(jprb), intent(in) :: coeff(:,:)
+    ! Ice water path (kg m-2)
+    real(jprb), intent(in) :: ice_wp
+    ! Effective radius (m)
+    real(jprb), intent(in) :: re
+    ! Total optical depth, scattering optical depth and asymmetry factor
+    real(jprb), intent(out) :: od(nb), scat_od(nb), g(nb)
+
+    ! Yi's effective diameter (microns)
+    real(jprb) :: de_um
+    ! Ice water path in g m-2
+    real (jprb) :: iwp_gm_2
+    ! LUT temp variables
+    real(jprb) :: wts_1, wts_2
+    integer(jpim) :: lu_idx
+    real(kind=jprb), parameter    :: lu_scale  = 0.2_jprb
+    real(kind=jprb), parameter    :: lu_offset = 1.0_jprb
+    !real(jprb)  :: hook_handle
+
+    !if (lhook) call dr_hook('radiation_ice_optics:calc_ice_optics_yi_sw',0,hook_handle)
+
+    ! Convert to effective diameter using the relationship in the IFS
+    !de_um     = re * (1.0e6_jprb / 0.64952_jprb)
+    de_um     = re * 2.0e6_jprb
+
+    ! limit de_um to validity of LUT
+    de_um = max(de_um,10.0_jprb)
+    de_um = min(de_um,119.99_jprb) !avoid greater than or equal to 120 um
+
+    iwp_gm_2  = ice_wp * 1000.0_jprb
+
+    lu_idx = floor(de_um * lu_scale - lu_offset)
+    wts_2  = (de_um * lu_scale - lu_offset) - lu_idx
+    wts_1  = 1.0_jprb - wts_2
+    od     = 0.001_jprb * iwp_gm_2 * & 
+             & ( wts_1 * coeff(1:nb,lu_idx) + wts_2 * coeff(1:nb,lu_idx+1) )
+    scat_od = od * & 
+             & ( wts_1 * coeff(1:nb,lu_idx+NSingleCoeffs) + wts_2 * coeff(1:nb,lu_idx+NSingleCoeffs+1) )
+    g = wts_1 * coeff(1:nb,lu_idx+2*NSingleCoeffs) + wts_2 * coeff(1:nb,lu_idx+2*NSingleCoeffs+1)
+
+    !if (lhook) call dr_hook('radiation_ice_optics:calc_ice_optics_yi_sw',1,hook_handle)
+
+  end subroutine calc_ice_optics_shapes_sw
+
+
+  !---------------------------------------------------------------------
+  ! Compute longwave ice-particle scattering properties using .....
+  subroutine calc_ice_optics_shapes_lw(nb, coeff, ice_wp, &
+       &  re, od, scat_od, g)
+
+    use parkind1, only : jprb, jpim
+    !use yomhook,  only : lhook, dr_hook
+
+    ! Number of bands
+    integer, intent(in)  :: nb
+    ! Coefficients read from a data file
+    real(jprb), intent(in) :: coeff(:,:)
+    ! Ice water path (kg m-2)
+    real(jprb), intent(in) :: ice_wp
+    ! Effective radius (m)
+    real(jprb), intent(in) :: re
+    ! Total optical depth, scattering optical depth and asymmetry factor
+    real(jprb), intent(out) :: od(nb), scat_od(nb), g(nb)
+
+    ! Yi's effective diameter (microns)
+    real(jprb) :: de_um
+    ! Ice water path in g m-2
+    real (jprb) :: iwp_gm_2
+    ! LUT temp variables
+    real(jprb) :: wts_1, wts_2
+    integer(jpim) :: lu_idx
+    real(kind=jprb), parameter    :: lu_scale  = 0.2_jprb
+    real(kind=jprb), parameter    :: lu_offset = 1.0_jprb
+    !real(jprb)  :: hook_handle
+
+    !if (lhook) call dr_hook('radiation_ice_optics:calc_ice_optics_yi_sw',0,hook_handle)
+
+    ! Convert to effective diameter using the relationship in the IFS
+    !de_um     = re * (1.0e6_jprb / 0.64952_jprb)
+    de_um     = re * 2.0e6_jprb
+
+    ! limit de_um to validity of LUT
+    de_um = max(de_um,10.0_jprb)
+    de_um = min(de_um,119.99_jprb) !avoid greater than or equal to 120 um
+
+    iwp_gm_2  = ice_wp * 1000.0_jprb
+
+    lu_idx = floor(de_um * lu_scale - lu_offset)
+    wts_2  = (de_um * lu_scale - lu_offset) - lu_idx
+    wts_1  = 1.0_jprb - wts_2
+    od     = 0.001_jprb * iwp_gm_2 * & 
+             & ( wts_1 * coeff(1:nb,lu_idx) + wts_2 * coeff(1:nb,lu_idx+1) )
+    scat_od = od * & 
+             & ( wts_1 * coeff(1:nb,lu_idx+NSingleCoeffs) + wts_2 * coeff(1:nb,lu_idx+NSingleCoeffs+1) )
+    g = wts_1 * coeff(1:nb,lu_idx+2*NSingleCoeffs) + wts_2 * coeff(1:nb,lu_idx+2*NSingleCoeffs+1)
+
+     !if (lhook) call dr_hook('radiation_ice_optics:calc_ice_optics_yi_lw',1,hook_handle)
+
+  end subroutine calc_ice_optics_shapes_lw
+
+end module radiation_ice_optics_shapes
diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
index af05775a2b95509532bbd908220dd6903b158828..a559613545d75c5813985ec8cbe715c7b435442e 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2024 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.
@@ -20,6 +20,7 @@
 !  P. Wautelet 07/12/2020: add support for partial write of fields (optional argument: koffset, not all subroutines, no LFI spport)
 !  P. Wautelet 14/01/2021: add IO_Field_write_byname_N4 and IO_Field_write_byfield_N4 subroutines
 !  P. Wautelet 07/04/2023: correct IO_Field_user_write examples
+!  P. Wautelet 08/01/2024: add zero-size check for monoprocess runs
 !-----------------------------------------------------------------
 
 #define MNH_SCALARS_IN_SPLITFILES 0
@@ -673,6 +674,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
        IF (GSMONOPROC) THEN ! sequential execution
+          IF ( SIZE(PFIELD) == 0 ) THEN
+            CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X1','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+            IF (PRESENT(KRESP)) KRESP=0
+            RETURN
+          END IF
+
           if ( Present( koffset ) ) then
             !if ( glfi ) call IO_Field_partial_write_lfi( tpfile, tpfield, pfield, koffset, iresp_lfi )
             if ( gnc4 ) call IO_Field_partial_write_nc4( tpfile, tpfield, pfield, koffset, iresp_nc4 )
@@ -821,6 +828,12 @@ end subroutine IO_Ndimlist_reduce
 
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(PFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X2','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
          !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -1102,6 +1115,12 @@ end subroutine IO_Ndimlist_reduce
 
     IF (IRESP==0) THEN
       IF (GSMONOPROC .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution
+        IF ( SIZE(PFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X3','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
           !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -1537,6 +1556,12 @@ end subroutine IO_Ndimlist_reduce
 
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(PFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X4','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+         END IF
+
         !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -1742,6 +1767,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(PFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X5','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
         !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -1910,6 +1941,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
        IF (GSMONOPROC) THEN ! sequential execution
+          IF ( SIZE(PFIELD) == 0 ) THEN
+            CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_X6','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+            IF (PRESENT(KRESP)) KRESP=0
+            RETURN
+          END IF
+
           IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,PFIELD,iresp_lfi)
           IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,PFIELD,iresp_nc4)
        ELSE
@@ -2110,6 +2147,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
        IF (GSMONOPROC) THEN ! sequential execution
+          IF ( SIZE(KFIELD) == 0 ) THEN
+            CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_N1','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+            IF (PRESENT(KRESP)) KRESP=0
+            RETURN
+          END IF
+
           IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,KFIELD,iresp_lfi)
           IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,KFIELD,iresp_nc4)
        ELSE ! multiprocesses execution
@@ -2233,6 +2276,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(KFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_N2','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
         IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
@@ -2411,6 +2460,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(KFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_N3','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
         IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
@@ -2591,6 +2646,12 @@ end subroutine IO_Ndimlist_reduce
 
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
+        IF ( SIZE(KFIELD) == 0 ) THEN
+          CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_N4','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+          IF (PRESENT(KRESP)) KRESP=0
+          RETURN
+        END IF
+
         !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
           Allocate( tzfield, source = tpfield )
@@ -2876,6 +2937,12 @@ end subroutine IO_Ndimlist_reduce
     !
     IF (IRESP==0) THEN
        IF (GSMONOPROC) THEN ! sequential execution
+          IF ( SIZE(OFIELD) == 0 ) THEN
+            CALL PRINT_MSG(NVERB_INFO,'IO','IO_Field_write_byfield_L1','ignoring variable with a zero size ('//TRIM(YRECFM)//')')
+            IF (PRESENT(KRESP)) KRESP=0
+            RETURN
+          END IF
+
           IF (GLFI) CALL IO_Field_write_lfi(TPFILE,TPFIELD,OFIELD,iresp_lfi)
           IF (GNC4) CALL IO_Field_write_nc4(TPFILE,TPFIELD,OFIELD,iresp_nc4)
        ELSE ! multiprocesses execution
diff --git a/src/MNH/call_rttov11.f90 b/src/MNH/call_rttov11.f90
deleted file mode 100644
index c949ca4ebf02ce76697e879545f78ad7a8cd8e18..0000000000000000000000000000000000000000
--- a/src/MNH/call_rttov11.f90
+++ /dev/null
@@ -1,619 +0,0 @@
-!MNH_LIC Copyright 2003-2021 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
-!MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-!    ########################
-     MODULE MODI_CALL_RTTOV11
-!    ########################
-INTERFACE
-!
-     SUBROUTINE CALL_RTTOV11(KDLON, KFLEV, PEMIS, PTSRAD,   &
-                PTHT, PRT, PPABST, PZZ, PMFCONV, PCLDFR, PULVLKB, PVLVLKB,  &
-                OUSERI, KRTTOVINFO, TPFILE    )
-!
-USE MODD_IO, ONLY: TFILEDATA
-!
-INTEGER, INTENT(IN)   :: KDLON !number of columns where the
-                               !radiation calculations are performed
-INTEGER, INTENT(IN)   :: KFLEV !number of vertical levels where the
-                               !radiation calculations are performed
-!
-!
-REAL, DIMENSION(:,:),     INTENT(IN) :: PEMIS  !Surface IR EMISsivity
-REAL, DIMENSION(:,:),     INTENT(IN) :: PTSRAD !RADiative Surface Temperature
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTHT   !THeta at t
-REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT    !moist variables at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PPABST !pressure at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ    !Model level heights
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2)
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! cloud fraction
-REAL, DIMENSION(:,:),     INTENT(IN) :: PULVLKB ! U-wind at KB level
-REAL, DIMENSION(:,:),     INTENT(IN) :: PVLVLKB ! V-wind at KB level
-!
-LOGICAL, INTENT(IN)                  :: OUSERI ! logical switch to compute both
-                                               ! liquid and solid condensate (OUSERI=.TRUE.)
-                                               ! or only liquid condensate (OUSERI=.FALSE.)
-!
-INTEGER, DIMENSION(:,:), INTENT(IN) :: KRTTOVINFO ! platform, satelit, sensor,
-                                                  ! and selection calculations
-TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
-!
-END SUBROUTINE CALL_RTTOV11
-END INTERFACE
-END MODULE MODI_CALL_RTTOV11
-!    #####################################################################
-SUBROUTINE CALL_RTTOV11(KDLON, KFLEV, PEMIS, PTSRAD,     &
-           PTHT, PRT, PPABST, PZZ, PMFCONV, PCLDFR, PULVLKB, PVLVLKB,  &
-           OUSERI, KRTTOVINFO, TPFILE    )
-!    #####################################################################
-!!
-!!****  *CALL_RTTOV* - 
-!!
-!!    PURPOSE
-!!    -------
-!!
-!!**  METHOD
-!!    ------
-!!
-!!    EXTERNAL
-!!    --------
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!    REFERENCE
-!!    ---------
-!!    See Chaboureau and Pinty, 2006
-!!    Validation of a cirrus parameterization with Meteosat Second Generation
-!!    observations. Geophys. Res. Let., doi:10.1029/2005GL024725
-!!
-!!    AUTHOR
-!!    ------
-!!      J.-P. Chaboureau       *L.A.*
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original    11/12/03
-!!      JP Chaboureau 27/03/2008 Vectorization
-!!      JP Chaboureau 02/11/2009 move GANGL deallocation outside the sensor loop
-!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
-!!      JP Chaboureau 30/05/2017 exclude the first layer when considering clouds
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!  P. Wautelet   10/04/2019: replace ABORT and STOP calls by Print_msg
-!  JP Chaboureau 26/10/2020: calculate all IR intruments; deallocate MW tabs
-!!----------------------------------------------------------------------------
-!!
-!!*       0.    DECLARATIONS
-!!              ------------
-!!
-USE MODD_CST
-USE MODD_PARAMETERS
-USE MODD_GRID_n
-USE MODD_IO, ONLY: TFILEDATA
-USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL
-USE MODD_LUNIT_n
-USE MODD_DEEP_CONVECTION_n
-USE MODD_REF_n
-USE MODD_RADIATIONS_n,  ONLY : XSEA
-!
-USE MODN_CONF
-!
-USE MODI_DETER_ANGLE
-USE MODI_PINTER
-!
-USE MODE_IO_FIELD_WRITE, only: IO_Field_write
-USE MODE_ll
-USE MODE_MSG
-USE MODE_POS
-!
-#ifdef MNH_RTTOV_11
-USE rttov_const, ONLY :  &
-       & sensor_id, sensor_id_ir, sensor_id_hi, sensor_id_mw, &
-       & q_mixratio_to_ppmv, tmin, tmax, qmin, qmax, pmin, pmax
-USE rttov_types
-USE parkind1, ONLY: jpim, jprb, jplm
-!
-IMPLICIT NONE
-!
-! -----------------------------------------------------------------------------
-#include "rttov_direct.interface"
-#include "rttov_read_coefs.interface"
-#include "rttov_alloc_transmission.interface"
-#include "rttov_dealloc_coefs.interface"
-#include "rttov_read_scattcoeffs.interface"
-#include "rttov_dealloc_scattcoeffs.interface"
-#include "rttov_scatt_setupindex.interface"
-#include "rttov_scatt.interface"
-#include "rttov_scatt_ad.interface"
-#include "rttov_alloc_rad.interface"
-#include "rttov_init_rad.interface"
-#include "rttov_alloc_prof.interface"
-#include "rttov_alloc_scatt_prof.interface"
-#endif
-!!!
-!!!*       0.1   DECLARATIONS OF DUMMY ARGUMENTS :
-!!!
-INTEGER, INTENT(IN)   :: KDLON   !number of columns where the
-! radiation calculations are performed
-INTEGER, INTENT(IN)   :: KFLEV   !number of vertical levels where the
-! radiation calculations are performed
-!!!
-REAL, DIMENSION(:,:),     INTENT(IN) :: PEMIS  !Surface IR EMISsivity
-REAL, DIMENSION(:,:),     INTENT(IN) :: PTSRAD !RADiative Surface Temperature
-                                !
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTHT   !THeta at t
-REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT    !moist variables at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PPABST !pressure at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ    !Model level heights
-!!!
-!!!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2)
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! cloud fraction
-REAL, DIMENSION(:,:),     INTENT(IN) :: PULVLKB ! U-wind at KB level
-REAL, DIMENSION(:,:),     INTENT(IN) :: PVLVLKB ! V-wind at KB level
-!!!
-LOGICAL, INTENT(IN)                  :: OUSERI ! logical switch to compute both
-! liquid and solid condensate (OUSERI=.TRUE.)
-! or only liquid condensate (OUSERI=.FALSE.)
-!!!
-INTEGER, DIMENSION(:,:), INTENT(IN) :: KRTTOVINFO ! platform, satelit, sensor,
-                                                  ! and selection calculations
-TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
-!
-#ifdef MNH_RTTOV_11
-!!!
-!!!*       0.2   DECLARATIONS OF LOCAL VARIABLES
-!!!
-!!!
-INTEGER, PARAMETER :: JPNSAT=3       ! No. of Satellite required
-                                !
-INTEGER :: JI,JJ,JK,JK1,JK2,JKRAD,JKF,JSAT,JC ! loop indexes
-                                !
-INTEGER :: IJSAT        ! number of columns/=NUNDEF which 
-                        ! have to be treated in the table KRTTOVINFO(:,:)
-INTEGER :: IIB,IIE        ! I index value of the first/last inner mass point
-INTEGER :: IJB,IJE        ! J index value of the first/last inner mass point
-INTEGER :: IKB,IKE        ! K index value of the first/last inner mass point
-INTEGER :: IIU          ! array size for the first  index
-INTEGER :: IJU          ! array size for the second index
-INTEGER :: IKU          ! array size for the third  index
-INTEGER :: IKR          ! real array size for the third  index
-INTEGER (Kind=jpim) :: iwp_levels ! equal to IKR (call to rttov_scatt)
-INTEGER :: IIJ          ! reformatted array index
-INTEGER :: IKSTAE       ! level number of the STAndard atmosphere array
-INTEGER :: IKUP         ! vertical level above which STAndard atmosphere data
-
-REAL, DIMENSION(:,:,:), ALLOCATABLE   ::  ZBT
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZANTMP, ZUTH
-REAL :: ZZH, zdeg_to_rad, zrad_to_deg, zbeta, zalpha
-
-! Other arrays for zenithal solar angle 
-! REAL, DIMENSION(:,:),   ALLOCATABLE :: ZCOSZEN, ZSINZEN, ZAZIMSOL
-
-! -----------------------------------------------------------------------------
-REAL, DIMENSION(1) :: ZANGL, ZLON, ZLAT   !Satellite zenith angle, longitude, latitude (deg)
-REAL :: ZANGS   !Solar zenith angle (deg)
-! -----------------------------------------------------------------------------
-! INDEXES AND TEMPORAL ARRAYS FOR VECTORIZATION
-INTEGER :: JIS, IBEG, IEND, IDIM, ICPT
-INTEGER, DIMENSION(:),   ALLOCATABLE :: IMSURFP
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZAVP, ZCVP
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZSAVP, ZSSVP, ZAPP, ZAP_HLP
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZZTMP, ZZTMPP
-REAL, DIMENSION(:),   ALLOCATABLE :: ZANGLP, ZREMISP
-LOGICAL, DIMENSION(:), ALLOCATABLE ::  GANGL
-! -----------------------------------------------------------------------------
-INTEGER :: INRAD = 2 ! INRAD=1 RADIANCE; INRAD=2 BRIGHTNESS TEMPERATURE
-! -----------------------------------------------------------------------------
-! Realistic maximum values for hydrometeor content in kg/kg
-REAL :: ZRCMAX = 5.0E-03, ZRRMAX = 5.0E-03, ZRIMAX = 2.0E-03, ZRSMAX = 5.0E-03
-! -----------------------------------------------------------------------------
-INTEGER, DIMENSION(:), ALLOCATABLE :: IMSURF   !Surface type index
-                                
-INTEGER :: IKFBOT, IKFTOP, INDEX, ISUM, JLEV, JCH, IWATER, ICAN
-REAL, DIMENSION(:), ALLOCATABLE :: ZTEXTR, ZQVEXTR !Array used in interpolation
-REAL, DIMENSION(:), ALLOCATABLE :: ZQVSAT, ZVINT !Array used in interpolation
-REAL, DIMENSION(:), ALLOCATABLE :: ZPSUM, ZTSUM, ZQVSUM, ZO3SUM !Array used in interpolation
-REAL :: zconst, ZPS, ZTGRAD, ZQGRAD, ZOGRAD !variables used in interpolation
-REAL, DIMENSION(:), ALLOCATABLE :: ZPIN, ZFIN, ZOUT
-!  at the open of the file LFI routines 
-CHARACTER(LEN=8)  :: YINST  
-CHARACTER(LEN=4)  :: YBEG, YEND
-CHARACTER(LEN=2)  :: YCHAN, YTWO   
-CHARACTER(LEN=1)  :: YONE   
-                               
-INTEGER, PARAMETER :: JPPLAT=16
-
-CHARACTER(LEN=3), DIMENSION(JPPLAT) :: YPLAT= (/ &
-     'N  ','D  ','MET','GO ','GMS','FY2','TRM','ERS', &
-     'EOS','MTP','ENV','MSG','FY1','ADS','MTS','CRL' /)
-CHARACTER(LEN=2), DIMENSION(2) :: YLBL_MVIRI = (/ 'WV', 'IR'/)
-CHARACTER(LEN=3), DIMENSION(7) :: YLBL_SSMI = (/ &
-     '19V','19H','22V','37V','37H','85V','85H'/)
-CHARACTER(LEN=3), DIMENSION(9) :: YLBL_TMI = (/ &
-     '10V','10H','19V','19H','22V','37V','37H','85V','85H'/)
-CHARACTER(LEN=3), DIMENSION(8) :: YLBL_SEVIRI = (/ &
-     '039', '062','073','087','097','108','120','134'/)
-CHARACTER(LEN=3), DIMENSION(4) :: YLBL_GOESI = (/ &
-     '039', '067','107','120'/)
-
-! -----------------------------------------------------------------------------
-LOGICAL (kind=jplm)       , ALLOCATABLE :: calcemis   (:)
-INTEGER (kind=jpim)       , ALLOCATABLE :: frequencies (:)
-TYPE (rttov_chanprof)     , ALLOCATABLE :: chanprof    (:) ! Channel and profile indices
-TYPE (profile_type)       , ALLOCATABLE :: profiles    (:), profiles_k    (:)
-TYPE (profile_cloud_type) , ALLOCATABLE :: cld_profiles(:), cld_profiles_k(:)
-TYPE(rttov_emissivity),  ALLOCATABLE :: emissivity(:)  ! Input/output surface emissivity
-LOGICAL(KIND=jplm),      ALLOCATABLE :: calcrefl(:)    ! Flag to indicate calculation of BRDF within RTTOV
-TYPE(rttov_reflectance), ALLOCATABLE :: reflectance(:) ! Input/output surface BRDF
-  TYPE(transmission_type)              :: transmission   ! Output transmittances
-  INTEGER(KIND=jpim) :: asw
-
-integer (kind=jpim)        :: errorstatus
-type (radiance_type)       :: radiance, radiance_k  
-type (rttov_options)       :: opts     ! Defaults to everything optional switched off
-type (rttov_options_scatt) :: opts_scatt
-type (rttov_coefs     )    :: coef_rttov
-type (rttov_scatt_coef)    :: coef_scatt
-
-integer (kind=jpim) :: instrument (3)
-integer (kind=jpim) :: ilev, iprof, ichan, nprof, nchan, nlev, nchannels
-real    (kind=jprb) :: zenangle
-integer (kind=jpim), parameter :: fin = 10
-character (len=256) :: outstring
-! -----------------------------------------------------------------------------
-REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZTEMP
-TYPE(TFIELDMETADATA) :: TZFIELD
-!-------------------------------------------------------------------------------
-!
-!*       0.     ARRAYS BOUNDS INITIALIZATION
-!
-IIU=SIZE(PTHT,1)
-IJU=SIZE(PTHT,2)
-IKU=SIZE(PTHT,3)
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-IKB=1+JPVEXT
-IKE=IKU-JPVEXT
-
-errorstatus     = 0
-nlev=IKE-IKB+1
-nprof=1
-ZTEMP = PTHT * ( PPABST/XP00 ) ** (XRD/XCPD)                   
-DO JSAT=1,SIZE(KRTTOVINFO,2)
-  IF (KRTTOVINFO(1,JSAT) /= NUNDEF) THEN
-    IJSAT = JSAT
-  END IF
-END DO
-
-! -----------------------------------------------------------------------------
-!              *** LOOP OVER SENSORS ***
-! -----------------------------------------------------------------------------
-DO JSAT=1,IJSAT ! loop over sensors
- 
-  instrument(1)=KRTTOVINFO(1,JSAT)
-  instrument(2)=KRTTOVINFO(2,JSAT)
-  instrument(3)=KRTTOVINFO(3,JSAT)
-! PRINT *,' JSAT=',JSAT, instrument
-
-  IF( sensor_id( instrument(3) ) /= sensor_id_mw) THEN
-    opts % rt_ir % addsolar = .FALSE.         ! Do not include solar radiation
-    opts % interpolation % addinterp  = .TRUE.  ! Allow interpolation of input profile
-    opts % interpolation % interp_mode = 1       ! Set interpolation method
-    opts % rt_all % addrefrac          = .FALSE.  ! Do not include refraction in path calc
-    opts % rt_ir % addclouds          = .TRUE.  ! Include cloud effects
-    opts % rt_ir % addaerosl           = .FALSE. ! Don't include aerosol effects
-    opts % rt_ir % ozone_data          = .FALSE. ! Set the relevant flag to .TRUE.
-    opts % rt_ir % co2_data            = .FALSE. !   when supplying a profile of the
-    opts % rt_ir % n2o_data            = .FALSE. !   given trace gas (ensure the
-    opts % rt_ir % ch4_data            = .FALSE. !   coef file supports the gas)
-    opts % rt_ir % co_data             = .FALSE. !
-!   opts % rt_mw % clw_data            = .FALSE. !
-!   opts%rt_ir%user_cld_opt_param = .FALSE.
-  ELSE
-    opts % rt_ir % addclouds          = .FALSE.  ! Include cloud effects
-  END IF
-  opts % config % verbose            = .FALSE.  ! Enable printing of warnings
-  opts % config % do_checkinput      = .FALSE.
-
-
-! Read and initialise coefficients
-! -----------------------------------------------------------------------------
-  CALL rttov_read_coefs (errorstatus, coef_rttov, opts, instrument=instrument)
-  IF(errorstatus /= 0) THEN
-    WRITE(*,*) 'error rttov_readcoeffs :',errorstatus
-    CALL PRINT_MSG(NVERB_FATAL,'GEN','CALL_RTTOV11','error rttov_readcoeffs')
-  ENDIF
-!  CALL rttov_initcoeffs (errorstatus,coef_rttov)
-!  IF( errorstatus/= 0) THEN
-!    WRITE(*,*) 'error rttov_initcoeffs :',errorstatus
-!    CALL PRINT_MSG(NVERB_FATAL,'GEN','CALL_RTTOV11','error rttov_initcoeffs')
-!  ENDIF
-  
-! Read coef file for cloud/rain absorption/scattering
-  IF( coef_rttov%coef%id_sensor == sensor_id_mw) THEN
-    CALL rttov_read_scattcoeffs (errorstatus, coef_rttov%coef, coef_scatt)
-  END IF
-
-  nchan     = coef_rttov%coef%fmv_chn   ! number of channels on instrument
-  nchannels = nprof * nchan             ! total channels to simulate
-
-  ALLOCATE(ZBT(IIU,IJU,nchannels))
-  ZBT(:,:,:)=999.
-! PRINT *,'ncan=',nchan,' nchannels=',nchannels
-
-  ALLOCATE (chanprof     (nchannels))
-  ALLOCATE (frequencies  (nchannels))
-  ALLOCATE (emissivity   (nchannels))
-  ALLOCATE (calcemis    (nchannels))
-  ALLOCATE (profiles     (nprof))
-  ALLOCATE (cld_profiles (nprof))
-! Request RTTOV / FASTEM to calculate surface emissivity
-  calcemis  = .TRUE.
-  emissivity % emis_in = 0.0_JPRB
-
-  IF( coef_rttov%coef% id_sensor /= sensor_id_mw)  calcemis = .FALSE.
-
-!  IF( coef_rttov%coef% id_sensor /= sensor_id_mw) THEN
-!  ! Allocate arrays for surface reflectance
-!    ALLOCATE(calcrefl(nchannels))
-!    ALLOCATE(reflectance(nchannels))
-!  END IF
-
-! Setup indices
-  IF( coef_rttov%coef% id_sensor /= sensor_id_mw) THEN
-    DO JCH=1,nchannels
-      chanprof(JCH)%prof = 1
-      chanprof(JCH)%chan = JCH
-    END DO
-  ELSE
-    CALL rttov_scatt_setupindex ( &
-         & nprof,           & ! in  
-         & nchan,           & ! in 
-         & coef_rttov%coef, & ! in
-         & nchannels,       & ! in
-         & chanprof,        & ! out
-       & frequencies)       ! out
-  END IF
-
-  asw = 1_jpim ! Switch for allocation passed into RTTOV subroutines
-
-! Allocate profiles (input) and radiance (output) structures
-  CALL rttov_alloc_prof(errorstatus, nprof,     profiles, nlev, opts,asw,coef_rttov,init = .TRUE._jplm)
-  IF( coef_rttov%coef% id_sensor == sensor_id_mw) THEN
-! CALL rttov_alloc_opt_param( &
-!     & errorstatus,          &
-!     & cld_opt_param,        &
-!     & nchanprof,            &
-!     & nlevels-1_jpim,       &
-!     & nphangle,             &
-!     & asw)
-! ELSE
-    CALL rttov_alloc_scatt_prof(      nprof, cld_profiles, nlev, .FALSE._jplm, 1_jpim, init = .TRUE._jplm)
-  END IF
-
-  CALL rttov_alloc_rad       (errorstatus, nchannels, radiance, nlev-1_jpim,asw)
-!    WRITE(*,*) 'error rttov_alloc_rad :',errorstatus
-  ! Allocate transmittance structure
-  CALL rttov_alloc_transmission( &
-      & errorstatus,             &
-      & transmission,            &
-      & nlev-1_jpim,          &
-      & nchannels,               &
-      & asw,                     &
-      & init=.TRUE.)
-
-  profiles(1) % zenangle    = 0. ! zenith
-  cld_profiles(1) % use_totalice = .FALSE.
-  profiles(1) % skin % fastem(:) = &
-! RTTOV 8.5 example
-!        (/ 3.0_JPRB, 5.0_JPRB, 15.0_JPRB, 0.1_JPRB, 0.3_JPRB /)
-! Bare soil see Table 3 svr rttov7)
-       (/ 2.3_JPRB, 1.9_JPRB, 21.8_JPRB, 0.0_JPRB, 0.5_JPRB /)
-
-  profiles(1) % nlevels =  nlev
-  profiles(1) % nlayers =  nlev-1
-
- ! Ensure the options and coefficients are consistent
-  CALL rttov_user_options_checkinput(errorstatus, opts, coef_rttov)
-  IF (errorstatus /= 0) THEN
-    call Print_msg( NVERB_FATAL, 'GEN', 'CALL_RTTOV11', 'error in rttov options' )
-  ENDIF
-
-!!  opts%interpolation%reg_limit_extrap = .TRUE.
-!!  profiles(1)%gas_units = 1 ! kg/kg over moist air
-! PRINT *,'nlev=',nlev,' tmax=',tmax,' tmin=',tmin,' qmax=',qmax,' qmin=',qmin
-! PRINT *, coef_rttov%coef % nlevels
-  DO JI=IIB,IIE
-    DO JJ=IJB,IJE      
-      ZANGL = XUNDEF
-      ZLON  = XLON(JI,JJ)
-      ZLAT  = XLAT(JI,JJ)
-      IF (KRTTOVINFO(1,JSAT) == 2) THEN ! DMSP PLATFORM
-        ZANGL=53.1 ! see Saunders, 2002, RTTOV7 - science/validation rep, page 8
-      ELSEIF (KRTTOVINFO(1,JSAT) == 3) THEN ! METEOSAT PLATFORM
-        CALL DETER_ANGLE(5, 1, ZLAT, ZLON, ZANGL)
-        WHERE (ZANGL /= XUNDEF .AND. ZANGL /=0.) ZANGL=ACOS(1./ZANGL)*180./XPI
-      ELSEIF (KRTTOVINFO(1,JSAT) == 12) THEN ! MSG PLATFORM
-        CALL DETER_ANGLE(6, 1, ZLAT, ZLON, ZANGL)
-        WHERE (ZANGL /= XUNDEF .AND. ZANGL /=0.) ZANGL=ACOS(1./ZANGL)*180./XPI
-      ELSEIF (KRTTOVINFO(1,JSAT) == 4) THEN ! GOES-E PLATFORM
-        CALL DETER_ANGLE(1, 1, ZLAT, ZLON, ZANGL)
-        WHERE (ZANGL /= XUNDEF .AND. ZANGL /=0.) ZANGL=ACOS(1./ZANGL)*180./XPI
-      ELSEIF (KRTTOVINFO(1,JSAT) == 7) THEN ! TRMM PLATFORM
-        ZANGL=52.3
-      ELSE
-        ZANGL=0.
-      ENDIF
-! Coefficients computed from transmittances for 6 viewing angles in the range 
-! 0 to 63.6 deg (Saunders, 2002, RTTOV7 - science/validation rep., page 3)
-      profiles(1) % zenangle = MIN(ZANGL(1),65.)
-
-      DO JK=IKB,IKE ! nlevels
-        JKRAD = nlev-JK+2 !INVERSION OF VERTICAL LEVELS!
-!       PRINT *,'jk=',jk,' jkrad=',jkrad
-        profiles(1) % p(JKRAD) = PPABST(JI,JJ,JK)*0.01
-        profiles(1) % t(JKRAD) = MIN(tmax,MAX(tmin,ZTEMP(JI,JJ,JK)))
-!       PRINT *,'jk=',JK,' ZTEMP=',ZTEMP(JI,JJ,JK),' t=',profiles(1) % t(JKRAD)
-        profiles(1) % q(JKRAD) = MIN(qmax,MAX(qmin,PRT(JI,JJ,JK,1)*q_mixratio_to_ppmv))
-!       PRINT *,JK,profiles(1) % p(JKRAD) ,profiles(1) % t(JKRAD) ,profiles(1) % q(JKRAD) 
-      END DO
-      profiles(1) % elevation = 0.5*( PZZ(JI,JJ,1)+PZZ(JI,JJ,IKB) )
-      profiles(1) % skin % t = MIN(tmax,MAX(tmin,PTSRAD(JI,JJ)))
-      profiles(1) % s2m % t = MIN(tmax,MAX(tmin,ZTEMP(JI,JJ,IKB)))
-      profiles(1) % s2m % q = MIN(qmax,MAX(qmin,PRT(JI,JJ,1,IKB)*q_mixratio_to_ppmv))
-      profiles(1) % s2m % u = PULVLKB(JI,JJ) ! 2m wind speed u (m/s)
-      profiles(1) % s2m % v = PVLVLKB(JI,JJ) ! 2m wind speed v (m/s)
-      profiles(1) % s2m % p = PPABST(JI,JJ,IKB)*0.01
-      IF (NINT(XSEA(JI,JJ)).EQ.0.) THEN
-        profiles(1) % skin % surftype = 0 ! Surface Mask 0=land, 1=sea, 2=sea-ice
-      ELSE
-        profiles(1) % skin % surftype = 1
-        profiles(1) % skin % watertype = 1 ! Ocean water
-      END IF
-      profiles(1) % ctp = 500.0_JPRB     ! Not used but still required by RTTOV
-      IF( coef_rttov%coef% id_sensor /= sensor_id_mw) THEN
-        profiles(1)%ish = 2 ! Aggregates
-        profiles(1)%idg = 4 ! McFarquar et al (2003)
-        DO JK=IKB+1,IKE-1 ! nlayers
-          JKRAD = nlev-JK+1 !INVERSION OF VERTICAL LEVELS!
-          profiles(1) %cfrac(JKRAD) = PCLDFR(JI,JJ,JK)
-          profiles(1) %cloud(1,JKRAD) = PRT(JI,JJ,JK,2)*XRHODREF(JI,JJ,JK)*1.0E03
-          IF( OUSERI ) THEN
-            profiles(1) %cloud(6,JKRAD) = (PRT(JI,JJ,JK,4)+PRT(JI,JJ,JK,5)) \
-            *XRHODREF(JI,JJ,JK)*1.0E03
-          END IF
-        END DO
-      ELSE
-        DO JK=IKB,IKE
-          JKRAD = nlev-JK+2 !INVERSION OF VERTICAL LEVELS!
-          cld_profiles(1) %ph (JKRAD) = 0.5*( PPABST(JI,JJ,JK) + PPABST(JI,JJ,JK+1) )*0.01
-          cld_profiles(1) %cc(JKRAD) = PCLDFR(JI,JJ,JK)
-          cld_profiles(1) %clw(JKRAD) = MIN(ZRCMAX,PRT(JI,JJ,JK,2))
-          cld_profiles(1) %rain(JKRAD) = MIN(ZRRMAX,PRT(JI,JJ,JK,3))
-          IF( OUSERI ) THEN
-            cld_profiles(1) %ciw(JKRAD) = MIN(ZRIMAX,PRT(JI,JJ,JK,4))
-            cld_profiles(1) %sp(JKRAD) = MIN(ZRSMAX,PRT(JI,JJ,JK,5)+PRT(JI,JJ,JK,6))
-          END IF
-        END DO
-        cld_profiles (1) % ph (nlev+1) =   profiles (1) % s2m % p
-!       PRINT *,nlev+1,' cld_profiles(1) % ph (nlev+1) =',cld_profiles(1) % ph (nlev+1) 
-      END IF
-
-      DO JCH=1,nchannels
-        IF (.NOT.calcemis(JCH)) emissivity(JCH)%emis_in = PEMIS(JI,JJ)
-      END DO
-
-! write(*,*) 'Calling forward model' 
-
-! Forward model run
-      IF ( coef_rttov%coef% id_sensor /= sensor_id_mw) THEN
-        CALL rttov_direct(                &
-             & errorstatus,              &! out   error flag
-             & chanprof,                 &! in    channel and profile index structure
-             & opts,                     &! in    options structure
-             & profiles,                 &! in    profile array
-             & coef_rttov,               &! in    coefficients strucutre
-             & transmission,             &! inout compscauted transmittances
-             & radiance,                 &! inout computed radiances
-             & calcemis    = calcemis,   &! in    flag for internal emissivity calcs
-             & emissivity  = emissivity) !, &! inout input/output emissivities per channel
-!             & calcrefl    = calcrefl,   &! in    flag for internal BRDF calcs
-!             & reflectance = reflectance) ! inout input/output BRDFs per channel
-      ELSE
-        CALL rttov_scatt ( &
-             & errorstatus,         &! out
-             & opts_scatt,          &! in
-             & nlev,                &! in
-             & chanprof,            &! in
-             & frequencies,         &! in
-             & profiles,            &! in  
-             & cld_profiles,        &! in
-             & coef_rttov,          &! in
-             & coef_scatt,          &! in
-             & calcemis,           &! in
-             & emissivity,          &! in
-             & radiance)             ! out
-      END IF
-! STOP
-      DO JCH=1,nchannels
-        ZBT(JI,JJ,JCH)= radiance % bt(JCH)
-      END DO
-    END DO
-  END DO
-! -----------------------------------------------------------------------------
-! LATERAL BOUNDARY FILLING
-  IF (LWEST_ll() .AND.CLBCX(1)/='CYCL') ZOUT(IIB-1,:,:) = ZOUT(IIB,:,:)
-  IF (LEAST_ll() .AND.CLBCX(1)/='CYCL') ZOUT(IIE+1,:,:) = ZOUT(IIE,:,:)
-  IF (LSOUTH_ll().AND.CLBCY(1)/='CYCL') ZOUT(:,IJB-1,:) = ZOUT(:,IJB,:)
-  IF (LNORTH_ll().AND.CLBCY(1)/='CYCL') ZOUT(:,IJE+1,:) = ZOUT(:,IJE,:)
-! -----------------------------------------------------------------------------
-  YBEG='    '
-  IF (KRTTOVINFO(1,JSAT) <= 2 .OR. KRTTOVINFO(1,JSAT) == 4) THEN ! NOAA
-    WRITE(YTWO,'(I2.2)') KRTTOVINFO(2,JSAT)
-    YBEG=TRIM(YPLAT(KRTTOVINFO(1,JSAT)))//YTWO
-  ELSEIF (KRTTOVINFO(1,JSAT) <= JPPLAT) THEN
-    WRITE(YONE,'(I1.1)') KRTTOVINFO(2,JSAT)
-    YBEG=TRIM(YPLAT(KRTTOVINFO(1,JSAT)))//YONE
-  ELSE
-    YBEG='XXXX'
-  END IF
-  WRITE(YTWO,'(I2.2)') KRTTOVINFO(3,JSAT)
-
-  DO JCH=1,nchannels
-    YEND='    '
-    WRITE(YCHAN,'(I2.2)') JCH
-    IF (KRTTOVINFO(3,JSAT) == 0) THEN ! HIRS
-      YEND='H'//YCHAN
-    ELSEIF (KRTTOVINFO(3,JSAT) == 3) THEN ! AMSU-A
-      YEND='A'//YCHAN
-    ELSEIF (KRTTOVINFO(3,JSAT) == 4) THEN ! AMSU-B
-      YEND='B'//YCHAN
-    ELSEIF (KRTTOVINFO(3,JSAT) == 6) THEN ! SSMI
-      YEND=YLBL_SSMI(JCH)
-    ELSEIF (KRTTOVINFO(3,JSAT) == 9) THEN ! TMI
-      YEND=YLBL_TMI(JCH)
-    ELSEIF (KRTTOVINFO(3,JSAT) == 20) THEN ! MVIRI
-      YEND=YLBL_MVIRI(JCH)
-    ELSEIF (KRTTOVINFO(3,JSAT) == 21) THEN ! SEVIRI
-      YEND=YLBL_SEVIRI(JCH)
-    ELSEIF (KRTTOVINFO(3,JSAT) == 22) THEN ! GOES-I
-      YEND=YLBL_GOESI(JCH)
-    ELSE
-      YEND=YTWO//YCHAN
-    END IF
-
-    TZFIELD = TFIELDMETADATA(                          &
-      CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'BT',  &
-      CSTDNAME   = '',                                 &
-      CLONGNAME  = TRIM(YBEG)//'_'//TRIM(YEND)//'BT',  &
-      CUNITS     = 'K',                                &
-      CDIR       = 'XY',                               &
-      CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' BT', &
-      NGRID      = 1,                                  &
-      NTYPE      = TYPEREAL,                           &
-      NDIMS      = 2,                                  &
-      LTIMEDEP   = .TRUE.                              )
-!    PRINT *,'YRECFM='//TRIM(TZFIELD%CMNHNAME)
-    CALL IO_Field_write(TPFILE,TZFIELD,ZBT(:,:,JCH))
-  END DO
-  DEALLOCATE(chanprof,frequencies,emissivity,calcemis,profiles)
-  DEALLOCATE(ZBT)
-  IF( coef_rttov%coef% id_sensor == sensor_id_mw) THEN
-    CALL rttov_alloc_scatt_prof(nprof, cld_profiles, nlev, .FALSE., 0_jpim)
-    CALL rttov_dealloc_scattcoeffs(coef_scatt)
-  END IF
-  DEALLOCATE(cld_profiles)
-  CALL rttov_dealloc_coefs(errorstatus, coef_rttov)
-!  IF( coef_rttov%coef% id_sensor /= sensor_id_mw) THEN
-!    DEALLOCATE(calcrefl,reflectance)
-!  END IF
-END DO
-
-#else
-PRINT *, "RTTOV 11.1 LIBRARY NOT AVAILABLE = ###CALL_RTTOV11####"
-#endif
-!
-END SUBROUTINE CALL_RTTOV11
diff --git a/src/MNH/call_rttov13.f90 b/src/MNH/call_rttov13.f90
index 8c681d530d6fbfa583f3019be5c2bf9cce7462c6..4ae377c93c73b369cb9b7de10963bc10d1c65983 100644
--- a/src/MNH/call_rttov13.f90
+++ b/src/MNH/call_rttov13.f90
@@ -247,6 +247,7 @@ CHARACTER(LEN=2), DIMENSION(6) :: YLBL_SAPHIR = (/ &
 CHARACTER(LEN=4), DIMENSION(13) :: YLBL_ICI = (/ &
      '1837','1833','1832','243V','243H','3259','3253','3251','4487','4483','4481','664V','664H'/)
 CHARACTER(LEN=4), DIMENSION(2) :: YLBL_DPR = (/ '13', '35' /)
+CHARACTER(LEN=4), DIMENSION(1) :: YLBL_CPR = (/ '94' /)
 CHARACTER(LEN=4), DIMENSION(13) :: YLBL_GMI = (/ &
      '10V','10H','18V','18H','23V','36V','36H','89V','89H','166V','166H','1833','1837'/)
 
@@ -354,7 +355,7 @@ DO JSAT=1,IJSAT ! loop over sensors
     opts % rt_ir % addaerosl        = .FALSE. ! Do not include aerosol effects
     opts % rt_ir % addclouds        = .FALSE. ! Do not include cloud effects
     opts % rt_mw % clw_data         = .FALSE. ! Do not include cloud liquid water
-    IF (KRTTOVINFO(3,JSAT).EQ.105.OR.KRTTOVINFO(3,JSAT).EQ.106) radar = .TRUE.
+    IF (KRTTOVINFO(3,JSAT).EQ.105.OR.KRTTOVINFO(3,JSAT).EQ.107) radar = .TRUE.
   END IF
 
 ! Read and initialise coefficients
@@ -750,6 +751,9 @@ DO JSAT=1,IJSAT ! loop over sensors
     ELSEIF (KRTTOVINFO(3,JSAT) == 105) THEN ! DPR
       YBEG='dpr'
       YEND=YLBL_DPR(JCH)
+    ELSEIF (KRTTOVINFO(3,JSAT) == 107) THEN ! CPR
+      YBEG='cpr'
+      YEND=YLBL_CPR(JCH)
     ELSE
       YEND=YTWO//YCHAN
     END IF
diff --git a/src/MNH/call_rttov8.f90 b/src/MNH/call_rttov8.f90
deleted file mode 100644
index ab370816e9fbd8998e73ed1420898793511151f9..0000000000000000000000000000000000000000
--- a/src/MNH/call_rttov8.f90
+++ /dev/null
@@ -1,1806 +0,0 @@
-!MNH_LIC Copyright 2003-2020 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
-!MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-!    #######################
-     MODULE MODI_CALL_RTTOV8
-!    #######################
-INTERFACE
-!
-     SUBROUTINE CALL_RTTOV8(KDLON, KFLEV, KSTATM, PEMIS, PTSRAD, PSTATM,   &
-                PTHT, PRT, PPABST, PZZ, PMFCONV, PCLDFR, PULVLKB, PVLVLKB,  &
-                OUSERI, KRTTOVINFO, TPFILE    )
-!
-USE MODD_IO, ONLY: TFILEDATA
-!
-INTEGER, INTENT(IN)   :: KDLON !number of columns where the
-                               !radiation calculations are performed
-INTEGER, INTENT(IN)   :: KFLEV !number of vertical levels where the
-                               !radiation calculations are performed
-INTEGER, INTENT(IN)   :: KSTATM  !index of the standard atmosphere level
-                                 !just above the model top
-!
-!
-REAL, DIMENSION(:,:),     INTENT(IN) :: PEMIS  !Surface IR EMISsivity
-REAL, DIMENSION(:,:),     INTENT(IN) :: PTSRAD !RADiative Surface Temperature
-REAL, DIMENSION(:,:),     INTENT(IN) :: PSTATM !selected standard atmosphere
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTHT   !THeta at t
-REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT    !moist variables at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PPABST !pressure at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ    !Model level heights
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2)
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! cloud fraction
-REAL, DIMENSION(:,:),     INTENT(IN) :: PULVLKB ! U-wind at KB level
-REAL, DIMENSION(:,:),     INTENT(IN) :: PVLVLKB ! V-wind at KB level
-!
-LOGICAL, INTENT(IN)                  :: OUSERI ! logical switch to compute both
-                                               ! liquid and solid condensate (OUSERI=.TRUE.)
-                                               ! or only liquid condensate (OUSERI=.FALSE.)
-!
-INTEGER, DIMENSION(:,:), INTENT(IN) :: KRTTOVINFO ! platform, satelit, sensor,
-                                                  ! and selection calculations
-TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
-!
-END SUBROUTINE CALL_RTTOV8
-END INTERFACE
-END MODULE MODI_CALL_RTTOV8
-!    #####################################################################
-SUBROUTINE CALL_RTTOV8(KDLON, KFLEV, KSTATM, PEMIS, PTSRAD, PSTATM,     &
-           PTHT, PRT, PPABST, PZZ, PMFCONV, PCLDFR, PULVLKB, PVLVLKB,  &
-           OUSERI, KRTTOVINFO, TPFILE    )
-!    #####################################################################
-!!
-!!****  *CALL_RTTOV* - 
-!!
-!!    PURPOSE
-!!    -------
-!!
-!!**  METHOD
-!!    ------
-!!
-!!    EXTERNAL
-!!    --------
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!    REFERENCE
-!!    ---------
-!!    See Chaboureau and Pinty, 2006
-!!    Validation of a cirrus parameterization with Meteosat Second Generation
-!!    observations. Geophys. Res. Let., doi:10.1029/2005GL024725
-!!
-!!    AUTHOR
-!!    ------
-!!      J.-P. Chaboureau       *L.A.*
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original    11/12/03
-!!      JP Chaboureau 27/03/2008 Vectorization
-!!      JP Chaboureau 02/11/2009 move GANGL deallocation outside the sensor loop
-!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-!!----------------------------------------------------------------------------
-!!
-!!*       0.    DECLARATIONS
-!!              ------------
-!!
-USE MODD_CST
-USE MODD_FIELD,          only: TFIELDMETADATA
-USE MODD_IO, ONLY: TFILEDATA
-USE MODD_PARAMETERS
-USE MODD_GRID_n
-USE MODD_DEEP_CONVECTION_n
-USE MODD_REF_n
-USE MODD_RADIATIONS_n,  ONLY : XSEA
-!
-USE MODN_CONF
-!
-USE MODD_RAD_TRANSF
-!
-USE MODI_DETER_ANGLE
-USE MODI_PINTER
-!
-USE MODE_IO_FIELD_WRITE, only: IO_Field_write
-USE MODE_ll
-USE MODE_MSG
-USE MODE_POS
-!
-#ifdef MNH_RTTOV_8
-USE rttov_const, ONLY :  &
-     &  gas_id_watervapour  ,&
-     & errorstatus_success,&
-     & errorstatus_warning,&
-     & errorstatus_fatal,&
-     & sensor_id_mw,        &
-     & npolar_return,       &
-     & npolar_compute
-
-
-USE rttov_types, ONLY : &
-     & geometry_type  ,&
-     & rttov_coef     ,&
-     & rttov_scatt_coef     ,&
-     & profile_type   ,&
-     & profile_cloud_type   ,&
-     & transmission_type    ,&
-     & radiance_cloud_type
-
-USE MOD_CPARAM, ONLY : jppf   ! Max no. profiles
-
-USE parkind1, ONLY : jpim     ,jprb
-!
-IMPLICIT NONE
-!
-! -----------------------------------------------------------------------------
-INTERFACE
-
-!!! #include "rttov_setupindex.interface
-SUBROUTINE rttov_setupindex (&
-     & mchan,           & ! in
-     & nprofiles,       & ! in
-     & nfrequencies,    & ! in
-     & nchannels,       & ! in
-     & nbtout,          & ! in
-     & coef,            & ! in
-     & surfem,          & ! in
-     & lprofiles,       & ! out
-     & channels,        & ! out
-     & polarisations,   & ! out
-     & emissivity)        ! out
-! Imported Type Definitions:
-USE rttov_types, ONLY : &
-     rttov_coef
-USE rttov_const, ONLY :   &
-     sensor_id_mw,     &
-     npolar_return,    &
-     npolar_compute
-
-USE parkind1, ONLY : jpim     ,jprb
-IMPLICIT NONE
-! Subroutine arguments
-INTEGER(Kind=jpim),  INTENT(in)    :: nprofiles          ! Number of profiles
-INTEGER(Kind=jpim),  INTENT(in)    :: mchan(nprofiles)   ! nfrequencies/nprofiles
-INTEGER(Kind=jpim),  INTENT(in)    :: nchannels          ! Number of radiances computed
-INTEGER(Kind=jpim),  INTENT(in)    :: nfrequencies       ! Number of frequencies
-!  (= channels used * profiles)
-INTEGER(Kind=jpim),  INTENT(in)    :: nbtout             ! Number of BTs returned
-INTEGER(Kind=jpim),  INTENT(out)   :: channels(nfrequencies)      ! Channel indices
-INTEGER(Kind=jpim),  INTENT(out)   :: polarisations(nchannels,3)  ! Channel indices
-INTEGER(Kind=jpim),  INTENT(out)   :: lprofiles(nfrequencies)     ! Profiles indices
-REAL(Kind=jprb),     INTENT(in)    :: surfem(nchannels)           ! Input surface emissivity
-REAL(Kind=jprb),     INTENT(out)   :: emissivity(nchannels)       ! Surface emissivity array for RTTOV
-TYPE( rttov_coef ),  INTENT (in)   :: coef               ! coefficients
-END SUBROUTINE rttov_setupindex
-!
-!!! #include "rttov_setupchan.interface"
-SUBROUTINE rttov_setupchan (&
-     & nprofiles,       & ! in
-     & nchan,           & ! in
-     & coef,            & ! in
-     & nfrequencies,    & ! out
-     & nchannels,       & ! out
-     & nbtout)            ! out
-  ! Imported Type Definitions:
-USE rttov_types, ONLY : &
-     rttov_coef
-USE rttov_const, ONLY :   &
-     sensor_id_mw,     &
-     npolar_return,    &
-     npolar_compute
-USE parkind1, ONLY : jpim
-IMPLICIT NONE
-! Subroutine arguments
-INTEGER(Kind=jpim),  INTENT(in)    :: nprofiles        ! Number of profiles
-INTEGER(Kind=jpim),  INTENT(in)    :: nchan(nprofiles) ! Number of channels requested
-TYPE( rttov_coef ),  INTENT (in)   :: coef             ! coefficients
-INTEGER(Kind=jpim),  INTENT(out)   :: nchannels        ! Number of radiances computed
-INTEGER(Kind=jpim),  INTENT(out)   :: nfrequencies     ! Number of frequencies
-!  (= channels used * profiles)
-INTEGER(Kind=jpim),  INTENT(out)   :: nbtout           ! Number of BTs returned
-END SUBROUTINE rttov_setupchan
-!
-!!! #include "rttov_scatt_setupindex.interface"
-SUBROUTINE rttov_scatt_setupindex (nprofiles, n_chan, coef, nchannels, &
-     & lsprofiles,lsprofiles2, frequencies, nbtout)
-USE parkind1     , ONLY: jpim, jprb
-USE rttov_const, ONLY : npolar_return, npolar_compute, &
-     & inst_id_ssmi
-USE rttov_types, ONLY : rttov_coef     
-IMPLICIT NONE
-INTEGER (kind=jpim), INTENT ( in) :: nprofiles
-INTEGER (kind=jpim), INTENT ( in) :: nchannels
-INTEGER (kind=jpim), INTENT ( in) :: nbtout
-INTEGER (kind=jpim), INTENT ( in) :: n_chan (nprofiles)    
-TYPE   (rttov_coef), INTENT ( in) :: coef   
-INTEGER (kind=jpim), INTENT (out), DIMENSION (nchannels)    :: lsprofiles   
-INTEGER (kind=jpim), INTENT (out), DIMENSION (nbtout)       :: lsprofiles2  
-INTEGER (kind=jpim), INTENT (out), DIMENSION (nchannels)    :: frequencies
-END SUBROUTINE rttov_scatt_setupindex
-!
-!!! #include "rttov_cld.interface"
-SUBROUTINE rttov_cld( &
-     errorstatus,     & ! out
-     nfrequencies,    & ! in
-     nchannels,       & ! in
-     nbtout,          & ! in
-     nprofiles,       & ! in
-     channels,        & ! in
-     polarisations,   & ! in
-     lprofiles,       & ! in
-     profiles,        & ! inout  (to invalid clw absorption)
-     cld_profiles,    & ! in
-     coef,            & ! in
-     calcemis,        & ! in
-     emissivity,      & ! inout
-     cld_radiance )     ! inout
-USE rttov_const, ONLY :   &
-     errorstatus_success ,&
-     errorstatus_fatal   ,&
-     overlap_scheme
-USE rttov_types, ONLY :    &
-     rttov_coef           ,&
-     geometry_Type        ,&
-     profile_Type         ,&
-     profile_cloud_Type   ,&
-     transmission_Type    ,&
-     radiance_Type        ,&
-     radiance_cloud_Type
-USE parkind1, ONLY : jpim     ,jprb
-IMPLICIT NONE
-INTEGER(Kind=jpim),        INTENT(in)    :: nbtout  ! Number of output radiances
-INTEGER(Kind=jpim),        INTENT(in)    :: nfrequencies  ! Number of output radiances
-INTEGER(Kind=jpim),        INTENT(in)    :: nchannels
-INTEGER(Kind=jpim),        INTENT(in)    :: nprofiles
-INTEGER(Kind=jpim),        INTENT(in)    :: channels(nfrequencies)
-INTEGER(Kind=jpim),        INTENT(in)    :: polarisations(nchannels,3)      ! Channel indices
-INTEGER(Kind=jpim),        INTENT(in)    :: lprofiles(nfrequencies)
-TYPE(profile_Type),        INTENT(inout) :: profiles(nprofiles) ! Profiles on RTTOV levels
-TYPE(profile_cloud_Type),  INTENT(in)    :: cld_profiles(nprofiles) ! Cloud profiles on NWP levels
-TYPE(rttov_coef),          INTENT(in)    :: coef  ! Coefficients
-LOGICAL,                   INTENT(in)    :: calcemis(nchannels)  ! switch for emmissivity calc.
-REAL(Kind=jprb),           INTENT(inout) :: emissivity(nchannels) ! surface emmissivity
-TYPE(radiance_cloud_Type), INTENT(inout) :: cld_radiance    ! radiances (mw/cm-1/ster/sq.m)
-INTEGER(Kind=jpim),        INTENT(out)   :: errorstatus(nprofiles)  ! return flag
-END SUBROUTINE rttov_cld
-
-!!! #include "rttov_cld_k.interface"
-SUBROUTINE Rttov_cld_k  ( &
-     errorstatus,    & ! out
-     nfrequencies,   & ! in
-     nchannels,      & ! in
-     nbtout,         & ! in
-     nprofiles,      & ! in
-     channels,       & ! in
-     polarisations,  & ! in
-     lprofiles,      & ! in
-     profiles,       & ! in
-     cld_profiles,   & ! in
-     coef,           & ! in
-     switchrad,      & ! in
-     calcemis,       & ! in
-     emissivity,     & ! inout
-     profiles_k ,    & ! inout
-     cld_profiles_k ,& ! inout
-     emissivity_k ,  & ! inout
-     cld_radiance)     ! inout
-USE rttov_const, ONLY :   &
-     errorstatus_success ,&
-     errorstatus_fatal   ,&
-     overlap_scheme
-USE rttov_types, ONLY :    &
-     rttov_coef           ,&
-     geometry_Type        ,&
-     profile_Type         ,&
-     profile_cloud_Type   ,&
-     radiance_cloud_Type
-USE parkind1, ONLY : jpim     ,jprb
-IMPLICIT NONE
-INTEGER(Kind=jpim),        INTENT(in)    :: nfrequencies
-INTEGER(Kind=jpim),        INTENT(in)    :: nchannels
-INTEGER(Kind=jpim),        INTENT(in)    :: nbtout
-INTEGER(Kind=jpim),        INTENT(in)    :: nprofiles
-INTEGER(Kind=jpim),        INTENT(in)    :: channels(nfrequencies)
-INTEGER(Kind=jpim),        INTENT(in)    :: polarisations(nchannels,3)
-INTEGER(Kind=jpim),        INTENT(in)    :: lprofiles(nfrequencies)
-LOGICAL,                   INTENT(in)    :: switchrad  ! true if input is BT
-TYPE(profile_Type),        INTENT(inout) :: profiles(nprofiles)
-TYPE(profile_cloud_Type),  INTENT(in)    :: cld_profiles(nprofiles)
-TYPE(rttov_coef),          INTENT(in)    :: coef
-LOGICAL,                   INTENT(in)    :: calcemis(nchannels)
-REAL(Kind=jprb),           INTENT(inout) :: emissivity(nchannels)
-TYPE(radiance_cloud_type), INTENT(inout) :: cld_radiance! in because of meme allocation
-TYPE(profile_Type),        INTENT(inout) :: profiles_k(nchannels)
-TYPE(profile_cloud_Type),  INTENT(inout) :: cld_profiles_k(nchannels)
-REAL(Kind=jprb),           INTENT(inout) :: emissivity_k(nchannels)
-INTEGER(Kind=jpim),        INTENT(out)   :: errorstatus(nprofiles)
-END SUBROUTINE Rttov_cld_k
-
-
-!!! #include "rttov_scatt.interface"
-SUBROUTINE rttov_scatt(&
-     & errorstatus,&
-     & nwp_levels,&
-     & nrt_levels,&
-     & nfrequencies,&
-     & nchannels,&
-     & nbtout,&
-     & nprofiles,&
-     & polarisations,&
-     & channels,&
-     & frequencies,&
-     & lprofiles,&
-     & lsprofiles,&
-     & profiles,&
-     & cld_profiles,&
-     & coef_rttov,&
-     & coef_scatt,&
-     & calcemiss,&
-     & emissivity_in,&
-     & cld_radiance ) 
-USE rttov_types, ONLY :&
-     & rttov_coef ,&
-     & rttov_scatt_coef ,&
-     & geometry_Type ,&
-     & profile_Type ,&
-     & profile_cloud_Type ,&
-     & profile_scatt_aux ,&
-     & transmission_Type ,&
-     & radiance_Type ,&
-     & radiance_cloud_Type 
-USE parkind1, ONLY : jpim ,jprb
-INTEGER (Kind=jpim), INTENT (in) :: nwp_levels
-INTEGER (Kind=jpim), INTENT (in) :: nrt_levels
-INTEGER (Kind=jpim), INTENT (in) :: nprofiles
-INTEGER (Kind=jpim), INTENT (in) :: nfrequencies
-INTEGER (Kind=jpim), INTENT (in) :: nchannels
-INTEGER (Kind=jpim), INTENT (in) :: nbtout
-INTEGER (Kind=jpim), INTENT (in) :: channels (nfrequencies)
-INTEGER (Kind=jpim), INTENT (in) :: frequencies (nchannels)
-INTEGER (Kind=jpim), INTENT (in) :: polarisations (nchannels,3)
-INTEGER (Kind=jpim), INTENT (in) :: lprofiles (nfrequencies)
-INTEGER (Kind=jpim), INTENT (in) :: lsprofiles (nchannels)
-INTEGER (Kind=jpim), INTENT (out) :: errorstatus (nprofiles)
-LOGICAL, INTENT (in) :: calcemiss (nchannels)
-REAL (Kind=jprb), INTENT (in) :: emissivity_in (nchannels)
-TYPE (profile_Type), INTENT (inout) :: profiles (nprofiles)
-TYPE (rttov_coef), INTENT (in) :: coef_rttov
-TYPE (rttov_scatt_coef), INTENT (in) :: coef_scatt
-TYPE (profile_cloud_Type), INTENT (in) :: cld_profiles (nprofiles)
-TYPE (radiance_cloud_Type), INTENT (inout) :: cld_radiance
-END SUBROUTINE rttov_scatt
-
-!!! #include "rttov_readcoeffs.interface"
-SUBROUTINE rttov_readcoeffs  (&
-     & errorstatus,  & ! out
-     & coef,         & ! out
-     & instrument,   & ! in Optional
-     & kmyproc,      & ! in Optional
-     & kioproc,      & ! in Optional
-     & file_id,      & ! in Optional
-     & channels      ) ! in Optional
-USE rttov_const, ONLY :   &
-     version             ,&
-     release             ,&
-     minor_version       ,&
-     rttov_magic_string  ,&
-     sensor_id_mw        ,&
-     sensor_id_ir        ,&
-     errorstatus_info    ,&
-     errorstatus_success ,&
-     errorstatus_fatal   ,&
-     gas_id_mixed        ,&
-     gas_id_watervapour  ,&
-     gas_id_ozone        ,&
-     gas_id_wvcont       ,&
-     gas_id_co2          ,&
-     gas_id_n2o          ,&
-     gas_id_co           ,&
-     gas_id_ch4          ,&
-     gas_unit_specconc   ,&
-     gas_unit_ppmv       ,&
-     earthradius         ,&
-     gas_name            ,&
-     pressure_top
-USE rttov_types, ONLY : &
-     rttov_coef
-USE parkind1, ONLY : jpim     ,jprb
-IMPLICIT NONE
-INTEGER(Kind=jpim), OPTIONAL, INTENT(in) :: kmyproc  ! logical processor id
-INTEGER(Kind=jpim), OPTIONAL, INTENT(in) :: kioproc  ! processor dedicated for io
-INTEGER(Kind=jpim), OPTIONAL, INTENT (in) :: instrument(3)  ! (platform, satellite identification, instrument) number
-INTEGER(Kind=jpim), OPTIONAL, INTENT (in) :: file_id      ! file logical unit number
-INTEGER(Kind=jpim), OPTIONAL, INTENT (in) :: channels(:)      ! list of channels to extract
-INTEGER(Kind=jpim), INTENT (out) :: errorstatus       ! return code
-TYPE( rttov_coef ), INTENT (out) :: coef   ! coefficients
-END SUBROUTINE rttov_readcoeffs
-
-!!! #include "rttov_initcoeffs.interface"
-SUBROUTINE rttov_initcoeffs  (&
-     & errorstatus,   &! out
-     & coef,          &! out
-     & knproc,        &! in Optional
-     & kmyproc,       &! in Optional
-     & kioproc        )! in Optional
-USE rttov_const, ONLY :   &
-     & sensor_id_mw        ,&
-     & errorstatus_info    ,&
-     & errorstatus_success ,&
-     & errorstatus_fatal   ,&
-     & gas_id_mixed        ,&
-     & gas_id_watervapour  ,&
-     & gas_id_ozone        ,&
-     & gas_id_wvcont       ,&
-     & gas_id_co2          ,&
-     & gas_id_n2o          ,&
-     & gas_id_co           ,&
-     & gas_id_ch4          ,&
-     & gas_unit_specconc   ,&
-     & gas_unit_ppmv       ,&
-     & earthradius         ,&
-     & gas_name            ,&
-     & pressure_top
-! Imported Type Definitions:
-USE rttov_types, ONLY : &
-     & rttov_coef
-USE parkind1, ONLY : jpim     ,jprb
-IMPLICIT NONE
-INTEGER(Kind=jpim), OPTIONAL, INTENT(in) :: knproc   ! number of procs
-INTEGER(Kind=jpim), OPTIONAL, INTENT(in) :: kmyproc  ! logical processor id
-INTEGER(Kind=jpim), OPTIONAL, INTENT(in) :: kioproc  ! procs dedicated for io
-! scalar arguments with intent(out):
-INTEGER(Kind=jpim), INTENT (out) :: errorstatus       ! return code
-TYPE( rttov_coef ), INTENT (out) :: coef   ! coefficients
-END SUBROUTINE rttov_initcoeffs
-
-!!! #include "rttov_readscattcoeffs.interface"
-SUBROUTINE rttov_readscattcoeffs  (&
-     & errorstatus,   &! out
-     & coef_rttov,    &! in
-     & coef_scatt,    &! out
-     & file_id       ) ! in Optional
-! Imported Type Definitions:
-USE rttov_types, ONLY : &
-     & rttov_coef, &
-     & rttov_scatt_coef
-USE rttov_const, ONLY :   &
-     & inst_name           ,&
-     & platform_name       ,&
-     & errorstatus_info    ,&
-     & errorstatus_success ,&
-     & errorstatus_fatal
-USE parkind1, ONLY : jpim     ,jprb
-IMPLICIT NONE
-! subroutine arguments
-! scalar arguments with intent(out):
-INTEGER(Kind=jpim), INTENT (out) :: errorstatus             ! return code
-! scalar arguments with optional intent(in):
-INTEGER(Kind=jpim), OPTIONAL, INTENT (in)  :: file_id       ! file logical unit number
-! array arguments with intent(in):
-TYPE( rttov_coef ), INTENT (in) :: coef_rttov               ! clear-sky coefficients
-! array arguments with intent(out):
-TYPE( rttov_scatt_coef ), INTENT (out) :: coef_scatt        ! coefficients
-END SUBROUTINE rttov_readscattcoeffs
-
-END INTERFACE
-!!! #include "rttov_opencoeff.interface"
-!!! #include "rttov_errorhandling.interface"
-!!! #include "rttov_dealloc_coef.interface"
-!!! #include "rttov_errorreport.interface"
-#endif
-!!!
-!!!*       0.1   DECLARATIONS OF DUMMY ARGUMENTS :
-!!!
-INTEGER, INTENT(IN)   :: KDLON   !number of columns where the
-! radiation calculations are performed
-INTEGER, INTENT(IN)   :: KFLEV   !number of vertical levels where the
-! radiation calculations are performed
-INTEGER, INTENT(IN)   :: KSTATM  !index of the standard atmosphere level
-                                !just above the model top
-!!!
-REAL, DIMENSION(:,:),     INTENT(IN) :: PEMIS  !Surface IR EMISsivity
-REAL, DIMENSION(:,:),     INTENT(IN) :: PTSRAD !RADiative Surface Temperature
-REAL, DIMENSION(:,:),     INTENT(IN) :: PSTATM !selected standard atmosphere
-                                !
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTHT   !THeta at t
-REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT    !moist variables at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PPABST !pressure at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ    !Model level heights
-!!!
-!!!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2)
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! cloud fraction
-REAL, DIMENSION(:,:),     INTENT(IN) :: PULVLKB ! U-wind at KB level
-REAL, DIMENSION(:,:),     INTENT(IN) :: PVLVLKB ! V-wind at KB level
-!!!
-LOGICAL, INTENT(IN)                  :: OUSERI ! logical switch to compute both
-! liquid and solid condensate (OUSERI=.TRUE.)
-! or only liquid condensate (OUSERI=.FALSE.)
-!!!
-INTEGER, DIMENSION(:,:), INTENT(IN) :: KRTTOVINFO ! platform, satelit, sensor,
-                                                  ! and selection calculations
-TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
-!
-#ifdef MNH_RTTOV_8
-!!!
-!!!*       0.2   DECLARATIONS OF LOCAL VARIABLES
-!!!
-!!!
-INTEGER, PARAMETER :: JPNSAT=3       ! No. of Satellite required
-                                !
-INTEGER :: JI,JJ,JK,JK1,JK2,JKRAD,JKF,JSAT,JC ! loop indexes
-                                !
-INTEGER :: IJSAT        ! number of columns/=NUNDEF which 
-                        ! have to be treated in the table KRTTOVINFO(:,:)
-INTEGER :: IIB,IIE        ! I index value of the first/last inner mass point
-INTEGER :: IJB,IJE        ! J index value of the first/last inner mass point
-INTEGER :: IKB,IKE        ! K index value of the first/last inner mass point
-INTEGER :: IIU          ! array size for the first  index
-INTEGER :: IJU          ! array size for the second index
-INTEGER :: IKU          ! array size for the third  index
-INTEGER :: IKR          ! real array size for the third  index
-INTEGER (Kind=jpim) :: iwp_levels ! equal to IKR (call to rttov_scatt)
-INTEGER :: IIJ          ! reformatted array index
-INTEGER :: IKSTAE       ! level number of the STAndard atmosphere array
-INTEGER :: IKUP         ! vertical level above which STAndard atmosphere data
-INTEGER, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,3)) :: IKKOZ ! indice array used to
-! vertically interpolate the ozone content on the model grid
-                                !
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZPAVE  ! mean-layer pressure
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZTAVE  ! mean-layer temperature
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZQVAVE ! mean-layer specific humidity
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZO3AVE ! mean-layer ozone content
-REAL, DIMENSION(:),   ALLOCATABLE :: ZREMIS ! Reformatted PEMIS array
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNT ! Exner function
-REAL, DIMENSION(SIZE(PSTATM,1)) :: ZSTAZZ,ZSTAOZ ! STAndard atmosphere height
-!    and OZone content
-REAL :: ZOZ ! variable used to interpolate the ozone profile
-
-REAL, DIMENSION(:),   ALLOCATABLE   ::  ZULAT
-REAL, DIMENSION(:),   ALLOCATABLE   ::  ZULON
-
-REAL, DIMENSION(:,:,:), ALLOCATABLE   ::  ZTBTMP
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZANTMP, ZUTH
-REAL :: ZZH, zdeg_to_rad, zrad_to_deg, zbeta, zalpha
-
-! Other arrays for zenithal solar angle 
-! REAL, DIMENSION(:,:),   ALLOCATABLE :: ZCOSZEN, ZSINZEN, ZAZIMSOL
-
-! Other arrays for condensation
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZTEMP  ! Temperature
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZNCLD  ! grid scale cloud fraction
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRC    ! grid scale r_c (kg/kg)
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRI    ! grid scale r_i (kg/kg)
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRR    ! grid scale r_r (kg/kg)
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRS    ! grid scale r_s (kg/kg)
-! -----------------------------------------------------------------------------
-INTEGER, PARAMETER :: JPLEV=43, JPNAV=3, JPNSAV=5, JPNSSV=6, JPNCVCLD=6  
-
-REAL, DIMENSION(JPLEV) ::  ZPRES !Fixed level pressures used in RTTOV
-REAL, DIMENSION(JPLEV) ::  ZPRES_INV
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZAV    !Profile array content
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZSAV   !Surface array content
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZSSV   !Surface Skin array content
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZAP    !Full-level Model Pressure (hPa)
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZAP_HL !Half-level Model Pressure (hPa)
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCV    !Temperature and cloud variable
-                                !on full-level model
-REAL, DIMENSION(:), ALLOCATABLE :: ZANGL   !Satellite zenith angle (deg)
-REAL, DIMENSION(:), ALLOCATABLE :: ZANGS   !Solar zenith angle (deg)
-! -----------------------------------------------------------------------------
-! Jacobian fields
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTEMPK, ZWVAPK
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTEMPKP, ZTEMPKPP, ZWVAPKP, ZWVAPKPP
-! -----------------------------------------------------------------------------
-! INDEXES AND TEMPORAL ARRAYS FOR VECTORIZATION
-INTEGER :: JIS, IBEG, IEND, IDIM, ICPT
-INTEGER, DIMENSION(:),   ALLOCATABLE :: IMSURFP
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZAVP, ZCVP
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZSAVP, ZSSVP, ZAPP, ZAP_HLP
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZZTMP, ZZTMPP
-REAL, DIMENSION(:),   ALLOCATABLE :: ZANGLP, ZREMISP
-LOGICAL, DIMENSION(:), ALLOCATABLE ::  GANGL
-! -----------------------------------------------------------------------------
-INTEGER :: INRAD = 2 ! INRAD=1 RADIANCE; INRAD=2 BRIGHTNESS TEMPERATURE
-! -----------------------------------------------------------------------------
-! Realistic maximum values for hydrometeor content in kg/kg
-REAL :: ZRCMAX = 5.0E-03, ZRRMAX = 5.0E-03, ZRIMAX = 2.0E-03, ZRSMAX = 5.0E-03
-! -----------------------------------------------------------------------------
-INTEGER, DIMENSION(:), ALLOCATABLE :: IMSURF   !Surface type index
-                                
-INTEGER :: IKFBOT, IKFTOP, INDEX, ISUM, JLEV, JCH, IWATER, ICAN
-REAL, DIMENSION(:), ALLOCATABLE :: ZTEXTR, ZQVEXTR !Array used in interpolation
-REAL, DIMENSION(:), ALLOCATABLE :: ZQVSAT, ZVINT !Array used in interpolation
-REAL, DIMENSION(:), ALLOCATABLE :: ZPSUM, ZTSUM, ZQVSUM, ZO3SUM !Array used in interpolation
-REAL :: zconst, ZPS, ZTGRAD, ZQGRAD, ZOGRAD !variables used in interpolation
-REAL, DIMENSION(:), ALLOCATABLE :: ZPIN, ZFIN, ZOUT
-!  at the open of the file LFI routines 
-CHARACTER(LEN=8)  :: YINST  
-CHARACTER(LEN=4)  :: YBEG, YEND
-CHARACTER(LEN=2)  :: YCHAN, YTWO   
-CHARACTER(LEN=1)  :: YONE   
-                               
-INTEGER, PARAMETER :: JPPLAT=16
-
-CHARACTER(LEN=3), DIMENSION(JPPLAT) :: YPLAT= (/ &
-     'N  ','D  ','MET','GO ','GMS','FY2','TRM','ERS', &
-     'EOS','MTP','ENV','MSG','FY1','ADS','MTS','CRL' /)
-CHARACTER(LEN=2), DIMENSION(2) :: YLBL_MVIRI = (/ 'WV', 'IR'/)
-CHARACTER(LEN=3), DIMENSION(7) :: YLBL_SSMI = (/ &
-     '19V','19H','22V','37V','37H','85V','85H'/)
-CHARACTER(LEN=3), DIMENSION(9) :: YLBL_TMI = (/ &
-     '10V','10H','19V','19H','22V','37V','37H','85V','85H'/)
-CHARACTER(LEN=3), DIMENSION(8) :: YLBL_SEVIRI = (/ &
-     '039', '062','073','087','097','108','120','134'/)
-CHARACTER(LEN=3), DIMENSION(4) :: YLBL_GOESI = (/ &
-     '039', '067','107','120'/)
-
-! -----------------------------------------------------------------------------
-!*JPC*VECTORIZATION
-!! One profile per run
-!! INTEGER (Kind=jpim) :: nprofiles = 1
-INTEGER (Kind=jpim) :: nprofiles, ntruepro
-!*JPC*VECTORIZATION
-
-! RTTOV_readcoeffs interface
-! ====================
-INTEGER(Kind=jpim) :: errorstatus
-INTEGER(Kind=jpim) :: instrument(3)
-TYPE( rttov_coef ) :: coef         ! coefficients
-TYPE( rttov_scatt_coef ) :: coef_scatt
-
-! RTTOV interface
-! ====================
-INTEGER(Kind=jpim), ALLOCATABLE :: rttov_errorstatus(:)  ! rttov error return code
-INTEGER(Kind=jpim) :: nfrequencies
-INTEGER(Kind=jpim) :: nchannels
-INTEGER(Kind=jpim) :: nbtout
-INTEGER(Kind=jpim), ALLOCATABLE :: channels   (:), n_chan(:)
-INTEGER(Kind=jpim), ALLOCATABLE :: polarisations   (:,:)
-INTEGER(Kind=jpim), ALLOCATABLE :: frequencies   (:)
-INTEGER(Kind=jpim), ALLOCATABLE :: lprofiles  (:),lsprofiles(:),lsprofiles2(:)
-TYPE(profile_Type), ALLOCATABLE  :: profiles(:)
-TYPE(profile_cloud_type), ALLOCATABLE :: cld_profiles(:)
-TYPE(transmission_type)               :: transmission
-LOGICAL              :: addcloud = .FALSE.
-LOGICAL, ALLOCATABLE         :: calcemis(:)
-REAL(Kind=jprb), ALLOCATABLE :: emissivity (:)
-TYPE(radiance_cloud_type)             :: radiance
-
-REAL(Kind=jprb),    ALLOCATABLE :: input_emissivity (:)
-CHARACTER (len=6)  :: NameOfRoutine = 'tstrad'
-! RTTOV K/AD interface
-! ====================
-LOGICAL    :: switchrad  ! true if input is BT
-TYPE(profile_Type), ALLOCATABLE :: profiles_k(:)
-TYPE(profile_cloud_Type), ALLOCATABLE :: cld_profiles_k(:)
-REAL(Kind=jprb),    ALLOCATABLE       :: emissivity_k (:)
-
-! variables for input
-! ====================
-! Parameter for WV conversion used in all tstrad suite
-REAL(Kind=jprb), PARAMETER :: q_mixratio_to_ppmv  = 1.60771704e+6_JPRB
-REAL(Kind=jprb), PARAMETER :: o3_mixratio_to_ppmv = 6.03504e+5_JPRB
-INTEGER(Kind=jpim) :: alloc_status(40)
-
-CHARACTER(LEN=:), ALLOCATABLE :: YMNHNAME, YUNITS, YCOMMENT
-TYPE(TFIELDMETADATA) :: TZFIELD
-
-! - End of header --------------------------------------------------------
-!!!----------------------------------------------------------------------------
-!!!
-!!!*       1.    INITIALIZATION OF CONSTANTS FOR TRANSFERT CODE
-!!!              ----------------------------------------------
-!!!
-
-! JPC from refprof.dat
-ZPRES=(/   0.100,    0.290,    0.690,    1.420,    2.611,    4.407, &
-     6.950,   10.370,   14.810,   20.400,   27.260,   35.510, &
-     45.290,   56.730,   69.970,   85.180,  102.050,  122.040, &
-     143.840,  167.950,  194.360,  222.940,  253.710,  286.600, &
-     321.500,  358.280,  396.810,  436.950,  478.540,  521.460, &
-     565.540,  610.600,  656.430,  702.730,  749.120,  795.090, &
-     839.950,  882.800,  922.460,  957.440,  985.880, 1005.430, &
-     1013.250 /)
-
-DO JK=1,JPLEV
-  JKRAD=JPLEV-JK+1
-  ZPRES_INV(JK)=ZPRES(JKRAD)*100. ! Conversion from hPa to Pa
-END DO
-
-errorstatus     = 0
-alloc_status(:) = 0
-
-PRINT *,'NB OF SAT SIZE(KRTTOVINFO,1)=',SIZE(KRTTOVINFO,1)
-PRINT *,'NB OF SAT SIZE(KRTTOVINFO,2)=',SIZE(KRTTOVINFO,2)
-DO JSAT=1,SIZE(KRTTOVINFO,2)
-  IF (KRTTOVINFO(1,JSAT) /= NUNDEF) THEN
-    IJSAT = JSAT
-  END IF
-END DO
-
-JSAT=1
-instrument(1)=KRTTOVINFO(1,JSAT)
-instrument(2)=KRTTOVINFO(2,JSAT)
-instrument(3)=KRTTOVINFO(3,JSAT)
-PRINT *,'range(KRTTOVINFO(3,JSAT)) ',range(KRTTOVINFO(3,JSAT))
-PRINT *,'range(instrument(3)) ',range(instrument(3))
-CALL rttov_readcoeffs (errorstatus, coef, instrument)
-CALL rttov_initcoeffs (errorstatus, coef)
-
-switchrad = INRAD == 2
-PRINT *,' RADIANCE OR TB CALCULATION: INRAD=',INRAD,' switchrad=',switchrad
-
-!!!----------------------------------------------------------------------------
-!!!
-!!!*       2.    COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES
-!!!              ----------------------------------------------
-                               
-IIU = SIZE(PTHT,1)
-IJU = SIZE(PTHT,2)
-IKU = SIZE(PTHT,3)
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-IKB = 1 + JPVEXT
-IKE = IKU - JPVEXT
-IKR = IKE - IKB +1
-                              
-IKSTAE = SIZE(PSTATM,1)
-IKUP   = IKE-JPVEXT+1
-
-!*JPC*VECTORIZATION
-! Determine the number of profiles per RTTOV run
-nprofiles = JPPF
-!*JPC*VECTORIZATION
-
-  
-!!!----------------------------------------------------------------------------
-!!!
-!!!*       3.    INITIALIZES THE MEAN-LAYER VARIABLES
-!!!              ------------------------------------
-                               
-ALLOCATE(ZEXNT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)))
-ZEXNT(:,:,:)= ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD)
-                              
-! Pressure
-ALLOCATE(ZPAVE(KDLON,KFLEV))
-DO JK=IKB,IKE
-  JKRAD = JK-JPVEXT
-  DO JJ=IJB,IJE
-    DO JI=IIB,IIE
-      IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-      ZPAVE(IIJ,JKRAD)  = PPABST(JI,JJ,JK)*0.01  !Pressure in hPa
-    END DO
-  END DO
-END DO
-                               
-! Temperature
-ALLOCATE(ZTEMP(IIU,IJU,IKU))
-ZTEMP=PTHT*ZEXNT
-ALLOCATE(ZTAVE(KDLON,KFLEV))
-DO JK=IKB,IKE
-  JKRAD = JK-JPVEXT
-  DO JJ=IJB,IJE
-    DO JI=IIB,IIE
-      IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-      ZTAVE(IIJ,JKRAD)  = ZTEMP(JI,JJ,JK)
-    END DO
-  END DO
-END DO
-
-! Water vapor
-ALLOCATE(ZQVAVE(KDLON,KFLEV))
-ZQVAVE(:,:) = 0.0
-IF( SIZE(PRT(:,:,:,:),4) >= 1 ) THEN
-  DO JK=IKB,IKE
-    JKRAD = JK-JPVEXT
-    DO JJ=IJB,IJE
-      DO JI=IIB,IIE
-        IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-        ZQVAVE(IIJ,JKRAD) = PRT(JI,JJ,JK,1)
-      END DO
-    END DO
-  END DO
-END IF
-
-! Ozone
-ALLOCATE(ZO3AVE(KDLON,KFLEV))
-    
-ZSTAOZ(:) = PSTATM(:,6)/PSTATM(:,4)
-ZSTAZZ(:) = 1000.0*PSTATM(:,1)
-
-DO JJ = IJB,IJE
-  DO JK2 = IKB,IKE
-    JKRAD = JK2-JPVEXT
-    IKKOZ(:,JK2) = IKB-1
-    DO JK1 = 1,IKSTAE
-      DO JI = IIB,IIE
-        IKKOZ(JI,JK2)=IKKOZ(JI,JK2) + NINT(0.5 + SIGN(0.5,    &
-             -ZSTAZZ(JK1)+0.5*(PZZ(JI,JJ,JK2)+PZZ(JI,JJ,JK2+1)) ))
-      END DO
-    END DO
-    DO JI = IIB,IIE
-      ZOZ=(0.5*(PZZ(JI,JJ,JK2)+PZZ(JI,JJ,JK2+1))- ZSTAZZ(IKKOZ(JI,JK2))) &
-           /( ZSTAZZ(IKKOZ(JI,JK2)+1)           - ZSTAZZ(IKKOZ(JI,JK2)))
-      IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-      ZO3AVE(IIJ,JKRAD) =( (1.- ZOZ) * ZSTAOZ(IKKOZ(JI,JK2))    &
-           +  ZOZ     * ZSTAOZ(IKKOZ(JI,JK2)+1))
-    END DO
-  END DO
-END DO
-                                
-!  Standard atmosphere extension                               
-DO JK=IKUP,KFLEV
-  JK1 = (KSTATM-1)+(JK-IKUP)
-  JK2 = JK1+1
-  ZPAVE(:,JK)  = 0.5*( PSTATM(JK1,2)+PSTATM(JK2,2) )
-  ZTAVE(:,JK)  = 0.5*( PSTATM(JK1,3)+PSTATM(JK2,3) )
-  ZQVAVE(:,JK) = 0.5*( PSTATM(JK1,5)/PSTATM(JK1,4)+PSTATM(JK2,5)/PSTATM(JK2,4))
-  JK1 = (KSTATM)+(JK-IKUP)
-  ZO3AVE(:,JK) = ZSTAOZ(JK1)
-END DO
-!!!
-!!!----------------------------------------------------------------------------
-!!!
-!!!*       4.    INTERPOLATES THE ATMOSPHERIC VARIABLES ONTO THE RTTOV GRID
-!              ----------------------------------------------------------
-!!!WITH INVERSION OF VERTICAL LEVELS!
-                               
-ALLOCATE(ZAV(JPLEV,JPNAV,KDLON))
-
-ALLOCATE(ZTEXTR(JPLEV))
-ALLOCATE(ZQVEXTR(JPLEV))
-ALLOCATE(ZVINT(JPLEV))
-ISUM=JPLEV+KFLEV
-ALLOCATE(ZPSUM(ISUM))
-ALLOCATE(ZTSUM(ISUM))
-ALLOCATE(ZQVSUM(ISUM))
-ALLOCATE(ZO3SUM(ISUM))
-ALLOCATE(ZQVSAT(ISUM))
-ZPSUM(:)=0.
-ZTSUM(:)=0.
-ZQVSUM(:)=0.
-ZO3SUM(:)=0.
-ZQVSAT(:)=0.
-zconst= 287./1005.
-IWATER = coef % fmv_gas_pos( gas_id_watervapour )
-DO JI=IIB,IIE
-  DO JJ=IJB,IJE
-    IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-    ZPS=XP00*0.01 * & !Surface Pressure in hPa
-         (0.5*(ZEXNT(JI,JJ,IKB)+ZEXNT(JI,JJ,IKB-1)))**(XCPD/XRD)
-    DO JK=1,KFLEV
-      JKRAD = KFLEV-JK+1 !INVERSION OF VERTICAL LEVELS!
-      ZPSUM(JKRAD)=ZPAVE(IIJ,JK)
-      ZTSUM(JKRAD)=ZTAVE(IIJ,JK)
-      ZQVSUM(JKRAD)=ZQVAVE(IIJ,JK)
-      ZO3SUM(JKRAD)=ZO3AVE(IIJ,JK)
-    END DO
-    ZTSUM(KFLEV+1)=ZTAVE(IIJ,1)
-    ZQVSUM(KFLEV+1)=ZQVAVE(IIJ,1)
-    IKFBOT=0
-    DO JKF=1,JPLEV
-      IF (ZPRES(JKF) > ZPS) THEN
-        IKFBOT=JKF
-        EXIT
-      END IF
-    END DO
-    INDEX = KFLEV
-    IF (IKFBOT /= 0) THEN
-!!!-----Extrapolates temperature below surface pressure-------------------
-      INDEX=JPLEV-IKFBOT+1
-      INDEX=INDEX+KFLEV+1
-      ZTSUM((KFLEV+2):INDEX) = PTSRAD(JI,JJ)
-      ZPSUM((KFLEV+1))=ZPS
-      ZPSUM((KFLEV+2):INDEX)=ZPRES(IKFBOT:JPLEV)
-      ZO3SUM((KFLEV+2):INDEX)=ZO3AVE(IIJ,1)
-    END IF
-!!!-----Extrapolates profile above highest declared level-----------------
-!!!----- => linear extrapolation -----------------------------------------
-    IKFTOP = 1
-    DO JLEV=1,INDEX
-      IF(ZPRES(JLEV) >= ZPAVE(IIJ,KFLEV) ) EXIT
-      IKFTOP = IKFTOP + 1
-    END DO
-    IF (IKFTOP /= 1) THEN
-      ZTGRAD = (ZTSUM(1) - ZTSUM(2)) / (ZPSUM(1)-ZPSUM(2))
-      ZQGRAD = (ZQVSUM(1) - ZQVSUM(2)) / (ZPSUM(1)-ZPSUM(2))
-      ZOGRAD = (ZO3SUM(1) - ZO3SUM(2)) / (ZPSUM(1)-ZPSUM(2))
-      DO JLEV=INDEX, 1, -1
-        ZTSUM(JLEV+IKFTOP-1) = ZTSUM(JLEV)
-        ZQVSUM(JLEV+IKFTOP-1) = ZQVSUM(JLEV)
-        ZO3SUM(JLEV+IKFTOP-1) = ZO3SUM(JLEV)
-        ZPSUM(JLEV+IKFTOP-1) = ZPSUM(JLEV)
-      END DO
-      INDEX = INDEX + IKFTOP-1
-      DO JLEV=1,IKFTOP-1
-        ZPSUM(JLEV) = ZPRES(JLEV)
-        ZTSUM(JLEV) = ZTSUM(IKFTOP)  &
-             + ZTGRAD * (ZPSUM(JLEV) - ZPSUM(IKFTOP))
-        ZQVSUM(JLEV) = ZQVSUM(IKFTOP)  &
-             + ZQGRAD * (ZPSUM(JLEV) - ZPSUM(IKFTOP))
-        ZO3SUM(JLEV) = ZO3SUM(IKFTOP)  &
-             + ZOGRAD * (ZPSUM(JLEV) - ZPSUM(IKFTOP))
-      END DO
-    ENDIF
-!!!-----Interpolates to given pressure grid-------------------------------
-    ALLOCATE(ZPIN(INDEX))
-    ALLOCATE(ZFIN(INDEX))
-    ALLOCATE(ZOUT(JPLEV))
-    DO JLEV=1,INDEX
-      JKRAD=INDEX-JLEV+1
-      ZPIN(JKRAD) = ZPSUM(JLEV)*100.
-      ZFIN(JKRAD) = ZTSUM(JLEV)
-    END DO
-    CALL PINTER(ZFIN, ZPIN, ZFIN, ZFIN, ZOUT, ZPRES_INV, &
-         1, 1, INDEX, 1, JPLEV, 'LOG', 'RHU.')
-    DO JLEV=1,JPLEV
-      JKRAD=JPLEV-JLEV+1
-      ZVINT(JKRAD) = ZOUT(JLEV)
-    END DO
-    ZAV(:,1,IIJ)= ZVINT(:) ! temperature K
-    DO JLEV=1,INDEX
-      JKRAD=INDEX-JLEV+1
-      ZFIN(JKRAD) = ZQVSUM(JLEV)
-    END DO
-    CALL PINTER(ZFIN, ZPIN, ZFIN, ZFIN, ZOUT, ZPRES_INV, &
-         1, 1, INDEX, 1, JPLEV, 'LOG', 'RHU.')
-    DO JLEV=1,JPLEV
-      JKRAD=JPLEV-JLEV+1
-      ZVINT(JKRAD) = ZOUT(JLEV)
-    END DO
-    ZAV(:,2,IIJ)= ZVINT(:)*q_mixratio_to_ppmv ! water vapor mr ppmv
-    DO JLEV=1,INDEX
-      JKRAD=INDEX-JLEV+1
-      ZFIN(JKRAD) = ZO3SUM(JLEV)
-    END DO
-    CALL PINTER(ZFIN, ZPIN, ZFIN, ZFIN, ZOUT, ZPRES_INV, &
-         1, 1, INDEX, 1, JPLEV, 'LOG', 'RHU.')
-    DO JLEV=1,JPLEV
-      JKRAD=JPLEV-JLEV+1
-      ZVINT(JKRAD) = ZOUT(JLEV)
-    END DO
-    ZAV(:,3,IIJ)= ZVINT(:)*o3_mixratio_to_ppmv ! ozone mixing ratio  ppmv
-     DO JLEV=1,JPLEV
-       ZAV(JLEV,1,IIJ)= MAX(coef%lim_prfl_tmin(JLEV), &
-            MIN(coef%lim_prfl_tmax(JLEV),ZAV(JLEV,1,IIJ)))
-       ZAV(JLEV,2,IIJ)= MAX(coef%lim_prfl_gmin(JLEV,IWATER), &
-            MIN(coef%lim_prfl_gmax(JLEV,IWATER),ZAV(JLEV,2,IIJ)))
-     END DO
-    DEALLOCATE(ZPIN,ZFIN,ZOUT)
-  END DO
-END DO
-DEALLOCATE(ZVINT)
-DEALLOCATE(ZPAVE,ZTAVE,ZQVAVE,ZO3AVE)
-!
-!--------------------------------------------------------------------------
-!
-!*       6.    CALLS THE RTTOV RADIATION CODE
-!	       ------------------------------
-!
-!*       6.1   INITIALIZES 2D AND SURFACE FIELDS
-!
-!
-ALLOCATE(ZANGS(KDLON))
-ZANGS(:)=0. ! zenithal solar angle not used
-!
-ALLOCATE(IMSURF(KDLON))
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-    IMSURF(IIJ) = NINT(XSEA(JI,JJ)) ! Surface Mask 0=land, 1=sea, 2=sea-ice
-  END DO
-END DO
-!
-ALLOCATE(ZSAV(JPNSAV,KDLON)) ! Surface 2m array contents
-! fields taken at first level rather than at 2m
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-    ZSAV(1,IIJ) = ZTEMP(JI,JJ,IKB) ! 2m temperature (K)
-    ZSAV(2,IIJ) = PRT(JI,JJ,IKB,1)*q_mixratio_to_ppmv ! 2m water vapor (ppmv)
-    ZSAV(3,IIJ) = XP00*0.01 * & !Surface Pressure in hPa
-         (0.5*(ZEXNT(JI,JJ,IKB)+ZEXNT(JI,JJ,IKB-1)))**(XCPD/XRD)
-    ZSAV(4,IIJ) = PULVLKB(JI,JJ) ! 2m wind speed u (m/s)
-    ZSAV(5,IIJ) = PVLVLKB(JI,JJ) ! 2m wind speed v (m/s)
-  END DO
-END DO
-!
-ALLOCATE(ZSSV(JPNSSV,KDLON)) !Surface skin array contents
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-    ZSSV(1,IIJ) =  PTSRAD(JI,JJ)
-    ZSSV(2,IIJ) = 2.3  ! FASTEM-2 land coef (Bare soil see Table 3 svr)
-    ZSSV(3,IIJ) = 1.9  ! FASTEM-2 land coef
-    ZSSV(4,IIJ) = 21.8 ! FASTEM-2 land coef
-    ZSSV(5,IIJ) = 0.0  ! FASTEM-2 land coef
-    ZSSV(6,IIJ) = 0.5  ! FASTEM-2 land coef
-  END DO
-END DO
-!
-!
-ALLOCATE(ZAP(KDLON,IKR))
-DO JK=IKB,IKE
-  JKRAD = IKE-JK+1 !INVERSION OF VERTICAL LEVELS!
-  DO JJ=IJB,IJE
-    DO JI=IIB,IIE
-      IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-      ZAP(IIJ,JKRAD)=PPABST(JI,JJ,JK)*0.01 !Pressure in hPa
-    END DO
-  END DO
-END DO
-!
-!
-ALLOCATE(ZAP_HL(KDLON,IKR+1))
-DO JK=IKB,IKE+1
-  JKRAD = IKE-JK+2 !INVERSION OF VERTICAL LEVELS!
-  DO JJ=IJB,IJE
-    DO JI=IIB,IIE
-      IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-      ZAP_HL(IIJ,JKRAD)=XP00*0.01 * & !Pressure in hPa
-           (0.5*(ZEXNT(JI,JJ,JK)+ZEXNT(JI,JJ,JK-1)))**(XCPD/XRD)
-    END DO
-  END DO
-END DO
-DEALLOCATE(ZEXNT)
-!
-!
-ALLOCATE(ZNCLD(IIU,IJU,IKU))
-ZNCLD=0.
-ALLOCATE(ZRC(IIU,IJU,IKU))
-ZRC=0.
-ALLOCATE(ZRI(IIU,IJU,IKU))
-ZRI=0.
-ALLOCATE(ZRR(IIU,IJU,IKU))
-ZRR=0.
-ALLOCATE(ZRS(IIU,IJU,IKU))
-ZRS=0.
-IF( SIZE(PRT(:,:,:,:),4) >= 3 ) THEN
-  ZRC=PRT(:,:,:,2)
-  ZRR=PRT(:,:,:,3)
-  IF( OUSERI ) THEN
-! ice
-    ZRI=PRT(:,:,:,4)
-    ZRS=PRT(:,:,:,5)+PRT(:,:,:,6)
-  END IF
-  ZNCLD=PCLDFR
-END IF
-
-! temperature and cloud field on full-model levels
-ALLOCATE(ZCV(KDLON,IKR,JPNCVCLD))
-ZCV = 0.
-
-DO JK=IKB,IKE
-  JKRAD = IKE-JK+1 !INVERSION OF VERTICAL LEVELS!
-  DO JJ=IJB,IJE
-    DO JI=IIB,IIE
-      IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-      ZCV(IIJ,JKRAD,1)=ZTEMP(JI,JJ,JK) !Temperature (K)
-      ZCV(IIJ,JKRAD,2)=ZNCLD(JI,JJ,JK) !Cloud cover (fraction)
-      ZCV(IIJ,JKRAD,3)=MIN(ZRCMAX,ZRC(JI,JJ,JK))   !Cloud liquid water (kg/kg)
-      ZCV(IIJ,JKRAD,4)=MIN(ZRIMAX,ZRI(JI,JJ,JK))   !Cloud ice water (kg/kg)
-! rttov_iniscatt modified
-!      ZCV(IIJ,JKRAD,5)=ZRR(JI,JJ,JK)   !rain (kg/m2/s)
-!      ZCV(IIJ,JKRAD,6)=ZRS(JI,JJ,JK)   !solid precipitation (kg/m2/s)
-      ZCV(IIJ,JKRAD,5)=MIN(ZRRMAX,ZRR(JI,JJ,JK))  !rain (kg/kg)
-      ZCV(IIJ,JKRAD,6)=MIN(ZRSMAX,ZRS(JI,JJ,JK))   !solid precipitation (kg/kg)
-    END DO
-  END DO
-END DO
-DEALLOCATE(ZTEMP,ZNCLD,ZRC,ZRI,ZRR,ZRS)
-!
-!
-ALLOCATE(ZREMIS(KDLON))
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-    ZREMIS(IIJ)   = PEMIS(JI,JJ)
-  END DO
-END DO
-!
-ALLOCATE(ZULAT(KDLON))
-ALLOCATE(ZULON(KDLON))
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-    ZULON(IIJ) = XLON(JI,JJ)
-    ZULAT(IIJ) = XLAT(JI,JJ)
-  END DO
-END DO
-!
-!*       6.2   CALLS THE RTTOV ROUTINES
-!
-!
-ALLOCATE( rttov_errorstatus(nprofiles))
-
-! Profiles on RTTOV pressure levels
-ALLOCATE( profiles(nprofiles))
-DO JI = 1, nprofiles
-! allocate model profiles atmospheric arrays with model levels dimension
-  profiles(JI) % nlevels =  coef % nlevels
-  ALLOCATE( profiles(JI) % p  ( coef % nlevels ) )
-  ALLOCATE( profiles(JI) % t  ( coef % nlevels ) )
-  ALLOCATE( profiles(JI) % q  ( coef % nlevels ) )
-  ALLOCATE( profiles(JI) % o3 ( coef % nlevels ) )
-  ALLOCATE( profiles(JI) % clw( coef % nlevels ) )
-  profiles(JI) % p(:) = coef % ref_prfl_p(:)
-END DO
-! Cloud additional profiles
-ALLOCATE( cld_profiles(nprofiles))
-DO JI = 1, nprofiles
-! allocate model profiles atmospheric arrays with model levels dimension
-  cld_profiles(JI) % nlevels =  IKR
-  ALLOCATE( cld_profiles(JI) % p  ( IKR ) )
-  ALLOCATE( cld_profiles(JI) % ph ( IKR+1 ) )
-  ALLOCATE( cld_profiles(JI) % t  ( IKR ) )
-  ALLOCATE( cld_profiles(JI) % cc ( IKR ) )
-  ALLOCATE( cld_profiles(JI) % clw( IKR ) )
-  ALLOCATE( cld_profiles(JI) % ciw( IKR ) )
-  ALLOCATE( cld_profiles(JI) % rain( IKR ) )
-  ALLOCATE( cld_profiles(JI) % sp( IKR ) )
-END DO
-
-! -----------------------------------------------------------------------------
-!              *** LOOP OVER SENSORS ***
-! -----------------------------------------------------------------------------
-DO JSAT=1,IJSAT ! loop over sensors
- 
-  instrument(1)=KRTTOVINFO(1,JSAT)
-  instrument(2)=KRTTOVINFO(2,JSAT)
-  instrument(3)=KRTTOVINFO(3,JSAT)
-  PRINT *,' JSAT=',JSAT, instrument
-
-! Read and initialise coefficients
-! -----------------------------------------------------------------------------
-  CALL rttov_readcoeffs (errorstatus, coef, instrument)
-  IF(errorstatus /= 0) THEN
-    WRITE(*,*) 'error rttov_readcoeffs :',errorstatus
-!callabortstop
-    CALL PRINT_MSG(NVERB_FATAL,'GEN','CALL_RTTOV8','error rttov_readcoeffs')
-  ENDIF
-  CALL rttov_initcoeffs (errorstatus,coef)
-  IF(errorstatus /= 0) THEN
-    WRITE(*,*) 'error rttov_initcoeffs :',errorstatus
-!callabortstop
-    CALL PRINT_MSG(NVERB_FATAL,'GEN','CALL_RTTOV8','error rttov_initcoeffs')
-  ENDIF
-
-  ! Read coef file for cloud/rain absorption/scattering
-  IF( coef% id_sensor == sensor_id_mw) THEN
-    CALL rttov_readscattcoeffs (errorstatus, coef, coef_scatt)
-  ENDIF
-
-  ALLOCATE(ZANGL(KDLON))
-  ZANGL=XUNDEF
-  IF (KRTTOVINFO(1,JSAT) == 1) THEN ! NOAA PLATFORM
-    ZANGL=0.
-  ELSEIF (KRTTOVINFO(1,JSAT) == 2) THEN ! DMSP PLATFORM
-    ZANGL=53.1 ! see Saunders, 2002, RTTOV7 - science/validation rep, page 8
-! METEOSAT PLATFORM
-  ELSEIF (KRTTOVINFO(1,JSAT) == 3) THEN 
-    CALL DETER_ANGLE(5, KDLON, ZULAT, ZULON, ZANGL)
-! Conversion from cosecant to angle (deg)
-    WHERE (ZANGL /= XUNDEF .AND. ZANGL /=0.) ZANGL=ACOS(1./ZANGL)*180./XPI
-! MSG PLATFORM
-  ELSEIF (KRTTOVINFO(1,JSAT) == 12) THEN
-    CALL DETER_ANGLE(6, KDLON, ZULAT, ZULON, ZANGL)
-! Conversion from cosecant to angle (deg)
-    WHERE (ZANGL /= XUNDEF .AND. ZANGL /=0.) ZANGL=ACOS(1./ZANGL)*180./XPI
-  ELSEIF (KRTTOVINFO(1,JSAT) == 4) THEN ! GOES-E PLATFORM
-    CALL DETER_ANGLE(1, KDLON, ZULAT, ZULON, ZANGL)
-! Conversion from cosecant to angle (deg)
-    WHERE (ZANGL /= XUNDEF .AND. ZANGL /=0.) ZANGL=ACOS(1./ZANGL)*180./XPI
-  ELSEIF (KRTTOVINFO(1,JSAT) == 7) THEN ! TRMM PLATFORM
-    ZANGL=52.3 ! see Kummerow et al., J. Appl. Meteorol., Dec. 2000
-  ENDIF
-! Coefficients computed from transmittances for 6 viewing angles in the range 
-! 0 to 63.6 deg (Saunders, 2002, RTTOV7 - science/validation rep., page 3)
-  WHERE (ZANGL > 65.) ZANGL=65.
-
-  ALLOCATE(n_chan(nprofiles))
-  n_chan=coef%fmv_chn
-  CALL rttov_setupchan(nprofiles,n_chan,coef,nfrequencies,nchannels,nbtout)
-
-  ALLOCATE( channels   ( nfrequencies ) )
-  ALLOCATE( lprofiles  ( nfrequencies ) )
-  ALLOCATE( lsprofiles  ( nchannels ) )
-  ALLOCATE( lsprofiles2  ( nbtout ) )
-  ALLOCATE( emissivity ( nchannels ) )
-  ALLOCATE( frequencies ( nchannels ) ) 
-  ALLOCATE( polarisations ( nchannels ,3) )
-  ALLOCATE( input_emissivity ( nchannels ) )
-  ALLOCATE( calcemis  ( nchannels ) )
-
-  ALLOCATE( transmission % tau_surf      ( nchannels ) )
-  ALLOCATE( transmission % tau_layer     ( coef % nlevels, nchannels ) )
-  ALLOCATE( transmission % od_singlelayer( coef % nlevels, nchannels ) )
-
-  calcemis(1:nchannels)              = .TRUE.
-  input_emissivity(1:nchannels)      = 0.5
-  emissivity(1:nchannels)            = 0.
-
-! allocate radiance results arrays with number of channels
-  ALLOCATE( radiance % clear    ( nchannels ) )
-  ALLOCATE( radiance % cloudy   ( nchannels ) )
-  ALLOCATE( radiance % total    ( nchannels ) )
-  ALLOCATE( radiance % bt       ( nchannels ) )
-  ALLOCATE( radiance % bt_clear ( nchannels ) )
-  ALLOCATE( radiance % upclear  ( nchannels ) )
-  ALLOCATE( radiance % dnclear  ( nchannels ) )
-  ALLOCATE( radiance % reflclear( nchannels ) )
-  ALLOCATE( radiance % overcast ( IKR, nchannels ) )
-  ALLOCATE( radiance % downcld  ( IKR, nchannels ) )
-  ALLOCATE( radiance % cldemis  ( IKR, nchannels ) )
-  ALLOCATE( radiance % wtoa     ( IKR, nchannels ) )
-  ALLOCATE( radiance % wsurf    ( IKR, nchannels ) )
-  ALLOCATE( radiance % cs_wtoa  ( nchannels ) )
-  ALLOCATE( radiance % cs_wsurf ( nchannels ) )
-  ALLOCATE( radiance % out  ( nbtout ) )
-  ALLOCATE( radiance % out_clear( nbtout ) )
-  ALLOCATE( radiance % total_out( nbtout ) )
-  ALLOCATE( radiance % clear_out( nbtout ) )
-  ALLOCATE( radiance % freq_used( nchannels) )
-
-! Allocate new profiles for K code
-  IF ( KRTTOVINFO(4,JSAT) == 1 .OR. KRTTOVINFO(4,JSAT) == 3) THEN
-! Profiles on RTTOV pressure levels
-    ALLOCATE( profiles_k(nchannels))
-    DO JI = 1, nchannels
-! allocate model profiles atmospheric arrays with model levels dimension
-      profiles_k(JI) % nlevels =  coef % nlevels
-      ALLOCATE( profiles_k(JI) % p  ( coef % nlevels ) )
-      ALLOCATE( profiles_k(JI) % t  ( coef % nlevels ) )
-      ALLOCATE( profiles_k(JI) % q  ( coef % nlevels ) )
-      ALLOCATE( profiles_k(JI) % o3 ( coef % nlevels ) )
-      ALLOCATE( profiles_k(JI) % clw( coef % nlevels ) )
-      profiles_k(JI) % p(:) = coef % ref_prfl_p(:)
-    END DO
-! Cloud additional profiles
-    ALLOCATE( cld_profiles_k(nchannels))
-    DO JI = 1, nchannels
-! allocate model profiles atmospheric arrays with model levels dimension
-      cld_profiles_k(JI) % nlevels =  IKR
-      ALLOCATE( cld_profiles_k(JI) % p  ( IKR ) )
-      ALLOCATE( cld_profiles_k(JI) % ph ( IKR+1 ) )
-      ALLOCATE( cld_profiles_k(JI) % t  ( IKR ) )
-      ALLOCATE( cld_profiles_k(JI) % cc ( IKR ) )
-      ALLOCATE( cld_profiles_k(JI) % clw( IKR ) )
-      ALLOCATE( cld_profiles_k(JI) % ciw( IKR ) )
-    END DO
-    ALLOCATE( emissivity_k( nchannels ))
-  END IF
-
-
-! fixed values
-  profiles(1:nprofiles) % ozone_data = .TRUE. 
-  profiles(1:nprofiles) % co2_data   = .FALSE.
-  profiles(1:nprofiles) % clw_data   = .FALSE.
-  profiles(1:nprofiles) % s2m % o    = 0.
-  profiles(1:nprofiles) % azangle    = 0. !!!!!! WARNING
-  profiles(1:nprofiles) % ctp        = 500._JPRB  ! default value
-  profiles(1:nprofiles) % cfraction  = 0._JPRB    ! default value
-! See rttov_emiscld.F90
-  cld_profiles(1:nprofiles) % kice   = 0          ! Hexagonal columns
-!  cld_profiles(1:nprofiles) % kice   = 1          ! Aggregates
-!  cld_profiles(1:nprofiles) % kradip = 0          ! Ou-Liou
-!  cld_profiles(1:nprofiles) % kradip = 1          ! Wyser
-!  cld_profiles(1:nprofiles) % kradip = 2          ! Boudala et al.
-  cld_profiles(1:nprofiles) % kradip = 3          ! McFarquhar
-    
-  PRINT *,'cld_profiles % kice = ',cld_profiles(1) % kice
-  PRINT *,'cld_profiles % kradip = ',cld_profiles(1) % kradip
-   
-  CALL rttov_setupindex (n_chan,nprofiles,nfrequencies,nchannels,nbtout,coef, &
-       & input_emissivity,lprofiles,channels,polarisations,emissivity) 
-
-!!! Set up remaining indices
-  IF( coef% id_sensor == sensor_id_mw) &
-       CALL rttov_scatt_setupindex (nprofiles,n_chan,coef,nchannels, &
-       & lsprofiles, lsprofiles2, frequencies,nbtout)
-
-!!! METEOSAT, GOES, OR MSG PLATFORM
-  IF (KRTTOVINFO(1,JSAT) == 3 .OR. KRTTOVINFO(1,JSAT) == 4 &
-       .OR. KRTTOVINFO(1,JSAT) == 12) &
-       calcemis(1:nchannels) = .FALSE.
-
-
-  ALLOCATE(GANGL(KDLON))
-  GANGL(:) = .TRUE.
-  WHERE( ZANGL(:) == XUNDEF) 
-    GANGL(:) = .FALSE.
-  END WHERE
-
-  IDIM = COUNT( GANGL(:) )  ! number of columns with a defined sat angle
-
-  ALLOCATE(ZANGLP(IDIM))
-  ZANGLP  = PACK( ZANGL,MASK=GANGL )
-
-  ALLOCATE(ZAVP(JPLEV,JPNAV,IDIM))
-  DO JC=1,JPNAV
-    DO JK=1,JPLEV
-      ZAVP(JK,JC,:)  = PACK( ZAV(JK,JC,:),MASK=GANGL )
-    END DO
-  END DO
-
-  ALLOCATE(ZSAVP(JPNSAV,IDIM)) 
-  DO JK=1,JPNSAV
-    ZSAVP(JK,:) = PACK( ZSAV(JK,:),MASK=GANGL )
-  END DO
-
-  ALLOCATE(IMSURFP(IDIM))
-  IMSURFP  = PACK( IMSURF,MASK=GANGL )
-
-  ALLOCATE(ZSSVP(JPNSSV,IDIM)) 
-  DO JK=1,JPNSSV
-    ZSSVP(JK,:)  = PACK( ZSSV(JK,:),MASK=GANGL )
-  END DO
-
-  ALLOCATE(ZCVP(IDIM,IKR,JPNCVCLD))
-  DO JC=1,JPNCVCLD
-    DO JK=1,IKR
-      ZCVP(:,JK,JC)  = PACK( ZCV(:,JK,JC),MASK=GANGL )
-    END DO
-  END DO
-
-  ALLOCATE(ZAPP(IDIM,IKR))
-  DO JK=1,IKR
-    ZAPP(:,JK)  = PACK( ZAP(:,JK),MASK=GANGL )
-  END DO
-
-  ALLOCATE(ZAP_HLP(IDIM,IKR+1))
-  DO JK=1,IKR+1
-    ZAP_HLP(:,JK)  = PACK( ZAP_HL(:,JK),MASK=GANGL )
-  END DO
-
-  ALLOCATE(ZREMISP(IDIM))
-  ZREMISP  = PACK( ZREMIS,MASK=GANGL )
-
-  ALLOCATE(ZZTMP(coef%fmv_chn,KDLON))
-  ALLOCATE(ZZTMPP(coef%fmv_chn,IDIM))
-  ZZTMP=XUNDEF
-  ZZTMPP=XUNDEF
-
-  IF ( KRTTOVINFO(4,JSAT) == 1 .OR. KRTTOVINFO(4,JSAT) == 3) THEN
-    ALLOCATE(ZTEMPKP(coef%fmv_chn,KDLON,JPLEV))
-    ALLOCATE(ZTEMPKPP(coef%fmv_chn,IDIM,JPLEV))
-    ALLOCATE(ZWVAPKP(coef%fmv_chn,KDLON,JPLEV))
-    ALLOCATE(ZWVAPKPP(coef%fmv_chn,IDIM,JPLEV))
-    ZTEMPKP=XUNDEF
-    ZTEMPKPP=XUNDEF
-    ZWVAPKP=XUNDEF
-    ZWVAPKPP=XUNDEF
-  ENDIF
-    
-  DO JIS=1,IDIM,nprofiles
-    IBEG = JIS
-    IEND = MIN(JIS+nprofiles-1,IDIM)
-    ntruepro=IEND-IBEG+1
-
-    ICPT=IBEG
-    DO JI=1,ntruepro
-      profiles(JI) % t(:) = ZAVP(:,1,ICPT)
-      profiles(JI) % q(:) = ZAVP(:,2,ICPT)
-      profiles(JI) % o3(:) = ZAVP(:,3,ICPT)
-! Surface
-      profiles(JI) % s2m % p = ZSAVP(3,ICPT)
-      profiles(JI) % s2m % q = ZSAVP(2,ICPT)
-      profiles(JI) % s2m % t = ZSAVP(1,ICPT)
-      profiles(JI) % s2m % u = ZSAVP(4,ICPT)
-      profiles(JI) % s2m % v = ZSAVP(5,ICPT)
-      profiles(JI) % skin % surftype = IMSURFP(ICPT)
-      profiles(JI) % skin % t = ZSSVP(1,ICPT)
-      profiles(JI) % skin % fastem(:) = &
-! RTTOV 8.5 example
-!        (/ 3.0_JPRB, 5.0_JPRB, 15.0_JPRB, 0.1_JPRB, 0.3_JPRB /)
-! Bare soil see Table 3 svr rttov7)
-         (/ 2.3_JPRB, 1.9_JPRB, 21.8_JPRB, 0.0_JPRB, 0.5_JPRB /)
-! Angles
-      profiles(JI) % zenangle   = ZANGLP(ICPT)
-! Cloudy atmosphere on Meso-NH levels
-      cld_profiles(JI) % p  (:) = ZAPP(ICPT,:)
-      cld_profiles(JI) % ph (:) = ZAP_HLP(ICPT,:)
-      cld_profiles(JI) % t  (:) = ZCVP(ICPT,:,1)
-      cld_profiles(JI) % cc (:) = ZCVP(ICPT,:,2)
-      cld_profiles(JI) % clw(:) = ZCVP(ICPT,:,3)
-      cld_profiles(JI) % ciw(:) = ZCVP(ICPT,:,4)
-      cld_profiles(JI) % rain(:) = ZCVP(ICPT,:,5)
-      cld_profiles(JI) % sp(:) = ZCVP(ICPT,:,6)
-      ICPT=ICPT+1
-    END DO
-
-    ICAN=0
-    ICPT=IBEG
-    DO JI=1,ntruepro
-      DO JCH=1,coef%fmv_chn
-        ICAN=ICAN+1
-        IF (.NOT.calcemis(ICAN)) emissivity(ICAN) = ZREMISP(ICPT)
-      END DO
-      ICPT=ICPT+1
-    END DO
-
-    IF( coef% id_sensor /= sensor_id_mw) THEN
-      CALL rttov_cld( &
-               & rttov_errorstatus,  &! out
-               & nfrequencies,   &! in
-               & nchannels,      &! in
-               & nbtout,         &! in
-               & nprofiles,      &! in
-               & channels,       &! in
-               & polarisations,  &! in
-               & lprofiles,      &! in
-               & profiles,       &! inout  (to invalid clw absorption)
-               & cld_profiles,   &! in
-               & coef,           &! in
-               & calcemis,       &! in
-               & emissivity,     &! inout
-               & radiance )       ! inout
-    ELSE
-      iwp_levels=IKR
-      CALL rttov_scatt( &
-               & rttov_errorstatus,  &! out
-               & iwp_levels, & ! in
-               & coef%nlevels, & ! in
-               & nfrequencies,   &! in
-               & nchannels,      &! in
-               & nbtout,         &! in
-               & nprofiles,      &! in
-               & polarisations,  &! in
-               & channels,           & ! in
-               & frequencies,        & ! in
-               & lprofiles,      &! in
-               & lsprofiles,         & ! in
-               & profiles,       &! inout  (to invalid clw absorption)
-               & cld_profiles,   &! in
-               & coef,           &! in
-               & coef_scatt,     &! in
-               & calcemis,       &! in
-               & emissivity,     &! inout
-               & radiance )       ! inout
-    END IF
-
-    IF (INRAD==1) THEN
-! cloudy radiance for given cloud
-      ICAN=0
-      ICPT=IBEG
-      DO JI=1,ntruepro
-        DO JCH=1,coef%fmv_chn
-          ICAN=ICAN+1
-          ZZTMPP(JCH,ICPT) = radiance%total_out (ICAN) 
-        END DO
-        ICPT=ICPT+1
-      END DO
-    ELSE
-! BT equivalent to total radiance
-      ICAN=0
-      ICPT=IBEG
-      DO JI=1,ntruepro
-        DO JCH=1,coef%fmv_chn
-          ICAN=ICAN+1
-          ZZTMPP(JCH,ICPT) = radiance%out (ICAN) 
-        END DO
-        ICPT=ICPT+1
-      END DO
-    ENDIF
-!   PRINT *,'size',coef%fmv_chn,IDIM,KDLON,SIZE(ZZTMPP,1),SIZE(ZZTMPP,2)
-!   PRINT *,'ZZTMP min/max ',MINVAL(ZZTMPP(:,:)),MAXVAL(ZZTMPP(:,:))
-
-
-! Calling for K code
-    IF ( KRTTOVINFO(4,JSAT) == 1 .OR. KRTTOVINFO(4,JSAT) == 3) THEN
-!!!    IF (JIS==1) THEN
-!!      IF( coef% id_sensor /= sensor_id_mw) THEN
-      CALL rttov_cld_k  ( &
-           & rttov_errorstatus,     &! out
-           & nfrequencies,    &! in
-           & nchannels,       &! in
-           & nbtout,          &! in
-           & nprofiles,       &! in
-           & channels,        &! in
-           & polarisations,   &! in
-           & lprofiles,       &! in
-           & profiles,        &! in
-           & cld_profiles,    &! in
-           & coef,            &! in
-           & switchrad,       &! in
-           & calcemis,        &! in
-           & emissivity,      &! inout
-           & profiles_k ,     &! inout
-           & cld_profiles_k , &! inout
-           & emissivity_k ,   &! inout
-           & radiance)         ! inout
-!!!      ENDIF
-
-      ICAN=0
-      ICPT=IBEG
-      DO JI=1,ntruepro
-        DO JCH=1,coef%fmv_chn
-          ICAN=ICAN+1
-          DO JK=1,JPLEV
-            ZTEMPKPP(JCH,ICPT,JK) = profiles_k(ICAN) % t (JK) 
-            ZWVAPKPP(JCH,ICPT,JK) = profiles_k(ICAN) % q (JK) 
-          END DO
-        END DO
-        ICPT=ICPT+1
-      END DO
-!       DO JK=1,JPLEV
-!         PRINT *,JK,' temp ',MINVAL(ZTEMPKPP(:,:,JK)),MAXVAL(ZTEMPKPP(:,:,JK))
-!         PRINT *,JK,' vap ',MINVAL(ZWVAPKPP(:,:,JK)),MAXVAL(ZWVAPKPP(:,:,JK))
-!       END DO
-    END IF
-  END DO
-! Unpack the vector
-  DO JCH=1,coef%fmv_chn
-    ZZTMP(JCH,:)  = UNPACK( ZZTMPP(JCH,:), MASK=GANGL, FIELD=XUNDEF )
-  END DO
-  DEALLOCATE(ZZTMPP,ZANGLP)
-  DEALLOCATE(ZAVP,ZSAVP,IMSURFP,ZSSVP,ZCVP,ZAPP,ZAP_HLP,ZREMISP)
-! -----------------------------------------------------------------------------
-! Generate angle and BT images
-  ALLOCATE(ZANTMP(IIU,IJU))
-  ZANTMP = XUNDEF
-  ALLOCATE(ZTBTMP(IIU,IJU,coef%fmv_chn))
-  ZTBTMP = XUNDEF
-  DO JJ=IJB,IJE
-    DO JI=IIB,IIE
-      IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-      ZANTMP(JI,JJ) = ZANGL(IIJ)
-      ZTBTMP(JI,JJ,:) = ZZTMP(:,IIJ)
-    END DO
-  END DO
-  DEALLOCATE(ZANGL,ZZTMP)
-! -----------------------------------------------------------------------------
-  IF ( KRTTOVINFO(4,JSAT) == 1 .OR. KRTTOVINFO(4,JSAT) == 3) THEN
-    DO JCH=1,coef%fmv_chn
-      DO JK=1,JPLEV
-        ZTEMPKP(JCH,:,JK)=UNPACK(ZTEMPKPP(JCH,:,JK),MASK=GANGL,FIELD=XUNDEF )
-        ZWVAPKP(JCH,:,JK)=UNPACK(ZWVAPKPP(JCH,:,JK),MASK=GANGL,FIELD=XUNDEF )
-      END DO
-    END DO
-    DEALLOCATE(ZTEMPKPP,ZWVAPKPP)
-  ENDIF
-! -----------------------------------------------------------------------------
-  IF (KRTTOVINFO(3,JSAT) == 20) THEN ! MVIRI
-    YINST='MVIRI'
-!    YINST=inst_name(KRTTOVINFO(3,JSAT))
-!    DO JK1=1,LEN_TRIM(inst_name(KRTTOVINFO(3,JSAT)))
-!      YINST(JK1:JK1)=CHAR(ICHAR(YINST(JK1:JK1))-32)
-!    END DO
-    TZFIELD = TFIELDMETADATA(            &
-      CMNHNAME   = TRIM(YINST)//'_ANGL', &
-      CSTDNAME   = '',                   &
-      CLONGNAME  = TRIM(YINST)//'_ANGL', &
-      CUNITS     = 'degree',             &
-      CDIR       = 'XY',                 &
-      CCOMMENT   = TRIM(YINST)//' ANGLE' &
-      NGRID      = 1,                    &
-      NTYPE      = TYPEREAL,             &
-      NDIMS      = 2,                    &
-      LTIMEDEP   = .TRUE.                )
-    PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT
-    CALL IO_Field_write(TPFILE,TZFIELD,ZANTMP)
-  END IF
-  DEALLOCATE(ZANTMP)
-! -----------------------------------------------------------------------------
-  YBEG='    '
-  IF (KRTTOVINFO(1,JSAT) <= 2 .OR. KRTTOVINFO(1,JSAT) == 4) THEN ! NOAA
-    WRITE(YTWO,'(I2.2)') KRTTOVINFO(2,JSAT)
-    YBEG=TRIM(YPLAT(KRTTOVINFO(1,JSAT)))//YTWO
-  ELSEIF (KRTTOVINFO(1,JSAT) <= JPPLAT) THEN
-    WRITE(YONE,'(I1.1)') KRTTOVINFO(2,JSAT)
-    YBEG=TRIM(YPLAT(KRTTOVINFO(1,JSAT)))//YONE
-  ELSE
-    YBEG='XXXX'
-  END IF
-  WRITE(YTWO,'(I2.2)') KRTTOVINFO(3,JSAT)
-!*JPC*VECTORIZATION
-!  DO JCH=1,nbtout
-  DO JCH=1,coef%fmv_chn
-!*JPC*VECTORIZATION
-    YEND='    '
-    WRITE(YCHAN,'(I2.2)') JCH
-    IF (KRTTOVINFO(3,JSAT) == 0) THEN ! HIRS
-      YEND='H'//YCHAN
-    ELSEIF (KRTTOVINFO(3,JSAT) == 3) THEN ! AMSU-A
-      YEND='A'//YCHAN
-    ELSEIF (KRTTOVINFO(3,JSAT) == 4) THEN ! AMSU-B
-      YEND='B'//YCHAN
-    ELSEIF (KRTTOVINFO(3,JSAT) == 6) THEN ! SSMI
-      YEND=YLBL_SSMI(JCH)
-    ELSEIF (KRTTOVINFO(3,JSAT) == 9) THEN ! TMI
-      YEND=YLBL_TMI(JCH)
-    ELSEIF (KRTTOVINFO(3,JSAT) == 20) THEN ! MVIRI
-      YEND=YLBL_MVIRI(JCH)
-    ELSEIF (KRTTOVINFO(3,JSAT) == 21) THEN ! SEVIRI
-      YEND=YLBL_SEVIRI(JCH)
-    ELSEIF (KRTTOVINFO(3,JSAT) == 22) THEN ! GOES-I
-      YEND=YLBL_GOESI(JCH)
-    ELSE
-      YEND=YTWO//YCHAN
-    END IF
-    IF (INRAD==1) THEN
-      YMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'rad'
-      YUNITS     = 'mw/cm-1/ster/sq.m'
-      YCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' rad'
-    ELSE
-      YMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'BT'
-      YUNITS     = 'K'
-      YCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' BT'
-    ENDIF
-    TZFIELD = TFIELDMETADATA(        &
-      CMNHNAME   = TRIM( YMNHNAME ), &
-      CSTDNAME   = '',               &
-      CLONGNAME  = TRIM( YMNHNAME ), &
-      CUNITS     = TRIM( YUNITS ),   &
-      CDIR       = 'XY',             &
-      CCOMMENT   = TRIM( YCOMMENT ), &
-      NGRID      = 1,                &
-      NTYPE      = TYPEREAL,         &
-      NDIMS      = 2,                &
-      LTIMEDEP   = .TRUE.            )
-    PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT, &
-         MINVAL(ZTBTMP(:,:,JCH),ZTBTMP(:,:,JCH)/=XUNDEF), &
-         MAXVAL(ZTBTMP(:,:,JCH),ZTBTMP(:,:,JCH)/=XUNDEF)
-    CALL IO_Field_write(TPFILE,TZFIELD,ZTBTMP(:,:,JCH))
-    IF (KRTTOVINFO(3,JSAT) == 4.AND. JCH==3 ) THEN ! AMSU-B
-      TZFIELD = TFIELDMETADATA(          &
-        CMNHNAME   = TRIM(YBEG)//'_UTH', &
-        CSTDNAME   = '',                 &
-        CLONGNAME  = TRIM(YBEG)//'_UTH', &
-        CUNITS     = 'percent',          &
-        CDIR       = 'XY',               &
-        CCOMMENT   = TRIM(YBEG)//'_UTH', &
-        NGRID      = 1,                  &
-        NTYPE      = TYPEREAL,           &
-        NDIMS      = 2,                  &
-        LTIMEDEP   = .TRUE.              )
-! UTH computation from Buehler and John JGR 2005
-      ZZH= 833000. ! (m) nominal altitude of the satellite
-      zdeg_to_rad = XPI / 180.0
-      zrad_to_deg = 180.0 / XPI
-      zbeta = zdeg_to_rad*0.55 ! angle of incident radiation
-! viewing angle alpha
-      zalpha = zrad_to_deg*ASIN(XRADIUS/(XRADIUS+zzh)*SIN(zbeta))
-      ALLOCATE(ZUTH(IIU,IJU))
-      ZUTH = XUNDEF
-      DO JJ=IJB,IJE
-        DO JI=IIB,IIE
-          IF (ZTBTMP(JI,JJ,JCH)/=XUNDEF) THEN
-            ZUTH(JI,JJ) = 100.*COS(zdeg_to_rad*zalpha)   &
-                 *EXP(18.341-0.0764737*ZTBTMP(JI,JJ,JCH))
-          END IF
-        END DO
-      END DO
-      CALL IO_Field_write(TPFILE,TZFIELD,ZUTH)
-      DEALLOCATE(ZUTH)
-    END IF
-  END DO
-! -----------------------------------------------------------------------------
-! Jacobian fields
-  IF ( KRTTOVINFO(4,JSAT) == 1 .OR. KRTTOVINFO(4,JSAT) == 3) THEN
-    ALLOCATE(ZTEMPK(IIU,IJU,IKU))
-    ALLOCATE(ZWVAPK(IIU,IJU,IKU))
-    ALLOCATE(ZFIN(JPLEV))
-    DO JCH=1,coef%fmv_chn
-      YEND='    '
-      WRITE(YCHAN,'(I2.2)') JCH
-      IF (KRTTOVINFO(3,JSAT) == 0) THEN ! HIRS
-        YEND='H'//YCHAN
-      ELSEIF (KRTTOVINFO(3,JSAT) == 3) THEN ! AMSU-A
-        YEND='A'//YCHAN
-      ELSEIF (KRTTOVINFO(3,JSAT) == 4) THEN ! AMSU-B
-        YEND='B'//YCHAN
-      ELSEIF (KRTTOVINFO(3,JSAT) == 6) THEN ! SSMI
-        YEND=YLBL_SSMI(JCH)
-      ELSEIF (KRTTOVINFO(3,JSAT) == 9) THEN ! TMI
-        YEND=YLBL_TMI(JCH)
-      ELSEIF (KRTTOVINFO(3,JSAT) == 20) THEN ! MVIRI
-        YEND=YLBL_MVIRI(JCH)
-      ELSEIF (KRTTOVINFO(3,JSAT) == 21) THEN ! SEVIRI
-        YEND=YLBL_SEVIRI(JCH)
-      ELSEIF (KRTTOVINFO(3,JSAT) == 22) THEN ! GOES-I
-        YEND=YLBL_GOESI(JCH)
-      ELSE
-        YEND=YTWO//YCHAN
-      END IF
-      ZTEMPK = XUNDEF
-      ZWVAPK = XUNDEF
-      DO JJ=IJB,IJE
-        DO JI=IIB,IIE
-          IIJ = (JI-JPHEXT) + (IIE-IIB+1)*(JJ-IJB)
-          DO JK=1,JPLEV
-            JKRAD=JPLEV-JK+1
-            ZFIN(JK)=ZTEMPKP(JCH,IIJ,JKRAD)
-          END DO
-          CALL PINTER(ZFIN, ZPRES_INV, ZFIN, ZFIN, &
-               ZTEMPK(JI,JJ,IKB:IKE), PPABST(JI,JJ,IKB:IKE), &
-               1, 1, JPLEV, 1, IKR, 'LOG', 'RHU.')
-          DO JK=1,JPLEV
-            JKRAD=JPLEV-JK+1
-            ZFIN(JK)=ZWVAPKP(JCH,IIJ,JKRAD)
-          END DO
-          CALL PINTER(ZFIN, ZPRES_INV, ZFIN, ZFIN, &
-               ZWVAPK(JI,JJ,IKB:IKE), PPABST(JI,JJ,IKB:IKE), &
-               1, 1, JPLEV, 1, IKR, 'LOG', 'RHU.')
-        END DO
-      END DO
-      !
-      TZFIELD = TFIELDMETADATA(                              &
-        CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT',     &
-        CSTDNAME   = '',                                     &
-        CLONGNAME  = TRIM(YBEG)//'_'//TRIM(YEND)//'JAT',     &
-        CUNITS     = 'K K-1',                                &
-        CDIR       = 'XY',                                   &
-        CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' JATEMP', &
-        NGRID      = 1,                                      &
-        NTYPE      = TYPEREAL,                               &
-        NDIMS      = 2,                                      &
-        LTIMEDEP   = .TRUE.                                  )
-      PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT, &
-           MINVAL(ZTEMPK(:,:,:),ZTEMPK(:,:,:)/=XUNDEF), &
-           MAXVAL(ZTEMPK(:,:,:),ZTEMPK(:,:,:)/=XUNDEF)
-      CALL IO_Field_write(TPFILE,TZFIELD,ZTEMPK(:,:,:))
-      !
-      TZFIELD = TFIELDMETADATA(                              &
-        CMNHNAME   = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV',     &
-        CSTDNAME   = '',                                     &
-        CLONGNAME  = TRIM(YBEG)//'_'//TRIM(YEND)//'JAV',     &
-        CUNITS     = 'K',                                    &
-        CDIR       = 'XY',                                   &
-        CCOMMENT   = TRIM(YBEG)//'_'//TRIM(YEND)//' JAWVAP', &
-        NGRID      = 1,                                      &
-        NTYPE      = TYPEREAL,                               &
-        NDIMS      = 2,                                      &
-        LTIMEDEP   = .TRUE.                                  )
-      WHERE (ZWVAPK(:,:,:) /= XUNDEF) &
-           ZWVAPK(:,:,:)=ZWVAPK(:,:,:)*(-0.1*PRT(:,:,:,1))
-      PRINT *,TZFIELD%CMNHNAME//TZFIELD%CCOMMENT, &
-           MINVAL(ZWVAPK(:,:,:),ZWVAPK(:,:,:)/=XUNDEF), &
-           MAXVAL(ZWVAPK(:,:,:),ZWVAPK(:,:,:)/=XUNDEF)
-      CALL IO_Field_write(TPFILE,TZFIELD,ZWVAPK(:,:,:))
-    END DO
-    DEALLOCATE(ZTEMPKP,ZWVAPKP,ZFIN)
-  ENDIF
-! -----------------------------------------------------------------------------
-  DEALLOCATE(GANGL,ZTBTMP)
-  DEALLOCATE(channels,lprofiles,lsprofiles,lsprofiles2,emissivity,frequencies)
-  DEALLOCATE(n_chan,polarisations,input_emissivity,calcemis)
-  DEALLOCATE( transmission % tau_surf   )
-  DEALLOCATE( transmission % tau_layer  )
-  DEALLOCATE( transmission % od_singlelayer )
-  DEALLOCATE(radiance % clear)
-  DEALLOCATE( radiance % cloudy)
-  DEALLOCATE( radiance % total )
-  DEALLOCATE( radiance % bt )
-  DEALLOCATE( radiance % bt_clear )
-  DEALLOCATE( radiance % upclear )
-  DEALLOCATE( radiance % dnclear )
-  DEALLOCATE( radiance % reflclear )
-  DEALLOCATE( radiance % overcast )
-  DEALLOCATE( radiance % downcld )
-  DEALLOCATE( radiance % cldemis  )
-  DEALLOCATE( radiance % wtoa   )
-  DEALLOCATE( radiance % wsurf   )
-  DEALLOCATE( radiance % cs_wtoa  )
-  DEALLOCATE( radiance % cs_wsurf )
-  DEALLOCATE( radiance % out )
-  DEALLOCATE( radiance % out_clear )
-  DEALLOCATE( radiance % total_out )
-  DEALLOCATE( radiance % clear_out )
-  IF ( KRTTOVINFO(4,JSAT) == 1 .OR. KRTTOVINFO(4,JSAT) == 3) THEN
-    DEALLOCATE(ZTEMPK,ZWVAPK)
-    DEALLOCATE( profiles_k)
-    DEALLOCATE( cld_profiles_k)
-    DEALLOCATE( emissivity_k)
-  ENDIF
-END DO
-DEALLOCATE(ZULAT,ZULON,ZANGS,IMSURF)
-DEALLOCATE(ZAV,ZSAV,ZSSV,ZCV,ZAP,ZAP_HL)
-#else
-PRINT *, "RTTOV 8.7 LIBRARY NOT AVAILABLE = ###CALL_RTTOV8####"
-#endif
-!
-END SUBROUTINE CALL_RTTOV8
diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90
index 091e1faa0382764d736761b84ebad58a5bc58bea..9c51049af75258c04ed198e1930161d63e4c1722 100644
--- a/src/MNH/default_desfmn.f90
+++ b/src/MNH/default_desfmn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2024 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.
@@ -226,6 +226,7 @@ END MODULE MODI_DEFAULT_DESFM_n
 !  Delbeke/Vie    03/2022: KHKO option in LIMA
 !  P. Wautelet 27/04/2022: add namelist for profilers
 !  PA. Joulin     04/2023: add EOL/ADR
+!  V. Masson      01/2024: aggregation of columns for radiation
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index c37f6136c83fb3621712f9a34aee2fdd133e69cd..fd25ea531d56d9849962cdda587f46d2bebd84c6 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -199,7 +199,7 @@ REAL, DIMENSION(:,:,:,:),ALLOCATABLE          :: ZWETDEPAER
 TYPE(TFILEDATA),POINTER :: TZNMLFILE  => NULL() !Namelist file
 !
 NAMELIST/NAM_DIAG/ CISO, LVAR_RS, LVAR_LS,   &
-                   NCONV_KF, NRAD_3D, CRAD_SAT, NRTTOVINFO, LRAD_SUBG_COND,  &
+                   NCONV_KF, NRAD_3D, NRTTOVINFO, LRAD_SUBG_COND,  &
                    LVAR_TURB,LTURBFLX,LTURBDIAG,LMFFLX,XDTSTEP,  &
                    LVAR_MRW, LVAR_MRSV, LVAR_FRC, &
                    LTPZH, LMOIST_V, LMOIST_E,LMOIST_ES, & 
@@ -248,7 +248,6 @@ LVAR_RS=.TRUE.
 LVAR_LS=.FALSE.
 NCONV_KF=-1
 NRAD_3D=-1
-CRAD_SAT='                                            '
 LRAD_SUBG_COND=.TRUE.
 NRTTOVINFO(:,:)=NUNDEF
 LVAR_TURB=.FALSE.
@@ -567,10 +566,6 @@ IF (NRAD_3D >= 0) THEN
   END IF
 END IF
 !
-IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. YRAD/='ECMW') THEN
-  CRAD = 'ECMW'
-END IF
-!
 !
 IF ( CTURB /= 'NONE' .OR. CDCONV /= 'NONE' .OR. CSCONV /= 'NONE' &                 
      .OR. CRAD /= 'NONE' ) THEN
diff --git a/src/MNH/ecrad_interface.f90 b/src/MNH/ecrad_interface.f90
index 19830f9896f118c40384137108b54baf9a1eed3d..96a2821ab84e8e6311a5faaebf36905008090891 100644
--- a/src/MNH/ecrad_interface.f90
+++ b/src/MNH/ecrad_interface.f90
@@ -441,6 +441,7 @@ CALL RADIATION_SCHEME  (IKIDIA, IKFDIA,KLON, KLEV, IAER, &
         PAP, PT, PAPH, PTH, &
         PQ, ZCCO2, ZCCH4, ZCN2O, ZCNO2, ZCCFC11, ZCCFC12, ZCCFC22, ZCCCL4, ZOZON, &
         PCLFR, PQLWC, PQIWC, PQRWC, ZQSWC, &
+        PCCT_C2R2, PCRT_C2R2, PCIT_C1R3,     &        
         ZAEROSOL_OLD, ZAEROSOL, &
         ZFLUX_SW, ZFLUX_LW, ZFLUX_SW_CLEAR, ZFLUX_LW_CLEAR, &
         ZFLUX_SW_SURF, ZFLUX_LW_SURF, ZFLUX_SW_SURF_CLEAR, ZFLUX_LW_SURF_CLEAR, &
diff --git a/src/MNH/ground_paramn.f90 b/src/MNH/ground_paramn.f90
index 6d135c72c053f1094f5978b6deb5fd48d6f4f802..79aeb4ff4470f358b595d3a0a989095c3b092db8 100644
--- a/src/MNH/ground_paramn.f90
+++ b/src/MNH/ground_paramn.f90
@@ -226,6 +226,7 @@ USE MODI_MNH_OASIS_SEND
 #ifdef MNH_FOREFIRE
 USE MODI_COUPLING_FOREFIRE_n
 #endif
+USE MODI_COUPLING_SURF_ATM_MULTI_LEVEL_n
 !
 IMPLICIT NONE
 !
diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90
index a5ed1e2d4eb85a0fc8a6255941442b5bd135bbc3..93bc1ab1e36a082e94ef0b3e7dbdfb686896ad60 100644
--- a/src/MNH/ini_budget.f90
+++ b/src/MNH/ini_budget.f90
@@ -1964,9 +1964,20 @@ if ( tbudgets(NBUDGET_RR)%lenabled ) then
   tzsource%lavailable = ohorelax_rr
   call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
 
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
+
   tzsource%cmnhname   = 'NETUR'
   tzsource%clongname  = 'negativity correction induced by turbulence'
-  tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
+  tzsource%lavailable = hturb == 'TKEL' .and. (                            hcloud == 'ICE3' .or. hcloud == 'ICE4' &
+                                                .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
   call Budget_source_add( tbudgets(NBUDGET_RR), tzsource )
 
   tzsource%cmnhname   = 'VISC'
@@ -2451,11 +2462,20 @@ if ( tbudgets(NBUDGET_RS)%lenabled ) then
   tzsource%lavailable = ohorelax_rs
   call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
 
-!   tzsource%cmnhname   = 'NETUR'
-!   tzsource%clongname  = 'negativity correction induced by turbulence'
-!   tzsource%lavailable = hturb == 'TKEL' .and. (      hcloud == 'ICE3' .or. hcloud == 'ICE4' &
-!                                   .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
-!   call Budget_source_add( tbudgets(NBUDGET_RS), tzsource nneturrs )
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
+
+  tzsource%cmnhname   = 'NETUR'
+  tzsource%clongname  = 'negativity correction induced by turbulence'
+  tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' )
+  call Budget_source_add( tbudgets(NBUDGET_RS), tzsource )
 
   tzsource%cmnhname   = 'VISC'
   tzsource%clongname  = 'viscosity'
@@ -2642,11 +2662,20 @@ if ( tbudgets(NBUDGET_RG)%lenabled ) then
   tzsource%lavailable = ohorelax_rg
   call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
 
-!   tzsource%cmnhname   = 'NETUR'
-!   tzsource%clongname  = 'negativity correction induced by turbulence'
-!   tzsource%lavailable = hturb == 'TKEL' .and. (      hcloud == 'ICE3' .or. hcloud == 'ICE4' &
-!                                   .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
-!   call Budget_source_add( tbudgets(NBUDGET_RG), tzsource nneturrg )
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
+
+  tzsource%cmnhname   = 'NETUR'
+  tzsource%clongname  = 'negativity correction induced by turbulence'
+  tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' )
+  call Budget_source_add( tbudgets(NBUDGET_RG), tzsource )
 
   tzsource%cmnhname   = 'VISC'
   tzsource%clongname  = 'viscosity'
@@ -2851,11 +2880,20 @@ if ( tbudgets(NBUDGET_RH)%lenabled ) then
   tzsource%lavailable = ohorelax_rh
   call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
 
-!   tzsource%cmnhname   = 'NETUR'
-!   tzsource%clongname  = 'negativity correction induced by turbulence'
-!   tzsource%lavailable = hturb == 'TKEL' .and. (      hcloud == 'ICE3' .or. hcloud == 'ICE4' &
-!                                   .or. hcloud == 'KHKO' .or. hcloud == 'C2R2' .or. hcloud == 'LIMA' )
-!   call Budget_source_add( tbudgets(NBUDGET_RH), tzsource nneturrh )
+  tzsource%cmnhname   = 'VTURB'
+  tzsource%clongname  = 'vertical turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'HTURB'
+  tzsource%clongname  = 'horizontal turbulent diffusion'
+  tzsource%lavailable = hturb == 'TKEL' .and. HTURBDIM == '3DIM'
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
+
+  tzsource%cmnhname   = 'NETUR'
+  tzsource%clongname  = 'negativity correction induced by turbulence'
+  tzsource%lavailable = hturb == 'TKEL' .and. ( hcloud == 'ICE3' .or. hcloud == 'ICE4' .or. hcloud == 'LIMA' )
+  call Budget_source_add( tbudgets(NBUDGET_RH), tzsource )
 
   tzsource%cmnhname   = 'VISC'
   tzsource%clongname  = 'viscosity'
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index 6f2fa0cb9132107bb815629c9dc82434665031c1..5d54d01f0fdc00849070c26e6bb1bfb98f44630d 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2024 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.
@@ -299,6 +299,7 @@ END MODULE MODI_INI_MODEL_n
 !  A. Costes      12/2021: Blaze fire model
 !  H. Toumi       09/2022: add EOL/ADR
 !  C. Barthe      03/2023: if cloud electricity is activated, both ini_micron and ini_elecn are called
+!  V. Masson      01/2024: aggregation of columns for radiation
 !---------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -1556,6 +1557,7 @@ IF (CRAD /= 'NONE') THEN
   ALLOCATE(XDTHRADSW(IIU,IJU,IKU))
   ALLOCATE(XDTHRADLW(IIU,IJU,IKU))
   ALLOCATE(XRADEFF(IIU,IJU,IKU))
+  ALLOCATE(NRAD_AGG_FLAG(IIU,IJU))
 ELSE
   ALLOCATE(XSLOPANG(0,0))
   ALLOCATE(XSLOPAZI(0,0))
@@ -1575,6 +1577,7 @@ ELSE
   ALLOCATE(XDTHRADSW(0,0,0))
   ALLOCATE(XDTHRADLW(0,0,0))
   ALLOCATE(XRADEFF(0,0,0))
+  ALLOCATE(NRAD_AGG_FLAG(0,0))
 END IF
 
 IF (CRAD == 'ECMW' .OR. CRAD == 'ECRA') THEN
@@ -2545,7 +2548,8 @@ IF (CRAD   /= 'NONE') THEN
                       XRADEFF,XSWU,XSWD,XLWU,             &
                       XLWD,XDTHRADSW,XDTHRADLW,           &
                       NRAD_AGG,NI_RAD_AGG,NJ_RAD_AGG,     &
-                      NIOR_RAD_AGG,NJOR_RAD_AGG           )
+                      NIOR_RAD_AGG,NJOR_RAD_AGG,          &
+                      NRAD_AGG_FLAG                       )
   !
   IF (GINIRAD) CALL SUNPOS_n(XZENITH,PAZIMSOL=XAZIM)
   CALL SURF_SOLAR_GEOM    (XZS, XZS_XY)
diff --git a/src/MNH/ini_one_wayn.f90 b/src/MNH/ini_one_wayn.f90
index c18ff402abe26556640f5cd8acbee57b5b75e108..70c20e10a462c48c3d24abc10a979ff529bd5589 100644
--- a/src/MNH/ini_one_wayn.f90
+++ b/src/MNH/ini_one_wayn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1999-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-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.
@@ -103,10 +103,12 @@ USE MODD_NSV,            only: NSV_A, NSV_C1R3BEG_A, NSV_C1R3_A, NSV_C2R2BEG_A,
                                NSV_CHEM_A, NSV_CHICBEG_A, NSV_CHIC_A, NSV_DSTBEG_A, NSV_DSTDEPBEG_A, NSV_DSTDEP_A, NSV_DST_A, &
                                NSV_ELECBEG_A, NSV_ELEC_A, NSV_LGBEG_A, NSV_LG_A, NSV_LIMA_A, NSV_LIMA_BEG_A,                  &
                                NSV_LNOXBEG_A, NSV_LNOX_A, NSV_PPBEG_A, NSV_PP_A,                                              &
-                               NSV_SLTBEG_A, NSV_SLTDEPBEG_A, NSV_SLTDEP_A, NSV_SLT_A, NSV_USER_A
+
 #ifdef MNH_FOREFIRE
-USE MODD_NSV,            only: NSV_FF_A, NSV_FFBEG_A
-#endif
+                               NSV_FFBEG_A, NSV_FF_A, &
+#endif                                              
+                               NSV_SLTBEG_A, NSV_SLTDEPBEG_A, NSV_SLTDEP_A, NSV_SLT_A, NSV_USER_A
+
 USE MODD_PARAM_n,        only: CCLOUD
 USE MODD_REF,            ONLY: LCOUPLES
 USE MODD_REF_n,          only: XRHODJ, XRHODREF
diff --git a/src/MNH/ini_radiations.f90 b/src/MNH/ini_radiations.f90
index 2b11a5890fb9357e2de1deaf81a350504057ec22..a19a3b71f7b722e67e2a13a19595a49730531f54 100644
--- a/src/MNH/ini_radiations.f90
+++ b/src/MNH/ini_radiations.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2003-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2003-2024 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.
@@ -16,7 +16,8 @@ INTERFACE
          PFLALWD,PDIRSRFSWD,KCLEARCOL_TM1,                             &
          PZENITH, PAZIM, TPDTRAD_FULL,TPDTRAD_CLONLY,TPINITHALO2D_ll,  &
          PRADEFF,PSWU,PSWD,PLWU,PLWD,PDTHRADSW,PDTHRADLW,              &
-         KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG      )
+         KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG,     &
+         KRAD_AGG_FLAG                                                 )
 !
 USE MODD_ARGSLIST_ll, ONLY : LIST_ll
 USE MODD_IO,       ONLY : TFILEDATA
@@ -66,6 +67,7 @@ INTEGER, INTENT(OUT) :: KI_RAD_AGG    ! reformatted X array size
 INTEGER, INTENT(OUT) :: KJ_RAD_AGG    ! reformatted Y array size
 INTEGER, INTENT(OUT) :: KIOR_RAD_AGG  ! index of first point of packed array according to current domain
 INTEGER, INTENT(OUT) :: KJOR_RAD_AGG  ! index of first point of packed array according to current domain
+INTEGER, DIMENSION(:,:), INTENT(OUT) :: KRAD_AGG_FLAG  ! flag to know if aggregated column is computed in this processor or another one
 
 END SUBROUTINE INI_RADIATIONS
 !
@@ -82,7 +84,8 @@ END MODULE MODI_INI_RADIATIONS
          PFLALWD,PDIRSRFSWD,KCLEARCOL_TM1,                             &
          PZENITH, PAZIM, TPDTRAD_FULL,TPDTRAD_CLONLY,TPINITHALO2D_ll,  &
          PRADEFF,PSWU,PSWD,PLWU,PLWD,PDTHRADSW,PDTHRADLW,              &
-         KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG      )
+         KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG,     &
+         KRAD_AGG_FLAG                                                 )
 !   ####################################################################
 !
 !!****  *INI_RADIATION_TIME * - initialisation for radiation scheme in the MesoNH framework
@@ -119,6 +122,7 @@ END MODULE MODI_INI_RADIATIONS
 !  P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables
 !  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
 !  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!       V. Masson 03/01/2024: aggregation of columns for radiation
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -187,6 +191,7 @@ INTEGER, INTENT(OUT) :: KI_RAD_AGG    ! reformatted X array size
 INTEGER, INTENT(OUT) :: KJ_RAD_AGG    ! reformatted Y array size
 INTEGER, INTENT(OUT) :: KIOR_RAD_AGG  ! index of first point of packed array according to current domain
 INTEGER, INTENT(OUT) :: KJOR_RAD_AGG  ! index of first point of packed array according to current domain
+INTEGER, DIMENSION(:,:), INTENT(OUT) :: KRAD_AGG_FLAG  ! flag to know if aggregated column is computed in this processor or another one
 !
 !*       0.2   declarations of local variables
 !
@@ -343,7 +348,7 @@ END IF
 !*       10.         INITIALIZE COLUMN AGGREGATION FOR RADIATION CALL
 !	            -------------------------------------------------
 
-CALL INI_RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG)
+CALL INI_RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG,KRAD_AGG_FLAG)
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_radiations_agg.f90 b/src/MNH/ini_radiations_agg.f90
index 0ec198677c8a0e1d3015567b2680cbf11e471760..71679e0ddb087e875d444825b1e1ed747ad11c9d 100644
--- a/src/MNH/ini_radiations_agg.f90
+++ b/src/MNH/ini_radiations_agg.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2023-2024 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.
@@ -9,12 +9,13 @@
 !
 INTERFACE
 
-    SUBROUTINE INI_RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG)
+    SUBROUTINE INI_RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG,KRAD_AGG_FLAG)
 INTEGER, INTENT(IN)  :: KRAD_AGG      ! number of aggregated points
 INTEGER, INTENT(OUT) :: KI_RAD_AGG    ! reformatted X array size
 INTEGER, INTENT(OUT) :: KJ_RAD_AGG    ! reformatted Y array size
 INTEGER, INTENT(OUT) :: KIOR_RAD_AGG  ! index of first point of packed array according to current domain
 INTEGER, INTENT(OUT) :: KJOR_RAD_AGG  ! index of first point of packed array according to current domain
+INTEGER, DIMENSION(:,:), INTENT(OUT) :: KRAD_AGG_FLAG  ! flag to know if aggregated column is computed in this processor or another one
 END SUBROUTINE INI_RADIATIONS_AGG
 
 END INTERFACE
@@ -22,7 +23,7 @@ END INTERFACE
 END MODULE MODI_INI_RADIATIONS_AGG
 !
 !   ############################################################################
-    SUBROUTINE INI_RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG)
+    SUBROUTINE INI_RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG,KRAD_AGG_FLAG)
 !   ############################################################################
 !
 !!****  *INI_RADIATIONS_AGG * - routine to call the SW and LW radiation calculations
@@ -95,6 +96,7 @@ INTEGER, INTENT(OUT) :: KI_RAD_AGG    ! reformatted X array size
 INTEGER, INTENT(OUT) :: KJ_RAD_AGG    ! reformatted Y array size
 INTEGER, INTENT(OUT) :: KIOR_RAD_AGG  ! index of first point of packed array according to current domain
 INTEGER, INTENT(OUT) :: KJOR_RAD_AGG  ! index of first point of packed array according to current domain
+INTEGER, DIMENSION(:,:), INTENT(OUT) :: KRAD_AGG_FLAG  ! flag to know if aggregated column is computed in this processor or another one
 !
 !
 !*       0.2   DECLARATIONS OF LOCAL VARIABLES
@@ -119,6 +121,9 @@ INTEGER :: IJOR_ll      ! index of first point in the processor relative to the
 !
 INTEGER :: ILUOUT       ! Logical unit 
 INTEGER :: IMI
+
+LOGICAL :: LREMOVE_SOUTH, LREMOVE_NORTH, LREMOVE_EAST, LREMOVE_WEST ! flags to not keep packed column in current processor
+INTEGER :: ISOUTH, INORTH, IEAST, IWEST ! inner limits of packed colums on each side of the processor (in local coordinate)
 !-------------------------------------------------------------------------
 !-------------------------------------------------------------------------
 !-------------------------------------------------------------------------
@@ -191,6 +196,7 @@ KJOR_RAD_AGG = IJOR_RAD_AGG_ll - IJOR_ll + 1
 KIOR_RAD_AGG = KIOR_RAD_AGG + ((IIB-KIOR_RAD_AGG)/KRAD_AGG) * KRAD_AGG
 KJOR_RAD_AGG = KJOR_RAD_AGG + ((IJB-KJOR_RAD_AGG)/KRAD_AGG) * KRAD_AGG
 !
+!-------------------------------------------------------------------------------
 !
 ! Number of PACKED radiative subdomains inside current processor domain
 KI_RAD_AGG = (IIE - KIOR_RAD_AGG) / KRAD_AGG + 1
@@ -198,5 +204,119 @@ KJ_RAD_AGG = (IJE - KJOR_RAD_AGG) / KRAD_AGG + 1
 !
 !-------------------------------------------------------------------------------
 !
+! REMOVES Aggregated columns that are duplicated in several processors
+!
+! Checks if the middle of the packed column is in the current processor
+! 
+LREMOVE_SOUTH = .FALSE.
+LREMOVE_NORTH = .FALSE.
+LREMOVE_EAST  = .FALSE.
+LREMOVE_WEST  = .FALSE.
+!
+KRAD_AGG_FLAG(:,:) = 0.
+!
+! inner limits of packed colums on each side of the processor (in local coordinate)
+IWEST  = KIOR_RAD_AGG +                KRAD_AGG-1
+IEAST  = KIOR_RAD_AGG + (KI_RAD_AGG-1)*KRAD_AGG
+ISOUTH = KJOR_RAD_AGG +                KRAD_AGG-1
+INORTH = KJOR_RAD_AGG + (KJ_RAD_AGG-1)*KRAD_AGG
+!
+! Eastern side of processor (if NOT of whole domain) (checks on last X index of aggregated columns)
+IF (IEAST+KRAD_AGG/2 > IIE .AND. .NOT. (LEAST_ll() .AND. CLBCX(2)=='OPEN') ) THEN
+   KRAD_AGG_FLAG(IEAST:IIE,:) = 3  ! points located there will take values computed by processor towards east
+   LREMOVE_EAST = .TRUE.
+END IF
+! Western side of processor (if NOT of whole domain) (checks on first X index of aggregated columns)
+IF (KIOR_RAD_AGG+KRAD_AGG/2 < IIB  .AND. .NOT. (LWEST_ll() .AND. CLBCX(1)=='OPEN') ) THEN
+   KRAD_AGG_FLAG(IIB:IWEST,:) = 1  ! points located there will take values computed by processor towards west
+   LREMOVE_WEST = .TRUE.
+END IF
+! Northern side of processor (if NOT of whole domain) (checks on last Y index of aggregated columns)
+IF (INORTH+KRAD_AGG/2 > IJE .AND. .NOT. (LNORTH_ll() .AND. CLBCY(2)=='OPEN') ) THEN
+   KRAD_AGG_FLAG(:,INORTH:IJE) = 4  ! points located there will take values computed by processor towards north
+   LREMOVE_NORTH= .TRUE.
+END IF
+! Southern side of processor (if NOT of whole domain) (checks on first X index of aggregated columns)
+IF (KJOR_RAD_AGG+KRAD_AGG/2 < IJB  .AND. .NOT. (LSOUTH_ll() .AND. CLBCY(1)=='OPEN') ) THEN
+   KRAD_AGG_FLAG(:,IJB:ISOUTH) = 2  ! points located there will take values computed by processor towards south
+   LREMOVE_SOUTH= .TRUE.
+END IF
+!
+! North-Eastern corner of processor (if NOT of whole domain)
+IF (       IEAST+KRAD_AGG/2 > IIE .AND.  INORTH+KRAD_AGG/2 > IJE  ) THEN
+   IF (.NOT. (LEAST_ll()  .AND. CLBCX(2)=='OPEN') .AND. .NOT. (LNORTH_ll() .AND. CLBCY(2)=='OPEN') ) THEN
+     KRAD_AGG_FLAG(IEAST:IIE,INORTH:IJE) = 7  
+     ! points located there will take values computed by processor towards NE
+     LREMOVE_EAST  = .TRUE.
+     LREMOVE_NORTH = .TRUE.
+   ELSE IF ( (LEAST_ll()  .AND. CLBCX(2)=='OPEN') .AND. .NOT. (LNORTH_ll() .AND. CLBCY(2)=='OPEN') ) THEN
+     KRAD_AGG_FLAG(:,INORTH:IJE) = 4  ! points located there will take values computed by processor towards north
+     LREMOVE_NORTH = .TRUE.
+   ELSE IF ( (LNORTH_ll()  .AND. CLBCY(2)=='OPEN') .AND. .NOT. (LEAST_ll()  .AND. CLBCX(2)=='OPEN') ) THEN
+     KRAD_AGG_FLAG(IEAST:IIE,:) = 3  ! points located there will take values computed by processor towards east
+     LREMOVE_EAST = .TRUE.
+   END IF
+END IF
+!
+! North-Western corner of processor (if NOT of whole domain)
+IF (       KIOR_RAD_AGG+KRAD_AGG/2 < IIB .AND.  INORTH+KRAD_AGG/2 > IJE  ) THEN
+   IF (.NOT. (LWEST_ll()  .AND. CLBCX(1)=='OPEN') .AND. .NOT. (LNORTH_ll() .AND. CLBCY(2)=='OPEN')) THEN
+     KRAD_AGG_FLAG(IIB:IWEST,INORTH:IJE) = 8  ! points located there will take values computed by processor towards NW
+     LREMOVE_WEST  = .TRUE.
+     LREMOVE_NORTH = .TRUE.
+   ELSE IF ( (LWEST_ll()  .AND. CLBCX(1)=='OPEN') .AND. .NOT. (LNORTH_ll() .AND. CLBCY(2)=='OPEN')) THEN
+     KRAD_AGG_FLAG(IIB:IWEST,INORTH:IJE) = 4  ! points located there will take values computed by processor towards north
+     LREMOVE_NORTH = .TRUE.
+   ELSE IF ( (LNORTH_ll()  .AND. CLBCY(2)=='OPEN') .AND. .NOT. (LWEST_ll()  .AND. CLBCX(1)=='OPEN')) THEN
+     KRAD_AGG_FLAG(IIB:IWEST,INORTH:IJE) = 1  ! points located there will take values computed by processor towards west
+     LREMOVE_WEST = .TRUE.
+   END IF
+END IF
+!
+! South-Western corner of processor (if NOT of whole domain)
+IF (       KIOR_RAD_AGG+KRAD_AGG/2 < IIB .AND.  KJOR_RAD_AGG+KRAD_AGG/2 < IJB ) THEN
+   IF (.NOT. (LWEST_ll()  .AND. CLBCX(1)=='OPEN') .AND. .NOT. (LSOUTH_ll() .AND. CLBCY(1)=='OPEN') ) THEN
+     KRAD_AGG_FLAG(IIB:IWEST,IIB:ISOUTH) = 5  ! points located there will take values computed by processor towards SW
+     LREMOVE_WEST  = .TRUE.
+     LREMOVE_SOUTH = .TRUE.
+   ELSE IF ( (LWEST_ll()  .AND. CLBCX(1)=='OPEN')  .AND. .NOT. (LSOUTH_ll() .AND. CLBCY(1)=='OPEN') ) THEN
+     KRAD_AGG_FLAG(IIB:IWEST,IIB:ISOUTH) = 2  ! points located there will take values computed by processor towards south
+     LREMOVE_SOUTH = .TRUE.
+   ELSE IF ( (LSOUTH_ll()  .AND. CLBCY(2)=='OPEN') .AND. .NOT. (LWEST_ll()  .AND. CLBCX(1)=='OPEN') ) THEN
+     KRAD_AGG_FLAG(IIB:IWEST,IIB:ISOUTH) = 1  ! points located there will take values computed by processor towards west
+     LREMOVE_WEST = .TRUE.
+   END IF
+END IF
+!
+! South-Eastern corner of processor (if NOT of whole domain)
+IF (       IEAST+KRAD_AGG/2 > IIE .AND.  KJOR_RAD_AGG+KRAD_AGG/2 < IJB ) THEN
+   IF (.NOT. (LEAST_ll()  .AND. CLBCX(1)=='OPEN') .AND. .NOT. (LSOUTH_ll() .AND. CLBCY(1)=='OPEN') ) THEN
+     KRAD_AGG_FLAG(IEAST:IIE,IIB:ISOUTH) = 6  ! points located there will take values computed by processor towards SW
+     LREMOVE_EAST  = .TRUE.
+     LREMOVE_SOUTH = .TRUE.
+   ELSE IF ( (LEAST_ll()  .AND. CLBCX(1)=='OPEN')  .AND. .NOT. (LSOUTH_ll() .AND. CLBCY(1)=='OPEN') ) THEN
+     KRAD_AGG_FLAG(IEAST:IIE,IIB:ISOUTH) = 2  ! points located there will take values computed by processor towards south
+     LREMOVE_SOUTH = .TRUE.
+   ELSE IF ( (LSOUTH_ll()  .AND. CLBCY(2)=='OPEN') .AND. .NOT. (LEAST_ll()  .AND. CLBCX(1)=='OPEN') ) THEN
+     KRAD_AGG_FLAG(IEAST:IIE,IIB:ISOUTH) = 3  ! points located there will take values computed by processor towards west
+     LREMOVE_EAST = .TRUE.
+   END IF
+END IF
+!
+! removes from current processor the column that was partially (and majoritaly) in the other processor
+!
+IF (LREMOVE_EAST) KI_RAD_AGG = KI_RAD_AGG -1 
+IF (LREMOVE_WEST) THEN
+   KIOR_RAD_AGG = KIOR_RAD_AGG + KRAD_AGG
+   KI_RAD_AGG = KI_RAD_AGG -1
+END IF
+IF (LREMOVE_NORTH) KJ_RAD_AGG = KJ_RAD_AGG -1
+IF (LREMOVE_SOUTH) THEN
+   KJOR_RAD_AGG = KJOR_RAD_AGG + KRAD_AGG
+   KJ_RAD_AGG = KJ_RAD_AGG -1
+END IF
+!
+!-------------------------------------------------------------------------------
+!
 END SUBROUTINE INI_RADIATIONS_AGG
 
diff --git a/src/MNH/modd_diag_flag.f90 b/src/MNH/modd_diag_flag.f90
index 3115f14260767f60d010c5ecf7d427d6fd95c643..94ce52ed553e1f112e8f136f7cb2dbd18b316d0c 100644
--- a/src/MNH/modd_diag_flag.f90
+++ b/src/MNH/modd_diag_flag.f90
@@ -56,7 +56,6 @@ LOGICAL     :: LVAR_RS              ! UM,VM,WM,RVM
 LOGICAL     :: LVAR_LS              ! LSUM,LSVM,LSWM,LSRVM
 INTEGER     :: NCONV_KF             ! Convective scheme
 INTEGER     :: NRAD_3D              ! Radiative scheme
-CHARACTER(LEN=44)  :: CRAD_SAT      ! GOES-E,GOES-W,GMS,INDSAT,METEOSAT
 LOGICAL     :: LRAD_SUBG_COND       ! to activate subgrid condensation
                                     !scheme in the radiatif transfer code
 !rttov and satellites variables
diff --git a/src/MNH/modd_param_radn.f90 b/src/MNH/modd_param_radn.f90
index f429c6938df934a31c6e27faae57c152e2cd4d9e..613a2de1e2fd7390f20a0105ec3e6a74ce40b38c 100644
--- a/src/MNH/modd_param_radn.f90
+++ b/src/MNH/modd_param_radn.f90
@@ -1,12 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2024 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$ $Revision$
-! MASDEV4_7 modd 2006/11/23 17:28:26
 !-----------------------------------------------------------------
 !     ######################## 
       MODULE MODD_PARAM_RAD_n
@@ -43,6 +39,7 @@
 !!      F.Solmon      15/03/02  add the control parameter for aerosol and cloud radiative 
 !!                              properties. Remove the NSPOT option.
 !!      B.Aouizerats  07/11     add aerosol optical properties CAOP
+!       V. Masson 03/01/2024: aggregation of columns for radiation
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
diff --git a/src/MNH/modd_radiationsn.f90 b/src/MNH/modd_radiationsn.f90
index 64be9ce63847ff5c8e7583dcc75ba5687cf3f8d9..4cac01d2d720f3fbb4a41c9835d9401fd1200d7e 100644
--- a/src/MNH/modd_radiationsn.f90
+++ b/src/MNH/modd_radiationsn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-2024 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.
@@ -38,7 +38,7 @@
 !!                                         multiple wavelengths for surface SW
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 08/02/2019: add missing NULL association for pointers
-!!
+!       V. Masson 03/01/2024: aggregation of columns for radiation
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -132,6 +132,7 @@ TYPE RADIATIONS_t
   INTEGER :: NJ_RAD_AGG    ! reformatted Y array size
   INTEGER :: NIOR_RAD_AGG  ! index of first point of packed array according to current domain
   INTEGER :: NJOR_RAD_AGG  ! index of first point of packed array according to current domain
+  INTEGER, DIMENSION(:,:),     POINTER :: NRAD_AGG_FLAG=>NULL() ! status on which processor is calculated the aggregated column
 !
 END TYPE RADIATIONS_t
 
@@ -196,6 +197,7 @@ INTEGER, POINTER :: NI_RAD_AGG=>NULL()    ! reformatted X array size
 INTEGER, POINTER :: NJ_RAD_AGG=>NULL()    ! reformatted Y array size
 INTEGER, POINTER :: NIOR_RAD_AGG=>NULL()  ! index of first point of packed array according to current domain
 INTEGER, POINTER :: NJOR_RAD_AGG=>NULL()  ! index of first point of packed array according to current domain
+INTEGER, DIMENSION(:,:),POINTER :: NRAD_AGG_FLAG=>NULL()
 
 CONTAINS
 
@@ -236,6 +238,7 @@ RADIATIONS_MODEL(KFROM)%XLWD=>XLWD
 RADIATIONS_MODEL(KFROM)%XDTHRADSW=>XDTHRADSW
 RADIATIONS_MODEL(KFROM)%XDTHRADLW=>XDTHRADLW
 RADIATIONS_MODEL(KFROM)%XRADEFF=>XRADEFF
+RADIATIONS_MODEL(KFROM)%NRAD_AGG_FLAG=>NRAD_AGG_FLAG
 !
 ! Current model is set to model KTO
 NDLON=>RADIATIONS_MODEL(KTO)%NDLON
@@ -297,6 +300,7 @@ NI_RAD_AGG=>RADIATIONS_MODEL(KTO)%NI_RAD_AGG
 NJ_RAD_AGG=>RADIATIONS_MODEL(KTO)%NJ_RAD_AGG
 NIOR_RAD_AGG=>RADIATIONS_MODEL(KTO)%NIOR_RAD_AGG
 NJOR_RAD_AGG=>RADIATIONS_MODEL(KTO)%NJOR_RAD_AGG
+NRAD_AGG_FLAG=>RADIATIONS_MODEL(KTO)%NRAD_AGG_FLAG
 
 END SUBROUTINE RADIATIONS_GOTO_MODEL
 
diff --git a/src/MNH/modn_param_radn.f90 b/src/MNH/modn_param_radn.f90
index 477e14df948919878d4aa28f3d4be08f16570dc4..ddcc8c11a0067620c0b731c9de284a242b84e12b 100644
--- a/src/MNH/modn_param_radn.f90
+++ b/src/MNH/modn_param_radn.f90
@@ -1,13 +1,8 @@
-!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2024 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$ $Revision$
-! MASDEV4_7 modn 2006/11/23 17:22:54
-!-----------------------------------------------------------------
 !     ########################  
       MODULE MODN_PARAM_RAD_n
 !     ########################
diff --git a/src/MNH/nband_model.fx90 b/src/MNH/nband_model.fx90
deleted file mode 100644
index 6005b838759cf188856ece7a479f72945cf033a2..0000000000000000000000000000000000000000
--- a/src/MNH/nband_model.fx90
+++ /dev/null
@@ -1,2286 +0,0 @@
-!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
-!MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-***FILE:     nband_model.f
-***AUTHOR:   J.-P. Chaboureau *LA*
-***DATE:     29/03/00
-***ORIGINAL: original from JEAN-JACQUES MORCRETTE  *ECMWF*   96/12/20
-***MODIFIED: I.Mallet (02/11/00) added F90 Interface (MODD_RAD_TRANSF)
-*                               and changed name of variables concerned
-*                               indicated by "*MNH"
-*                                named nband_model.f90 and compiled with -Fixed
-*           J.Escobar (1/12/2017) bug => intialized all ZV=0.0 in spectr
-*           P. Wautelet 21/11/2019: replace several CONTINUE (workaround of problems with gfortran OpenACC)
-*           P. Wautelet 17/12/2021: comment ZBSUI variable (not used and was not initialized)
-*
-      SUBROUTINE NBMVEC
-     I ( KIDIA  ,KFDIA ,KLON,KLEV,KGL,KCABS,KNG1,KUABS
-     I , KH2O   ,KCO2  ,KO3,KCNT,KN2O,KCH4,KCO,KC11,KC12,KCFC
-     I , KINIS  ,KENDS ,KCONF,KCLOUD,KOVLP
-     L , LPVOIGT, LPTDEP
-     R , PTAVE, PQVAVE, PO3AVE, PPL, PT
-     R , PANGLE , PCLDLD, PCLDLU
-     R , PDT0   ,PEM0 
-c     R , PFBBDC ,PFBBDT,PFBBUC,PFBBUT
-c     R , PFDC   ,PFDT  ,PFDTI,PFUC,PFUT,PFUTI
-     R , PRADC  ,PRADT)
-C
-C**** *NBMVEC* - VECTORIZED NARROW BAND MODEL OF THE LONGWAVE RADIATION
-C                TRANSFER
-C
-C**   INTERFACE
-C     ---------
-C          *NBMVEC* IS CALLED BY *NARROW*
-C
-C     ARGUMENTS
-C     ---------
-C     === INPUTS ===
-C        KIDIA    : START OF VECTOR
-C        KFDIA    : END OF VECTOR
-C        KLON     : TOTAL LENGTH OF VECTOR
-C        KLEV     : NUMBER OF FULL-LEVELS (LAYERS)
-C        KGL      : NUMBER OF SUB-LAYERS IN VERTICAL INTEGRATION
-C        KCABS    : CONFIGURATION INDEX FOR ABSORBERS
-C        LPVOIGT  : .T. IF VOIGT PROFILE IS ACCOUNTED FOR
-C     === OUTPUTS ===
-C        PFBBDC   : BROAD-BAND DOWNWARD CLEAR-SKY FLUXES (SURF./TOA)
-C        PFBBDT   : BROAD-BAND DOWNWARD TOTAL     FLUXES (SURF./TOA)
-C        PFBBUC   : BROAD-BAND   UPWARD CLEAR-SKY FLUXES (SURF./TOA)
-C        PFBBUT   : BROAD-BAND   UPWARD TOTAL     FLUXES (SURF./TOA)
-C        PFDC,PFUC: CLEAR-SKY FLUXES (ALL HALF-LEVELS)
-C        PFDT,PFUT: TOTAL     FLUXES (ALL HALF-LEVELS)
-C        PRADC    : CLEAR-SKY SPECTRAL RADIANCE AT T.O.A. 
-C        PRADT    : TOTAL-SKY SPECTRAL RADIANCE AT T.O.A. 
-C
-C     METHOD
-C     ------
-C
-C     REFERENCE
-C     ---------
-C
-C     AUTHOR
-C     ------
-C        JEAN-JACQUES MORCRETTE  *ECMWF*   96/12/20
-C
-C     MODIFICATIONS
-C     -------------
-C
-C     ------------------------------------------------------------------
-*MNH
-      USE MODD_RAD_TRANSF
-*MNH
-                                !include 'implic.h'
-      LOGICAL LPTDEP, LPVOIGT
-                                !include 'param.h'
-*MNH  INTEGER JNINT,JUABS,JUAMO,JV2,JV3,JV10
-*MNH  PARAMETER (JNINT=225,JUABS=14,JUAMO=8,JV2=2,JV3=3,JV10=10)
-                                !include 'yomgos.h'
-*MNH  real RT1(2),WG1(2)
-*MNH  COMMON /YOMGOS/ RT1,WG1
-                                !include 'yomio.h'
-*MNH  integer IMP,NIMP,NULOUT,NULINA,NULNAM
-*MNH  COMMON /YOMIO/ IMP,NIMP,NULOUT,NULINA,NULNAM
-                                !include 'yomrad.h'
-*MNH  integer NABS,NATM,NATMS,NSPWV,NTMP1,NTEMP,NCH2O,NCCO2,NCO3,
-*MNH &     NCHAN,NH2O,NCO2,NO3,NCNT,NN2O,NCH4,NCO,NC11,NC12,NCFC,NO2
-*MNH  real CVCO2,CVN2O,CVCO,CVCH4,CVF11,CVF12,CVO2,FTEMP(JV3),
-*MNH &     FCH2O(JV3),FCCO2(JV3),FCO3(JV3),XLIM(JV10),CLIM(JV2)
-*MNH  COMMON/YOMRADI/NABS,NATM,NATMS,NSPWV,NTMP1,NTEMP,NCH2O,NCCO2,NCO3,
-*MNH &     NCHAN,NH2O,NCO2,NO3,NCNT,NN2O,NCH4,NCO,NC11,NC12,NCFC,NO2
-*MNH  COMMON /YOMRADR/CVCO2,CVN2O,CVCO,CVCH4,CVF11,CVF12,CVO2,
-*MNH &     FTEMP,FCH2O,FCCO2,FCO3,XLIM,CLIM
-                                !include 'yomspe.h'
-*MNH  integer N_INT,NA
-*MNH  real TREF,TPOLY
-*MNH  real WNU(JV2),RODWAL(6,8),POLPLCK(6,2),WVNA(JNINT),WVNB(JNINT),
-*MNH &     RALPHA,RPI,RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,
-*MNH &     RF11M,RF12M
-*MNH  COMMON /YOMSPEI/ N_INT,NA,TREF,TPOLY     
-*MNH  COMMON /YOMSPER/ WNU,RODWAL,POLPLCK,WVNA,WVNB,RALPHA,RPI,
-*MNH &     RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,RF11M,RF12M
-*MNH  real WNUTOT(2,20), POLPLCKTOT(6,2,20), RODWALTOT(6,8,20)
-*MNH  COMMON /YOMSPET/ WNUTOT, RODWALTOT, POLPLCKTOT
-C     ------------------------------------------------------------------
-C
-C          0.1  ARGUMENTS
-C
-C
-      REAL PDT0(KLON), PEM0(KLON), PPL(KLON,KLEV+1), PT(KLON,KLEV+1)
-      REAL PO3AVE(KLON,KLEV), PQVAVE(KLON,KLEV), PTAVE(KLON,KLEV)
-      REAL PCLDLD(KLON,KLEV), PCLDLU(KLON,KLEV)
-      REAL PANGLE(KLON)  
-      REAL PRADC(KLON,20), PRADT(KLON,20)
-C     ------------------------------------------------------------------
-C     
-      REAL
-     *    ZDPM(KLON,3*KLEV)    , ZDUC(KLON,3*KLEV)
-     *  , ZSSIG(KLON,3*KLEV+1)     
-     *  , ZU(KLON,8,3*KLEV+1)  , ZUPM(KLON,3*KLEV)
-     *  , ZXT(KLON,3,3*KLEV+1) , ZXOZ(KLON)    , ZXWV(KLON) 
-C     ------------------------------------------------------------------
-C
-C     ------------------------------------------------------------------
-C
-C          1.     INITIALISATION
-C                 --------------
-  100 CONTINUE
-C
-C     IF (NIMP.EQ.0) STOP
-      
-      PVGH2O = 30.
-      PVGCO2 = 60.
-      PVGO3  = 400.
-      RG = 9.80665
-      ZEPSCO = 1.E-12
-      !ZEPSCQ = 1.E-12 NOT ENOUGH
-      ZEPSCQ = 1.E-8
-*MNH      PCMCO2 = CVCO2 * RCO2M / RAIRM
-      PCMCO2 = X1CO2 * XCO2M / XAIRM
-*MNH      PCMN2O = CVN2O * RN2OM / RAIRM
-      PCMN2O = XN2O * XN2OM / XAIRM
-*MNH       PCMCH4 = CVCH4 * RCH4M / RAIRM
-      PCMCH4 = XCH4 * XCH4M / XAIRM
-C      
-      DO JA=1,8
-        DO JK=1,KGL+1
-          DO JL=KIDIA,KFDIA
-            ZU(JL,JA,JK)=0.
-          END DO
-        END DO
-      END DO
-      DO JA=1,3
-        DO JK=1,KGL+1
-          DO JL=KIDIA,KFDIA
-            ZXT(JL,JA,JK)=0.
-          END DO
-        END DO
-      END DO
-c      DO 113 JNIV=1,2
-c      DO 112 JSI=1,10  
-c      DO 111 JL=KIDIA,KFDIA
-c      PFBBDC(JL,JSI,JNIV)=0.
-c      PFBBUC(JL,JSI,JNIV)=0.
-c      PFBBDT(JL,JSI,JNIV)=0.
-c      PFBBUT(JL,JSI,JNIV)=0.
-c 111  CONTINUE
-c 112  CONTINUE
-c 113  CONTINUE     
-C
-C     ------------------------------------------------------------------
-C
-C*         2.    PRESSURE OVER GAUSS SUB-LEVELS
-C                ------------------------------
-C
- 200  CONTINUE
-C
-      IG1P1=KNG1+1
-      DO JL=KIDIA,KFDIA
-      ZSSIG(JL,1)=PPL(JL,1)
-      END DO
-C      
-      DO JK = 1 , KLEV
-        JKJ=(JK-1)*IG1P1+1
-        JKJR = JKJ
-        JKJP = JKJ + IG1P1
-        DO JL = KIDIA,KFDIA
-          ZSSIG(JL,JKJP)=PPL(JL,JK+1)
-        END DO
-        DO IG1=1,KNG1
-          JKJ=JKJ+1
-          DO JL = KIDIA,KFDIA
-            ZSSIG(JL,JKJ)= (ZSSIG(JL,JKJR)+ZSSIG(JL,JKJP))*0.5
-*MNH     S  + RT1(IG1) * (ZSSIG(JL,JKJP) - ZSSIG(JL,JKJR)) * 0.5
-     S      + XRT1(IG1) * (ZSSIG(JL,JKJP) - ZSSIG(JL,JKJR)) * 0.5
-          END DO
-        END DO
-      END DO
-C      
-C-----------------------------------------------------------------------
-C
-C*         3.    PRESSURE THICKNESS AND MEAN PRESSURE OF SUB-LAYERS
-C                --------------------------------------------------
-C
- 300  CONTINUE
-C
-      DO 302 JKI=1,KGL
-      JKIP1=JKI+1
-      DO 301 JL = KIDIA,KFDIA
-      ZUPM(JL,JKI)=(ZSSIG(JL,JKI)+ZSSIG(JL,JKIP1))*0.5
-      ZDPM(JL,JKI)=(ZSSIG(JL,JKI)-ZSSIG(JL,JKIP1))/(10.*RG)
- 301  CONTINUE
-C      IF (NIMP.EQ.0) THEN
-C      JL=KIDIA
-C      PRINT 9301,JKI,ZDPM(JL,JKI),ZUPM(JL,JKI)
-C 9301 FORMAT(1X,I4,2E13.6)
-C      END IF     
- 302  CONTINUE
-C
-      DO JK = 1 , KLEV
-        JKP1=JK+1
-        JKL = KLEV+1 - JK
-        DO JL = KIDIA,KFDIA
-          ZXWV(JL) = MAX (PQVAVE(JL,JK) , ZEPSCQ )
-          ZXOZ(JL) = MAX (PO3AVE(JL,JK) , ZEPSCO )
-        END DO
-        JKJ=(JK-1)*IG1P1+1
-        JKJPN=JKJ+KNG1
-        DO JKK=JKJ,JKJPN
-          DO JL = KIDIA,KFDIA
-            ZUPMH2O = ( ZUPM(JL,JKK) + PVGH2O ) * ZDPM(JL,JKK) / 101325.
-            ZUPMCO2 = ( ZUPM(JL,JKK) + PVGCO2 ) * ZDPM(JL,JKK) / 101325.
-            ZUPMO3  = ( ZUPM(JL,JKK) + PVGO3  ) * ZDPM(JL,JKK) / 101325.
-            ZDUC(JL,JKK)= ZDPM(JL,JK)
-            ZU6= ZXWV(JL) * ZUPMH2O
-            ZFPPW= 1.6078 * ZXWV(JL) / (1.+0.608*ZXWV(JL))
-            ZU(JL, 1,JKK) = ZXWV(JL) * ZDPM(JL,JKK)
-            ZU(JL, 2,JKK) = ZXWV(JL) * ZUPMH2O
-            ZU(JL, 3,JKK) = PCMCO2    * ZDPM(JL,JKK)
-            ZU(JL, 4,JKK) = PCMCO2    * ZUPMCO2
-            ZU(JL, 5,JKK) = ZXOZ(JL) * ZDPM(JL,JKK)
-            ZU(JL, 6,JKK) = ZXOZ(JL) * ZUPMO3
-            ZU(JL, 7,JKK) = ZU6      * ZFPPW
-            ZU(JL, 8,JKK) = ZU6      * (1.-ZFPPW)
-          END DO
-        END DO
-      END DO
-      DO JA=1,8
-        DO JL=KIDIA,KFDIA
-          ZU(JL,JA,KGL+1) = 0.
-        END DO
-      END DO
-C      IF (NIMP.EQ.0) THEN
-C      DO 312 JK=1,KGL+1
-C      PRINT 9312,JK,(ZU(KIDIA,JA,JK),JA=1,8)
-C 9312 FORMAT(1X,I4,8E13.6)
-C 312  CONTINUE 
-C      END IF    
-C           
-      CALL SPECTR 
-     I ( KIDIA,KFDIA,KLON,KLEV,KGL,KCABS,KNG1,KUABS
-     I , KH2O,KCO2,KO3,KCNT,KN2O,KCH4,KCO,KC11,KC12,KCFC
-     I , KINIS,KENDS,KCONF,KCLOUD,KOVLP
-     L , LPVOIGT,LPTDEP
-     R , PCMCO2, PCMN2O, PCMN2O, PCMCH4, PCMO2, PCMF11, PCMF12
-     R , PANGLE,PCLDLD, PCLDLU
-     R , PDT0,PEM0
-     R , PT,PTAVE
-     R , ZU
-     R , PRADC,PRADT
-     S )
-      
-C
-C     ------------------------------------------------------------------
-C
-      RETURN
-      END
-      SUBROUTINE SPECTR 
-     I ( KIDIA,KFDIA,KLON,KLEV,KGL,KCABS,KNG1,KUABS
-     I , KH2O,KCO2,KO3,KCNT,KN2O,KCH4,KCO,KC11,KC12,KCFC
-     I , KINIS,KENDS,KCONF,KCLOUD,KOVLP
-     L , LPVOIGT,LPTDEP
-     R , PCMCO2, PCMN2O, PCMCO, PCMCH4, PCMO2, PCMF11, PCMF12
-     R , PANGLE,ZCLDLD, ZCLDLU
-     R , PDT0,PEM0, PT,PTAVE, PU , PRADC,PRADT)
-C
-C**** *SPECTR* - PERFORMS THE SPECTRAL INTEGRATION
-C
-C**   INTERFACE
-C     ---------
-C          *SPECTR* IS CALLED BY *NBMVEC*
-C
-C     ARGUMENTS
-C     ---------
-C     === INPUTS ===
-C        KIDIA    : START OF VECTOR
-C        KFDIA    : END OF VECTOR
-C        KLON     : TOTAL LENGTH OF VECTOR
-C        KLEV     : NUMBER OF FULL-LEVELS (LAYERS)
-C        KGL      : NUMBER OF SUB-LAYERS IN VERTICAL INTEGRATION
-C        KCABS    : CONFIGURATION INDEX FOR ABSORBERS
-C        LPVOIGT  : .T. IF VOIGT PROFILE IS ACCOUNTED FOR
-C     === OUTPUTS ===
-C        PRADC    : CLEAR-SKY SPECTRAL RADIANCE (UPWARD AT TOA)
-C        PRADT    : TOTAL-SKY SPECTRAL RADIANCE (UPWARD AT TOA)
-C
-C     METHOD
-C     ------
-C
-C     REFERENCE
-C     ---------
-C
-C     AUTHOR
-C     ------
-C        JEAN-JACQUES MORCRETTE  *ECMWF*   96/12/20
-C
-C     MODIFICATIONS
-C     -------------
-C        Remy Roca LMD 97 03 03
-c     This version is only dedicated to the calculation of the radiance
-c     as the satellite may have seen - Jean-Pierre Chaboureau (Dec. 1998).
-c     Thus all the flux outputs have been removed to save memory space.
-C     ------------------------------------------------------------------
-*MNH
-      USE MODD_RAD_TRANSF
-*MNH
-      LOGICAL LPTDEP, LPVOIGT, LLCNT
-                                !include 'param.h'
-*MNH  INTEGER JNINT,JUABS,JUAMO,JV2,JV3,JV10
-*MNH  PARAMETER (JNINT=225,JUABS=14,JUAMO=8,JV2=2,JV3=3,JV10=10)
-                                !include 'yomgos.h'
-*MNH  real RT1(2),WG1(2)
-*MNH  COMMON /YOMGOS/ RT1,WG1
-                                !include 'yomio.h'
-*MNH  integer IMP,NIMP,NULOUT,NULINA,NULNAM
-*MNH  COMMON /YOMIO/ IMP,NIMP,NULOUT,NULINA,NULNAM
-                                !include 'yomrad.h'
-*MNH  integer NABS,NATM,NATMS,NSPWV,NTMP1,NTEMP,NCH2O,NCCO2,NCO3,
-*MNH &     NCHAN,NH2O,NCO2,NO3,NCNT,NN2O,NCH4,NCO,NC11,NC12,NCFC,NO2
-*MNH  real CVCO2,CVN2O,CVCO,CVCH4,CVF11,CVF12,CVO2,FTEMP(JV3),
-*MNH &     FCH2O(JV3),FCCO2(JV3),FCO3(JV3),XLIM(JV10),CLIM(JV2)
-*MNH  COMMON/YOMRADI/NABS,NATM,NATMS,NSPWV,NTMP1,NTEMP,NCH2O,NCCO2,NCO3,
-*MNH &     NCHAN,NH2O,NCO2,NO3,NCNT,NN2O,NCH4,NCO,NC11,NC12,NCFC,NO2
-*MNH  COMMON /YOMRADR/CVCO2,CVN2O,CVCO,CVCH4,CVF11,CVF12,CVO2,
-*MNH &     FTEMP,FCH2O,FCCO2,FCO3,XLIM,CLIM
-                                !include 'yomspe.h'
-*MNH  integer N_INT,NA
-*MNH  real TREF,TPOLY
-*MNH  real WNU(JV2),RODWAL(6,8),POLPLCK(6,2),WVNA(JNINT),WVNB(JNINT),
-*MNH &     RALPHA,RPI,RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,
-*MNH &     RF11M,RF12M
-*MNH  COMMON /YOMSPEI/ N_INT,NA,TREF,TPOLY     
-*MNH  COMMON /YOMSPER/ WNU,RODWAL,POLPLCK,WVNA,WVNB,RALPHA,RPI,
-*MNH &  RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,RF11M,RF12M
-*MNH  real WNUTOT(2,20), POLPLCKTOT(6,2,20), RODWALTOT(6,8,20)
-*MNH  COMMON /YOMSPET/ WNUTOT, RODWALTOT, POLPLCKTOT
-C     ------------------------------------------------------------------
-C
-C          0.1  ARGUMENTS
-C
-C
-      REAL PT(KLON,KLEV+1),PDT0(KLON),PEM0(KLON)
-      REAL PTAVE(KLON,KLEV)
-      REAL PANGLE(KLON), PU(KLON,8,KGL+1)
-      REAL ZCLDLD(KLON,KLEV),ZCLDLU(KLON,KLEV)
-C
-      REAL PCNTRB(KLON,KLEV+1,KLEV+1),PRADC(KLON,20),PRADT(KLON,20)
-C     ------------------------------------------------------------------
-C
-C          0.2  LOCAL ARRAYS
-C
-      REAL
-     *     ZBINT(KLON,KLEV+1)        
-     *  ,  ZBLAY(KLON,KLEV)
-     *  ,  ZBLEV(KLON,KLEV+1)
-     *  ,  ZCNTRB(KLON,KLEV+1,KLEV+1)
-     *  ,  ZDZ(KLON,KLEV)
-     *  ,  ZTAVSL(KLON,3*KLEV)
-*MNH     *  ,  ZV(KLON,JUABS,3*KLEV+1)
-     *  ,  ZV(KLON,JPUABS,3*KLEV+1)
-     *  ,  ZDBSL(KLON,2*KLEV)
-     *  ,  ZCDBSL(KLON,2*KLEV)
-      REAL
-     *     ZBSUI(KLON),  ZRES(KLON) ,ZRES2(KLON), ZTI(KLON)
-     *  ,  ZTI2(KLON)
-     *  ,  ZBSUR(KLON)
-      REAL
-     *    ZFDC(KLON,KLEV+1),ZFDT(KLON,KLEV+1)
-     *  , ZFUC(KLON,KLEV+1),ZFUT(KLON,KLEV+1)
-C
-C     ------------------------------------------------------------------
-C
-C*         1.   INITIALIZATION
-C
- 100  CONTINUE
-C
-C     IF (NIMP.EQ.0) STOP
- 
-      IF (KCONF.EQ.0) THEN
-         IBOT=1
-         ITOP=KLEV+1
-         IVDIS=KLEV
-      ELSE IF (KCONF.EQ.1) THEN
-         IBOT=1
-         ITOP=KLEV+1
-         IVDIS=1
-      ELSE
-         IBOT=1
-         ITOP=KLEV+1
-         IVDIS=1
-         WRITE (NULOUT,9101) KCONF
-      END IF
-C
-       
-                  
-      INH2O=1
-      INCO2=2
-      INO3 =3
-      INN2O=4
-      INCH4=5
-      INCO =6
-      INC11=7
-      INC12=8
-      INCFC=9
-C
-      DO 103 JK1=1,KLEV+1
-      DO 102 JK2=1,KLEV+1
-      DO 101 JL=KIDIA,KFDIA
-      PCNTRB(JL,JK1,JK2)=0.
- 101  CONTINUE
- 102  CONTINUE
- 103  CONTINUE
-C 
-      IG1P1=KNG1+1
-      DO 113 JK=1,KLEV
-      JJ=(JK-1)*IG1P1+1
-      JJPN=JJ+KNG1
-      DO 112 JKSL=JJ,JJPN
-      DO 111 JL=KIDIA,KFDIA
-      ZTAVSL(JL,JKSL)=PTAVE(JL,JK)
- 111  CONTINUE
- 112  CONTINUE
- 113  CONTINUE
-      DO JK=1,2*KLEV
-      DO JL=KIDIA,KFDIA
-      ZCDBSL(JL,JK)=0.
-      END DO
-      END DO
-C
-C     ------------------------------------------------------------------
-C
-C          2.   LOOP ON WAVENUMBER
-C
- 200  CONTINUE
-C
-      DO 499 JWVN=KINIS,KENDS
-C
-      IH2O=1
-      ICNT=1
-      ICO2=1
-      IO3 =1
-      IN2O=1
-      ICH4=1
-      ICO =1
-      IC11=1
-      IC12=1
-      ICFC=1
-C
-C
-C*         2.1  READ COEFFICIENTS FOR A GIVEN SPECTRAL INTERVAL
-C
- 210  CONTINUE
-      do JNU=1,2
-*MNH         WNU(JNU)= WNUTOT(JNU,JWVN)
-         XWNU(JNU)= XWNUTOT(JNU,JWVN)
-*MNH
-      end do
-      do JPLA=1,2
-         do JPOL=1,6
-*MNH             POLPLCK(JPOL,JPLA)= POLPLCKTOT(JPOL,JPLA,JWVN)
-             XPOLPLCK(JPOL,JPLA)= XPOLPLCKTOT(JPOL,JPLA,JWVN)
-*MNH
-         end do
-      end do
-      do JABS=1,NA
-         do JCOE=1,6
-*MNH            RODWAL(JCOE,JABS)= RODWALTOT(JCOE,JABS,JWVN)
-            XRODWAL(JCOE,JABS)= XRODWALTOT(JCOE,JABS,JWVN)
-*MNH
-       end do
-      end do
-C
-C
-C*         2.2  INITIALIZATION
-C
- 220  CONTINUE
-C
-      IBBF=1
-      DO ICHAN=1,NCHAN
-*MNH      IF (WNU(1).GE.XLIM(ICHAN)) IBBF=ICHAN
-      IF (XWNU(1).GE.XXLIM(ICHAN)) IBBF=ICHAN
-*MNH 
-      END DO
-c      IF (WNU(1).GE.XLIM(1)) IBBF=1
-c      IF (WNU(1).GE.XLIM(2)) IBBF=2
-c      IF (WNU(1).GE.XLIM(3)) IBBF=3
-c      IF (WNU(1).GE.XLIM(4)) IBBF=4
-c      IF (WNU(1).GE.XLIM(5)) IBBF=5
-c      IF (WNU(1).GE.XLIM(6)) IBBF=6
-c      IF (WNU(1).GE.XLIM(7)) IBBF=7
-c      IF (WNU(1).GE.XLIM(8)) IBBF=8
-c      IF (WNU(1).GE.XLIM(9)) IBBF=9
-C
-*MNH      ZWVN=0.5*(WNU(1)+WNU(2))
-      ZWVN=0.5*(XWNU(1)+XWNU(2))
-*MNH      WVNA(JWVN)=WNU(1)
-      XWVNA(JWVN)=XWNU(1)
-*MNH      WVNB(JWVN)=WNU(2)
-      XWVNB(JWVN)=XWNU(2)
-*MNH
-C
-      DO 224 JKSL=1,2*KLEV
-      DO 221 JL=KIDIA,KFDIA
-      ZDBSL(JL,JKSL)=0.
- 221  CONTINUE
-      DO 223 JABS=1,KUABS
-      DO 222 JL=KIDIA,KFDIA
-C       ZV(JL,JABS,JKSL)=0.
- 222  CONTINUE
- 223  CONTINUE
- 224  CONTINUE
-C
-      ZV = 0.0
-C
-      LLCNT=.FALSE.
-*MNH      IF (WNU(1).LT.CLIM(1) .OR. WNU(1).GE.CLIM(2)) ICNT=0
-      IF (XWNU(1).LT.XCLIM(1) .OR. XWNU(1).GE.XCLIM(2)) ICNT=0
-*MNH      IF (WNU(1).GE.330.     .OR. WNU(1).LE.1300.   ) LLCNT=.TRUE.
-      IF (XWNU(1).GE.330.     .OR. XWNU(1).LE.1300.   ) LLCNT=.TRUE.
-*MNH
-CCO2  IF (WNU(1).LT.500.     .OR. WNU(1).GE.1250.   ) ICO2=0
-CO3   IF (WNU(1).LT.970.     .OR. WNU(1).GE.1110.   ) IO3 =0
-C
-*MNH      ZA1=RODWAL(1,INH2O)
-      ZA1=XRODWAL(1,INH2O)
-*MNH      ZA2=RODWAL(1,INCO2)
-      ZA2=XRODWAL(1,INCO2)
-*MNH      ZA3=RODWAL(1,INO3 )
-      ZA3=XRODWAL(1,INO3 )
-*MNH      ZA4=RODWAL(1,INN2O)
-      ZA4=XRODWAL(1,INN2O)
-*MNH      ZA5=RODWAL(1,INCH4)
-      ZA5=XRODWAL(1,INCH4)
-*MNH
-C
-C      IF (NIMP.EQ.0) THEN
-C      PRINT 9224,ZA1,ZA2,ZA3,ZA4,ZA5,KH2O,KCO2,KO3 ,KN2O,KCH4
-C 9224 FORMAT(1X,5E13.6,5I3)     
-C      END IF
-      IF (ZA1.EQ.0. .OR. KH2O.EQ.0) IH2O=0
-      IF (ZA2.EQ.0. .OR. KCO2.EQ.0) ICO2=0
-      IF (ZA3.EQ.0. .OR. KO3 .EQ.0) IO3 =0
-      IF (ZA4.EQ.0. .OR. KN2O.EQ.0) IN2O=0
-      IF (ZA5.EQ.0. .OR. KCH4.EQ.0) ICH4=0
-      IF (NCNT.EQ.0) ICNT=0
-      ICO = 0
-      IC11= 0
-      IC12= 0
-      ICFC= 0
-C
-c      PRINT 9221,JWVN,WNU(1),WNU(2),IH2O,ICO2,IO3,IN2O,ICH4,ICNT
-c     $ ,ICO,IC11,IC12,ICFC
-C      IF (NIMP.EQ.0) THEN
-C      PRINT 9221,JWVN,WNU(1),WNU(2),IH2O,ICO2,IO3,IN2O,ICH4,ICNT
-C     $ ,ICO,IC11,IC12,ICFC
-C 9221 FORMAT(1X,'JWVN= ',I3,' WV= ',F8.2,' - ',F8.2,2X,10I3)     
-C      END IF
-C
-C
-C
-C
-C*         2.3  INTRODUCTION OF THE TEMPERATURE EFFECT
-C
- 230  CONTINUE
-C
-      IF (IH2O.NE.0) THEN
-         DO 232 JKSL=KGL,1,-1
-         DO 231 JL=KIDIA,KFDIA
-         IF (LPTDEP) THEN
-*MNH            ZTX =ZTAVSL(JL,JKSL)-TREF
-            ZTX =ZTAVSL(JL,JKSL)-XTREF
-            ZTX2=ZTX*ZTX
-*MNH            ZPHI=RODWAL(3,INH2O)*ZTX+RODWAL(4,INH2O)*ZTX2
-            ZPHI=XRODWAL(3,INH2O)*ZTX+XRODWAL(4,INH2O)*ZTX2
-*MNH            ZPSI=RODWAL(5,INH2O)*ZTX+RODWAL(6,INH2O)*ZTX2
-            ZPSI=XRODWAL(5,INH2O)*ZTX+XRODWAL(6,INH2O)*ZTX2
-*MNH
-            ZUA =PU(JL,1,JKSL)*EXP  (ZPHI)
-            ZUB =PU(JL,2,JKSL)*EXP  (2.*ZPSI)
-         ELSE
-            ZUA =PU(JL,1,JKSL)
-            ZUB =PU(JL,2,JKSL)
-         END IF
-         ZV(JL,1,JKSL)=ZV(JL,1,JKSL+1)+ZUA
-         ZV(JL,2,JKSL)=ZV(JL,2,JKSL+1)+ZUB
- 231     CONTINUE
- 232     CONTINUE
-      END IF
-C      IF (NIMP.EQ.0) print *,' SPECTR after 232 '
-C
-      IF (ICO2.NE.0) THEN
-         DO 234 JKSL=KGL,1,-1
-         DO 233 JL=KIDIA,KFDIA
-         IF (LPTDEP) THEN
-*MNH            ZTX =ZTAVSL(JL,JKSL)-TREF
-            ZTX =ZTAVSL(JL,JKSL)-XTREF
-            ZTX2=ZTX*ZTX
-*MNH            ZPHI=RODWAL(3,INCO2)*ZTX+RODWAL(4,INCO2)*ZTX2
-            ZPHI=XRODWAL(3,INCO2)*ZTX+XRODWAL(4,INCO2)*ZTX2
-*MNH            ZPSI=RODWAL(5,INCO2)*ZTX+RODWAL(6,INCO2)*ZTX2
-            ZPSI=XRODWAL(5,INCO2)*ZTX+XRODWAL(6,INCO2)*ZTX2
-*MNH
-            ZUA =PU(JL,3,JKSL)*EXP  (ZPHI)
-            ZUB =PU(JL,4,JKSL)*EXP  (2.*ZPSI)
-         ELSE
-            ZUA =PU(JL,3,JKSL)
-            ZUB =PU(JL,4,JKSL)
-         END IF
-         ZV(JL,3,JKSL)=ZV(JL,3,JKSL+1)+ZUA
-         ZV(JL,4,JKSL)=ZV(JL,4,JKSL+1)+ZUB
- 233     CONTINUE
- 234     CONTINUE
-      END IF
-C
-      IF (IO3 .NE.0) THEN
-         DO 236 JKSL=KGL,1,-1
-         DO 235 JL=KIDIA,KFDIA
-         IF (LPTDEP) THEN
-*MNH            ZTX =ZTAVSL(JL,JKSL)-TREF
-            ZTX =ZTAVSL(JL,JKSL)-XTREF
-            ZTX2=ZTX*ZTX
-*MNH            ZPHI=RODWAL(3,INO3 )*ZTX+RODWAL(4,INO3 )*ZTX2
-            ZPHI=XRODWAL(3,INO3 )*ZTX+XRODWAL(4,INO3 )*ZTX2
-*MNH            ZPSI=RODWAL(5,INO3 )*ZTX+RODWAL(6,INO3 )*ZTX2
-            ZPSI=XRODWAL(5,INO3 )*ZTX+XRODWAL(6,INO3 )*ZTX2
-*MNH
-            ZUA =PU(JL,5,JKSL)*EXP  (ZPHI)
-            ZUB =PU(JL,6,JKSL)*EXP  (2.*ZPSI)
-         ELSE
-            ZUA =PU(JL,5,JKSL)
-            ZUB =PU(JL,6,JKSL)
-         END IF
-         ZV(JL,5,JKSL)=ZV(JL,5,JKSL+1)+ZUA
-         ZV(JL,6,JKSL)=ZV(JL,6,JKSL+1)+ZUB
- 235     CONTINUE
- 236     CONTINUE
-      END IF
-C
-      IF (ICNT.NE.0) THEN
-         DO 238 JKSL=KGL,1,-1
-         DO 237 JL=KIDIA,KFDIA
-         IF (LPTDEP) THEN
-            ZFACTC= 6.08*(296./ZTAVSL(JL,JKSL)-1.)
-            ZUA =PU(JL,7,JKSL)*EXP  (ZFACTC)
-            ZUB =PU(JL,8,JKSL)
-         ELSE
-            ZUA =PU(JL,7,JKSL)
-            ZUB =PU(JL,8,JKSL)
-         END IF
-         ZV(JL,11,JKSL)=ZV(JL,11,JKSL+1)+ZUA
-         ZV(JL,12,JKSL)=ZV(JL,12,JKSL+1)+ZUB
- 237     CONTINUE
- 238     CONTINUE
-      END IF
-C
-      IF (IN2O.NE.0) THEN
-        DO 242 JKSL=KGL,1,-1
-         DO 241 JL=KIDIA,KFDIA
-         IF (LPTDEP) THEN
-*MNH            ZTX =ZTAVSL(JL,JKSL)-TREF
-            ZTX =ZTAVSL(JL,JKSL)-XTREF
-            ZTX2=ZTX*ZTX
-*MNH            ZPHI=RODWAL(3,INN2O)*ZTX+RODWAL(4,INN2O)*ZTX2
-            ZPHI=XRODWAL(3,INN2O)*ZTX+XRODWAL(4,INN2O)*ZTX2
-*MNH            ZPSI=RODWAL(5,INN2O)*ZTX+RODWAL(6,INN2O)*ZTX2
-            ZPSI=XRODWAL(5,INN2O)*ZTX+XRODWAL(6,INN2O)*ZTX2
-*MNH
-            ZUA =PU(JL,3,JKSL)*EXP  (ZPHI)   *PCMN2O/PCMCO2
-            ZUB =PU(JL,4,JKSL)*EXP  (2.*ZPSI)*PCMN2O/PCMCO2
-         ELSE
-            ZUA =PU(JL,3,JKSL)*PCMN2O/PCMCO2
-            ZUB =PU(JL,4,JKSL)*PCMN2O/PCMCO2
-         END IF
-         ZV(JL,7,JKSL)=ZV(JL,7,JKSL+1)+ZUA
-         ZV(JL,8,JKSL)=ZV(JL,8,JKSL+1)+ZUB
- 241     CONTINUE
- 242     CONTINUE
-      END IF
-C
-      IF (ICH4.NE.0) THEN
-         DO 244 JKSL=KGL,1,-1
-         DO 243 JL=KIDIA,KFDIA
-         IF (LPTDEP) THEN
-*MNH            ZTX =ZTAVSL(JL,JKSL)-TREF
-            ZTX =ZTAVSL(JL,JKSL)-XTREF
-            ZTX2=ZTX*ZTX
-*MNH            ZPHI=RODWAL(3,INCH4)*ZTX+RODWAL(4,INCH4)*ZTX2
-            ZPHI=XRODWAL(3,INCH4)*ZTX+XRODWAL(4,INCH4)*ZTX2
-*MNH            ZPSI=RODWAL(5,INCH4)*ZTX+RODWAL(6,INCH4)*ZTX2
-            ZPSI=XRODWAL(5,INCH4)*ZTX+XRODWAL(6,INCH4)*ZTX2
-*MNH
-            ZUA =PU(JL,3,JKSL)*EXP  (ZPHI)   *PCMCH4/PCMCO2
-            ZUB =PU(JL,4,JKSL)*EXP  (2.*ZPSI)*PCMCH4/PCMCO2
-         ELSE
-            ZUA =PU(JL,3,JKSL)*PCMCH4/PCMCO2
-            ZUB =PU(JL,4,JKSL)*PCMCH4/PCMCO2
-         END IF
-         ZV(JL, 9,JKSL)=ZV(JL, 9,JKSL+1)+ZUA
-         ZV(JL,10,JKSL)=ZV(JL,10,JKSL+1)+ZUB
- 243     CONTINUE
- 244     CONTINUE
-      END IF
-C 
-C      IF (NIMP.LE.2) THEN
-C         WRITE (NULOUT,9244) KCABS,KH2O,KCO2,KO3,KCNT,KN2O,KCH4,KCO
-C     *     ,KC11,KC12,KCFC
-C     *     ,JWVN,IH2O,ICO2,IO3,ICNT,IN2O,ICH4,ICO,IC11,IC12,ICFC
-C         WRITE (NULOUT,9245) KIDIA,(ZV(KIDIA,JABS,1),JABS=1,KUABS)
-C         WRITE (NULOUT,9245) KFDIA,(ZV(KFDIA,JABS,1),JABS=1,KUABS)
-C      END IF
-C
-C
-C
-C*         2.5  COMPUTES PLANCK FUNCTIONS
-C
- 250  CONTINUE
-C
-      INDPLK=1
-      DO 253 JK=1,KLEV
-      DO 251 JL=KIDIA,KFDIA
-      ZTI(JL)=PT(JL,JK)
-      ZTI2(JL)=PTAVE(JL,JK)
- 251  CONTINUE
-C
-      CALL POLPLK (KIDIA,KFDIA,KLON,INDPLK,ZTI ,ZRES )
-      CALL POLPLK (KIDIA,KFDIA,KLON,INDPLK,ZTI2,ZRES2)
-C
-      DO 252 JL=KIDIA,KFDIA
-      ZBLEV(JL,JK)=ZRES(JL)
-      ZBLAY(JL,JK)=ZRES2(JL)
-      ZBINT(JL,JK)=ZBINT(JL,JK)+ZRES(JL)
- 252  CONTINUE
-C      IF (NIMP.EQ.0) THEN
-C      JL=KIDIA
-C      print 9252,0,PT(JL,JK),PTAVE(JL,JK)
-C     $ ,ZBLAY(JL,JK),ZBLEV(JL,JK),ZBINT(JL,JK)
-C 9252 FORMAT(1X,I3,2F8.3,3F14.7)     
-C      END IF
- 253  CONTINUE
-C
-      DO 254 JL=KIDIA,KFDIA
-      ZTI2(JL)=PT(JL,1)+PDT0(JL)
-      ZTI (JL)=PT(JL,KLEV+1)
- 254  CONTINUE
-C
-      CALL POLPLK (KIDIA,KFDIA,KLON,INDPLK,ZTI2,ZBSUR)
-      CALL POLPLK (KIDIA,KFDIA,KLON,INDPLK,ZTI ,ZRES )
-C
-      DO 255 JL=KIDIA,KFDIA
-      ZBLEV(JL,KLEV+1)=ZRES(JL)
-      ZBINT(JL,KLEV+1)=ZBINT(JL,KLEV+1)+ZRES(JL)
-C      ZBSUI(JL)=ZBSUI(JL)+ZBSUR(JL)
- 255  CONTINUE
-C      IF (NIMP.EQ.0) THEN
-C      JL=KIDIA
-C      print 9255, JWVN,ZTI(JL),ZTI2(JL)
-C     $ ,ZBSUR(JL),ZBSUI(JL),ZBLEV(JL,KLEV+1),ZBINT(JL,KLEV+1)
-C 9255 FORMAT(1X,I3,2F8.3,4F14.7)
-C      END IF
-C
-      DO 257 JK = 1 , KLEV
-      JK2 = 2 * JK
-      JK1 = JK2 - 1
-      DO 256 JL = KIDIA,KFDIA
-      ZDBSL(JL,JK1) = ZBLAY(JL,JK  ) - ZBLEV(JL,JK)
-      ZDBSL(JL,JK2) = ZBLEV(JL,JK+1) - ZBLAY(JL,JK)
-      ZCDBSL(JL,JK1)= ZCDBSL(JL,JK1) + ZDBSL(JL,JK1)
-      ZCDBSL(JL,JK2)= ZCDBSL(JL,JK2) + ZDBSL(JL,JK2)
- 256  CONTINUE
-C      IF (NIMP.EQ.0) THEN
-C      JL=KIDIA
-C      print 9256,JK,PTAVE(JL,JK),ZDBSL(JL,JK1),ZDBSL(JL,JK2)
-C     $                          ,ZCDBSL(JL,JK1),ZCDBSL(JL,JK2)
-C 9256 FORMAT(1X,I3,F8.3,4F14.7)     
-C      END IF
- 257  CONTINUE
- 259  CONTINUE
-C      IF (NIMP.EQ.0) print *,' SPECTR after 259 '
-C
-C
-C
-C*         2.6  CALL VERTICAL INTEGRATION
-C
- 260  CONTINUE
-C
-      CALL VERTI
-     I ( KIDIA,KFDIA,KLON,KLEV,KGL,KCABS,KNG1,KUABS,KCONF
-     I , KH2O,KCO2,KO3,KCNT,KN2O,KCH4,KCO,KC11,KC12,KCFC
-     I , IBOT,ITOP,IVDIS
-     L , LPVOIGT
-     R , PANGLE,ZBLEV,ZBSUR,ZCNTRB,ZDZ,PEM0
-     R , ZV,ZDBSL,ZWVN
-     R , ZFDC,ZFUC )
-C
-       DO 263 JK1=1,KLEV+1
-       DO 262 JK2=1,KLEV+1
-       DO 261 JL=KIDIA,KFDIA
-       PCNTRB(JL,JK1,JK2)=PCNTRB(JL,JK1,JK2)+ZCNTRB(JL,JK1,JK2)
- 261   CONTINUE
- 
-C       IF (NIMP.EQ.0) THEN
-C       JL=KIDIA
-C       PRINT 9261,JK1,JK2,ZCNTRB(JL,JK1,JK2),PCNTRB(JL,JK1,JK2)
-C 9261  FORMAT(1X,2I4,2E15.8) 
-C       END IF     
- 262   CONTINUE
- 263   CONTINUE
-C
-       DO 265 JK=1,KLEV+1
-       DO 264 JL=KIDIA,KFDIA
-       ZFUT(JL,JK)=0.
-       ZFDT(JL,JK)=0.
-       ZFUT(JL,JK)=ZFUC(JL,JK)
-       ZFDT(JL,JK)=ZFDC(JL,JK)
- 264   CONTINUE
- 265   CONTINUE
-C       IF (NIMP.EQ.0) print *,' SPECTR after 265 '
-C
-C
-C     ------------------------------------------------------------------
-C
-C*         3.   INTRODUCE CLOUD EFFECTS (ON A SPECTRAL BASIS)
-C
- 300  CONTINUE
-C
-      IF (KCONF.EQ.0 .OR. KCONF.EQ.1) THEN
-C
-
-         CALL CLOUD
-     I     ( KIDIA , KFDIA, KLON  , KLEV
-     I     , KCLOUD, KOVLP
-     R     , ZBSUR , ZCLDLD, ZCLDLU, ZCNTRB, ZFUC, ZFDC, ZBLEV, PEM0
-     R     , ZFUT  , ZFDT 
-     S     )
-C
-C
-C
-      END IF
-C
-C
-C
-C
-C     ------------------------------------------------------------------
-C
-C*         4.   FILLING-UP BROAD-BAND FLUXES ARRAYS
-C
- 400  CONTINUE
-C
-      ILEV=0
-      IF (KCONF.EQ.0) THEN
-         IVSTP=1
-      ELSE
-         IVSTP=KLEV
-      END IF   
-      DO JL=KIDIA,KFDIA
-      PRADC(JL,JWVN)=ZFUC(JL,KLEV+1)
-      PRADT(JL,JWVN)=ZFUT(JL,KLEV+1)
-      END DO
-C
-C
-C
-C
-C
-C
-C
-C
-C          4.9  END OF SPECTRAL LOOP
-C
-C***
- 499  CONTINUE
-
- 9101 FORMAT (1X,'*VERTI* IMPROPER CONFIGURATION:',I2)
- 9201 FORMAT (1X,'*SPECTR* NULL ABSORBER AMOUNTS IUX= ',I2,' IUY= ',I2)
- 9244 FORMAT (1X,'REQUIRED:',11I3,' JWVN= ',I3,' ACTIVE:',10I3)
- 9245 FORMAT (1X,I3,14E9.3)
-C
-C     ------------------------------------------------------------------
-C
-      RETURN
-      END
-      SUBROUTINE POLPLK 
-     I ( KIDIA,KFDIA,KLON,KINDT
-     R , PT
-     R , PRES
-     S )
-C
-C**** *POLPLK* - COMPUTES PLANCK FUNCTIONS FROM POLYNOMIAL EXPANSION
-C
-C**   INTERFACE
-C     ---------
-C          *POLPLK* IS CALLED BY *SPECTR*
-C
-C     ARGUMENTS
-C     ---------
-C     === INPUTS ===
-C        KIDIA   : START OF VECTOR
-C        KFDIA   : END OF VECTOR
-C        KLON    : TOTAL LENGTH OF VECTOR
-C        KINDT   : 1. PLANCK FUNCTION   2. DERIVATIVE W.R.T. TEMPERATURE
-C        PT      : TEMPERATURE
-C     === OUTPUTS ===
-C        PRES    : B(T) OR DB(T)/DT
-C
-C     METHOD
-C     ------
-C
-C     REFERENCE
-C     ---------
-C
-C     AUTHOR
-C     ------
-C        JEAN-JACQUES MORCRETTE  *ECMWF*   96/12/20
-C
-C     MODIFICATIONS
-C     -------------
-C
-C     ------------------------------------------------------------------
-*MNH
-      USE MODD_RAD_TRANSF
-*MNH
-                                !include 'param.h'
-*MNH  INTEGER JNINT,JUABS,JUAMO,JV2,JV3,JV10
-*MNH  PARAMETER (JNINT=225,JUABS=14,JUAMO=8,JV2=2,JV3=3,JV10=10)
-                               !include 'yomgos.h'
-*MNH  real RT1(2),WG1(2)
-*MNH  COMMON /YOMGOS/ RT1,WG1
-                                !include 'yomio.h'
-*MNH  integer IMP,NIMP,NULOUT,NULINA,NULNAM
-*MNH  COMMON /YOMIO/ IMP,NIMP,NULOUT,NULINA,NULNAM
-                                !include 'yomspe.h'
-*MNH  integer N_INT,NA
-*MNH  real TREF,TPOLY
-*MNH  real WNU(JV2),RODWAL(6,8),POLPLCK(6,2),WVNA(JNINT),WVNB(JNINT),
-*MNH &     RALPHA,RPI,RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,
-*MNH &     RF11M,RF12M
-*MNH  COMMON /YOMSPEI/ N_INT,NA,TREF,TPOLY     
-*MNH  COMMON /YOMSPER/ WNU,RODWAL,POLPLCK,WVNA,WVNB,RALPHA,RPI,
-*MNH &  RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,RF11M,RF12M
-C     ------------------------------------------------------------------
-C
-C          0.1  ARGUMENTS
-C
-      REAL PT(KLON),PRES(KLON)
-C
-C     ------------------------------------------------------------------
-C
-C          0.2  LOCAL ARRAYS
-C
-      REAL ZT(KLON)
-C
-C     ------------------------------------------------------------------
-C
-C          1.
-C
- 100  CONTINUE
-C
-      DO 101 JL=KIDIA,KFDIA
-*MNH      ZT(JL)=(PT(JL)-TPOLY)/TPOLY
-      ZT(JL)=(PT(JL)-XTPOLY)/XTPOLY
-*MNH      PRES(JL)=POLPLCK(6,KINDT)
-      PRES(JL)=XPOLPLCK(6,KINDT)
-*MNH
- 101  CONTINUE
-C
-      DO 103 JPOL=5,1,-1
-      DO 102 JL=KIDIA,KFDIA
-*MNH      PRES(JL)=PRES(JL)*ZT(JL)+POLPLCK(JPOL,KINDT)
-      PRES(JL)=PRES(JL)*ZT(JL)+XPOLPLCK(JPOL,KINDT)
-*MNH
- 102  CONTINUE
- 103  CONTINUE
-C
-C     ------------------------------------------------------------------
-C
-      RETURN
-      END
-      SUBROUTINE VERTI 
-     I ( KIDIA, KFDIA, KLON , KLEV, KGL , KCABS, KNG1, KUABS, KCONF
-     I , KH2O , KCO2 , KO3  , KCNT, KN2O, KCH4 
-     I , KCO  , KC11 , KC12 , KCFC
-     I , KBOT , KTOP , KVDIS
-     L , LPVOIGT
-     R , PANGLE,PB   ,PBSUR,PCNTRB, PDZ, PEM0 , PV  , PDBSL, PWVN
-     R , PFDC  ,PFUC
-     S )
-C
-C**** *VERTI* - PERFORMS THE VERTICAL INTEGRATION
-C
-C**   INTERFACE
-C     ---------
-C          *VERTI* IS CALLED BY *SPECTR*
-C
-C     ARGUMENTS
-C     ---------
-C     === INPUTS ===
-C     I  KIDIA   : START OF VECTOR
-C     I  KFDIA   : END OF VECTOR
-C     I  KLON    : TOTAL LENGTH OF VECTOR
-C     I  KLEV    : NUMBER OF FULL-LEVELS (LAYERS)
-C     I  KGL     : NUMBER OF SUB-LAYERS IN VERTICAL INTEGRATION
-C     I  KCABS   : CONFIGURATION INDEX FOR ABSORBERS
-C     L  LPVOIGT : .T. IF VOIGT PROFILE IS ACCOUNTED FOR
-C     R  PANGLE  : 1./COS(VIEWING ANGLE) OR DIFFUSIVITY FACTOR
-C     R  PB      : PLANCK FUNCTION ON HALF-LEVELS
-C     R  PBSUR   : SURFACE PLANCK FUNCTION
-C     R  PCNTRB  : ENERGY EXCHANGE MATRIX
-C     R  PDZ     : LAYER THICKNESS
-C
-C     === OUTPUTS ===
-C        PFDC    : DOWNWARD CLEAR-SKY FLUXES
-C        PFUC    : UPWARD   CLEAR-SKY FLUXES
-C
-C     METHOD
-C     ------
-C
-C     REFERENCE
-C     ---------
-C
-C     AUTHOR
-C     ------
-C        JEAN-JACQUES MORCRETTE  *ECMWF*   92/12/04
-C
-C     MODIFICATIONS
-C     -------------
-C
-C     ------------------------------------------------------------------
-*MNH
-      USE MODD_RAD_TRANSF
-*MNH
-      LOGICAL LPVOIGT
-                                !include 'param.h'
-*MNH  INTEGER JNINT,JUABS,JUAMO,JV2,JV3,JV10
-*MNH  PARAMETER (JNINT=225,JUABS=14,JUAMO=8,JV2=2,JV3=3,JV10=10)
-                                !include 'yomgos.h'
-*MNH  real RT1(2),WG1(2)
-*MNH  COMMON /YOMGOS/ RT1,WG1
-                                !include 'yomio.h'
-*MNH  integer IMP,NIMP,NULOUT,NULINA,NULNAM
-*MNH  COMMON /YOMIO/ IMP,NIMP,NULOUT,NULINA,NULNAM
-                                !include 'yomspe.h'
-*MNH  integer N_INT,NA
-*MNH  real TREF,TPOLY
-*MNH  real WNU(JV2),RODWAL(6,8),POLPLCK(6,2),WVNA(JNINT),WVNB(JNINT),
-*MNH &     RALPHA,RPI,RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,
-*MNH &     RF11M,RF12M
-*MNH  COMMON /YOMSPEI/ N_INT,NA,TREF,TPOLY     
-*MNH  COMMON /YOMSPER/ WNU,RODWAL,POLPLCK,WVNA,WVNB,RALPHA,RPI,
-*MNH &  RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,RF11M,RF12M
-C     ------------------------------------------------------------------
-C
-C          0.1  ARGUMENTS
-C
-      REAL
-     *     PANGLE(KLON)
-     *  ,  PB(KLON,KLEV+1)  , PBSUR(KLON)
-     *  ,  PCNTRB(KLON,KLEV+1,KLEV+1)
-     *  ,  PDT0(KLON) , PDZ(KLON,KLEV)
-*MNH     *  ,  PEM0(KLON) , PV(KLON,JUABS,KGL+1)
-     *  ,  PEM0(KLON) , PV(KLON,JPUABS,KGL+1)
-CBUG     *  ,  PDBSL(KLON,2*KLEV+1) , PXT(KLON,3,3*KLEV+1)
-     *  ,  PDBSL(KLON,2*KLEV) , PXT(KLON,3,3*KLEV+1)
-C
-      REAL
-     *    PFDC(KLON,KLEV+1)          , PFUC(KLON,KLEV+1)
-C
-C     ------------------------------------------------------------------
-C
-C          0.2  LOCAL ARRAYS
-C
-      INTEGER
-     *       INDCL(KLON,KLEV+1)
-C
-      REAL
-     *     ZDISD(KLON),ZDISU(KLON)
-     *  ,  ZCNSU(KLON),ZCNTP(KLON)
-     *  ,  ZDR(KLON),ZSR(KLON),ZDG(KLON)
-     *  ,  ZUG(KLON),ZBGND(KLON)
-     *  ,  ZTR(KLON),ZUR(KLON),ZFU(KLON)
-     *  ,  ZFD(KLON),ZFD1(KLON)
-      REAL
-     *ZDAU0(KLON),ZDAU1(KLON),ZDAU2(KLON), ZDAU3(KLON),ZDAU4(KLON)
-     *,ZDAU5(KLON),ZDAU6(KLON),ZDAU7(KLON),ZDAU8(KLON),ZDAU9(KLON)
-     *,ZSAU0(KLON),ZSAU1(KLON),ZSAU2(KLON),ZSAU3(KLON),ZSAU4(KLON)
-     *,ZSAU5(KLON),ZSAU6(KLON),ZSAU7(KLON),ZSAU8(KLON),ZSAU9(KLON)
-     *,ZTAU0(KLON),ZTAU1(KLON),ZTAU2(KLON),ZTAU3(KLON),ZTAU4(KLON)
-     *,ZTAU5(KLON),ZTAU6(KLON),ZTAU7(KLON),ZTAU8(KLON),ZTAU9(KLON)
-     *,ZUAU0(KLON),ZUAU1(KLON),ZUAU2(KLON),ZUAU3(KLON),ZUAU4(KLON)
-     *,ZUAU5(KLON),ZUAU6(KLON),ZUAU7(KLON),ZUAU8(KLON),ZUAU9(KLON)
-C     ------------------------------------------------------------------
-C
-C*         1.   INITIALIZATION
-C
- 100  CONTINUE
-C
-c      PRINT *,' Verti '
-C     IF (NIMP.EQ.0) STOP
-      
-C
-      DO 103 JK1=1,KLEV+1
-      DO 102 JK2=1,KLEV+1
-      DO 101 JL=KIDIA,KFDIA
-      PCNTRB(JL,JK1,JK2)=0.
- 101  CONTINUE
- 102  CONTINUE
- 103  CONTINUE
-C      IF (NIMP.EQ.0) print *,' VERTI after 103 '
-	
-C
-C
-C
-C     ------------------------------------------------------------------
-C
-C*         2.   VERTICAL INTEGRATION USING GAUSS QUADRATURE
-C
- 200  CONTINUE
-C
-C      IF (NIMP.EQ.0) print *,' Vertical integration '
-      DO 249 JK=KBOT,KTOP,KVDIS
-      ISL=(JK-1)*(KNG1+1)+1
-      IL12 = 2 * (JK - 1)
-C
-      DO 201 JL=KIDIA,KFDIA
-      ZDISD(JL)=0.
-      ZDISU(JL)=0.
-      ZDR  (JL)=1.
-      ZSR  (JL)=1.
-      ZTR  (JL)=1.
-      ZUR  (JL)=1.
-      PFUC(JL,JK)=0.
-      PFDC(JL,JK)=0.
- 201  CONTINUE
-C
-C
-C*         2.1  DOWNWARD FLUXES
-C
- 210  CONTINUE
-C
-      IF (JK.NE.KLEV+1) THEN
-C
-         DO 218 JK1=JK,KLEV
-         ISLX=(JK1-1)*(KNG1+1)+1
-         ID12 = 2 * (JK1 - 1)
-         
-         DO 211 JL=KIDIA,KFDIA
-         ZDG(JL)=0.
- 211     CONTINUE
-         DO 214 JG=1,KNG1
-         ISLXG=ISLX+JG
-         IDS = ID12 + JG
-         
-         DO 212 JL=KIDIA,KFDIA
-         ZDAU0(JL)=0.
-         ZDAU1(JL)=0.
-         ZDAU2(JL)=0.
-         ZDAU3(JL)=0.
-         ZDAU4(JL)=0.
-         ZDAU5(JL)=0.
-         ZDAU6(JL)=0.
-         ZDAU7(JL)=0.
-         ZDAU8(JL)=0.
-         ZDAU9(JL)=0.
- 212     CONTINUE
-C
-C         IF (NIMP.EQ.0) print 9212,JK,ISL,JK1,JG,ISLXG
-C 9212    FORMAT(1X,' Downward JK,ISL,JK1,JG,ISLXG ',5I4) 
-         IF (KCNT.EQ.1) THEN
-            CALL CNTINU (KIDIA,KFDIA,KLON, KLEV, ISL,ISLXG, KCABS
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZDAU0 )
-         END IF
-         IF (KH2O.EQ.1) THEN
-           CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,ISLXG,  1  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZDAU1 )
-         END IF
-          IF (KCO2.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,ISLXG,  2  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZDAU2 )
-         END IF
-         IF (KO3 .EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,ISLXG,  3  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZDAU3 )
-         END IF
-         IF (KN2O.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,ISLXG,  4  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZDAU4 )
-         END IF
-         IF (KCH4.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,ISLXG,  5  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZDAU5 )
-         END IF
-         IF (KC11.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,ISLXG,  6  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZDAU6 )
-         END IF
-         IF (KC12.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,ISLXG,  7  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZDAU7 )
-         END IF
-        IF (KCFC.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,ISLXG,  8  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZDAU8 )
-         END IF
-C
-         DO 213 JL=KIDIA,KFDIA
-         ZDR(JL)=EXP  (-ZDAU0(JL)-ZDAU1(JL)-ZDAU2(JL)-ZDAU3(JL)
-     *       -ZDAU4(JL)-ZDAU5(JL)-ZDAU6(JL)-ZDAU7(JL)-ZDAU8(JL))
-*MNH         ZDG(JL)=ZDG(JL)+PDBSL(JL,IDS)*ZDR(JL)*WG1(JG)
-         ZDG(JL)=ZDG(JL)+PDBSL(JL,IDS)*ZDR(JL)*XWG1(JG)
-*MNH
- 213     CONTINUE
- 
-C         IF (NIMP.EQ.0) THEN 
-C         JL=KIDIA
-C         print 9213,JK,JK1,JG,IDS,ZDR(JL),PDBSL(JL,IDS),ZDG(JL)
-C 9213    format(1x,'Dn',4I4,F8.5,2F14.7) 
-C         END IF         
- 214     CONTINUE
-C
-         IK1P1=JK1+1
-C
-         DO 215 JL=KIDIA,KFDIA
-         PCNTRB(JL,JK,IK1P1)=ZDG(JL)
-         ZDISD(JL)=ZDISD(JL)+ZDG(JL)
- 215     CONTINUE
-C
- 218     CONTINUE
-      END IF
-C
-C
-C
-C
-C*         2.2  UPWARD FLUXES
-C
- 220  CONTINUE
-C
-      IF (JK.NE.1) THEN
-C
-         DO 228 JK1= JK-1,1,-1
-         ISLX=(JK1-1)*(KNG1+1)+1
-         IU12 = 2 * (JK1 - 1)
-         
-         DO 221 JL=KIDIA,KFDIA
-         ZUG(JL)=0.
- 221     CONTINUE
-         DO 224 JG=1,KNG1
-         ISLXG=ISLX+JG
-         IUS = IU12 + JG
-         
-         DO 222 JL=KIDIA,KFDIA
-         ZUAU0(JL)=0.
-         ZUAU1(JL)=0.
-         ZUAU2(JL)=0.
-         ZUAU3(JL)=0.
-         ZUAU4(JL)=0.
-         ZUAU5(JL)=0.
-         ZUAU6(JL)=0.
-         ZUAU7(JL)=0.
-         ZUAU8(JL)=0.
-         ZUAU9(JL)=0.
- 222     CONTINUE
-C
-C        IF (NIMP.EQ.0) print 9222,JK,ISL,JK1,JG,ISLXG
- 9222    FORMAT(1X,' Upward JK,ISL,JK1,JG,ISLXG ',5I4)        
-         IF (KCNT.EQ.1) THEN
-            CALL CNTINU (KIDIA,KFDIA,KLON, KLEV, ISLXG,ISL, KCABS
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZUAU0 )
-         END IF
-         IF (KH2O.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISLXG,ISL,  1  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZUAU1 )
-         END IF
-         IF (KCO2.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISLXG,ISL,  2  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZUAU2 )
-         END IF
-         IF (KO3 .EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISLXG,ISL,  3  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZUAU3 )
-         END IF
-         IF (KN2O.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISLXG,ISL,  4  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZUAU4 )
-         END IF
-         IF (KCH4.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISLXG,ISL,  5  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZUAU5 )
-         END IF
-         IF (KC11.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISLXG,ISL,  6  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZUAU6 )
-         END IF
-         IF (KC12.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISLXG,ISL,  7  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZUAU7 )
-         END IF
-         IF (KCFC.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISLXG,ISL,  8  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZUAU8 )
-         END IF
-C
-         DO 223 JL=KIDIA,KFDIA
-         ZUR(JL)=EXP  (-ZUAU0(JL)-ZUAU1(JL)-ZUAU2(JL)-ZUAU3(JL)
-     *       -ZUAU4(JL)-ZUAU5(JL)-ZUAU6(JL)-ZUAU7(JL)-ZUAU8(JL))
-*MNH         ZUG(JL)=ZUG(JL)+PDBSL(JL,IUS)*ZUR(JL)*WG1(JG)
-         ZUG(JL)=ZUG(JL)+PDBSL(JL,IUS)*ZUR(JL)*XWG1(JG)
-*MNH
- 223     CONTINUE
-C         IF (NIMP.EQ.0) THEN 
-C         JL=KIDIA
-C         print 9223,JK,JK1,JG,IUS,ZUR(JL),PDBSL(JL,IDS),ZUG(JL)
-C 9223    format(1x,'Up',4I4,F8.5,2F14.7)
-C         END IF         
- 224     CONTINUE
-C
-         DO 225 JL=KIDIA,KFDIA
-         PCNTRB(JL,JK,JK1  )=ZUG(JL)
-         ZDISU(JL)=ZDISU(JL)+ZUG(JL)
- 225     CONTINUE
-C
- 228     CONTINUE
-      END IF
-C
-C
-C
-C
-C
-C
-C*         2.3  EXCHANGE WITH THE TOP OF THE ATMOSPHERE
-C
- 230  CONTINUE
-C
-      IF (JK.NE.KLEV+1) THEN
-C
-         DO 231 JL=KIDIA,KFDIA
-         ZTAU0(JL)=0.
-         ZTAU1(JL)=0.
-         ZTAU2(JL)=0.
-         ZTAU3(JL)=0.
-         ZTAU4(JL)=0.
-         ZTAU5(JL)=0.
-         ZTAU6(JL)=0.
-         ZTAU7(JL)=0.
-         ZTAU8(JL)=0.
-         ZTAU9(JL)=0.
- 231     CONTINUE
-C
-C        IF (NIMP.EQ.0) print 9231,JK,ISL,KGL+1
- 9231    FORMAT(1X,' Top JK,ISL,KGL+1 ',5I4)        
-         IF (KCNT.EQ.1) THEN
-            CALL CNTINU (KIDIA,KFDIA,KLON, KLEV, ISL,KGL+1, KCABS
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZTAU0 )
-         END IF
-         IF (KH2O.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,KGL+1, 1  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZTAU1 )
-         END IF
-         IF (KCO2.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,KGL+1, 2  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZTAU2 )
-         END IF
-         IF (KO3 .EQ.1) THEN
-             CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,KGL+1, 3  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZTAU3 )
-         END IF
-         IF (KN2O.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,KGL+1, 4  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZTAU4 )
-         END IF
-         IF (KCH4.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,KGL+1, 5  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZTAU5 )
-         END IF
-         IF (KC11.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,KGL+1, 6  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZTAU6 )
-         END IF
-         IF (KC12.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,KGL+1, 7  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZTAU7 )
-         END IF
-         IF (KCFC.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, ISL,KGL+1, 8  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZTAU8 )
-         END IF
-C
-         DO 232 JL=KIDIA,KFDIA
-         ZTR(JL)=EXP  (-ZTAU0(JL)-ZTAU1(JL)-ZTAU2(JL)-ZTAU3(JL)
-     *       -ZTAU4(JL)-ZTAU5(JL)-ZTAU6(JL)-ZTAU7(JL)-ZTAU8(JL))
- 232     CONTINUE
-      END IF
-C
-      DO 233 JL=KIDIA,KFDIA
-      ZCNTP(JL)=ZTR(JL)*PB(JL,KLEV+1)
-      ZFD(JL)=ZCNTP(JL)-PB(JL,JK)-ZDISD(JL)
-      PFDC(JL,JK)=ZFD(JL)
- 233  CONTINUE
-C      IF (NIMP.EQ.0) THEN 
-C      JL=KIDIA
-C      print 9233,JK,ZTR(JL),PB(JL,KLEV+1),ZCNTP(JL),PB(JL,JK),ZDISD(JL)
-C     $             ,ZFD(JL) 
-C 9233 format(1x,'Xchg Top',I4,F8.5,5F14.7)
-C      END IF          
-C
-      IF (JK.EQ.1) THEN
-         DO 234 JL=KIDIA,KFDIA
-         ZFD1(JL)=-ZFD(JL)
- 234     CONTINUE
-      END IF
-C
-C
-C
-C
-C
-C*         2.4  EXCHANGE WITH THE SURFACE
-C
- 240  CONTINUE
-C
-      DO 241 JL=KIDIA,KFDIA
-      ZBGND(JL)=PBSUR(JL)*PEM0(JL)+(1.-PEM0(JL))*ZFD1(JL)-PB(JL,1)
-C     ZSR(JL)=1.
- 241  CONTINUE
-C      IF (NIMP.EQ.0. AND. JK.EQ.1) THEN
-C      JL=KIDIA
-C      print 9241,PBSUR(JL),PEM0(JL),ZFD1(JL),PB(JL,1),ZBGND(JL)
-C 9241 FORMAT(1X,'Surf ',F12.5,F8.5,3F12.5)      
-C      END IF
-C
-      IF (JK.NE.1) THEN
-C
-         DO 242 JL=KIDIA,KFDIA
-         ZSAU0(JL)=0.
-         ZSAU1(JL)=0.
-         ZSAU2(JL)=0.
-         ZSAU3(JL)=0.
-         ZSAU4(JL)=0.
-         ZSAU5(JL)=0.
-         ZSAU6(JL)=0.
-         ZSAU7(JL)=0.
-         ZSAU8(JL)=0.
-         ZSAU9(JL)=0.
- 242     CONTINUE
-C
-C        IF (NIMP.EQ.0) print 9242,JK,1,ISL
- 9242    FORMAT(1X,' Surface JK,1,ISL ',5I4)        
-         IF (KCNT.EQ.1) THEN
-            CALL CNTINU (KIDIA,KFDIA,KLON, KLEV, 1, ISL, KCABS
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZSAU0 )
-         END IF
-         IF (KH2O.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, 1, ISL, 1  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZSAU1 )
-         END IF
-         IF (KCO2.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, 1, ISL, 2  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZSAU2 )
-         END IF
-         IF (KO3 .EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, 1, ISL, 3  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZSAU3 )
-         END IF
-         IF (KN2O.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, 1, ISL, 4  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZSAU4 )
-         END IF
-         IF (KCH4.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, 1, ISL, 5  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZSAU5 )
-         END IF
-         IF (KC11.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, 1, ISL, 6  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZSAU6 )
-         END IF
-         IF (KC12.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, 1, ISL, 7  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZSAU7 )
-         END IF
-         IF (KCFC.EQ.1) THEN
-            CALL TRANSM (KIDIA,KFDIA,KLON, KLEV, 1, ISL, 8  ,KCABS
-     L  ,                LPVOIGT
-     R  ,                PANGLE,PV,PWVN
-     R  ,                ZSAU8 )
-         END IF
-C
-         DO 243 JL=KIDIA,KFDIA
-         ZSR(JL)=EXP  (-ZSAU0(JL)-ZSAU1(JL)-ZSAU2(JL)-ZSAU3(JL)
-     *       -ZSAU4(JL)-ZSAU5(JL)-ZSAU6(JL)-ZSAU7(JL)-ZSAU8(JL))
- 243     CONTINUE
-      END IF
-C
-      DO 244 JL=KIDIA,KFDIA
-      ZCNSU(JL)=ZSR(JL)*ZBGND(JL)
-      ZFU(JL)=ZCNSU(JL)+PB(JL,JK)-ZDISU(JL)
-      PFUC(JL,JK)=ZFU(JL)
- 244  CONTINUE
-C      IF (NIMP.EQ.0) THEN 
-C      JL=KIDIA
-C      print 9244,JK,ZSR(JL),ZBGND(JL),ZCNSU(JL),PB(JL,JK),ZDISU(JL)
-C     $             ,ZFU(JL) 
-C 9244 format(1x,'Xchg Sur',I4,F8.5,5F14.7)
-C      END IF         
-C
- 249  CONTINUE
-C
-C     ------------------------------------------------------------------
-C
-      RETURN
-      END
-      SUBROUTINE CNTINU (KIDIA,KFDIA,KLON, KLEV, KINF,KSUP, KCABS
-     R  ,                PANGLE,PV,PWVN
-     R  ,                PTAU )
-C
-C**** *CNTINU* - TRANSMISSION BY WATER VAPOR CONTINUUM
-C
-C**   INTERFACE
-C     ---------
-C          *CNTINU* IS CALLED BY *VERTI*
-C
-C     ARGUMENTS
-C     ---------
-C     === INPUTS ===
-C        KIDIA   : START OF VECTOR
-C        KFDIA   : END OF VECTOR
-C        KLON    : TOTAL LENGTH OF VECTOR
-C        KCABS   : CONFIGURATION INDEX FOR ABSORBERS
-C        KINF    : LOWER LEVEL OF LAYER CONSIDERED
-C        KSUP    : UPPER LEVEL OF LAYER CONSIDERED
-C        PANGLE  : 1./COS(VIEWING ANGLE) OR DIFFUSITY FACTOR
-C        PWVN    : WAVENUMBER
-C        PV      : REDUCED ABSORBER AMOUNTS CUMULATED FROM MODEL TOP
-C     === OUTPUTS ===
-C        PTAU    : OPTICAL THICKNESS DUE TO WATER VAPOR CONTINUUM
-C
-C     METHOD
-C     ------
-C
-C     REFERENCE
-C     ---------
-C
-C     AUTHOR
-C     ------
-C        JEAN-JACQUES MORCRETTE  *ECMWF*   96/12/20
-C
-C     MODIFICATIONS
-C     -------------
-C
-C     ------------------------------------------------------------------
-*MNH
-      USE MODD_RAD_TRANSF
-*MNH
-                                !include 'param.h'
-*MNH  INTEGER JNINT,JUABS,JUAMO,JV2,JV3,JV10
-*MNH  PARAMETER (JNINT=225,JUABS=14,JUAMO=8,JV2=2,JV3=3,JV10=10)
-                                !include 'yomgos.h'
-*MNH  real RT1(2),WG1(2)
-*MNH  COMMON /YOMGOS/ RT1,WG1
-                                !include 'yomio.h'
-*MNH  integer IMP,NIMP,NULOUT,NULINA,NULNAM
-*MNH  COMMON /YOMIO/ IMP,NIMP,NULOUT,NULINA,NULNAM
-                                !include 'yomrad.h'
-*MNH  integer NABS,NATM,NATMS,NSPWV,NTMP1,NTEMP,NCH2O,NCCO2,NCO3,
-*MNH &     NCHAN,NH2O,NCO2,NO3,NCNT,NN2O,NCH4,NCO,NC11,NC12,NCFC,NO2
-*MNH  real CVCO2,CVN2O,CVCO,CVCH4,CVF11,CVF12,CVO2,FTEMP(JV3),
-*MNH &     FCH2O(JV3),FCCO2(JV3),FCO3(JV3),XLIM(JV10),CLIM(JV2)
-*MNH  COMMON/YOMRADI/NABS,NATM,NATMS,NSPWV,NTMP1,NTEMP,NCH2O,NCCO2,NCO3,
-*MNH &     NCHAN,NH2O,NCO2,NO3,NCNT,NN2O,NCH4,NCO,NC11,NC12,NCFC,NO2
-*MNH  COMMON /YOMRADR/CVCO2,CVN2O,CVCO,CVCH4,CVF11,CVF12,CVO2,
-*MNH &     FTEMP,FCH2O,FCCO2,FCO3,XLIM,CLIM
-                                !include 'yomspe.h'
-*MNH  integer N_INT,NA
-*MNH  real TREF,TPOLY
-*MNH  real WNU(JV2),RODWAL(6,8),POLPLCK(6,2),WVNA(JNINT),WVNB(JNINT),
-*MNH &     RALPHA,RPI,RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,
-*MNH &     RF11M,RF12M
-*MNH  COMMON /YOMSPEI/ N_INT,NA,TREF,TPOLY     
-*MNH  COMMON /YOMSPER/ WNU,RODWAL,POLPLCK,WVNA,WVNB,RALPHA,RPI,
-*MNH &  RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,RF11M,RF12M
-C     ------------------------------------------------------------------
-C
-C          0.1  ARGUMENTS
-C
-*MNH      REAL PANGLE(KLON),PV(KLON,JUABS,3*KLEV+1)
-      REAL PANGLE(KLON),PV(KLON,JPUABS,3*KLEV+1)
-C
-      REAL PTAU(KLON)
-C
-C     ------------------------------------------------------------------
-C
-C          0.2  LOCAL ARRAYS
-C
-      REAL ZE(KLON),ZP(KLON),ZTAUE(KLON),ZTAUP(KLON)
-	REAL ZCOEF
-C
-C     ------------------------------------------------------------------
-C
-C          1.
-C
-      DO JL=KIDIA,KFDIA
-        PTAU(JL)=0.
-      END DO
-C
-*MNH      IF (PWVN.GT.CLIM(1)  .AND. PWVN.LT.CLIM(2)) THEN
-      IF (PWVN.GT.XCLIM(1)  .AND. PWVN.LT.XCLIM(2)) THEN
-C
-         ZCOEF=4.18 + 5578.*EXP(-7.87e-03*PWVN)
-         DO JL=KIDIA,KFDIA
-           ZE(JL)=PV(JL,11,KINF)-PV(JL,11,KSUP)
-           ZP(JL)=PV(JL,12,KINF)-PV(JL,12,KSUP)
-           ZTAUE(JL)=PANGLE(JL)*ZCOEF*ZE(JL)
-           ZTAUP(JL)=PANGLE(JL)*ZCOEF*ZP(JL)*0.002
-         END DO
-C
-         IF (KCABS.EQ.20) THEN
-            DO JL=KIDIA,KFDIA
-              ZTAUE(JL)=0.
-            END DO
-         END IF
-         IF (KCABS.EQ.21) THEN
-            DO JL=KIDIA,KFDIA
-              ZTAUP(JL)=0.
-            END DO
-         END IF
-C
-         DO JL=KIDIA,KFDIA
-           PTAU(JL)=ZTAUE(JL)+ZTAUP(JL)
-         END DO
-      END IF
-C
-C     ------------------------------------------------------------------
-C
-      RETURN
-      END
-      SUBROUTINE TRANSM 
-     I ( KIDIA,KFDIA,KLON, KLEV, KINF,KSUP, KABS,KCABS
-     L , LPVOIGT
-     R , PANGLE,PV,PWVN
-     R , PTAU
-     S )
-C
-C**** *TRANSM* - COMPUTES TRANSMISSION FUNCTIONS
-C
-C**   INTERFACE
-C     ---------
-C          *TRANSM* IS CALLED BY *VERTI*
-C
-C     ARGUMENTS
-C     ---------
-C     === INPUTS ===
-C        KIDIA   : START OF VECTOR
-C        KFDIA   : END OF VECTOR
-C        KLON    : TOTAL LENGTH OF VECTOR
-C        KINF    : LOWER LEVEL OF LAYER CONSIDERED
-C        KSUP    : UPPER LEVEL OF LAYER CONSIDERED
-C        KABS    : INDEX OF CONSIDERED ABSORBER
-C        KCABS   : CONFIGURATION INDEX FOR ABSORBERS
-C        LPVOIGT : .T. IF VOIGT PROFILE IS ACCOUNTED FOR
-C        PANGLE  : 1./COS(VIEWING ANGLE) OR DIFFUSITY FACTOR
-C        PV      : REDUCED ABSORBER AMOUNTS CUMULATED FROM MODEL TOP
-C        PWVN    : WAVENUMBER
-C     === OUTPUTS ===
-C        PTAU    : OPTICAL THICKNESS DUE TO WATER VAPOR CONTINUUM
-C
-C     METHOD
-C     ------
-C
-C     REFERENCE
-C     ---------
-C
-C     AUTHOR
-C     ------
-C        JEAN-JACQUES MORCRETTE  *ECMWF*   96/12/20
-C
-C     MODIFICATIONS
-C     -------------
-C
-C     ------------------------------------------------------------------
-*MNH
-      USE MODD_RAD_TRANSF
-      USE MODD_CST
-*MNH
-                                !include 'implic.h'
-      LOGICAL LPVOIGT
-                                !include 'param.h'
-*MNH  INTEGER JNINT,JUABS,JUAMO,JV2,JV3,JV10
-*MNH  PARAMETER (JNINT=225,JUABS=14,JUAMO=8,JV2=2,JV3=3,JV10=10)
-*MNH                                !include 'yomgos.h'
-*MNH  real RT1(2),WG1(2)
-*MNH  COMMON /YOMGOS/ RT1,WG1
-                                !include 'yomio.h'
-*MNH  integer IMP,NIMP,NULOUT,NULINA,NULNAM
-*MNH  COMMON /YOMIO/ IMP,NIMP,NULOUT,NULINA,NULNAM
-                                !include 'yomspe.h'
-*MNH  integer N_INT,NA
-*MNH  real TREF,TPOLY
-*MNH  real WNU(JV2),RODWAL(6,8),POLPLCK(6,2),WVNA(JNINT),WVNB(JNINT),
-*MNH &     RALPHA,RPI,RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,
-*MNH &     RF11M,RF12M
-*MNH  COMMON /YOMSPEI/ N_INT,NA,TREF,TPOLY     
-*MNH  COMMON /YOMSPER/ WNU,RODWAL,POLPLCK,WVNA,WVNB,RALPHA,RPI,
-*MNH &  RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,RF11M,RF12M
-C     ------------------------------------------------------------------
-C
-C          0.1  ARGUMENTS
-C
-C
-*MNH      REAL PANGLE(KLON),PV(KLON,JUABS,3*KLEV+1)
-      REAL PANGLE(KLON),PV(KLON,JPUABS,3*KLEV+1)
-C
-      REAL PTAU(KLON)
-C
-C     ------------------------------------------------------------------
-C
-C          0.2  LOCAL ARRAYS
-C
-      REAL ZA(KLON),ZB(KLON),ZC(KLON)
-      REAL ZD(KLON),ZF(KLON),ZG(KLON)
-      REAL ZAB(KLON),ZSQ(KLON),ZX(KLON)
-      REAL ZY(KLON)
-C
-C     ------------------------------------------------------------------
-C
-C          1.   INITIALIZATION
-C
- 100  CONTINUE
-C
-      DO 101 JL=KIDIA,KFDIA
-      PTAU(JL)=0.
-c	print *,'TRANSM:',JL,PANGLE(JL)
- 101  CONTINUE
-C
-*MNH      ZA1=RODWAL(1,KABS)
-      ZA1=XRODWAL(1,KABS)
-*MNH      ZA2=RODWAL(2,KABS)
-      ZA2=XRODWAL(2,KABS)
-*MNH
-c	print *,'TRANSM: ',ZA1,ZA2
-C
-C     ------------------------------------------------------------------
-C
-C          2.   SKIP COMPUTATION IF NO ABSORPTION OR NO ABSORBER
-C
- 200  CONTINUE
-C
-      IF (ZA1.EQ.0.) RETURN
-C
-      IUX=2*KABS-1
-      IUY=IUX+1
-C
-      DO 201 JL=KIDIA,KFDIA
-      ZX(JL)=PANGLE(JL)*(PV(JL,IUX,KINF)-PV(JL,IUX,KSUP))
-      ZY(JL)=PANGLE(JL)*(PV(JL,IUY,KINF)-PV(JL,IUY,KSUP))
-C      IF (ZX(JL).EQ.0. .OR. ZY(JL).EQ.0.) THEN
-C         PRINT 9201,IUX,IUY,KINF,KSUP
-C         print *,'ZX=',ZX(JL),' ZY=',ZY(JL)
-C         print *,PV(JL,IUX,KINF),PV(JL,IUX,KSUP)
-C         print *,PV(JL,IUY,KINF),PV(JL,IUY,KSUP)
-C         print *,'KABS ',kabs
-C	 print *,'PROFILE NUMBER:',JL,' PANGLE:',PANGLE(JL)
-C         STOP
-C      END IF
- 201  CONTINUE
-C
-C     ------------------------------------------------------------------
-C
-C          3.   COMPUTATION DEPEND ON ABSORBER AND LINE PROFILE
-C
- 300  CONTINUE
-C
-      IF (KABS.GE.4) GO TO 400
-      IF (LPVOIGT) GO TO 600
-      GO TO 500
-C
-C     ------------------------------------------------------------------
-C
-C          4.   GOODY'S STATISTICAL MODEL FOR N2O, CH4, CO
-C
- 400  CONTINUE
-C
-      DO 401 JL=KIDIA,KFDIA
-      ZSQ(JL)=SQRT  (1.+ZA1*ZX(JL)*ZX(JL)/(ZA2*ZY(JL)))
-      PTAU(JL)=ZA1*ZX(JL)/ZSQ(JL)
- 401  CONTINUE
-C
-      RETURN
-C
-C
-C     ------------------------------------------------------------------
-C
-C          5.   MALKMUS'S STATISTICAL MODEL FOR H2O, CO2, O3  - LORENTZ
-C
- 500  CONTINUE
-C
-      DO 501 JL=KIDIA,KFDIA
-      ZSQ(JL)=SQRT  (1.+4.*ZA1*ZX(JL)*ZX(JL)/(ZA2*ZY(JL))) - 1.
-      PTAU(JL)=ZA2*ZY(JL)*ZSQ(JL)/(2.*ZX(JL))
- 501  CONTINUE
-C
-      RETURN
-C
-C
-C     ------------------------------------------------------------------
-C
-C          6.   MALKMUS'S STATISTICAL MODEL FOR H2O, CO2, O3  - VOIGT
-C
- 600  CONTINUE
-C
-      IF (KABS-2.LT.0) GO TO 610
-      IF (KABS-2.EQ.0) GO TO 620
-      IF (KABS-2.GT.0) GO TO 630
-C
-C          6.1  WATER VAPOUR
-C
- 610  CONTINUE
-      ZDELTA=2.00
-*MNH      ZALPHA=RALPHA*SQRT(1./RH2OM)
-      ZALPHA=XALPHA*SQRT(1./XH2OM)
-*MNH      ZALPHA=RALPHA*SQRT(1./RH2OM)
-      ZALPHA=XALPHA*SQRT(1./XH2OM)
-      GO TO 650
-C
-C
-C          6.2  CARBON DIOXIDE
-C
- 620  CONTINUE
-      ZDELTA=0.75
-*MNH      ZALPHA=RALPHA*SQRT(1./RCO2M)
-      ZALPHA=XALPHA*SQRT(1./XCO2M)
-*MNH
-      GO TO 650
-C
-C
-C          6.3  OZONE
-C
- 630  CONTINUE
-      ZDELTA=0.25
-*MNH      ZALPHA=RALPHA*SQRT(1./RO3M)
-      ZALPHA=XALPHA*SQRT(1./XO3M)
-*MNH      GO TO 650
-C
-C          6.5  APPROXIMATE TREATMENT OF VOIGT LINE A LA FELS (1979)
-C
- 650  CONTINUE
-C
-      ZALPHD=ZALPHA*PWVN
-      DO 651 JL=KIDIA,KFDIA
-      ZA(JL)=ZA1*ZX(JL)
-*MNH      ZB(JL)=ZA2*ZY(JL)/(RPI*RPI*ZX(JL))
-      ZB(JL)=ZA2*ZY(JL)/(XPI*XPI*ZX(JL))
-*MNH
-      ZAB(JL)=ZA(JL)*ZB(JL)
-      ZC(JL)=4.*ZB(JL) + 1.4*ZALPHD/ZDELTA
-      ZD(JL)=0.5-ZB(JL)/ZC(JL)
-      ZSQ(JL)=SQRT  (ZAB(JL))
-      ZF(JL)=ZSQ(JL) * ATAN( ZSQ(JL)/ZC(JL) )
-      ZG(JL)=1. + ZA(JL)*ZD(JL)/ZC(JL)
-      PTAU(JL)=4.*ZF(JL)
-     *        +2.*ZC(JL)*LOG(ZG(JL)/(1.+ZAB(JL)/(ZC(JL)*ZC(JL))))
- 651  CONTINUE
-C
-C     ------------------------------------------------------------------
-C
- 9201 FORMAT (1X,'*TRANSM* NULL ABSORBER AMOUNTS IUX= ',I2,' IUY= ',I2
-     *,' BETWEEN LEVELS',I3,' AND',I3)
-C
-C     ------------------------------------------------------------------
-C
-      RETURN
-      END
-      SUBROUTINE CLOUD
-     I ( KIDIA , KFDIA, KLON  , KLEV
-     I , KCLOUD, KOVLP
-     R , PBSUR , PCLDLD,PCLDLU , PCNTRB, PFUC, PFDC, PBLEV, PEM0
-     R , PFUT  , PFDT 
-     S )
-C
-C**** *CLOUD* - INTRODUCES CLOUD EFFECT ON RADIATION FIELDS
-C
-C**   INTERFACE
-C     ---------
-C          *CLOUD* IS CALLED BY *SPECTR*
-C
-C     ARGUMENTS
-C     ---------
-C     === INPUTS ===
-C     === OUTPUTS ===
-C
-C     METHOD
-C     ------
-C
-C     REFERENCE
-C     ---------
-C
-C     AUTHOR
-C     ------
-C        JEAN-JACQUES MORCRETTE  *ECMWF*   96/12/20
-C
-C     MODIFICATIONS
-C     -------------
-C
-C     ------------------------------------------------------------------
-*MNH
-      USE MODD_RAD_TRANSF
-*MNH
-                                !include 'param.h'
-*MNH  INTEGER JNINT,JUABS,JUAMO,JV2,JV3,JV10
-*MNH  PARAMETER (JNINT=225,JUABS=14,JUAMO=8,JV2=2,JV3=3,JV10=10)
-                                !include 'yomgos.h'
-*MNH  real RT1(2),WG1(2)
-*MNH  COMMON /YOMGOS/ RT1,WG1
-                                !include 'yomio.h'
-*MNH  integer IMP,NIMP,NULOUT,NULINA,NULNAM
-*MNH  COMMON /YOMIO/ IMP,NIMP,NULOUT,NULINA,NULNAM
-                                !include 'yomrad.h'
-*MNH  integer NABS,NATM,NATMS,NSPWV,NTMP1,NTEMP,NCH2O,NCCO2,NCO3,
-*MNH &     NCHAN,NH2O,NCO2,NO3,NCNT,NN2O,NCH4,NCO,NC11,NC12,NCFC,NO2
-*MNH  real CVCO2,CVN2O,CVCO,CVCH4,CVF11,CVF12,CVO2,FTEMP(JV3),
-*MNH &     FCH2O(JV3),FCCO2(JV3),FCO3(JV3),XLIM(JV10),CLIM(JV2)
-*MNH  COMMON/YOMRADI/NABS,NATM,NATMS,NSPWV,NTMP1,NTEMP,NCH2O,NCCO2,NCO3,
-*MNH &     NCHAN,NH2O,NCO2,NO3,NCNT,NN2O,NCH4,NCO,NC11,NC12,NCFC,NO2
-*MNH  COMMON /YOMRADR/CVCO2,CVN2O,CVCO,CVCH4,CVF11,CVF12,CVO2,
-*MNH &     FTEMP,FCH2O,FCCO2,FCO3,XLIM,CLIM
-                                !include 'yomspe.h'
-*MNH  integer N_INT,NA
-*MNH  real TREF,TPOLY
-*MNH  real WNU(JV2),RODWAL(6,8),POLPLCK(6,2),WVNA(JNINT),WVNB(JNINT),
-*MNH &     RALPHA,RPI,RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,
-*MNH &     RF11M,RF12M
-*MNH  COMMON /YOMSPEI/ N_INT,NA,TREF,TPOLY     
-*MNH  COMMON /YOMSPER/ WNU,RODWAL,POLPLCK,WVNA,WVNB,RALPHA,RPI,
-*MNH &  RAIRM,RH2OM,RCO2M,RO3M,RN2OM,RCOM,RCH4M,RO2M,RF11M,RF12M
-C     ------------------------------------------------------------------
-C
-C          0.1  ARGUMENTS
-C
-      REAL PBSUR(KLON)      , PBLEV(KLON,KLEV+1)
-     R  ,  PCLDLD(KLON,KLEV)  , PCNTRB(KLON,KLEV+1,KLEV+1)
-     R  ,  PEM0(KLON), PCLDLU(KLON,KLEV)
-     R  ,  PFDC(KLON,KLEV+1), PFUC(KLON,KLEV+1)
-C     
-     R  ,  PFDT(KLON,KLEV+1), PFUT(KLON,KLEV+1)
-C
-C    -------------------------------------------------------------------
-C
-C*       0.2   LOCAL ARRAYS
-C              ------------
-C
-      REAL ZCLEAR(KLON)            , ZCLOUD(KLON)
-     S  ,  ZCLM(KLON,KLEV+1,KLEV+1)
-     S  ,  ZDNF(KLON,KLEV+1,KLEV+1)
-     S  ,  ZFD(KLON)               , ZFU(KLON)
-     S  ,  ZUPF(KLON,KLEV+1,KLEV+1)
-C
-C     ------------------------------------------------------------------
-C
-C*         1.      INITIALIZE TO CLEAR-SKY FLUXES
-C                  ------------------------------
-C
-      IMAXC=KLEV
-      REPSEC=1.E-12
-      REPSEC=1.e-7 ! JPChaboureau's modification to avoid division by zero
-C
-      DO JK = 1 , KLEV+1
-        DO JL = KIDIA,KFDIA
-          PFDT(JL,JK) = PFDC(JL,JK)
-          PFUT(JL,JK) = PFUC(JL,JK)
-        END DO
-      END DO
-C
-      DO JK1=1,KLEV+1
-        DO JK2=1,KLEV+1
-          DO JL = KIDIA,KFDIA
-            ZUPF(JL,JK2,JK1)=PFUC(JL,JK1)
-            ZDNF(JL,JK2,JK1)=PFDC(JL,JK1)
-          END DO
-        END DO
-      END DO
-C
-C     ------------------------------------------------------------------
-C
-C*         2.      FLUXES FOR ONE OVERCAST UNITY EMISSIVITY CLOUD
-C                  ----------------------------------------------
-C
-      DO JKC = 1 , IMAXC
-        JCLOUD=JKC
-        JKCP1=JCLOUD+1
-C
-C*         2.1     ABOVE THE CLOUD
-C                  ---------------
-C
-        DO JK=JKCP1,KLEV+1
-          JKM1=JK-1
-          DO JL = KIDIA,KFDIA
-            ZFU(JL)=0.
-          END DO
-          IF (JK .GT. JKCP1) THEN
-            DO JKJ=JKCP1,JKM1
-              DO JL = KIDIA,KFDIA
-                ZFU(JL) = ZFU(JL) + PCNTRB(JL,JK,JKJ)
-              END DO
-            END DO
-          END IF
-C
-          DO JL = KIDIA,KFDIA
-            ZUPF(JL,JKCP1,JK)=PBLEV(JL,JK)-ZFU(JL)
-          END DO
-        END DO
-C
-C
-C*         2.2     BELOW THE CLOUD
-C                  ---------------
-C
-        DO JK=1,JCLOUD
-          JKP1=JK+1
-          DO JL = KIDIA,KFDIA
-            ZFD(JL)=0.
-          END DO
-C
-          IF (JK .LT. JCLOUD) THEN
-            DO JKJ=JKP1,JCLOUD
-              DO JL = KIDIA,KFDIA
-                ZFD(JL) = ZFD(JL) + PCNTRB(JL,JK,JKJ)
-              END DO
-            END DO
-          END IF
-          DO JL = KIDIA,KFDIA
-            ZDNF(JL,JKCP1,JK)=-PBLEV(JL,JK)-ZFD(JL)
-          END DO
-        END DO
-      END DO
-C
-C     ------------------------------------------------------------------
-C
-C*         3.      CLOUD COVER MATRIX
-C                  ------------------
-C
-C*    ZCLM(JK1,JK2) IS THE OBSCURATION FACTOR BY CLOUD LAYERS BETWEEN
-C     HALF-LEVELS JK1 AND JK2 AS SEEN FROM JK1
-C
-      DO JK1 = 1 , KLEV+1
-        DO JK2 = 1 , KLEV+1
-          DO JL = KIDIA,KFDIA
-            ZCLM(JL,JK1,JK2) = 0.
-          END DO
-        END DO
-      END DO
-C
-C
-C
-C*         3.1     CLOUD COVER BELOW THE LEVEL OF CALCULATION
-C                  ------------------------------------------
-C
-      DO JK1 = 2 , KLEV+1
-        DO JL = KIDIA,KFDIA
-          ZCLEAR(JL)=1.
-          ZCLOUD(JL)=0.
-        END DO
-        DO JK = JK1 - 1 , 1 , -1
-          DO JL = KIDIA,KFDIA
-            IF (KOVLP.EQ.1) THEN
-c* maximum-random
-              ZCLEAR(JL)=ZCLEAR(JL)*(1.0-MAX(PCLDLU(JL,JK),ZCLOUD(JL)))
-     *                        /(1.0-MIN(ZCLOUD(JL),1.-REPSEC))
-              ZCLM(JL,JK1,JK) = 1.0 - ZCLEAR(JL)
-              ZCLOUD(JL) = PCLDLU(JL,JK)
-            ELSE IF (KOVLP.EQ.2) THEN
-c* maximum
-c             ZCLOUD(JL) = AMAX1(ZCLOUD(JL) , PCLDLU(JL,JK))
-              ZCLOUD(JL)=MAX(ZCLOUD(JL),PCLDLU(JL,JK))
-              ZCLM(JL,JK1,JK) = ZCLOUD(JL)
-            ELSE IF (KOVLP.EQ.3) THEN
-c* random
-              ZCLEAR(JL) = ZCLEAR(JL)*(1.0 - PCLDLU(JL,JK))
-              ZCLOUD(JL) = 1.0 - ZCLEAR(JL)
-              ZCLM(JL,JK1,JK) = ZCLOUD(JL)
-            END IF
-          END DO
-        END DO
-      END DO
-C
-C
-C*         3.2     CLOUD COVER ABOVE THE LEVEL OF CALCULATION
-C                  ------------------------------------------
-C
-      DO JK1 = 1 , KLEV
-        DO JL = KIDIA,KFDIA
-          ZCLEAR(JL)=1.
-          ZCLOUD(JL)=0.
-        END DO
-        DO JK = JK1 , KLEV
-          DO JL = KIDIA,KFDIA
-            IF (KOVLP.EQ.1) THEN
-c* maximum-random
-              ZCLEAR(JL)=ZCLEAR(JL)*(1.0-MAX(PCLDLD(JL,JK),ZCLOUD(JL)))
-     *                        /(1.0-MIN(ZCLOUD(JL),1.-REPSEC))
-              ZCLM(JL,JK1,JK) = 1.0 - ZCLEAR(JL)
-              ZCLOUD(JL) = PCLDLD(JL,JK)
-            ELSE IF (KOVLP.EQ.2) THEN
-c* maximum
-c               ZCLOUD(JL) = AMAX1(ZCLOUD(JL) , PCLDLD(JL,JK))
-              ZCLOUD(JL)=MAX(ZCLOUD(JL) , PCLDLD(JL,JK))
-              ZCLM(JL,JK1,JK) = ZCLOUD(JL)
-            ELSE IF (KOVLP.EQ.3) THEN
-c* random
-              ZCLEAR(JL) = ZCLEAR(JL)*(1.0 - PCLDLD(JL,JK))
-              ZCLOUD(JL) = 1.0 - ZCLEAR(JL)
-              ZCLM(JL,JK1,JK) = ZCLOUD(JL)
-            END IF
-          END DO
-        END DO
-      END DO
-C
-C
-C     ------------------------------------------------------------------
-C
-C*         4.      FLUXES FOR PARTIAL/MULTIPLE LAYERED CLOUDINESS
-C                  ----------------------------------------------
-C
-C*         4.1     DOWNWARD FLUXES
-C                  ---------------
-C
-      DO JL = KIDIA,KFDIA
-        PFDT(JL,KLEV+1) = 0.
-      END DO
-C
-      DO JK1 = KLEV , 1 , -1
-C
-C*                 CONTRIBUTION FROM CLEAR-SKY FRACTION
-C
-        DO JL = KIDIA,KFDIA
-          ZFD (JL) = (1. - ZCLM(JL,JK1,KLEV)) * ZDNF(JL,1,JK1)
-        END DO
-C
-C*                 CONTRIBUTION FROM ADJACENT CLOUD
-C
-        DO JL = KIDIA,KFDIA
-          ZFD(JL) = ZFD(JL) + ZCLM(JL,JK1,JK1) * ZDNF(JL,JK1+1,JK1)
-        END DO
-C
-C*                 CONTRIBUTION FROM OTHER CLOUDY FRACTIONS
-C
-        DO JK = KLEV-1 , JK1 , -1
-          DO JL = KIDIA,KFDIA
-            ZCFRAC = ZCLM(JL,JK1,JK+1) - ZCLM(JL,JK1,JK)
-            ZFD(JL) =  ZFD(JL) + ZCFRAC * ZDNF(JL,JK+2,JK1)
-          END DO
-        END DO
-C
-        DO JL = KIDIA,KFDIA
-          PFDT(JL,JK1) = ZFD (JL)
-        END DO
-C
-      END DO
-C
-C
-C
-C
-C*         4.2     UPWARD FLUX AT THE SURFACE
-C                  --------------------------
-C
-      DO JL = KIDIA,KFDIA
-        PFUT(JL,1) = PEM0(JL)*PBSUR(JL)-(1.-PEM0(JL))*PFDT(JL,1)
-      END DO
-C
-C
-C
-C
-C*         4.3     UPWARD FLUXES
-C                  -------------
-C
-      DO JK1 = 2 , KLEV+1
-C
-C*                 CONTRIBUTION FROM CLEAR-SKY FRACTION
-C
-        DO JL = KIDIA,KFDIA
-          ZFU (JL) = (1. - ZCLM(JL,JK1,1)) * ZUPF(JL,1,JK1)
-        END DO
-C
-C*                 CONTRIBUTION FROM ADJACENT CLOUD
-C
-        DO JL = KIDIA,KFDIA
-          ZFU(JL) =  ZFU(JL) + ZCLM(JL,JK1,JK1-1) * ZUPF(JL,JK1,JK1)
-        END DO
-C
-C*                 CONTRIBUTION FROM OTHER CLOUDY FRACTIONS
-C
-        DO JK = 2 , JK1-1
-          DO JL = KIDIA,KFDIA
-            ZCFRAC = ZCLM(JL,JK1,JK-1) - ZCLM(JL,JK1,JK)
-            ZFU(JL) =  ZFU(JL) + ZCFRAC * ZUPF(JL,JK  ,JK1)
-          END DO
-        END DO
-C
-        DO JL = KIDIA,KFDIA
-          PFUT(JL,JK1) = ZFU (JL)
-        END DO
-C
-      END DO
-C
-C-----------------------------------------------------------------------
-C
-      RETURN
-      END
diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90
index 8c14197c8833ca6847683e6ba2f5a78982f2dd96..edd731e427f3ff0b3b502f8ef82bfb74052ade40 100644
--- a/src/MNH/phys_paramn.f90
+++ b/src/MNH/phys_paramn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-2024 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.
@@ -36,7 +36,7 @@ END MODULE MODI_PHYS_PARAM_n
 !
 !     ########################################################################################
       SUBROUTINE PHYS_PARAM_n( KTCOUNT, TPFILE,                                              &
-                               PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PEOL, PDRAG, PTURB,    &
+                               PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PDRAG, PEOL, PTURB,    &
                                PTRACER, PTIME_BU, PWETDEPAER, OMASKkids, OCLOUD_ONLY         )
 !     ########################################################################################
 !
@@ -242,6 +242,7 @@ END MODULE MODI_PHYS_PARAM_n
 !  A. Costes      12/2021: add Blaze fire model
 !  Q. Rodier      2022   : integration with PHYEX
 !  C. Barthe      03/2023: add CELEC in call to turbulence
+!  V. Masson      01/2024: aggregation of columns for radiation
 !!-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -326,6 +327,7 @@ USE MODD_TIME_n
 USE MODD_TIME, ONLY : TDTEXP  ! Ajout PP
 USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY : XTHW_FLUX, XRCW_FLUX, XSVW_FLUX
 USE MODD_TURB_n
+USE MODD_VAR_ll,      ONLY: IP
 
 USE MODE_AERO_PSD
 use mode_budget,            only: Budget_store_end, Budget_store_init
@@ -777,7 +779,7 @@ CALL SUNPOS_n   ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL )
       XLWD(:,:,:)=0.0
       XDTHRADSW(:,:,:)=0.0
       XDTHRADLW(:,:,:)=0.0
-      CALL RADIATIONS_AGG(NRAD_AGG,NI_RAD_AGG,NJ_RAD_AGG,NIOR_RAD_AGG,NJOR_RAD_AGG, TPFILE,      &
+      CALL RADIATIONS_AGG(NRAD_AGG,NI_RAD_AGG,NJ_RAD_AGG,NIOR_RAD_AGG,NJOR_RAD_AGG, NRAD_AGG_FLAG, TPFILE,      &
                        LCLEAR_SKY, OCLOUD_ONLY, NCLEARCOL_TM1, CEFRADL, CEFRADI, COPWSW, COPISW, &
                        COPWLW, COPILW, XFUDG,                                                    &
                        NDLON, NFLEV, NRAD_DIAG, NFLUX, NRAD, NAER, NSWB_OLD, NSWB_MNH, NLWB_MNH, &
diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90
index 7917ae111200cbedcd572a0ba06849df616c4eef..246c30f19679efee60156c9914ecf65feebf2957 100644
--- a/src/MNH/radiations.f90
+++ b/src/MNH/radiations.f90
@@ -123,6 +123,7 @@ CONTAINS
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
 !  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
 !  P. Wautelet 06/09/2022: small fix: GSURF_CLOUD was not set outside of physical domain
+!       V. Masson 03/01/2024: aggregation of columns for radiation
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
diff --git a/src/MNH/radiations_agg.f90 b/src/MNH/radiations_agg.f90
index bbc5d383f7f0f091ed3af08658b8291edcb77162..f06055180abe13dd91a7581d6469d4cfc84576ea 100644
--- a/src/MNH/radiations_agg.f90
+++ b/src/MNH/radiations_agg.f90
@@ -9,7 +9,7 @@
 !
 INTERFACE
 
-    SUBROUTINE RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG, &
+    SUBROUTINE RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG,KRAD_AGG_FLAG, &
                TPFILE,OCLEAR_SKY,OCLOUD_ONLY,                                  &
                KCLEARCOL_TM1,HEFRADL,HEFRADI,HOPWSW,HOPISW,HOPWLW,HOPILW,      &
                PFUDG, KDLON, KFLEV, KRAD_DIAG, KFLUX, KRAD, KAER, KSWB_OLD,    &
@@ -26,6 +26,8 @@ INTEGER, INTENT(IN) :: KI_RAD_AGG    ! reformatted X array size
 INTEGER, INTENT(IN) :: KJ_RAD_AGG    ! reformatted Y array size
 INTEGER, INTENT(IN) :: KIOR_RAD_AGG  ! index of first point of packed array according to current domain
 INTEGER, INTENT(IN) :: KJOR_RAD_AGG  ! index of first point of packed array according to current domain
+INTEGER, DIMENSION(:,:), INTENT(IN) :: KRAD_AGG_FLAG  ! flag to know if aggregated column is computed in this processor or another one
+
 
 TYPE(TFILEDATA),  INTENT(IN)         :: TPFILE    ! Output file
 LOGICAL, INTENT(IN)                  :: OCLOUD_ONLY! flag for the cloud column
@@ -113,7 +115,7 @@ END INTERFACE
 END MODULE MODI_RADIATIONS_AGG
 !
 !   ############################################################################
-    SUBROUTINE RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG, &
+    SUBROUTINE RADIATIONS_AGG (KRAD_AGG,KI_RAD_AGG,KJ_RAD_AGG,KIOR_RAD_AGG,KJOR_RAD_AGG,KRAD_AGG_FLAG,  &
                TPFILE,OCLEAR_SKY,OCLOUD_ONLY,                                  &
                KCLEARCOL_TM1,HEFRADL,HEFRADI,HOPWSW,HOPISW,HOPWLW,HOPILW,      &
                PFUDG, KDLON, KFLEV, KRAD_DIAG, KFLUX, KRAD, KAER, KSWB_OLD,    &
@@ -192,6 +194,7 @@ INTEGER, INTENT(IN) :: KI_RAD_AGG    ! reformatted X array size
 INTEGER, INTENT(IN) :: KJ_RAD_AGG    ! reformatted Y array size
 INTEGER, INTENT(IN) :: KIOR_RAD_AGG  ! index of first point of packed array according to current domain
 INTEGER, INTENT(IN) :: KJOR_RAD_AGG  ! index of first point of packed array according to current domain
+INTEGER, DIMENSION(:,:), INTENT(IN) :: KRAD_AGG_FLAG  ! flag to know if aggregated column is computed in this processor or another one
 
 TYPE(TFILEDATA),  INTENT(IN)         :: TPFILE    ! Output file
 LOGICAL, INTENT(IN)                  :: OCLOUD_ONLY! flag for the cloud column
@@ -630,35 +633,87 @@ REAL, DIMENSION(:,:), INTENT(IN)  :: PFULL
 REAL, DIMENSION(:,:), INTENT(OUT) :: PPACK
 LOGICAL                           :: OEXCH
 
-!  DO JJP=1,MIN(KJ_RAD_AGG,IJMAX)
-!    DO JIP=1,MIN(KI_RAD_AGG,IIMAX)
   DO JJP=1,KJ_RAD_AGG
     DO JIP=1,KI_RAD_AGG
       IXORP = KIOR_RAD_AGG + (JIP-1) * KRAD_AGG
       IYORP = KJOR_RAD_AGG + (JJP-1) * KRAD_AGG
-      PPACK(JIP,JJP) = PFULL(MIN(IXORP + KRAD_AGG/2,IImax),MIN(IYORP + KRAD_AGG/2,Ijmax) ) 
+      PPACK(JIP,JJP) = PFULL(MIN(IXORP + KRAD_AGG/2,IIMAX),MIN(IYORP + KRAD_AGG/2,IJMAX) )
     END DO
   END DO
 END SUBROUTINE PACK_RAD_AGG_MID
-!
 !-------------------------------------------------------------------------------
 !
 SUBROUTINE UNPACK_RAD_AGG_2D(PFULL,PPACK)
 REAL, DIMENSION(:,:), INTENT(OUT)  :: PFULL
 REAL, DIMENSION(:,:), INTENT(IN)   :: PPACK
 
+TYPE(LIST_ll), POINTER :: TZFIELDS_ll   ! list of fields to exchange
+REAL, DIMENSION(SIZE(PFULL,1),SIZE(PFULL,2)) :: ZFULL
+
+  ZFULL = 0.
+  ! unpacks columns whose center is located in the current processor
   DO JJP=1,KJ_RAD_AGG
     DO JIP=1,KI_RAD_AGG
       IXORP = KIOR_RAD_AGG + (JIP-1) * KRAD_AGG
       IYORP = KJOR_RAD_AGG + (JJP-1) * KRAD_AGG
       DO JJ=IYORP,MIN(IYORP+KRAD_AGG-1,IJMAX)
         DO JI=IXORP,MIN(IXORP+KRAD_AGG-1,IIMAX)
-          PFULL(JI,JJ) = PPACK(JIP,JJP)
+          ZFULL(JI,JJ) = PPACK(JIP,JJP)
         END DO
       END DO
     END DO
   END DO
 
+  ! stores the output field
+  PFULL = 0.
+  PFULL(IIB:IIE,IJB:IJE) = ZFULL(IIB:IIE,IJB:IJE)
+
+  ! updates boundaries outside processor (that's because some aggregated columns were computed another processors)
+  NULLIFY(TZFIELDS_ll)
+  CALL ADD2DFIELD_ll( TZFIELDS_ll, ZFULL, 'RADIATION_AGG: UNPACK_RAD_AGG_2D' )
+  CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZFIELDS_ll)
+
+  ! Get the values of the packed column for points in the HALO if those were indeed computed by the other processors
+!  DO JJ=1,IJB-1
+!    DO JI=1,IIB-1
+!      IF (ZFULL(JI,JJ) /= 0.) PFULL(JI,JJ) = ZFULL(JI,JJ)
+!    END DO
+!  END DO
+!  DO JJ=IJE+1,IJU
+!    DO JI=1,IIB-1
+!      IF (ZFULL(JI,JJ) /= 0.) PFULL(JI,JJ) = ZFULL(JI,JJ)
+!    END DO
+!  END DO
+!  DO JJ=1,IJB-1
+!    DO JI=IIE+1,IIU
+!      IF (ZFULL(JI,JJ) /= 0.) PFULL(JI,JJ) = ZFULL(JI,JJ)
+!    END DO
+!  END DO
+!  DO JJ=IJE+1,IJU
+!    DO JI=IIE+1,IIU
+!      IF (ZFULL(JI,JJ) /= 0.) PFULL(JI,JJ) = ZFULL(JI,JJ)
+!    END DO
+!  END DO
+
+
+  ! Get the values of the packed column for points whose column center is outside the processor
+  ! In that case, the column is on one of the sides outside the processor, but within the NHALO bands
+  !
+  DO JJ=IJB,IJE
+    DO JI=IIB,IIE
+      IF (KRAD_AGG_FLAG(JI,JJ)==0) CYCLE  ! points whose aggregated columns were computed within this processor
+      IF (KRAD_AGG_FLAG(JI,JJ)==1) PFULL(JI,JJ) = ZFULL(IIB-1,JJ) ! computed column was towards West side of processor
+      IF (KRAD_AGG_FLAG(JI,JJ)==2) PFULL(JI,JJ) = ZFULL(JI,IJB-1) ! computed column was towards South side of processor
+      IF (KRAD_AGG_FLAG(JI,JJ)==3) PFULL(JI,JJ) = ZFULL(IIE+1,JJ) ! computed column was towards East side of processor
+      IF (KRAD_AGG_FLAG(JI,JJ)==4) PFULL(JI,JJ) = ZFULL(JI,IJE+1) ! computed column was towards North side of processor
+      IF (KRAD_AGG_FLAG(JI,JJ)==5) PFULL(JI,JJ) = ZFULL(IIB-1,IJB-1) ! computed column was towards South-West corner
+      IF (KRAD_AGG_FLAG(JI,JJ)==6) PFULL(JI,JJ) = ZFULL(IIE+1,IJB-1) ! computed column was towards South-East corner
+      IF (KRAD_AGG_FLAG(JI,JJ)==7) PFULL(JI,JJ) = ZFULL(IIE+1,IJE+1) ! computed column was towards North-East corner
+      IF (KRAD_AGG_FLAG(JI,JJ)==8) PFULL(JI,JJ) = ZFULL(IIB-1,IJE+1) ! computed column was towards North-West corner
+    END DO
+  END DO
+  !
 END SUBROUTINE UNPACK_RAD_AGG_2D
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 95a1c0e424314b794ce7ba28699aa86f53bc78f1..b2f87f427d65c90c079464a6abad42b5f6aae67a 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -313,6 +313,7 @@ END MODULE MODI_READ_EXSEG_n
 !  P. Wautelet 19/08/2022: add namelist for aircrafts
 !  H. Toumi       09/2022: add EOL/ADR
 !  C. Barthe   11/07/2023: ELEC: only some combinations of microphysical options are allowed
+!  V. Masson   03/01/2024: aggregation of columns for radiation
 !------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
diff --git a/src/MNH/reset_exseg.f90 b/src/MNH/reset_exseg.f90
index b467f7c05123f190f3c63c50506cf111bdbd110f..ce172c04b34ac62bef903e7983fb9ca3d2af4e32 100644
--- a/src/MNH/reset_exseg.f90
+++ b/src/MNH/reset_exseg.f90
@@ -173,9 +173,6 @@ IF ( NRAD_3D>=1 ) THEN
   CGETRAD='INIT'
 END IF
 !
-IF(LEN_TRIM(CRAD_SAT) /= 0) THEN
-  CRAD='ECMW'
-END IF
 !
 IF ( IP == 1 ) PRINT*,'RESET_EXSEG OUTPUT: NRAD_3D =',NRAD_3D,' CRAD =',CRAD,' CGETRAD =',CGETRAD
 !
diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90
index 51209fc69bcae1e39a1b6f320db3a2d2e58319c9..a78ace969ea25378dbf3945f822977ea770627a3 100644
--- a/src/MNH/resolved_cloud.f90
+++ b/src/MNH/resolved_cloud.f90
@@ -314,6 +314,7 @@ USE MODD_PARAM_ICE_n,      ONLY: CSEDIM, LADJ_BEFORE, LADJ_AFTER, LRED, PARAM_IC
 USE MODD_PARAM_LIMA,       ONLY: LADJ, LPTSPLIT, LSPRO, NMOD_CCN, NMOD_IFN, NMOD_IMM, NMOM_I
 USE MODD_RAIN_ICE_DESCR_n, ONLY: XRTMIN, RAIN_ICE_DESCRN
 USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAMN
+USE MODD_REF,              ONLY: XTHVREFZ
 USE MODD_SALT,             ONLY: LSALT
 USE MODD_TURB_n,           ONLY: TURBN
 !
@@ -964,8 +965,8 @@ SELECT CASE ( HCLOUD )
       ALLOCATE(ZQHS(0,0,0))
       !
       CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, RAIN_ICE_DESCRN, &
-                    ELEC_PARAM, ELEC_DESCR, TBUCONF, 0, .FALSE.,                &
-                    GELEC, LSEDIM_BEARD,                                        &
+                    ELEC_PARAM, ELEC_DESCR, TBUCONF, GELEC, LSEDIM_BEARD,       &
+                    XTHVREFZ(IKB), HCLOUD,                                      &
                     PTSTEP, KRR, ZEXN,                                          &
                     ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,      &
                     PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,                     &
@@ -1245,9 +1246,9 @@ SELECT CASE ( HCLOUD )
         ALLOCATE(ZEFIELDW(0,0,0))
       END IF
       !
-      CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, RAIN_ICE_DESCRN,  &
-                     ELEC_PARAM, ELEC_DESCR, TBUCONF, 0, .FALSE.,                &
-                     GELEC, LSEDIM_BEARD,                                        &
+      CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICEN, RAIN_ICE_PARAMN, RAIN_ICE_DESCRN, &
+                     ELEC_PARAM, ELEC_DESCR, TBUCONF, GELEC, LSEDIM_BEARD,        &
+                     XTHVREFZ(IKB), HCLOUD,                                      &
                      PTSTEP, KRR, ZEXN,                                          &
                      ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,      &
                      PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,                     &
@@ -1386,9 +1387,11 @@ SELECT CASE ( HCLOUD )
     ZZZ = MZF( PZZ )
     IF (LPTSPLIT) THEN 
       IF (GELEC) THEN
-        CALL LIMA (YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS),         &
-                   PTSTEP, GELEC,                                          &
-                   PRHODREF, PEXNREF, ZDZZ,                                &
+        CALL LIMA (YLDIMPHYEX,CST, RAIN_ICE_DESCRN, RAIN_ICE_PARAMN,       &
+                   ELEC_DESCR, ELEC_PARAM,                                 &
+                   TBUCONF,TBUDGETS,SIZE(TBUDGETS),                        &
+                   PTSTEP, GELEC, HCLOUD,                                  &
+                   PRHODREF, PEXNREF, ZDZZ, XTHVREFZ(IKB),                 &
                    PRHODJ, PPABST,                                         &
                    NMOD_CCN, NMOD_IFN, NMOD_IMM,                           &
                    PDTHRAD, PTHT, PRT,                                     &
@@ -1400,9 +1403,11 @@ SELECT CASE ( HCLOUD )
                    PSVT(:,:,:,NSV_ELECBEG:NSV_ELECEND),                    &
                    PSVS(:,:,:,NSV_ELECBEG:NSV_ELECEND)                     )
       ELSE
-        CALL LIMA (YLDIMPHYEX,CST,TBUCONF,TBUDGETS,SIZE(TBUDGETS),         &
-                   PTSTEP, GELEC,                                          &
-                   PRHODREF, PEXNREF, ZDZZ,                                &
+        CALL LIMA (YLDIMPHYEX,CST, RAIN_ICE_DESCRN, RAIN_ICE_PARAMN,       &
+                   ELEC_DESCR, ELEC_PARAM,                                 &
+                   TBUCONF,TBUDGETS,SIZE(TBUDGETS),                        &
+                   PTSTEP, GELEC, HCLOUD,                                  &
+                   PRHODREF, PEXNREF, ZDZZ, XTHVREFZ(IKB),                 &
                    PRHODJ, PPABST,                                         &
                    NMOD_CCN, NMOD_IFN, NMOD_IMM,                           &
                    PDTHRAD, PTHT, PRT,                                     &
diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index 50047fb02056b2cf69a0a7b247ff23c5353c1cb5..418797c5b4d4a5556772545d79901a790c249fac 100644
--- a/src/MNH/spawn_field2.f90
+++ b/src/MNH/spawn_field2.f90
@@ -175,7 +175,11 @@ USE MODD_IO,              ONLY: TFILEDATA
 USE MODD_LATZ_EDFLX,      ONLY: LTH_FLX, LUV_FLX
 USE MODD_LBC_n,           ONLY: LBC_MODEL
 USE MODD_LUNIT_n,         ONLY: TLUOUT
+#ifdef MNH_FOREFIRE
+USE MODD_NSV
+#else
 USE MODD_NSV,             ONLY: NSV, NSV_CSBEG, NSV_CSEND, NSV_PPBEG, NSV_PPEND, NSV_USER, TSVLIST
+#endif
 USE MODD_RELFRC_n,        ONLY: RELFRC_MODEL
 USE MODD_SPAWN
 !
diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90
index 974e78231d39c46ec70973c62476ca5fb54998d5..0dd9d393cabb8edea6844514faa980b353596b3c 100644
--- a/src/MNH/write_lfifm1_for_diag_supp.f90
+++ b/src/MNH/write_lfifm1_for_diag_supp.f90
@@ -71,7 +71,7 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
 !!              choose the platform, the satellite, the sensor for all channels 
 !!              (see the table in rttov science and validation report) and the
 !!              type of calculations in the namelist: 0 = tb, 1 = tb + jacobian,
-!!              2 = tb + adjoint, 3 = tb + jacobian + adjoint)
+!!              2 = tb + adjoint, 3 = tb + jacobian + adjoint) --- !!! removed !!!
 !!      V. Masson   01/2004  removes surface (externalization)
 !!      October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after
 !!                                              change of YCOMMENT
@@ -82,7 +82,7 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
 !!      P.Tulet : Diag for salt and orilam
 !!      J.-P. Chaboureau 07/03/2016 fix the dimensions of local arrays
 !!      P.Wautelet : 11/07/2016 : removed MNH_NCWRIT define
-!!      J.-P. Chaboureau 31/10/2016 add the call to RTTOV11
+!!      J.-P. Chaboureau 31/10/2016 add the call to RTTOV11 --- !!! removed !!!
 !!      F. Brosse 10/2016 add chemical production destruction terms outputs
 !!      M.Leriche 01/07/2017 Add DIAG chimical surface fluxes
 !!      J.-P. Chaboureau 01/2018 add altitude interpolation
@@ -117,7 +117,7 @@ USE MODD_CONF,              ONLY: LCARTESIAN
 USE MODD_CONF_n,            ONLY: LUSERC, LUSERI, LUSERV, NRR
 USE MODD_DEEP_CONVECTION_n, ONLY: NCLBASCONV, NCLTOPCONV, XCAPE, XDMFCONV, XDRCCONV, XDRICONV, XDRVCONV, &
                                   XDTHCONV, XDSVCONV, XMFCONV, XPRLFLXCONV, XPRSFLXCONV, XUMFCONV
-USE MODD_DIAG_FLAG,         ONLY: CRAD_SAT, LCHEMDIAG, LCLD_COV, LCOARSE, LISOAL, LISOPR, LISOTH, LRAD_SUBG_COND, &
+USE MODD_DIAG_FLAG,         ONLY: LCHEMDIAG, LCLD_COV, LCOARSE, LISOAL, LISOPR, LISOTH, LRAD_SUBG_COND, &
                                   NCONV_KF, NDXCOARSE, NRAD_3D, NRTTOVINFO, XISOAL, XISOPR, XISOTH
 USE MODD_FIELD_n,           ONLY: XCLDFR, XICEFR, XPABST, XSIGS, XTHT, XTKET, XRT, XUT, XVT, XWT
 USE MODD_GRID_n,            ONLY: XZHAT, XZZ
@@ -143,12 +143,6 @@ USE MODE_NEIGHBORAVG,       ONLY: BLOCKAVG, MOVINGAVG
 USE MODE_THERMO,            ONLY: SM_FOES
 USE MODE_TOOLS_LL,          ONLY: GET_INDICE_ll
 
-#ifdef MNH_RTTOV_8
-USE MODI_CALL_RTTOV8
-#endif
-#ifdef MNH_RTTOV_11
-USE MODI_CALL_RTTOV11
-#endif
 #ifdef MNH_RTTOV_13
 USE MODI_CALL_RTTOV13
 #endif
@@ -160,7 +154,6 @@ USE MODI_GRADIENT_V
 USE MODI_GRADIENT_W
 USE MODI_PINTER
 USE MODI_SHUMAN
-USE MODI_RADTR_SATEL
 USE MODI_UV_TO_ZONAL_AND_MERID
 USE MODI_ZINTER
 
@@ -710,97 +703,12 @@ IF (LCHEMDIAG) THEN
 END IF
 !-------------------------------------------------------------------------------
 !
-!* Brightness temperatures from the radiatif transfer code (Morcrette, 1991)
-!
-IF (LEN_TRIM(CRAD_SAT) /= 0 .AND. NRR /=0) THEN
-  ALLOCATE (ZIRBT(IIU,IJU),ZWVBT(IIU,IJU))
-  ITOTGEO=0
-  IF (INDEX(CRAD_SAT,'GOES-E')   /= 0) THEN
-    ITOTGEO= ITOTGEO+1
-    INDGEO(ITOTGEO) = 1
-    YNAM_SAT(ITOTGEO) = 'GOES-E'
-  END IF
-  IF (INDEX(CRAD_SAT,'GOES-W')   /= 0) THEN
-    ITOTGEO= ITOTGEO+1
-    INDGEO(ITOTGEO) = 2
-    YNAM_SAT(ITOTGEO) = 'GOES-W'
-  END IF
-  IF (INDEX(CRAD_SAT,'GMS')      /= 0) THEN
-    ITOTGEO= ITOTGEO+1
-    INDGEO(ITOTGEO) = 3
-    YNAM_SAT(ITOTGEO) = 'GMS'
-  END IF
-  IF (INDEX(CRAD_SAT,'INDSAT')   /= 0) THEN
-    ITOTGEO= ITOTGEO+1
-    INDGEO(ITOTGEO) = 4
-    YNAM_SAT(ITOTGEO) = 'INDSAT'
-  END IF
-  IF (INDEX(CRAD_SAT,'METEOSAT') /= 0) THEN
-    ITOTGEO= ITOTGEO+1
-    INDGEO(ITOTGEO) = 5
-    YNAM_SAT(ITOTGEO) = 'METEOSAT'
-  END IF
-  PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURES FOR ',ITOTGEO,' SATELLITE(S)'
-  IF (NRR==1) THEN
-    PRINT*,' THERE IS ONLY VAPOR WATER IN YOUR ATMOSPHERE'
-    PRINT*,' IRBT WILL NOT TAKE INTO ACCOUNT CLOUDS.'
-  END IF
-  !
-  DO JI=1,ITOTGEO
-    ZIRBT(:,:) = XUNDEF
-    ZWVBT(:,:) = XUNDEF
-    CALL RADTR_SATEL( TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime, &
-                      NDLON, NFLEV, NSTATM, NRAD_COLNBR, XEMIS(:,:,1),        &
-                      XCCO2, XTSRAD, XSTATM, XTHT, XRT, XPABST, XZZ,          &
-                      XSIGS, XMFCONV, MAX(XCLDFR,XICEFR), LUSERI, LSIGMAS,    &
-                      LSUBG_COND, LRAD_SUBG_COND, ZIRBT, ZWVBT,               &
-                      INDGEO(JI), VSIGQSAT                                    )
-    !
-    TZFIELD = TFIELDMETADATA(                                               &
-      CMNHNAME   = TRIM(YNAM_SAT(JI))//'_IRBT',                             &
-      CSTDNAME   = '',                                                      &
-      CLONGNAME  = TRIM(YNAM_SAT(JI))//'_IRBT',                             &
-      CUNITS     = 'K',                                                     &
-      CDIR       = 'XY',                                                    &
-      CCOMMENT   = TRIM(YNAM_SAT(JI))//' Infra-Red Brightness Temperature', &
-      NGRID      = 1,                                                       &
-      NTYPE      = TYPEREAL,                                                &
-      NDIMS      = 2,                                                       &
-      LTIMEDEP   = .TRUE.                                                   )
-    CALL IO_Field_write(TPFILE,TZFIELD,ZIRBT)
-    !
-    TZFIELD = TFIELDMETADATA(                                                 &
-      CMNHNAME   = TRIM(YNAM_SAT(JI))//'_WVBT',                               &
-      CSTDNAME   = '',                                                        &
-      CLONGNAME  = TRIM(YNAM_SAT(JI))//'_WVBT',                               &
-      CUNITS     = 'K',                                                       &
-      CDIR       = 'XY',                                                      &
-      CCOMMENT   = TRIM(YNAM_SAT(JI))//' Water-Vapor Brightness Temperature', &
-      NGRID      = 1,                                                         &
-      NTYPE      = TYPEREAL,                                                  &
-      NDIMS      = 2,                                                         &
-      LTIMEDEP   = .TRUE.                                                     )
-    CALL IO_Field_write(TPFILE,TZFIELD,ZWVBT)
-  END DO
-  DEALLOCATE(ZIRBT,ZWVBT)
-END IF
-!
-!-------------------------------------------------------------------------------
-!
 !* Brightness temperatures from the Radiatif Transfer for Tiros Operational
 ! Vertical Sounder (RTTOV) code
 !
 IF (NRTTOVINFO(1,1) /= NUNDEF) THEN
 ! PRINT*,'YOU ASK FOR BRIGHTNESS TEMPERATURE COMPUTED BY THE RTTOV CODE'
-#if defined(MNH_RTTOV_8)
-  CALL CALL_RTTOV8(NDLON, NFLEV, NSTATM, XEMIS(:,:,1), XTSRAD, XSTATM, XTHT, XRT, &
-                  XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB),   &
-                  LUSERI, NRTTOVINFO, TPFILE                                  )
-#elif defined(MNH_RTTOV_11)
-  CALL CALL_RTTOV11(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT,            &
-                  XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB),   &
-                  LUSERI, NRTTOVINFO, TPFILE                                  )
-#elif defined(MNH_RTTOV_13)
+#if defined(MNH_RTTOV_13)
   CALL CALL_RTTOV13(NDLON, NFLEV, XEMIS(:,:,1), XTSRAD, XTHT, XRT,            &
                   XPABST, XZZ, XMFCONV, MAX(XCLDFR,XICEFR), XUT(:,:,IKB), XVT(:,:,IKB),   &
                   LUSERI, NRTTOVINFO, TPFILE                                  )
diff --git a/src/Makefile b/src/Makefile
index d903b69fdec9669451f95961dc7fafd4030c6d96..092383fcbb6516383b8f9e0d5c25011435253f9b 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -352,7 +352,7 @@ $(CDF_MOD) :
 	cd ${DIR_HDF} && ./configure --enable-fortran --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 --with-szlib=${CDF_PATH}/include,${CDF_PATH}/lib64 \
 	CC="$(CC)" CFLAGS="$(HDF_OPT)" ${HDF_CONF} FC="$(FC)" FCFLAGS="$(NETCDF_OPT)" LDFLAGS="-L${CDF_PATH}/lib64" LIBS="-lsz -laec -lz" && \
 	$(MAKE) && $(MAKE) install && $(MAKE) clean
-	cd ${DIR_CDFC} && ./configure --disable-shared --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 --disable-dap --disable-byterange \
+	cd ${DIR_CDFC} && ./configure --disable-shared --disable-libxml2 --prefix=${CDF_PATH} --libdir=${CDF_PATH}/lib64 --disable-dap --disable-byterange \
 	CC="$(CC)" CFLAGS="$(NETCDF_OPT)" CPPFLAGS="${INC_NETCDF}" ${CDF_CONF} LDFLAGS="-L${CDF_PATH}/lib64" LIBS="-lhdf5_hl -lhdf5 -lsz -laec -lz -ldl " && \
 	$(MAKE) && $(MAKE) install && $(MAKE) clean
 ifdef MNH_FOREFIRE
@@ -520,7 +520,7 @@ ARFLAGS=r
 #
 #  GENERATION OF DEPENDANCE FILES : *.D
 # 
-SPLL ?= spll
+SPLL ?= spll_new
 %.D:%.F90
 	$(CPP) $(INC) $(CPPFLAGS) $< >  $(OBJDIR)/$(*F).f90 
 	$(SPLL) $(NSOURCE) $(OBJDIR)/$(*F).f90 
diff --git a/src/Makefile.MESONH.mk b/src/Makefile.MESONH.mk
index 791ff37ea2d4a857d24e31fda8ab68adf344a855..2444943ffddb157a748c66a6fcb2a6936daff477 100644
--- a/src/Makefile.MESONH.mk
+++ b/src/Makefile.MESONH.mk
@@ -200,30 +200,7 @@ endif
 ##########################################################
 ifdef MNH_RTTOV
 ifndef VER_RTTOV
-VER_RTTOV      = 8.7
-endif
-ifeq "$(VER_RTTOV)" "8.7"
-DIR_RTTOV      +=  LIB/RTTOV/src
-CPPFLAGS_RTTOV = -DMNH_RTTOV
-INC_RTTOV      = -I$(B)LIB/RTTOV/src
-#
-DIR_MASTER  += $(DIR_RTTOV)
-CPPFLAGS    += $(CPPFLAGS_RTTOV)
-INC         += $(INC_RTTOV)
-CPPFLAGS    += $(CPPFLAGS_RTTOV)
-CPPFLAGS_MNH += -DMNH_RTTOV_8=MNH_RTTOV_8
-endif
-ifeq "$(VER_RTTOV)" "11.3"
-DIR_RTTOV=${SRC_MESONH}/src/LIB/RTTOV-${VER_RTTOV}
-RTTOV_PATH=${DIR_RTTOV}
-#
-INC_RTTOV     ?= -I${RTTOV_PATH}/include -I${RTTOV_PATH}/mod
-LIB_RTTOV     ?= -L${RTTOV_PATH}/lib -lrttov11_coef_io -lrttov11_mw_scatt -lrttov11_main
-INC            += $(INC_RTTOV)
-LIBS           += $(LIB_RTTOV)
-VPATH         += $(RTTOV_PATH)/mod
-CPPFLAGS    += $(CPPFLAGS_RTTOV)
-CPPFLAGS_MNH += -DMNH_RTTOV_11=MNH_RTTOV_11
+VER_RTTOV      = 13.2
 endif
 ifeq "$(VER_RTTOV)" "13.2"
 DIR_RTTOV=${SRC_MESONH}/src/LIB/RTTOV-${VER_RTTOV}
diff --git a/src/PHYEX/aux/modd_phyex.f90 b/src/PHYEX/aux/modd_phyex.f90
index 6b8ddb985f6e7736b12ae3c805788d684e4c377a..493013dda18d51d9f5b16389f2aea34fb9cddaef 100644
--- a/src/PHYEX/aux/modd_phyex.f90
+++ b/src/PHYEX/aux/modd_phyex.f90
@@ -32,6 +32,8 @@ USE MODD_PARAM_LIMA, ONLY: PARAM_LIMA_t
 USE MODD_PARAM_LIMA_WARM, ONLY: PARAM_LIMA_WARM_t
 USE MODD_PARAM_LIMA_COLD, ONLY: PARAM_LIMA_COLD_t
 USE MODD_PARAM_LIMA_MIXED, ONLY: PARAM_LIMA_MIXED_t
+USE MODD_ELEC_DESCR,     ONLY: ELEC_DESCR_t
+USE MODD_ELEC_PARAM,     ONLY: ELEC_PARAM_t
 USE MODD_NSV, ONLY: NSV_t
 USE MODD_MISC, ONLY: MISC_t
 !
@@ -52,6 +54,8 @@ TYPE PHYEX_t
   TYPE(PARAM_LIMA_WARM_t):: PARAM_LIMA_WARM  !< Microphysical factors for LIMA (warm processes)
   TYPE(PARAM_LIMA_COLD_t):: PARAM_LIMA_COLD  !< Microphysical factors for LIMA (cold processes)
   TYPE(PARAM_LIMA_MIXED_t):: PARAM_LIMA_MIXED !< Microphysical factors for LIMA (mixed processes)
+  TYPE(ELEC_DESCR_t)     :: ELEC_DESCR       ! Electricity descriptive constants
+  TYPE(ELEC_PARAM_t)     :: ELEC_PARAM       ! Electricity parameters
   TYPE(NSV_t)            :: TNSV             !< NSV indexes
   !
   ! Supplementary strucuture to hold model specific values
diff --git a/src/PHYEX/aux/mode_gradient_m_phy.f90 b/src/PHYEX/aux/mode_gradient_m_phy.f90
index e4df65f930da03f27b8d6f9bf524d49349f0a865..aeb7f5d1d9c6ac052b5cfc51f62f707724dabb81 100644
--- a/src/PHYEX/aux/mode_gradient_m_phy.f90
+++ b/src/PHYEX/aux/mode_gradient_m_phy.f90
@@ -489,8 +489,8 @@ CALL D1D_TO_3D(D,ZGX_M_U,PGX_M_U)
   END DO
 ELSE
 !  PGX_M_U = DXM(PY) / PDXX
-  PGX_M_U(1+1:IIU,:,:) = ( ZY(1+1:IIU,:,:)-ZY(1:IIU-1,:,:) ) &
-                             / ZDXX(1+1:IIU,:,:)
+  PGX_M_U(2:IIU,:,:) = ( ZY(2:IIU,:,:)-ZY(1:IIU-1,:,:) ) &
+                             / ZDXX(2:IIU,:,:)
 !
 ENDIF
 DO JI=1,JPHEXT
@@ -621,8 +621,8 @@ IF (.NOT. OFLAT) THEN
 !
 ELSE
 !  PGY_M_V = DYM(PY)/PDYY
-  PGY_M_V(:,1+1:IJU,:) = ( PY(:,1+1:IJU,:)-PY(:,1:IJU-1,:) ) &
-                               / PDYY(:,1+1:IJU,:)
+  PGY_M_V(:,2:IJU,:) = ( PY(:,2:IJU,:)-PY(:,1:IJU-1,:) ) &
+                               / PDYY(:,2:IJU,:)
 !
 ENDIF
 DO JJ=1,JPHEXT
diff --git a/src/PHYEX/micro/compute_frac_ice.func.h b/src/PHYEX/micro/compute_frac_ice.func.h
index b425ef0f928e8829fc33f2cc8438fb2e765e8c30..e18f510a574de5830dfc4862a4ecb41c018775d9 100644
--- a/src/PHYEX/micro/compute_frac_ice.func.h
+++ b/src/PHYEX/micro/compute_frac_ice.func.h
@@ -2,7 +2,7 @@
 !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.
-      ELEMENTAL SUBROUTINE COMPUTE_FRAC_ICE(HFRAC_ICE,NEBN,PFRAC_ICE,PT,KERR)
+      ELEMENTAL SUBROUTINE COMPUTE_FRAC_ICE(CST, HFRAC_ICE,NEBN,PFRAC_ICE,PT,KERR)
 
 ! ******* TO BE INCLUDED IN THE *CONTAINS* OF A SUBROUTINE, IN ORDER TO EASE AUTOMATIC INLINING ******
 ! => Don't use drHook !!!
@@ -22,10 +22,11 @@
 !
 !! --------------------------------------------------------------------------
 USE MODD_NEB_n, ONLY : NEB_t
-USE MODD_CST, ONLY : XTT
+USE MODD_CST, ONLY : CST_t
 !
 IMPLICIT NONE
 !
+TYPE(CST_t),      INTENT(IN)    :: CST
 CHARACTER(LEN=1), INTENT(IN)    :: HFRAC_ICE       ! scheme to use
 TYPE(NEB_t),      INTENT(IN)    :: NEBN
 REAL,             INTENT(IN)    :: PT              ! temperature
@@ -41,7 +42,7 @@ SELECT CASE(HFRAC_ICE)
   CASE ('T') !using Temperature
     PFRAC_ICE = MAX( 0., MIN(1., (( NEBN%XTMAXMIX - PT ) / ( NEBN%XTMAXMIX - NEBN%XTMINMIX )) ) ) ! freezing interval
   CASE ('O') !using Temperature with old formulae
-    PFRAC_ICE = MAX( 0., MIN(1., (( XTT - PT ) / 40.) ) ) ! freezing interval
+    PFRAC_ICE = MAX( 0., MIN(1., (( CST%XTT - PT ) / 40.) ) ) ! freezing interval
   CASE ('N') !No ice
     PFRAC_ICE = 0.
   CASE ('S') !Same as previous
diff --git a/src/PHYEX/micro/condensation.f90 b/src/PHYEX/micro/condensation.f90
index 0bcb57d47016ce2bd47ad0bbdfd42dae01547e3f..1ac71be35b944c0660496002ec045f8e5032b355 100644
--- a/src/PHYEX/micro/condensation.f90
+++ b/src/PHYEX/micro/condensation.f90
@@ -345,7 +345,7 @@ DO JK=IKTB,IKTE
       ENDIF
     END DO
     DO JIJ=IIJB,IIJE
-      CALL COMPUTE_FRAC_ICE(HFRAC_ICE, NEBN, ZFRAC(JIJ), PT(JIJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization
+      CALL COMPUTE_FRAC_ICE(CST, HFRAC_ICE, NEBN, ZFRAC(JIJ), PT(JIJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization
     ENDDO
   ENDIF
   DO JIJ=IIJB,IIJE
diff --git a/src/PHYEX/micro/ice4_nucleation.func.h b/src/PHYEX/micro/ice4_nucleation.func.h
new file mode 100644
index 0000000000000000000000000000000000000000..758c515754d4594686a3fc0d78c39eefdb0ddb7a
--- /dev/null
+++ b/src/PHYEX/micro/ice4_nucleation.func.h
@@ -0,0 +1,123 @@
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
+!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
+!MNH_LIC for details. version 1.
+!-----------------------------------------------------------------
+ELEMENTAL SUBROUTINE ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, ODCOMPUTE, &
+                           PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, &
+                           PRVT, &
+                           PCIT, PRVHENI_MR)
+!!
+!!**  PURPOSE
+!!    -------
+!!      Computes the nucleation
+!!
+!!    AUTHOR
+!!    ------
+!!      S. Riette from the splitting of rain_ice source code (nov. 2014)
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!
+!!     R. El Khatib 24-Aug-2021 Optimizations
+!
+!
+!*      0. DECLARATIONS
+!          ------------
+!
+USE MODD_CST,            ONLY: CST_t
+USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of dummy arguments :
+!
+TYPE(CST_t),              INTENT(IN)    :: CST
+TYPE(PARAM_ICE_t),        INTENT(IN)    :: PARAMI
+TYPE(RAIN_ICE_PARAM_t),   INTENT(IN)    :: ICEP
+TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
+LOGICAL, INTENT(IN)    :: ODCOMPUTE
+REAL,    INTENT(IN)    :: PTHT    ! Theta at t
+REAL,    INTENT(IN)    :: PPABST  ! absolute pressure at t
+REAL,    INTENT(IN)    :: PRHODREF! Reference density
+REAL,    INTENT(IN)    :: PEXN    ! Exner function
+REAL,    INTENT(IN)    :: PLSFACT
+REAL,    INTENT(IN)    :: PT      ! Temperature at time t
+REAL,    INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
+REAL,    INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
+REAL,    INTENT(OUT)   :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation
+!
+!*       0.2  declaration of local variables
+!
+REAL  :: ZW ! work array
+LOGICAL  :: GNEGT  ! Test where to compute the HEN process
+REAL   :: ZZW,      & ! Work array
+                           ZUSW,     & ! Undersaturation over water
+                           ZSSI        ! Supersaturation over ice
+!-------------------------------------------------------------------------------
+!
+!
+  IF (ODCOMPUTE) THEN
+GNEGT=PT<CST%XTT .AND. PRVT>ICED%XRTMIN(1)
+ELSE
+GNEGT=.FALSE.
+END IF
+
+ZUSW=0.
+ZZW=0.
+
+IF (GNEGT) THEN
+ ZZW=ALOG(PT)
+ ZUSW=EXP(CST%XALPW - CST%XBETAW/PT - CST%XGAMW*ZZW)          ! es_w
+ ZZW=EXP(CST%XALPI - CST%XBETAI/PT - CST%XGAMI*ZZW)           ! es_i
+END IF
+  
+ZSSI=0.
+IF (GNEGT) THEN
+  ZZW=MIN(PPABST/2., ZZW)             ! safety limitation
+  ZSSI=PRVT*(PPABST-ZZW) / (CST%XEPSILO*ZZW) - 1.0
+                                               ! Supersaturation over ice
+  ZUSW=MIN(PPABST/2., ZUSW)            ! safety limitation
+  ZUSW=(ZUSW/ZZW)*((PPABST-ZZW)/(PPABST-ZUSW)) - 1.0
+                             ! Supersaturation of saturated water vapor over ice
+  ZSSI=MIN(ZSSI, ZUSW) ! limitation of SSi according to SSw=0
+END IF
+  
+ZZW=0.
+
+IF(GNEGT) THEN
+  IF(PT<CST%XTT-5.0 .AND. ZSSI>0.0) THEN
+    ZZW=ICEP%XNU20*EXP(ICEP%XALPHA2*ZSSI-ICEP%XBETA2)
+  ELSEIF(PT<=CST%XTT-2.0 .AND. PT>=CST%XTT-5.0 .AND. ZSSI>0.0) THEN
+    ZZW=MAX(ICEP%XNU20*EXP(-ICEP%XBETA2 ), &                                                                                       
+                ICEP%XNU10*EXP(-ICEP%XBETA1*(PT-CST%XTT))*(ZSSI/ZUSW)**ICEP%XALPHA1)
+  ENDIF
+ENDIF
+IF (GNEGT) THEN
+  ZZW=ZZW-PCIT
+  ZZW=MIN(ZZW, 50.E3) ! limitation provisoire a 50 l^-1
+END IF
+
+PRVHENI_MR=0.
+
+IF (GNEGT) THEN
+  PRVHENI_MR=MAX(ZZW, 0.0)*ICEP%XMNU0/PRHODREF
+  PRVHENI_MR=MIN(PRVT, PRVHENI_MR)
+END IF
+!Limitation due to 0 crossing of temperature
+IF(PARAMI%LFEEDBACKT) THEN
+  ZW=0.
+  IF (GNEGT) THEN
+    ZW=MIN(PRVHENI_MR, &
+              MAX(0., (CST%XTT/PEXN-PTHT)/PLSFACT)) / &
+              MAX(PRVHENI_MR, 1.E-20)
+  END IF
+  PRVHENI_MR=PRVHENI_MR*ZW
+  ZZW=ZZW*ZW
+ENDIF
+IF (GNEGT) THEN
+  PCIT=MAX(ZZW+PCIT, PCIT)
+END IF
+END SUBROUTINE ICE4_NUCLEATION
diff --git a/src/PHYEX/micro/ice_adjust.f90 b/src/PHYEX/micro/ice_adjust.f90
index b480da71079ce570a02efe4b5e800f609bb1e9c6..611c3b17c562c3d4be9d6ee12ef1c7d920df01ca 100644
--- a/src/PHYEX/micro/ice_adjust.f90
+++ b/src/PHYEX/micro/ice_adjust.f90
@@ -103,6 +103,7 @@
 !  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
 !!      2020-12 U. Andrae : Introduce SPP for HARMONIE-AROME
 !!     R. El Khatib 24-Aug-2021 Optimizations
+!!     R. El Khatib 24-Oct-2023 Re-vectorize ;-)
 !!
 !-------------------------------------------------------------------------------
 !
@@ -216,6 +217,8 @@ INTEGER :: IKTB, IKTE, IIJB, IIJE
 !
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZSIGS, ZSRCS
 REAL, DIMENSION(D%NIJT) :: ZSIGQSAT
+LOGICAL :: LLNONE, LLTRIANGLE, LLHLC_H, LLHLI_H
+
 REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 !-------------------------------------------------------------------------------
@@ -319,6 +322,13 @@ DO JK=IKTB,IKTE
       END IF
     ENDDO
   ELSE !NEBN%LSUBG_COND case
+    ! Tests on characters strings can break the vectorization, or at least they would
+    ! slow down considerably the performance of a vector loop. One should use tests on
+    ! reals, integers or booleans only. REK.
+    LLNONE=PARAMI%CSUBG_MF_PDF=='NONE'
+    LLTRIANGLE=PARAMI%CSUBG_MF_PDF=='TRIANGLE'
+    LLHLC_H=PRESENT(PHLC_HRC).AND.PRESENT(PHLC_HCF)
+    LLHLI_H=PRESENT(PHLI_HRI).AND.PRESENT(PHLI_HCF)
     DO JIJ=IIJB,IIJE
       !We limit PRC_MF+PRI_MF to PRVS*PTSTEP to avoid negative humidity
       ZW1=PRC_MF(JIJ,JK)/PTSTEP
@@ -334,14 +344,14 @@ DO JK=IKTB,IKTE
       PTHS(JIJ,JK) = PTHS(JIJ,JK) + &
                     (ZW1 * ZLV(JIJ,JK) + ZW2 * ZLS(JIJ,JK)) / ZCPH(JIJ,JK) / PEXNREF(JIJ,JK)
       !
-      IF(PRESENT(PHLC_HRC) .AND. PRESENT(PHLC_HCF)) THEN
+      IF(LLHLC_H) THEN
         ZCRIAUT=ICEP%XCRIAUTC/PRHODREF(JIJ,JK)
-        IF(PARAMI%CSUBG_MF_PDF=='NONE')THEN
+        IF(LLNONE)THEN
           IF(ZW1*PTSTEP>PCF_MF(JIJ,JK) * ZCRIAUT) THEN
             PHLC_HRC(JIJ,JK)=PHLC_HRC(JIJ,JK)+ZW1*PTSTEP
             PHLC_HCF(JIJ,JK)=MIN(1.,PHLC_HCF(JIJ,JK)+PCF_MF(JIJ,JK))
           ENDIF
-        ELSEIF(PARAMI%CSUBG_MF_PDF=='TRIANGLE')THEN
+        ELSEIF(LLTRIANGLE)THEN
           !ZHCF is the precipitating part of the *cloud* and not of the grid cell
           IF(ZW1*PTSTEP>PCF_MF(JIJ,JK)*ZCRIAUT) THEN
             ZHCF=1.-.5*(ZCRIAUT*PCF_MF(JIJ,JK) / MAX(1.E-20, ZW1*PTSTEP))**2
@@ -362,14 +372,14 @@ DO JK=IKTB,IKTE
           PHLC_HRC(JIJ,JK)=PHLC_HRC(JIJ,JK)+ZHR
         ENDIF
       ENDIF
-      IF(PRESENT(PHLI_HRI) .AND. PRESENT(PHLI_HCF)) THEN
+      IF(LLHLI_H) THEN
         ZCRIAUT=MIN(ICEP%XCRIAUTI,10**(ICEP%XACRIAUTI*(ZT(JIJ,JK)-CST%XTT)+ICEP%XBCRIAUTI))
-        IF(PARAMI%CSUBG_MF_PDF=='NONE')THEN
+        IF(LLNONE)THEN
           IF(ZW2*PTSTEP>PCF_MF(JIJ,JK) * ZCRIAUT) THEN
             PHLI_HRI(JIJ,JK)=PHLI_HRI(JIJ,JK)+ZW2*PTSTEP
             PHLI_HCF(JIJ,JK)=MIN(1.,PHLI_HCF(JIJ,JK)+PCF_MF(JIJ,JK))
           ENDIF
-        ELSEIF(PARAMI%CSUBG_MF_PDF=='TRIANGLE')THEN
+        ELSEIF(LLTRIANGLE)THEN
           !ZHCF is the precipitating part of the *cloud* and not of the grid cell
           IF(ZW2*PTSTEP>PCF_MF(JIJ,JK)*ZCRIAUT) THEN
             ZHCF=1.-.5*(ZCRIAUT*PCF_MF(JIJ,JK) / (ZW2*PTSTEP))**2
diff --git a/src/PHYEX/micro/ini_neb.f90 b/src/PHYEX/micro/ini_neb.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/PHYEX/micro/lima.f90 b/src/PHYEX/micro/lima.f90
index 0d912878d5add373f3c6a05af1ca4c03dd85dd6c..43e886f16530eeb67bd532ef5794ba707e5d39b0 100644
--- a/src/PHYEX/micro/lima.f90
+++ b/src/PHYEX/micro/lima.f90
@@ -4,9 +4,9 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !     #####################################################################
-SUBROUTINE LIMA ( D, CST, BUCONF, TBUDGETS, KBUDGETS,                     &
-                  PTSTEP, OELEC,                                          &
-                  PRHODREF, PEXNREF, PDZZ,                                &
+SUBROUTINE LIMA ( D, CST, ICED, ICEP, ELECD, ELECP,BUCONF, TBUDGETS, KBUDGETS,&
+                  PTSTEP, OELEC, HCLOUD,                                  &
+                  PRHODREF, PEXNREF, PDZZ,PTHVREFZIKB,                    &
                   PRHODJ, PPABST,                                         &
                   NCCN, NIFN, NIMM,                                       &
                   PDTHRAD, PTHT, PRT, PSVT, PW_NU,                        &
@@ -50,6 +50,10 @@ SUBROUTINE LIMA ( D, CST, BUCONF, TBUDGETS, KBUDGETS,                     &
 !*       0.    DECLARATIONS
 !              ------------
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
+USE MODD_RAIN_ICE_DESCR_n,ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n,ONLY: RAIN_ICE_PARAM_t
+USE MODD_ELEC_PARAM,      ONLY: ELEC_PARAM_t
+USE MODD_ELEC_DESCR,      ONLY: ELEC_DESCR_t
 USE MODD_BUDGET,          ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, &
                                 NBUDGET_RI, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1
 USE MODD_CST,             ONLY: CST_t
@@ -72,7 +76,7 @@ USE MODE_LIMA_NUCLEATION_PROCS, ONLY: LIMA_NUCLEATION_PROCS
 USE MODE_LIMA_SEDIMENTATION, ONLY: LIMA_SEDIMENTATION
 USE MODE_LIMA_TENDENCIES, ONLY: LIMA_TENDENCIES
 !
-USE MODI_ELEC_TENDENCIES
+USE MODE_ELEC_TENDENCIES, ONLY : ELEC_TENDENCIES
 !
 IMPLICIT NONE
 !
@@ -80,8 +84,13 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),         INTENT(IN)    :: D
 TYPE(CST_t),              INTENT(IN)    :: CST
+TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
+TYPE(RAIN_ICE_PARAM_t),   INTENT(IN)    :: ICEP
+TYPE(ELEC_PARAM_t),       INTENT(IN)    :: ELECP   ! electrical parameters
+TYPE(ELEC_DESCR_t),       INTENT(IN)    :: ELECD   ! electrical descriptive csts
 TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
 TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
+CHARACTER (LEN=4),        INTENT(IN)    :: HCLOUD       ! Kind of microphysical scheme
 INTEGER,                  INTENT(IN)    :: KBUDGETS
 !
 REAL,                     INTENT(IN)    :: PTSTEP     ! Time step
@@ -123,11 +132,12 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PICEFR     ! Cloud fraction
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PPRCFR     ! Cloud fraction
 REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PFPR       ! Precipitation fluxes in altitude
 !
-REAL, DIMENSION(:,:,:),             INTENT(IN)    :: PLATHAM_IAGGS  ! Factor for IAGGS modification due to Efield
+REAL, DIMENSION(:,:,:),   OPTIONAL, INTENT(IN)    :: PLATHAM_IAGGS  ! Factor for IAGGS modification due to Efield
 REAL, DIMENSION(:,:,:),   OPTIONAL, INTENT(IN)    :: PEFIELDW   ! Vertical component of the electric field
 REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN)    :: PSV_ELEC_T ! Charge density at time t
 REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(INOUT) :: PSV_ELEC_S ! Charge density sources
 !
+REAL, INTENT(IN)                :: PTHVREFZIKB ! Reference thv at IKB for electricity
 !*       0.2   Declarations of local variables :
 !
 !
@@ -797,12 +807,12 @@ ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP
 ZCPT    = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP
 IF (NMOM_C.GE.1 .AND. LSEDC) THEN
   IF (OELEC) THEN
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'L', 2, 2, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'L', 2, 2, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRCS, ZCCS, PINPRC, PFPR(:,:,:,2), PEFIELDW, ZQCS)
   ELSE
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'L', 2, 2, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'L', 2, 2, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRCS, ZCCS, PINPRC, PFPR(:,:,:,2))
   END IF
 END IF
@@ -812,12 +822,12 @@ ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP
 ZCPT    = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP
 IF (NMOM_R.GE.1) THEN
   IF (OELEC) THEN
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'L', NMOM_R, 3, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'L', NMOM_R, 3, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PTHVREFZIKB,PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRRS, ZCRS, PINPRR, PFPR(:,:,:,3), PEFIELDW, ZQRS)
   ELSE
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'L', NMOM_R, 3, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'L', NMOM_R, 3, 1, PTSTEP, OELEC, PDZZ, PRHODREF,PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRRS, ZCRS, PINPRR, PFPR(:,:,:,3))
   END IF
 END IF
@@ -827,12 +837,12 @@ ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP
 ZCPT    = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP
 IF (NMOM_I.GE.1 .AND. LSEDI) THEN
   IF (OELEC) THEN
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'I', NMOM_I, 4, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'I', NMOM_I, 4, 1, PTSTEP, OELEC, PDZZ, PRHODREF,PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRIS, ZCIS, ZW2D, PFPR(:,:,:,4), PEFIELDW, ZQIS)
   ELSE
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'I', NMOM_I, 4, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'I', NMOM_I, 4, 1, PTSTEP, OELEC, PDZZ, PRHODREF,PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRIS, ZCIS, ZW2D, PFPR(:,:,:,4))
   END IF
 END IF
@@ -842,12 +852,12 @@ ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP
 ZCPT    = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP
 IF (NMOM_S.GE.1) THEN
   IF (OELEC) THEN
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'I', NMOM_S, 5, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'I', NMOM_S, 5, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRSS, ZCSS, PINPRS, PFPR(:,:,:,5), PEFIELDW, ZQSS)
   ELSE
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'I', NMOM_S, 5, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'I', NMOM_S, 5, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PTHVREFZIKB, PPABST,ZT, ZRT_SUM, ZCPT, &
                             ZRSS, ZCSS, PINPRS, PFPR(:,:,:,5))
   END IF
 END IF
@@ -857,12 +867,12 @@ ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP
 ZCPT    = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP
 IF (NMOM_G.GE.1) THEN
   IF (OELEC) THEN
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'I', NMOM_G, 6, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'I', NMOM_G, 6, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRGS, ZCGS, PINPRG, PFPR(:,:,:,6), PEFIELDW, ZQGS)
   ELSE
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'I', NMOM_G, 6, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'I', NMOM_G, 6, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRGS, ZCGS, PINPRG, PFPR(:,:,:,6))
   END IF
 END IF
@@ -872,12 +882,12 @@ ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP
 ZCPT    = CST%XCPD + (CST%XCPV * ZRVS + CST%XCL * (ZRCS + ZRRS) + CST%XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP
 IF (NMOM_H.GE.1) THEN
   IF (OELEC) THEN
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'I', NMOM_H, 7, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'I', NMOM_H, 7, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRHS, ZCHS, PINPRH, PFPR(:,:,:,7), PEFIELDW, ZQHS)
   ELSE
-    CALL LIMA_SEDIMENTATION(D, CST, &
-                            'I', NMOM_H, 7, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, &
+    CALL LIMA_SEDIMENTATION(D, CST, ICED, HCLOUD, &
+                            'I', NMOM_H, 7, 1, PTSTEP, OELEC, PDZZ, PRHODREF, PTHVREFZIKB, PPABST, ZT, ZRT_SUM, ZCPT, &
                             ZRHS, ZCHS, PINPRH, PFPR(:,:,:,7))
   END IF
 END IF
@@ -2066,8 +2076,11 @@ IF (OELEC) THEN
 ! Attention, les signes des tendances ne sont pas traites de la meme facon dans ice3 et lima
 ! On se cale sur la facon de faire dans ice3 => on fait en sorte que les tendances soient positives
   IF (NMOM_H .GE. 1) THEN
-    CALL ELEC_TENDENCIES(D, KRR, IELEC, PTSTEP, GMASK_ELEC,                                             &
-                         PRHODREF, PRHODJ, ZT, ZCIT_ELEC,                                               &
+    CALL ELEC_TENDENCIES(D, CST, ICED, ICEP, ELECD, ELECP,                                              &
+                         KRR, IELEC, PTSTEP, GMASK_ELEC,                                                &
+                         BUCONF, TBUDGETS, KBUDGETS,                                                    &
+                         HCLOUD, PTHVREFZIKB,                                                           &
+                         PRHODREF,  PRHODJ, ZT, ZCIT_ELEC,                                              &
                          ZRVT_ELEC, ZRCT_ELEC, ZRRT_ELEC, ZRIT_ELEC, ZRST_ELEC, ZRGT_ELEC,              &
                          ZQPIT, ZQCT, ZQRT, ZQIT, ZQST, ZQGT, ZQNIT,                                    &
                          ZQPIS, ZQCS, ZQRS, ZQIS, ZQSS, ZQGS, ZQNIS,                                    &
@@ -2101,7 +2114,10 @@ IF (OELEC) THEN
                          PRCCORR2=-ZTOT_RC_CORR2*ZINV_TSTEP, PRRCORR2=-ZTOT_RR_CORR2*ZINV_TSTEP,        &
                          PRICORR2=-ZTOT_RI_CORR2*ZINV_TSTEP)
   ELSE
-    CALL ELEC_TENDENCIES(D, KRR, IELEC, PTSTEP, GMASK_ELEC,                                             &
+    CALL ELEC_TENDENCIES(D, CST, ICED, ICEP, ELECD, ELECP,                                              &
+                         KRR, IELEC, PTSTEP, GMASK_ELEC,                                                &
+                         BUCONF, TBUDGETS, KBUDGETS,                                                    &
+                         HCLOUD, PTHVREFZIKB,                                                           &
                          PRHODREF, PRHODJ, ZT, ZCIT_ELEC,                                               &
                          ZRVT_ELEC, ZRCT_ELEC, ZRRT_ELEC, ZRIT_ELEC, ZRST_ELEC, ZRGT_ELEC,              &
                          ZQPIT, ZQCT, ZQRT, ZQIT, ZQST, ZQGT, ZQNIT,                                    &
diff --git a/src/PHYEX/micro/modd_elec_descr.f90 b/src/PHYEX/micro/modd_elec_descr.f90
index 24cdba934b55911b4d91d1a0da23427bd345a391..db6aaa9587502e2c80bc9f6eb9be30cad41dade3 100644
--- a/src/PHYEX/micro/modd_elec_descr.f90
+++ b/src/PHYEX/micro/modd_elec_descr.f90
@@ -93,7 +93,6 @@ REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XQTMIN ! Min values allowed for the
 REAL, DIMENSION(:) ,      ALLOCATABLE :: XRTMIN_ELEC    ! Limit value of R where charge is available
 !
 REAL       :: XEPSILON        ! Dielectric permittivity of air (F/m)
-REAL       :: XECHARGE        ! Elementary charge (C)
 !
 !
 ! parameters relative to electrification
@@ -163,6 +162,7 @@ LOGICAL :: LIAGGS_LATHAM=.FALSE.   ! .T.: to enable ELEC=>MICROPHYS via
 TYPE ELEC_DESCR_t
   REAL :: XFC, XFR, XFI, XFS, XFG, XFH ! f_x in q_x = e_x D^f_x
   REAL :: XCXR            ! Exponent in the concentration-slope
+  REAL       :: XECHARGE        ! Elementary charge (C)
 END TYPE ELEC_DESCR_t
 !
 TYPE(ELEC_DESCR_t), SAVE, TARGET :: ELEC_DESCR
@@ -173,7 +173,8 @@ REAL, POINTER :: XFC => NULL(), &
                  XFS => NULL(), &
                  XFG => NULL(), &
                  XFH => NULL(), &
-                 XCXR => NULL()
+                 XCXR => NULL(), &
+                 XECHARGE => NULL()
 !
 CONTAINS
 !
@@ -187,6 +188,7 @@ SUBROUTINE ELEC_DESCR_ASSOCIATE()
   XFG => ELEC_DESCR%XFG
   XFH => ELEC_DESCR%XFH
   XCXR => ELEC_DESCR%XCXR
+  XECHARGE=> ELEC_DESCR%XECHARGE
 END SUBROUTINE ELEC_DESCR_ASSOCIATE
 !
 END MODULE MODD_ELEC_DESCR
diff --git a/src/MNH/modd_elec_param.f90 b/src/PHYEX/micro/modd_elec_param.f90
similarity index 100%
rename from src/MNH/modd_elec_param.f90
rename to src/PHYEX/micro/modd_elec_param.f90
diff --git a/src/MNH/modd_elecn.f90 b/src/PHYEX/micro/modd_elecn.f90
similarity index 100%
rename from src/MNH/modd_elecn.f90
rename to src/PHYEX/micro/modd_elecn.f90
diff --git a/src/PHYEX/micro/modd_param_lima.f90 b/src/PHYEX/micro/modd_param_lima.f90
index 3b8b56a4a5cb1476f0875babf18fcd80d250a40a..61fd573f42c169d41cb4d217e604e399ea4efe13 100644
--- a/src/PHYEX/micro/modd_param_lima.f90
+++ b/src/PHYEX/micro/modd_param_lima.f90
@@ -710,7 +710,7 @@ ENDIF
 !
 IF(LLCHECK) THEN
   CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CPRISTINE_ICE_LIMA', CPRISTINE_ICE_LIMA, &
-                                                'PLAT', 'COLU', 'BURO')
+                                  'PLAT', 'COLU', 'BURO','YPLA','YCOL','YBUR','YDRO','YHCO','YHBU')
   CALL CHECK_NAM_VAL_CHAR(KLUOUT, 'CHEVRIMED_ICE_LIMA', CHEVRIMED_ICE_LIMA, &
                                                 'GRAU', 'HAIL')
 
diff --git a/src/PHYEX/micro/modd_param_lima_cold.f90 b/src/PHYEX/micro/modd_param_lima_cold.f90
index 3134e583f585419a5121808a9ac0fd302a1b9e89..cc3e3adc1e5639286c37689f9569905947dc8501 100644
--- a/src/PHYEX/micro/modd_param_lima_cold.f90
+++ b/src/PHYEX/micro/modd_param_lima_cold.f90
@@ -53,12 +53,14 @@ REAL      :: XLBEXS,XLBS,XNS          ! Snow/agg.      distribution parameters
 !
 REAL      :: XAI,XBI,XC_I,XDI         ,XF0I,XF2I,XC1I ! Cloud ice      charact.
 REAL      ::                           XF0IS,XF1IS    ! (large Di vent. coef.)
+REAL      :: XDELTAI, XGAMMAI         ! cloud ice area-diameter parameters
 REAL      :: XAS,XBS,XCS,XDS,XCCS,XCXS,XF0S,XF1S,XC1S ! Snow/agg.      charact.
 !
 REAL      :: XLBDAS_MIN, XLBDAS_MAX   ! Max values allowed for the shape parameter of snow
 REAL      :: XFVELOS                  ! Wurtz - snow fall speed parameterizaed after Thompson 2008
 REAL      :: XTRANS_MP_GAMMAS         ! Wurtz - change between lambda value for MP and gen. gamma
 !
+REAL      :: XREFFI                   ! constante for ice crystal effective radius for ecRad
 !
 !-------------------------------------------------------------------------------
 !
@@ -146,6 +148,8 @@ REAL, POINTER :: XLBEXI => NULL(), &
                  XNS => NULL(), &
                  XAI => NULL(), &
                  XBI => NULL(), &
+                 XGAMMAI => NULL(), &
+                 XDELTAI => NULL(), &
                  XC_I => NULL(), &
                  XDI => NULL(), &
                  XF0I => NULL(), &
@@ -166,6 +170,7 @@ REAL, POINTER :: XLBEXI => NULL(), &
                  XLBDAS_MAX => NULL(), &
                  XFVELOS => NULL(), &
                  XTRANS_MP_GAMMAS => NULL(), &
+                 XREFFI => NULL(), &
                  XFSEDRI => NULL(), &
                  XFSEDCI => NULL(), &
                  XFSEDRS => NULL(), &
@@ -286,6 +291,8 @@ IF(.NOT. ASSOCIATED(XLBEXI)) THEN
   XNS                => PARAM_LIMA_COLD%XNS
   XAI                => PARAM_LIMA_COLD%XAI
   XBI                => PARAM_LIMA_COLD%XBI
+  XGAMMAI            => PARAM_LIMA_COLD%XGAMMAI
+  XDELTAI            => PARAM_LIMA_COLD%XDELTAI
   XC_I               => PARAM_LIMA_COLD%XC_I
   XDI                => PARAM_LIMA_COLD%XDI
   XF0I               => PARAM_LIMA_COLD%XF0I
@@ -306,6 +313,7 @@ IF(.NOT. ASSOCIATED(XLBEXI)) THEN
   XLBDAS_MAX         => PARAM_LIMA_COLD%XLBDAS_MAX
   XFVELOS            => PARAM_LIMA_COLD%XFVELOS
   XTRANS_MP_GAMMAS   => PARAM_LIMA_COLD%XTRANS_MP_GAMMAS
+  XREFFI             => PARAM_LIMA_COLD%XREFFI
   XFSEDRI            => PARAM_LIMA_COLD%XFSEDRI
   XFSEDCI            => PARAM_LIMA_COLD%XFSEDCI
   XFSEDRS            => PARAM_LIMA_COLD%XFSEDRS
diff --git a/src/MNH/compute_lambda.f90 b/src/PHYEX/micro/mode_compute_lambda.f90
similarity index 82%
rename from src/MNH/compute_lambda.f90
rename to src/PHYEX/micro/mode_compute_lambda.f90
index e2d085cb0ac4b7ef4e7eb4ec112be34d7351b737..ba45978ba3a82791b61a1f6449a501372d1eca5c 100644
--- a/src/MNH/compute_lambda.f90
+++ b/src/PHYEX/micro/mode_compute_lambda.f90
@@ -5,29 +5,13 @@
 !-----------------------------------------------------------------
 !
 !     ##########################
-      MODULE MODI_COMPUTE_LAMBDA
+      MODULE MODE_COMPUTE_LAMBDA
 !     ##########################
-!
-INTERFACE
-      SUBROUTINE COMPUTE_LAMBDA (KID, KMOMENT, KSIZE, &
-                                 PRHO, PRTMIN, PRX, PCX, PLBDX)
-!
-INTEGER,                INTENT(IN)    :: KID      ! nb of the hydrometeor category
-INTEGER,                INTENT(IN)    :: KMOMENT  ! nb of moments of the microphysics scheme
-INTEGER,                INTENT(IN)    :: KSIZE
-REAL,                   INTENT(IN)    :: PRTMIN
-REAL, DIMENSION(KSIZE), INTENT(IN)    :: PRHO     ! reference density
-REAL, DIMENSION(KSIZE), INTENT(IN)    :: PRX      ! Mixing ratio
-REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCX      ! Nb concentration
-REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PLBDX    ! Slope parameter of the distribution
-!
-END SUBROUTINE COMPUTE_LAMBDA
-END INTERFACE
-END MODULE MODI_COMPUTE_LAMBDA
-!
+IMPLICIT NONE
+CONTAINS
 !
 ! #########################################################
-  SUBROUTINE COMPUTE_LAMBDA (KID, KMOMENT, KSIZE, &
+  SUBROUTINE COMPUTE_LAMBDA (KID, KMOMENT, KSIZE, HCLOUD, &
                              PRHO, PRTMIN, PRX, PCX, PLBDX)
 ! #########################################################
 !
@@ -49,7 +33,6 @@ END MODULE MODI_COMPUTE_LAMBDA
 !*      0.      DECLARATIONS
 !               ------------
 !
-USE MODD_PARAM_n, ONLY: CCLOUD
 USE MODD_RAIN_ICE_DESCR_n, ONLY: XLBC_I=>XLBC, XLBR_I=>XLBR, XLBI_I=>XLBI, XLBS_I=>XLBS, XLBG_I=>XLBG, XLBH_I=>XLBH, &
                                  XLBEXC_I=>XLBEXC, XLBEXR_I=>XLBEXR, XLBEXI_I=>XLBEXI, XLBEXS_I=>XLBEXS,             &
                                  XLBEXG_I=>XLBEXG, XLBEXH_I=>XLBEXH,                                                 &
@@ -72,6 +55,7 @@ IMPLICIT NONE
 !*      0.1   Declaration of dummy arguments
 !
 INTEGER,                INTENT(IN)    :: KID      ! nb of the hydrometeor category
+CHARACTER (LEN=4),      INTENT(IN)   ::  HCLOUD       ! Kind of microphysical scheme
 INTEGER,                INTENT(IN)    :: KMOMENT  ! nb of moments of the microphysics scheme
 INTEGER,                INTENT(IN)    :: KSIZE
 REAL,                   INTENT(IN)    :: PRTMIN
@@ -92,21 +76,21 @@ REAL :: ZRTMIN, ZLBX, ZLBEX, ZLBDAX_MAX, ZCCX, ZCXX
 ZRTMIN = PRTMIN
 !
 IF (KID == 2) THEN
-  IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
+  IF (HCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
     ZLBX  = XLBC_L
     ZLBEX = XLBEXC_L
 !  ELSE
 !    print*, 'ERROR: the computation of lambda_c is not available if c is 1-moment species'
   END IF
 ELSE IF (KID == 3) THEN
-  IF (CCLOUD == 'LIMA') THEN
+  IF (HCLOUD == 'LIMA') THEN
     ZLBX  = XLBR_L
     ZLBEX = XLBEXR_L
     IF (KMOMENT == 1) THEN
       ZCCX = XCCR_L
       ZCXX = XCXR_L
     END IF  
-  ELSE IF (CCLOUD(1:3) == 'ICE') THEN
+  ELSE IF (HCLOUD(1:3) == 'ICE') THEN
     ZLBX  = XLBR_I
     ZLBEX = XLBEXR_I
     ZCCX  = XCCR_I
@@ -115,17 +99,17 @@ ELSE IF (KID == 3) THEN
     PRINT*, 'ERROR: something wrong with the computation of lambda_r'
   END IF
 ELSE IF (KID == 4) THEN
-  IF (CCLOUD == 'LIMA') THEN
+  IF (HCLOUD == 'LIMA') THEN
     ZLBX  = XLBI_L
     ZLBEX = XLBEXI_L
-  ELSE IF (CCLOUD(1:3) == 'ICE') THEN
+  ELSE IF (HCLOUD(1:3) == 'ICE') THEN
     ZLBX  = XLBI_I
     ZLBEX = XLBEXI_I
   ELSE
     PRINT*, 'ERROR: something wrong with the computation of lambda_i'
   END IF
 ELSE IF (KID == 5) THEN
-  IF (CCLOUD == 'LIMA') THEN
+  IF (HCLOUD == 'LIMA') THEN
     ZLBX  = XLBS_L
     ZLBEX = XLBEXS_L
     ZLBDAX_MAX = XLBDAS_MAX_L
@@ -133,7 +117,7 @@ ELSE IF (KID == 5) THEN
       ZCCX = XCCS_L
       ZCXX = XCXS_L
     END IF
-  ELSE IF (CCLOUD(1:3) == 'ICE') THEN
+  ELSE IF (HCLOUD(1:3) == 'ICE') THEN
     ZLBX  = XLBS_I
     ZLBEX = XLBEXS_I
     ZLBDAX_MAX = XLBDAS_MAX_I
@@ -143,14 +127,14 @@ ELSE IF (KID == 5) THEN
     PRINT*, 'ERROR: something wrong with the computation of lambda_s'
   END IF
 ELSE IF (KID == 6) THEN
-  IF (CCLOUD == 'LIMA') THEN ! .AND. KMOMENT == 1) THEN
+  IF (HCLOUD == 'LIMA') THEN ! .AND. KMOMENT == 1) THEN
     ZLBX  = XLBG_L
     ZLBEX = XLBEXG_L
     IF (KMOMENT == 1) THEN
       ZCCX = XCCG_L
       ZCXX = XCXG_L
     END IF
-  ELSE IF (CCLOUD(1:3) == 'ICE') THEN
+  ELSE IF (HCLOUD(1:3) == 'ICE') THEN
     ZLBX  = XLBG_I
     ZLBEX = XLBEXG_I
     ZCCX  = XCCG_I
@@ -159,14 +143,14 @@ ELSE IF (KID == 6) THEN
     PRINT*, 'ERROR: something wrong with the computation of lambda_g'
   END IF        
 ELSE IF (KID == 7) THEN
-  IF (CCLOUD == 'LIMA') THEN ! .AND. KMOMENT == 1) THEN
+  IF (HCLOUD == 'LIMA') THEN ! .AND. KMOMENT == 1) THEN
     ZLBX  = XLBH_L
     ZLBEX = XLBEXH_L
     IF (KMOMENT == 1) THEN
       ZCCX = XCCH_L
       ZCXX = XCXH_L
     END IF
-  ELSE IF (CCLOUD(1:3) == 'ICE') THEN
+  ELSE IF (HCLOUD(1:3) == 'ICE') THEN
     ZLBX  = XLBH_I
     ZLBEX = XLBEXH_I
     ZCCX  = XCCH_I
@@ -227,3 +211,4 @@ ELSE IF (KMOMENT == 1) THEN
 END IF
 !
 END  SUBROUTINE COMPUTE_LAMBDA
+END MODULE MODE_COMPUTE_LAMBDA
diff --git a/src/MNH/mode_elec_beard_effect.f90 b/src/PHYEX/micro/mode_elec_beard_effect.f90
similarity index 82%
rename from src/MNH/mode_elec_beard_effect.f90
rename to src/PHYEX/micro/mode_elec_beard_effect.f90
index dfbcd7cd1230816e05d769a659f745794484d001..b7f8f94fc75236c9da3c572e50a0036946801a87 100644
--- a/src/MNH/mode_elec_beard_effect.f90
+++ b/src/PHYEX/micro/mode_elec_beard_effect.f90
@@ -10,7 +10,7 @@ IMPLICIT NONE
 CONTAINS
 !
 ! ###################################################################
-  SUBROUTINE ELEC_BEARD_EFFECT(D, KID, OSEDIM, PT, PRHODREF, &
+  SUBROUTINE ELEC_BEARD_EFFECT(D, CST, ICED, HCLOUD, KID, OSEDIM, PT, PRHODREF, PTHVREFZIKB, &
                                PRX, PQX, PEFIELDW, PLBDA, PBEARDCOEF)
 ! ####################################################################
 !
@@ -42,10 +42,11 @@ CONTAINS
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_CST,             ONLY: XG, XRD, XP00, XTT
+USE MODD_CST,             ONLY: CST_t
 USE MODD_DIMPHYEX,        ONLY: DIMPHYEX_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+
 USE MODD_ELEC_DESCR,      ONLY: XRTMIN_ELEC
-USE MODD_PARAMETERS,      ONLY: JPVEXT
 USE MODD_PARAM_LIMA,      ONLY: XALPHAC_L=>XALPHAC, XNUC_L=>XNUC, XALPHAR_L=>XALPHAR, XNUR_L=>XNUR, &
                                 XALPHAI_L=>XALPHAI, XNUI_L=>XNUI, XALPHAS_L=>XALPHAS, XNUS_L=>XNUS, &
                                 XALPHAG_L=>XALPHAG, XNUG_L=>XNUG,                                   &
@@ -57,28 +58,16 @@ USE MODD_PARAM_LIMA_MIXED,ONLY: XBG_L=>XBG, XCG_L=>XCG, XDG_L=>XDG, &
                                 XALPHAH_L=>XALPHAH, XNUH_L=>XNUH
 USE MODD_PARAM_LIMA_WARM, ONLY: XBR_L=>XBR, XCR_L=>XCR, XDR_L=>XDR, &
                                 XBC_L=>XBC, XCC_L=>XCC, XDC_L=>XDC
-USE MODD_PARAM_n,         ONLY: CCLOUD
-USE MODD_RAIN_ICE_DESCR_n,ONLY: XALPHAC_I=>XALPHAC, XNUC_I=>XNUC, XALPHAR_I=>XALPHAR, XNUR_I=>XNUR, &
-                                XALPHAI_I=>XALPHAI, XNUI_I=>XNUI, XALPHAS_I=>XALPHAS, XNUS_I=>XNUS, &
-                                XALPHAG_I=>XALPHAG, XNUG_I=>XNUG, XALPHAH_I=>XALPHAH, XNUH_I=>XNUH, &
-                                XBC_I=>XBC, XCC_I=>XCC, XDC_I=>XDC,                                 &
-                                XBR_I=>XBR, XCR_I=>XCR, XDR_I=>XDR,                                 &
-                                XBI_I=>XBI, XC_I_I=>XC_I, XDI_I=>XDI,                               &
-                                XBS_I=>XBS, XCS_I=>XCS, XDS_I=>XDS,                                 &
-                                XBG_I=>XBG, XCG_I=>XCG, XDG_I=>XDG,                                 &
-                                XBH_I=>XBH, XCH_I=>XCH, XDH_I=>XDH,                                 &
-                                XCEXVT_I=>XCEXVT
-USE MODD_REF,             ONLY: XTHVREFZ
 !
 USE MODI_MOMG
 !
-USE MODE_TOOLS_ll, ONLY: GET_INDICE_ll
-!
 IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments
 !
 TYPE(DIMPHYEX_t),                 INTENT(IN)    :: D
+TYPE(CST_t),              INTENT(IN)    :: CST
+TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
 INTEGER,                          INTENT(IN)    :: KID         ! Hydrometeor ID
 LOGICAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: OSEDIM      ! if T, compute the sedim. proc.
 REAL,    DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PRHODREF    ! Reference density
@@ -88,7 +77,9 @@ REAL,    DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PQX         ! Elec. charge de
 REAL,    DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PEFIELDW    ! Vertical component of the electric field
 REAL,    DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PLBDA       ! Slope param. of the distribution
 REAL,    DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PBEARDCOEF  ! Beard coefficient
+CHARACTER (LEN=4),      INTENT(IN)   ::  HCLOUD       ! Kind of microphysical scheme
 !
+REAL, INTENT(IN)                :: PTHVREFZIKB ! Reference thv at IKB for electricity
 !*       0.2   Declarations of local variables
 !
 INTEGER :: JIJ, JK ! loop indexes
@@ -106,6 +97,19 @@ real, dimension(D%NIJT,D%NKT) :: zreynolds
 !
 !-------------------------------------------------------------------------------
 !
+
+ASSOCIATE(XALPHAC_I=>ICED%XALPHAC, XNUC_I=>ICED%XNUC, XALPHAR_I=>ICED%XALPHAR, XNUR_I=>ICED%XNUR, &
+                                XALPHAI_I=>ICED%XALPHAI, XNUI_I=>ICED%XNUI, XALPHAS_I=>ICED%XALPHAS, XNUS_I=>ICED%XNUS, &
+                                XALPHAG_I=>ICED%XALPHAG, XNUG_I=>ICED%XNUG, XALPHAH_I=>ICED%XALPHAH, XNUH_I=>ICED%XNUH, &
+                                XBC_I=>ICED%XBC, XCC_I=>ICED%XCC, XDC_I=>ICED%XDC,                                 &
+                                XBR_I=>ICED%XBR, XCR_I=>ICED%XCR, XDR_I=>ICED%XDR,                                 &
+                                XBI_I=>ICED%XBI, XC_I_I=>ICED%XC_I, XDI_I=>ICED%XDI,                               &
+                                XBS_I=>ICED%XBS, XCS_I=>ICED%XCS, XDS_I=>ICED%XDS,                                 &
+                                XBG_I=>ICED%XBG, XCG_I=>ICED%XCG, XDG_I=>ICED%XDG,                                 &
+                                XBH_I=>ICED%XBH, XCH_I=>ICED%XCH, XDH_I=>ICED%XDH,                                 &
+                                XCEXVT_I=>ICED%XCEXVT)
+
+
 !*       1.    COMPUTE USEFULL PARAMETERS
 !              --------------------------
 !
@@ -117,7 +121,7 @@ IIJE = D%NIJE
 !*       1.1   Select the right parameters
 !              --> depend on the microphysics scheme and the hydrometeor species
 !
-IF (CCLOUD(1:3) == 'ICE') THEN
+IF (HCLOUD(1:3) == 'ICE') THEN
   ZCEXVT = XCEXVT_I
   !
   IF (KID == 2) THEN
@@ -158,7 +162,7 @@ IF (CCLOUD(1:3) == 'ICE') THEN
     ZALPHAX = XALPHAH_I
     ZNUX    = XNUH_I
   END IF
-ELSE IF (CCLOUD == 'LIMA') THEN
+ELSE IF (HCLOUD == 'LIMA') THEN
   ZCEXVT = XCEXVT_L
   !
   IF (KID == 2) THEN
@@ -204,9 +208,9 @@ END IF
 !*       1.2   Parameters from Table 1 in Beard (1980)
 !
 ! Reference value of the dynamic viscosity of air
-ZETA0 = (1.718E-5 + 0.0049E-5 * (XTHVREFZ(IKTB) - XTT))
+ZETA0 = (1.718E-5 + 0.0049E-5 * (PTHVREFZIKB - CST%XTT))
 !
-ZRHO00 = XP00 / (XRD * XTHVREFZ(IKTB))
+ZRHO00 = CST%XP00 / (CST%XRD * PTHVREFZIKB)
 ZCOR00 = ZRHO00**ZCEXVT
 !
 ! (rho_0 / eta_0) * (v * lambda^d)
@@ -228,7 +232,7 @@ DO JK = IKTB, IKTE
     IF (OSEDIM(JIJ,JK) .AND. PRX(JIJ,JK) .GT. XRTMIN_ELEC(KID) .AND. PLBDA(JIJ,JK) .GT. 0.) THEN
 !--cb--
       ! Temperature K --> C
-      ZT = PT(JIJ,JK) - XTT
+      ZT = PT(JIJ,JK) - CST%XTT
       !
       ! Pre-factor of f_0
       IF (ZT >= 0.0) THEN
@@ -241,7 +245,7 @@ DO JK = IKTB, IKTE
       ZF1 = SQRT(ZRHO00/PRHODREF(JIJ,JK))
       !
       ! compute (1 - K) = 1 - qE/mg
-      ZK = 1. - PQX(JIJ,JK) * PEFIELDW(JIJ,JK) / (PRX(JIJ,JK) * XG)
+      ZK = 1. - PQX(JIJ,JK) * PEFIELDW(JIJ,JK) / (PRX(JIJ,JK) * CST%XG)
       !
       ! Hyp : K_0 ~ 0
       ! Hyp : si qE > mg, K > 1
@@ -270,6 +274,7 @@ DO JK = IKTB, IKTE
   END DO
 END DO
 !
+END ASSOCIATE
 !-------------------------------------------------------------------------------
 !
 END SUBROUTINE ELEC_BEARD_EFFECT
diff --git a/src/MNH/elec_compute_ex.f90 b/src/PHYEX/micro/mode_elec_compute_ex.f90
similarity index 72%
rename from src/MNH/elec_compute_ex.f90
rename to src/PHYEX/micro/mode_elec_compute_ex.f90
index af16313c509489393cc3b7fb7fb15f141f7c0e84..7f0977cef7411fe7ba0b8c19ae470b1647e26bf7 100644
--- a/src/MNH/elec_compute_ex.f90
+++ b/src/PHYEX/micro/mode_elec_compute_ex.f90
@@ -5,34 +5,14 @@
 !-----------------------------------------------------------------
 !
 !     ###########################
-      MODULE MODI_ELEC_COMPUTE_EX
+      MODULE MODE_ELEC_COMPUTE_EX
 !     ###########################
-!
-INTERFACE
-      SUBROUTINE ELEC_COMPUTE_EX (KID, KMOMENT, KSIZE, &
-                                  PDUM, PRHO, PRTMIN,  &
-                                  PRX, PQX, PEX, PLBDX, PCX)
-!
-INTEGER,                          INTENT(IN)    :: KID      ! nb of the hydrometeor category
-INTEGER,                          INTENT(IN)    :: KMOMENT  ! nb of moments of the microphysics scheme
-INTEGER,                          INTENT(IN)    :: KSIZE
-REAL,                             INTENT(IN)    :: PDUM     ! =1. if mixing ratio
-                                                            ! =timestep if source
-REAL,                             INTENT(IN)    :: PRTMIN
-REAL, DIMENSION(KSIZE),           INTENT(IN)    :: PRHO     ! reference density
-REAL, DIMENSION(KSIZE),           INTENT(IN)    :: PQX      ! Electric charge
-REAL, DIMENSION(KSIZE),           INTENT(IN)    :: PRX      ! Mixing ratio
-REAL, DIMENSION(KSIZE),           INTENT(INOUT) :: PEX      ! e coef of the q-D relation
-REAL, DIMENSION(KSIZE), OPTIONAL, INTENT(IN)    :: PLBDX    ! Slope parameter of the distribution
-REAL, DIMENSION(KSIZE), OPTIONAL, INTENT(IN)    :: PCX      ! Nb concentration
-!
-END SUBROUTINE ELEC_COMPUTE_EX
-END INTERFACE
-END MODULE MODI_ELEC_COMPUTE_EX
+IMPLICIT NONE
+CONTAINS
 !
 !
 ! #######################################################
-  SUBROUTINE ELEC_COMPUTE_EX (KID, KMOMENT, KSIZE,     &
+  SUBROUTINE ELEC_COMPUTE_EX (KID, KMOMENT, KSIZE,HCLOUD, &
                               PDUM, PRHO, PRTMIN,      &
                               PRX, PQX, PEX, PLBDX, PCX )
 ! #######################################################
@@ -53,7 +33,6 @@ END MODULE MODI_ELEC_COMPUTE_EX
 !*      0.      DECLARATIONS
 !               ------------
 !
-USE MODD_PARAM_n,          ONLY : CCLOUD
 USE MODD_ELEC_PARAM,       ONLY : XECMAX, XERMAX, XEIMAX, XESMAX, XEGMAX, XEHMAX, &
                                   XFQUPDC, XFQUPDR, XFQUPDI, XEXFQUPDI, XFQUPDS, XFQUPDG, XFQUPDH
 USE MODD_ELEC_DESCR,       ONLY : XCXR, XFC, XFR, XFI, XFS, XFG, XFH
@@ -81,6 +60,7 @@ REAL, DIMENSION(KSIZE),           INTENT(IN)    :: PRX      ! Mixing ratio
 REAL, DIMENSION(KSIZE),           INTENT(INOUT) :: PEX      ! e coef of the q-D relation
 REAL, DIMENSION(KSIZE), OPTIONAL, INTENT(IN)    :: PLBDX    ! Slope parameter of the distribution
 REAL, DIMENSION(KSIZE), OPTIONAL, INTENT(IN)    :: PCX      ! Nb concentration
+CHARACTER (LEN=4),      INTENT(IN)   ::  HCLOUD       ! Kind of microphysical scheme
 !
 !*     0.2    Declaration of local variables
 !
@@ -97,8 +77,8 @@ PEX(:) = 0.
 IF (KID == 2) THEN       ! parameters for cloud droplets
   ZFX     = XFC
   ZEXMAX  = XECMAX
-  IF (CCLOUD(1:3) == 'ICE') ZFQUPDX = XFQUPDC
-  IF (CCLOUD == 'LIMA') THEN
+  IF (HCLOUD(1:3) == 'ICE') ZFQUPDX = XFQUPDC
+  IF (HCLOUD == 'LIMA') THEN
     ZALPHAX = XALPHAC
     ZNUX    = XNUC
   END IF
@@ -106,16 +86,16 @@ ELSE IF (KID == 3) THEN  ! parameters for raindrops
   ZFX     = XFR
   ZCX     = XCXR
   ZEXMAX  = XERMAX
-  IF (CCLOUD(1:3) == 'ICE') ZFQUPDX = XFQUPDR
-  IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
+  IF (HCLOUD(1:3) == 'ICE') ZFQUPDX = XFQUPDR
+  IF (HCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
     ZALPHAX = XALPHAR
     ZNUX    = XNUR
   END IF
 ELSE IF (KID == 4) THEN  ! parameters for ice crystals
   ZFX     = XFI
   ZEXMAX  = XEIMAX
-  IF (CCLOUD(1:3) == 'ICE') ZFQUPDX = XFQUPDI
-  IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
+  IF (HCLOUD(1:3) == 'ICE') ZFQUPDX = XFQUPDI
+  IF (HCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
     ZALPHAX = XALPHAI
     ZNUX    = XNUI
   END IF
@@ -123,41 +103,41 @@ ELSE IF (KID == 5) THEN  ! parameters for snow/aggregates
   ZFX     = XFS
   ZEXMAX  = XESMAX
   ZFQUPDX = XFQUPDS
-  IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
+  IF (HCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
     ZALPHAX = XALPHAS
     ZNUX    = XNUS
-  ELSE IF (CCLOUD == 'LIMA' .AND. KMOMENT == 1) THEN
+  ELSE IF (HCLOUD == 'LIMA' .AND. KMOMENT == 1) THEN
     ZCX   = XCXS_L
-  ELSE IF (CCLOUD(1:3) == 'ICE') THEN
+  ELSE IF (HCLOUD(1:3) == 'ICE') THEN
     ZCX   = XCXS_I
   END IF
 ELSE IF (KID == 6) THEN  ! parameters for graupel
   ZFX     = XFG
   ZEXMAX  = XEGMAX
   ZFQUPDX = XFQUPDG
-  IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
+  IF (HCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
     ZALPHAX = XALPHAG
     ZNUX    = XNUG
-  ELSE IF (CCLOUD == 'LIMA' .AND. KMOMENT == 1) THEN
+  ELSE IF (HCLOUD == 'LIMA' .AND. KMOMENT == 1) THEN
     ZCX   = XCXG_L
-  ELSE IF (CCLOUD(1:3) == 'ICE') THEN
+  ELSE IF (HCLOUD(1:3) == 'ICE') THEN
     ZCX   = XCXG_I
   END IF
 ELSE IF (KID == 7) THEN  ! parameters for hail
   ZFX     = XFH
   ZEXMAX  = XEHMAX
   ZFQUPDX = XFQUPDH
-  IF (CCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
+  IF (HCLOUD == 'LIMA' .AND. KMOMENT == 2) THEN
     ZALPHAX = XALPHAH
     ZNUX    = XNUH
-  ELSE IF (CCLOUD == 'LIMA' .AND. KMOMENT == 1) THEN
+  ELSE IF (HCLOUD == 'LIMA' .AND. KMOMENT == 1) THEN
     ZCX   = XCXH_L
-  ELSE IF (CCLOUD(1:3) == 'ICE') THEN
+  ELSE IF (HCLOUD(1:3) == 'ICE') THEN
     ZCX   = XCXH_I
   END IF  
 END IF
 !
-IF (CCLOUD == 'LIMA') THEN
+IF (HCLOUD == 'LIMA') THEN
   IF (KID == 2) THEN
     ZALPHAX = XALPHAC
     ZNUX    = XNUC
@@ -223,4 +203,4 @@ ELSE IF (KMOMENT == 1) THEN
 END IF
 !
 END  SUBROUTINE ELEC_COMPUTE_EX
-                                                              
+END MODULE MODE_ELEC_COMPUTE_EX
diff --git a/src/MNH/elec_tendencies.f90 b/src/PHYEX/micro/mode_elec_tendencies.f90
similarity index 81%
rename from src/MNH/elec_tendencies.f90
rename to src/PHYEX/micro/mode_elec_tendencies.f90
index 0f16543127b550aedbed33b28cdf2f954dba7105..af2a62376f1ebd296ca6c3b46f9d88c76e7a74ce 100644
--- a/src/MNH/elec_tendencies.f90
+++ b/src/PHYEX/micro/mode_elec_tendencies.f90
@@ -3,133 +3,16 @@
 !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
+MODULE MODE_ELEC_TENDENCIES
 !
+IMPLICIT NONE
+CONTAINS
 !
 !     #########################################################################################
-      SUBROUTINE ELEC_TENDENCIES (D, KRR, KMICRO, PTSTEP, ODMICRO,                            &
+      SUBROUTINE ELEC_TENDENCIES (D, CST, ICED, ICEP, ELECD, ELECP,                           &
+                                  KRR, KMICRO, PTSTEP, ODMICRO,                               &
+                                  BUCONF, TBUDGETS, KBUDGETS,                                 &
+                                  HCLOUD, PTHVREFZIKB,                                        &
                                   PRHODREF, PRHODJ, PZT, PCIT,                                &
                                   PRVT, PRCT, PRRT, PRIT, PRST, PRGT,                         &
                                   PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT,                 &
@@ -157,7 +40,7 @@ END MODULE MODI_ELEC_TENDENCIES
 !!****  * - 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 
+!!    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.
 !!
@@ -180,24 +63,18 @@ END MODULE MODI_ELEC_TENDENCIES
 !*      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_BUDGET,     ONLY:  NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, &
+                            NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1,            &
+                            TBUDGETDATA, TBUDGETCONF_t
+!
+USE MODD_CST,              ONLY: CST_t
+USE MODD_DIMPHYEX,         ONLY: DIMPHYEX_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
+USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND
+USE MODD_ELEC_DESCR      
+USE MODD_ELEC_PARAM      
 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_ICE_n
 USE MODD_PARAM_LIMA,       ONLY: XALPHAI_L=>XALPHAI, XNUI_L=>XNUI,   &
                                  XCEXVT_L=>XCEXVT, XRTMIN_L=>XRTMIN, &
                                  LCIBU, LRDSF,                       &
@@ -218,35 +95,15 @@ USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG, XCXG_L=>XCXG,
                                  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
+!
+!#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 MODE_BUDGET_PHY,      ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
 !
-USE MODI_COMPUTE_LAMBDA
-USE MODI_ELEC_COMPUTE_EX
+USE MODE_COMPUTE_LAMBDA, ONLY: COMPUTE_LAMBDA
+USE MODE_ELEC_COMPUTE_EX,ONLY: ELEC_COMPUTE_EX
 USE MODI_MOMG
 !
 IMPLICIT NONE
@@ -254,7 +111,15 @@ IMPLICIT NONE
 !
 !*      0.1   Declaration of dummy arguments
 !
-TYPE(DIMPHYEX_t),                     INTENT(IN)    :: D
+TYPE(DIMPHYEX_t),                      INTENT(IN)     :: D
+TYPE(CST_t),                           INTENT(IN)     :: CST
+TYPE(TBUDGETCONF_t),                   INTENT(IN)     :: BUCONF        ! budget structure
+TYPE(RAIN_ICE_DESCR_t),                INTENT(IN)     :: ICED
+TYPE(RAIN_ICE_PARAM_t),                INTENT(IN)     :: ICEP
+TYPE(ELEC_PARAM_t),                    INTENT(IN)     :: ELECP   ! electrical parameters
+TYPE(ELEC_DESCR_t),                    INTENT(IN)     :: ELECD   ! electrical descriptive csts
+TYPE(TBUDGETDATA), DIMENSION(KBUDGETS),INTENT(INOUT)  :: TBUDGETS
+INTEGER,                               INTENT(IN)     :: KBUDGETS
 !
 INTEGER,                              INTENT(IN)    :: KMICRO
 REAL,                                 INTENT(IN)    :: PTSTEP  ! Double Time step
@@ -262,6 +127,7 @@ REAL,                                 INTENT(IN)    :: PTSTEP  ! Double Time ste
 INTEGER,                              INTENT(IN)    :: KRR     ! Number of moist variable
 !
 LOGICAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)   :: ODMICRO ! mask to limit computation
+CHARACTER (LEN=4),      INTENT(IN)   ::  HCLOUD       ! Kind of microphysical scheme
 !
 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
@@ -342,6 +208,7 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRHT   ! Hail m.r
 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
+REAL, INTENT(IN)                :: PTHVREFZIKB ! Reference thv at IKB for electricity
 !
 !
 !*      0.2   Declaration of local variables    
@@ -486,6 +353,23 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZRCMLTSR, ZRICFRR, ZRVHENC, ZRCHINC, ZRVHONH,
                                    ZRGDRYH, ZRHMLTR, ZRDRYHG 
 !
 !------------------------------------------------------------------
+ASSOCIATE(XCEXVT_I=>ICED%XCEXVT, XRTMIN_I=>ICED%XRTMIN,                       &
+                                XALPHAI_I=>ICED%XALPHAI, XNUI_I=>ICED%XNUI, XAI_I=>ICED%XAI, XBI_I=>ICED%XBI, &
+                                XDS_I=>ICED%XDS, XDG_I=>ICED%XDG,                             &
+                                XCXS_I=>ICED%XCXS, XCXG_I=>ICED%XCXG,                         &
+                                XCOLIS_I=>ICEP%XCOLIS, XCOLEXIS_I=>ICEP%XCOLEXIS,             &
+                                XCOLIG_I=>ICEP%XCOLIG, XCOLEXIG_I=>ICEP%XCOLEXIG,             &
+                                XCOLSG_I=>ICEP%XCOLSG, XCOLEXSG_I=>ICEP%XCOLEXSG,             &
+                                NGAMINC_I=>ICEP%NGAMINC,                                 &                                
+                                NACCLBDAR_I=>ICEP%NACCLBDAR, NACCLBDAS_I=>ICEP%NACCLBDAS,     &
+                                XACCINTP1S_I=>ICEP%XACCINTP1S, XACCINTP2S_I=>ICEP%XACCINTP2S, &
+                                XACCINTP1R_I=>ICEP%XACCINTP1R, XACCINTP2R_I=>ICEP%XACCINTP2R, &
+                                NDRYLBDAR_I=>ICEP%NDRYLBDAR, NDRYLBDAS_I=>ICEP%NDRYLBDAS,     &
+                                NDRYLBDAG_I=>ICEP%NDRYLBDAG,                             &
+                                XDRYINTP1R_I=>ICEP%XDRYINTP1R, XDRYINTP2R_I=>ICEP%XDRYINTP2R, &
+                                XDRYINTP1S_I=>ICEP%XDRYINTP1S, XDRYINTP2S_I=>ICEP%XDRYINTP2S, &
+                                XDRYINTP1G_I=>ICEP%XDRYINTP1G, XDRYINTP2G_I=>ICEP%XDRYINTP2G, &
+                                XRIMINTP1_I=>ICEP%XRIMINTP1,   XRIMINTP2_I=>ICEP%XRIMINTP2    )
 !
 !*      1.    INITIALIZATIONS
 !             ---------------
@@ -502,7 +386,7 @@ IKE = D%NKE
 !
 !*      1.2   select parameters between ICEx and LIMA
 !
-IF (CCLOUD(1:3) == 'ICE') THEN
+IF (HCLOUD(1:3) == 'ICE') THEN
   ZCEXVT = XCEXVT_I
   IMOM_C = 1
   IMOM_R = 1
@@ -514,7 +398,7 @@ IF (CCLOUD(1:3) == 'ICE') THEN
   ELSE
     IMOM_H = 0
   END IF
-ELSE IF (CCLOUD == 'LIMA') THEN
+ELSE IF (HCLOUD == 'LIMA') THEN
   ZCEXVT = XCEXVT_L
   IMOM_C = NMOM_C
   IMOM_R = NMOM_R
@@ -524,7 +408,7 @@ ELSE IF (CCLOUD == 'LIMA') THEN
   IMOM_H = NMOM_H
 END IF
 !
-ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB))
+ZRHO00 = CST%XP00 / (CST%XRD * PTHVREFZIKB)
 ZCOR00 = ZRHO00**ZCEXVT
 !
 IF (LINDUCTIVE) ALLOCATE (ZEFIELDW(KMICRO))
@@ -539,11 +423,11 @@ 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
+  IF (HCLOUD(1:3) == 'ICE') THEN  ! ICE3 scheme
     ALLOCATE(ZRCMLTSR(IMICRO))
     ALLOCATE(ZRICFRR(IMICRO))
   END IF
-  IF (CCLOUD == 'LIMA') THEN  ! LIMA scheme
+  IF (HCLOUD == 'LIMA') THEN  ! LIMA scheme
     ALLOCATE(ZRVHENC(IMICRO))
     ALLOCATE(ZRCHINC(IMICRO))
     ALLOCATE(ZRVHONH(IMICRO))
@@ -651,11 +535,11 @@ IF (KMICRO >= 0) THEN
     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
+    IF (HCLOUD(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
+    IF (HCLOUD == '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))
@@ -751,7 +635,7 @@ IF (KMICRO >= 0) THEN
 !*      1.5   select parameters between ICEx and LIMA
 !
   ALLOCATE(ZRTMIN(KRR))
-  IF (CCLOUD(1:3) == 'ICE') THEN
+  IF (HCLOUD(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)
     !
@@ -793,7 +677,7 @@ IF (KMICRO >= 0) THEN
     ZRIMINTP1 = XRIMINTP1_I
     ZRIMINTP2 = XRIMINTP2_I
     !
-  ELSE IF (CCLOUD == 'LIMA') THEN
+  ELSE IF (HCLOUD == 'LIMA') THEN
 ! in ini_lima, xrtmin is initialized with dimension 7
     ZRTMIN(1:KRR) = XRTMIN_L(1:KRR)
     !
@@ -840,32 +724,32 @@ IF (KMICRO >= 0) THEN
 !*      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)
+  IF (HCLOUD(1:3) == 'ICE') ZCCT(:) = 0.
+  CALL COMPUTE_LAMBDA(2, IMOM_C, KMICRO, HCLOUD, ZRHODREF, ZRTMIN(2), ZRCT, ZCCT, ZLBDAC)
+  CALL COMPUTE_LAMBDA(3, IMOM_R, KMICRO, HCLOUD, ZRHODREF, ZRTMIN(3), ZRRT, ZCRT, ZLBDAR)
+  CALL COMPUTE_LAMBDA(4, IMOM_I, KMICRO, HCLOUD, ZRHODREF, ZRTMIN(4), ZRIT, ZCIT, ZLBDAI)
+  CALL COMPUTE_LAMBDA(5, IMOM_S, KMICRO, HCLOUD, ZRHODREF, ZRTMIN(5), ZRST, ZCST, ZLBDAS)
+  CALL COMPUTE_LAMBDA(6, IMOM_G, KMICRO, HCLOUD, ZRHODREF, ZRTMIN(6), ZRGT, ZCGT, ZLBDAG)
+  IF (KRR == 7) CALL COMPUTE_LAMBDA(7, IMOM_H, KMICRO, HCLOUD, 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)
+  IF (HCLOUD == 'LIMA') THEN
+    CALL ELEC_COMPUTE_EX(2, IMOM_C, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(2), ZRCT, ZQCT, ZECT, PLBDX=ZLBDAC, PCX=ZCCT)
+    CALL ELEC_COMPUTE_EX(3, IMOM_R, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(3), ZRRT, ZQRT, ZERT, PLBDX=ZLBDAR, PCX=ZCRT)
+    CALL ELEC_COMPUTE_EX(4, IMOM_I, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(4), ZRIT, ZQIT, ZEIT, PLBDX=ZLBDAI, PCX=ZCIT)
+    CALL ELEC_COMPUTE_EX(5, IMOM_S, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(5), ZRST, ZQST, ZEST, PLBDX=ZLBDAS, PCX=ZCST)
+    CALL ELEC_COMPUTE_EX(6, IMOM_G, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(6), ZRGT, ZQGT, ZEGT, PLBDX=ZLBDAG, PCX=ZCGT)
+    IF (KRR == 7) CALL ELEC_COMPUTE_EX(7, IMOM_H, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(7), ZRHT, ZQHT, ZEHT, PLBDX=ZLBDAH, PCX=ZCHT)
+  ELSE IF (HCLOUD(1:3) == 'ICE') THEN
+    CALL ELEC_COMPUTE_EX(2, 1, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(2), ZRCT, ZQCT, ZECT)
+    CALL ELEC_COMPUTE_EX(3, 1, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(3), ZRRT, ZQRT, ZERT, PLBDX=ZLBDAR)
+    CALL ELEC_COMPUTE_EX(4, 1, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(4), ZRIT, ZQIT, ZEIT, PCX=ZCIT)
+    CALL ELEC_COMPUTE_EX(5, 1, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(5), ZRST, ZQST, ZEST, PLBDX=ZLBDAS)
+    CALL ELEC_COMPUTE_EX(6, 1, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(6), ZRGT, ZQGT, ZEGT, PLBDX=ZLBDAG)
+    IF (KRR == 7) CALL ELEC_COMPUTE_EX(7, 1, KMICRO, HCLOUD, 1., ZRHODREF, ZRTMIN(7), ZRHT, ZQHT, ZEHT, PLBDX=ZLBDAH)
   END IF
 !
 !
@@ -922,10 +806,10 @@ IF (KMICRO >= 0) THEN
 !
 !*      2.2   spontaneous freezing (rhong)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SFR', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_INIT_PHY(D, 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', &
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'SFR', &
                             Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !  
@@ -938,20 +822,20 @@ IF (KMICRO >= 0) THEN
     ZQRS(:) = 0.
   END WHERE
 !
-  if ( lbudget_sv ) then
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SFR', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_END_PHY(D, 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', &
+    CALL BUDGET_STORE_END_PHY(D, 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', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_INIT_PHY(D, 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', &
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'IMLT', &
                             Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -960,10 +844,10 @@ IF (KMICRO >= 0) THEN
     ZQIS(:) = 0.
   END WHERE
 !
-  if ( lbudget_sv ) then
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'IMLT', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_END_PHY(D, 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', &
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'IMLT', &
                            Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -979,7 +863,7 @@ IF (KMICRO >= 0) THEN
   ZWQ(:) = 0.
   WHERE (ZRCHONI(:) > 0. .AND.           &
          ZRCT(:) > XRTMIN_ELEC(2) .AND.  &
-         ABS(ZQCT(:)) > XQTMIN(2) .AND. ABS(ZECT(:)) > XECMIN)
+         ABS(ZQCT(:)) > XQTMIN(2) .AND. ABS(ZECT(:)) > ELECP%XECMIN)
     ZWQ(:) = XQHON * ZECT(:) * ZRCHONI(:)
     ZWQ(:) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQCS(:) )
     !
@@ -987,20 +871,20 @@ IF (KMICRO >= 0) THEN
     ZQCS(:) = ZQCS(:) - ZWQ(:)
   END WHERE
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'HON', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, 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', &
+    CALL BUDGET_STORE_ADD_PHY(D, 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
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPS', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'DEPS', &
                             Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field =  0. ) )
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPS', &
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'DEPS', &
                             Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field =  0. ) )
   end if
 !
@@ -1013,16 +897,16 @@ IF (KMICRO >= 0) THEN
     ZWQ(:) = SIGN( MIN( ABS(ZQST(:)/PTSTEP),ABS(ZWQ(:)) ),ZQSS(:) )
     !
     ZQSS(:)  = ZQSS(:)  - ZWQ(:)
-    ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/XECHARGE )
-    ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/XECHARGE )
+    ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/ELECD%XECHARGE )
+    ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/ELECD%XECHARGE )
   END WHERE
 !
-  if ( lbudget_sv ) then
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPS', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'DEPS', &
                            Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field =  0. ) )
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPS', &
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'DEPS', &
                            Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field =  0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DEPS', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'DEPS', &
                            Unpack( -zwq(:) * zrhodj(:),  mask = odmicro(:, :, :), field =  0. ) )
   end if
 !
@@ -1033,10 +917,10 @@ IF (KMICRO >= 0) THEN
                                 XRTMIN_ELEC(4), XQTMIN(4), XCOEF_RQ_I, &
                                 ZWQ, ZQIS, ZQSS)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'AGGS', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'AGGS', &
                            Unpack( -zwq(:), mask = odmicro(:, :, :), field =  0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'AGGS', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'AGGS', &
                            Unpack(  zwq(:), mask = odmicro(:, :, :), field =  0. ) )
   end if
 !
@@ -1045,10 +929,10 @@ IF (KMICRO >= 0) THEN
 !
   CALL ELEC_IAGGS_B()
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'NIIS', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'NIIS', &
                            Unpack( -zwq_ni(:), mask = odmicro(:, :, :), field =  0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'NIIS', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'NIIS', &
                            Unpack(  zwq_ni(:), mask = odmicro(:, :, :), field =  0. ) )
   end if
 !
@@ -1064,34 +948,34 @@ IF (KMICRO >= 0) THEN
                                 XRTMIN_ELEC(4), XQTMIN(4), XCOEF_RQ_I, &
                                 ZWQ, ZQIS, ZQSS)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'AUTS', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'AUTS', &
                            Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'AUTS', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'AUTS', &
                            Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
 !
 !*      2.10  snow --> ice conversion (rscnvi)
 !
-  IF (CCLOUD == 'LIMA') THEN
+  IF (HCLOUD == 'LIMA') THEN
     CALL COMPUTE_CHARGE_TRANSFER (ZRICNVI, ZRST, ZQST, PTSTEP, &
                                   XRTMIN_ELEC(5), XQTMIN(5), XCOEF_RQ_S, &
                                   ZWQ, ZQSS, ZQIS)          
 !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CNVI', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'CNVI', &
                              Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'CNVI', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'CNVI', &
                              Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
 !
 !*      2.11  water vapor deposition on ice crystals (rvdepi)
 !
-    if ( lbudget_sv ) then
-      call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'SUBI', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'SUBI', &
                               Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'SUBI', &
+      CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'SUBI', &
                               Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
     !
@@ -1104,16 +988,16 @@ IF (KMICRO >= 0) THEN
       ZWQ(:) = SIGN( MIN( ABS(ZQIT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQIS(:) )
       !
       ZQIS(:)  = ZQIS(:)  - ZWQ(:)
-      ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/XECHARGE )
-      ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/XECHARGE )
+      ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/ELECD%XECHARGE )
+      ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/ELECD%XECHARGE )
     END WHERE
 !
-    if ( lbudget_sv ) then
-      call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'SUBI', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'SUBI', &
                              Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'SUBI', &
+      CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'SUBI', &
                              Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )           
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'SUBI', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'SUBI', &
                              Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if    
   END IF
@@ -1121,10 +1005,10 @@ IF (KMICRO >= 0) THEN
 !
 !*      2.12  water vapor deposition on graupel (rvdepg)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPG', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'DEPG', &
                             Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPG', &
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'DEPG', &
                             Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -1137,16 +1021,16 @@ IF (KMICRO >= 0) THEN
     ZWQ(:) = SIGN( MIN( ABS(ZQGT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQGS(:) )
     !
     ZQGS(:)  = ZQGS(:)  - ZWQ(:) 
-    ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/XECHARGE )
-    ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/XECHARGE )
+    ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/ELECD%XECHARGE )
+    ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/ELECD%XECHARGE )
   END WHERE
 !
-  if ( lbudget_sv ) then
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPG', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'DEPG', &
                            Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPG', &
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'DEPG', &
                            Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DEPG', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'DEPG', &
                            Unpack( -zwq(:) * zrhodj(:),  mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -1162,10 +1046,10 @@ IF (KMICRO >= 0) THEN
                                 XRTMIN_ELEC(2), XQTMIN(2), XCOEF_RQ_C, &
                                 ZWQ, ZQCS, ZQRS)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'AUTO', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'AUTO', &
                            Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'AUTO', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'AUTO', &
                            Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -1176,20 +1060,20 @@ IF (KMICRO >= 0) THEN
                                 XRTMIN_ELEC(2), XQTMIN(2), XCOEF_RQ_C, &
                                 ZWQ, ZQCS, ZQRS)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'ACCR', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'ACCR', &
                            Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'ACCR', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'ACCR', &
                            Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
 !
 !*      3.3   evaporation of raindrops (rrevav)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'REVA', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'REVA', &
                             Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'REVA', &
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'REVA', &
                             Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -1200,27 +1084,27 @@ IF (KMICRO >= 0) THEN
     ZWQ(:) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQRS(:) )
     !
     ZQRS(:)  = ZQRS(:)  - ZWQ(:)
-    ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/XECHARGE )
-    ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/XECHARGE )
+    ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ(:)/ELECD%XECHARGE )
+    ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ(:)/ELECD%XECHARGE )
   END WHERE
 !
-  if ( lbudget_sv ) then
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'REVA', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'REVA', &
                            Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'REVA', &
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'REVA', &
                            Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'REVA', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'REVA', &
                            Unpack( -zwq(:) * zrhodj(:),  mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
 !
 !*      3.4   conversion of drops to droplets (rrcvrc)
 !
-  IF (CCLOUD == 'LIMA') THEN
-    if ( lbudget_sv ) then
-      call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'R2C1', &
+  IF (HCLOUD == 'LIMA') THEN
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'R2C1', &
                               Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'R2C1', &
+      CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'R2C1', &
                               Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
 !
@@ -1228,10 +1112,10 @@ IF (KMICRO >= 0) THEN
                                   XRTMIN_ELEC(3), XQTMIN(3), XCOEF_RQ_R, &
                                   ZWQ, ZQRS, ZQCS)
 !
-    if ( lbudget_sv ) then
-      call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'R2C1', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'R2C1', &
                              Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'R2C1', &
+      CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'R2C1', &
                              Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
   END IF
@@ -1243,12 +1127,12 @@ IF (KMICRO >= 0) THEN
 !
 !*      4.1   cloud droplet riming of the aggregates
 !
-  if ( lbudget_sv ) then
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'RIM', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'RIM', &
                            Unpack( zqcs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'RIM', &
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'RIM', &
                            Unpack( zqss(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'RIM', &
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'RIM', &
                            Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -1278,7 +1162,7 @@ IF (KMICRO >= 0) THEN
   GMASK(:) = .FALSE.
   IGMASK = 0
   DO JJ = 1, SIZE(GMASK)
-    IF (ZRSRIMCG(JJ) > 0. .AND. ZZT(JJ) < XTT .AND. &
+    IF (ZRSRIMCG(JJ) > 0. .AND. ZZT(JJ) < CST%XTT .AND. &
         ZRCT(JJ) > XRTMIN_ELEC(2) .AND. ZRST(JJ) > XRTMIN_ELEC(5) .AND. &
         ZLBDAS(JJ) > 0.) THEN  !++cb-- 12/07/23 condition ajoutee pour eviter log(0)
       IGMASK = IGMASK + 1
@@ -1331,27 +1215,27 @@ IF (KMICRO >= 0) THEN
     ZQSS(:) = ZQSS(:) - ZWQ(:)
   END WHERE
 !
-  if ( lbudget_sv ) then
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'RIM', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'RIM', &
                            Unpack( zqcs(:) * zrhodj(:),  mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'RIM', &
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'RIM', &
                            Unpack( zqss(:) * zrhodj(:),  mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'RIM', &
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'RIM', &
                            Unpack( zqgs(:) * zrhodj(:),  mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
 !
 !*      4.2   Hallett-Mossop ice multiplication process due to snow riming (rhmsi)
 !
-  IF (CCLOUD == 'LIMA') THEN
+  IF (HCLOUD == 'LIMA') THEN
     CALL COMPUTE_CHARGE_TRANSFER (ZRSHMSI, ZRST, ZQST, PTSTEP,          &
                                   XRTMIN_ELEC(4), XQTMIN(4), XCOEF_RQ_S, &
                                   ZWQ, ZQSS, ZQIS)       
 !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'HMS', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'HMS', &
                              Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'HMS', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'HMS', &
                              Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
   END IF
@@ -1428,7 +1312,7 @@ IF (KMICRO >= 0) THEN
            ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. &
            ZCRT(:) > 0.             .AND. ZCST(:) > 0.             .AND. &
            ZLBDAR(:) > 0.           .AND. ZLBDAS(:) > 0.           .AND. &
-           ABS(ZERT(:)) > XERMIN)  ! and zzt(:) < xtt ?
+           ABS(ZERT(:)) > ELECP%XERMIN)  ! and zzt(:) < xtt ?
       ZWQ4(:) = XFQRACCS * ZERT(:) * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) * &
                 ZCRT(:) * ZCST(:)                                        * &
                (XLBQRACCS1 * ZLBDAR(:)**(-2.0 - XFR)                     + &
@@ -1473,12 +1357,12 @@ IF (KMICRO >= 0) THEN
       ZQGS(:) = ZQGS(:) + ZWQ5(:,4)
     END WHERE
     !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'ACC', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'ACC', &
                              Unpack( (-zwq5(:,1) - zwq5(:,3)) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'ACC', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'ACC', &
                              Unpack( ( zwq5(:,1) - zwq5(:,4)) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'ACC', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'ACC', &
                              Unpack( ( zwq5(:,3) + zwq5(:,4)) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if    
     !
@@ -1491,25 +1375,25 @@ IF (KMICRO >= 0) THEN
                                 XRTMIN_ELEC(5), XQTMIN(5), XCOEF_RQ_S, &
                                 ZWQ, ZQSS, ZQGS)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'CMEL', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'CMEL', &
                            Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CMEL', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'CMEL', &
                            Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
 !
 !*      4.5   cloud droplet collection onto aggregates by positive temperature (rcmltsr)
 !
-  IF (CCLOUD(1:3) == 'ICE') THEN
+  IF (HCLOUD(1:3) == 'ICE') THEN
     CALL COMPUTE_CHARGE_TRANSFER (ZRCMLTSR, ZRCT, ZQCT, PTSTEP,           &
                                   XRTMIN_ELEC(2), XQTMIN(2), XCOEF_RQ_C, &
                                   ZWQ, ZQCS, ZQRS)
 !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'CMEL', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'CMEL', &
                              Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CMEL', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'CMEL', &
                              Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
   END IF
@@ -1522,12 +1406,12 @@ IF (KMICRO >= 0) THEN
 !
 !*      5.1   rain contact freezing (ricfrrg, rrcfrig, ricfrr)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CFRZ', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'CFRZ', &
                            Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CFRZ', &
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'CFRZ', &
                            Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CFRZ', &
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'CFRZ', &
                            Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
   !
@@ -1535,7 +1419,7 @@ IF (KMICRO >= 0) THEN
   WHERE (ZRRCFRIG(:) > 0. .AND.                                        &
          ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRRT(:) > XRTMIN_ELEC(3) .AND. &
          ZCRT(:) > 0.             .AND.                                &
-         ABS(ZERT(:)) > XERMIN    .AND. ABS(ZQRT(:)) > XQTMIN(3))
+         ABS(ZERT(:)) > ELECP%XERMIN    .AND. ABS(ZQRT(:)) > XQTMIN(3))
     ZWQ(:) = XQRCFRIG * ZLBDAR(:)**XEXQRCFRIG * ZCIT(:) * ZCRT(:) * &
              ZERT(:) * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:))  ! QRCFRIG
     ZWQ(:) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ(:)) ),ZQRS(:) )
@@ -1557,12 +1441,12 @@ IF (KMICRO >= 0) THEN
 !
 !++CB-- 16/06/2022 il manque le traitement de qricfrr
 !
-  if ( lbudget_sv ) then
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CFRZ', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'CFRZ', &
                            Unpack( zqrs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CFRZ', &
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'CFRZ', &
                            Unpack( zqis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CFRZ', &
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'CFRZ', &
                            Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -1602,10 +1486,10 @@ IF (KMICRO >= 0) THEN
   ! charge separation during collision between ice and graupel
   CALL ELEC_IDRYG_B()  ! QIDRYG_boun
   !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'NIIG', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'NIIG', &
                             Unpack( -zwq_ni(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'NIIG', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'NIIG', &
                             Unpack(  zwq_ni(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
   !
@@ -1714,7 +1598,7 @@ IF (KMICRO >= 0) THEN
            ZLBDAS(:) > 0.           .AND. ZLBDAG(:) > 0. .AND. &
            ABS(ZQST(:)) > XQTMIN(5) .AND. ABS(ZEST(:)) > XESMIN)
       ZWQ5(:,3) = ZWQ5(:,3) * XFQSDRYG *                                   &
-                  ZCOLSG * EXP(ZCOLEXSG * (ZZT(:) - XTT)) *                &
+                  ZCOLSG * EXP(ZCOLEXSG * (ZZT(:) - CST%XTT)) *                &
                   ZEST(:) * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) *          & 
                   ZCGT(:) * ZCST(:) *                                      &
                  (XLBQSDRYG1 * ZLBDAS(:)**(-2.0-XFS) +                     &
@@ -1734,10 +1618,10 @@ IF (KMICRO >= 0) THEN
     ! compute QSDRYG_boun
     CALL ELEC_SDRYG_B()
     !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'NISG', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'NISG', &
                               Unpack( -zwq_ni(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'NISG', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'NISG', &
                               Unpack(  zwq_ni(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
     !
@@ -1807,7 +1691,7 @@ IF (KMICRO >= 0) THEN
            ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & 
            ZCRT(:) > 0.             .AND. ZCGT(:) > 0.             .AND. & 
            ZLBDAR(:) > 0.           .AND. ZLBDAG(:) > 0.           .AND. &
-           ABS(ZERT(:)) > XERMIN .AND. ABS(ZQRT(:)) > XQTMIN(3))
+           ABS(ZERT(:)) > ELECP%XERMIN .AND. ABS(ZQRT(:)) > XQTMIN(3))
       ZWQ5(:,4) = ZWQ5(:,4) * XFQRDRYG *                                       &
                   ZRHODREF(:)**(-ZCEXVT) *                                     &
                   ZERT(:) * ZCGT(:) * ZCRT(:) *                                &
@@ -1823,16 +1707,16 @@ IF (KMICRO >= 0) THEN
     ENDWHERE
 !    ZRDRYG(:) = ZWQ5(:,1) + ZWQ5(:,2) + ZWQ5(:,3) + ZWQ5(:,4)
 !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DRYG', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'DRYG', &
                               Unpack( -zwq5(:,1) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'DRYG', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'DRYG', &
                               Unpack( -zwq5(:,4) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DRYG', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'DRYG', &
                               Unpack( -zwq5(:,2) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DRYG', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'DRYG', &
                               Unpack( -zwq5(:,3) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DRYG', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'DRYG', &
                               Unpack( (zwq5(:,1) + zwq5(:,2) + zwq5(:,3) + zwq5(:,4)) * zrhodj(:), &
                               mask = odmicro(:, :, :), field = 0. ) )
     end if
@@ -1842,15 +1726,15 @@ IF (KMICRO >= 0) THEN
 !
 !*      5.3   Hallett-Mossop ice multiplication process due to graupel riming (rhmgi)
 !
-  IF (CCLOUD == 'LIMA') THEN
+  IF (HCLOUD == 'LIMA') THEN
     CALL COMPUTE_CHARGE_TRANSFER (ZRGHMGI, ZRGT, ZQGT, PTSTEP,          &
                                   XRTMIN_ELEC(6), XQTMIN(6), XCOEF_RQ_G, &
                                   ZWQ, ZQGS, ZQIS)          
 !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'HMG', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'HMG', &
                              Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'HMG', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'HMG', &
                              Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
   END IF
@@ -1900,8 +1784,8 @@ IF (KMICRO >= 0) THEN
 !
 !*      5.4.4 conversion of graupel into hail (rwetgh)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETG', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'WETG', &
                             Unpack( zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -1932,19 +1816,19 @@ IF (KMICRO >= 0) THEN
     END WHERE
   END IF
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'WETG', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'WETG', &
                            Unpack( -zwq5(:,5) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'WETG', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'WETG', &
                            Unpack( -zwq5(:,8) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'WETG', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'WETG', &
                            Unpack( -zwq5(:,6) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'WETG', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'WETG', &
                            Unpack( -zwq5(:,7) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETG', &
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'WETG', &
                            Unpack(  zqgs(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     if ( krr == 7 ) &
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'WETG', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 6 ), 'WETG', &
                            Unpack( zwq5(:,9) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -1965,7 +1849,7 @@ IF (KMICRO >= 0) THEN
       ZWQ(:) = 0.
       !
       WHERE (GMASK(:) .AND.                                      &
-             ZEFIELDW(:) /= 0. .AND. ABS(ZEGT(:)) > XEGMIN .AND. &
+             ZEFIELDW(:) /= 0. .AND. ABS(ZEGT(:)) > ELECP%XEGMIN .AND. &
              ZLBDAG(:) > 0. .AND. ZCGT(:) > 0. .AND.             &
              ZRGT(:) > XRTMIN_ELEC(6) .AND. ZRCT(:) > XRTMIN_ELEC(2))
         ZWQ(:) = XIND1 * ZCGT(:) * ZRHOCOR(:) *                             &
@@ -1978,10 +1862,10 @@ IF (KMICRO >= 0) THEN
         ZQCS(:) = ZQCS(:) - ZWQ(:)
       END WHERE
     !
-      if ( lbudget_sv ) then
-        call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'INCG', &
+      if ( BUCONF%LBUDGET_SV ) then
+        CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'INCG', &
                                Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-        call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'INCG', &
+        CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'INCG', &
                                Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
       end if    
       !
@@ -2004,10 +1888,10 @@ IF (KMICRO >= 0) THEN
                                 XRTMIN_ELEC(6), XQTMIN(6), XCOEF_RQ_G, &
                                 ZWQ, ZQGS, ZQRS)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'GMLT', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'GMLT', &
                            Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'GMLT', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'GMLT', &
                            Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -2022,14 +1906,14 @@ IF (KMICRO >= 0) THEN
 !
 !*      6.1   collisional ice breakup (cibu)
 !
-  IF (CCLOUD == 'LIMA' .AND. LCIBU) &
+  IF (HCLOUD == 'LIMA' .AND. LCIBU) &
     CALL COMPUTE_CHARGE_TRANSFER (ZRICIBU, ZRST, ZQST, PTSTEP,           &
                                   XRTMIN_ELEC(5), XQTMIN(5), XCOEF_RQ_S, &
                                   ZWQ, ZQSS, ZQIS)
 !
 !*      6.2   raindrop shattering freezing (rdsf)
 !
-  IF (CCLOUD == 'LIMA' .AND. LRDSF) &
+  IF (HCLOUD == 'LIMA' .AND. LRDSF) &
     CALL COMPUTE_CHARGE_TRANSFER (ZRIRDSF, ZRRT, ZQRT, PTSTEP,           &
                                   XRTMIN_ELEC(3), XQTMIN(3), XCOEF_RQ_R, &
                                   ZWQ, ZQRS, ZQIS)
@@ -2086,18 +1970,18 @@ IF (KMICRO >= 0) THEN
       ZQHS(:) = ZQHS(:) + ZWQ5(:,4)
     END WHERE
 !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'WETH', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'WETH', &
                              Unpack( -zwq5(:, 1) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'WETH', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'WETH', &
                              Unpack( -zwq5(:, 4) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'WETH', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'WETH', &
                              Unpack( -zwq5(:, 2) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'WETH', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'WETH', &
                              Unpack( -zwq5(:, 3) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETH', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'WETH', &
                              Unpack( -zwq5(:, 5) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'WETH',                      &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 6 ), 'WETH',                      &
                              Unpack( ( zwq5(:, 1) + zwq5(:, 2) + zwq5(:, 3) + zwq5(:, 4) + zwq5(:, 5) ) &
                                        * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
@@ -2154,18 +2038,18 @@ IF (KMICRO >= 0) THEN
                                   XRTMIN_ELEC(7), XQTMIN(7), XCOEF_RQ_H, &
                                   ZWQ, ZQHS, ZQGS)
 !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DRYH', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'DRYH', &
                              Unpack( -zwq5(:, 1) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'DRYH', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'DRYH', &
                              Unpack( -zwq5(:, 4) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DRYH', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'DRYH', &
                              Unpack( -zwq5(:, 2) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DRYH', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 4 ), 'DRYH', &
                              Unpack( -zwq5(:, 3) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DRYH', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 5 ), 'DRYH', &
                              Unpack( (-zwq5(:, 5) - zwq(:)) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'DRYH',                      &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 6 ), 'DRYH',                      &
                              Unpack( ( zwq5(:, 1) + zwq5(:, 2) + zwq5(:, 3) + zwq5(:, 4) + zwq5(:, 5) + zwq(:) ) &
                                        * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
@@ -2177,10 +2061,10 @@ IF (KMICRO >= 0) THEN
                                   XRTMIN_ELEC(7), XQTMIN(7), XCOEF_RQ_H, &
                                   ZWQ, ZQHS, ZQRS)
 !
-    if ( lbudget_sv ) then
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'HMLT', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'HMLT', &
                              Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'HMLT', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 6 ), 'HMLT', &
                              Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
 !
@@ -2198,10 +2082,10 @@ IF (KMICRO >= 0) THEN
                                 XRTMIN_ELEC(2), XQTMIN(2), XCOEF_RQ_C, &
                                 ZWQ, ZQCS, ZQIS)
 !
-  if ( lbudget_sv ) then
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'BERFI', &
+  if ( BUCONF%LBUDGET_SV ) then
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'BERFI', &
                            Unpack( -zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-    call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'BERFI', &
+    CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'BERFI', &
                            Unpack(  zwq(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
   end if
 !
@@ -2211,12 +2095,12 @@ IF (KMICRO >= 0) THEN
 !*      9.    COMPUTE THE CHARGE TRANSFER ASSOCIATED WITH THE CORRECTION TERM
 !             ---------------------------------------------------------------
 !
-  IF (CCLOUD == 'LIMA') THEN
+  IF (HCLOUD == 'LIMA') THEN
 !
-    if ( lbudget_sv ) then
-      call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'CORR2', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'CORR2', &
                               Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'CORR2', &
+      CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'CORR2', &
                               Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if
 !
@@ -2226,8 +2110,8 @@ IF (KMICRO >= 0) THEN
       ZWQ(:) = SIGN( MIN( ABS(ZQCT(:)/PTSTEP),ABS(ZWQ1(:)) ),ZQCS(:) )
       !
       ZQCS(:)  = ZQCS(:)  - ZWQ1(:)
-      ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ1(:)/XECHARGE )
-      ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ1(:)/XECHARGE )      
+      ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ1(:)/ELECD%XECHARGE )
+      ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ1(:)/ELECD%XECHARGE )      
     END WHERE
     !
     !
@@ -2237,8 +2121,8 @@ IF (KMICRO >= 0) THEN
       ZWQ2(:) = SIGN( MIN( ABS(ZQRT(:)/PTSTEP),ABS(ZWQ2(:)) ),ZQRS(:) )
       !
       ZQRS(:)  = ZQRS(:)  - ZWQ2(:)
-      ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ2(:)/XECHARGE )
-      ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ2(:)/XECHARGE )      
+      ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ2(:)/ELECD%XECHARGE )
+      ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ2(:)/ELECD%XECHARGE )      
     END WHERE
     !
     ZWQ3(:) = 0.
@@ -2247,20 +2131,20 @@ IF (KMICRO >= 0) THEN
       ZWQ3(:) = SIGN( MIN( ABS(ZQIT(:)/PTSTEP),ABS(ZWQ3(:)) ),ZQIS(:) )
       !
       ZQIS(:)  = ZQIS(:)  - ZWQ3(:)
-      ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ3(:)/XECHARGE )
-      ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ3(:)/XECHARGE )      
+      ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ3(:)/ELECD%XECHARGE )
+      ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ3(:)/ELECD%XECHARGE )      
     END WHERE
 !
-    if ( lbudget_sv ) then
-      call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'CORR2', &
+    if ( BUCONF%LBUDGET_SV ) then
+      CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG ), 'CORR2', &
                              Unpack( zqpis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'CORR2', &
+      CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECEND ), 'CORR2', &
                              Unpack( zqnis(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'CORR2', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 1 ), 'CORR2', &
                              Unpack( zwq1(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CORR2', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 2 ), 'CORR2', &
                              Unpack( zwq2(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )                     
-      call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CORR2', &
+      CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + NSV_ELECBEG + 3 ), 'CORR2', &
                              Unpack( zwq3(:) * zrhodj(:), mask = odmicro(:, :, :), field = 0. ) )
     end if    
   END IF
@@ -2362,6 +2246,7 @@ IF (ALLOCATED(ZRHMLTR))  DEALLOCATE(ZRHMLTR)
 IF (ALLOCATED(ZRDRYHG))  DEALLOCATE(ZRDRYHG)
 !
 !------------------------------------------------------------------
+END ASSOCIATE
 !
 CONTAINS
 !
@@ -2394,7 +2279,7 @@ GELEC(:,:) = .FALSE.
 ZDELTALWC(:) = 0.
 ZFT(:) = 0.
 !
-GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) < XTT
+GELEC(:,3) = ZZT(:) > (CST%XTT - 40.) .AND. ZZT(:) < CST%XTT
 GELEC(:,1) = GELEC(:,3) .AND.                                              &
              ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. &
              ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE
@@ -2409,9 +2294,9 @@ GELEC(:,4) = GELEC(:,1) .OR. GELEC(:,2) .OR. GELEC(:,3)
 !
 WHERE (GELEC(:,4))
   ! f(DeltaT)
-  ZFT(:) = - 1.7E-5 * ((-21 / (XQTC - XTT)) * (ZZT(:) - XTT))**3   &
-           - 0.003  * ((-21 / (XQTC - XTT)) * (ZZT(:) - XTT))**2   &
-           - 0.05   * ((-21 / (XQTC - XTT)) * (ZZT(:) - XTT))      &
+  ZFT(:) = - 1.7E-5 * ((-21 / (XQTC - CST%XTT)) * (ZZT(:) - CST%XTT))**3   &
+           - 0.003  * ((-21 / (XQTC - CST%XTT)) * (ZZT(:) - CST%XTT))**2   &
+           - 0.05   * ((-21 / (XQTC - CST%XTT)) * (ZZT(:) - CST%XTT))      &
            + 0.13
   !
   ! LWC - LWC_crit
@@ -2470,7 +2355,7 @@ WHERE (ZLBDAG(:) > 0. .AND. ZRCT(:) > 0.)
   ZEW(:) = 0.8 * ZRCT(:) * ZRHODREF(:) * 1.E3   ! (g m^-3)
 END WHERE
 !
-GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) <= XTT .AND. &
+GELEC(:,3) = ZZT(:) > (CST%XTT - 40.) .AND. ZZT(:) <= CST%XTT .AND. &
              ZEW(:) >= 0.01 .AND. ZEW(:) <= 10.
 GELEC(:,1) = GELEC(:,3) .AND.                                              &
              ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. &
@@ -2548,40 +2433,40 @@ ZRAR_CRIT(:) = 0.
 !
 IF (CNI_CHARGING == 'SAP98') THEN
 !
-  WHERE (ZZT(:) <= XTT .AND. ZZT(:) >= (XTT - 23.7)) ! Original from SAP98
-    ZRAR_CRIT(:) = 1.0 + 7.93E-2 * (ZZT(:) - XTT) +    &
-                         4.48E-2 * (ZZT(:) - XTT)**2 + &
-                         7.48E-3 * (ZZT(:) - XTT)**3 + &
-                         5.47E-4 * (ZZT(:) - XTT)**4 + &
-                         1.67E-5 * (ZZT(:) - XTT)**5 + &
-                         1.76E-7 * (ZZT(:) - XTT)**6
+  WHERE (ZZT(:) <= CST%XTT .AND. ZZT(:) >= (CST%XTT - 23.7)) ! Original from SAP98
+    ZRAR_CRIT(:) = 1.0 + 7.93E-2 * (ZZT(:) - CST%XTT) +    &
+                         4.48E-2 * (ZZT(:) - CST%XTT)**2 + &
+                         7.48E-3 * (ZZT(:) - CST%XTT)**3 + &
+                         5.47E-4 * (ZZT(:) - CST%XTT)**4 + &
+                         1.67E-5 * (ZZT(:) - CST%XTT)**5 + &
+                         1.76E-7 * (ZZT(:) - CST%XTT)**6
   END WHERE
   !
-  WHERE (ZZT(:) < (XTT - 23.7) .AND. ZZT(:) > (XTT - 40.)) ! Added by Mansell
-    ZRAR_CRIT(:) = 3.4 * (1.0 - (ABS(ZZT(:) - XTT + 23.7) / & ! et al. (2005)
+  WHERE (ZZT(:) < (CST%XTT - 23.7) .AND. ZZT(:) > (CST%XTT - 40.)) ! Added by Mansell
+    ZRAR_CRIT(:) = 3.4 * (1.0 - (ABS(ZZT(:) - CST%XTT + 23.7) / & ! et al. (2005)
                    (-23.7 + 40.))**3.)
   END WHERE
   !
-  GELEC(:,3) = ZZT(:) >= (XTT - 40.) .AND. ZZT(:) <= XTT
+  GELEC(:,3) = ZZT(:) >= (CST%XTT - 40.) .AND. ZZT(:) <= CST%XTT
 !
 ELSE IF (CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN
 !
-  WHERE (ZZT(:) > (XTT - 10.7))
+  WHERE (ZZT(:) > (CST%XTT - 10.7))
     ZRAR_CRIT(:) = 0.66
   END WHERE
-  WHERE (ZZT(:) <= (XTT - 10.7) .AND. ZZT(:) >= (XTT - 23.7))
-    ZRAR_CRIT(:) = -1.47 - 0.2 * (ZZT(:) - XTT)
+  WHERE (ZZT(:) <= (CST%XTT - 10.7) .AND. ZZT(:) >= (CST%XTT - 23.7))
+    ZRAR_CRIT(:) = -1.47 - 0.2 * (ZZT(:) - CST%XTT)
   END WHERE
-  WHERE (ZZT(:) < (XTT - 23.7) .AND. ZZT(:) > (XTT - 40.))
+  WHERE (ZZT(:) < (CST%XTT - 23.7) .AND. ZZT(:) > (CST%XTT - 40.))
     ZRAR_CRIT(:) = 3.3
   END WHERE
   !
-  GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) <= XTT .AND. &
+  GELEC(:,3) = ZZT(:) > (CST%XTT - 40.) .AND. ZZT(:) <= CST%XTT .AND. &
                ZEW(:) >= 0.01 .AND. ZEW(:) <= 10.
 !
 ELSE IF (CNI_CHARGING == 'TERAR') THEN
 !
-  GELEC(:,3) = ZZT(:) >= (XTT - 40.) .AND. ZZT(:) <= XTT
+  GELEC(:,3) = ZZT(:) >= (CST%XTT - 40.) .AND. ZZT(:) <= CST%XTT
 END IF
 !
 GELEC(:,1) = GELEC(:,3) .AND.                                              &
@@ -2764,7 +2649,7 @@ ZDQ(:) = 0.
 !
 ZEW(:) = ZRCT(:) * ZRHODREF(:) * 1.E3      ! (g m^-3)
 !
-GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) <= XTT .AND. &
+GELEC(:,3) = ZZT(:) > (CST%XTT - 40.) .AND. ZZT(:) <= CST%XTT .AND. &
              ZEW(:) >= 0.01 .AND. ZEW(:) <= 10.
 GELEC(:,1) = GELEC(:,3) .AND.                                              &
              ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. &
@@ -2831,7 +2716,7 @@ WHERE (ZLBDAG(:) > 0. .AND. ZRCT(:) > 0.)
   ZEW(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * 1.E3 
 END WHERE
 !
-GELEC(:,3) = ZZT(:) >= (XTT - 40.) .AND. ZZT(:) <= XTT .AND.  &
+GELEC(:,3) = ZZT(:) >= (CST%XTT - 40.) .AND. ZZT(:) <= CST%XTT .AND.  &
              ZEW(:) >= 0.01 .AND. ZEW(:) <= 10.
 GELEC(:,1) = GELEC(:,3) .AND.                                              &
              ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. &
@@ -2969,7 +2854,7 @@ IF (IGAUX > 0) THEN
 !
 ! Temperature index (0C --> -40C)
   ZVECT1(1:IGAUX) = MAX( 1.00001, MIN( REAL(KIND_TEMP)-0.00001, &
-                                    (ZVECT1(1:IGAUX) - XTT - 1.)/(-1.) ) )
+                                    (ZVECT1(1:IGAUX) - CST%XTT - 1.)/(-1.) ) )
   IVECT1(1:IGAUX) = INT( ZVECT1(1:IGAUX) )
   ZVECT1(1:IGAUX) = ZVECT1(1:IGAUX) - REAL(IVECT1(1:IGAUX))
 !
@@ -3035,7 +2920,7 @@ IMPLICIT NONE
 !*      1.     COMPUTE THE COLLISION EFFICIENCY
 !              --------------------------------
 !
-ZQCOLIS(:) = ZCOLIS * EXP(ZCOLEXIS * (ZZT(:) - XTT))
+ZQCOLIS(:) = ZCOLIS * EXP(ZCOLEXIS * (ZZT(:) - CST%XTT))
 !
 ZWQ_NI(:) = 0.
 ZLIMIT(:) = 0.
@@ -3146,8 +3031,8 @@ ELSE
   ENDWHERE
 !
 ! For temperatures lower than -30C --> linear interpolation
-  WHERE (ZWQ_NI(:) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.))
-    ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - XTT + 40.) / 10.
+  WHERE (ZWQ_NI(:) /= 0. .AND. ZZT(:) < (CST%XTT-30.) .AND. ZZT(:) >= (CST%XTT-40.))
+    ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - CST%XTT + 40.) / 10.
   ENDWHERE
 !
 END IF
@@ -3177,7 +3062,7 @@ IMPLICIT NONE
 !*      1.     COMPUTE THE COLLISION EFFICIENCY
 !              --------------------------------
 !
-ZQCOLIG(:) = ZCOLIG * EXP(ZCOLEXIG * (ZZT(:) - XTT))
+ZQCOLIG(:) = ZCOLIG * EXP(ZCOLEXIG * (ZZT(:) - CST%XTT))
 !
 ZWQ_NI(:) = 0.
 ZLIMIT(:) = 0.
@@ -3288,8 +3173,8 @@ ELSE
   ENDWHERE
 !
 ! For temperatures lower than -30C --> linear interpolation
-  WHERE (ZWQ_NI(:) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.))
-    ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - XTT + 40.) / 10.
+  WHERE (ZWQ_NI(:) /= 0. .AND. ZZT(:) < (CST%XTT-30.) .AND. ZZT(:) >= (CST%XTT-40.))
+    ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - CST%XTT + 40.) / 10.
   ENDWHERE
 !
 END IF
@@ -3321,7 +3206,7 @@ IMPLICIT NONE
 !*      1.      COMPUTE THE COLLECTION EFFICIENCY
 !               ---------------------------------
 !
-ZQCOLSG(:) = ZCOLSG * EXP (ZCOLEXSG * (ZZT(:) - XTT))
+ZQCOLSG(:) = ZCOLSG * EXP (ZCOLEXSG * (ZZT(:) - CST%XTT))
 !
 ZWQ_NI(:) = 0.
 ZLIMIT(:) = 0.
@@ -3454,8 +3339,8 @@ ELSE
   ENDWHERE
 !
 ! For temperatures lower than -30C --> linear interpolation
-  WHERE (ZWQ_NI(:) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.))
-    ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - XTT + 40.) / 10.
+  WHERE (ZWQ_NI(:) /= 0. .AND. ZZT(:) < (CST%XTT-30.) .AND. ZZT(:) >= (CST%XTT-40.))
+    ZWQ_NI(:) = ZWQ_NI(:) * (ZZT(:) - CST%XTT + 40.) / 10.
   ENDWHERE
 !
 END IF
@@ -3574,3 +3459,4 @@ END FUNCTION BI_LIN_INTP_V
 !------------------------------------------------------------------
 !
 END SUBROUTINE ELEC_TENDENCIES
+END MODULE MODE_ELEC_TENDENCIES
diff --git a/src/PHYEX/micro/mode_ice4_compute_pdf.f90 b/src/PHYEX/micro/mode_ice4_compute_pdf.f90
index 771d42c94ca8e72087891d2fcaf21ad5b222bfab..fce6431f53c8a1dee858c82c32f32b2713f7ba78 100644
--- a/src/PHYEX/micro/mode_ice4_compute_pdf.f90
+++ b/src/PHYEX/micro/mode_ice4_compute_pdf.f90
@@ -7,7 +7,7 @@ MODULE MODE_ICE4_COMPUTE_PDF
 IMPLICIT NONE
 CONTAINS
 SUBROUTINE ICE4_COMPUTE_PDF(CST, ICEP, ICED, KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, &
-                            PRHODREF, PRCT, PRIT, PCF, PT, PSIGMA_RC,&
+                            LDMICRO, PRHODREF, PRCT, PRIT, PCF, PT, PSIGMA_RC,&
                             PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, &
                             PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRF)
 !!
@@ -21,7 +21,7 @@ SUBROUTINE ICE4_COMPUTE_PDF(CST, ICEP, ICED, KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI
 !!
 !!    MODIFICATIONS
 !!    -------------
-!!
+!!      S. Riette Sept 23: LDMICRO mask
 !
 !
 !*      0. DECLARATIONS
@@ -46,6 +46,7 @@ INTEGER,                INTENT(IN)  :: KSIZE
 CHARACTER(LEN=4),       INTENT(IN)  :: HSUBG_AUCV_RC     ! Kind of Subgrid autoconversion method for cloud water
 CHARACTER(LEN=80),      INTENT(IN)  :: HSUBG_AUCV_RI     ! Kind of Subgrid autoconversion method for cloud ice
 CHARACTER(LEN=80),      INTENT(IN)  :: HSUBG_PR_PDF   ! pdf for subgrid precipitation
+LOGICAL, DIMENSION(KSIZE), INTENT(IN)  :: LDMICRO    ! Computation mask
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PRHODREF   ! Reference density
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PRCT       ! Cloud water m.r. at t
 REAL, DIMENSION(KSIZE), INTENT(IN)  :: PRIT       ! Ice Crystal m.r. at t
@@ -77,22 +78,28 @@ REAL, DIMENSION(KSIZE) :: ZRCRAUTC,      & !RC value to begin rain formation =XC
                           ZSUMRC, ZSUMRI
 REAL :: ZCOEFFRCM
 REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
-INTEGER :: JI
+INTEGER :: JL
 !-------------------------------------------------------------------------------
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_COMPUTE_PDF', 0, ZHOOK_HANDLE)!
 
 !Cloud water split between high and low content part is done according to autoconversion option
-ZRCRAUTC(:)=ICEP%XCRIAUTC/PRHODREF(:) ! Autoconversion rc threshold
+!$mnh_expand_where(JL=1:KSIZE)
+WHERE (LDMICRO(:))
+  ZRCRAUTC(:)=ICEP%XCRIAUTC/PRHODREF(:) ! Autoconversion rc threshold
+ELSEWHERE
+  ZRCRAUTC(:)=0.
+END WHERE
+!$mnh_end_expand_where(JL=1:KSIZE)
 IF(HSUBG_AUCV_RC=='NONE') THEN
   !Cloud water is entirely in low or high part
- !$mnh_expand_where(JI=1:KSIZE)
-  WHERE(PRCT(:)>ZRCRAUTC(:))
+  !$mnh_expand_where(JL=1:KSIZE)
+  WHERE(PRCT(:)>ZRCRAUTC(:) .AND. LDMICRO(:))
     PHLC_HCF(:)=1.
     PHLC_LCF(:)=0.
     PHLC_HRC(:)=PRCT(:)
     PHLC_LRC(:)=0.
-  ELSEWHERE(PRCT(:)>ICED%XRTMIN(2))
+  ELSEWHERE(PRCT(:)>ICED%XRTMIN(2) .AND. LDMICRO(:))
     PHLC_HCF(:)=0.
     PHLC_LCF(:)=1.
     PHLC_HRC(:)=0.
@@ -103,17 +110,17 @@ IF(HSUBG_AUCV_RC=='NONE') THEN
     PHLC_HRC(:)=0.
     PHLC_LRC(:)=0.
   END WHERE
- !$mnh_end_expand_where(JI=1:KSIZE)
+  !$mnh_end_expand_where(JL=1:KSIZE)
 
 ELSEIF(HSUBG_AUCV_RC=='CLFR') THEN
   !Cloud water is only in the cloudy part and entirely in low or high part
- !$mnh_expand_where(JI=1:KSIZE)
-  WHERE(PCF(:)>0. .AND. PRCT(:)>ZRCRAUTC(:)*PCF(:))
+  !$mnh_expand_where(JL=1:KSIZE)
+  WHERE(PCF(:)>0. .AND. PRCT(:)>ZRCRAUTC(:)*PCF(:) .AND. LDMICRO(:))
     PHLC_HCF(:)=PCF(:)
     PHLC_LCF(:)=0.
     PHLC_HRC(:)=PRCT(:)
     PHLC_LRC(:)=0.
-  ELSEWHERE(PCF(:)>0. .AND. PRCT(:)>ICED%XRTMIN(2))
+  ELSEWHERE(PCF(:)>0. .AND. PRCT(:)>ICED%XRTMIN(2) .AND. LDMICRO(:))
     PHLC_HCF(:)=0.
     PHLC_LCF(:)=PCF(:)
     PHLC_HRC(:)=0.0
@@ -124,18 +131,24 @@ ELSEIF(HSUBG_AUCV_RC=='CLFR') THEN
     PHLC_HRC(:)=0.
     PHLC_LRC(:)=0.
   END WHERE
- !$mnh_end_expand_where(JI=1:KSIZE)
+  !$mnh_end_expand_where(JL=1:KSIZE)
 ELSEIF(HSUBG_AUCV_RC=='ADJU') THEN
- !$mnh_expand_where(JI=1:KSIZE)
-  ZSUMRC(:)=PHLC_LRC(:)+PHLC_HRC(:)
-  WHERE(ZSUMRC(:) .GT. 0.)
+  !$mnh_expand_where(JL=1:KSIZE)
+  WHERE(LDMICRO(:))
+    ZSUMRC(:)=PHLC_LRC(:)+PHLC_HRC(:)
+  ELSEWHERE
+    ZSUMRC(:)=0.
+  ENDWHERE
+  !$mnh_end_expand_where(JL=1:KSIZE)
+  !$mnh_expand_where(JL=1:KSIZE)
+  WHERE(ZSUMRC(:) .GT. 0. .AND. LDMICRO(:))
     PHLC_LRC(:)=PHLC_LRC(:)*PRCT(:)/ZSUMRC(:)
     PHLC_HRC(:)=PHLC_HRC(:)*PRCT(:)/ZSUMRC(:)
   ELSEWHERE
     PHLC_LRC(:)=0.
     PHLC_HRC(:)=0.
   ENDWHERE
- !$mnh_end_expand_where(JI=1:KSIZE)
+  !$mnh_end_expand_where(JL=1:KSIZE)
 ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN
   !Cloud water is split between high and low part according to a PDF
   !    'HLCRECTPDF'    : rectangular PDF form
@@ -145,13 +158,13 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN
   !    'SIGM'          : Redelsperger and Sommeria (1986)
   IF(HSUBG_PR_PDF=='SIGM') THEN
     ! Redelsperger and Sommeria (1986) but organised according to Turner (2011, 2012)
-   !$mnh_expand_where(JI=1:KSIZE)
-    WHERE (PRCT(:)>ZRCRAUTC(:)+PSIGMA_RC(:))
+    !$mnh_expand_where(JL=1:KSIZE)
+    WHERE (PRCT(:)>ZRCRAUTC(:)+PSIGMA_RC(:) .AND. LDMICRO(:))
       PHLC_HCF(:)=1.
       PHLC_LCF(:)=0.
       PHLC_HRC(:)=PRCT(:)
       PHLC_LRC(:)=0.
-    ELSEWHERE(PRCT(:)> (ZRCRAUTC(:)-PSIGMA_RC(:)) .AND. PRCT(:)<=(ZRCRAUTC(:)+PSIGMA_RC(:))       )
+    ELSEWHERE(PRCT(:)> (ZRCRAUTC(:)-PSIGMA_RC(:)) .AND. PRCT(:)<=(ZRCRAUTC(:)+PSIGMA_RC(:)) .AND. LDMICRO(:))
       PHLC_HCF(:)=(PRCT(:)+PSIGMA_RC(:)-ZRCRAUTC(:))/ &
                   &(2.*PSIGMA_RC(:))
       PHLC_LCF(:)=MAX(0., PCF(:)-PHLC_HCF(:))
@@ -159,7 +172,7 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN
                   &(PRCT(:)+PSIGMA_RC(:)+ZRCRAUTC(:))/ &
                   &(4.*PSIGMA_RC(:))
       PHLC_LRC(:)=MAX(0., PRCT(:)-PHLC_HRC(:))
-    ELSEWHERE(PRCT(:)>ICED%XRTMIN(2) .AND. PCF(:)>0.)
+    ELSEWHERE(PRCT(:)>ICED%XRTMIN(2) .AND. PCF(:)>0. .AND. LDMICRO(:))
       PHLC_HCF(:)=0.
       PHLC_LCF(:)=PCF(:)
       PHLC_HRC(:)=0.
@@ -170,7 +183,7 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN
       PHLC_HRC(:)=0.
       PHLC_LRC(:)=0.
     END WHERE
-   !$mnh_end_expand_where(JI=1:KSIZE)
+    !$mnh_end_expand_where(JL=1:KSIZE)
   ELSEIF(HSUBG_PR_PDF=='HLCRECTPDF' .OR. HSUBG_PR_PDF=='HLCISOTRIPDF' .OR. &
          &HSUBG_PR_PDF=='HLCTRIANGPDF' .OR. HSUBG_PR_PDF=='HLCQUADRAPDF') THEN
     ! Turner (2011, 2012)
@@ -182,51 +195,76 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN
     ELSE IF(HSUBG_PR_PDF=='HLCQUADRAPDF') THEN
       ZCOEFFRCM=4.
     END IF
-   !$mnh_expand_where(JI=1:KSIZE)
-    WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0.)
+    !$mnh_expand_where(JL=1:KSIZE)
+    WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. LDMICRO(:))
       ZHLC_RCMAX(:)=ZCOEFFRCM*PRCT(:)/PCF(:)
+    ELSEWHERE
+      ZHLC_RCMAX(:)=0.
     END WHERE
+    !$mnh_end_expand_where(JL=1:KSIZE)
+
     ! Split available water and cloud fraction in two parts
     ! Calculate local mean values int he low and high parts for the 3 PDF forms:
     IF(HSUBG_PR_PDF=='HLCRECTPDF') THEN
-      WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
+      !$mnh_expand_where(JL=1:KSIZE)
+      WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:) .AND. LDMICRO(:))
         ZHLC_LRCLOCAL(:)=0.5*ZRCRAUTC(:)
         ZHLC_HRCLOCAL(:)=( ZHLC_RCMAX(:) + ZRCRAUTC(:))/2.0
+      ELSEWHERE
+        ZHLC_LRCLOCAL(:)=0.
+        ZHLC_HRCLOCAL(:)=0.
       END WHERE
+      !$mnh_end_expand_where(JL=1:KSIZE)
     ELSE IF(HSUBG_PR_PDF=='HLCTRIANGPDF') THEN
-      WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
+      !$mnh_expand_where(JL=1:KSIZE)
+      WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:) .AND. LDMICRO(:))
         ZHLC_LRCLOCAL(:)=( ZRCRAUTC(:) *(3.0 * ZHLC_RCMAX(:) - 2.0 * ZRCRAUTC(:) ) ) &
                         / (3.0 * (2.0 * ZHLC_RCMAX(:) - ZRCRAUTC(:)  ) )
         ZHLC_HRCLOCAL(:)=(ZHLC_RCMAX(:) + 2.0*ZRCRAUTC(:)) / 3.0
+      ELSEWHERE
+        ZHLC_LRCLOCAL(:)=0.
+        ZHLC_HRCLOCAL(:)=0.
       END WHERE
+      !$mnh_end_expand_where(JL=1:KSIZE)
     ELSE IF(HSUBG_PR_PDF=='HLCQUADRAPDF') THEN
-      WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
+      !$mnh_expand_where(JL=1:KSIZE)
+      WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:) .AND. LDMICRO(:))
         ZHLC_LRCLOCAL(:)=(3.0 *ZRCRAUTC(:)**3 - 8.0 *ZRCRAUTC(:)**2 * ZHLC_RCMAX(:) &
                         + 6.0*ZRCRAUTC(:) *ZHLC_RCMAX(:)**2 ) &
                         / &
                         (4.0* ZRCRAUTC(:)**2 -12.0*ZRCRAUTC(:) *ZHLC_RCMAX(:) &
                         + 12.0 * ZHLC_RCMAX(:)**2 )
         ZHLC_HRCLOCAL(:)=(ZHLC_RCMAX(:) + 3.0*ZRCRAUTC(:))/4.0
+      ELSEWHERE
+        ZHLC_LRCLOCAL(:)=0.
+        ZHLC_HRCLOCAL(:)=0.
       END WHERE
+      !$mnh_end_expand_where(JL=1:KSIZE)
     ELSE IF(HSUBG_PR_PDF=='HLCISOTRIPDF') THEN
-      WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
-        WHERE((PRCT(:) / PCF(:)).LE.ZRCRAUTC(:))
-          ZHLC_LRCLOCAL(:)=( (ZHLC_RCMAX(:))**3 &
-                          -(12.0 * (ZHLC_RCMAX(:))*(ZRCRAUTC(:))**2) &
-                          +(8.0 * ZRCRAUTC(:)**3) ) &
-                          /( (6.0 * (ZHLC_RCMAX(:))**2) &
-                          -(24.0 * (ZHLC_RCMAX(:)) * ZRCRAUTC(:)) &
-                          +(12.0 * ZRCRAUTC(:)**2) )
-          ZHLC_HRCLOCAL(:)=( ZHLC_RCMAX(:) + 2.0 * ZRCRAUTC(:) )/3.0
-        ELSEWHERE
-          ZHLC_LRCLOCAL(:)=(2.0/3.0) * ZRCRAUTC(:)
-          ZHLC_HRCLOCAL(:)=(3.0*ZHLC_RCMAX(:)**3 - 8.0*ZRCRAUTC(:)**3) &
-                          / (6.0 * ZHLC_RCMAX(:)**2 - 12.0*ZRCRAUTC(:)**2)
-        END WHERE
+      !$mnh_expand_where(JL=1:KSIZE)
+      WHERE (PRCT(:).LE.ZRCRAUTC(:)*PCF(:) .AND. &
+            &PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. &
+            &ZHLC_RCMAX(:).GT.ZRCRAUTC(:) .AND. LDMICRO(:))
+        ZHLC_LRCLOCAL(:)=( (ZHLC_RCMAX(:))**3 &
+                        -(12.0 * (ZHLC_RCMAX(:))*(ZRCRAUTC(:))**2) &
+                        +(8.0 * ZRCRAUTC(:)**3) ) &
+                        /( (6.0 * (ZHLC_RCMAX(:))**2) &
+                        -(24.0 * (ZHLC_RCMAX(:)) * ZRCRAUTC(:)) &
+                        +(12.0 * ZRCRAUTC(:)**2) )
+        ZHLC_HRCLOCAL(:)=( ZHLC_RCMAX(:) + 2.0 * ZRCRAUTC(:) )/3.0
+      ELSEWHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:) .AND. LDMICRO(:))
+        ZHLC_LRCLOCAL(:)=(2.0/3.0) * ZRCRAUTC(:)
+        ZHLC_HRCLOCAL(:)=(3.0*ZHLC_RCMAX(:)**3 - 8.0*ZRCRAUTC(:)**3) &
+                        / (6.0 * ZHLC_RCMAX(:)**2 - 12.0*ZRCRAUTC(:)**2)
+      ELSEWHERE
+        ZHLC_LRCLOCAL(:)=0.
+        ZHLC_HRCLOCAL(:)=0.
       END WHERE
+      !$mnh_end_expand_where(JL=1:KSIZE)
     END IF
     ! Compare r_cM  to r_cR to know if cloud water content is high enough to split in two parts or not
-    WHERE (PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:))
+    !$mnh_expand_where(JL=1:KSIZE)
+    WHERE (PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:) .AND. LDMICRO(:))
       ! Calculate final values for LCF and HCF:
       PHLC_LCF(:)=PCF(:) &
                     *(ZHLC_HRCLOCAL(:)- &
@@ -237,7 +275,7 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN
       ! Calculate final values for LRC and HRC:
       PHLC_LRC(:)=ZHLC_LRCLOCAL(:)*PHLC_LCF(:)
       PHLC_HRC(:)=MAX(0., PRCT(:)-PHLC_LRC(:))
-    ELSEWHERE (PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).LE.ZRCRAUTC(:))
+    ELSEWHERE (PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).LE.ZRCRAUTC(:) .AND. LDMICRO(:))
       ! Put all available cloud water and his fraction in the low part
       PHLC_LCF(:)=PCF(:)
       PHLC_HCF(:)=0.
@@ -249,7 +287,7 @@ ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN
       PHLC_LRC(:)=0.
       PHLC_HRC(:)=0.
     END WHERE
-   !$mnh_end_expand_where(JI=1:KSIZE)
+    !$mnh_end_expand_where(JL=1:KSIZE)
   ELSE
     CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_COMPUTE_PDF','wrong HSUBG_PR_PDF case')
   ENDIF
@@ -258,18 +296,22 @@ ELSE
 ENDIF
 !
 !Ice water split between high and low content part is done according to autoconversion option
-!$mnh_expand_where(JI=1:KSIZE)
+!$mnh_expand_where(JL=1:KSIZE)
+WHERE(LDMICRO(:))
   ZCRIAUTI(:)=MIN(ICEP%XCRIAUTI,10**(ICEP%XACRIAUTI*(PT(:)-CST%XTT)+ICEP%XBCRIAUTI)) ! Autoconversion ri threshold
-!$mnh_end_expand_where(JI=1:KSIZE)
+ELSEWHERE
+  ZCRIAUTI(:)=0.
+ENDWHERE
+!$mnh_end_expand_where(JL=1:KSIZE)
 IF(HSUBG_AUCV_RI=='NONE') THEN
- !$mnh_expand_where(JI=1:KSIZE)
   !Cloud water is entirely in low or high part
-  WHERE(PRIT(:)>ZCRIAUTI(:))
+  !$mnh_expand_where(JL=1:KSIZE)
+  WHERE(PRIT(:)>ZCRIAUTI(:) .AND. LDMICRO(:))
     PHLI_HCF(:)=1.
     PHLI_LCF(:)=0.
     PHLI_HRI(:)=PRIT(:)
     PHLI_LRI(:)=0.
-  ELSEWHERE(PRIT(:)>ICED%XRTMIN(4))
+  ELSEWHERE(PRIT(:)>ICED%XRTMIN(4) .AND. LDMICRO(:))
     PHLI_HCF(:)=0.
     PHLI_LCF(:)=1.
     PHLI_HRI(:)=0.
@@ -280,16 +322,16 @@ IF(HSUBG_AUCV_RI=='NONE') THEN
     PHLI_HRI(:)=0.
     PHLI_LRI(:)=0.
   END WHERE
- !$mnh_end_expand_where(JI=1:KSIZE)
+  !$mnh_end_expand_where(JL=1:KSIZE)
 ELSEIF(HSUBG_AUCV_RI=='CLFR') THEN
   !Cloud water is only in the cloudy part and entirely in low or high part
- !$mnh_expand_where(JI=1:KSIZE)
-  WHERE(PCF(:)>0. .AND. PRIT(:)>ZCRIAUTI(:)*PCF(:))
+  !$mnh_expand_where(JL=1:KSIZE)
+  WHERE(PCF(:)>0. .AND. PRIT(:)>ZCRIAUTI(:)*PCF(:) .AND. LDMICRO(:))
     PHLI_HCF(:)=PCF(:)
     PHLI_LCF(:)=0.
     PHLI_HRI(:)=PRIT(:)
     PHLI_LRI(:)=0.
-  ELSEWHERE(PCF(:)>0. .AND. PRIT(:)>ICED%XRTMIN(4))
+  ELSEWHERE(PCF(:)>0. .AND. PRIT(:)>ICED%XRTMIN(4) .AND. LDMICRO(:))
     PHLI_HCF(:)=0.
     PHLI_LCF(:)=PCF(:)
     PHLI_HRI(:)=0.0
@@ -300,27 +342,36 @@ ELSEIF(HSUBG_AUCV_RI=='CLFR') THEN
     PHLI_HRI(:)=0.
     PHLI_LRI(:)=0.
   END WHERE
- !$mnh_end_expand_where(JI=1:KSIZE)
+  !$mnh_end_expand_where(JL=1:KSIZE)
 ELSEIF(HSUBG_AUCV_RI=='ADJU') THEN
- !$mnh_expand_where(JI=1:KSIZE)
-  ZSUMRI(:)=PHLI_LRI(:)+PHLI_HRI(:)
-  WHERE(ZSUMRI(:) .GT. 0.)
+  !$mnh_expand_where(JL=1:KSIZE)
+  WHERE(LDMICRO(:))
+    ZSUMRI(:)=PHLI_LRI(:)+PHLI_HRI(:)
+  ELSEWHERE
+    ZSUMRI(:)=0.
+  ENDWHERE
+  WHERE(ZSUMRI(:) .GT. 0. .AND. LDMICRO(:))
     PHLI_LRI(:)=PHLI_LRI(:)*PRIT(:)/ZSUMRI(:)
     PHLI_HRI(:)=PHLI_HRI(:)*PRIT(:)/ZSUMRI(:)
   ELSEWHERE
     PHLI_LRI(:)=0.
     PHLI_HRI(:)=0.
   ENDWHERE
- !$mnh_end_expand_where(JI=1:KSIZE)
+  !$mnh_end_expand_where(JL=1:KSIZE)
 ELSE
   !wrong HSUBG_AUCV_RI case
   CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'ICE4_COMPUTE_PDF', 'wrong HSUBG_AUCV_RI case' )
 ENDIF
 !
-!$mnh_expand_where(JI=1:KSIZE)
+!$mnh_expand_where(JL=1:KSIZE)
+WHERE(LDMICRO(:))
   PRF(:)=MAX(PHLC_HCF(:),PHLI_HCF(:))
-!$mnh_end_expand_where(JI=1:KSIZE)
+ELSEWHERE
+  PRF(:)=0.
+ENDWHERE
+!$mnh_end_expand_where(JL=1:KSIZE)
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_COMPUTE_PDF', 1, ZHOOK_HANDLE)
 END SUBROUTINE ICE4_COMPUTE_PDF
+
 END MODULE MODE_ICE4_COMPUTE_PDF
diff --git a/src/PHYEX/micro/mode_ice4_nucleation.f90 b/src/PHYEX/micro/mode_ice4_nucleation.f90
deleted file mode 100644
index 90a3fbba33b64d05decc1d75b8593f759ed98b83..0000000000000000000000000000000000000000
--- a/src/PHYEX/micro/mode_ice4_nucleation.f90
+++ /dev/null
@@ -1,155 +0,0 @@
-!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
-!MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-MODULE MODE_ICE4_NUCLEATION
-IMPLICIT NONE
-CONTAINS
-SUBROUTINE ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, KSIZE, ODCOMPUTE, &
-                           PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, &
-                           PRVT, &
-                           PCIT, PRVHENI_MR)
-!!
-!!**  PURPOSE
-!!    -------
-!!      Computes the nucleation
-!!
-!!    AUTHOR
-!!    ------
-!!      S. Riette from the splitting of rain_ice source code (nov. 2014)
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!
-!!     R. El Khatib 24-Aug-2021 Optimizations
-!
-!
-!*      0. DECLARATIONS
-!          ------------
-!
-USE MODD_CST,            ONLY: CST_t
-USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
-USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
-USE MODD_RAIN_ICE_PARAM_n, ONLY: RAIN_ICE_PARAM_t
-USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
-!
-IMPLICIT NONE
-!
-!*       0.1   Declarations of dummy arguments :
-!
-TYPE(CST_t),              INTENT(IN)    :: CST
-TYPE(PARAM_ICE_t),        INTENT(IN)    :: PARAMI
-TYPE(RAIN_ICE_PARAM_t),   INTENT(IN)    :: ICEP
-TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
-INTEGER,                  INTENT(IN)    :: KSIZE
-LOGICAL, DIMENSION(KSIZE),INTENT(IN)    :: ODCOMPUTE
-REAL, DIMENSION(KSIZE),   INTENT(IN)    :: PTHT    ! Theta at t
-REAL, DIMENSION(KSIZE),   INTENT(IN)    :: PPABST  ! absolute pressure at t
-REAL, DIMENSION(KSIZE),   INTENT(IN)    :: PRHODREF! Reference density
-REAL, DIMENSION(KSIZE),   INTENT(IN)    :: PEXN    ! Exner function
-REAL, DIMENSION(KSIZE),   INTENT(IN)    :: PLSFACT
-REAL, DIMENSION(KSIZE),   INTENT(IN)    :: PT      ! Temperature at time t
-REAL, DIMENSION(KSIZE),   INTENT(IN)    :: PRVT    ! Water vapor m.r. at t
-REAL, DIMENSION(KSIZE),   INTENT(INOUT) :: PCIT    ! Pristine ice n.c. at t
-REAL, DIMENSION(KSIZE),   INTENT(OUT)   :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation
-!
-!*       0.2  declaration of local variables
-!
-REAL, DIMENSION(KSIZE) :: ZW ! work array
-REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
-LOGICAL, DIMENSION(KSIZE) :: GNEGT  ! Test where to compute the HEN process
-REAL, DIMENSION(KSIZE)  :: ZZW,      & ! Work array
-                           ZUSW,     & ! Undersaturation over water
-                           ZSSI        ! Supersaturation over ice
-INTEGER :: JI
-!-------------------------------------------------------------------------------
-!
-IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 0, ZHOOK_HANDLE)!
-!
-!$mnh_expand_where(JI=1:KSIZE)
-WHERE(ODCOMPUTE(:))
-  GNEGT(:)=PT(:)<CST%XTT .AND. PRVT(:)>ICED%XRTMIN(1)
-ELSEWHERE
-  GNEGT(:)=.FALSE.
-ENDWHERE
-!$mnh_end_expand_where(JI=1:KSIZE)
-
-ZUSW(:)=0.
-ZZW(:)=0.
-!$mnh_expand_where(JI=1:KSIZE)
-WHERE(GNEGT(:))
-  ZZW(:)=ALOG(PT(:))
-  ZUSW(:)=EXP(CST%XALPW - CST%XBETAW/PT(:) - CST%XGAMW*ZZW(:))          ! es_w
-  ZZW(:)=EXP(CST%XALPI - CST%XBETAI/PT(:) - CST%XGAMI*ZZW(:))           ! es_i
-END WHERE
-!$mnh_end_expand_where(JI=1:KSIZE)
-
-ZSSI(:)=0.
-!$mnh_expand_where(JI=1:KSIZE)
-WHERE(GNEGT(:))
-  ZZW(:)=MIN(PPABST(:)/2., ZZW(:))             ! safety limitation
-  ZSSI(:)=PRVT(:)*(PPABST(:)-ZZW(:)) / (CST%XEPSILO*ZZW(:)) - 1.0
-                                               ! Supersaturation over ice
-  ZUSW(:)=MIN(PPABST(:)/2., ZUSW(:))            ! safety limitation
-  ZUSW(:)=(ZUSW(:)/ZZW(:))*((PPABST(:)-ZZW(:))/(PPABST(:)-ZUSW(:))) - 1.0
-                             ! Supersaturation of saturated water vapor over ice
-  !
-  !*       3.1     compute the heterogeneous nucleation source RVHENI
-  !
-  !*       3.1.1   compute the cloud ice concentration
-  !
-  ZSSI(:)=MIN(ZSSI(:), ZUSW(:)) ! limitation of SSi according to SSw=0
-END WHERE
-!$mnh_end_expand_where(JI=1:KSIZE)
-
-ZZW(:)=0.
-DO JI=1,KSIZE
-  IF(GNEGT(JI)) THEN
-    IF(PT(JI)<CST%XTT-5.0 .AND. ZSSI(JI)>0.0) THEN
-      ZZW(JI)=ICEP%XNU20*EXP(ICEP%XALPHA2*ZSSI(JI)-ICEP%XBETA2)
-    ELSEIF(PT(JI)<=CST%XTT-2.0 .AND. PT(JI)>=CST%XTT-5.0 .AND. ZSSI(JI)>0.0) THEN
-      ZZW(JI)=MAX(ICEP%XNU20*EXP(-ICEP%XBETA2 ), &                                                                                       
-                  ICEP%XNU10*EXP(-ICEP%XBETA1*(PT(JI)-CST%XTT))*(ZSSI(JI)/ZUSW(JI))**ICEP%XALPHA1)
-    ENDIF
-  ENDIF
-ENDDO
-!$mnh_expand_where(JI=1:KSIZE)
-WHERE(GNEGT(:))
-  ZZW(:)=ZZW(:)-PCIT(:)
-  ZZW(:)=MIN(ZZW(:), 50.E3) ! limitation provisoire a 50 l^-1
-END WHERE
-!$mnh_end_expand_where(JI=1:KSIZE)
-
-PRVHENI_MR(:)=0.
-!$mnh_expand_where(JI=1:KSIZE)
-WHERE(GNEGT(:))
-  !
-  !*       3.1.2   update the r_i and r_v mixing ratios
-  !
-  PRVHENI_MR(:)=MAX(ZZW(:), 0.0)*ICEP%XMNU0/PRHODREF(:)
-  PRVHENI_MR(:)=MIN(PRVT(:), PRVHENI_MR(:))
-END WHERE
-!$mnh_end_expand_where(JI=1:KSIZE)
-!Limitation due to 0 crossing of temperature
-IF(PARAMI%LFEEDBACKT) THEN
-  ZW(:)=0.
-  !$mnh_expand_where(JI=1:KSIZE)
-  WHERE(GNEGT(:))
-    ZW(:)=MIN(PRVHENI_MR(:), &
-              MAX(0., (CST%XTT/PEXN(:)-PTHT(:))/PLSFACT(:))) / &
-              MAX(PRVHENI_MR(:), 1.E-20)
-  END WHERE
-  PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:)
-  ZZW(:)=ZZW(:)*ZW(:)
-  !$mnh_end_expand_where(JI=1:KSIZE)
-ENDIF
-!$mnh_expand_where(JI=1:KSIZE)
-WHERE(GNEGT(:))
-  PCIT(:)=MAX(ZZW(:)+PCIT(:), PCIT(:))
-END WHERE
-!$mnh_end_expand_where(JI=1:KSIZE)
-!
-IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 1, ZHOOK_HANDLE)
-END SUBROUTINE ICE4_NUCLEATION
-END MODULE MODE_ICE4_NUCLEATION
diff --git a/src/PHYEX/micro/mode_ice4_pack.f90 b/src/PHYEX/micro/mode_ice4_pack.f90
index 75e770993ad5fc77efcde4265e1a84413f31e580..e4db9d953c4720ca095270234dcf2cc57a8ec775 100644
--- a/src/PHYEX/micro/mode_ice4_pack.f90
+++ b/src/PHYEX/micro/mode_ice4_pack.f90
@@ -36,6 +36,7 @@ SUBROUTINE ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF,                   &
 !!    MODIFICATIONS
 !!    -------------
 !!     R. El Khatib 28-Apr-2023 Fix (and re-enable) the cache-blocking mechanism on top of phyex
+!!     S. Riette Sept 23: all 3D arrays are suppressed from ice4_stepping
 !  -----------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -168,6 +169,7 @@ REAL, DIMENSION(KPROMA) :: &
                         & ZHLC_HRC, & ! HLCLOUDS : LWC that is High LWC in grid
                         & ZHLI_HCF, &
                         & ZHLI_HRI, &
+                        & ZRAINFR,  &
                         & ZRREVAV
 REAL, DIMENSION(KSIZE2) :: ZSIGMA_RC ! Standard deviation of rc at time t
 LOGICAL, DIMENSION(KPROMA) :: LLMICRO
@@ -205,16 +207,6 @@ LLSIGMA_RC=(PARAMI%CSUBG_AUCV_RC=='PDF ' .AND. PARAMI%CSUBG_PR_PDF=='SIGM')
 LL_AUCV_ADJU=(PARAMI%CSUBG_AUCV_RC=='ADJU' .OR. PARAMI%CSUBG_AUCV_RI=='ADJU')
 !
 IF(PARAMI%LPACK_MICRO) THEN
-  IF(KPROMA /= KSIZE .AND. (PARAMI%CSUBG_RR_EVAP=='PRFR' .OR. PARAMI%CSUBG_RC_RR_ACCR=='PRFR')) THEN
-    CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see comments in code for explanation')
-    ! Microphyscs was optimized by introducing chunks of KPROMA size
-    ! Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphysical species are present
-    ! We cannot rebuild the entire 3D arrays in the subroutine, so we cannot call ice4_rainfr_vert in it
-    ! A solution would be to suppress optimisation in this case by setting KPROMA=KSIZE in rain_ice
-    ! Another solution would be to compute column by column?
-    ! Another one would be to cut tendencies in 3 parts: before rainfr_vert, rainfr_vert, after rainfr_vert
-  ENDIF
-  !
   IF(BUCONF%LBU_ENABLE .OR. OSAVE_MICRO) THEN
     DO JV=1, IBUNUM-IBUNUM_EXTRA
       ZBU_PACK(:, JV)=0.
@@ -295,6 +287,7 @@ IF(PARAMI%LPACK_MICRO) THEN
                 ZHLI_HCF(IC) = PHLI_HCF(JIJ, JK)
                 ZHLI_HRI(IC) = PHLI_HRI(JIJ, JK)
               ENDIF
+              ZRAINFR(IC)=PRAINFR(JIJ, JK)
               IF (OELEC) ZLATHAM_IAGGS(IC) = PLATHAM_IAGGS(JIJ, JK)
               ! Save indices for later usages:
               I1(IC) = JIJ
@@ -340,7 +333,7 @@ IF(PARAMI%LPACK_MICRO) THEN
                         &ZCIT, &
                         &ZVART, &
                         &ZHLC_HCF, ZHLC_HRC, &
-                        &ZHLI_HCF, ZHLI_HRI, PRAINFR, &
+                        &ZHLI_HCF, ZHLI_HRI, ZRAINFR, &
                         &ZEXTPK, ZBU_SUM, ZRREVAV, &
                         &ZLATHAM_IAGGS)
       !
@@ -361,6 +354,7 @@ IF(PARAMI%LPACK_MICRO) THEN
         IF (KRR==7) THEN
           PWR(I1(JL),I2(JL),IRH)=ZVART(JL, IRH)
         ENDIF
+        PRAINFR(I1(JL),I2(JL))=ZRAINFR(JL)
       ENDDO
       IF(BUCONF%LBU_ENABLE .OR. OSAVE_MICRO) THEN
         DO JV=1, IBUNUM-IBUNUM_EXTRA
diff --git a/src/PHYEX/micro/mode_ice4_rainfr_vert.f90 b/src/PHYEX/micro/mode_ice4_rainfr_vert.f90
index 43d8410c8399c909602dc320f6479bf76ef6584a..ec35f0da57fb15ee58f57dc1322c43810e4665bb 100644
--- a/src/PHYEX/micro/mode_ice4_rainfr_vert.f90
+++ b/src/PHYEX/micro/mode_ice4_rainfr_vert.f90
@@ -20,6 +20,7 @@ SUBROUTINE ICE4_RAINFR_VERT(D, ICED, PPRFR, PRR, PRS, PRG, PRH)
 !!    -------------
 !!
 !  P. Wautelet 13/02/2019: bugfix: intent of PPRFR OUT->INOUT
+!  S. Riette 21/9/23: collapse JI/JJ
 !
 !
 !*      0. DECLARATIONS
@@ -33,19 +34,19 @@ IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments :
 !
-TYPE(DIMPHYEX_t),             INTENT(IN)    :: D
-TYPE(RAIN_ICE_DESCR_t),       INTENT(IN)    :: ICED
-REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PPRFR !Precipitation fraction
-REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)    :: PRR !Rain field
-REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)    :: PRS !Snow field
-REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN)    :: PRG !Graupel field
-REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRH !Hail field
+TYPE(DIMPHYEX_t),              INTENT(IN)    :: D
+TYPE(RAIN_ICE_DESCR_t),        INTENT(IN)    :: ICED
+REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PPRFR !Precipitation fraction
+REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PRR !Rain field
+REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PRS !Snow field
+REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)    :: PRG !Graupel field
+REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN)    :: PRH !Hail field
 !
-INTEGER :: IKB, IKE, IKL, IIE, IIB, IJB, IJE
+INTEGER :: IKB, IKE, IKL, IIJB, IIJE
 !*       0.2  declaration of local variables
 !
 REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
-INTEGER :: JI, JJ, JK
+INTEGER :: JIJ, JK
 LOGICAL :: MASK
 !
 !-------------------------------------------------------------------------------
@@ -54,32 +55,28 @@ IF (LHOOK) CALL DR_HOOK('ICE4_RAINFR_VERT',0,ZHOOK_HANDLE)
 IKB=D%NKB
 IKE=D%NKE
 IKL=D%NKL
-IIB=D%NIB
-IIE=D%NIE
-IJB=D%NJB
-IJE=D%NJE
+IIJB=D%NIJB
+IIJE=D%NIJE
 !
 !-------------------------------------------------------------------------------
-DO JI = IIB,IIE
-   DO JJ = IJB, IJE
-      PPRFR(JI,JJ,IKE)=0.
-      DO JK=IKE-IKL, IKB, -IKL
-         IF(PRESENT(PRH)) THEN
-            MASK=PRR(JI,JJ,JK) .GT. ICED%XRTMIN(3) .OR. PRS(JI,JJ,JK) .GT. ICED%XRTMIN(5) &
-            .OR. PRG(JI,JJ,JK) .GT. ICED%XRTMIN(6) .OR. PRH(JI,JJ,JK) .GT. ICED%XRTMIN(7)
-         ELSE
-            MASK=PRR(JI,JJ,JK) .GT. ICED%XRTMIN(3) .OR. PRS(JI,JJ,JK) .GT. ICED%XRTMIN(5) &
-            .OR. PRG(JI,JJ,JK) .GT. ICED%XRTMIN(6) 
+DO JIJ = IIJB,IIJE
+   PPRFR(JIJ,IKE)=0.
+   DO JK=IKE-IKL, IKB, -IKL
+      IF(PRESENT(PRH)) THEN
+         MASK=PRR(JIJ,JK) .GT. ICED%XRTMIN(3) .OR. PRS(JIJ,JK) .GT. ICED%XRTMIN(5) &
+         .OR. PRG(JIJ,JK) .GT. ICED%XRTMIN(6) .OR. PRH(JIJ,JK) .GT. ICED%XRTMIN(7)
+      ELSE
+         MASK=PRR(JIJ,JK) .GT. ICED%XRTMIN(3) .OR. PRS(JIJ,JK) .GT. ICED%XRTMIN(5) &
+         .OR. PRG(JIJ,JK) .GT. ICED%XRTMIN(6) 
+      END IF
+      IF (MASK) THEN
+         PPRFR(JIJ,JK)=MAX(PPRFR(JIJ,JK),PPRFR(JIJ,JK+IKL))
+         IF (PPRFR(JIJ,JK)==0.) THEN
+            PPRFR(JIJ,JK)=1.
          END IF
-         IF (MASK) THEN
-            PPRFR(JI,JJ,JK)=MAX(PPRFR(JI,JJ,JK),PPRFR(JI,JJ,JK+IKL))
-            IF (PPRFR(JI,JJ,JK)==0) THEN
-               PPRFR(JI,JJ,JK)=1.
-            END IF
-         ELSE
-            PPRFR(JI,JJ,JK)=0.
-         END IF
-      END DO
+      ELSE
+         PPRFR(JIJ,JK)=0.
+      END IF
    END DO
 END DO
 !
diff --git a/src/PHYEX/micro/mode_ice4_sedimentation.f90 b/src/PHYEX/micro/mode_ice4_sedimentation.f90
index 52d72c4e3e7ac0a51c50faf09f071ff1af79964d..82508848aa3eb880dc9b30c60e8f6bd88eab0364 100644
--- a/src/PHYEX/micro/mode_ice4_sedimentation.f90
+++ b/src/PHYEX/micro/mode_ice4_sedimentation.f90
@@ -7,7 +7,7 @@ MODULE MODE_ICE4_SEDIMENTATION
 IMPLICIT NONE
 CONTAINS
 SUBROUTINE ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, BUCONF, &
-                             &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, &
+                             &OELEC, OSEDIM_BEARD, HCLOUD, PTSTEP, KRR, PDZZ, PTHVREFZIKB, &
                              &PLVFACT, PLSFACT, PRHODREF, PPABST, PTHT, PT, PRHODJ, &
                              &PTHS, PRVS, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                              &PINPRC, PINPRR, PINPRS, PINPRG, &
@@ -67,6 +67,7 @@ TYPE(ELEC_DESCR_t),                          INTENT(IN)    :: ELECD   ! electric
 TYPE(TBUDGETCONF_t),                         INTENT(IN)    :: BUCONF
 LOGICAL,                                     INTENT(IN)    :: OELEC   ! switch to activate cloud electrification
 LOGICAL,                                     INTENT(IN)    :: OSEDIM_BEARD  ! Switch for effect of electrical forces on sedim.
+CHARACTER (LEN=4),                           INTENT(IN)    :: HCLOUD  ! Kind of microphysical scheme
 REAL,                                        INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                                     INTENT(IN)    :: KRR     ! Number of moist variable
 REAL, DIMENSION(D%NIJT,D%NKT),               INTENT(IN)    :: PDZZ    ! Layer thikness (m)
@@ -95,6 +96,7 @@ REAL, DIMENSION(D%NIJT),                     INTENT(OUT)   :: PINPRS  ! Snow ins
 REAL, DIMENSION(D%NIJT),                     INTENT(OUT)   :: PINPRG  ! Graupel instant precip
 TYPE(TBUDGETDATA), DIMENSION(KBUDGETS),      INTENT(INOUT) :: TBUDGETS                                                                   
 INTEGER,                                     INTENT(IN)    :: KBUDGETS
+REAL, INTENT(IN)                :: PTHVREFZIKB ! Reference thv at IKB for electricity
 !
 ! variables for cloud electricity
 !
@@ -184,7 +186,7 @@ IF(PARAMI%CSEDIM=='STAT') THEN
   !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables
 ELSEIF(PARAMI%CSEDIM=='SPLI') THEN
   CALL ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, &
-                               &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, &
+                               &OELEC, OSEDIM_BEARD, PTHVREFZIKB, HCLOUD, PTSTEP, KRR, PDZZ, &
                                &PRHODREF, PPABST, PTHT, PT, PRHODJ, &
                                &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                                &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, &
diff --git a/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 b/src/PHYEX/micro/mode_ice4_sedimentation_split.f90
index 829cb2189c7c2a85a945f7338cec1380437451d2..0e888959a8b20d3fad53d8d6c6e2a588ed1f49ba 100644
--- a/src/PHYEX/micro/mode_ice4_sedimentation_split.f90
+++ b/src/PHYEX/micro/mode_ice4_sedimentation_split.f90
@@ -7,7 +7,8 @@ MODULE MODE_ICE4_SEDIMENTATION_SPLIT
 IMPLICIT NONE
 CONTAINS
 SUBROUTINE ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, &
-                                   &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, &
+                                   &OELEC, OSEDIM_BEARD, PTHVREFZIKB, HCLOUD,  &
+                                   &PTSTEP, KRR, PDZZ, &
                                    &PRHODREF, PPABST, PTHT, PT, PRHODJ, &
                                    &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                                    &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, &
@@ -62,6 +63,7 @@ TYPE(RAIN_ICE_DESCR_t),        INTENT(IN)              :: ICED
 TYPE(PARAM_ICE_t),             INTENT(IN)              :: PARAMI
 TYPE(ELEC_PARAM_t),            INTENT(IN)              :: ELECP   ! electrical parameters
 TYPE(ELEC_DESCR_t),            INTENT(IN)              :: ELECD   ! electrical descriptive csts
+CHARACTER (LEN=4),             INTENT(IN)              :: HCLOUD  ! Kind of microphysical scheme
 LOGICAL,                       INTENT(IN)              :: OELEC   ! if true, cloud electricity is activated
 LOGICAL,                       INTENT(IN)              :: OSEDIM_BEARD ! if true, effect of electrical forces on sedim.
 REAL,                          INTENT(IN)              :: PTSTEP  ! Double Time step (single if cold start)
@@ -107,7 +109,7 @@ REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQ
 REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGS   ! Graupel electric charge source
 REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQHS   ! Hail electric charge source
 REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), INTENT(IN) :: PEFIELDW ! Vertical E field 
-!
+REAL, INTENT(IN)                :: PTHVREFZIKB ! Reference thv at IKB for electricity
 !*       0.2  declaration of local variables
 !
 !
@@ -389,13 +391,14 @@ CHARACTER(LEN=10) :: YSPE ! String for error message
 INTEGER                         :: JIJ, JK
 LOGICAL                         :: GPRESENT_PFPR
 REAL                            :: ZINVTSTEP
-REAL                            :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC
+REAL                            :: ZZWLBDC, ZZRAY, ZZT, ZZWLBDA, ZZCC
 REAL                            :: ZLBDA
 REAL                            :: ZFSED, ZEXSED
 REAL                            :: ZMRCHANGE
 REAL, DIMENSION(D%NIJT)       :: ZMAX_TSTEP ! Maximum CFL in column
 REAL, DIMENSION(SIZE(ICED%XRTMIN))   :: ZRSMIN
 REAL, DIMENSION(D%NIJT)       :: ZREMAINT   ! Remaining time until the timestep end
+LOGICAL :: ZANYREMAINT
 REAL, DIMENSION(D%NIJT, 0:D%NKT+1) :: ZWSED   ! Sedimentation fluxes
 INTEGER :: IKTB, IKTE, IKB, IKL, IIJE, IIJB
 REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
@@ -445,11 +448,12 @@ END IF
 !
 PINPRX(:) = 0.
 ZINVTSTEP=1./PTSTEP
-ZRSMIN(:) = ICED%XRTMIN(:) * ZINVTSTEP
+ZRSMIN = ICED%XRTMIN * ZINVTSTEP
 ZREMAINT(:) = 0.
 ZREMAINT(:) = PTSTEP
 !
-DO WHILE (ANY(ZREMAINT>0.))
+ZANYREMAINT = .TRUE.
+DO WHILE (ZANYREMAINT)
   !
   ! Effect of electrical forces on sedimentation
   IF (OELEC .AND. OSEDIM_BEARD) THEN
@@ -483,10 +487,10 @@ DO WHILE (ANY(ZREMAINT>0.))
           ZZWLBDC = PLBC(JIJ,JK) * PCONC3D(JIJ,JK) / &
                    &(PRHODREF(JIJ,JK) * PRXT(JIJ,JK))
           ZZWLBDC = ZZWLBDC**ICED%XLBEXC
-          ZRAY = PRAY(JIJ,JK) / ZZWLBDC
+          ZZRAY = PRAY(JIJ,JK) / ZZWLBDC
           ZZT = PTHT(JIJ,JK) * (PPABST(JIJ,JK)/CST%XP00)**(CST%XRD/CST%XCPD)
           ZZWLBDA = 6.6E-8*(101325./PPABST(JIJ,JK))*(ZZT/293.15)
-          ZZCC = ICED%XCC*(1.+1.26*ZZWLBDA/ZRAY)
+          ZZCC = ICED%XCC*(1.+1.26*ZZWLBDA/ZZRAY)
           ZWSED(JIJ, JK) = PRHODREF(JIJ,JK)**(-ICED%XCEXVT +1 ) *   &
                              &ZZWLBDC**(-ICED%XDC)*ZZCC*PFSEDC(JIJ,JK) * PRXT(JIJ,JK)
 !++cb++ nouveau : traitement de la sedimentation des charges portees par les gouttelettes
@@ -505,7 +509,8 @@ DO WHILE (ANY(ZREMAINT>0.))
       ENDDO
     ENDDO
     IF (OELEC .AND. OSEDIM_BEARD) THEN
-      CALL ELEC_BEARD_EFFECT(D, KSPE, GMASK, PT, PRHODREF, PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF)
+      CALL ELEC_BEARD_EFFECT(D, CST, ICED, HCLOUD, KSPE, GMASK, PT, PRHODREF, PTHVREFZIKB, &
+                             PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF)
       DO JK = IKTB,IKTE
         DO JIJ = IIJB,IIJE
           ZWSED(JIJ,JK)  = ZWSED(JIJ,JK)  * ZBEARDCOEFF(JIJ,JK)
@@ -548,7 +553,8 @@ DO WHILE (ANY(ZREMAINT>0.))
       ENDDO
     ENDDO
     IF (OELEC .AND. OSEDIM_BEARD) THEN
-      CALL ELEC_BEARD_EFFECT(D, KSPE, GMASK, PT, PRHODREF, PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF)
+      CALL ELEC_BEARD_EFFECT(D, CST, ICED, HCLOUD, KSPE, GMASK, PT, PRHODREF, PTHVREFZIKB, &
+                             PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF)
       DO JK = IKTB,IKTE
         DO JIJ = IIJB,IIJE
           ZWSED(JIJ,JK)  = ZWSED(JIJ,JK)  * ZBEARDCOEFF(JIJ,JK)
@@ -556,8 +562,6 @@ DO WHILE (ANY(ZREMAINT>0.))
         END DO
       END DO
     END IF
-#ifdef REPRO48 
-#else
   ELSEIF(KSPE==5) THEN
     ! ******* for snow
     ZWSED(:,:) = 0.
@@ -565,6 +569,19 @@ DO WHILE (ANY(ZREMAINT>0.))
       ZWSEDQ(:,:) = 0.
       ZLBDA3(:,:) = 0.
     END IF
+#ifdef REPRO48
+    !The following lines must be kept equal to the computation in the general case ("for other species" case below)
+    ZFSED=ICEP%XFSEDS
+    ZEXSED=ICEP%XEXSEDS
+    DO JK = IKTB,IKTE
+      DO JIJ = IIJB,IIJE
+        IF(PRXT(JIJ,JK)>ICED%XRTMIN(KSPE) .AND. ZREMAINT(JIJ)>0.) THEN
+          ZWSED(JIJ, JK) = ZFSED  * PRXT(JIJ, JK)**ZEXSED            &
+                         &        * PRHODREF(JIJ, JK)**(ZEXSED-ICED%XCEXVT)
+        ENDIF
+      ENDDO
+    ENDDO
+#else
     DO JK = IKTB,IKTE
       DO JIJ = IIJB,IIJE
         IF(PRXT(JIJ,JK)> ICED%XRTMIN(KSPE) .AND. ZREMAINT(JIJ)>0.) THEN
@@ -594,7 +611,8 @@ DO WHILE (ANY(ZREMAINT>0.))
       ENDDO
     ENDDO
     IF (OELEC .AND. OSEDIM_BEARD) THEN
-      CALL ELEC_BEARD_EFFECT(D, KSPE, GMASK, PT, PRHODREF, PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF)
+      CALL ELEC_BEARD_EFFECT(D, CST, ICED, HCLOUD, KSPE, GMASK, PT, PRHODREF, PTHVREFZIKB,&
+                             PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF)
       DO JK = IKTB,IKTE
         DO JIJ = IIJB,IIJE
           ZWSED(JIJ,JK)  = ZWSED(JIJ,JK)  * ZBEARDCOEFF(JIJ,JK)
@@ -609,12 +627,6 @@ DO WHILE (ANY(ZREMAINT>0.))
       CASE(3)
         ZFSED=ICEP%XFSEDR
         ZEXSED=ICEP%XEXSEDR
-#ifdef REPRO48
-      CASE(5)
-        ZFSED=ICEP%XFSEDS
-        ZEXSED=ICEP%XEXSEDS
-#else
-#endif
       CASE(6)
         ZFSED=ICEP%XFSEDG
         ZEXSED=ICEP%XEXSEDG
@@ -692,7 +704,8 @@ DO WHILE (ANY(ZREMAINT>0.))
       ENDDO
     ENDDO
     IF (OELEC .AND. OSEDIM_BEARD) THEN
-      CALL ELEC_BEARD_EFFECT(D, KSPE, GMASK, PT, PRHODREF, PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF)
+      CALL ELEC_BEARD_EFFECT(D, CST, ICED, HCLOUD, KSPE, GMASK, PT, PRHODREF, PTHVREFZIKB, &
+                             PRXT, PQXT, PEFIELDW, ZLBDA3, ZBEARDCOEFF)
       DO JK = IKTB,IKTE
         DO JIJ = IIJB,IIJE
           ZWSED(JIJ,JK)  = ZWSED(JIJ,JK)  * ZBEARDCOEFF(JIJ,JK)
@@ -731,7 +744,13 @@ DO WHILE (ANY(ZREMAINT>0.))
       ENDIF
     ENDDO
   ENDDO
-!
+  !
+  ZANYREMAINT = .FALSE.
+  DO JIJ=IIJB,IIJE
+    IF(ZREMAINT(JIJ)>0.) THEN
+      ZANYREMAINT = .TRUE.
+    END IF
+  END DO
 END DO
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:INTERNAL_SEDIM_SPLIT', 1, ZHOOK_HANDLE)
diff --git a/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90 b/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90
index 60c599a483638c4ae09548075ad1248d20b51fc0..379a1ff26e88da2a65d3b9ee75ad6a6e0cd2530e 100644
--- a/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90
+++ b/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90
@@ -90,17 +90,12 @@ REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT)   :: PFPR    ! upper-ai
 LOGICAL :: LLSEA_AND_TOWN
 INTEGER :: JRR, JIJ, JK, IKB, IKE,IKL, IIJB, IIJE, IKTB, IKTE
 INTEGER :: ISHIFT, IK, IKPLUS
-REAL :: ZQP, ZINVTSTEP, ZGAC, ZGC, ZGAC2, ZGC2, ZRAYDEFO, ZLBDAS
-REAL, DIMENSION(D%NIJT) :: ZWSEDW1, ZWSEDW2 ! sedimentation speed
+REAL :: ZINVTSTEP, ZGAC, ZGC, ZGAC2, ZGC2, ZRAYDEFO
 REAL, DIMENSION(D%NIJT) :: ZTSORHODZ        ! TimeStep Over (Rhodref times delta Z)
 REAL, DIMENSION(D%NIJT,0:1,2:KRR) :: ZSED   ! sedimentation flux array for each species and for above and current levels
-REAL :: FWSED1, FWSED2, PWSEDW, PWSEDWSUP, PINVTSTEP, PTSTEP1, PDZZ1, PRHODREF1, PRXT1
-
+!
 REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
-FWSED1(PWSEDW,PTSTEP1,PDZZ1,PRHODREF1,PRXT1,PINVTSTEP)=MIN(PRHODREF1*PDZZ1*PRXT1*PINVTSTEP,PWSEDW*PRHODREF1*PRXT1)
-FWSED2(PWSEDW,PTSTEP1,PDZZ1,PWSEDWSUP)=MAX(0.,1.-PDZZ1/(PTSTEP1*PWSEDW))*PWSEDWSUP
-
 !-------------------------------------------------------------------------------
 IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT',0,ZHOOK_HANDLE)
 !
@@ -244,6 +239,9 @@ CONTAINS
     REAL :: ZCONC3D ! droplet condensation
     REAL :: ZRAY    ! Cloud Mean radius
     REAL :: ZZWLBDA, ZZWLBDC, ZZCC
+    INTEGER :: JIJ
+    REAL :: ZQP
+    REAL :: ZWSEDW1, ZWSEDW2
 
     !!REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
@@ -270,28 +268,28 @@ CONTAINS
           ZZWLBDA=6.6E-8*(101325./PPABST(JIJ,JK))*(PTHT(JIJ,JK)/293.15)
           ZZWLBDC=(ZLBC*ZCONC3D/(PRHODREF(JIJ,JK)*PRXT(JIJ)))**ICED%XLBEXC
           ZZCC=ICED%XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY) !! ZCC  : Fall speed
-          ZWSEDW1(JIJ)=PRHODREF(JIJ,JK)**(-ICED%XCEXVT ) * ZZWLBDC**(-ICED%XDC)*ZZCC*ZFSEDC
+          ZWSEDW1=PRHODREF(JIJ,JK)**(-ICED%XCEXVT ) * ZZWLBDC**(-ICED%XDC)*ZZCC*ZFSEDC
         ELSE
-          ZWSEDW1(JIJ)=0.
+          ZWSEDW1=0.
         ENDIF
         IF ( ZQP > ICED%XRTMIN(JRR) ) THEN
           ZZWLBDA=6.6E-8*(101325./PPABST(JIJ,JK))*(PTHT(JIJ,JK)/293.15)
           ZZWLBDC=(ZLBC*ZCONC3D/(PRHODREF(JIJ,JK)*ZQP))**ICED%XLBEXC
           ZZCC=ICED%XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY) !! ZCC  : Fall speed
-          ZWSEDW2(JIJ)=PRHODREF(JIJ,JK)**(-ICED%XCEXVT ) * ZZWLBDC**(-ICED%XDC)*ZZCC*ZFSEDC
+          ZWSEDW2=PRHODREF(JIJ,JK)**(-ICED%XCEXVT ) * ZZWLBDC**(-ICED%XDC)*ZZCC*ZFSEDC
         ELSE
-          ZWSEDW2(JIJ)=0.
+          ZWSEDW2=0.
         ENDIF
       ELSE
-        ZWSEDW1(JIJ)=0.
-        ZWSEDW2(JIJ)=0.
+        ZWSEDW1=0.
+        ZWSEDW2=0.
       ENDIF
 !- duplicated code -------------------------------------------------------------------------
-      IF (ZWSEDW2(JIJ) /= 0.) THEN
-        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) &
-         & + FWSED2(ZWSEDW2(JIJ),PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR))
+      IF (ZWSEDW2 /= 0.) THEN
+        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1,PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) &
+         & + FWSED2(ZWSEDW2,PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR))
       ELSE
-        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP)
+        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1,PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP)
       ENDIF
 !-------------------------------------------------------------------------------------------
     ENDDO
@@ -303,6 +301,9 @@ CONTAINS
   SUBROUTINE PRISTINE_ICE(PRXT)
 
     REAL, INTENT(IN)    :: PRXT(D%NIJT) ! mr of specy X
+    INTEGER :: JIJ
+    REAL :: ZQP
+    REAL :: ZWSEDW1, ZWSEDW2
 
     !!REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
@@ -314,31 +315,31 @@ CONTAINS
       IF ((PRXT(JIJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN
         !calculation of w
         IF ( PRXT(JIJ) > MAX(ICED%XRTMIN(JRR),1.0E-7 ) ) THEN
-          ZWSEDW1(JIJ)= ICEP%XFSEDI *  &
+          ZWSEDW1= ICEP%XFSEDI *  &
                             & PRHODREF(JIJ,JK)**(-ICED%XCEXVT) * & !    McF&H
                             & MAX( 0.05E6,-0.15319E6-0.021454E6* &
                             &      ALOG(PRHODREF(JIJ,JK)*PRXT(JIJ)) )**ICEP%XEXCSEDI
         ELSE
-          ZWSEDW1(JIJ)=0.
+          ZWSEDW1=0.
         ENDIF
         IF ( ZQP > MAX(ICED%XRTMIN(JRR),1.0E-7 ) ) THEN
-          ZWSEDW2(JIJ)= ICEP%XFSEDI *  &
+          ZWSEDW2= ICEP%XFSEDI *  &
                             & PRHODREF(JIJ,JK)**(-ICED%XCEXVT) * & !    McF&H
                             & MAX( 0.05E6,-0.15319E6-0.021454E6* &
                             &      ALOG(PRHODREF(JIJ,JK)*ZQP) )**ICEP%XEXCSEDI
         ELSE
-          ZWSEDW2(JIJ)=0.
+          ZWSEDW2=0.
         ENDIF
       ELSE
-        ZWSEDW1(JIJ)=0.
-        ZWSEDW2(JIJ)=0.
+        ZWSEDW1=0.
+        ZWSEDW2=0.
       ENDIF
 !- duplicated code -------------------------------------------------------------------------
-      IF (ZWSEDW2(JIJ) /= 0.) THEN
-        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) &
-         & + FWSED2(ZWSEDW2(JIJ),PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR))
+      IF (ZWSEDW2 /= 0.) THEN
+        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1,PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) &
+         & + FWSED2(ZWSEDW2,PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR))
       ELSE
-        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP)
+        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1,PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP)
       ENDIF
 !-------------------------------------------------------------------------------------------
     ENDDO
@@ -350,6 +351,9 @@ CONTAINS
   SUBROUTINE SNOW(PRXT)
 
     REAL, INTENT(IN)    :: PRXT(D%NIJT) ! mr of specy X
+    INTEGER :: JIJ
+    REAL :: ZQP, ZLBDAS
+    REAL :: ZWSEDW1, ZWSEDW2
 
     !!REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
@@ -371,31 +375,31 @@ CONTAINS
         END IF
         !calculation of w
         IF ( PRXT(JIJ) > ICED%XRTMIN(JRR) ) THEN
-          ZWSEDW1(JIJ)= ICEP%XFSEDS *  &
+          ZWSEDW1= ICEP%XFSEDS *  &
                         & PRHODREF(JIJ,JK)**(-ICED%XCEXVT) * &
                         & (1+(ICED%XFVELOS/ZLBDAS)**ICED%XALPHAS)**(-ICED%XNUS+ICEP%XEXSEDS/ICED%XALPHAS)* &
                         & ZLBDAS**(ICED%XBS+ICEP%XEXSEDS) 
         ELSE
-          ZWSEDW1(JIJ)=0.
+          ZWSEDW1=0.
         ENDIF
         IF ( ZQP > ICED%XRTMIN(JRR) ) THEN
-          ZWSEDW2(JIJ)= ICEP%XFSEDS *  &
+          ZWSEDW2= ICEP%XFSEDS *  &
                         & PRHODREF(JIJ,JK)**(-ICED%XCEXVT) * &
                         & (1+(ICED%XFVELOS/ZLBDAS)**ICED%XALPHAS)**(-ICED%XNUS+ICEP%XEXSEDS/ICED%XALPHAS)* &
                         & ZLBDAS**(ICED%XBS+ICEP%XEXSEDS) 
         ELSE
-          ZWSEDW2(JIJ)=0.
+          ZWSEDW2=0.
         ENDIF
       ELSE
-        ZWSEDW1(JIJ)=0.
-        ZWSEDW2(JIJ)=0.
+        ZWSEDW1=0.
+        ZWSEDW2=0.
       ENDIF
 !- duplicated code -------------------------------------------------------------------------
-      IF (ZWSEDW2(JIJ) /= 0.) THEN
-        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) &
-         & + FWSED2(ZWSEDW2(JIJ),PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR))
+      IF (ZWSEDW2 /= 0.) THEN
+        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1,PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) &
+         & + FWSED2(ZWSEDW2,PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR))
       ELSE
-        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP)
+        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1,PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP)
       ENDIF
 !-------------------------------------------------------------------------------------------
     ENDDO
@@ -409,6 +413,9 @@ CONTAINS
     REAL, INTENT(IN)    :: PFSED
     REAL, INTENT(IN)    :: PEXSED
     REAL, INTENT(IN)    :: PRXT(D%NIJT) ! mr of specy X
+    INTEGER :: JIJ
+    REAL :: ZQP
+    REAL :: ZWSEDW1, ZWSEDW2
 
     !!REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 
@@ -420,25 +427,25 @@ CONTAINS
       IF ((PRXT(JIJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN
         !calculation of w
         IF ( PRXT(JIJ) > ICED%XRTMIN(JRR) ) THEN
-          ZWSEDW1(JIJ)= PFSED *PRXT(JIJ)**(PEXSED-1)*PRHODREF(JIJ,JK)**(PEXSED-ICED%XCEXVT-1)
+          ZWSEDW1= PFSED *PRXT(JIJ)**(PEXSED-1)*PRHODREF(JIJ,JK)**(PEXSED-ICED%XCEXVT-1)
         ELSE
-          ZWSEDW1(JIJ)=0.
+          ZWSEDW1=0.
         ENDIF
         IF ( ZQP > ICED%XRTMIN(JRR) ) THEN
-          ZWSEDW2(JIJ)= PFSED *ZQP**(PEXSED-1)*PRHODREF(JIJ,JK)**(PEXSED-ICED%XCEXVT-1)
+          ZWSEDW2= PFSED *ZQP**(PEXSED-1)*PRHODREF(JIJ,JK)**(PEXSED-ICED%XCEXVT-1)
         ELSE
-          ZWSEDW2(JIJ)=0.
+          ZWSEDW2=0.
         ENDIF
       ELSE
-        ZWSEDW1(JIJ)=0.
-        ZWSEDW2(JIJ)=0.
+        ZWSEDW1=0.
+        ZWSEDW2=0.
       ENDIF
 !- duplicated code -------------------------------------------------------------------------
-      IF (ZWSEDW2(JIJ) /= 0.) THEN
-        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) &
-         & + FWSED2(ZWSEDW2(JIJ),PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR))
+      IF (ZWSEDW2 /= 0.) THEN
+        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1,PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) &
+         & + FWSED2(ZWSEDW2,PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR))
       ELSE
-        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP)
+        ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1,PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP)
       ENDIF
 !-------------------------------------------------------------------------------------------
     ENDDO
@@ -454,5 +461,21 @@ CONTAINS
     ISHIFT=1-ISHIFT
 
   END SUBROUTINE SHIFT
+!
+!
+ELEMENTAL FUNCTION FWSED1(PWSEDW,PTSTEP1,PDZZ1,PRHODREF1,PRXT1,PINVTSTEP) RESULT(PVAR)
+  REAL, INTENT(IN) :: PWSEDW,PTSTEP1,PDZZ1,PRHODREF1,PRXT1,PINVTSTEP
+  REAL :: PVAR
+! 5 multiplications only => cost = 5X
+  PVAR = MIN(PRHODREF1*PDZZ1*PRXT1*PINVTSTEP,PWSEDW*PRHODREF1*PRXT1)
+END FUNCTION FWSED1
+!
+ELEMENTAL FUNCTION FWSED2(PWSEDW,PTSTEP1,PDZZ1,PWSEDWSUP) RESULT(PVAR)
+  REAL, INTENT(IN) :: PWSEDW,PTSTEP1,PDZZ1,PWSEDWSUP
+  REAL :: PVAR
+  PVAR = MAX(0.,1.-PDZZ1/(PTSTEP1*PWSEDW))*PWSEDWSUP
+END FUNCTION FWSED2
+
 END SUBROUTINE ICE4_SEDIMENTATION_STAT
+
 END MODULE MODE_ICE4_SEDIMENTATION_STAT
diff --git a/src/PHYEX/micro/mode_ice4_stepping.f90 b/src/PHYEX/micro/mode_ice4_stepping.f90
index 2494a19afb24944ecd7ede51364ddd4d845a9ddc..06cd511afc949e9d8f27cf5c1df4c7e6be5c42c1 100644
--- a/src/PHYEX/micro/mode_ice4_stepping.f90
+++ b/src/PHYEX/micro/mode_ice4_stepping.f90
@@ -36,14 +36,15 @@ SUBROUTINE ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, &
 !!    MODIFICATIONS
 !!    -------------
 !!     R. El Khatib 03-May-2023 Replace OMP SIMD loops by explicit loops : more portable and even slightly faster
+!!     S. Riette Sept 23: 3D arrays suppressed from ice4_tendencies
 !  -----------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
 USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
+USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
 
-USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_BUDGET,         ONLY: TBUDGETCONF_t
 USE MODD_CST,            ONLY: CST_t
 USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
@@ -98,10 +99,10 @@ REAL,    DIMENSION(KPROMA),                     INTENT(INOUT) :: PHLC_HRC
 REAL,    DIMENSION(KPROMA),                     INTENT(INOUT) :: PHLC_HCF
 REAL,    DIMENSION(KPROMA),                     INTENT(INOUT) :: PHLI_HRI
 REAL,    DIMENSION(KPROMA),                     INTENT(INOUT) :: PHLI_HCF
-REAL,    DIMENSION(KPROMA),                     INTENT(OUT)   :: PRAINFR
+REAL,    DIMENSION(D%NIJT,D%NKT),               INTENT(INOUT) :: PRAINFR
 REAL,    DIMENSION(KPROMA,0:7),                 INTENT(INOUT) :: PEXTPK !To take into acount external tendencies inside the splitting
 REAL,    DIMENSION(KPROMA, IBUNUM-IBUNUM_EXTRA),INTENT(OUT)   :: PBU_SUM
-REAL,    DIMENSION(KPROMA),                     INTENT(INOUT) :: PRREVAV
+REAL,    DIMENSION(KPROMA),                     INTENT(OUT)   :: PRREVAV
 REAL,    DIMENSION(MERGE(KPROMA,0,OELEC)),      INTENT(IN)    :: PLATHAM_IAGGS ! E Function to simulate
                                                                                ! enhancement of IAGGS
 !
@@ -257,7 +258,7 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
     !
     !
     ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise
-    CALL ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, &
+    CALL ICE4_TENDENCIES(CST, PARAMI, ICEP, ICED, BUCONF, &
                         &KPROMA, KMICRO, &
                         &KRR, LSOFT, LLCOMPUTE, &
                         &OSAVE_MICRO, OELEC, &
@@ -318,6 +319,7 @@ DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies
       DO JL=1, KMICRO
         IF (ZA(JL, JV) < -1.E-20 .AND. PVART(JL, JV) > ICED%XRTMIN(JV)) THEN
           ZMAXTIME(JL)=MIN(ZMAXTIME(JL), -(ZB(JL, JV)+PVART(JL, JV))/ZA(JL, JV))
+          ZMAXTIME(JL)=MAX(ZMAXTIME(JL), CST%XMNH_TINY) !to prevent rounding errors
         ENDIF
       ENDDO
     ENDDO
diff --git a/src/PHYEX/micro/mode_ice4_tendencies.f90 b/src/PHYEX/micro/mode_ice4_tendencies.f90
index 611c82c1548a01a526448410c7f2d8b775bbaf86..215030e7a9e4f4d5bf545649e2389033a48fee7d 100644
--- a/src/PHYEX/micro/mode_ice4_tendencies.f90
+++ b/src/PHYEX/micro/mode_ice4_tendencies.f90
@@ -6,7 +6,7 @@
 MODULE MODE_ICE4_TENDENCIES
 IMPLICIT NONE
 CONTAINS
-SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, KPROMA, KSIZE, &
+SUBROUTINE ICE4_TENDENCIES(CST, PARAMI, ICEP, ICED, BUCONF, KPROMA, KSIZE, &
                           &KRR, ODSOFT, LDCOMPUTE, &
                           &OSAVE_MICRO, OELEC, &
                           &PEXN, PRHODREF, PLVFACT, PLSFACT, K1, K2, &
@@ -41,7 +41,6 @@ SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, KPROMA, KSIZE, &
 !          ------------
 !
 USE MODD_BUDGET,         ONLY: TBUDGETCONF_t
-USE MODD_DIMPHYEX,       ONLY: DIMPHYEX_t
 USE MODD_CST,            ONLY: CST_t
 USE MODD_PARAM_ICE_n,      ONLY: PARAM_ICE_t
 USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
@@ -52,14 +51,12 @@ USE MODE_ICE4_RRHONG, ONLY: ICE4_RRHONG
 USE MODE_ICE4_RIMLTC, ONLY: ICE4_RIMLTC
 USE MODE_ICE4_RSRIMCG_OLD, ONLY: ICE4_RSRIMCG_OLD
 USE MODE_ICE4_COMPUTE_PDF, ONLY: ICE4_COMPUTE_PDF
-USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT
 USE MODE_ICE4_SLOW, ONLY: ICE4_SLOW
 USE MODE_ICE4_WARM, ONLY: ICE4_WARM
 USE MODE_ICE4_FAST_RS, ONLY: ICE4_FAST_RS
 USE MODE_ICE4_FAST_RG, ONLY: ICE4_FAST_RG
 USE MODE_ICE4_FAST_RH, ONLY: ICE4_FAST_RH
 USE MODE_ICE4_FAST_RI, ONLY: ICE4_FAST_RI
-USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION
 !
 USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK
 !
@@ -67,7 +64,6 @@ IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments :
 !
-TYPE(DIMPHYEX_t),         INTENT(IN)    :: D
 TYPE(CST_t),              INTENT(IN)    :: CST
 TYPE(PARAM_ICE_t),        INTENT(IN)    :: PARAMI
 TYPE(RAIN_ICE_PARAM_t),   INTENT(IN)    :: ICEP
@@ -99,26 +95,26 @@ REAL, DIMENSION(KPROMA, 10),   INTENT(INOUT) :: PRH_TEND
 REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PSSI
 REAL, DIMENSION(KPROMA,0:7),   INTENT(OUT)   :: PA
 REAL, DIMENSION(KPROMA,0:7),   INTENT(OUT)   :: PB
-REAL, DIMENSION(KPROMA),       INTENT(INOUT)   :: PHLC_HCF
-REAL, DIMENSION(KPROMA),       INTENT(INOUT)   :: PHLC_LCF
-REAL, DIMENSION(KPROMA),       INTENT(INOUT)   :: PHLC_HRC
-REAL, DIMENSION(KPROMA),       INTENT(INOUT)   :: PHLC_LRC
-REAL, DIMENSION(KPROMA),       INTENT(INOUT)   :: PHLI_HCF
-REAL, DIMENSION(KPROMA),       INTENT(INOUT)   :: PHLI_LCF
-REAL, DIMENSION(KPROMA),       INTENT(INOUT)   :: PHLI_HRI
-REAL, DIMENSION(KPROMA),       INTENT(INOUT)   :: PHLI_LRI
-REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PRAINFR   ! Rain fraction
+REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PHLC_HCF
+REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PHLC_LCF
+REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PHLC_HRC
+REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PHLC_LRC
+REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PHLI_HCF
+REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PHLI_LCF
+REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PHLI_HRI
+REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PHLI_LRI
+REAL, DIMENSION(KPROMA),       INTENT(INOUT) :: PRAINFR   ! Rain fraction
 !
 !*       0.2  declaration of local variables
 !
 REAL, DIMENSION(KPROMA,0:KRR) :: ZVART
-REAL, DIMENSION(KPROMA) :: ZT, ZRAINFR, &
+REAL, DIMENSION(KPROMA) :: ZT, &
                         & ZKA, ZDV, ZAI, ZCJ, &
                         & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, &
-                        & ZRGSI, ZRGSI_MR
-REAL, DIMENSION(D%NIJT,D%NKT) :: ZRRT3D, ZRST3D, ZRGT3D, ZRHT3D
+                        & ZRGSI, ZRGSI_MR, ZRAINFR
 INTEGER :: JL, JV
 LOGICAL, DIMENSION(KPROMA) :: LLWETG ! .TRUE. if graupel growths in wet mode
+LOGICAL :: LLMASK
 REAL :: ZZW
 LOGICAL :: LLRFR
 !
@@ -144,10 +140,12 @@ ELSE
   !
   !*       2.     COMPUTES THE SLOW COLD PROCESS SOURCES
   !               --------------------------------------
-  CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, KSIZE, LDCOMPUTE(:), &
-                   ZVART(:,ITH), PPRES(:), PRHODREF(:), PEXN(:), PLSFACT(:), ZT(:), &
-                   ZVART(:,IRV), &
-                   PCIT(:), PBU_INST(:, IRVHENI_MR))
+  DO JL=1, KSIZE
+    CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, LDCOMPUTE(JL), &
+                     ZVART(JL,ITH), PPRES(JL), PRHODREF(JL), PEXN(JL), PLSFACT(JL), ZT(JL), &
+                     ZVART(JL,IRV), &
+                     PCIT(JL), PBU_INST(JL, IRVHENI_MR))
+  ENDDO
   DO JL=1, KSIZE
     ZVART(JL,ITH)=ZVART(JL,ITH) + PBU_INST(JL, IRVHENI_MR)*PLSFACT(JL)
     ZT(JL) = ZVART(JL,ITH) * PEXN(JL)
@@ -252,39 +250,31 @@ ENDIF ! ODSOFT
 !
 !Cloud water split between high and low content part is done here
 CALL ICE4_COMPUTE_PDF(CST, ICEP, ICED, KSIZE, PARAMI%CSUBG_AUCV_RC, PARAMI%CSUBG_AUCV_RI, PARAMI%CSUBG_PR_PDF,&
-                      PRHODREF, ZVART(:,IRC), ZVART(:,IRI), PCF, ZT, PSIGMA_RC, &
+                      LDCOMPUTE, PRHODREF, ZVART(:,IRC), ZVART(:,IRI), PCF, ZT, PSIGMA_RC, &
                       PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, &
                       PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, ZRAINFR)
 LLRFR=PARAMI%CSUBG_RC_RR_ACCR=='PRFR' .OR. PARAMI%CSUBG_RR_EVAP=='PRFR'
 IF (LLRFR) THEN
-  !Diagnostic of precipitation fraction
-  PRAINFR(:,:) = 0.
-  ZRRT3D (:,:) = 0.
-  ZRST3D (:,:) = 0.
-  ZRGT3D (:,:) = 0.
-  ZRHT3D (:,:) = 0.
-  DO JL=1,KSIZE
-    PRAINFR(K1(JL), K2(JL)) = ZRAINFR(JL)
-    ZRRT3D (K1(JL), K2(JL)) = ZVART(JL,IRR)
-    ZRST3D (K1(JL), K2(JL)) = ZVART(JL,IRS)
-    ZRGT3D (K1(JL), K2(JL)) = ZVART(JL,IRG)
-  END DO
-  IF (KRR==7) THEN
-    DO JL=1,KSIZE
-      ZRHT3D (K1(JL), K2(JL)) = ZVART(JL,IRH)
-    ENDDO
-    CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR(:,:), &
-                         &ZRRT3D(:,:), ZRST3D(:,:), ZRGT3D(:,:), ZRHT3D(:,:))
-  ELSE
-    CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR(:,:), &
-                         &ZRRT3D(:,:), ZRST3D(:,:), ZRGT3D(:,:))
-  ENDIF
-  DO JL=1,KSIZE
-    ZRAINFR(JL)=PRAINFR(K1(JL), K2(JL))
-  END DO
+  !To be exact, ICE4_RAINFR_VERT should be called here with the updated PRAINFR
+  !But this call would require the full 3D arrays for rain, snow and graupel which
+  !are not available here (due to separation between 1D and 3D computation for GPU).
+  !
+  !We replace the full computation by a small update to ensure consistency
+  DO JL=1, KSIZE
+    PRAINFR(JL)=MAX(PRAINFR(JL), ZRAINFR(JL))
+    IF(KRR==7) THEN
+      LLMASK=ZVART(JL,IRR) .GT. ICED%XRTMIN(3) .OR. ZVART(JL,IRS) .GT. ICED%XRTMIN(5) .OR. &
+            &ZVART(JL,IRG) .GT. ICED%XRTMIN(6) .OR. ZVART(JL,IRH) .GT. ICED%XRTMIN(7)
+    ELSE
+      LLMASK=ZVART(JL,IRR) .GT. ICED%XRTMIN(3) .OR. ZVART(JL,IRS) .GT. ICED%XRTMIN(5) .OR. &
+            &ZVART(JL,IRG) .GT. ICED%XRTMIN(6)
+    ENDIF
+    IF(LLMASK .AND. PRAINFR(JL)==0.) THEN
+      PRAINFR(JL)=1.
+    ENDIF
+  ENDDO
 ELSE
-  PRAINFR(:,:)=1.
-  ZRAINFR(:)=1.
+  PRAINFR(:)=1.
 ENDIF
 !
 !*  compute the slope parameters
@@ -298,8 +288,8 @@ DO JL=1, KSIZE
   ENDIF
   !ZLBDAR_RF is used when we consider rain concentrated in its fraction
   IF(LLRFR) THEN
-    IF(ZVART(JL,IRR)>0. .AND. ZRAINFR(JL)>0.) THEN
-      ZLBDAR_RF(JL)=ICED%XLBR*(PRHODREF(JL)*MAX(ZVART(JL,IRR)/ZRAINFR(JL), ICED%XRTMIN(3)))**ICED%XLBEXR
+    IF(ZVART(JL,IRR)>0. .AND. PRAINFR(JL)>0.) THEN
+      ZLBDAR_RF(JL)=ICED%XLBR*(PRHODREF(JL)*MAX(ZVART(JL,IRR)/PRAINFR(JL), ICED%XRTMIN(3)))**ICED%XLBEXR
     ELSE
       ZLBDAR_RF(JL)=0.
     ENDIF
@@ -358,7 +348,7 @@ IF(PARAMI%LWARM) THEN    !  Check if the formation of the raindrops by the slow
                 &PRHODREF, PLVFACT, ZT, PPRES, ZVART(:,ITH),&
                 &ZLBDAR, ZLBDAR_RF, ZKA, ZDV, ZCJ, &
                 &PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, &
-                &PCF, ZRAINFR, &
+                &PCF, PRAINFR, &
                 &ZVART(:,IRV), ZVART(:,IRC), ZVART(:,IRR), &
                 &PBU_INST(:, IRCAUTR), PBU_INST(:, IRCACCR), PBU_INST(:, IRREVAV))
 ELSE
@@ -567,5 +557,7 @@ ENDDO
 !
 IF (LHOOK) CALL DR_HOOK('ICE4_TENDENCIES', 1, ZHOOK_HANDLE)
 !
+CONTAINS
+INCLUDE "ice4_nucleation.func.h"
 END SUBROUTINE ICE4_TENDENCIES
 END MODULE MODE_ICE4_TENDENCIES
diff --git a/src/PHYEX/micro/mode_ice4_warm.f90 b/src/PHYEX/micro/mode_ice4_warm.f90
index edcb2e465f5c8470b0aafddc8a80d19dd77de3c1..0ad459b1975c7394c1d127da483890e6f62ea15d 100644
--- a/src/PHYEX/micro/mode_ice4_warm.f90
+++ b/src/PHYEX/micro/mode_ice4_warm.f90
@@ -135,7 +135,7 @@ ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN
         IF(LMASK1) THEN
           !Accretion due to rain falling in high cloud content
           !HCF*accretion(HRC/HCF) with simplification
-          PRCACCR(:) = ICEP%XFCACCR * PHLC_HRC(JL)     &
+          PRCACCR(JL) = ICEP%XFCACCR * PHLC_HRC(JL)     &
                       &*PLBDAR_RF(JL)**ICEP%XEXCACCR &
                       &*PRHODREF(JL)**(-ICED%XCEXVT)
         ELSE
diff --git a/src/PHYEX/micro/mode_icecloud.f90 b/src/PHYEX/micro/mode_icecloud.f90
index 5f44bf9a07a50a38d50f8df88cba054496f40e19..cbfcde5ca782d164b527fd773e3c50ea6bb5cb30 100644
--- a/src/PHYEX/micro/mode_icecloud.f90
+++ b/src/PHYEX/micro/mode_icecloud.f90
@@ -106,14 +106,11 @@ DO JIJ = IIJB, IIJE
    SSIU(JIJ) = MIN(ZI2W,ZRHI)
    SSIO(JIJ) = SSIU(JIJ)
    W2D(JIJ) = 1.
-
    IF (PT(JIJ)>273.1 .OR. ZR<=0. .OR. ESATI(PT(JIJ)) >= PP(JIJ)*0.5) THEN
       SSIU(JIJ) = SSIU(JIJ) - 1.
       SSIO(JIJ) = SSIU(JIJ)
       IF(PWCLD(JIJ)>=0.) SIFRC(JIJ) = PWCLD(JIJ)
-      CYCLE
-   ENDIF
-
+   ELSE
 
    ZRHIN = MAX(0.05, MIN(1.,ZRHW))
 
@@ -200,7 +197,7 @@ DO JIJ = IIJB, IIJE
    SSIO(JIJ) = SSIO(JIJ) - 1.
 
    IF (XW2D > 1.) W2D(JIJ) = 1./(1. - SIFRC(JIJ) + XW2D*SIFRC(JIJ))
-
+ END IF
 ENDDO
 
 IF (LHOOK) CALL DR_HOOK('ICECLOUD',1,ZHOOK_HANDLE)
diff --git a/src/PHYEX/micro/mode_ini_lima_cold_mixed.f90 b/src/PHYEX/micro/mode_ini_lima_cold_mixed.f90
index e8774847097e970a599f89335616b835b54b3c94..0f6c055af6426f00ebb763dc1a7bd4675aec260b 100644
--- a/src/PHYEX/micro/mode_ini_lima_cold_mixed.f90
+++ b/src/PHYEX/micro/mode_ini_lima_cold_mixed.f90
@@ -130,6 +130,8 @@ REAL :: ZBOUND_RDSF_RMIN    ! XDCRLIM*Lbda_r : lower bound used in the tabulated
 REAL :: ZRATE_R             ! Geometrical growth of Lbda_r in the tabulated function
 REAL :: ZKHI_LWM            ! Coefficient of Lawson et al. (2015)
 !
+REAL :: ZRHOIW ! ice density
+!
 !-------------------------------------------------------------------------------
 !
 !
@@ -151,19 +153,73 @@ SELECT CASE (CPRISTINE_ICE_LIMA)
     XBI = 2.5       ! Plates 
     XC_I = 747.     ! Plates
     XDI = 1.0       ! Plates
+    XGAMMAI = 0.096
+    XDELTAI = 1.83    
     XC1I = 1./XPI   ! Plates
   CASE('COLU')
     XAI = 2.14E-3   ! Columns
     XBI = 1.7       ! Columns
     XC_I = 1.96E5   ! Columns
     XDI = 1.585     ! Columns
+    XGAMMAI = 0.659
+    XDELTAI = 2.0
     XC1I = 0.8      ! Columns 
   CASE('BURO')
     XAI = 44.0      ! Bullet rosettes
     XBI = 3.0       ! Bullet rosettes
     XC_I = 4.E5     ! Bullet rosettes
     XDI = 1.663     ! Bullet rosettes
+    XGAMMAI = 0.062
+    XDELTAI = 1.81    
     XC1I = 0.5      ! Bullet rosettes
+  CASE('YPLA')
+    XAI = 0.745      ! Plates_from Yang et al (2013)
+    XBI = 2.47       ! Plates_from Yang et al (2013)
+    XC_I = 63.     ! Plates_from Yang et al (2013)
+    XDI = 0.68       ! Plates_from Yang et al (2013)
+    XGAMMAI = 0.096
+    XDELTAI = 1.83    
+    XC1I = 1./XPI   ! Plates_from Yang et al (2013)
+  CASE('YCOL')
+    XAI = 261.102   ! Columns_from Yang et al (2013)
+    XBI = 2.99       ! Columns_from Yang et al (2013)
+    XC_I = 671   ! Columns_from Yang et al (2013)
+    XDI = 0.62     ! Columns_from Yang et al (2013)
+    XGAMMAI = 0.659
+    XDELTAI = 2.0    
+    XC1I = 0.8      ! Columns_from Yang et al (2013)
+  CASE('YBUR')
+    XAI = 1.268      ! Bullet rosettes_from Yang et al (2013)
+    XBI = 2.59       ! Bullet rosettes_from Yang et al (2013)
+    XC_I = 128     ! Bullet rosettes_from Yang et al (2013)
+    XDI = 0.72     ! Bullet rosettes_from Yang et al (2013)
+    XGAMMAI = 0.062
+    XDELTAI = 1.81    
+    XC1I = 0.5      ! Bullet rosettes_from Yang et al (2013)
+  CASE('YDRO')
+    XAI = 1.268      ! Droxtals_from Yang et al (2013)
+    XBI = 2.59       ! Droxtals_from Yang et al (2013)
+    XC_I = 128     ! Droxtals_from Yang et al (2013)
+    XDI = 0.72     ! Droxtals_from Yang et al (2013)
+    XGAMMAI = 0.673
+    XDELTAI = 2.0    
+    XC1I = 0.5      ! Droxtals_from Yang et al (2013)
+  CASE('YHCO')
+    XAI = 217.586   ! Hollow_Columns_from Yang et al (2013)
+    XBI = 2.99       ! Hollow_Columns_from Yang et al (2013)
+    XC_I = 641   ! Hollow_Columns_from Yang et al (2013)
+    XDI = 0.63     ! Hollow_Columns_from Yang et al (2013)
+    XGAMMAI = 0.659
+    XDELTAI = 2.0    
+    XC1I = 0.8      ! Hollow_Columns_from Yang et al (2013)
+  CASE('YHBU')
+    XAI = 1.258      ! Hollow_Bullet rosettes_from Yang et al (2013)
+    XBI = 2.61       ! Hollow_Bullet rosettes_from Yang et al (2013)
+    XC_I = 147     ! Hollow_Bullet rosettes_from Yang et al (2013)
+    XDI = 0.73     ! Hollow_Bullet rosettes_from Yang et al (2013)
+    XGAMMAI = 0.061
+    XDELTAI = 1.81    
+    XC1I = 0.5      ! Hollow_Bullet rosettes_from Yang et al (2013)    
 END SELECT
 !
 !  Note that XCCI=N_i (a locally predicted value) and XCXI=0.0, implicitly
@@ -337,6 +393,10 @@ ZCONC_MAX  = 1.E6 ! Maximal concentration for falling particules set to 1 per cc
 !XLBDAG_MAX = ( ZCONC_MAX/XCCG )**(1./XCXG) 
 !XLBDAH_MAX = ( ZCONC_MAX/XCCH )**(1./XCXH) 
 !  
+!    constante for ecRad effective radius
+ZRHOIW = 0.917
+XREFFI = (3*XAI/(2*ZRHOIW*10**3*XGAMMAI)*MOMG(XALPHAI,XNUI,XBI)/MOMG(XALPHAI,XNUI,XDELTAI))*1E6
+!
 !-------------------------------------------------------------------------------
 !
 !
diff --git a/src/PHYEX/micro/mode_lima_sedimentation.f90 b/src/PHYEX/micro/mode_lima_sedimentation.f90
index 9c59f23d3b7e454a9081897e019db570bacff274..d9342305c5bf0ac7ad153c2ebd43d52d4a20950f 100644
--- a/src/PHYEX/micro/mode_lima_sedimentation.f90
+++ b/src/PHYEX/micro/mode_lima_sedimentation.f90
@@ -7,9 +7,9 @@ MODULE MODE_LIMA_SEDIMENTATION
   IMPLICIT NONE
 CONTAINS
 !     ######################################################################
-  SUBROUTINE LIMA_SEDIMENTATION (D, CST, &
+  SUBROUTINE LIMA_SEDIMENTATION (D, CST, ICED, HCLOUD, &
                                  HPHASE, KMOMENTS, KID, KSPLITG, PTSTEP, OELEC, &
-                                 PDZZ, PRHODREF, &
+                                 PDZZ, PRHODREF, PTHVREFZIKB, &
                                  PPABST, PT, PRT_SUM, PCPT, PRS, PCS, PINPR, PFPR, &
                                  PEFIELDW, PQS)
 !     ######################################################################
@@ -51,6 +51,7 @@ CONTAINS
 !
 USE MODD_DIMPHYEX,         ONLY: DIMPHYEX_t
 USE MODD_CST,              ONLY: CST_t
+USE MODD_RAIN_ICE_DESCR_n, ONLY: RAIN_ICE_DESCR_t
 USE MODD_ELEC_DESCR,       ONLY: LSEDIM_BEARD
 USE MODD_ELEC_PARAM,       ONLY: XFQSED, XDQ
 USE MODD_PARAM_LIMA,       ONLY: XCEXVT, XRTMIN, XCTMIN, NSPLITSED,           &
@@ -64,8 +65,8 @@ USE MODD_PARAM_LIMA_MIXED, ONLY: XCCG, XCXG, XCCH, XCXH
 
 use mode_tools,            only: Countjv
 
-USE MODI_GAMMA,            ONLY: GAMMA_X0D
-USE MODI_ELEC_COMPUTE_EX
+USE MODI_GAMMA,             ONLY: GAMMA_X0D
+USE MODE_ELEC_COMPUTE_EX,   ONLY: ELEC_COMPUTE_EX
 USE MODE_ELEC_BEARD_EFFECT, ONLY: ELEC_BEARD_EFFECT
 !
 IMPLICIT NONE
@@ -74,6 +75,7 @@ IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),         INTENT(IN)    :: D
 TYPE(CST_t),              INTENT(IN)    :: CST
+TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
 CHARACTER(1),             INTENT(IN)    :: HPHASE    ! Liquid or solid hydrometeors
 INTEGER,                  INTENT(IN)    :: KMOMENTS  ! Number of moments 
 INTEGER,                  INTENT(IN)    :: KID       ! Hydrometeor ID
@@ -91,6 +93,8 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PCS       ! C. source
 REAL, DIMENSION(:,:),     INTENT(INOUT) :: PINPR     ! Instant precip rate
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PFPR      ! Precip. fluxes in altitude
 REAL, DIMENSION(:,:,:),   INTENT(IN),    OPTIONAL :: PEFIELDW  ! Vertical component of the electric field
+CHARACTER (LEN=4),      INTENT(IN)   ::  HCLOUD       ! Kind of microphysical scheme
+REAL, INTENT(IN)                :: PTHVREFZIKB ! Reference thv at IKB for electricity
 REAL, DIMENSION(:,:,:),   INTENT(INOUT), OPTIONAL :: PQS ! Elec. charge density source
 !
 !*       0.2   Declarations of local variables :
@@ -243,7 +247,7 @@ DO JN = 1 ,  NSPLITSED(KID)
       IF (OELEC .AND. LSEDIM_BEARD) THEN
         ALLOCATE(ZLBDA3(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)))
         ZLBDA3(:,:,:) = UNPACK( ZLBDA(:),MASK=GSEDIM(:,:,:),FIELD=0.0 )
-        CALL ELEC_BEARD_EFFECT(D, KID, GSEDIM, PT, PRHODREF, &
+        CALL ELEC_BEARD_EFFECT(D, CST, ICED, HCLOUD, KID, GSEDIM, PT, PRHODREF, PTHVREFZIKB, &
                                PRS, PQS, PEFIELDW, ZLBDA3, ZBEARDCOEFF)
         DEALLOCATE(ZLBDA3)
       END IF
@@ -263,10 +267,10 @@ DO JN = 1 ,  NSPLITSED(KID)
       IF (OELEC) THEN
         ! compute e of the q-D relationship
         IF (IMOMENTS == 2) THEN  ! 2-moment species
-          CALL ELEC_COMPUTE_EX (KID, IMOMENTS, ISEDIM, PTSTEP, ZRHODREF, XRTMIN(KID), &
+          CALL ELEC_COMPUTE_EX (KID, IMOMENTS, ISEDIM, HCLOUD, PTSTEP, ZRHODREF, XRTMIN(KID), &
                                 ZRS, ZQS, ZES, PLBDX=ZLBDA, PCX=ZCS)
         ELSE                     ! 1-moment species
-          CALL ELEC_COMPUTE_EX (KID, IMOMENTS, ISEDIM, PTSTEP, ZRHODREF, XRTMIN(KID), &
+          CALL ELEC_COMPUTE_EX (KID, IMOMENTS, ISEDIM, HCLOUD, PTSTEP, ZRHODREF, XRTMIN(KID), &
                                 ZRS, ZQS, ZES, PLBDX=ZLBDA)
         END IF
         !
diff --git a/src/PHYEX/micro/modi_lima.f90 b/src/PHYEX/micro/modi_lima.f90
index a2c536238d29c46a42143be62a9c9d360cf90309..74f5ba53b482491dfa36636c728b1761c53a6d01 100644
--- a/src/PHYEX/micro/modi_lima.f90
+++ b/src/PHYEX/micro/modi_lima.f90
@@ -3,9 +3,9 @@ MODULE MODI_LIMA
 IMPLICIT NONE
 INTERFACE
 !
-   SUBROUTINE LIMA ( D, CST, BUCONF, TBUDGETS, KBUDGETS,                     &
-                     PTSTEP, OELEC,                                          &
-                     PRHODREF, PEXNREF, PDZZ,                                &
+   SUBROUTINE LIMA ( D, CST, ICED, ICEP, ELECD, ELECP, BUCONF, TBUDGETS, KBUDGETS,&
+                     PTSTEP, OELEC, HCLOUD,                                  &
+                     PRHODREF, PEXNREF, PDZZ, PTHVREFZIKB,                   &
                      PRHODJ, PPABST,                                         &
                      NCCN, NIFN, NIMM,                                       &
                      PDTHRAD, PTHT, PRT, PSVT, PW_NU,                        &
@@ -16,12 +16,20 @@ INTERFACE
 !
 USE MODD_IO,  ONLY: TFILEDATA
 USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
+USE MODD_RAIN_ICE_DESCR_n,ONLY: RAIN_ICE_DESCR_t
+USE MODD_RAIN_ICE_PARAM_n,ONLY: RAIN_ICE_PARAM_t
+USE MODD_ELEC_PARAM,      ONLY: ELEC_PARAM_t
+USE MODD_ELEC_DESCR,      ONLY: ELEC_DESCR_t
 USE MODD_BUDGET,   ONLY: TBUDGETDATA, TBUDGETCONF_t
 USE MODD_CST,            ONLY: CST_t
 IMPLICIT NONE
 !
 TYPE(DIMPHYEX_t),         INTENT(IN)    :: D
 TYPE(CST_t),              INTENT(IN)    :: CST
+TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
+TYPE(RAIN_ICE_PARAM_t),   INTENT(IN)    :: ICEP
+TYPE(ELEC_PARAM_t),       INTENT(IN)    :: ELECP   ! electrical parameters
+TYPE(ELEC_DESCR_t),       INTENT(IN)    :: ELECD   ! electrical descriptive csts
 TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
 TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
 INTEGER, INTENT(IN) :: KBUDGETS
@@ -29,6 +37,7 @@ INTEGER, INTENT(IN) :: KBUDGETS
 REAL,                     INTENT(IN)    :: PTSTEP     ! Time step
 !
 LOGICAL,                  INTENT(IN)    :: OELEC      ! if true, cloud electrification is activated
+CHARACTER (LEN=4),        INTENT(IN)    :: HCLOUD       ! Kind of microphysical scheme
 !
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PRHODREF   ! Reference density
 REAL, DIMENSION(:,:,:),   INTENT(IN)    :: PEXNREF    ! Reference Exner function
@@ -65,11 +74,12 @@ REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PICEFR     ! Cloud fraction
 REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PPRCFR     ! Cloud fraction
 REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PFPR       ! Precipitation fluxes in altitude
 !
-REAL, DIMENSION(:,:,:),             INTENT(IN)    :: PLATHAM_IAGGS  ! Factor for IAGGS modification due to Efield
+REAL, DIMENSION(:,:,:),   OPTIONAL, INTENT(IN)    :: PLATHAM_IAGGS  ! Factor for IAGGS modification due to Efield
 REAL, DIMENSION(:,:,:),   OPTIONAL, INTENT(IN)    :: PEFIELDW   ! Vertical component of the electric field
 REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(IN)    :: PSV_ELEC_T ! Charge density at time t
 REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(INOUT) :: PSV_ELEC_S ! Charge density sources
 !
+REAL, INTENT(IN)                :: PTHVREFZIKB ! Reference thv at IKB for electricity
 END SUBROUTINE LIMA
 END INTERFACE
 END MODULE MODI_LIMA
diff --git a/src/PHYEX/micro/modi_rain_ice.f90 b/src/PHYEX/micro/modi_rain_ice.f90
index 17f83cbc4916f6a6e55f2fc1edd6e6d3bfb1112a..e0bcef9df4c63039398a8caac95509d4df1b3f31 100644
--- a/src/PHYEX/micro/modi_rain_ice.f90
+++ b/src/PHYEX/micro/modi_rain_ice.f90
@@ -5,7 +5,7 @@
 IMPLICIT NONE
 INTERFACE
       SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, ELECP, ELECD, BUCONF,     &
-                            KPROMA, OCND2, OELEC, OSEDIM_BEARD,                   &
+                            OELEC, OSEDIM_BEARD, PTHVREFZIKB, HCLOUD,             &
                             PTSTEP, KRR, PEXN,                                    &
                             PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
                             PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
@@ -39,12 +39,11 @@ TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
 TYPE(ELEC_PARAM_t),       INTENT(IN)    :: ELECP   ! electrical parameters
 TYPE(ELEC_DESCR_t),       INTENT(IN)    :: ELECD   ! electrical descriptive csts
 TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
-INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
-LOGICAL                                 :: OCND2  ! Logical switch to separate liquid and ice
 LOGICAL,                  INTENT(IN)    :: OELEC  ! Switch for cloud electricity
 LOGICAL,                  INTENT(IN)    :: OSEDIM_BEARD  ! Switch for effect of electrical forces on sedim.
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
+CHARACTER (LEN=4),        INTENT(IN)    :: HCLOUD  ! Kind of microphysical scheme
 !
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PEXN    ! Exner function
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PDZZ    ! Layer thikness (m)
@@ -81,7 +80,7 @@ REAL, DIMENSION(D%NIJT), INTENT(OUT)       :: PINPRR! Rain instant precip
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)     :: PEVAP3D! Rain evap profile
 REAL, DIMENSION(D%NIJT), INTENT(OUT)       :: PINPRS! Snow instant precip
 REAL, DIMENSION(D%NIJT), INTENT(OUT)       :: PINPRG! Graupel instant precip
-REAL, DIMENSION(MERGE(D%NIJT, 0, PARAMI%LDEPOSC)), INTENT(OUT) :: PINDEP  ! Cloud instant deposition
+REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINDEP  ! Cloud instant deposition
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(OUT) :: PRAINFR !Precipitation fraction
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PSIGS   ! Sigma_s at t
 !
@@ -89,24 +88,25 @@ TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
 INTEGER, INTENT(IN) :: KBUDGETS
 !
 ! scalar variables for cloud electricity
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN)    :: PQPIT  ! Positive ion  -
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCT   ! Cloud droplet | 
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRT   ! Rain          | electric
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIT   ! Ice crystals  |  charge 
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQST   ! Snow          |   at t
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGT   ! Graupel       |
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN)    :: PQNIT  ! Negative ion  -
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(IN)    :: PQPIT  ! Positive ion  -
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQCT   ! Cloud droplet | 
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQRT   ! Rain          | electric
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQIT   ! Ice crystals  |  charge 
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQST   ! Snow          |   at t
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQGT   ! Graupel       |
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(IN)    :: PQNIT  ! Negative ion  -
 !
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQPIS  ! Positive ion  -
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCS   ! Cloud droplet | 
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRS   ! Rain          | electric
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIS   ! Ice crystals  |  charge 
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQSS   ! Snow          |  source
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGS   ! Graupel       |
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQNIS  ! Negative ion  -
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQPIS  ! Positive ion  -
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQCS   ! Cloud droplet | 
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQRS   ! Rain          | electric
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQIS   ! Ice crystals  |  charge 
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQSS   ! Snow          |  source
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQGS   ! Graupel       |
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQNIS  ! Negative ion  -
 !
-REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), INTENT(IN) :: PEFIELDW ! vertical electric field
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN)    :: PLATHAM_IAGGS ! E Function to simulate
+REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), OPTIONAL, INTENT(IN) :: PEFIELDW ! vertical electric field
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(IN)    :: PLATHAM_IAGGS ! E Function to simulate
+REAL, INTENT(IN)                :: PTHVREFZIKB ! Reference thv at IKB for electricity
                                                                                             ! enhancement of IAGGS
 !
 REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN)        :: PSEA ! Sea Mask
diff --git a/src/MNH/momg.f90 b/src/PHYEX/micro/momg.f90
similarity index 100%
rename from src/MNH/momg.f90
rename to src/PHYEX/micro/momg.f90
diff --git a/src/PHYEX/micro/radtr_satel.f90 b/src/PHYEX/micro/radtr_satel.f90
deleted file mode 100644
index 5f29acd95a57c40e775b0d2b07a23b00bb83727e..0000000000000000000000000000000000000000
--- a/src/PHYEX/micro/radtr_satel.f90
+++ /dev/null
@@ -1,756 +0,0 @@
-!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
-!MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-!    #######################
-     MODULE MODI_RADTR_SATEL 
-!    #######################
-IMPLICIT NONE
-INTERFACE
-!
-     SUBROUTINE RADTR_SATEL(KYEARF, KMONTHF, KDAYF, PSECF,         &
-                KDLON, KFLEV, KSTATM, KRAD_COLNBR, PEMIS, PCCO2,   &
-                PTSRAD, PSTATM, PTHT, PRT, PPABST, PZZ,            &
-                PSIGS, PMFCONV, PCLDFR, OUSERI, OSIGMAS,           &
-                OSUBG_COND, ORAD_SUBG_COND, PIRBT, PWVBT, KGEO,PSIGQSAT )
-IMPLICIT NONE
-!
-INTEGER, INTENT(IN) :: KYEARF  ! year of Final date
-INTEGER, INTENT(IN) :: KMONTHF ! month of Final date
-INTEGER, INTENT(IN) :: KDAYF   ! day of Final date
-REAL,    INTENT(IN) :: PSECF   ! number of seconds since date at 00 UTC 
-!
-INTEGER, INTENT(IN)   :: KDLON !number of columns where the
-                               !radiation calculations are performed
-INTEGER, INTENT(IN)   :: KFLEV !number of vertical levels where the
-                               !radiation calculations are performed
-INTEGER, INTENT(IN)   :: KSTATM  !index of the standard atmosphere level
-                                 !just above the model top
-INTEGER, INTENT(IN)   :: KRAD_COLNBR !factor by which the memory is split
-!
-REAL, DIMENSION(:,:),     INTENT(IN) :: PEMIS  !Surface IR EMISsivity
-REAL,                     INTENT(IN) :: PCCO2  !CO2 content
-REAL, DIMENSION(:,:),     INTENT(IN) :: PTSRAD !RADiative Surface Temperature
-REAL, DIMENSION(:,:),     INTENT(IN) :: PSTATM !selected standard atmosphere
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTHT   !THeta at t
-REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT    !moist variables at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PPABST !pressure at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ    !Model level heights
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PSIGS  ! Sigma_s from turbulence scheme
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2)
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! cloud fraction
-!
-LOGICAL, INTENT(IN)                  :: OUSERI ! logical switch to compute both
-                                               ! liquid and solid condensate (OUSERI=.TRUE.)
-                                               ! or only liquid condensate (OUSERI=.FALSE.)
-LOGICAL, INTENT(IN)                  :: OSIGMAS! use present global Sigma_s values
-                                               ! or that from turbulence scheme
-LOGICAL, INTENT(IN)                  :: OSUBG_COND ! Switch for Subgrid Condensation
-                                                   ! (prognotic mode)
-LOGICAL, INTENT(IN)                  :: ORAD_SUBG_COND ! Switch for Subgrid Condensation
-                                                       ! (diagnostic mode)
-!
-REAL, DIMENSION(:,:),     INTENT(OUT):: PIRBT  !IR Brightness Temp. (K)
-REAL, DIMENSION(:,:),     INTENT(OUT):: PWVBT  !WV Brightness Temp. (K)
-!
-INTEGER, INTENT(IN)   :: KGEO   !SATELLITE INDEX
-REAL, INTENT(IN)                            :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case)
-!
-END SUBROUTINE RADTR_SATEL
-END INTERFACE
-END MODULE MODI_RADTR_SATEL
-!    #####################################################################
-     SUBROUTINE RADTR_SATEL(KYEARF, KMONTHF, KDAYF, PSECF,         &
-                KDLON, KFLEV, KSTATM, KRAD_COLNBR, PEMIS, PCCO2,   &
-                PTSRAD, PSTATM, PTHT, PRT, PPABST, PZZ,            &
-                PSIGS, PMFCONV, PCLDFR, OUSERI, OSIGMAS,           &
-                OSUBG_COND, ORAD_SUBG_COND, PIRBT, PWVBT, KGEO,PSIGQSAT)
-!    #####################################################################
-!
-!!****  *RADTR_SATEL* - 
-!!
-!!    PURPOSE
-!!    -------
-!!
-!!**  METHOD
-!!    ------
-!!
-!!    EXTERNAL
-!!    --------
-!!
-!!    IMPLICIT ARGUMENTS
-!!    ------------------
-!!
-!!    REFERENCE
-!!    ---------
-!!    Chaboureau, J.-P., J.-P. Cammas, P. Mascart, J.-P. Pinty, C. Claud, R. Roca,
-!!       and J.-J. Morcrette, 2000: Evaluation of a cloud system life-cycle simulated
-!!       by Meso-NH during FASTEX using METEOSAT radiances and TOVS-3I cloud retrievals.
-!!       Q. J. R. Meteorol. Soc., 126, 1735-1750.
-!!    Chaboureau, J.-P. and P. Bechtold, 2002: A simple cloud parameterization from
-!!       cloud resolving model data: Theory and application. J. Atmos. Sci., 59, 2362-2372.
-!!
-!!    AUTHOR
-!!    ------
-!!      J.-P. Chaboureau       *L.A.*
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!      Original    29/03/00
-!!      J.-P. Chaboureau 15/04/03  add call to the subgrid condensation scheme
-!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
-!!      G.Delautier 04/2016 : BUG JPHEXT
-!!      S. Riette 11/2016 : Condensation interface changed
-!  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
-!-------------------------------------------------------------------------------
-!
-!*       0.    DECLARATIONS
-!              ------------
-!
-USE MODD_CST
-USE MODD_PARAMETERS
-USE MODD_GRID_n
-USE MODD_RAIN_ICE_PARAM_n,   ONLY: RAIN_ICE_PARAMN
-USE MODD_NEB_n,            ONLY: NEBN
-USE MODD_TURB_n,           ONLY: TURBN
-USE MODD_DIMPHYEX,         ONLY: DIMPHYEX_t
-!
-USE MODD_RAD_TRANSF
-USE MODE_ll
-USE MODE_FILL_DIMPHYEX,   ONLY: FILL_DIMPHYEX
-!
-USE MODI_INIT_NBMOD
-USE MODI_DETER_ANGLE
-USE MODI_MAKE_RADSAT
-!
-USE MODI_CONDENSATION
-!
-IMPLICIT NONE
-!
-!*       0.1   DECLARATIONS OF DUMMY ARGUMENTS :
-!
-INTEGER, INTENT(IN) :: KYEARF  ! year of Final date
-INTEGER, INTENT(IN) :: KMONTHF ! month of Final date
-INTEGER, INTENT(IN) :: KDAYF   ! day of Final date
-REAL,    INTENT(IN) :: PSECF   ! number of seconds since date at 00 UTC 
-!
-INTEGER, INTENT(IN)   :: KDLON   !number of columns where the
-                                 ! radiation calculations are performed
-INTEGER, INTENT(IN)   :: KFLEV   !number of vertical levels where the
-                                 ! radiation calculations are performed
-INTEGER, INTENT(IN)   :: KSTATM  !index of the standard atmosphere level
-                                 !just above the model top
-INTEGER, INTENT(IN)   :: KRAD_COLNBR !factor by which the memory is split
-!
-REAL, DIMENSION(:,:),     INTENT(IN) :: PEMIS  !Surface IR EMISsivity
-REAL,                     INTENT(IN) :: PCCO2  !CO2 content
-REAL, DIMENSION(:,:),     INTENT(IN) :: PTSRAD !RADiative Surface Temperature
-REAL, DIMENSION(:,:),     INTENT(IN) :: PSTATM !selected standard atmosphere
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PTHT   !THeta at t
-REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT    !moist variables at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PPABST !pressure at t
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PZZ    !Model level heights
-!
-!
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PSIGS  ! Sigma_s from turbulence scheme
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2)
-REAL, DIMENSION(:,:,:),   INTENT(IN) :: PCLDFR  ! cloud fraction
-!
-LOGICAL, INTENT(IN)                  :: OUSERI ! logical switch to compute both
-                                               ! liquid and solid condensate (OUSERI=.TRUE.)
-                                               ! or only liquid condensate (OUSERI=.FALSE.)
-LOGICAL, INTENT(IN)                  :: OSIGMAS! use present global Sigma_s values
-                                               ! or that from turbulence scheme
-LOGICAL, INTENT(IN)                  :: OSUBG_COND ! Switch for Subgrid Condensation
-                                                   ! (prognotic mode)
-LOGICAL, INTENT(IN)                  :: ORAD_SUBG_COND ! Switch for Subgrid Condensation
-                                                       ! (diagnostic mode)
-!
-REAL, DIMENSION(:,:),     INTENT(OUT):: PIRBT  !IR Brightness Temp. (K)
-REAL, DIMENSION(:,:),     INTENT(OUT):: PWVBT  !WV Brightness Temp. (K)
-!
-INTEGER, INTENT(IN)   :: KGEO   !SATELLITE INDEX
-REAL, INTENT(IN)                            :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case)
-!
-!*       0.2   DECLARATIONS OF LOCAL VARIABLES
-!
-LOGICAL :: GPTDEP, GPVOIGT
-!
-!   reference state
-!from inprof
-INTEGER :: IGL, ICABS, ING1, IUABS, IINIS, IENDS, ICONF, ICLOUD, IOVLP
-INTEGER :: IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC
-!
-LOGICAL, DIMENSION(KDLON)       :: GDOIT_2D ! .TRUE. for the larger scale
-LOGICAL, DIMENSION(KDLON,KFLEV) :: GDOIT  ! .TRUE. for all the levels of the 
-                                          !        larger scale columns
-!
-INTEGER :: JI,JJ,JK,JK1,JK2,JKRAD ! loop indexes
-!
-INTEGER :: IIB,IIE        ! I index value of the first/last inner mass point
-INTEGER :: IJB,IJE        ! J index value of the first/last inner mass point
-INTEGER :: IKB,IKE        ! K index value of the first/last inner mass point
-INTEGER :: IIU          ! array size for the first  index
-INTEGER :: IJU          ! array size for the second index
-INTEGER :: IKU          ! array size for the third  index
-INTEGER :: IIJ          ! reformatted array index
-INTEGER :: IKSTAE       ! level number of the STAndard atmosphere array
-INTEGER :: IKUP         ! vertical level above which STAndard atmosphere data
-INTEGER :: IDOIT_COL    ! number of larger scale columns
-INTEGER :: IDOIT        ! number of levels corresponding of the larger scale 
-                        ! columns are filled in
-INTEGER :: IDIM         ! effective number of columns for which the radiation
-                        !                code is run
-INTEGER, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,3)) :: IKKOZ ! indice array used to
-               ! vertically interpolate the ozone content on the model grid
-!
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZTAVE  ! mean-layer temperature
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZQVAVE ! mean-layer specific humidity
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZO3AVE ! mean-layer ozone content
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZPRES_HL ! half-level pressure
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZT_HL    ! half-level temperature
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLD ! Downward cloud emissivity
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLU ! Upward cloud emissivity
-REAL, DIMENSION(:),   ALLOCATABLE :: ZVIEW  ! cosecant of viewing angle
-REAL, DIMENSION(:),   ALLOCATABLE :: ZREMIS ! Reformatted PEMIS array
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNT ! Exner function
-REAL, DIMENSION(SIZE(PSTATM,1)) :: ZSTAZZ,ZSTAOZ ! STAndard atmosphere height
-                                                 !    and OZone content
-REAL :: ZOZ ! variable used to interpolate the ozone profile
-!
-REAL, DIMENSION(:),   ALLOCATABLE   ::  ZDT0     ! surface discontinuity
-REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADBT
-REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADBC
-REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADFT
-REAL, DIMENSION(:),   ALLOCATABLE   ::  ZULAT
-REAL, DIMENSION(:),   ALLOCATABLE   ::  ZULON
-!
-REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZZRADFT
-!
-REAL, DIMENSION(:),   ALLOCATABLE :: ZWORK1, ZWORK3
-!
-!  split arrays used to split the memory required by the ECMWF_radiation 
-!  subroutine, the fields have the same meaning as their complete counterpart
-REAL, DIMENSION(:),     ALLOCATABLE :: ZREMIS_SPLIT
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZO3AVE_SPLIT
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZT_HL_SPLIT
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZPRES_HL_SPLIT
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZQVAVE_SPLIT
-REAL, DIMENSION(:,:),   ALLOCATABLE :: ZTAVE_SPLIT
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLD_SPLIT
-REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLU_SPLIT
-REAL, DIMENSION(:),     ALLOCATABLE :: ZVIEW_SPLIT
-REAL, DIMENSION(:),   ALLOCATABLE   ::  ZDT0_SPLIT
-REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADBT_SPLIT
-REAL, DIMENSION(:,:), ALLOCATABLE   ::  ZRADBC_SPLIT
-!
-INTEGER  :: JI_SPLIT          ! loop on the split array
-INTEGER  :: INUM_CALL         ! number of CALL of the radiation scheme
-INTEGER  :: IDIM_EFF          ! effective number of air-columns to compute
-INTEGER  :: IDIM_RESIDUE      ! number of remaining air-columns to compute
-INTEGER  :: IBEG, IEND        ! auxiliary indices
-!
-! Other arrays for emissivity
-REAL :: ZFLWP, ZFIWP, ZANGCOR, ZRADLP, ZMULTS, ZTMP, ZKI
-!
-! Other arrays for condensation
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZTEMP  ! Temperature
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZSIGRC ! s r_c / sig_s^2
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZNCLD  ! grid scale cloud fraction
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRC_IN, ZRC_OUT ! grid scale r_c mixing ratio (kg/kg)
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRI_IN, ZRI_OUT ! grid scale r_i (kg/kg)
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRV_IN, ZRV_OUT ! grid scale r_v (kg/kg)
-REAL, DIMENSION(:,:,:), ALLOCATABLE  :: ZRHO
-REAL, DIMENSION(SIZE(PPABST,1),SIZE(PPABST,2)) :: ZSIGQSAT2D, ZDUM
-TYPE(DIMPHYEX_t)    :: D
-!----------------------------------------------------------------------------
-!
-!*       1.    INITIALIZATION OF CONSTANTS FOR TRANSFERT CODE
-!              ----------------------------------------------
-!
-CALL INIT_NBMOD(KFLEV, IGL, ICABS, ING1, IUABS, IINIS, IENDS, &
-       IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC, &
-       ICONF, ICLOUD, IOVLP, GPVOIGT, GPTDEP)
-X1CO2 = PCCO2 / 44.0 * XMD
-!
-!----------------------------------------------------------------------------
-!
-!*       2.    COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES
-!              ----------------------------------------------
-!
-IIU = SIZE(PTHT,1)
-IJU = SIZE(PTHT,2)
-IKU = SIZE(PTHT,3)
-CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
-IKB = 1 + JPVEXT
-IKE = IKU - JPVEXT
-CALL FILL_DIMPHYEX(D, IIU, IJU, IKU)
-!
-IKSTAE = SIZE(PSTATM,1)
-IKUP   = IKE-JPVEXT+1
-!
-!----------------------------------------------------------------------------
-!
-!*       3.    INITIALIZES THE MEAN-LAYER VARIABLES
-!              ------------------------------------
-!
-ALLOCATE(ZEXNT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)))
-ZEXNT(:,:,:)= ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD)
-! 
-ALLOCATE(ZTAVE(KDLON,KFLEV))
-ALLOCATE(ZQVAVE(KDLON,KFLEV))
-!
-ZQVAVE(:,:) = 0.0
-!
-DO JK=IKB,IKE
-  JKRAD = JK-JPVEXT
-  DO JJ=IJB,IJE
-    DO JI=IIB,IIE
-      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-      ZTAVE(IIJ,JKRAD)  = PTHT(JI,JJ,JK)*ZEXNT(JI,JJ,JK)
-    END DO
-  END DO
-END DO
-!
-!  Check if the humidity mixing ratio is available
-!
-IF( SIZE(PRT(:,:,:,:),4) >= 1 ) THEN
-  DO JK=IKB,IKE
-    JKRAD = JK-JPVEXT
-    DO JJ=IJB,IJE
-      DO JI=IIB,IIE
-        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-        ZQVAVE(IIJ,JKRAD) = PRT(JI,JJ,JK,1)
-      END DO
-    END DO
-  END DO
-END IF
-!
-!  Standard atmosphere extension
-!
-DO JK=IKUP,KFLEV
-  JK1 = (KSTATM-1)+(JK-IKUP)
-  JK2 = JK1+1
-  ZTAVE(:,JK)  = 0.5*( PSTATM(JK1,3)+PSTATM(JK2,3) )
-  ZQVAVE(:,JK) = 0.5*( PSTATM(JK1,5)/PSTATM(JK1,4)+   &
-                       PSTATM(JK2,5)/PSTATM(JK2,4)    )
-END DO
-!
-!----------------------------------------------------------------------------
-!
-!*       4.    INITIALIZES THE HALF-LEVEL VARIABLES
-!  	           ------------------------------------
-!
-ALLOCATE(ZPRES_HL(KDLON,KFLEV+1))
-ALLOCATE(ZT_HL(KDLON,KFLEV+1))
-!
-DO JK=IKB,IKE+1
-  JKRAD = JK-JPVEXT
-  DO JJ=IJB,IJE
-    DO JI=IIB,IIE
-      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-      ZPRES_HL(IIJ,JKRAD) = XP00 * &
-                           (0.5*(ZEXNT(JI,JJ,JK)+ZEXNT(JI,JJ,JK-1)))**(XCPD/XRD)
-    END DO
-  END DO
-END DO
-!
-!  Standard atmosphere extension
-! begining at ikup+1 level allows to use a model domain higher than 50km
-!
-DO JK=IKUP+1,KFLEV+1
-  JK1 = (KSTATM-1)+(JK-IKUP)
-  ZPRES_HL(:,JK) = PSTATM(JK1,2)*100.0
-END DO
-!
-!  Surface temperature at the first level
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-    ZT_HL(IIJ,1) = PTSRAD(JI,JJ)
-  END DO
-END DO
-!
-!  Temperature at half levels
-ZT_HL(:,2:IKE-JPVEXT) = 0.5*(ZTAVE(:,1:IKE-JPVEXT-1)+ZTAVE(:,2:IKE-JPVEXT))
-!
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-    ZT_HL(IIJ,IKE-JPVEXT+1)  =  0.5*PTHT(JI,JJ,IKE  )*ZEXNT(JI,JJ,IKE  ) &
-                              + 0.5*PTHT(JI,JJ,IKE+1)*ZEXNT(JI,JJ,IKE+1)
-  END DO
-END DO
-!
-!  Standard atmosphere extension
-! begining at ikup+1 level allows to use a model domain higher than 50km
-!
-DO JK=IKUP+1,KFLEV+1
-  JK1 = (KSTATM-1)+(JK-IKUP)
-  ZT_HL(:,JK) = PSTATM(JK1,3)
-END DO
-!
-!----------------------------------------------------------------------------
-!
-!*       5.    INITIALIZES THE OZONE PROFILES from the standard atmosphere
-!	           ------------------------------
-!
-ALLOCATE(ZO3AVE(KDLON,KFLEV))
-!
-ZSTAOZ(:) = PSTATM(:,6)/PSTATM(:,4)
-ZSTAZZ(:) = 1000.0*PSTATM(:,1)
-!
-DO JJ = IJB,IJE
-  DO JK2 = IKB,IKE
-    JKRAD = JK2-JPVEXT
-    IKKOZ(:,JK2) = IKB-1
-    DO JK1 = 1,IKSTAE
-      DO JI = IIB,IIE
-        IKKOZ(JI,JK2)=IKKOZ(JI,JK2) + NINT(0.5 + SIGN(0.5,    &
-                                          -ZSTAZZ(JK1)+0.5*(PZZ(JI,JJ,JK2)+PZZ(JI,JJ,JK2+1)) ))
-      END DO
-    END DO
-    DO JI = IIB,IIE
-      ZOZ=(0.5*(PZZ(JI,JJ,JK2)+PZZ(JI,JJ,JK2+1))- ZSTAZZ(IKKOZ(JI,JK2))) &
-           /( ZSTAZZ(IKKOZ(JI,JK2)+1)           - ZSTAZZ(IKKOZ(JI,JK2)))
-      IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-      ZO3AVE(IIJ,JKRAD) =( (1.- ZOZ) * ZSTAOZ(IKKOZ(JI,JK2))    &
-                         +  ZOZ     * ZSTAOZ(IKKOZ(JI,JK2)+1))
-    END DO
-  END DO
-END DO
-!
-DO JK=IKUP,KFLEV
-  JK1 = (KSTATM)+(JK-IKUP)
-  ZO3AVE(:,JK) = ZSTAOZ(JK1)
-END DO
-!
-!----------------------------------------------------------------------------
-!
-!*       6.    CALLS THE E.C.M.W.F. RADIATION CODE
-!	           -----------------------------------
-!
-!*       6.1   INITIALIZES 2D AND SURFACE FIELDS
-!
-ALLOCATE(ZREMIS(KDLON))
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-    ZREMIS(IIJ)   = PEMIS(JI,JJ)
-  END DO
-END DO
-!
-! initializes surface discontinuity field
-ALLOCATE(ZDT0(KDLON))
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-    ZDT0(IIJ) = PTSRAD(JI,JJ) - PTHT(JI,JJ,1)*ZEXNT(JI,JJ,1)
-  END DO
-END DO
-!
-ALLOCATE(ZULAT(KDLON))
-ALLOCATE(ZULON(KDLON))
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-    ZULON(IIJ) = XLON(JI,JJ)
-    ZULAT(IIJ) = XLAT(JI,JJ)
-  END DO
-END DO
-ALLOCATE(ZVIEW(KDLON))
-CALL DETER_ANGLE(KGEO, KDLON, ZULAT, ZULON, ZVIEW)
-DEALLOCATE(ZULAT)
-DEALLOCATE(ZULON)
-!
-!
-ALLOCATE(ZCLDLD(KDLON,KFLEV))
-ALLOCATE(ZCLDLU(KDLON,KFLEV))
-ZCLDLD = 0.
-ZCLDLU = 0.
-!
-IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN
-  ALLOCATE(ZNCLD(IIU,IJU,IKU))
-  ALLOCATE(ZRC_IN(IIU,IJU,IKU))
-  ALLOCATE(ZRC_OUT(IIU,IJU,IKU))
-  ZRC_IN=PRT(:,:,:,2)
-  ALLOCATE(ZRI_IN(IIU,IJU,IKU))
-  ALLOCATE(ZRI_OUT(IIU,IJU,IKU))
-  ZRI_IN=0.
-  IF( OUSERI ) ZRI_IN=PRT(:,:,:,4)
-  IF ( .NOT. OSUBG_COND .AND. ORAD_SUBG_COND) THEN
-    PRINT*,' THE SUBGRID CONDENSATION SCHEME IN DIAGNOSTIC MODE IS ACTIVATED'
-    ALLOCATE(ZTEMP(IIU,IJU,IKU))
-    ZTEMP=PTHT*ZEXNT
-    ALLOCATE(ZSIGRC(IIU,IJU,IKU))
-    ALLOCATE(ZRV_IN(IIU,IJU,IKU))
-
-    ZRV_IN=PRT(:,:,:,1)
-    ALLOCATE(ZRHO(IIU,IJU,IKU))
-    ZRHO=1. !unused
-    ZSIGQSAT2D(:,:)=PSIGQSAT
-    !CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, &
-    !     'T', 'CB02', 'CB',&
-    !     PPABST, PZZ, ZRHO, ZTEMP, ZRV_IN, ZRV_OUT, ZRC_IN, ZRC_OUT, ZRI_IN, ZRI_OUT, &
-    !     PRT(:,:,:,2), PRT(:,:,:,5), PRT(:,:,:,6), PSIGS, PMFCONV, ZNCLD, &
-    !     ZSIGRC, OUSERI, OSIGMAS, .FALSE., .FALSE., &
-    !     ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, ZSIGQSAT2D )
-    CALL CONDENSATION(D, CST, RAIN_ICE_PARAMN, NEBN, TURBN, &                                                                         
-                     &'T', 'CB02', 'CB',                                                  &                                         
-                     &PPABST, PZZ, ZRHO, ZTEMP, ZRV_IN, ZRV_OUT, ZRC_IN, ZRC_OUT, ZRI_IN, ZRI_OUT,    &                                             
-                     &PRT(:,:,:,2), PRT(:,:,:,5), PRT(:,:,:,6), PSIGS, .FALSE., PMFCONV, ZNCLD, ZSIGRC, .FALSE.,                 &     
-                     &OSIGMAS, .FALSE.,                                                                 &                           
-                     &ZDUM, ZDUM, ZDUM, ZDUM, ZDUM, ZSIGQSAT2D)
-    DEALLOCATE(ZTEMP,ZSIGRC)
-    DEALLOCATE(ZRV_OUT)
-  ELSE
-    ZNCLD=PCLDFR
-  END IF
-  DO JK=IKB,IKE-1
-    JKRAD = JK-JPVEXT
-    DO JJ=IJB,IJE
-      DO JI=IIB,IIE
-        IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-        IF ( ZVIEW(IIJ) /= XUNDEF .AND. &
-             (ZRC_OUT(JI,JJ,JK)  > 0. .OR. ZRI_OUT(JI,JJ,JK) > 0. ) ) THEN
-          ZFLWP = ZRC_OUT(JI,JJ,JK) / XG /MAX(1.E-10,ZNCLD(JI,JJ,JK)) &
-               * (PPABST(JI,JJ,JK)-PPABST(JI,JJ,JK+1))
-          ZFIWP = ZRI_OUT(JI,JJ,JK) / XG /MAX(1.E-10,ZNCLD(JI,JJ,JK)) &
-               * (PPABST(JI,JJ,JK)-PPABST(JI,JJ,JK+1))
-          ZANGCOR = ZVIEW(IIJ) / 1.66
-          !!!Parametrization following Ou and Chou, 1995 (Atmos. Res.)
-        ZTMP = ZTAVE(IIJ,JKRAD)-XTT !ZTMP in Celsius degree
-        ZRADLP = 326.3+12.42*ZTMP+0.197*(ZTMP**2)+0.0012*(ZTMP**3)
-        ZRADLP = MIN(140., MAX(20., ZRADLP))
-!!! Parametrization following Ebert and Curry, 1992 (JGR-d)
-        ZKI = 0.3 + 1290. / ZRADLP
-         ZCLDLD(IIJ,JKRAD) = ZNCLD(JI,JJ,JK)*(1.-EXP &
-                             ( -158.*ZFLWP *ZANGCOR-ZKI*ZFIWP*ZVIEW(IIJ)))
-         ZCLDLU(IIJ,JKRAD) = ZNCLD(JI,JJ,JK)*(1.-EXP &
-                             ( -130.*ZFLWP *ZANGCOR-ZKI*ZFIWP*ZVIEW(IIJ)))
-          END IF
-        END DO
-      END DO
-    END DO
-  DEALLOCATE(ZNCLD,ZRC_OUT,ZRI_OUT)
-END IF
-!
-DEALLOCATE(ZEXNT)
-!
-GDOIT_2D(:) = .FALSE.
-!
-! Flags the columns for which the computations have to be performed
-!
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-    IF (ZVIEW(IIJ) /= XUNDEF) GDOIT_2D(IIJ) = .TRUE.
-  END DO
-END DO
-IDOIT_COL = COUNT( GDOIT_2D(:) )  ! number of larger scale columns
-!
-GDOIT(:,:) = SPREAD( GDOIT_2D(:),DIM=2,NCOPIES=KFLEV )
-IDOIT = IDOIT_COL*KFLEV
-ALLOCATE(ZWORK1(IDOIT))
-!
-! temperature profiles
-ZWORK1(:) = PACK( ZTAVE(:,:),MASK=GDOIT(:,:) )
-DEALLOCATE(ZTAVE)
-ALLOCATE(ZTAVE(IDOIT_COL,KFLEV))
-ZTAVE(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
-!
-! vapor mixing ratio profiles
-ZWORK1(:) = PACK( ZQVAVE(:,:),MASK=GDOIT(:,:) )
-DEALLOCATE(ZQVAVE)
-ALLOCATE(ZQVAVE(IDOIT_COL,KFLEV))
-ZQVAVE(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
-!
-! cloud emissivities
-ZWORK1(:) = PACK( ZCLDLD(:,:),MASK=GDOIT(:,:) )
-DEALLOCATE(ZCLDLD)
-ALLOCATE(ZCLDLD(IDOIT_COL,KFLEV))
-ZCLDLD(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
-!
-ZWORK1(:) = PACK( ZCLDLU(:,:),MASK=GDOIT(:,:) )
-DEALLOCATE(ZCLDLU)
-ALLOCATE(ZCLDLU(IDOIT_COL,KFLEV))
-ZCLDLU(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
-!
-! ozone content profiles
-ZWORK1(:) = PACK( ZO3AVE(:,:),MASK=GDOIT(:,:) )
-DEALLOCATE(ZO3AVE)
-ALLOCATE(ZO3AVE(IDOIT_COL,KFLEV))
-ZO3AVE(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
-!
-! half-level variables
-ZWORK1(:) = PACK(  ZPRES_HL(:,1:KFLEV),MASK=GDOIT(:,:) )
-DEALLOCATE(ZPRES_HL)
-ALLOCATE(ZPRES_HL(IDOIT_COL,KFLEV+1))
-ZPRES_HL(:,1:KFLEV) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
-ZPRES_HL(:,KFLEV+1) = PSTATM(IKSTAE,2)*100.0
-!
-ZWORK1(:) = PACK(  ZT_HL(:,1:KFLEV),MASK=GDOIT(:,:) )
-DEALLOCATE(ZT_HL)
-ALLOCATE(ZT_HL(IDOIT_COL,KFLEV+1))
-ZT_HL(:,1:KFLEV) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) )
-ZT_HL(:,KFLEV+1) = PSTATM(IKSTAE,3)
-!
-! surface fields
-ALLOCATE(ZWORK3(IDOIT_COL))
-ZWORK3(:) = PACK( ZVIEW(:),MASK=GDOIT_2D(:) )
-DEALLOCATE(ZVIEW)
-ALLOCATE(ZVIEW(IDOIT_COL))
-ZVIEW(:) = ZWORK3(:)
-!
-ZWORK3(:) = PACK( ZREMIS(:),MASK=GDOIT_2D(:) )
-DEALLOCATE(ZREMIS)
-ALLOCATE(ZREMIS(IDOIT_COL))
-ZREMIS(:) = ZWORK3(:)
-!
-ZWORK3(:) = PACK( ZDT0(:),MASK=GDOIT_2D(:) )
-DEALLOCATE(ZDT0)
-ALLOCATE(ZDT0(IDOIT_COL))
-ZDT0(:) = ZWORK3(:)
-!
-DEALLOCATE(ZWORK1)
-DEALLOCATE(ZWORK3)
-!
-! radiation fields
-ALLOCATE(ZRADBC(IDOIT_COL,JPWVINT))
-ALLOCATE(ZRADBT(IDOIT_COL,JPWVINT))
-!
-IDIM = IDOIT_COL
-PRINT *,'KGEO =',KGEO,' IDIM =',IDIM
-!
-!*       6.2   CALLS THE ECMWF_RADIATION ROUTINES
-!
-!  ***********************************************************
-!  *CAUTION: Routine  nbmvec  is written in FORTRAN 77*
-!  ***********************************************************
-!
-!  mixing ratio -> specific humidity conversion
-ZQVAVE(:,:) = ZQVAVE(:,:) / (1.+ZQVAVE(:,:))
-!
-IF( IDIM <= KRAD_COLNBR ) THEN 
-   !
-   !  there is less than KRAD_COLNBR verticals to be considered therefore
-   ! no split of the arrays is performed
-   !
-   CALL NBMVEC( 1, IDIM, IDIM, KFLEV, IGL, ICABS, ING1, IUABS, &
-        IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC, &
-        IINIS, IENDS, ICONF, ICLOUD, IOVLP, GPVOIGT, GPTDEP, &
-        ZTAVE, ZQVAVE, ZO3AVE, ZPRES_HL, ZT_HL, &
-        ZVIEW, ZCLDLD, ZCLDLU, ZDT0, ZREMIS, ZRADBC, ZRADBT)
-ELSE
-   !
-   ! the splitting of the arrays will be performed
-   !
-   INUM_CALL = CEILING( REAL( IDIM ) / REAL( KRAD_COLNBR ) )
-   IDIM_RESIDUE = IDIM
-   DO JI_SPLIT = 1 , INUM_CALL
-     IDIM_EFF = MIN( IDIM_RESIDUE,KRAD_COLNBR )
-     !
-     IF( JI_SPLIT == 1 .OR. JI_SPLIT == INUM_CALL ) THEN
-       ALLOCATE(  ZREMIS_SPLIT(IDIM_EFF))
-       ALLOCATE(  ZO3AVE_SPLIT(IDIM_EFF,KFLEV))
-       ALLOCATE(  ZT_HL_SPLIT(IDIM_EFF,KFLEV+1))
-       ALLOCATE(  ZPRES_HL_SPLIT(IDIM_EFF,KFLEV+1))
-       ALLOCATE(  ZQVAVE_SPLIT(IDIM_EFF,KFLEV))
-       ALLOCATE(  ZTAVE_SPLIT(IDIM_EFF,KFLEV))
-       ALLOCATE(  ZCLDLU_SPLIT(IDIM_EFF,KFLEV))
-       ALLOCATE(  ZCLDLD_SPLIT(IDIM_EFF,KFLEV))
-       ALLOCATE(  ZVIEW_SPLIT(IDIM_EFF))
-       ALLOCATE(  ZDT0_SPLIT(IDIM_EFF))
-       ALLOCATE(  ZRADBT_SPLIT(IDIM_EFF,JPWVINT))
-       ALLOCATE(  ZRADBC_SPLIT(IDIM_EFF,JPWVINT))
-     END IF
-     !
-     ! fill the split arrays with their values
-     ! taken from the full arrays 
-     !
-     IBEG = IDIM-IDIM_RESIDUE+1
-     IEND = IBEG+IDIM_EFF-1
-     ZREMIS_SPLIT(:)   = ZREMIS( IBEG:IEND )
-     ZO3AVE_SPLIT(:,:) = ZO3AVE( IBEG:IEND ,:)
-     ZT_HL_SPLIT(:,:)    = ZT_HL( IBEG:IEND ,:)
-     ZPRES_HL_SPLIT(:,:) = ZPRES_HL( IBEG:IEND ,:)
-     ZQVAVE_SPLIT(:,:) = ZQVAVE( IBEG:IEND ,:)
-     ZTAVE_SPLIT(:,:)  = ZTAVE ( IBEG:IEND ,:)
-     ZCLDLU_SPLIT(:,:)  = ZCLDLU ( IBEG:IEND ,:)
-     ZCLDLD_SPLIT(:,:)  = ZCLDLD ( IBEG:IEND ,:)
-     ZVIEW_SPLIT(:)    = ZVIEW ( IBEG:IEND )
-     ZDT0_SPLIT(:)    = ZDT0 ( IBEG:IEND )
-     !  
-     ! call ECMWF_radiation with the split arrays
-     !
-     CALL NBMVEC( 1, IDIM_EFF, IDIM_EFF, KFLEV, IGL, ICABS, ING1, IUABS,&
-          IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC, &
-          IINIS, IENDS, ICONF, ICLOUD, IOVLP, GPVOIGT, GPTDEP, &
-          ZTAVE_SPLIT, ZQVAVE_SPLIT, ZO3AVE_SPLIT, &
-          ZPRES_HL_SPLIT, ZT_HL_SPLIT, &
-          ZVIEW_SPLIT, ZCLDLD_SPLIT, ZCLDLU_SPLIT, ZDT0_SPLIT, &
-          ZREMIS_SPLIT, ZRADBC_SPLIT, ZRADBT_SPLIT)
-     !
-     ! fill the full output arrays with the split arrays
-     !
-     ZRADBT( IBEG:IEND ,:)  = ZRADBT_SPLIT(:,:)  
-     ZRADBC( IBEG:IEND ,:)  = ZRADBC_SPLIT(:,:)  
-     !
-     IDIM_RESIDUE = IDIM_RESIDUE - IDIM_EFF
-     !
-     ! desallocation of the split arrays
-     !
-     IF( JI_SPLIT >= INUM_CALL-1 ) THEN
-       DEALLOCATE(ZREMIS_SPLIT)
-       DEALLOCATE(ZO3AVE_SPLIT)
-       DEALLOCATE(ZT_HL_SPLIT)
-       DEALLOCATE(ZPRES_HL_SPLIT)
-       DEALLOCATE(ZQVAVE_SPLIT)
-       DEALLOCATE(ZTAVE_SPLIT)
-       DEALLOCATE(ZCLDLU_SPLIT)
-       DEALLOCATE(ZCLDLD_SPLIT)
-       DEALLOCATE(ZVIEW_SPLIT)
-       DEALLOCATE(ZDT0_SPLIT)
-       DEALLOCATE(ZRADBT_SPLIT)
-       DEALLOCATE(ZRADBC_SPLIT)
-     END IF
-   END DO
-END IF
-!
-DEALLOCATE(ZTAVE,ZQVAVE,ZO3AVE)
-DEALLOCATE(ZPRES_HL,ZT_HL)
-DEALLOCATE(ZREMIS)
-DEALLOCATE(ZDT0)
-DEALLOCATE(ZCLDLD,ZCLDLU)
-DEALLOCATE(ZVIEW)
-!
-ZRADBT = ZRADBT / XPI
-ALLOCATE(ZRADFT(IDIM,JPCAN))
-CALL MAKE_RADSAT(KYEARF, KMONTHF, KDAYF, PSECF, &
-                 KGEO, IDIM, ZRADBT, ZRADFT)
-DEALLOCATE(ZRADBT)
-DEALLOCATE(ZRADBC)
-!
-ALLOCATE(ZWORK1(IDIM*JPCAN))
-ZWORK1(:) = PACK( ZRADFT(:,:),MASK=.TRUE. )
-ALLOCATE(ZZRADFT(KDLON,JPCAN))
-ZZRADFT(:,:) = UNPACK( ZWORK1(:),MASK=GDOIT(:,1:JPCAN),FIELD=XUNDEF )
-DEALLOCATE(ZRADFT)
-DEALLOCATE(ZWORK1)
-!
-PIRBT = XUNDEF
-PWVBT = XUNDEF
-DO JJ=IJB,IJE
-  DO JI=IIB,IIE
-    IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-    PIRBT(JI,JJ) = ZZRADFT(IIJ,1)
-    PWVBT(JI,JJ) = ZZRADFT(IIJ,2)
-  END DO
-END DO
-DEALLOCATE(ZZRADFT)
-!
-END SUBROUTINE RADTR_SATEL
diff --git a/src/PHYEX/micro/rain_ice.f90 b/src/PHYEX/micro/rain_ice.f90
index 8c000324b0b3eba5b9520d006ca770cd3d532273..51c9afa6e42a4e639f7e293d1742833e04dd2d94 100644
--- a/src/PHYEX/micro/rain_ice.f90
+++ b/src/PHYEX/micro/rain_ice.f90
@@ -5,7 +5,7 @@
 !-----------------------------------------------------------------
 !     ######spl
       SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, ELECP, ELECD, BUCONF,     &
-                            KPROMA, OCND2, OELEC, OSEDIM_BEARD,                   &
+                            OELEC, OSEDIM_BEARD, PTHVREFZIKB, HCLOUD,             &
                             PTSTEP, KRR, PEXN,                                    &
                             PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,&
                             PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,               &
@@ -167,17 +167,18 @@
 !!      (C. Abiven, Y. Léauté, V. Seigner, S. Riette) Phasing of Turner rain subgrid param
 !!      (S. Riette) Source code split into several files
 !!                  02/2019 C.Lac add rain fraction as an output field
-!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
-!  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
-!  P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support)
-!  P. Wautelet 17/01/2020: move Quicksort to tools.f90
-!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
-!  P. Wautelet 25/02/2020: bugfix: add missing budget: WETH_BU_RRG
+!!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
+!!  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
+!!  P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support)
+!!  P. Wautelet 17/01/2020: move Quicksort to tools.f90
+!!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+!!  P. Wautelet 25/02/2020: bugfix: add missing budget: WETH_BU_RRG
 !!     R. El Khatib 24-Aug-2021 Optimizations
 !  J. Wurtz       03/2022: New snow characteristics with LSNOW_T
 !  C. Barthe      03/2023: Add call to cloud electrification
 !  C. Barthe      06/2023: Add retroaction of electric field on IAGGS
 !  C. Barthe      07/2023: use new data structures for electricity
+!! S. Riette Sept 23: e from ice4_tendencies
 !-----------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -238,12 +239,12 @@ USE MODE_BUDGET_PHY,         ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY
 USE MODE_MSG,                ONLY: PRINT_MSG, NVERB_FATAL
 
 USE MODE_ICE4_RAINFR_VERT,   ONLY: ICE4_RAINFR_VERT
+USE MODE_ICE4_COMPUTE_PDF,   ONLY: ICE4_COMPUTE_PDF
 USE MODE_ICE4_SEDIMENTATION, ONLY: ICE4_SEDIMENTATION
 USE MODE_ICE4_PACK, ONLY: ICE4_PACK
-USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION
 USE MODE_ICE4_CORRECT_NEGATIVITIES, ONLY: ICE4_CORRECT_NEGATIVITIES
 !
-USE MODI_ELEC_TENDENCIES
+USE MODE_ELEC_TENDENCIES, ONLY : ELEC_TENDENCIES
 !
 IMPLICIT NONE
 !
@@ -259,12 +260,11 @@ TYPE(RAIN_ICE_DESCR_t),   INTENT(IN)    :: ICED
 TYPE(ELEC_PARAM_t),       INTENT(IN)    :: ELECP   ! electrical parameters
 TYPE(ELEC_DESCR_t),       INTENT(IN)    :: ELECD   ! electrical descriptive csts
 TYPE(TBUDGETCONF_t),      INTENT(IN)    :: BUCONF
-INTEGER,                  INTENT(IN)    :: KPROMA ! cache-blocking factor for microphysic loop
-LOGICAL                                 :: OCND2  ! Logical switch to separate liquid and ice
 LOGICAL,                  INTENT(IN)    :: OELEC  ! Switch for cloud electricity
 LOGICAL,                  INTENT(IN)    :: OSEDIM_BEARD  ! Switch for effect of electrical forces on sedim.
 REAL,                     INTENT(IN)    :: PTSTEP  ! Double Time step (single if cold start)
 INTEGER,                  INTENT(IN)    :: KRR     ! Number of moist variable
+CHARACTER (LEN=4),        INTENT(IN)    :: HCLOUD  ! Kind of microphysical scheme
 !
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PEXN    ! Exner function
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PDZZ    ! Layer thikness (m)
@@ -301,32 +301,33 @@ REAL, DIMENSION(D%NIJT), INTENT(OUT)       :: PINPRR! Rain instant precip
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)     :: PEVAP3D! Rain evap profile
 REAL, DIMENSION(D%NIJT), INTENT(OUT)       :: PINPRS! Snow instant precip
 REAL, DIMENSION(D%NIJT), INTENT(OUT)       :: PINPRG! Graupel instant precip
-REAL, DIMENSION(MERGE(D%NIJT, 0, PARAMI%LDEPOSC)), INTENT(OUT) :: PINDEP  ! Cloud instant deposition
+REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINDEP  ! Cloud instant deposition
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(OUT) :: PRAINFR !Precipitation fraction
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(IN)    :: PSIGS   ! Sigma_s at t
+REAL, INTENT(IN)                :: PTHVREFZIKB ! Reference thv at IKB for electricity
 !
 TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
 INTEGER, INTENT(IN) :: KBUDGETS
 !
 ! scalar variables for cloud electricity
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN)    :: PQPIT  ! Positive ion  -
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCT   ! Cloud droplet | 
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRT   ! Rain          | electric
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIT   ! Ice crystals  |  charge 
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQST   ! Snow          |   at t
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGT   ! Graupel       |
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN)    :: PQNIT  ! Negative ion  -
-!
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQPIS  ! Positive ion  -
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQCS   ! Cloud droplet | 
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQRS   ! Rain          | electric
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQIS   ! Ice crystals  |  charge 
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQSS   ! Snow          |  source
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQGS   ! Graupel       |
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(INOUT) :: PQNIS  ! Negative ion  -
-!
-REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), INTENT(IN) :: PEFIELDW ! vertical electric field
-REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), INTENT(IN)    :: PLATHAM_IAGGS ! E Function to simulate
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(IN)    :: PQPIT  ! Positive ion  -
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQCT   ! Cloud droplet | 
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQRT   ! Rain          | electric
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQIT   ! Ice crystals  |  charge 
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQST   ! Snow          |   at t
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQGT   ! Graupel       |
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(IN)    :: PQNIT  ! Negative ion  -
+!
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQPIS  ! Positive ion  -
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQCS   ! Cloud droplet | 
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQRS   ! Rain          | electric
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQIS   ! Ice crystals  |  charge 
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQSS   ! Snow          |  source
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQGS   ! Graupel       |
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(INOUT) :: PQNIS  ! Negative ion  -
+!
+REAL, DIMENSION(MERGE(D%NIJT,0,OSEDIM_BEARD),MERGE(D%NKT,0,OSEDIM_BEARD)), OPTIONAL, INTENT(IN) :: PEFIELDW ! vertical electric field
+REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(IN)    :: PLATHAM_IAGGS ! E Function to simulate
                                                                                             ! enhancement of IAGGS
 !
 ! optional variables
@@ -345,13 +346,18 @@ REAL, DIMENSION(MERGE(D%NIJT,0,OELEC),MERGE(D%NKT,0,OELEC)), OPTIONAL, INTENT(IN
 REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 !
 INTEGER :: JIJ, JK
-INTEGER :: IKTB, IKTE, IKB, IIJB, IIJE
+INTEGER :: IKTB, IKTE, IKB, IKT, IIJB, IIJE, IIJT
 !
 LOGICAL, DIMENSION(D%NIJT,D%NKT) :: LLMICRO ! mask to limit computation
 !Arrays for nucleation call outisde of LLMICRO points
 REAL,    DIMENSION(D%NIJT, D%NKT) :: ZT ! Temperature
 REAL, DIMENSION(D%NIJT, D%NKT) :: ZZ_RVHENI       ! heterogeneous nucleation
 REAL, DIMENSION(D%NIJT, D%NKT) :: ZZ_LVFACT, ZZ_LSFACT
+REAL, DIMENSION(D%NIJT, D%NKT) :: ZSIGMA_RC
+REAL, DIMENSION(D%NIJT, D%NKT) :: ZHLC_LCF
+REAL, DIMENSION(D%NIJT, D%NKT) :: ZHLC_LRC
+REAL, DIMENSION(D%NIJT, D%NKT) :: ZHLI_LCF
+REAL, DIMENSION(D%NIJT, D%NKT) :: ZHLI_LRI
 !
 REAL :: ZINV_TSTEP ! Inverse ov PTSTEP
 !For total tendencies computation
@@ -380,13 +386,12 @@ IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 0, ZHOOK_HANDLE)
 IKTB=D%NKTB
 IKTE=D%NKTE
 IKB=D%NKB
+IKT=D%NKT
 IIJB=D%NIJB
 IIJE=D%NIJE
+IIJT=D%NIJT
 !-------------------------------------------------------------------------------
 !
-IF(PARAMI%LOCND2) THEN
-  CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'LOCND2 OPTION NOT CODED IN THIS RAIN_ICE VERSION')
-END IF
 ZINV_TSTEP=1./PTSTEP
 !
 ! LSFACT and LVFACT without exner, and LLMICRO
@@ -432,7 +437,7 @@ ENDDO
 !
 IF(.NOT. PARAMI%LSEDIM_AFTER) THEN
   CALL ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, BUCONF, &
-                         &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, &
+                         &OELEC, OSEDIM_BEARD, HCLOUD, PTSTEP, KRR, PDZZ, PTHVREFZIKB, &
                          &ZZ_LVFACT, ZZ_LSFACT, PRHODREF, PPABST, PTHT, ZT, PRHODJ, &
                          &PTHS, PRVS, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                          &PINPRC, PINPRR, PINPRS, PINPRG, &
@@ -473,7 +478,7 @@ DO JK = IKTB,IKTE
 ENDDO
 !
 !
-!*       4.     COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF LLMICRO POINTS
+!*       4.1    COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF LLMICRO POINTS
 !               -----------------------------------------------------------------
 !
 !The nucleation must be called everywhere
@@ -490,11 +495,15 @@ DO JK=IKTB,IKTE
     ENDIF
   ENDDO
 ENDDO
-CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, D%NIJT*D%NKT, LLW3D(:,:), &
-                     PTHT(:, :), PPABST(:, :), PRHODREF(:, :), &                                       
-                     PEXN(:, :), ZW3D(:, :), ZT(:, :), &                                                           
-                     PRVT(:, :), &                                                                                 
-                     PCIT(:, :), ZZ_RVHENI(:, :))
+DO JK=IKTB,IKTE                                                                                                                     
+  DO JIJ=IIJB,IIJE
+    CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, LLW3D(JIJ, JK), &
+                         PTHT(JIJ, JK), PPABST(JIJ, JK), PRHODREF(JIJ, JK), &                                       
+                         PEXN(JIJ, JK), ZW3D(JIJ, JK), ZT(JIJ, JK), &                                                           
+                         PRVT(JIJ, JK), &                                                                                 
+                         PCIT(JIJ, JK), ZZ_RVHENI(JIJ, JK))
+  ENDDO
+ENDDO
 DO JK = IKTB, IKTE
   DO JIJ=IIJB, IIJE
     ZZ_RVHENI(JIJ,JK) = MIN(PRVS(JIJ,JK), ZZ_RVHENI(JIJ,JK)/PTSTEP)
@@ -502,11 +511,76 @@ DO JK = IKTB, IKTE
 ENDDO
 !
 !
+!*       4.2    COMPUTES PRECIPITATION FRACTION
+!               -------------------------------
+!
+!The ICE4_RAINFR_VERT call was previously in ice4_tendencies to be computed again at each iteration.
+!The computation has been moved here to separate (for GPUs) the part of the code
+!where column computation can occur (here, alongside with the sedimentation) and
+!other routines where computation are only 0D (point by point).
+!This is not completly exact but we can think that the precipitation fraction
+!diagnostic does not evolve too much during a time-step.
+!ICE4_RAINFR_VERT needs the output of ICE4_COMPUTE_PDF; thus this routine
+!is called here but it's still called from within ice4_tendencies.
+IF (PARAMI%CSUBG_RC_RR_ACCR=='PRFR' .OR. PARAMI%CSUBG_RR_EVAP=='PRFR') THEN
+  IF (PARAMI%CSUBG_AUCV_RC=='PDF ' .AND. PARAMI%CSUBG_PR_PDF=='SIGM') THEN
+    DO JK = IKTB, IKTE                                                                                                                  
+      DO JIJ=IIJB, IIJE
+        ZSIGMA_RC(JIJ, JK)=PSIGS(JIJ, JK)**2
+      ENDDO
+    ENDDO
+  ENDIF
+  IF (PARAMI%CSUBG_AUCV_RC=='ADJU' .OR. PARAMI%CSUBG_AUCV_RI=='ADJU') THEN
+    DO JK = IKTB, IKTE                                                                                                                
+      DO JIJ=IIJB, IIJE
+        ZHLC_LRC(JIJ, JK) = ZWR(JIJ, JK, IRC) - PHLC_HRC(JIJ, JK)
+        ZHLI_LRI(JIJ, JK) = ZWR(JIJ, JK, IRI) - PHLI_HRI(JIJ, JK)
+        IF(ZWR(JIJ, JK, IRC)>0.) THEN
+          ZHLC_LCF(JIJ, JK) = PCLDFR(JIJ, JK)- PHLC_HCF(JIJ, JK)
+        ELSE
+          ZHLC_LCF(JIJ, JK)=0.
+        ENDIF
+        IF(ZWR(JIJ, JK, IRI)>0.) THEN
+          ZHLI_LCF(JIJ, JK) = PCLDFR(JIJ, JK)- PHLI_HCF(JIJ, JK)
+        ELSE
+          ZHLI_LCF(JIJ, JK)=0.
+        ENDIF
+      ENDDO
+    ENDDO
+  ENDIF
+  !We cannot use ZWR(:,:,IRC) which is not contiguous
+  CALL ICE4_COMPUTE_PDF(CST, ICEP, ICED, IIJT*(IKTE-IKTB+1), PARAMI%CSUBG_AUCV_RC, PARAMI%CSUBG_AUCV_RI, PARAMI%CSUBG_PR_PDF,&
+                        LLMICRO(:,:), PRHODREF(:,:), PRCT(:,:), PRIT(:,:), &
+                        PCLDFR(:,:), ZT(:,:), ZSIGMA_RC(:,:), &
+                        PHLC_HCF(:,:), ZHLC_LCF(:,:), PHLC_HRC(:,:), ZHLC_LRC(:,:), &
+                        PHLI_HCF(:,:), ZHLI_LCF(:,:), PHLI_HRI(:,:), ZHLI_LRI(:,:), &
+                        PRAINFR(:,:))
+!CALL ICE4_COMPUTE_PDF2D(D, CST, ICEP, ICED, PARAMI%CSUBG_AUCV_RC, PARAMI%CSUBG_AUCV_RI, PARAMI%CSUBG_PR_PDF, &
+!                        LLMICRO, PRHODREF, ZWR(:,:,IRC), ZWR(:,:,IRI), PCLDFR, ZT, ZSIGMA_RC,&
+!                            PHLC_HCF, ZHLC_LCF, PHLC_HRC, ZHLC_LRC, &
+!                            PHLI_HCF, ZHLI_LCF, PHLI_HRI, ZHLI_LRI, PRAINFR)
+  IF (PRESENT(PRHS)) THEN
+    CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR, ZWR(:,:,IRR), &
+                         &ZWR(:,:,IRS), ZWR(:,:,IRG), ZWR(:,:,IRH))
+  ELSE
+    CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR, ZWR(:,:,IRR), &
+                         &ZWR(:,:,IRS), ZWR(:,:,IRG)) 
+  ENDIF
+ELSE
+  PRAINFR(:,:)=1.
+ENDIF
+!
+!
 !*       5.     TENDENCIES COMPUTATION
 !               ----------------------
 !
 IF(PARAMI%LPACK_MICRO) THEN
-  ISIZE=COUNT(LLMICRO) ! Number of points with active microphysics
+  ISIZE=0
+  DO JK=1,D%NKT
+    DO JIJ=1,D%NIJT
+      IF(LLMICRO(JIJ,JK)) ISIZE=ISIZE+1 ! Number of points with active microphysics
+    END DO
+  END DO
   !PARAMI%NPROMICRO is the requested size for cache_blocking loop
   !IPROMA is the effective size
   !This parameter must be computed here because it is used for array dimensioning in ice4_pack
@@ -574,8 +648,10 @@ IF (OELEC) THEN
   ! RVHENI : ajout de prvheni ?
   ! traitement des deux termes extra ? irwetgh_mr et irsrimcg_mr ?
   IF (KRR == 7) THEN
-    CALL ELEC_TENDENCIES(D, KRR, IELEC, PTSTEP, GMASK_ELEC,                                   &
-                         PRHODREF, PRHODJ, ZT, PCIT,                                          &
+    CALL ELEC_TENDENCIES(D, CST, ICED, ICEP, ELECD, ELECP,                                    &
+                         KRR, IELEC, PTSTEP, GMASK_ELEC,                                      &
+                         BUCONF, TBUDGETS, KBUDGETS,                                          &
+                         HCLOUD, PTHVREFZIKB, PRHODREF, PRHODJ, ZT, PCIT,                     &
                          PRVT, PRCT, PRRT, PRIT, PRST, PRGT,                                  &
                          PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT,                          &
                          PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS,                          &
@@ -605,8 +681,10 @@ IF (OELEC) THEN
                          PRDRYHG=ZMICRO_TEND(:,:,IRDRYHG), PRHMLTR=ZMICRO_TEND(:,:,IRHMLTR),  &
                          PRHT=PRHT, PRHS=PRHS, PQHT=PQHT, PQHS=PQHS                       )
   ELSE
-    CALL ELEC_TENDENCIES(D, KRR, ISIZE, PTSTEP, LLMICRO,                                     &
-                         PRHODREF, PRHODJ, ZT, PCIT,                                         &
+    CALL ELEC_TENDENCIES(D, CST, ICED, ICEP, ELECD, ELECP,                                   &
+                         KRR, ISIZE, PTSTEP, LLMICRO,                                        &
+                         BUCONF, TBUDGETS, KBUDGETS,                                         &
+                         HCLOUD, PTHVREFZIKB, PRHODREF, PRHODJ, ZT, PCIT,                    &
                          PRVT, PRCT, PRRT, PRIT, PRST, PRGT,                                 &
                          PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT,                         &
                          PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS,                         &
@@ -732,7 +810,7 @@ END IF
 !
 IF(PARAMI%LSEDIM_AFTER) THEN
   CALL ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, ELECP, ELECD, BUCONF, &
-                         &OELEC, OSEDIM_BEARD, PTSTEP, KRR, PDZZ, &
+                         &OELEC, OSEDIM_BEARD, HCLOUD, PTSTEP, KRR, PDZZ, PTHVREFZIKB, &
                          &ZZ_LVFACT, ZZ_LSFACT, PRHODREF, PPABST, PTHT, ZT, PRHODJ, &
                          &PTHS, PRVS, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,&
                          &PINPRC, PINPRR, PINPRS, PINPRG, &
@@ -785,4 +863,6 @@ ENDIF
 
 IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 1, ZHOOK_HANDLE)
 !
+CONTAINS
+INCLUDE "ice4_nucleation.func.h"
 END SUBROUTINE RAIN_ICE
diff --git a/src/PHYEX/turb/modd_param_mfshalln.f90 b/src/PHYEX/turb/modd_param_mfshalln.f90
index 6c50a6fe6587be13a1ff4cb86289877e777c2e4e..a4724bcc176a2fc67855d781dc54eb89890da0d0 100644
--- a/src/PHYEX/turb/modd_param_mfshalln.f90
+++ b/src/PHYEX/turb/modd_param_mfshalln.f90
@@ -82,6 +82,7 @@ REAL          :: XGZ         !< Tuning of the surface initialisation for Grey Zo
 !
 LOGICAL       :: LTHETAS_MF      !< .TRUE. to use ThetaS1 instead of ThetaL
 REAL          :: XLAMBDA_MF      !< Thermodynamic parameter: Lambda to compute ThetaS1 from ThetaL
+LOGICAL       :: LVERLIMUP      !< .TRUE. to use correction on vertical limitation of updraft (issue #38 PHYEX)
 
 END TYPE PARAM_MFSHALL_t
 
@@ -119,13 +120,15 @@ REAL, POINTER          :: XR=>NULL()
 LOGICAL, POINTER       :: LTHETAS_MF=>NULL()
 REAL, POINTER          :: XLAMBDA_MF=>NULL() 
 LOGICAL, POINTER       :: LGZ=>NULL() 
-REAL, POINTER          :: XGZ=>NULL() 
+REAL, POINTER          :: XGZ=>NULL()
+LOGICAL, POINTER       :: LVERLIMUP=>NULL() 
 !
 NAMELIST/NAM_PARAM_MFSHALLn/XIMPL_MF,CMF_UPDRAFT,CMF_CLOUD,LMIXUV,LMF_FLX,&
                             XALP_PERT,XABUO,XBENTR,XBDETR,XCMF,XENTR_MF,&
                             XCRAD_MF,XENTR_DRY,XDETR_DRY,XDETR_LUP,XKCF_MF,&
                             XKRC_MF,XTAUSIGMF,XPRES_UV,XALPHA_MF,XSIGMA_MF,&
-                            XFRAC_UP_MAX,XA1,XB,XC,XBETA1,XR,LTHETAS_MF,LGZ,XGZ
+                            XFRAC_UP_MAX,XA1,XB,XC,XBETA1,XR,LTHETAS_MF,LGZ,XGZ,&
+                            LVERLIMUP
 !
 !-------------------------------------------------------------------------------
 !
@@ -176,6 +179,7 @@ LTHETAS_MF=>PARAM_MFSHALL_MODEL(KTO)%LTHETAS_MF
 XLAMBDA_MF=>PARAM_MFSHALL_MODEL(KTO)%XLAMBDA_MF
 LGZ=>PARAM_MFSHALL_MODEL(KTO)%LGZ
 XGZ=>PARAM_MFSHALL_MODEL(KTO)%XGZ
+LVERLIMUP=>PARAM_MFSHALL_MODEL(KTO)%LVERLIMUP
 !
 ENDIF
 !
@@ -285,6 +289,8 @@ IF(LLDEFAULTVAL) THEN
   XLAMBDA_MF=0.
   LGZ=.FALSE.
   XGZ=1.83 ! between 1.83 and 1.33
+  LVERLIMUP=.FALSE.
+  IF(HPROGRAM=='MESONH') LVERLIMUP=.TRUE.
 ENDIF
 !
 !*      2. NAMELIST
diff --git a/src/PHYEX/turb/modd_turbn.f90 b/src/PHYEX/turb/modd_turbn.f90
index a3f2c6e9df4054b8b84a257cb31d1d5b27f8be5c..ef3ad4cbe1da3b08d6e7aca87a58f73b0079519e 100644
--- a/src/PHYEX/turb/modd_turbn.f90
+++ b/src/PHYEX/turb/modd_turbn.f90
@@ -122,6 +122,7 @@ REAL               :: XCEI_MAX  !< maximum threshold for the instability index C
                                      !(beginning of the saturation of the amplification)
 REAL, DIMENSION(:,:,:), POINTER  :: XCEI !< Cloud Entrainment instability index to emphasize localy 
                                          ! turbulent fluxes
+  LOGICAL            :: LTURB_PRECIP ! switch to apply turbulence to precipitating hydrometeor mixing ratios
 
 !  
 END TYPE TURB_t
@@ -180,6 +181,7 @@ REAL, POINTER :: XCOEF_AMPL_SAT=>NULL()
 REAL, POINTER :: XCEI_MIN=>NULL()
 REAL, POINTER :: XCEI_MAX =>NULL()
 REAL, DIMENSION(:,:,:), POINTER  :: XCEI=>NULL()
+LOGICAL, POINTER :: LTURB_PRECIP=>NULL()
 !
 NAMELIST/NAM_TURBn/XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG,  &
                    LSIG_CONV,LRMC01,CTOM,&
@@ -188,7 +190,7 @@ NAMELIST/NAM_TURBn/XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG,  &
                    XALTHGRAD, XCLDTHOLD, XLINI, LHARAT, &
                    LPROJQITURB, LSMOOTH_PRANDTL, XMINSIGS, NTURBSPLIT, &
                    LCLOUDMODIFLM, CTURBLEN_CLOUD, &
-                   XCOEF_AMPL_SAT, XCEI_MIN, XCEI_MAX
+                   XCOEF_AMPL_SAT, XCEI_MIN, XCEI_MAX, LTURB_PRECIP
 !
 !-------------------------------------------------------------------------------
 !
@@ -276,6 +278,7 @@ XCOEF_AMPL_SAT=>TURB_MODEL(KTO)%XCOEF_AMPL_SAT
 XCEI_MIN=>TURB_MODEL(KTO)%XCEI_MIN
 XCEI_MAX =>TURB_MODEL(KTO)%XCEI_MAX
 XCEI=>TURB_MODEL(KTO)%XCEI
+LTURB_PRECIP=>TURB_MODEL(KTO)%LTURB_PRECIP
 !
 ENDIF
 !
@@ -386,6 +389,7 @@ IF(LLDEFAULTVAL) THEN
   XCOEF_AMPL_SAT = 5.
   XCEI_MIN = 0.001E-06
   XCEI_MAX = 0.01E-06
+  LTURB_PRECIP =.FALSE.
   !
   IF(HPROGRAM=='AROME') THEN
     XTKEMIN=1.E-6
diff --git a/src/PHYEX/turb/mode_bl_depth_diag.f90 b/src/PHYEX/turb/mode_bl_depth_diag.f90
index 8d91826c43e86f086f655bab19ede5b561a3c616..2cae3a3fe2cf48cfd1f0a9a4d55c52b57abde3cf 100644
--- a/src/PHYEX/turb/mode_bl_depth_diag.f90
+++ b/src/PHYEX/turb/mode_bl_depth_diag.f90
@@ -84,18 +84,19 @@ BL_DEPTH_DIAG3D(:) = 0.
 !
 
 DO JIJ=IIJB,IIJE
-    IF (PSURF(JIJ)==0.) CYCLE
+    IF (PSURF(JIJ)/=0.) THEN
     DO JK=IKB,IKE,IKL
-      IF (PZZ(JIJ,JK-IKL)<=PZS(JIJ)) CYCLE
-      ZFLX = PSURF(JIJ) * PFTOP_O_FSURF
-      IF ( (PFLUX(JIJ,JK)-ZFLX)*(PFLUX(JIJ,JK-IKL)-ZFLX) <= 0. ) THEN
-        BL_DEPTH_DIAG3D(JIJ) = (PZZ  (JIJ,JK-IKL) - PZS(JIJ))     &
+      IF (PZZ(JIJ,JK-IKL)>PZS(JIJ)) THEN
+        ZFLX = PSURF(JIJ) * PFTOP_O_FSURF
+        IF ( (PFLUX(JIJ,JK)-ZFLX)*(PFLUX(JIJ,JK-IKL)-ZFLX) <= 0. ) THEN
+          BL_DEPTH_DIAG3D(JIJ) = (PZZ  (JIJ,JK-IKL) - PZS(JIJ))     &
                          + (PZZ  (JIJ,JK) - PZZ  (JIJ,JK-IKL))    &
                          * (ZFLX          - PFLUX(JIJ,JK-IKL)  )  &
                          / (PFLUX(JIJ,JK) - PFLUX(JIJ,JK-IKL)   )
-        EXIT
+        END IF
       END IF
     END DO
+  END IF
 END DO
 !
 !$mnh_expand_array(JIJ=IIJB:IIJE)
diff --git a/src/PHYEX/turb/mode_compute_bl89_ml.f90 b/src/PHYEX/turb/mode_compute_bl89_ml.f90
index 8ebf242e6e46eb0cc03322a68d8e5cead996cbca..47f3e4be5958c15f217726075ab7ea37a2489690 100644
--- a/src/PHYEX/turb/mode_compute_bl89_ml.f90
+++ b/src/PHYEX/turb/mode_compute_bl89_ml.f90
@@ -77,7 +77,6 @@ REAL, DIMENSION(D%NIJT,D%NKT) :: ZDELTVPT,ZHLVPT
                       !Virtual Potential Temp at Half level and DeltaThv between
                       !2 mass levels
 
-INTEGER :: J1D                  !horizontal loop counter
 INTEGER :: JKK                  !loop counters
 INTEGER :: JIJ, JK
 INTEGER :: IIJB,IIJE ! physical horizontal domain indices
@@ -132,32 +131,32 @@ IF (OUPORDN.EQV..TRUE.) THEN
    ZVPT_DEP(:)=ZHLVPT(:,KK) ! departure point is on flux level
    !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    !We must compute what happens between flux level KK and mass level KK
-   DO J1D=IIJB,IIJE
-     ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) ! test if there's energy to consume
+   DO JIJ=IIJB,IIJE
+     ZTEST0=0.5+SIGN(0.5,ZINTE(JIJ)) ! test if there's energy to consume
      ! Energy consumed if parcel cross the entire layer
-     ZPOTE(J1D) = ZTEST0*(PG_O_THVREF(J1D)      *      &
-         (0.5*(ZHLVPT(J1D,KK)+ PVPT(J1D,KK)) - ZVPT_DEP(J1D)) + &
-         CSTURB%XRM17*PSHEAR(J1D,KK)*SQRT(ABS(PTKEM_DEP(J1D))))  * &
-         PDZZ2D(J1D,KK)*0.5
+     ZPOTE(JIJ) = ZTEST0*(PG_O_THVREF(JIJ)      *      &
+         (0.5*(ZHLVPT(JIJ,KK)+ PVPT(JIJ,KK)) - ZVPT_DEP(JIJ)) + &
+         CSTURB%XRM17*PSHEAR(JIJ,KK)*SQRT(ABS(PTKEM_DEP(JIJ))))  * &
+         PDZZ2D(JIJ,KK)*0.5
      ! Test if it rests some energy to consume
-     ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D))
+     ZTEST =0.5+SIGN(0.5,ZINTE(JIJ)-ZPOTE(JIJ))
      ! Length travelled by parcel if it rests energy to consume
-     ZLWORK1(J1D)=PDZZ2D(J1D,KK)*0.5
+     ZLWORK1(JIJ)=PDZZ2D(JIJ,KK)*0.5
      ! Lenght travelled by parcel to nullify energy
-     ZLWORK2(J1D)=        ( - PG_O_THVREF(J1D) *                     &
-            (  ZHLVPT(J1D,KK) - ZVPT_DEP(J1D) )                              &
-            - CSTURB%XRM17*PSHEAR(J1D,KK)*SQRT(ABS(PTKEM_DEP(J1D))) &
+     ZLWORK2(JIJ)=        ( - PG_O_THVREF(JIJ) *                     &
+            (  ZHLVPT(JIJ,KK) - ZVPT_DEP(JIJ) )                              &
+            - CSTURB%XRM17*PSHEAR(JIJ,KK)*SQRT(ABS(PTKEM_DEP(JIJ))) &
           + SQRT (ABS(                                                       &
-            (CSTURB%XRM17*PSHEAR(J1D,KK)*SQRT(ABS(PTKEM_DEP(J1D))) +  &
-             PG_O_THVREF(J1D) * (ZHLVPT(J1D,KK) - ZVPT_DEP(J1D)) )**2  &
-            + 2. * ZINTE(J1D) * PG_O_THVREF(J1D)                        &
-                 * ZDELTVPT(J1D,KK) / PDZZ2D(J1D,KK) ))    ) /             &
-        ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,KK) / PDZZ2D(J1D,KK) ) 
+            (CSTURB%XRM17*PSHEAR(JIJ,KK)*SQRT(ABS(PTKEM_DEP(JIJ))) +  &
+             PG_O_THVREF(JIJ) * (ZHLVPT(JIJ,KK) - ZVPT_DEP(JIJ)) )**2  &
+            + 2. * ZINTE(JIJ) * PG_O_THVREF(JIJ)                        &
+                 * ZDELTVPT(JIJ,KK) / PDZZ2D(JIJ,KK) ))    ) /             &
+        ( PG_O_THVREF(JIJ) * ZDELTVPT(JIJ,KK) / PDZZ2D(JIJ,KK) ) 
       ! Effective length travelled by parcel
-      PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+  &
-                                    (1-ZTEST)*ZLWORK2(J1D))
+      PLWORK(JIJ)=PLWORK(JIJ)+ZTEST0*(ZTEST*ZLWORK1(JIJ)+  &
+                                    (1-ZTEST)*ZLWORK2(JIJ))
       ! Rest of energy to consume
-      ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D)
+      ZINTE(JIJ) = ZINTE(JIJ) - ZPOTE(JIJ)
    ENDDO
  ELSE
    !$mnh_expand_array(JIJ=IIJB:IIJE)
@@ -168,28 +167,28 @@ IF (OUPORDN.EQV..TRUE.) THEN
  DO JKK=KK+IKL,IKE,IKL
     IF(ZTESTM > 0.) THEN
       ZTESTM=0
-      DO J1D=IIJB,IIJE
-        ZTEST0=0.5+SIGN(0.5,ZINTE(J1D))
-        ZPOTE(J1D) = ZTEST0*(PG_O_THVREF(J1D)      *      &
-            (ZHLVPT(J1D,JKK) - ZVPT_DEP(J1D))   &
-           + CSTURB%XRM17*PSHEAR(J1D,JKK)*SQRT(ABS(PTKEM_DEP(J1D))))* PDZZ2D(J1D,JKK) 
-        ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D))
+      DO JIJ=IIJB,IIJE
+        ZTEST0=0.5+SIGN(0.5,ZINTE(JIJ))
+        ZPOTE(JIJ) = ZTEST0*(PG_O_THVREF(JIJ)      *      &
+            (ZHLVPT(JIJ,JKK) - ZVPT_DEP(JIJ))   &
+           + CSTURB%XRM17*PSHEAR(JIJ,JKK)*SQRT(ABS(PTKEM_DEP(JIJ))))* PDZZ2D(JIJ,JKK) 
+        ZTEST =0.5+SIGN(0.5,ZINTE(JIJ)-ZPOTE(JIJ))
         ZTESTM=ZTESTM+ZTEST0
-        ZLWORK1(J1D)=PDZZ2D(J1D,JKK)
+        ZLWORK1(JIJ)=PDZZ2D(JIJ,JKK)
         !ZLWORK2 jump of the last reached level
-        ZLWORK2(J1D)=        ( - PG_O_THVREF(J1D) *                     &
-            (  PVPT(J1D,JKK-IKL) - ZVPT_DEP(J1D) )                              &
-            - CSTURB%XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) &
+        ZLWORK2(JIJ)=        ( - PG_O_THVREF(JIJ) *                     &
+            (  PVPT(JIJ,JKK-IKL) - ZVPT_DEP(JIJ) )                              &
+            - CSTURB%XRM17*PSHEAR(JIJ,JKK)*sqrt(abs(PTKEM_DEP(JIJ))) &
           + SQRT (ABS(                                                   &
-            (CSTURB%XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) +  &
-             PG_O_THVREF(J1D) * (PVPT(J1D,JKK-IKL) - ZVPT_DEP(J1D)) )**2  &
-            + 2. * ZINTE(J1D) * PG_O_THVREF(J1D)                        &
-                 * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ))    ) /             &
-        ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ) 
+            (CSTURB%XRM17*PSHEAR(JIJ,JKK)*sqrt(abs(PTKEM_DEP(JIJ))) +  &
+             PG_O_THVREF(JIJ) * (PVPT(JIJ,JKK-IKL) - ZVPT_DEP(JIJ)) )**2  &
+            + 2. * ZINTE(JIJ) * PG_O_THVREF(JIJ)                        &
+                 * ZDELTVPT(JIJ,JKK) / PDZZ2D(JIJ,JKK) ))    ) /             &
+        ( PG_O_THVREF(JIJ) * ZDELTVPT(JIJ,JKK) / PDZZ2D(JIJ,JKK) ) 
       !
-        PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+  &
-                                    (1-ZTEST)*ZLWORK2(J1D))
-        ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D)
+        PLWORK(JIJ)=PLWORK(JIJ)+ZTEST0*(ZTEST*ZLWORK1(JIJ)+  &
+                                    (1-ZTEST)*ZLWORK2(JIJ))
+        ZINTE(JIJ) = ZINTE(JIJ) - ZPOTE(JIJ)
       END DO 
     ENDIF
   END DO 
@@ -209,27 +208,27 @@ IF (OUPORDN.EQV..FALSE.) THEN
  DO JKK=KK,IKB,-IKL
     IF(ZTESTM > 0.) THEN
       ZTESTM=0
-      DO J1D=IIJB,IIJE
-        ZTEST0=0.5+SIGN(0.5,ZINTE(J1D))
-         ZPOTE(J1D) = ZTEST0*(-PG_O_THVREF(J1D)      *      &
-            (ZHLVPT(J1D,JKK) - PVPT(J1D,KK)) &
-         + CSTURB%XRM17*PSHEAR(J1D,JKK)*SQRT(ABS(PTKEM_DEP(J1D))))* PDZZ2D(J1D,JKK) 
-        ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D))
+      DO JIJ=IIJB,IIJE
+        ZTEST0=0.5+SIGN(0.5,ZINTE(JIJ))
+         ZPOTE(JIJ) = ZTEST0*(-PG_O_THVREF(JIJ)      *      &
+            (ZHLVPT(JIJ,JKK) - PVPT(JIJ,KK)) &
+         + CSTURB%XRM17*PSHEAR(JIJ,JKK)*SQRT(ABS(PTKEM_DEP(JIJ))))* PDZZ2D(JIJ,JKK) 
+        ZTEST =0.5+SIGN(0.5,ZINTE(JIJ)-ZPOTE(JIJ))
         ZTESTM=ZTESTM+ZTEST0
-        ZLWORK1(J1D)=PDZZ2D(J1D,JKK)
-        ZLWORK2(J1D)=        ( + PG_O_THVREF(J1D) *                     &
-            (  PVPT(J1D,JKK) - PVPT(J1D,KK) )                              &
-             -CSTURB%XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) &
+        ZLWORK1(JIJ)=PDZZ2D(JIJ,JKK)
+        ZLWORK2(JIJ)=        ( + PG_O_THVREF(JIJ) *                     &
+            (  PVPT(JIJ,JKK) - PVPT(JIJ,KK) )                              &
+             -CSTURB%XRM17*PSHEAR(JIJ,JKK)*sqrt(abs(PTKEM_DEP(JIJ))) &
           + SQRT (ABS(                                                       &
-            (CSTURB%XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) - &
-             PG_O_THVREF(J1D) * (PVPT(J1D,JKK) - PVPT(J1D,KK)) )**2  &
-            + 2. * ZINTE(J1D) * PG_O_THVREF(J1D)                        &
-                 * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ))    ) /             &
-        ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ) 
+            (CSTURB%XRM17*PSHEAR(JIJ,JKK)*sqrt(abs(PTKEM_DEP(JIJ))) - &
+             PG_O_THVREF(JIJ) * (PVPT(JIJ,JKK) - PVPT(JIJ,KK)) )**2  &
+            + 2. * ZINTE(JIJ) * PG_O_THVREF(JIJ)                        &
+                 * ZDELTVPT(JIJ,JKK) / PDZZ2D(JIJ,JKK) ))    ) /             &
+        ( PG_O_THVREF(JIJ) * ZDELTVPT(JIJ,JKK) / PDZZ2D(JIJ,JKK) ) 
       !
-        PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+  &
-                                    (1-ZTEST)*ZLWORK2(J1D)) 
-        ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D)
+        PLWORK(JIJ)=PLWORK(JIJ)+ZTEST0*(ZTEST*ZLWORK1(JIJ)+  &
+                                    (1-ZTEST)*ZLWORK2(JIJ)) 
+        ZINTE(JIJ) = ZINTE(JIJ) - ZPOTE(JIJ)
       END DO 
     ENDIF
   END DO 
diff --git a/src/PHYEX/turb/mode_compute_mf_cloud.f90 b/src/PHYEX/turb/mode_compute_mf_cloud.f90
index a9a6d456848a4ccfc3ed64fa2c5798c134574f2e..be31aef002ab4c5994fde856e3246378f12096ab 100644
--- a/src/PHYEX/turb/mode_compute_mf_cloud.f90
+++ b/src/PHYEX/turb/mode_compute_mf_cloud.f90
@@ -117,10 +117,10 @@ REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
 IF (LHOOK) CALL DR_HOOK('COMPUTE_MF_CLOUD',0,ZHOOK_HANDLE)
 !
 !                     2.1 Internal domain
-PRC_MF = 0.
-PRI_MF = 0.
-PCF_MF = 0.
-PSIGMF = 0.
+PRC_MF(:,:) = 0.
+PRI_MF(:,:) = 0.
+PCF_MF(:,:) = 0.
+PSIGMF(:,:) = 0.
 
 IF (PARAMMF%CMF_CLOUD == 'DIRE') THEN
   !Direct cloud scheme
diff --git a/src/PHYEX/turb/mode_compute_updraft.f90 b/src/PHYEX/turb/mode_compute_updraft.f90
index 810cb023091493b45d8985171b38932395252e92..41ff952bd1df21ab670a3c0eab7ae85a89448ab6 100644
--- a/src/PHYEX/turb/mode_compute_updraft.f90
+++ b/src/PHYEX/turb/mode_compute_updraft.f90
@@ -190,7 +190,7 @@ REAL  :: ZTMAX,ZRMAX  ! control value
 REAL, DIMENSION(D%NIJT) :: ZSURF
 REAL, DIMENSION(D%NIJT,D%NKT) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear
 !
-REAL, DIMENSION(D%NIJT,D%NKT) :: ZWK
+REAL, DIMENSION(D%NIJT,D%NKT) :: ZWK, KDEPTH
 REAL, DIMENSION(D%NIJT,16) :: ZBUF
 !
 REAL(KIND=JPHOOK) :: ZHOOK_HANDLE
@@ -446,7 +446,10 @@ GTESTETL(:)=.FALSE.
 DO JK=IKB,IKE-IKL,IKL
 
   ! IF the updraft top is reached for all column, stop the loop on levels
-  ITEST=COUNT(GTEST(:))
+  ITEST=0
+  DO JIJ=IIJB,IIJE
+    IF(GTEST(JIJ)) ITEST = ITEST + 1
+  END DO
   IF (ITEST==0) CYCLE
 
   !       Computation of entrainment and detrainment with KF90
@@ -588,33 +591,38 @@ DO JK=IKB,IKE-IKL,IKL
       PRSAT_UP(:,JK+IKL) = ZRSATW(:)*(1-PFRAC_ICE_UP(:,JK+IKL)) + &
                                      & ZRSATI(:)*PFRAC_ICE_UP(:,JK+IKL)
     ENDWHERE
-
+    !$mnh_end_expand_where(JIJ=IIJB:IIJE)
     ! Compute the updraft theta_v, buoyancy and w**2 for level JK+KKL
-    WHERE(GTEST(:))
-      PTHV_UP(:,JK+IKL) = ZTH_UP(:,JK+IKL)* &
-                                    & ((1+ZRVORD*PRV_UP(:,JK+IKL))/(1+PRT_UP(:,JK+IKL)))
-      WHERE (ZBUO_INTEG_DRY(:,JK)>0.)
-        ZW_UP2(:,JK+IKL)  = ZW_UP2(:,JK) + 2.*(PARAMMF%XABUO-PARAMMF%XBENTR*PARAMMF%XENTR_DRY)* &
-                                                                &ZBUO_INTEG_DRY(:,JK)
-      ELSEWHERE
-        ZW_UP2(:,JK+IKL)  = ZW_UP2(:,JK) + 2.*PARAMMF%XABUO* ZBUO_INTEG_DRY(:,JK)
-      ENDWHERE
-      ZW_UP2(:,JK+IKL)  = ZW_UP2(:,JK+IKL)*(1.-(PARAMMF%XBDETR*ZMIX3_CLD(:)+ &
-                                                                       &PARAMMF%XBENTR*ZMIX2_CLD(:)))&
-              /(1.+(PARAMMF%XBDETR*ZMIX3_CLD(:)+PARAMMF%XBENTR*ZMIX2_CLD(:))) &
-              +2.*(PARAMMF%XABUO)*ZBUO_INTEG_CLD(:,JK)/ &
-              &(1.+(PARAMMF%XBDETR*ZMIX3_CLD(:)+PARAMMF%XBENTR*ZMIX2_CLD(:)))
-    ENDWHERE
+  DO JIJ=IIJB,IIJE
+    IF(GTEST(JIJ)) THEN
+      PTHV_UP(JIJ,JK+IKL) = ZTH_UP(JIJ,JK+IKL)* &
+                                    & ((1+ZRVORD*PRV_UP(JIJ,JK+IKL))/(1+PRT_UP(JIJ,JK+IKL)))
+      IF (ZBUO_INTEG_DRY(JIJ,JK)>0.) THEN
+        ZW_UP2(JIJ,JK+IKL)  = ZW_UP2(JIJ,JK) + 2.*(PARAMMF%XABUO-PARAMMF%XBENTR*PARAMMF%XENTR_DRY)* &
+                                                                &ZBUO_INTEG_DRY(JIJ,JK)
+      ELSE
+        ZW_UP2(JIJ,JK+IKL)  = ZW_UP2(JIJ,JK) + 2.*PARAMMF%XABUO* ZBUO_INTEG_DRY(JIJ,JK)
+      END IF
+      ZW_UP2(JIJ,JK+IKL)  = ZW_UP2(JIJ,JK+IKL)*(1.-(PARAMMF%XBDETR*ZMIX3_CLD(JIJ)+ &
+                                                                       &PARAMMF%XBENTR*ZMIX2_CLD(JIJ)))&
+              /(1.+(PARAMMF%XBDETR*ZMIX3_CLD(JIJ)+PARAMMF%XBENTR*ZMIX2_CLD(JIJ))) &
+              +2.*(PARAMMF%XABUO)*ZBUO_INTEG_CLD(JIJ,JK)/ &
+              &(1.+(PARAMMF%XBDETR*ZMIX3_CLD(JIJ)+PARAMMF%XBENTR*ZMIX2_CLD(JIJ)))
+    END IF
+  END DO
 
     ! Test if the updraft has reach the ETL
+    !$mnh_expand_where(JIJ=IIJB:IIJE)
     WHERE (GTEST(:).AND.(PBUO_INTEG(:,JK)<=0.))
       KKETL(:) = JK+IKL
       GTESTETL(:)=.TRUE.
     ELSEWHERE
       GTESTETL(:)=.FALSE.
     ENDWHERE
+    !$mnh_end_expand_where(JIJ=IIJB:IIJE)
 
     ! Test is we have reached the top of the updraft
+    !$mnh_expand_where(JIJ=IIJB:IIJE)
     WHERE (GTEST(:).AND.((ZW_UP2(:,JK+IKL)<=0.).OR.(PEMF(:,JK+IKL)<=0.)))
         ZW_UP2(:,JK+IKL)=0.
         PEMF(:,JK+IKL)=0.
@@ -628,28 +636,36 @@ DO JK=IKB,IKE-IKL,IKL
         PFRAC_UP(:,JK+IKL)=0.
         KKCTL(:)=JK+IKL
     ENDWHERE
+    !$mnh_end_expand_where(JIJ=IIJB:IIJE)
  
     ! compute frac_up at JK+KKL
+    !$mnh_expand_where(JIJ=IIJB:IIJE)
     WHERE (GTEST(:))
       PFRAC_UP(:,JK+IKL)=PEMF(:,JK+IKL)/&
                                       &(SQRT(ZW_UP2(:,JK+IKL))*ZRHO_F(:,JK+IKL))
     ENDWHERE
+    !$mnh_end_expand_where(JIJ=IIJB:IIJE)
 
     ! Updraft fraction must be smaller than XFRAC_UP_MAX
+    !$mnh_expand_where(JIJ=IIJB:IIJE)
     WHERE (GTEST(:))
       PFRAC_UP(:,JK+IKL)=MIN(PARAMMF%XFRAC_UP_MAX,PFRAC_UP(:,JK+IKL))
     ENDWHERE
+    !$mnh_end_expand_where(JIJ=IIJB:IIJE)
 
     ! When cloudy and non-buoyant, updraft fraction must decrease
+    !$mnh_expand_where(JIJ=IIJB:IIJE)
     WHERE ((GTEST(:).AND.GTESTETL(:)).AND.GTESTLCL(:))
       PFRAC_UP(:,JK+IKL)=MIN(PFRAC_UP(:,JK+IKL),PFRAC_UP(:,JK))
     ENDWHERE
+    !$mnh_end_expand_where(JIJ=IIJB:IIJE)
 
     ! Mass flux is updated with the new updraft fraction
+
+    !$mnh_expand_array(JIJ=IIJB:IIJE)
     IF (OENTR_DETR) PEMF(:,JK+IKL)=PFRAC_UP(:,JK+IKL)*SQRT(ZW_UP2(:,JK+IKL))* &
                                               &ZRHO_F(:,JK+IKL)
-    !$mnh_end_expand_where(JIJ=IIJB:IIJE)
-
+    !$mnh_end_expand_array(JIJ=IIJB:IIJE)
   END IF !OENTR_DETR
 ENDDO
 
@@ -672,14 +688,24 @@ IF(OENTR_DETR) THEN
   DO JIJ=IIJB,IIJE
      PDEPTH(JIJ) = MAX(0., PZZ(JIJ,KKCTL(JIJ)) -  PZZ(JIJ,KKLCL(JIJ)) )
   END DO
-
+  IF(PARAMMF%LVERLIMUP) THEN
+    DO JK=1,IKT
+      DO JIJ=IIJB,IIJE
+        KDEPTH(JIJ,JK) = MIN(MAX(0., PZZ(JIJ,JK) -  PZZ(JIJ,KKLCL(JIJ)) ), PDEPTH(JIJ))
+      END DO
+    END DO
+  END IF
   !$mnh_expand_array(JIJ=IIJB:IIJE)
   GWORK1(:)= (GTESTLCL(:) .AND. (PDEPTH(:) > ZDEPTH_MAX1) )
   !$mnh_end_expand_array(JIJ=IIJB:IIJE)
   DO JK=1,IKT
     !$mnh_expand_array(JIJ=IIJB:IIJE)
     GWORK2(:,JK) = GWORK1(:)
-    ZCOEF(:,JK) = (1.-(PDEPTH(:)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1))
+    IF(PARAMMF%LVERLIMUP) THEN
+      ZCOEF(:,JK) = (1.-(KDEPTH(:,JK)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1))
+    ELSE
+      ZCOEF(:,JK) = (1.-(PDEPTH(:)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1))
+    END IF
     ZCOEF(:,JK)=MIN(MAX(ZCOEF(:,JK),0.),1.)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE)
   ENDDO
@@ -693,8 +719,6 @@ ENDIF
 
 IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT',1,ZHOOK_HANDLE)
 CONTAINS
-INCLUDE "th_r_from_thl_rt.func.h"
-INCLUDE "compute_frac_ice.func.h"
           SUBROUTINE COMPUTE_ENTR_DETR(D, CST, NEBN, PARAMMF,&
                             KK,KKB,KKE,KKL,OTEST,OTESTLCL,&
                             PFRAC_ICE,PRHODREF,&
@@ -1104,6 +1128,8 @@ DO JIJ=IIJB,IIJE
 ENDDO
 
 END SUBROUTINE COMPUTE_ENTR_DETR
+INCLUDE "th_r_from_thl_rt.func.h"
+INCLUDE "compute_frac_ice.func.h"
 END SUBROUTINE COMPUTE_UPDRAFT
 END MODULE MODE_COMPUTE_UPDRAFT
 
diff --git a/src/PHYEX/turb/mode_compute_updraft_raha.f90 b/src/PHYEX/turb/mode_compute_updraft_raha.f90
index 9eb868cc8664947d4a6196cb2a6d52d1dacb344b..25e1f32a4dbfe82b01857a9ba4b8dc4a72538c87 100644
--- a/src/PHYEX/turb/mode_compute_updraft_raha.f90
+++ b/src/PHYEX/turb/mode_compute_updraft_raha.f90
@@ -581,27 +581,25 @@ PEMF(:,IKB+IKL) = ZRHO_F(:,IKB+IKL)*PFRAC_UP(:,IKB+IKL)* &
 !$mnh_end_expand_where(JIJ=IIJB:IIJE)
 
 DO JK=IKB+IKL,IKE-IKL,IKL !  Vertical loop
-  !$mnh_expand_where(JIJ=IIJB:IIJE)
-     
-  GTEST(:) = (ZW_UP2(:,JK) > ZEPS)  
-
-  WHERE (GTEST(:))
-    WHERE(JK<IALIM(:))
-      PEMF(:,JK+IKL) = MAX(0.,PEMF(:,JK) + ZPHI(:)*ZZDZ(:,JK)* &
-                                                                & (PENTR(:,JK) - PDETR(:,JK)))
-    ELSEWHERE
-      ZMIX1(:)=ZZDZ(:,JK)*(PENTR(:,JK)-PDETR(:,JK))
-      PEMF(:,JK+IKL)=PEMF(:,JK)*EXP(ZMIX1(:))
-    ENDWHERE
-
-! Updraft fraction must be smaller than XFRAC_UP_MAX
-    PFRAC_UP(:,JK+IKL)=PEMF(:,JK+IKL)/&
-                                    &(SQRT(ZW_UP2(:,JK+IKL))*ZRHO_F(:,JK+IKL))
-    PFRAC_UP(:,JK+IKL)=MIN(PARAMMF%XFRAC_UP_MAX,PFRAC_UP(:,JK+IKL))
-    PEMF(:,JK+IKL) = ZRHO_F(:,JK+IKL)*PFRAC_UP(:,JK+IKL)*&
-                                 & SQRT(ZW_UP2(:,JK+IKL))
-  ENDWHERE
-  !$mnh_end_expand_where(JIJ=IIJB:IIJE)
+  DO JIJ=IIJB,IIJE
+    GTEST(JIJ) = (ZW_UP2(JIJ,JK) > ZEPS)  
+    IF(GTEST(JIJ)) THEN
+      IF(JK<IALIM(JIJ)) THEN
+      PEMF(JIJ,JK+IKL) = MAX(0.,PEMF(JIJ,JK) + ZPHI(JIJ)*ZZDZ(JIJ,JK)* &
+                                                                & (PENTR(JIJ,JK) - PDETR(JIJ,JK)))
+    ELSE
+      ZMIX1(JIJ)=ZZDZ(JIJ,JK)*(PENTR(JIJ,JK)-PDETR(JIJ,JK))
+      PEMF(JIJ,JK+IKL)=PEMF(JIJ,JK)*EXP(ZMIX1(JIJ))
+    END IF
+
+    ! Updraft fraction must be smaller than XFRAC_UP_MAX
+    PFRAC_UP(JIJ,JK+IKL)=PEMF(JIJ,JK+IKL)/&
+                                    &(SQRT(ZW_UP2(JIJ,JK+IKL))*ZRHO_F(JIJ,JK+IKL))
+    PFRAC_UP(JIJ,JK+IKL)=MIN(PARAMMF%XFRAC_UP_MAX,PFRAC_UP(JIJ,JK+IKL))
+    PEMF(JIJ,JK+IKL) = ZRHO_F(JIJ,JK+IKL)*PFRAC_UP(JIJ,JK+IKL)*&
+                                 & SQRT(ZW_UP2(JIJ,JK+IKL))
+  END IF
+ END DO
 ENDDO
 
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
diff --git a/src/PHYEX/turb/mode_emoist.f90 b/src/PHYEX/turb/mode_emoist.f90
index 2ea9b0a80c76943e47c687a2168d024797c45d75..91e02042e8d3cfbd5d2c143df8db8f16bff12e0a 100644
--- a/src/PHYEX/turb/mode_emoist.f90
+++ b/src/PHYEX/turb/mode_emoist.f90
@@ -106,17 +106,17 @@ IKT=D%NKT
 !
 IF (OOCEAN) THEN
  IF ( KRR == 0 ) THEN                                ! Unsalted
-  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    PEMOIST(:,:) = 0.
-  !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
  ELSE
    !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
    PEMOIST(:,:) = 1.                              ! Salted case
    !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
  END IF
-!
+ !
 ELSE
-!
+ !
  IF ( KRR == 0 ) THEN                                ! dry case
    PEMOIST(:,:) = 0.
  ELSE IF ( KRR == 1 ) THEN                           ! only vapor
@@ -127,7 +127,7 @@ ELSE
  ELSE                                                ! liquid water & ice present
   ZDELTA = (CST%XRV/CST%XRD) - 1.
   ZRW(:,:) = PRM(:,:,1)
-!
+  !
   IF ( KRRI>0) THEN  ! rc and ri case
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZRW(:,:) = ZRW(:,:) + PRM(:,:,3)
@@ -142,12 +142,12 @@ ELSE
               (1.+ZDELTA) * (PRM(:,:,1) - PRM(:,:,2) - PRM(:,:,4)) &
               -ZRW(:,:)                                                &
                      )  /  (1. + ZRW(:,:)) 
-  !
-  !   Emoist = ZB + ZC * Amoist
-  !   ZB is computed from line 1 to line 2
-  !   ZC is computed from line 3 to line 5
-  !   Amoist* 2 * SRC is computed at line 6
-  !
+    !
+    !   Emoist = ZB + ZC * Amoist
+    !   ZB is computed from line 1 to line 2
+    !   ZC is computed from line 3 to line 5
+    !   Amoist* 2 * SRC is computed at line 6
+    !
     PEMOIST(:,:) = ZDELTA * (PTHLM(:,:) + PLOCPEXNM(:,:)*(           &
                                                     PRM(:,:,2)+PRM(:,:,4)))&
                             / (1. + ZRW(:,:))                                &
@@ -168,12 +168,12 @@ ELSE
               (1.+ZDELTA) * (PRM(:,:,1) - PRM(:,:,2)) &
               -ZRW(:,:)                                 &
                      )  /  (1. + ZRW(:,:)) 
-  !
-  !   Emoist = ZB + ZC * Amoist
-  !   ZB is computed from line 1 to line 2
-  !   ZC is computed from line 3 to line 5
-  !   Amoist* 2 * SRC is computed at line 6
-  !
+    !
+    !   Emoist = ZB + ZC * Amoist
+    !   ZB is computed from line 1 to line 2
+    !   ZC is computed from line 3 to line 5
+    !   Amoist* 2 * SRC is computed at line 6
+    !
     PEMOIST(:,:) = ZDELTA * (PTHLM(:,:) + PLOCPEXNM(:,:)* &
                                        PRM(:,:,2)) / (1. + ZRW(:,:))          &
         +( PLOCPEXNM(:,:) * ZA(:,:)                                        &
@@ -183,7 +183,7 @@ ELSE
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   END IF
  END IF
-!
+ !
 END IF
 !---------------------------------------------------------------------------
 !
diff --git a/src/PHYEX/turb/mode_etheta.f90 b/src/PHYEX/turb/mode_etheta.f90
index 9296b922c226c77f4501b51efd0731b30a60c307..5fa44027e81b6ea18f97edae38253e178a30be79 100644
--- a/src/PHYEX/turb/mode_etheta.f90
+++ b/src/PHYEX/turb/mode_etheta.f90
@@ -114,9 +114,9 @@ IF (OOCEAN) THEN                                    ! ocean case
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 ELSE   
  IF ( KRR == 0) THEN                                ! dry case
- !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   PETHETA(:,:) = 1.
- !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
  ELSE IF ( KRR == 1 ) THEN                           ! only vapor
   ZDELTA = (CST%XRV/CST%XRD) - 1.
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -127,7 +127,7 @@ ELSE
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZRW(:,:) = PRM(:,:,1)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-!
+  !
   IF ( KRRI>0 ) THEN  ! rc and ri case
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZRW(:,:) = ZRW(:,:) + PRM(:,:,3)
@@ -142,11 +142,11 @@ ELSE
               (1.+ZDELTA) * (PRM(:,:,1) - PRM(:,:,2) - PRM(:,:,4)) &
               -ZRW(:,:)                                                &
                      )  /  (1. + ZRW(:,:))
-  !
-  !   Etheta = ZA + ZC * Atheta  
-  !   ZC is computed from line 2 to line 5
-  !   - Atheta * 2. * SRC is computed at line 6 
-  !
+    !
+    !   Etheta = ZA + ZC * Atheta  
+    !   ZC is computed from line 2 to line 5
+    !   - Atheta * 2. * SRC is computed at line 6 
+    !
     PETHETA(:,:) = ZA(:,:)                                                 &
         +( PLOCPEXNM(:,:) * ZA(:,:)                                        &
                -(1.+ZDELTA) * (PTHLM(:,:) + PLOCPEXNM(:,:)*(               &
@@ -165,11 +165,11 @@ ELSE
               (1.+ZDELTA) * (PRM(:,:,1) - PRM(:,:,2)) &
               -ZRW(:,:)                                 &
                      )  /  (1. + ZRW(:,:))
-  !
-  !   Etheta = ZA + ZC * Atheta  
-  !   ZC is computed from line 2 to line 5
-  !   - Atheta * 2. * SRC is computed at line 6 
-  !
+    !
+    !   Etheta = ZA + ZC * Atheta  
+    !   ZC is computed from line 2 to line 5
+    !   - Atheta * 2. * SRC is computed at line 6 
+    !
     PETHETA(:,:) = ZA(:,:)                                                 &
         +( PLOCPEXNM(:,:) * ZA(:,:) -(1.+ZDELTA) * (PTHLM(:,:) &
         + PLOCPEXNM(:,:)*PRM(:,:,2))   &
diff --git a/src/PHYEX/turb/mode_mf_turb.f90 b/src/PHYEX/turb/mode_mf_turb.f90
index dd39e118828ce8aefcc48266c5e14b931eec566d..07d0f168a855c77f6f7c08a89c6a95ebfdcd8b26 100644
--- a/src/PHYEX/turb/mode_mf_turb.f90
+++ b/src/PHYEX/turb/mode_mf_turb.f90
@@ -143,8 +143,8 @@ IIJE=D%NIJE
 IIJB=D%NIJB
 IKT=D%NKT
 !
-PFLXZSVMF = 0.
-PSVDT = 0.
+PFLXZSVMF(:,:,:) = 0.
+PSVDT(:,:,:) = 0.
 
 !
 !----------------------------------------------------------------------------
diff --git a/src/PHYEX/turb/mode_mf_turb_expl.f90 b/src/PHYEX/turb/mode_mf_turb_expl.f90
index 16d1e9f8a545fa9feb9673b824d361b6470afc5c..90a3b115c91c36648a08740457a7b511cdfdde98 100644
--- a/src/PHYEX/turb/mode_mf_turb_expl.f90
+++ b/src/PHYEX/turb/mode_mf_turb_expl.f90
@@ -115,15 +115,15 @@ IKB=D%NKB
 IKE=D%NKE
 IKL=D%NKL
 !
-PFLXZRMF   = 0.
-PFLXZTHVMF = 0.
-PFLXZTHLMF = 0.
-PFLXZUMF   = 0.
-PFLXZVMF   = 0.
-PTHLDT = 0.
-PRTDT  = 0.
-PUDT   = 0.
-PVDT   = 0.
+PFLXZRMF(:,:)   = 0.
+PFLXZTHVMF(:,:) = 0.
+PFLXZTHLMF(:,:) = 0.
+PFLXZUMF(:,:)   = 0.
+PFLXZVMF(:,:)   = 0.
+PTHLDT(:,:) = 0.
+PRTDT(:,:)  = 0.
+PUDT(:,:)   = 0.
+PVDT(:,:)   = 0.
 
 !
 !----------------------------------------------------------------------------
diff --git a/src/PHYEX/turb/mode_rmc01.f90 b/src/PHYEX/turb/mode_rmc01.f90
index 98f6db452f8880477d95205668fe0f53b25b4cbe..33a910df07f804749975d3ea78059a2769a28ca9 100644
--- a/src/PHYEX/turb/mode_rmc01.f90
+++ b/src/PHYEX/turb/mode_rmc01.f90
@@ -185,9 +185,9 @@ SELECT CASE (TURBN%CTURBLEN)
       !$mnh_end_expand_array(JIJ=IIJB:IIJE)
     END DO
     !
-!*     4. factor controling the transition between SBL and free isotropic turb. (3D case)
-!         --------------------------------------------------------------------
-!
+    !*     4. factor controling the transition between SBL and free isotropic turb. (3D case)
+    !         --------------------------------------------------------------------
+    !
     ZGAM(:,IKA) = 0.
     DO JK=IKTB,IKTE
       !$mnh_expand_array(JIJ=IIJB:IIJE)
@@ -208,15 +208,15 @@ SELECT CASE (TURBN%CTURBLEN)
       ZGAM(:,IKU) = 1.
     END WHERE
     !$mnh_end_expand_where(JIJ=IIJB:IIJE)
-!   
-!
-!-------------------------------------------------------------------------------
-!
-!*     5. factor controling the transition between SBL and free isotropic turb.(1D case)
-!         --------------------------------------------------------------------
-!
+  !   
+  !
+  !-------------------------------------------------------------------------------
+  !
+  !*     5. factor controling the transition between SBL and free isotropic turb.(1D case)
+  !         --------------------------------------------------------------------
+  !
   CASE DEFAULT
-!* SBL depth is used
+    !* SBL depth is used
     ZGAM(:,:) = 1.
     ZGAM(:,IKA) = 0.
     DO JK=IKTB,IKTE
@@ -235,14 +235,14 @@ SELECT CASE (TURBN%CTURBLEN)
     WHERE(PSBL_DEPTH(:)>0.)
       ZGAM(:,IKU) = TANH( (ZZZ(:,IKU)-ZZZ(:,IKB))/PSBL_DEPTH(:) )
     END WHERE
-   !$mnh_end_expand_where(JIJ=IIJB:IIJE)
-   !$mnh_expand_where(JIJ=IIJB:IIJE)
+    !$mnh_end_expand_where(JIJ=IIJB:IIJE)
+    !$mnh_expand_where(JIJ=IIJB:IIJE)
     WHERE (ZGAM(:,IKU-IKL)>0.99 ) 
       ZGAM(:,JK) = 1.
     END WHERE
     !$mnh_end_expand_where(JIJ=IIJB:IIJE)
-!
-!-------------------------------------------------------------------------------
+  !
+  !-------------------------------------------------------------------------------
 END SELECT
 !-------------------------------------------------------------------------------
 !
@@ -250,10 +250,10 @@ END SELECT
 !         ---------------------------------
 !
 DO JK=1,IKT
-!$mnh_expand_array(JIJ=IIJB:IIJE)
+  !$mnh_expand_array(JIJ=IIJB:IIJE)
   ZL(:,JK) =  CST%XKARMAN/SQRT(CSTURB%XALPSBL)/CSTURB%XCMFS                                      &
               * ZZZ(:,JK)*PDIRCOSZW(:)/(ZPHIM(:,JK)**2*SQRT(ZPHIE(:,JK)))
-!$mnh_end_expand_array(JIJ=IIJB:IIJE)
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE)
 END DO
 !
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
diff --git a/src/PHYEX/turb/mode_turb_ver.f90 b/src/PHYEX/turb/mode_turb_ver.f90
index 5b767c7e0aa72375096a291797cb0e07931fbbc7..02c1a67500ade26748dec2fd8dfc661962931e26 100644
--- a/src/PHYEX/turb/mode_turb_ver.f90
+++ b/src/PHYEX/turb/mode_turb_ver.f90
@@ -325,8 +325,8 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   ::  PFWR         ! d(w'2r'  )/dz
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   ::  PFTH2        ! d(w'th'2 )/dz
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   ::  PFR2         ! d(w'r'2  )/dz
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   ::  PFTHR        ! d(w'th'r')/dz
-REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%CTOM=='TM06')),INTENT(INOUT) :: PBL_DEPTH  ! BL height for TOMS
-REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%LRMC01)),INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01
+REAL, DIMENSION(D%NIJT),INTENT(INOUT) :: PBL_DEPTH  ! BL height for TOMS
+REAL, DIMENSION(D%NIJT),INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01
 REAL, DIMENSION(D%NIJT),   INTENT(IN)   ::  PLMO         ! Monin-Obukhov length
 !
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT)   ::  PRUS, PRVS, PRWS, PRTHLS
@@ -461,8 +461,13 @@ ENDIF
 GUSERV = KRR/=0
 !
 CALL PHI3(D,CSTURB,TURBN,ZREDTH1,ZREDR1,ZRED2TH3,ZRED2R3,ZRED2THR3,TURBN%CTURBDIM,GUSERV,ZPHI3)
-IF(KRR/=0) &
-CALL PSI3(D,CSTURB,TURBN,ZREDR1,ZREDTH1,ZRED2R3,ZRED2TH3,ZRED2THR3,TURBN%CTURBDIM,GUSERV,ZPSI3)
+IF(KRR/=0) THEN
+  CALL PSI3(D,CSTURB,TURBN,ZREDR1,ZREDTH1,ZRED2R3,ZRED2TH3,ZRED2THR3,TURBN%CTURBDIM,GUSERV,ZPSI3)
+ELSE
+  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  ZPSI3(:,:) = 1.
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+END IF
 !
 ! Prandtl numbers for scalars
 !
diff --git a/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90
index 642acf3e12abd8935db4dcf8e9b161c1a6b9942c..e895283b0fe679202672555b72d8bd15b05a8245 100644
--- a/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90
+++ b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90
@@ -325,8 +325,7 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   ::  PFTH2        ! d(w'th'2 )/dz (at
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   ::  PFR2         ! d(w'r'2  )/dz (at mass point)
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   ::  PFTHR        ! d(w'th'r')/dz (at mass point)
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   ::  MFMOIST      ! moist mass flux dual scheme
-REAL, DIMENSION(MERGE(D%NIT,0,TURBN%CTOM=='TM06'),&
-                MERGE(D%NJT,0,TURBN%CTOM=='TM06')),   INTENT(INOUT)::  PBL_DEPTH    ! BL depth
+REAL, DIMENSION(D%NIT,D%NJT),  INTENT(INOUT)::  PBL_DEPTH    ! BL depth
 REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)  :: PWTHV         ! buoyancy flux
 !
 REAL, DIMENSION(D%NIJT,D%NKT),   INTENT(INOUT) :: PRTHLS     ! cumulated source for theta
@@ -496,7 +495,7 @@ IF (GFWTH) THEN
   CALL M3_WTH_W2TH(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,ZKEFF,PTKEM,Z3RDMOMENT)
   CALL D_M3_WTH_W2TH_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,&
    & PD,PBLL_O_E,PETHETA,ZKEFF,PTKEM,ZWORK1)
-!
+  !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZF(:,:)= ZF(:,:) + Z3RDMOMENT(:,:) * PFWTH(:,:)
   ZDFDDTDZ(:,:) = ZDFDDTDZ(:,:) + ZWORK1(:,:) &
@@ -510,7 +509,7 @@ IF (GFTH2) THEN
   CALL D_M3_WTH_WTH2_O_DDTDZ(D,CSTURB,TURBN,Z3RDMOMENT,PREDTH1,PREDR1,&
     & PD,PBLL_O_E,PETHETA,ZWORK1)
   CALL MZM_PHY(D,PFTH2,ZWORK2)
-!
+  !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZF(:,:) = ZF(:,:) + Z3RDMOMENT(:,:) &
                                 * ZWORK2(:,:)
@@ -523,7 +522,7 @@ END IF
 IF (GFWR) THEN
   CALL M3_WTH_W2R(D,CSTURB,TURBN,PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ,ZWORK1)
   CALL D_M3_WTH_W2R_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST,ZWORK2)
-!
+  !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZF(:,:) = ZF(:,:) + ZWORK1(:,:) * PFWR(:,:)
   ZDFDDTDZ(:,:) = ZDFDDTDZ(:,:) + ZWORK2(:,:) &
@@ -537,7 +536,7 @@ IF (GFR2) THEN
   CALL MZM_PHY(D,PFR2,ZWORK2)
   CALL D_M3_WTH_WR2_O_DDTDZ(D,CSTURB,TURBN,PREDTH1,PREDR1,PD,&
     & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,ZWORK3)
-!
+  !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)    
   ZF(:,:) = ZF(:,:) + ZWORK1(:,:) * ZWORK2(:,:)
   ZDFDDTDZ(:,:) = ZDFDDTDZ(:,:) + ZWORK3(:,:) &
@@ -551,7 +550,7 @@ IF (GFTHR) THEN
     & PLEPS,PEMOIST,Z3RDMOMENT)
   CALL D_M3_WTH_WTHR_O_DDTDZ(D,CSTURB,TURBN,Z3RDMOMENT,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,ZWORK1)
   CALL MZM_PHY(D,PFTHR, ZWORK2)
-!
+  !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZF(:,:) = ZF(:,:) + Z3RDMOMENT(:,:) &
                                 * ZWORK2(:,:)
@@ -582,9 +581,9 @@ ELSE ! atmosp bottom
                        * 0.5 * (1. + PRHODJ(:,IKA) / PRHODJ(:,IKB))
     !$mnh_end_expand_array(JIJ=IIJB:IIJE) 
   END IF
-!
-    ! atmos top
-      ZF(:,IKE+1)=0.
+  !
+  ! atmos top
+  ZF(:,IKE+1)=0.
 END IF
 !
 ! Compute the split conservative potential temperature at t+deltat
@@ -602,7 +601,7 @@ IF (TURBN%LLEONARD) THEN
  DO JK=1,IKT
    !$mnh_expand_array(JIJ=IIJB:IIJE)
    ZALT(:,JK) = PZZ(:,JK)-PZS(:) 
-   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+   !$mnh_end_expand_array(JIJ=IIJB:IIJE)
  END DO
  CALL MZM_PHY(D,PRHODJ,ZWORK1)
  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -891,7 +890,7 @@ IF (KRR /= 0) THEN
     CALL M3_WR_W2R(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,ZKEFF,PTKEM,Z3RDMOMENT)
     CALL D_M3_WR_W2R_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,PD,&
      & PBLL_O_E,PEMOIST,ZKEFF,PTKEM,ZWORK1)
-  !
+    !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZF(:,:)= ZF(:,:) + Z3RDMOMENT(:,:) * PFWR(:,:)
     ZDFDDRDZ(:,:) = ZDFDDRDZ(:,:) + ZWORK1(:,:) &
@@ -905,7 +904,7 @@ IF (KRR /= 0) THEN
     CALL MZM_PHY(D,PFR2,ZWORK1)
     CALL D_M3_WR_WR2_O_DDRDZ(D,CSTURB,TURBN,Z3RDMOMENT,PREDR1,&
      & PREDTH1,PD,PBLL_O_E,PEMOIST,ZWORK2)
-  !
+    !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZF(:,:) = ZF(:,:) + Z3RDMOMENT(:,:) &
                                   * ZWORK1(:,:)
@@ -920,7 +919,7 @@ IF (KRR /= 0) THEN
      & PTKEM,PBLL_O_E,PETHETA,PDR_DZ,ZWORK1)
     CALL D_M3_WR_W2TH_O_DDRDZ(D,CSTURB,TURBN,PREDR1,PREDTH1,&
      & PD,ZKEFF,PTKEM,PBLL_O_E,PETHETA,ZWORK2)
-  !
+    !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZF(:,:) = ZF(:,:) + ZWORK1(:,:) * PFWTH(:,:)
     ZDFDDRDZ(:,:) = ZDFDDRDZ(:,:) + ZWORK2(:,:) &
@@ -950,7 +949,7 @@ IF (KRR /= 0) THEN
     CALL MZM_PHY(D,PFTHR,ZWORK1)
     CALL D_M3_WR_WTHR_O_DDRDZ(D,CSTURB,TURBN,Z3RDMOMENT,PREDR1, &
      & PREDTH1,PD,PBLL_O_E,PEMOIST,ZWORK2)
-  !
+    !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZF(:,:) = ZF(:,:) + Z3RDMOMENT(:,:) &
                                   * ZWORK1(:,:)
diff --git a/src/PHYEX/turb/modi_turb.f90 b/src/PHYEX/turb/modi_turb.f90
index 302d34ae89dbb7fc4ff5b39440d9495b3da70b78..e36d2aaa36d55d238aadb2590788274a135e419d 100644
--- a/src/PHYEX/turb/modi_turb.f90
+++ b/src/PHYEX/turb/modi_turb.f90
@@ -109,8 +109,8 @@ REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) ::  PSVT        ! passive scal. va
 REAL, DIMENSION(MERGE(D%NIJT,0,OCOMPUTE_SRC),&
                 MERGE(D%NKT,0,OCOMPUTE_SRC)),   INTENT(IN) ::  PSRCT       ! Second-order flux
                       ! s'rc'/2Sigma_s2 at time t-1 multiplied by Lambda_3
-REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%CTOM=='TM06')),INTENT(INOUT) :: PBL_DEPTH  ! BL height for TOMS
-REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%LRMC01)),INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01
+REAL, DIMENSION(D%NIJT),INTENT(INOUT) :: PBL_DEPTH  ! BL height for TOMS
+REAL, DIMENSION(D%NIJT),INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01
 !
 !    variables for cloud mixing length
 REAL, DIMENSION(MERGE(D%NIJT,0,OCLOUDMODIFLM),&
diff --git a/src/PHYEX/turb/shallow_mf.f90 b/src/PHYEX/turb/shallow_mf.f90
index 4488cea00924ce0abea7027e78b961794ec3d0f4..ae7a665ce932ad94538a014656203bfaecac7477 100644
--- a/src/PHYEX/turb/shallow_mf.f90
+++ b/src/PHYEX/turb/shallow_mf.f90
@@ -199,10 +199,10 @@ IKT=D%NKT
 !
 ! updraft governing variables
 IF (PARAMMF%CMF_UPDRAFT == 'EDKF'  .OR. PARAMMF%CMF_UPDRAFT == 'RHCJ') THEN
-  PENTR      = 1.E20
-  PDETR      = 1.E20
-  PEMF       = 1.E20
-  ZBUO_INTEG = 1.E20
+  PENTR(:,:)     = 1.E20
+  PDETR(:,:)      = 1.E20
+  PEMF(:,:)       = 1.E20
+  ZBUO_INTEG(:,:) = 1.E20
 ENDIF
 
 ! Thermodynamics functions
@@ -217,7 +217,7 @@ ENDIF
 !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 ZWK(:,:)=PTHM(:,:)*PEXNM(:,:)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-CALL COMPUTE_FRAC_ICE(NEBN%CFRAC_ICE_SHALLOW_MF,NEBN,ZFRAC_ICE(:,:),ZWK(:,:), IERR(:,:))
+CALL COMPUTE_FRAC_ICE(CST, NEBN%CFRAC_ICE_SHALLOW_MF,NEBN,ZFRAC_ICE(:,:),ZWK(:,:), IERR(:,:))
 
 ! Conservative variables at t-dt
 CALL THL_RT_FROM_TH_R_MF(D, CST, KRR,KRRL,KRRI,    &
@@ -327,7 +327,7 @@ ENDIF
 ! to be modified if 'DUAL' is evolving (momentum mixing for example)
 IF( PARAMMF%CMF_UPDRAFT == 'DUAL') THEN
   ! Now thetav_up from vdfhghtnn is used!
-  PFLXZTHVMF=0.
+  PFLXZTHVMF(:,:)=0.
   ! Yes/No UV mixing!
 !  PDUDT_MF=0.
 !  PDVDT_MF=0.
diff --git a/src/PHYEX/turb/th_r_from_thl_rt.func.h b/src/PHYEX/turb/th_r_from_thl_rt.func.h
index fc5071e3727276956b50b7149f44a1a5ac6b8be6..e1c5abe0b51e69ad7bbeb9189198a9747c865ed1 100644
--- a/src/PHYEX/turb/th_r_from_thl_rt.func.h
+++ b/src/PHYEX/turb/th_r_from_thl_rt.func.h
@@ -83,7 +83,7 @@ INTEGER, OPTIONAL, INTENT(IN) :: KE !last index to deal with (default if KT)
 !       0.2  declaration of local variables
 INTEGER                       :: II ! Loop control
 INTEGER                       :: JITER ! number of iterations
-INTEGER                       :: J, IB, IE
+INTEGER                       :: JIJ, IIJB, IIJE
 INTEGER, PARAMETER :: IEXN=1, IRVSAT=2, ICPH=3, IRLTEMP=4, ICPH2=5, IT=6, ILVOCPEXN=7, ILSOCPEXN=8, &
                     & IDRSATODT=9, IDRSATODTW=10, IDRSATODTI=11, IFOESW=12, IFOESI=13, &
                     & ILOGT=14, I99PP=15, I1PRT=16
@@ -97,40 +97,40 @@ REAL :: ZVAR1, ZVAR2, ZTPOW2, ZDELT
 !
 !
 IF ( PRESENT(KB) ) THEN
-  IB = KB
+  IIJB = KB
 ELSE
-  IB = 1
+  IIJB = 1
 END IF
 
 IF ( PRESENT(KE) ) THEN
-  IE = KE
+  IIJE = KE
 ELSE
-  IE = KT
+  IIJE = KT
 END IF
 
 !Number of iterations
 JITER=2
 !
-!Computation of PBUF(IB:IE, ICPH2) depending on dummy arguments received
-PBUF(IB:IE, ICPH2)=0
-IF(PRESENT(PRR)) PBUF(IB:IE, ICPH2)=PBUF(IB:IE, ICPH2) + CST%XCL*PRR(IB:IE)
-IF(PRESENT(PRS)) PBUF(IB:IE, ICPH2)=PBUF(IB:IE, ICPH2) + CST%XCI*PRS(IB:IE)
-IF(PRESENT(PRG)) PBUF(IB:IE, ICPH2)=PBUF(IB:IE, ICPH2) + CST%XCI*PRG(IB:IE)
-IF(PRESENT(PRH)) PBUF(IB:IE, ICPH2)=PBUF(IB:IE, ICPH2) + CST%XCI*PRH(IB:IE)
+!Computation of PBUF(:, ICPH2) depending on dummy arguments received
+PBUF(:, ICPH2)=0
+IF(PRESENT(PRR)) PBUF(:, ICPH2)=PBUF(:, ICPH2) + CST%XCL*PRR(:)
+IF(PRESENT(PRS)) PBUF(:, ICPH2)=PBUF(:, ICPH2) + CST%XCI*PRS(:)
+IF(PRESENT(PRG)) PBUF(:, ICPH2)=PBUF(:, ICPH2) + CST%XCI*PRG(:)
+IF(PRESENT(PRH)) PBUF(:, ICPH2)=PBUF(:, ICPH2) + CST%XCI*PRH(:)
 !
 !Computation of an approximate state thanks to PRL and PRI guess
-PBUF(IB:IE, IEXN)=(PP(IB:IE)/CST%XP00) ** CST%RDSCPD
+PBUF(:, IEXN)=(PP(:)/CST%XP00) ** CST%RDSCPD
 
-DO J=IB,IE
-  PBUF(J, I99PP)=0.99*PP(J)
-  PRV(J)=PRT(J)-PRL(J)-PRI(J)
-  PBUF(J, ICPH)=CST%XCPD+ CST%XCPV * PRV(J)+ CST%XCL * PRL(J) + CST%XCI * PRI(J) + PBUF(J, ICPH2)
-  ZVAR2=PBUF(J, ICPH)*PBUF(J, IEXN)
-  ZDELT=(PTHL(J)*PBUF(J, IEXN))-CST%XTT
-  PBUF(J, ILVOCPEXN) = (CST%XLVTT + (CST%XCPV-CST%XCL) * ZDELT) /ZVAR2
-  PBUF(J, ILSOCPEXN) = (CST%XLSTT + (CST%XCPV-CST%XCI) * ZDELT) /ZVAR2 
-  PTH(J)=PTHL(J)+PBUF(J, ILVOCPEXN)*PRL(J)+PBUF(J, ILSOCPEXN)*PRI(J)
-  PBUF(J, I1PRT)=1+PRT(J)
+DO JIJ=IIJB,IIJE
+  PBUF(JIJ, I99PP)=0.99*PP(JIJ)
+  PRV(JIJ)=PRT(JIJ)-PRL(JIJ)-PRI(JIJ)
+  PBUF(JIJ, ICPH)=CST%XCPD+ CST%XCPV * PRV(JIJ)+ CST%XCL * PRL(JIJ) + CST%XCI * PRI(JIJ) + PBUF(JIJ, ICPH2)
+  ZVAR2=PBUF(JIJ, ICPH)*PBUF(JIJ, IEXN)
+  ZDELT=(PTHL(JIJ)*PBUF(JIJ, IEXN))-CST%XTT
+  PBUF(JIJ, ILVOCPEXN) = (CST%XLVTT + (CST%XCPV-CST%XCL) * ZDELT) /ZVAR2
+  PBUF(JIJ, ILSOCPEXN) = (CST%XLSTT + (CST%XCPV-CST%XCI) * ZDELT) /ZVAR2 
+  PTH(JIJ)=PTHL(JIJ)+PBUF(JIJ, ILVOCPEXN)*PRL(JIJ)+PBUF(JIJ, ILSOCPEXN)*PRI(JIJ)
+  PBUF(JIJ, I1PRT)=1+PRT(JIJ)
 ENDDO
 !
 !
@@ -139,73 +139,73 @@ ENDDO
 
 DO II=1,JITER
   IF (OOCEAN) THEN
-    PBUF(IB:IE, IT)=PTH(IB:IE)
+    PBUF(:, IT)=PTH(:)
   ELSE
-    PBUF(IB:IE, IT)=PTH(IB:IE)*PBUF(IB:IE, IEXN)
+    PBUF(:, IT)=PTH(:)*PBUF(:, IEXN)
   END IF
   !Computation of liquid/ice fractions
-  PFRAC_ICE(IB:IE) = 0.
-  DO J=IB, IE
-    IF(PRL(J)+PRI(J) > 1.E-20) THEN
-      PFRAC_ICE(J) = PRI(J) / (PRL(J)+PRI(J))
+  PFRAC_ICE(:) = 0.
+  DO JIJ=IIJB, IIJE
+    IF(PRL(JIJ)+PRI(JIJ) > 1.E-20) THEN
+      PFRAC_ICE(JIJ) = PRI(JIJ) / (PRL(JIJ)+PRI(JIJ))
     ENDIF
   ENDDO
-  CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEBN,PFRAC_ICE(IB:IE),PBUF(IB:IE, IT))
+  CALL COMPUTE_FRAC_ICE(CST, HFRAC_ICE,NEBN,PFRAC_ICE(:),PBUF(:, IT))
 
   !Computation of Rvsat and dRsat/dT
   !In this version QSAT, QSATI, DQSAT and DQASATI functions are not used
   !due to performance issue
 
   ! Log does not vectorize on all compilers:
-  PBUF(IB:IE, ILOGT)=LOG(PBUF(IB:IE, IT))
+  PBUF(:, ILOGT)=LOG(PBUF(:, IT))
 
-  DO J=IB, IE
-    PBUF(J, IFOESW) = MIN(EXP( CST%XALPW - CST%XBETAW/PBUF(J, IT) - CST%XGAMW*PBUF(J, ILOGT)  ), PBUF(J, I99PP))
-    PBUF(J, IFOESI) = MIN(EXP( CST%XALPI - CST%XBETAI/PBUF(J, IT) - CST%XGAMI*PBUF(J, ILOGT)  ), PBUF(J, I99PP))
-    PRSATW(J) = CST%XRD/CST%XRV*PBUF(J, IFOESW)/PP(J) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(J, IFOESW)/PP(J))
-    PRSATI(J) = CST%XRD/CST%XRV*PBUF(J, IFOESI)/PP(J) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(J, IFOESI)/PP(J))
-    ZTPOW2=PBUF(J, IT)**2
-    PBUF(J, IDRSATODTW) = PRSATW(J) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(J, IFOESW)/PP(J) ) &
-                     * (CST%XBETAW/ZTPOW2 - CST%XGAMW/PBUF(J, IT))*PBUF(J, I1PRT)
-    PBUF(J, IDRSATODTI) = PRSATI(J) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(J, IFOESI)/PP(J) ) &
-                     * (CST%XBETAI/ZTPOW2 - CST%XGAMI/PBUF(J, IT))*PBUF(J, I1PRT)
-    !PRSATW(J) =  QSAT(PBUF(J, IT),PP(J)) !qsatw
-    !PRSATI(J) = QSATI(PBUF(J, IT),PP(J)) !qsati
-    !PBUF(J, IDRSATODTW) =  DQSAT(PBUF(J, IT),PP(J),PRSATW(J))*PBUF(J, I1PRT)
-    !PBUF(J, IDRSATODTI) = DQSATI(PBUF(J, IT),PP(J),PRSATI(J))*PBUF(J, I1PRT)
-    PRSATW(J) = PRSATW(J)*PBUF(J, I1PRT)
-    PRSATI(J) = PRSATI(J)*PBUF(J, I1PRT)
-    PBUF(J, IRVSAT) = PRSATW(J)*(1-PFRAC_ICE(J)) + PRSATI(J)*PFRAC_ICE(J)
-    PBUF(J, IDRSATODT) = (PBUF(J, IDRSATODTW)*(1-PFRAC_ICE(J))+ &
-              & PBUF(J, IDRSATODTI)*PFRAC_ICE(J))
+  DO JIJ=IIJB, IIJE
+    PBUF(JIJ, IFOESW) = MIN(EXP( CST%XALPW - CST%XBETAW/PBUF(JIJ, IT) - CST%XGAMW*PBUF(JIJ, ILOGT)  ), PBUF(JIJ, I99PP))
+    PBUF(JIJ, IFOESI) = MIN(EXP( CST%XALPI - CST%XBETAI/PBUF(JIJ, IT) - CST%XGAMI*PBUF(JIJ, ILOGT)  ), PBUF(JIJ, I99PP))
+    PRSATW(JIJ) = CST%XRD/CST%XRV*PBUF(JIJ, IFOESW)/PP(JIJ) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(JIJ, IFOESW)/PP(JIJ))
+    PRSATI(JIJ) = CST%XRD/CST%XRV*PBUF(JIJ, IFOESI)/PP(JIJ) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(JIJ, IFOESI)/PP(JIJ))
+    ZTPOW2=PBUF(JIJ, IT)**2
+    PBUF(JIJ, IDRSATODTW) = PRSATW(JIJ) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(JIJ, IFOESW)/PP(JIJ) ) &
+                     * (CST%XBETAW/ZTPOW2 - CST%XGAMW/PBUF(JIJ, IT))*PBUF(JIJ, I1PRT)
+    PBUF(JIJ, IDRSATODTI) = PRSATI(JIJ) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(JIJ, IFOESI)/PP(JIJ) ) &
+                     * (CST%XBETAI/ZTPOW2 - CST%XGAMI/PBUF(JIJ, IT))*PBUF(JIJ, I1PRT)
+    !PRSATW(JIJ) =  QSAT(PBUF(JIJ, IT),PP(JIJ)) !qsatw
+    !PRSATI(JIJ) = QSATI(PBUF(JIJ, IT),PP(JIJ)) !qsati
+    !PBUF(JIJ, IDRSATODTW) =  DQSAT(PBUF(JIJ, IT),PP(JIJ),PRSATW(JIJ))*PBUF(JIJ, I1PRT)
+    !PBUF(JIJ, IDRSATODTI) = DQSATI(PBUF(JIJ, IT),PP(JIJ),PRSATI(JIJ))*PBUF(JIJ, I1PRT)
+    PRSATW(JIJ) = PRSATW(JIJ)*PBUF(JIJ, I1PRT)
+    PRSATI(JIJ) = PRSATI(JIJ)*PBUF(JIJ, I1PRT)
+    PBUF(JIJ, IRVSAT) = PRSATW(JIJ)*(1-PFRAC_ICE(JIJ)) + PRSATI(JIJ)*PFRAC_ICE(JIJ)
+    PBUF(JIJ, IDRSATODT) = (PBUF(JIJ, IDRSATODTW)*(1-PFRAC_ICE(JIJ))+ &
+              & PBUF(JIJ, IDRSATODTI)*PFRAC_ICE(JIJ))
 
     !Computation of new PRL, PRI and PRV
-    !Correction term applied to (PRV(J)-PBUF(J, IRVSAT)) is computed assuming that
-    !PBUF(J, ILVOCPEXN), PBUF(J, ILSOCPEXN) and PBUF(J, ICPH) don't vary too much with T. It takes into account
+    !Correction term applied to (PRV(JIJ)-PBUF(JIJ, IRVSAT)) is computed assuming that
+    !PBUF(JIJ, ILVOCPEXN), PBUF(JIJ, ILSOCPEXN) and PBUF(JIJ, ICPH) don't vary too much with T. It takes into account
     !the variation (estimated linear) of Qsat with T
-    PBUF(J, IRLTEMP)=(PRV(J)-PBUF(J, IRVSAT))/ &
-                  &(1 + PBUF(J, IDRSATODT)*PBUF(J, IEXN)* &
-                  &     (PBUF(J, ILVOCPEXN)*(1-PFRAC_ICE(J))+PBUF(J, ILSOCPEXN)*PFRAC_ICE(J)))
-    PBUF(J, IRLTEMP)=MIN(MAX(-PRL(J)-PRI(J), PBUF(J, IRLTEMP)),PRV(J))
-    PRV(J)=PRV(J)-PBUF(J, IRLTEMP)
-    PRL(J)=PRL(J)+PRI(J)+PBUF(J, IRLTEMP)
-    PRI(J)=PFRAC_ICE(J)     * (PRL(J))
-    PRL(J)=(1-PFRAC_ICE(J)) * (PRT(J) - PRV(J))
+    PBUF(JIJ, IRLTEMP)=(PRV(JIJ)-PBUF(JIJ, IRVSAT))/ &
+                  &(1 + PBUF(JIJ, IDRSATODT)*PBUF(JIJ, IEXN)* &
+                  &     (PBUF(JIJ, ILVOCPEXN)*(1-PFRAC_ICE(JIJ))+PBUF(JIJ, ILSOCPEXN)*PFRAC_ICE(JIJ)))
+    PBUF(JIJ, IRLTEMP)=MIN(MAX(-PRL(JIJ)-PRI(JIJ), PBUF(JIJ, IRLTEMP)),PRV(JIJ))
+    PRV(JIJ)=PRV(JIJ)-PBUF(JIJ, IRLTEMP)
+    PRL(JIJ)=PRL(JIJ)+PRI(JIJ)+PBUF(JIJ, IRLTEMP)
+    PRI(JIJ)=PFRAC_ICE(JIJ)     * (PRL(JIJ))
+    PRL(JIJ)=(1-PFRAC_ICE(JIJ)) * (PRT(JIJ) - PRV(JIJ))
 
     !Computation of Cph (as defined in Meso-NH doc, equation 2.2, to be used with mixing ratios)
-    PBUF(J, ICPH)=CST%XCPD+ CST%XCPV * PRV(J)+ CST%XCL * PRL(J) + CST%XCI * PRI(J) + PBUF(J, ICPH2)
+    PBUF(JIJ, ICPH)=CST%XCPD+ CST%XCPV * PRV(JIJ)+ CST%XCL * PRL(JIJ) + CST%XCI * PRI(JIJ) + PBUF(JIJ, ICPH2)
 
     !Computation of L/Cph/EXN, then new PTH
-    ZVAR2=PBUF(J, ICPH)*PBUF(J, IEXN)
-    PBUF(J, ILVOCPEXN) = (CST%XLVTT + (CST%XCPV-CST%XCL) * (PBUF(J, IT)-CST%XTT)) /ZVAR2
-    PBUF(J, ILSOCPEXN) = (CST%XLSTT + (CST%XCPV-CST%XCI) * (PBUF(J, IT)-CST%XTT)) /ZVAR2
-    PTH(J)=PTHL(J)+PBUF(J, ILVOCPEXN)*PRL(J)+PBUF(J, ILSOCPEXN)*PRI(J)
+    ZVAR2=PBUF(JIJ, ICPH)*PBUF(JIJ, IEXN)
+    PBUF(JIJ, ILVOCPEXN) = (CST%XLVTT + (CST%XCPV-CST%XCL) * (PBUF(JIJ, IT)-CST%XTT)) /ZVAR2
+    PBUF(JIJ, ILSOCPEXN) = (CST%XLSTT + (CST%XCPV-CST%XCI) * (PBUF(JIJ, IT)-CST%XTT)) /ZVAR2
+    PTH(JIJ)=PTHL(JIJ)+PBUF(JIJ, ILVOCPEXN)*PRL(JIJ)+PBUF(JIJ, ILSOCPEXN)*PRI(JIJ)
 
     !Computation of estimated mixing ration at saturation
     !To compute the adjustement a first order development was used
-    ZVAR1=PTH(J)*PBUF(J, IEXN)-PBUF(J, IT)
-    PRSATW(J)=PRSATW(J) + PBUF(J, IDRSATODTW)*ZVAR1
-    PRSATI(J)=PRSATI(J) + PBUF(J, IDRSATODTI)*ZVAR1
+    ZVAR1=PTH(JIJ)*PBUF(JIJ, IEXN)-PBUF(JIJ, IT)
+    PRSATW(JIJ)=PRSATW(JIJ) + PBUF(JIJ, IDRSATODTW)*ZVAR1
+    PRSATI(JIJ)=PRSATI(JIJ) + PBUF(JIJ, IDRSATODTI)*ZVAR1
   ENDDO
 ENDDO
 
diff --git a/src/PHYEX/turb/turb.f90 b/src/PHYEX/turb/turb.f90
index 42b1d1cb8485d0e037f5b0264d79ffc8c090e022..168e0caeac8ebdbf45e58743e7183f4328959c33 100644
--- a/src/PHYEX/turb/turb.f90
+++ b/src/PHYEX/turb/turb.f90
@@ -244,7 +244,7 @@ USE MODE_SHUMAN_PHY, ONLY: MZF_PHY,MXF_PHY,MYF_PHY
 USE YOMHOOK ,   ONLY: LHOOK, DR_HOOK, JPHOOK
 !
 USE MODD_BUDGET,     ONLY:  NBUDGET_U,  NBUDGET_V,  NBUDGET_W,  NBUDGET_TH, NBUDGET_RV, NBUDGET_RC,  &
-                             NBUDGET_RI, NBUDGET_SV1, &
+                            NBUDGET_RI, NBUDGET_SV1, NBUDGET_RG, NBUDGET_RH, NBUDGET_RR, NBUDGET_RS, &
                             TBUDGETDATA, TBUDGETCONF_t
 USE MODD_CST,        ONLY: CST_t
 USE MODD_CTURB,      ONLY: CSTURB_t
@@ -277,6 +277,7 @@ USE MODE_TURB_VER,            ONLY: TURB_VER
 USE MODE_UPDATE_LM,           ONLY: UPDATE_LM
 !
 USE MODI_LES_MEAN_SUBGRID_PHY
+USE MODI_SECOND_MNH,          ONLY: SECOND_MNH
 !
 !
 IMPLICIT NONE
@@ -352,8 +353,8 @@ REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) ::  PSVT        ! passive scal. va
 REAL, DIMENSION(MERGE(D%NIJT,0,OCOMPUTE_SRC),&
                 MERGE(D%NKT,0,OCOMPUTE_SRC)),   INTENT(IN) ::  PSRCT       ! Second-order flux
                       ! s'rc'/2Sigma_s2 at time t-1 multiplied by Lambda_3
-REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%CTOM=='TM06')),INTENT(INOUT) :: PBL_DEPTH  ! BL height for TOMS
-REAL, DIMENSION(MERGE(D%NIJT,0,TURBN%LRMC01)),INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01
+REAL, DIMENSION(D%NIJT),INTENT(INOUT) :: PBL_DEPTH  ! BL height for TOMS
+REAL, DIMENSION(D%NIJT),INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01
 !
 !    variables for cloud mixing length
 REAL, DIMENSION(MERGE(D%NIJT,0,OCLOUDMODIFLM),&
@@ -502,6 +503,11 @@ REAL                :: ZALPHA       ! work coefficient :
 REAL :: ZTIME1, ZTIME2
 TYPE(TFIELDMETADATA) :: TZFIELD
 !
+REAL, DIMENSION(D%NIJT,D%NKT,MERGE(KSV+KRR,KSV,TURBN%LTURB_PRECIP)) :: ZWORKT, ZWORKS
+REAL, DIMENSION(D%NIJT,      MERGE(KSV+KRR,KSV,TURBN%LTURB_PRECIP)) :: ZWORKSFSV
+REAL, DIMENSION(D%NIJT,D%NKT,MERGE(KSV+KRR,KSV,TURBN%LTURB_PRECIP)) :: ZWORKWSV
+INTEGER :: ISV
+!
 !*      1.PRELIMINARIES
 !         -------------
 !
@@ -541,6 +547,15 @@ END IF
 !Save LIMA scalar variables sources
 ZRSVS(:,:,1:KSV)=PRSVS(:,:,1:KSV)
 !
+ISV=KSV
+IF (TURBN%LTURB_PRECIP) ISV=KSV+KRR
+ZWORKT(:,:,1:KSV)=PSVT(:,:,:)
+ZWORKS(:,:,1:KSV)=PRSVS(:,:,:)
+IF (TURBN%LTURB_PRECIP) ZWORKT(:,:,KSV+1:KSV+KRR)=PRT(:,:,:)
+IF (TURBN%LTURB_PRECIP) ZWORKS(:,:,KSV+1:KSV+KRR)=PRRS(:,:,:)
+ZWORKSFSV(:,:)=0.
+ZWORKWSV(:,:,:)=0.
+ZWORKSFSV(:,1:KSV)=PSFSV(:,:)
 !
 !----------------------------------------------------------------------------
 !
@@ -555,27 +570,27 @@ ZCP(:,:)=CST%XCPD
 IF (KRR > 0) ZCP(:,:) = ZCP(:,:) + CST%XCPV * PRT(:,:,1)
 !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 DO JRR = 2,1+KRRL                          ! loop on the liquid components
-!$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)  
+  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)  
   ZCP(:,:)  = ZCP(:,:) + CST%XCL * PRT(:,:,JRR)
-!$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 END DO
 !
 DO JRR = 2+KRRL,1+KRRL+KRRI                ! loop on the solid components   
-!$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZCP(:,:)  = ZCP(:,:)  + CST%XCI * PRT(:,:,JRR)
-!$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 END DO
 !
 !*      2.2 Exner function at t
 !
 IF (OOCEAN) THEN
-!$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZEXN(:,:) = 1.
-!$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 ELSE
-!$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZEXN(:,:) = (PPABST(:,:)/CST%XP00) ** (CST%XRD/CST%XCPD)
-!$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 END IF
 !
 !*      2.3 dissipative heating coeff a t
@@ -590,18 +605,18 @@ ZATHETA(:,:) = 0.0
 ZAMOIST(:,:) = 0.0
 !
 IF (KRRL >=1) THEN
-!
-!*      2.4 Temperature at t
-!
+  !
+  !*      2.4 Temperature at t
+  !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   ZT(:,:) =  PTHLT(:,:) * ZEXN(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-!
-!*       2.5 Lv/Cph/Exn
-!
+  !
+  !*       2.5 Lv/Cph/Exn
+  !
   IF ( KRRI >= 1 ) THEN
     IF (NEBN%LSTATNW) THEN
-    !wc call new functions depending on statnew
+       !wc call new functions depending on statnew
        CALL COMPUTE_FUNCTION_THERMO_NEW_STAT(CST%XALPW,CST%XBETAW,CST%XGAMW,CST%XLVTT,CST%XCL,ZT,ZEXN,ZCP, &
                                  ZLVOCPEXNM,ZAMOIST,ZATHETA)
        CALL COMPUTE_FUNCTION_THERMO_NEW_STAT(CST%XALPI,CST%XBETAI,CST%XGAMI,CST%XLSTT,CST%XCI,ZT,ZEXN,ZCP, &
@@ -612,14 +627,14 @@ IF (KRRL >=1) THEN
       CALL COMPUTE_FUNCTION_THERMO(CST%XALPI,CST%XBETAI,CST%XGAMI,CST%XLSTT,CST%XCI,ZT,ZEXN,ZCP, &
                                  ZLSOCPEXNM,ZAMOIST_ICE,ZATHETA_ICE)
     ENDIF
-!
+    !
     !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
     WHERE(PRT(:,:,2)+PRT(:,:,4)>0.0)
       ZFRAC_ICE(:,:) = PRT(:,:,4) / ( PRT(:,:,2) &
                                           +PRT(:,:,4) )
     END WHERE
     !$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
-!
+    !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZLOCPEXNM(:,:) = (1.0-ZFRAC_ICE(:,:))*ZLVOCPEXNM(:,:) &
                            +ZFRAC_ICE(:,:) *ZLSOCPEXNM(:,:)
@@ -638,8 +653,8 @@ IF (KRRL >=1) THEN
                                    ZLOCPEXNM,ZAMOIST,ZATHETA)
     ENDIF
   END IF
-!
-!
+  !
+  !
   IF ( TPFILE%LOPENED .AND. TURBN%LTURB_DIAG ) THEN
     TZFIELD = TFIELDMETADATA(      &
       CMNHNAME   = 'ATHETA',       &
@@ -653,7 +668,7 @@ IF (KRRL >=1) THEN
       NDIMS      = 3,              &
       LTIMEDEP   = .TRUE.          )
     CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZATHETA)
-!
+    !
     TZFIELD = TFIELDMETADATA(      &
       CMNHNAME   = 'AMOIST',       &
       CSTDNAME   = '',             &
@@ -667,7 +682,7 @@ IF (KRRL >=1) THEN
       LTIMEDEP   = .TRUE.          )
     CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZAMOIST)
   END IF
-!
+  !
 ELSE
   ZLOCPEXNM(:,:)=0.
 END IF              ! loop end on KRRL >= 1
@@ -721,16 +736,16 @@ END IF
 IF (.NOT. TURBN%LHARAT) THEN
 
 SELECT CASE (TURBN%CTURBLEN)
-!
-!*      3.1 BL89 mixing length
-!           ------------------
+  !
+  !*      3.1 BL89 mixing length
+  !           ------------------
 
   CASE ('BL89')
     ZSHEAR(:,:)=0.
     CALL BL89(D,CST,CSTURB,TURBN,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN)
-!
-!*      3.2 RM17 mixing length
-!           ------------------
+  !
+  !*      3.2 RM17 mixing length
+  !           ------------------
 
   CASE ('RM17')
     CALL GZ_U_UW_PHY(D,PUT,PDZZ,ZWORK1)
@@ -746,9 +761,9 @@ SELECT CASE (TURBN%CTURBLEN)
                                     + ZDVDZ(:,:)*ZDVDZ(:,:))
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     CALL BL89(D,CST,CSTURB,TURBN,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN)
-!
-!*      3.3 Grey-zone combined RM17 & Deardorff mixing lengths
-!           --------------------------------------------------
+  !
+  !*      3.3 Grey-zone combined RM17 & Deardorff mixing lengths
+  !           --------------------------------------------------
 
   CASE ('HM21')
     CALL GZ_U_UW_PHY(D,PUT,PDZZ,ZWORK1)
@@ -775,22 +790,22 @@ SELECT CASE (TURBN%CTURBLEN)
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     ZLM(:,:) = MIN(ZLM(:,:),TURBN%XCADAP*ZLMW(:,:))
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-!
-!*      3.4 Delta mixing length
-!           -------------------
-!
+  !
+  !*      3.4 Delta mixing length
+  !           -------------------
+  !
   CASE ('DELT')
     CALL DELT(ZLM,ODZ=.TRUE.)
-!
-!*      3.5 Deardorff mixing length
-!           -----------------------
-!
+  !
+  !*      3.5 Deardorff mixing length
+  !           -----------------------
+  !
   CASE ('DEAR')
     CALL DEAR(ZLM)
-!
-!*      3.6 Blackadar mixing length
-!           -----------------------
-!
+  !
+  !*      3.6 Blackadar mixing length
+  !           -----------------------
+  !
   CASE ('BLKR')
    ZL0 = 100.
    !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -806,14 +821,14 @@ SELECT CASE (TURBN%CTURBLEN)
      ZLM(:,JK) = ZALPHA  * ZLM(:,JK) * ZL0 / ( ZL0 + ZALPHA*ZLM(:,JK) )
      !$mnh_end_expand_array(JIJ=IIJB:IIJE)
    END DO
-!
+   !
    !$mnh_expand_array(JIJ=IIJB:IIJE)
    ZLM(:,IKTB-1) = ZLM(:,IKTB)
    ZLM(:,IKTE+1) = ZLM(:,IKTE)
    !$mnh_end_expand_array(JIJ=IIJB:IIJE)
-!
-!
-!
+   !
+   !
+   !
 END SELECT
 !
 !*      3.5 Mixing length modification for cloud
@@ -889,7 +904,7 @@ IF (TURBN%LROTATE_WIND) THEN
                      PCOSSLOPE,PSINSLOPE,               &
                      PDXX,PDYY,PDZZ,                    &
                      ZUSLOPE,ZVSLOPE                    )
-!
+  !
   CALL UPDATE_ROTATE_WIND(D,ZUSLOPE,ZVSLOPE,HLBCX,HLBCY)
 ELSE
   ZUSLOPE(:)=PUT(:,IKA)
@@ -937,14 +952,14 @@ ZMTHR(:,:) = 0.     ! w'th'r'
 !
 IF (TURBN%CTOM=='TM06') THEN
   CALL TM06(D,CST,PTHVREF,PBL_DEPTH,PZZ,PSFTH,ZMWTH,ZMTH2)
-!
-   CALL GZ_M_W_PHY(D,ZMWTH,PDZZ,ZWORK1)    ! -d(w'2th' )/dz
-   CALL GZ_W_M_PHY(D,ZMTH2,PDZZ,ZWORK2)    ! -d(w'th'2 )/dz
-   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-   ZFWTH(:,:) = -ZWORK1(:,:)
-   ZFTH2(:,:) = -ZWORK2(:,:)
-   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-!
+  !
+  CALL GZ_M_W_PHY(D,ZMWTH,PDZZ,ZWORK1)    ! -d(w'2th' )/dz
+  CALL GZ_W_M_PHY(D,ZMTH2,PDZZ,ZWORK2)    ! -d(w'th'2 )/dz
+  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  ZFWTH(:,:) = -ZWORK1(:,:)
+  ZFTH2(:,:) = -ZWORK2(:,:)
+  !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !
   ZFWTH(:,IKTE:) = 0.
   ZFWTH(:,:IKTB) = 0.
   ZFWR(:,:)  = 0.
@@ -991,33 +1006,37 @@ IF( BUCONF%LBUDGET_RV ) THEN
 END IF
 
 IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RC), 'VTURB', PRRS  (:,:, 2) )
+IF( BUCONF%LBUDGET_RR ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RR), 'VTURB', PRRS  (:,:, 3) )
 IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RI), 'VTURB', PRRS  (:,:, 4) )
+IF( BUCONF%LBUDGET_RS ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'VTURB', PRRS  (:,:, 5) )
+IF( BUCONF%LBUDGET_RG ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'VTURB', PRRS  (:,:, 6) )
+IF( BUCONF%LBUDGET_RH ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'VTURB', PRRS  (:,:, 7) )
 
 IF( BUCONF%LBUDGET_SV ) THEN
   DO JSV = 1, KSV
-    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', PRSVS(:,:, JSV) )
+    CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', ZWORKS(:,:, JSV) )
   END DO
 END IF
 
 CALL TURB_VER(D,CST,CSTURB,TURBN,NEBN,TLES,              &
           KRR,KRRL,KRRI,KGRADIENTS,                      &
           OOCEAN, ODEEPOC, OCOMPUTE_SRC,                 &
-          KSV,KSV_LGBEG,KSV_LGEND,                       &
+          ISV,KSV_LGBEG,KSV_LGEND,                       &
           ZEXPL, O2D, ONOMIXLG, OFLAT,                   &
           OCOUPLES,OBLOWSNOW,OFLYER, PRSNOW,             &
           PTSTEP,TPFILE,                                 &
           PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ,        &
           PCOSSLOPE,PSINSLOPE,                           &
           PRHODJ,PTHVREF,PSFU,PSFV,                      &
-          PSFTH,PSFRV,PSFSV,PSFTH,PSFRV,PSFSV,           &
+          PSFTH,PSFRV,ZWORKSFSV,PSFTH,PSFRV,ZWORKSFSV,   &
           ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU33M,               &
-          PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT,    &
+          PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,ZWORKT,  &
           PTKET,ZLM,PLENGTHM,PLENGTHH,ZLEPS,MFMOIST,     &
           ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE,     &
           ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,PBL_DEPTH,         &
           PSBL_DEPTH,ZLMO,PHGRAD,PZS,                    &
-          PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS,              &
-          PDP,PTP,PSIGS,PWTH,PWRC,PWSV,                  &
+          PRUS,PRVS,PRWS,PRTHLS,PRRS,ZWORKS,             &
+          PDP,PTP,PSIGS,PWTH,PWRC,ZWORKWSV,                  &
           PSSTFL, PSSTFL_C, PSSRFL_C,PSSUFL_C,PSSVFL_C,  &
           PSSUFL,PSSVFL                                  )
 
@@ -1027,6 +1046,27 @@ CALL TURB_VER(D,CST,CSTURB,TURBN,NEBN,TLES,              &
 !   IF (KSV_LIMA_NG.GT.0) PRSVS(:,:,KSV_LIMA_NG) = ZRSVS(:,:,KSV_LIMA_NG) 
 !   IF (KSV_LIMA_NH.GT.0) PRSVS(:,:,KSV_LIMA_NH) = ZRSVS(:,:,KSV_LIMA_NH)
 !END IF
+IF (TURBN%LTURB_PRECIP) THEN
+   IF (KRR.GE.3) PRRS(:,:,3)=ZWORKS(:,:,KSV+3)
+   IF (KRR.GE.5) PRRS(:,:,5)=ZWORKS(:,:,KSV+5)
+   IF (KRR.GE.6) PRRS(:,:,6)=ZWORKS(:,:,KSV+6)
+   IF (KRR.GE.7) PRRS(:,:,7)=ZWORKS(:,:,KSV+7)
+END IF
+
+IF (TURBN%LTURB_PRECIP) THEN
+  IF( BUCONF%LBUDGET_RR ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RR), 'VTURB', PRRS(:,:, 3) )
+  IF( BUCONF%LBUDGET_RS ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'VTURB', PRRS(:,:, 5) )
+  IF( BUCONF%LBUDGET_RG ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'VTURB', PRRS(:,:, 6) )
+  IF( BUCONF%LBUDGET_RH .AND. KRR ==7) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'VTURB', PRRS(:,:, 7) )
+  IF (KRR.GE.3) PRRS(:,:,3)=ZWORKS(:,:,KSV+3)
+  IF (KRR.GE.5) PRRS(:,:,5)=ZWORKS(:,:,KSV+5)
+  IF (KRR.GE.6) PRRS(:,:,6)=ZWORKS(:,:,KSV+6)
+  IF (KRR.GE.7) PRRS(:,:,7)=ZWORKS(:,:,KSV+7)
+  IF( BUCONF%LBUDGET_RR ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RR), 'VTURB', PRRS(:,:, 3) )
+  IF( BUCONF%LBUDGET_RS ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RS), 'VTURB', PRRS(:,:, 5) )
+  IF( BUCONF%LBUDGET_RG ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'VTURB', PRRS(:,:, 6) )
+  IF( BUCONF%LBUDGET_RH .AND. KRR ==7) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'VTURB', PRRS(:,:, 7) )
+END IF
 
 IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_U), 'VTURB', PRUS(:,:) )
 IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_V), 'VTURB', PRVS(:,:) )
@@ -1054,11 +1094,15 @@ IF( BUCONF%LBUDGET_RV ) THEN
 END IF
 
 IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RC), 'VTURB', PRRS(:,:, 2) )
+IF( BUCONF%LBUDGET_RR ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RR), 'VTURB', PRRS(:,:, 3) )
 IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RI), 'VTURB', PRRS(:,:, 4) )
+IF( BUCONF%LBUDGET_RS ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RS), 'VTURB', PRRS(:,:, 5) )
+IF( BUCONF%LBUDGET_RG ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'VTURB', PRRS(:,:, 6) )
+IF( BUCONF%LBUDGET_RH ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'VTURB', PRRS(:,:, 7) )
 
 IF( BUCONF%LBUDGET_SV )  THEN
   DO JSV = 1, KSV
-    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', PRSVS(:,:, JSV) )
+    CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', ZWORKS(:,:, JSV) )
   END DO
 END IF
 !
@@ -1089,15 +1133,19 @@ IF( TURBN%CTURBDIM == '3DIM' ) THEN
   END IF
 
   IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:,:, 2) )
+  IF( BUCONF%LBUDGET_RR ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RR), 'HTURB', PRRS(:,:, 3) )
   IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:,:, 4) )
+  IF( BUCONF%LBUDGET_RS ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'HTURB', PRRS(:,:, 5) )
+  IF( BUCONF%LBUDGET_RG ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'HTURB', PRRS(:,:, 6) )
+  IF( BUCONF%LBUDGET_RH ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'HTURB', PRRS(:,:, 7) )
 
   IF( BUCONF%LBUDGET_SV )  THEN
     DO JSV = 1, KSV
-      CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:,:, JSV) )
+      CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', ZWORKS(:,:, JSV) )
     END DO
   END IF
     CALL TURB_HOR_SPLT(D,CST,CSTURB, TURBN, NEBN, TLES,        &
-          KSPLIT, KRR, KRRL, KRRI, KSV,KSV_LGBEG,KSV_LGEND,    & 
+          KSPLIT, KRR, KRRL, KRRI, ISV,KSV_LGBEG,KSV_LGEND,    & 
           PTSTEP,HLBCX,HLBCY, OFLAT,O2D, ONOMIXLG,             & 
           OOCEAN,OCOMPUTE_SRC,OBLOWSNOW,PRSNOW,                &
           TPFILE, KHALO,                                       &
@@ -1105,14 +1153,14 @@ IF( TURBN%CTURBDIM == '3DIM' ) THEN
           PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,                       &
           PCOSSLOPE,PSINSLOPE,                                 &
           PRHODJ,PTHVREF,                                      &
-          PSFTH,PSFRV,PSFSV,                                   &
+          PSFTH,PSFRV,ZWORKSFSV,                               &
           ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M,             &
-          PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT,          &
+          PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,ZWORKT,        &
           PTKET,ZLM,ZLEPS,                                     &
           ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE,           &
           PDP,PTP,PSIGS,                                       &
           ZTRH,                                                &
-          PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS                     )
+          PRUS,PRVS,PRWS,PRTHLS,PRRS,ZWORKS                    )
   !
 !  IF (HCLOUD == 'LIMA') THEN
 !     IF (KSV_LIMA_NR.GT.0) PRSVS(:,:,KSV_LIMA_NR) = ZRSVS(:,:,KSV_LIMA_NR) 
@@ -1120,6 +1168,21 @@ IF( TURBN%CTURBDIM == '3DIM' ) THEN
 !     IF (KSV_LIMA_NG.GT.0) PRSVS(:,:,KSV_LIMA_NG) = ZRSVS(:,:,KSV_LIMA_NG) 
 !     IF (KSV_LIMA_NH.GT.0) PRSVS(:,:,KSV_LIMA_NH) = ZRSVS(:,:,KSV_LIMA_NH)
 !  END IF
+  !
+  IF (TURBN%LTURB_PRECIP) THEN
+    IF( BUCONF%LBUDGET_RR ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RR), 'HTURB', PRRS(:,:, 3) )
+    IF( BUCONF%LBUDGET_RS ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'HTURB', PRRS(:,:, 5) )
+    IF( BUCONF%LBUDGET_RG ) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'HTURB', PRRS(:,:, 6) )
+    IF( BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'HTURB', PRRS(:,:, 7) )
+    IF (KRR.GE.3) PRRS(:,:,3)=ZWORKS(:,:,KSV+3)
+    IF (KRR.GE.5) PRRS(:,:,5)=ZWORKS(:,:,KSV+5)
+    IF (KRR.GE.6) PRRS(:,:,6)=ZWORKS(:,:,KSV+6)
+    IF (KRR.GE.7) PRRS(:,:,7)=ZWORKS(:,:,KSV+7)
+    IF( BUCONF%LBUDGET_RR ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RR), 'HTURB', PRRS(:,:, 3) )
+    IF( BUCONF%LBUDGET_RS ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RS), 'HTURB', PRRS(:,:, 5) )
+    IF( BUCONF%LBUDGET_RG ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'HTURB', PRRS(:,:, 6) )
+    IF( BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'HTURB', PRRS(:,:, 7) )
+  END IF
   !
   IF( BUCONF%LBUDGET_U ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_U), 'HTURB', PRUS(:,:) )
   IF( BUCONF%LBUDGET_V ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_V), 'HTURB', PRVS(:,:) )
@@ -1147,11 +1210,15 @@ IF( TURBN%CTURBDIM == '3DIM' ) THEN
   END IF
 
   IF( BUCONF%LBUDGET_RC ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:,:, 2) )
+  IF( BUCONF%LBUDGET_RR ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RR), 'HTURB', PRRS(:,:, 3) )
   IF( BUCONF%LBUDGET_RI ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:,:, 4) )
+  IF( BUCONF%LBUDGET_RS ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RS), 'HTURB', PRRS(:,:, 5) )
+  IF( BUCONF%LBUDGET_RG ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'HTURB', PRRS(:,:, 6) )
+  IF( BUCONF%LBUDGET_RH ) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'HTURB', PRRS(:,:, 7) )
 
   IF( BUCONF%LBUDGET_SV )  THEN
     DO JSV = 1, KSV
-      CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:,:, JSV) )
+      CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', ZWORKS(:,:, JSV) )
     END DO
   END IF
 END IF
@@ -1222,9 +1289,9 @@ ENDIF
 !          ---------------------------------------------------------
 !
 IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN
-!
-! stores the mixing length
-!
+  !
+  ! stores the mixing length
+  !
   TZFIELD = TFIELDMETADATA(       &
     CMNHNAME   = 'LM',            &
     CSTDNAME   = '',              &
@@ -1237,11 +1304,11 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN
     NDIMS      = 3,               &
     LTIMEDEP   = .TRUE.           )
   CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,ZLM)
-!
+  !
   IF (KRR /= 0) THEN
-!
-! stores the conservative potential temperature
-!
+    !
+    ! stores the conservative potential temperature
+    !
     TZFIELD = TFIELDMETADATA(                          &
     CMNHNAME   = 'THLM',                               &
     CSTDNAME   = '',                                   &
@@ -1254,9 +1321,9 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN
     NDIMS      = 3,                                    &
     LTIMEDEP   = .TRUE.                                )
     CALL IO_FIELD_WRITE_PHY(D,TPFILE,TZFIELD,PTHLT)
-!
-! stores the conservative mixing ratio
-!
+    !
+    ! stores the conservative mixing ratio
+    !
     TZFIELD = TFIELDMETADATA(                &
     CMNHNAME   = 'RNPM',                     &
     CSTDNAME   = '',                         &
@@ -1272,9 +1339,11 @@ IF ( TURBN%LTURB_DIAG .AND. TPFILE%LOPENED ) THEN
    END IF
 END IF
 !
+PRSVS(:,:,:)        = ZWORKS(:,:,1:KSV)
+IF (OFLYER)   PWSV(:,:,:)=ZWORKWSV(:,:,1:KSV)
 !* stores value of conservative variables & wind before turbulence tendency (AROME only)
 IF(PRESENT(PDRUS_TURB)) THEN
-!$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
+  !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   PDRUS_TURB(:,:)   = PRUS(:,:) - PDRUS_TURB(:,:)
   PDRVS_TURB(:,:)   = PRVS(:,:) - PDRVS_TURB(:,:)
   PDRTHLS_TURB(:,:) = PRTHLS(:,:) - PDRTHLS_TURB(:,:)
@@ -1303,7 +1372,7 @@ IF ( KRRL >= 1 ) THEN
                                     * PRRS(:,:,2) &
                                     + ZLSOCPEXNM(:,:) * PRRS(:,:,4)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
-!
+    !
   ELSE
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
     PRT(:,:,1)  = PRT(:,:,1)  - PRT(:,:,2)
@@ -1314,8 +1383,9 @@ IF ( KRRL >= 1 ) THEN
                                     * PRRS(:,:,2)
     !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   END IF
-END IF
-
+END IF!
+!
+!
 ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets
 CALL SOURCES_NEG_CORRECT_PHY(D,KSV,HCLOUD,HELEC,'NETUR',KRR,PTSTEP,PPABST,PTHLT,PRT,PRTHLS,PRRS,PRSVS)
 !----------------------------------------------------------------------------
@@ -1337,11 +1407,11 @@ IF (TLES%LLES_CALL) THEN
   ZWORK2D(:) = (PSFU(:)*PSFU(:)+PSFV(:)*PSFV(:))**0.25
   !$mnh_end_expand_array(JIJ=IIJB:IIJE)
   CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZWORK2D,TLES%X_LES_USTAR)
-!----------------------------------------------------------------------------
-!
-!*     10. LES for 3rd order moments
-!          -------------------------
-!
+  !----------------------------------------------------------------------------
+  !
+  !*     10. LES for 3rd order moments
+  !          -------------------------
+  !
   CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMWTH,TLES%X_LES_SUBGRID_W2Thl)
   CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMTH2,TLES%X_LES_SUBGRID_WThl2)
   IF (KRR>0) THEN
@@ -1349,12 +1419,12 @@ IF (TLES%LLES_CALL) THEN
     CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMTHR,TLES%X_LES_SUBGRID_WThlRt)
     CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZMR2,TLES%X_LES_SUBGRID_WRt2)
   END IF
-!
-!----------------------------------------------------------------------------
-!
-!*     11. LES quantities depending on <w'2> in "1DIM" mode
-!          ------------------------------------------------
-!
+  !
+  !----------------------------------------------------------------------------
+  !
+  !*     11. LES quantities depending on <w'2> in "1DIM" mode
+  !          ------------------------------------------------
+  !
   IF (TURBN%CTURBDIM=="1DIM") THEN
     !
     !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
@@ -1389,19 +1459,19 @@ IF (TLES%LLES_CALL) THEN
     END DO
   END IF
 
-!----------------------------------------------------------------------------
-!
-!*     12. LES mixing end dissipative lengths, presso-correlations
-!          -------------------------------------------------------
-!
+  !----------------------------------------------------------------------------
+  !
+  !*     12. LES mixing end dissipative lengths, presso-correlations
+  !          -------------------------------------------------------
+  !
   CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZLM,TLES%X_LES_SUBGRID_LMix)
   CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZLEPS,TLES%X_LES_SUBGRID_LDiss)
-!
-!* presso-correlations for subgrid Tke are equal to zero.
-!
+  !
+  !* presso-correlations for subgrid Tke are equal to zero.
+  !
   ZLEPS(:,:) = 0. !ZLEPS is used as a work array (not used anymore)
   CALL LES_MEAN_SUBGRID_PHY(D,TLES,ZLEPS,TLES%X_LES_SUBGRID_WP)
-!
+  !
   CALL SECOND_MNH(ZTIME2)
   TLES%XTIME_LES = TLES%XTIME_LES + ZTIME2 - ZTIME1
 END IF
@@ -1447,33 +1517,33 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PAMOIST,PATHETA
 !
   IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',0,ZHOOK_HANDLE2)
   ZEPS = CST%XMV / CST%XMD
-!
-!*       1.1 Lv/Cph at  t
-!
+  !
+  !*       1.1 Lv/Cph at  t
+  !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   PLOCPEXN(:,:) = ( PLTT + (CST%XCPV-PC) *  (PT(:,:)-CST%XTT) ) &
                                      / PCP(:,:)
-!
-!*      1.2 Saturation vapor pressure at t
-!
+  !
+  !*      1.2 Saturation vapor pressure at t
+  !
   ZRVSAT(:,:) =  EXP( PALP - PBETA/PT(:,:) - PGAM*ALOG( PT(:,:) ) )
-!
-!*      1.3 saturation  mixing ratio at t
-!
+  !
+  !*      1.3 saturation  mixing ratio at t
+  !
   ZRVSAT(:,:) =  ZRVSAT(:,:) &
                                     * ZEPS / ( PPABST(:,:) - ZRVSAT(:,:) )
-!
-!*      1.4 compute the saturation mixing ratio derivative (rvs')
-!
+  !
+  !*      1.4 compute the saturation mixing ratio derivative (rvs')
+  !
   ZDRVSATDT(:,:) = ( PBETA / PT(:,:)  - PGAM ) / PT(:,:)   &
                  * ZRVSAT(:,:) * ( 1. + ZRVSAT(:,:) / ZEPS )
-!
-!*      1.5 compute Amoist
-!
+  !
+  !*      1.5 compute Amoist
+  !
   PAMOIST(:,:)=  0.5 / ( 1.0 + ZDRVSATDT(:,:) * PLOCPEXN(:,:) )
-!
-!*      1.6 compute Atheta
-!
+  !
+  !*      1.6 compute Atheta
+  !
   PATHETA(:,:)= PAMOIST(:,:) * PEXN(:,:) *               &
         ( ( ZRVSAT(:,:) - PRT(:,:,1) ) * PLOCPEXN(:,:) / &
           ( 1. + ZDRVSATDT(:,:) * PLOCPEXN(:,:) )        *               &
@@ -1485,9 +1555,9 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PAMOIST,PATHETA
           )                                                                  &
          - ZDRVSATDT(:,:)                                                  &
         )
-!
-!*      1.7 Lv/Cph/Exner at t-1
-!
+  !
+  !*      1.7 Lv/Cph/Exner at t-1
+  !
   PLOCPEXN(:,:) = PLOCPEXN(:,:) / PEXN(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1515,7 +1585,6 @@ END SUBROUTINE COMPUTE_FUNCTION_THERMO
 !
 !*       0.    DECLARATIONS
 !              ------------
-USE MODD_CST
 !
 IMPLICIT NONE
 !
@@ -1531,35 +1600,35 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)   :: PAMOIST,PATHETA
 !
   IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO_NEW_STAT',0,ZHOOK_HANDLE2)
   ZEPS = CST%XMV / CST%XMD
-!
-!*       1.1 Lv/Cph at  t
-!
+  !
+  !*       1.1 Lv/Cph at  t
+  !
   !$mnh_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
   PLOCPEXN(:,:) = ( PLTT + (CST%XCPV-PC) *  (PT(:,:)-CST%XTT) ) / PCP(:,:)
-!
-!*      1.2 Saturation vapor pressure at t
-!
+  !
+  !*      1.2 Saturation vapor pressure at t
+  !
   ZRVSAT(:,:) =  EXP( PALP - PBETA/PT(:,:) - PGAM*ALOG( PT(:,:) ) )
-!
-!*      1.3 saturation  mixing ratio at t
-!
+  !
+  !*      1.3 saturation  mixing ratio at t
+  !
   ZRVSAT(:,:) =  ZRVSAT(:,:) * ZEPS / ( PPABST(:,:) - ZRVSAT(:,:) )
-!
-!*      1.4 compute the saturation mixing ratio derivative (rvs')
-!
+  !
+  !*      1.4 compute the saturation mixing ratio derivative (rvs')
+  !
   ZDRVSATDT(:,:) = ( PBETA / PT(:,:)  - PGAM ) / PT(:,:)   &
                  * ZRVSAT(:,:) * ( 1. + ZRVSAT(:,:) / ZEPS )
-!
-!*      1.5 compute Amoist
-!
+  !
+  !*      1.5 compute Amoist
+  !
   PAMOIST(:,:)=  1.0 / ( 1.0 + ZDRVSATDT(:,:) * PLOCPEXN(:,:) )
-!
-!*      1.6 compute Atheta
-!
+  !
+  !*      1.6 compute Atheta
+  !
   PATHETA(:,:)= PAMOIST(:,:) * PEXN(:,:) * ZDRVSATDT(:,:)
-!
-!*      1.7 Lv/Cph/Exner at t-1
-!
+  !
+  !*      1.7 Lv/Cph/Exner at t-1
+  !
   PLOCPEXN(:,:) = PLOCPEXN(:,:) / PEXN(:,:)
   !$mnh_end_expand_array(JIJ=IIJB:IIJE,JK=1:IKT)
 !
@@ -1937,23 +2006,23 @@ IF (HTURBLEN_CL == TURBN%CTURBLEN) THEN
   ZLM_CLOUD(:,:) = ZLM(:,:)
 ELSE
   SELECT CASE (HTURBLEN_CL)
-!
-!*         3.1 BL89 mixing length
-!           ------------------
+  !
+  !*         3.1 BL89 mixing length
+  !           ------------------
   CASE ('BL89','RM17','HM21')
     ZSHEAR(:,:)=0.
     CALL BL89(D,CST,CSTURB,TURBN,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD,OOCEAN)
-!
-!*         3.2 Delta mixing length
-!           -------------------
+  !
+  !*         3.2 Delta mixing length
+  !           -------------------
   CASE ('DELT')
     CALL DELT(ZLM_CLOUD,ODZ=.TRUE.)
-!
-!*         3.3 Deardorff mixing length
-!           -----------------------
+  !
+  !*         3.3 Deardorff mixing length
+  !           -----------------------
   CASE ('DEAR')
     CALL DEAR(ZLM_CLOUD)
-!
+  !
   END SELECT
 ENDIF
 !
diff --git a/src/Rules.LXcray.mk b/src/Rules.LXcray.mk
index b1579f030f00360fb1d80bba93a12b5bbcbc5208..166dbcd9d2701f3f9a845f5220dae693beeb8cfb 100644
--- a/src/Rules.LXcray.mk
+++ b/src/Rules.LXcray.mk
@@ -55,7 +55,7 @@ ifeq "$(OPTLEVEL)" "DEBUG"
 OPT       = $(OPT_BASE) $(OPT_PERF0) $(OPT_CHECK)
 OPT0      = $(OPT_BASE) $(OPT_PERF0) $(OPT_CHECK)
 OPT_NOCB  = $(OPT_BASE) $(OPT_PERF0)
-CFLAGS   += -g -gdwarf-4
+CFLAGS   += "-g -gdwarf-4"
 endif
 #
 ifeq "$(OPTLEVEL)" "OPENACC"
@@ -249,9 +249,10 @@ MNH_COMPRESS=yes
 MNH_GRIBAPI=no
 #
 NETCDF_SUPPFLAGS='-emf'
-ECCODES_FFLAGS='-emf -hsystem_alloc'
-ECCODES_CFLAGS=' -gdwarf-4 '
-EC_CONF='-DIEEE_LE=1'
+ECCODES_FFLAGS="-hcpu=x86-64 -emf"
+# -hsystem_alloc
+ECCODES_CFLAGS="-hcpu=x86-64 -gdwarf-4"
+EC_CONF= -DCMAKE_BUILD_TYPE="RELEASE" -DIEEE_LE=1 
 CDF_CONF= CPP=cpp 
 HDF_CONF= CPP=cpp 
 #
diff --git a/src/SURFEX/av_pgd.F90 b/src/SURFEX/av_pgd.F90
index 7d88e48f0b9a1c521e3bc04d466e4ee7b2f58398..e8b7b380720aa4b1508450cf514f8923301398c6 100644
--- a/src/SURFEX/av_pgd.F90
+++ b/src/SURFEX/av_pgd.F90
@@ -1677,6 +1677,7 @@ USE MODE_AV_PGD
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/av_pgd_1p.F90 b/src/SURFEX/av_pgd_1p.F90
index 663f88a82a73ca29d4892cdc6a2edf5a877757e1..d0e662401499866fcb78d57f98aa6d2e9d4f96e7 100644
--- a/src/SURFEX/av_pgd_1p.F90
+++ b/src/SURFEX/av_pgd_1p.F90
@@ -785,6 +785,7 @@ USE MODE_AV_PGD
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/averaged_albedo_teb.F90 b/src/SURFEX/averaged_albedo_teb.F90
index 0b8569df542b003debe1c15b4b80568076d0d70d..8bd0364c0de1c62825e6acd289e776985595685d 100644
--- a/src/SURFEX/averaged_albedo_teb.F90
+++ b/src/SURFEX/averaged_albedo_teb.F90
@@ -62,6 +62,8 @@ USE MODE_SURF_SNOW_FRAC
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
 !
+USE MODI_DIAG_MISC_TEB_INIT_n
+!
 IMPLICIT NONE
 !
 !*    0.1    Declaration of arguments
diff --git a/src/SURFEX/avg_urban_fluxes.F90 b/src/SURFEX/avg_urban_fluxes.F90
index dcee5b764dd3a74426d85818e0f8f7f8be831d4a..cffb2cec6bdbf6408f4f5fd353c2b5ac210f5aaf 100644
--- a/src/SURFEX/avg_urban_fluxes.F90
+++ b/src/SURFEX/avg_urban_fluxes.F90
@@ -84,6 +84,8 @@ USE MODD_CSTS,ONLY : XCPD, XLVTT, XLSTT, XSTEFAN, XSURF_EPSILON
 USE MODD_ISBA_PAR, ONLY : XEMISVEG
 !
 USE MODE_THERMOS
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
diff --git a/src/SURFEX/bem.F90 b/src/SURFEX/bem.F90
index cefa2915c9b2b3867047181055a754697fb3f235..5de544ed2fde728532b3e78b25b96c90a5dda4f3 100644
--- a/src/SURFEX/bem.F90
+++ b/src/SURFEX/bem.F90
@@ -174,6 +174,8 @@ USE MODE_CONV_DOE
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/bld_occ_calendar.F90 b/src/SURFEX/bld_occ_calendar.F90
index a24e47b8e5ed337172ed597c88f8fc90414203f8..4a1a96777b3c242f73e1a90583d78402da966980 100644
--- a/src/SURFEX/bld_occ_calendar.F90
+++ b/src/SURFEX/bld_occ_calendar.F90
@@ -28,6 +28,8 @@ USE MODI_DAY_OF_WEEK
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/bldsoil_layer_e_budget.F90 b/src/SURFEX/bldsoil_layer_e_budget.F90
index 10f249c54d28593444c6a1a3dec09d556582afae..595330e45834baa5e3e44607542b49ef26c4474a 100644
--- a/src/SURFEX/bldsoil_layer_e_budget.F90
+++ b/src/SURFEX/bldsoil_layer_e_budget.F90
@@ -90,6 +90,8 @@ USE MODI_LAYER_E_BUDGET_GET_COEF
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/carbon_dynamic.F90 b/src/SURFEX/carbon_dynamic.F90
index 95d1773afde1b1508cb824c9314c21cd8bbb55c8..dfefff9c2dc0cf88a9a95dcab53127cc2e7c1102 100644
--- a/src/SURFEX/carbon_dynamic.F90
+++ b/src/SURFEX/carbon_dynamic.F90
@@ -51,6 +51,7 @@ USE MODD_CSTS,         ONLY : XSIYEA, XTT
 USE MODD_SOILCARB_PAR, ONLY : XADVREF
 !
 USE MODE_HYDRO_DIF
+USE MODI_ABOR1_SFX
 !
 USE YOMHOOK,  ONLY : LHOOK,   DR_HOOK
 USE PARKIND1, ONLY : JPRB
diff --git a/src/SURFEX/check_teb.F90 b/src/SURFEX/check_teb.F90
index 746bec726fd932c501736c6171ddcec2c7db4701..8d552501e76e07c0ebd7d77369921f7001bc3dce 100644
--- a/src/SURFEX/check_teb.F90
+++ b/src/SURFEX/check_teb.F90
@@ -51,6 +51,7 @@ SUBROUTINE CHECK_TEB (TOP, BOP, NT, NB, TD, TPN, TIR, GDM, GRM, HM, CT, &
   USE PARKIND1, ONLY : JPRB
   !
   USE MODI_ABOR1_SFX
+  USE MODI_GET_LUOUT
   !
   IMPLICIT NONE
   !
diff --git a/src/SURFEX/compute_isba_parameters.F90 b/src/SURFEX/compute_isba_parameters.F90
index d365e323ece591f11867c99836db4fbf3759aba1..f0218f8eb59eb3ac7ad5db450d85ee19e35a342d 100644
--- a/src/SURFEX/compute_isba_parameters.F90
+++ b/src/SURFEX/compute_isba_parameters.F90
@@ -137,7 +137,7 @@ USE MODI_MAKE_CHOICE_ARRAY
 USE MODI_READ_SURF
 USE MODI_READ_ISBA_n
 USE MODI_READ_ISBA_NUDGING_n
-!USE MODI_INIT_ISBA_LANDUSE
+USE MODI_INIT_ISBA_LANDUSE
 USE MODI_READ_SBL_n
 USE MODI_INIT_VEG_n
 USE MODI_INIT_CHEMICAL_n
diff --git a/src/SURFEX/convert_patch_isba.F90 b/src/SURFEX/convert_patch_isba.F90
index 077479d44e07e0135022afc7e9742430c0472b78..d1484ea336a6d6c09385c3e25551f69919da22ea 100644
--- a/src/SURFEX/convert_patch_isba.F90
+++ b/src/SURFEX/convert_patch_isba.F90
@@ -106,6 +106,7 @@ USE MODI_VEGTYPE_TO_PATCH_IRRIG
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/coupling_seafluxn.F90 b/src/SURFEX/coupling_seafluxn.F90
index 0b2e046e6b641b1d618ebec9fffb350e839e2e89..f7884913a98b6b0938d3bc4a373699a4e0365819 100644
--- a/src/SURFEX/coupling_seafluxn.F90
+++ b/src/SURFEX/coupling_seafluxn.F90
@@ -115,6 +115,7 @@ USE MODI_SEAICE_GELATO1D_n
 !
 USE MODI_COUPLING_SLT_n
 USE MODI_GET_LUOUT
+USE MODI_COUPLING_DMS_n
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/coupling_teb_orographyn.F90 b/src/SURFEX/coupling_teb_orographyn.F90
index 83698fe146933406e3fd36d4e97e104fc751dcc9..6f4d36866fa95074b41e25e3e91a28fe67613cc0 100644
--- a/src/SURFEX/coupling_teb_orographyn.F90
+++ b/src/SURFEX/coupling_teb_orographyn.F90
@@ -61,6 +61,7 @@ USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
 !
 USE MODI_COUPLING_TEB_n
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/coupling_tebn.F90 b/src/SURFEX/coupling_tebn.F90
index 919d77f05b8421e091596277d4baa46526322648..3626e37642f404c87e3d89aed12dd4ada8bb2a5c 100644
--- a/src/SURFEX/coupling_tebn.F90
+++ b/src/SURFEX/coupling_tebn.F90
@@ -114,6 +114,8 @@ USE MODI_TEB_CANOPY
 USE MODI_TRAFFIC_FLUX_MODULATION
 USE MODI_UTCI_TEB
 USE MODI_UTCIC_STRESS
+USE MODI_BUDGET_HYDRO_n
+USE MODI_GET_LUOUT
 ! 
 USE YOMHOOK, ONLY : LHOOK, DR_HOOK
 USE PARKIND1, ONLY : JPRB
diff --git a/src/SURFEX/coupling_townn.F90 b/src/SURFEX/coupling_townn.F90
index 70e9de4eb58f29d376baf562926c2bbb4d552806..ff83179ff371824572bdd1c1dde97f2cddbbc474 100644
--- a/src/SURFEX/coupling_townn.F90
+++ b/src/SURFEX/coupling_townn.F90
@@ -54,6 +54,7 @@ USE PARKIND1  ,ONLY : JPRB
 USE MODI_COUPLING_IDEAL_FLUX
 !
 USE MODI_COUPLING_TEB_OROGRAPHY_n
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/floor_layer_e_budget.F90 b/src/SURFEX/floor_layer_e_budget.F90
index bd5fbb4db721e63b1510ea1a16181dd19ee6d34f..31b7907b3f5b803fe2b98148d22ea9f229762571 100644
--- a/src/SURFEX/floor_layer_e_budget.F90
+++ b/src/SURFEX/floor_layer_e_budget.F90
@@ -84,6 +84,8 @@ USE MODE_CONV_DOE
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/hvac_autosize.F90 b/src/SURFEX/hvac_autosize.F90
index 6e73993978a1f2b3695c6bac180d4851a167f332..541f4a4c09fa8dbb0ffb277cee2f1834500e99c0 100644
--- a/src/SURFEX/hvac_autosize.F90
+++ b/src/SURFEX/hvac_autosize.F90
@@ -64,10 +64,12 @@ USE MODI_DIAG_MISC_TEB_INIT_n
 USE MODI_ALLOC_LW_COEF
 USE MODI_DEALLOC_LW_COEF
 USE MODI_EXPLICIT_LONGWAVE
+USE MODI_ABOR1_SFX
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
-!
+USE MODI_ALLOC_CHECK_TEB
+USE MODI_DEALLOC_CHECK_TEB
 #ifdef AIX64 
 !$ USE OMP_LIB
 #endif
diff --git a/src/SURFEX/ini_data_param_teb.F90 b/src/SURFEX/ini_data_param_teb.F90
index 6e45707b41b70202d050a61546c5e843c63018ff..4f6d07cc6e3df78e9b784ebb5eff817ea1438117 100644
--- a/src/SURFEX/ini_data_param_teb.F90
+++ b/src/SURFEX/ini_data_param_teb.F90
@@ -61,9 +61,11 @@ USE MODD_DATA_TEB_n, ONLY : DATA_TEB_t
 USE MODD_CSTS, ONLY : XSURF_EPSILON
 !
 USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_BLDCODE
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/init_isba_landuse.F90 b/src/SURFEX/init_isba_landuse.F90
index 82816a301995a3598ed4f1efe96a967c9f305ad8..7258563d248b7a7209157d1b29db5e207b2b87ad 100644
--- a/src/SURFEX/init_isba_landuse.F90
+++ b/src/SURFEX/init_isba_landuse.F90
@@ -2,6 +2,79 @@
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
+MODULE MODI_INIT_ISBA_LANDUSE
+
+INTERFACE  
+  
+!#############################################################
+SUBROUTINE INIT_ISBA_LANDUSE (IG, IO, S, K, NK, NP, NPE, DTI, HPROGRAM, KI)  
+!#############################################################
+!
+!!****  *INIT_ISBA_LANDUSE* - routine to initialize land use for ISBA field
+!!
+!!    PURPOSE
+!!    -------
+!!
+!!**  METHOD
+!!    ------
+!!
+!!    EXTERNAL
+!!    --------
+!!
+!!
+!!    IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!
+!!    AUTHOR
+!!    ------
+!!      B. Decharme   *Meteo France*
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    07/2011
+!!      Completelly reframed 08/2016 R. Séférian
+!!      R. Séférian 10/2016 correct error in landuse computation fields
+!!      R. Séférian 11/2016 : add cmip6 diagnostics
+!!      J. Colin    12/2017 : add computations in case the water or snow is
+!!                            nudged seperately on each patch
+!!
+!-------------------------------------------------------------------------------
+!
+!*       0.    DECLARATIONS
+!              ------------
+!
+USE MODD_SFX_GRID_n,     ONLY : GRID_t
+USE MODD_ISBA_OPTIONS_n, ONLY : ISBA_OPTIONS_t
+USE MODD_ISBA_n,         ONLY : ISBA_S_t, ISBA_K_t, ISBA_NK_t, &
+                                ISBA_NP_t, ISBA_NPE_t
+USE MODD_DATA_ISBA_n,    ONLY : DATA_ISBA_t
+!
+IMPLICIT NONE
+!
+!*       0.1   Declarations of arguments
+!              -------------------------
+!
+TYPE(GRID_t),          INTENT(INOUT) :: IG
+TYPE(ISBA_OPTIONS_t),  INTENT(INOUT) :: IO
+TYPE(ISBA_S_t),        INTENT(INOUT) :: S
+TYPE(ISBA_K_t),        INTENT(INOUT) :: K
+TYPE(ISBA_NK_t),       INTENT(INOUT) :: NK
+TYPE(ISBA_NP_t),       INTENT(INOUT) :: NP
+TYPE(ISBA_NPE_t),      INTENT(INOUT) :: NPE
+TYPE(DATA_ISBA_t),     INTENT(INOUT) :: DTI
+!
+CHARACTER(LEN=6),                 INTENT(IN)    :: HPROGRAM          ! program calling surf. schemes
+INTEGER,                          INTENT(IN)    :: KI
+!
+END SUBROUTINE INIT_ISBA_LANDUSE
+
+END INTERFACE
+
+END MODULE MODI_INIT_ISBA_LANDUSE
 !#############################################################
 SUBROUTINE INIT_ISBA_LANDUSE (IG, IO, S, K, NK, NP, NPE, DTI, HPROGRAM, KI)  
 !#############################################################
diff --git a/src/SURFEX/init_teb_soil_grid.F90 b/src/SURFEX/init_teb_soil_grid.F90
index f7bb60294797e0960c6d00ff629e8c7e67ecdbb3..e16f8fb86471b7426aaaca39c1e0de6a0432079f 100644
--- a/src/SURFEX/init_teb_soil_grid.F90
+++ b/src/SURFEX/init_teb_soil_grid.F90
@@ -40,6 +40,8 @@ USE MODI_AV_PGD
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/isba_meb.F90 b/src/SURFEX/isba_meb.F90
index f1d0d5dc1bd7456949b157ccd0ad234e1de338a4..e88d190931362961cb1e45f5281ece1ad227e3c7 100644
--- a/src/SURFEX/isba_meb.F90
+++ b/src/SURFEX/isba_meb.F90
@@ -114,6 +114,7 @@ USE MODN_IO_OFFLINE ,      ONLY : XTSTEP_SURF    ! time step of the surface
 !
 USE MODD_AGRI,             ONLY : LIRRIGMODE
 !
+USE MODI_ABOR1_SFX
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
diff --git a/src/SURFEX/lt_date.F90 b/src/SURFEX/lt_date.F90
index c2420bae28ec8074465015a673f89cbce45dfeaa..6ed308b67d0bea10b0ff4c685f481e0ca209e5a7 100644
--- a/src/SURFEX/lt_date.F90
+++ b/src/SURFEX/lt_date.F90
@@ -2,6 +2,19 @@
 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !SFX_LIC for details. version 1.
+MODULE MODI_LT_DATE
+INTERFACE
+FUNCTION LT_DATE(DATE1, DATE2)
+USE MODD_TYPE_DATE_SURF
+!
+IMPLICIT NONE
+!
+TYPE(DATE_TIME), INTENT(IN) :: DATE1, DATE2
+LOGICAL   :: LT_DATE !Boolean flush to true if date1 is lower than date2
+END FUNCTION LT_DATE
+END INTERFACE
+END MODULE MODI_LT_DATE
+!
 FUNCTION LT_DATE(DATE1, DATE2)
 !!
 !!***  *LT_DATE* - 
@@ -30,6 +43,8 @@ FUNCTION LT_DATE(DATE1, DATE2)
 !!    ------------------
 !
 USE MODD_TYPE_DATE_SURF
+!
+IMPLICIT NONE
 !
   TYPE(DATE_TIME), INTENT(IN) :: DATE1, DATE2
   LOGICAL   :: LT_DATE !Boolean flush to true if date1 is lower than date2
diff --git a/src/SURFEX/mass_layer_e_budget.F90 b/src/SURFEX/mass_layer_e_budget.F90
index febb0b57102830cf6d490c5b02ffb3ea92245059..32d1dfcc1e53da43bfb9d9c051bb8c1dbe29e541 100644
--- a/src/SURFEX/mass_layer_e_budget.F90
+++ b/src/SURFEX/mass_layer_e_budget.F90
@@ -79,6 +79,7 @@ USE MODI_GET_LUOUT
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/modd_coupling_topd.F90 b/src/SURFEX/modd_coupling_topd.F90
deleted file mode 100644
index aea8813e80efb5523ec2d37a73d55b66b19a45ac..0000000000000000000000000000000000000000
--- a/src/SURFEX/modd_coupling_topd.F90
+++ /dev/null
@@ -1,144 +0,0 @@
-!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
-!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
-!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
-!SFX_LIC for details. version 1.
-!     ###########################
-      MODULE MODD_COUPLING_TOPD
-!     ###########################
-!
-!!****  *MODD_COUPLING_TOPD - declaration of exchanged variables from Topodyn to ISBA
-!!
-!!    PURPOSE
-!!    -------
-!
-!!
-!!**  IMPLICIT ARGUMENTS
-!!    ------------------
-!!      None 
-!!
-!!    REFERENCE
-!!    ---------
-!!
-!!    AUTHOR
-!!    ------
-!!     F. Habets and K. Chancibault
-!!
-!!    MODIFICATIONS
-!!    -------------
-!!     Original 29/09/03
-!!              03/2014 (B. Vincendon) new variable to create a mask for N patches
-!!              07/2017 (B. Vincendon) changing name of variable to ditinguish between 
-!!                                     packed and full grid variables + new variables 
-!!                                     for runoff management
-!
-!*       0.   DECLARATIONS
-!             ------------
-USE MODD_TOPD_PAR, ONLY : JPCAT
-!
-IMPLICIT NONE
-!
-!-------------------------------------------------------------------------------
-!
-LOGICAL                           :: LCOUPL_TOPD      !if T, performs coupling with Topmodel
-LOGICAL                           :: LBUDGET_TOPD     !if T, computes budget
-LOGICAL                           :: LTOPD_STEP
-LOGICAL                           :: LPERT_PARAM
-LOGICAL                           :: LPERT_INIT
-!
-INTEGER                             :: NTOPD_STEP
-INTEGER                             :: NFREQ_MAPS_WG       !frequency of output WG maps
-INTEGER                             :: NFREQ_MAPS_ASAT     !frequency of output ASAT maps
-INTEGER                             :: NFREQ_MAPS_RUNOFF   !frequency of output RUNOFF maps
-!
-INTEGER                             :: NNB_TOPD   ! Ratio between Time steps of Topmodel and ISBA
-!
-INTEGER                             :: NIMAX     ! number of ISBA grid points on 
-                                                 ! abscissa axis
-INTEGER                             :: NJMAX     ! number of ISBA grid points on ordinate 
-                                                 ! axis
-REAL, ALLOCATABLE, DIMENSION(:)     :: XXI ! Extended Lambert II coordinates of Isba 
-REAL, ALLOCATABLE, DIMENSION(:)     :: XYI ! nodes 
-!
-INTEGER, ALLOCATABLE, DIMENSION(:)     :: NNPIX     ! Number of Topmodel pixels in an ISBA mesh
-INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: NMASKI ! pixel number of each catchment in each isba mesh
-INTEGER, ALLOCATABLE, DIMENSION(:,:)   :: NMASKT    ! mask
-INTEGER, ALLOCATABLE, DIMENSION(:)     :: NMASKT_PATCH    ! mask
-!
-REAL, ALLOCATABLE, DIMENSION(:)     :: XAS_NATURE   ! Packed contributive area fraction on Nature grid
-REAL, ALLOCATABLE, DIMENSION(:,:)   :: XAS_IBV_P   ! Packed contributive area fraction on Nature grid by catchment
-REAL, ALLOCATABLE, DIMENSION(:,:)   :: XAIBV_F     ! Unpacked area fraction of each catchment on Full grid
-REAL, ALLOCATABLE, DIMENSION(:)     :: XATOP        ! Unpacked area fraction of all cacthments on Full grid
-REAL, ALLOCATABLE, DIMENSION(:)     :: XATOP_NATURE ! Packed area fraction of all cacthments  on Nature grid
-!
-INTEGER, ALLOCATABLE, DIMENSION(:,:)  :: NNBV_IN_MESH   ! Number of pixel of a partical cathment in an ISBA mesh
-REAL, ALLOCATABLE, DIMENSION(:,:)     :: XBV_IN_MESH    ! Area of the ISBA meshes covered by a partical cathment
-REAL, ALLOCATABLE, DIMENSION(:)       :: XTOTBV_IN_MESH ! Area of the ISBA meshes covered by all cathments
-!
-REAL, ALLOCATABLE, DIMENSION(:)     :: XDTOPI   ! depth of the soil for lateral 
-                                                ! distribution on ISBA grid (m)
-REAL, ALLOCATABLE, DIMENSION(:,:)   :: XDTOPT   ! depth of the Isba soil on TOP-LAT 
-                                                ! grid (m)
-!
-REAL, ALLOCATABLE, DIMENSION(:)     :: XWG_FULL   ! Water content from Isba on the full domain
-REAL, ALLOCATABLE, DIMENSION(:,:)   :: XWGT     ! ISBA water content 
-!
-REAL, ALLOCATABLE, DIMENSION(:)     :: XWSTOPI  ! total water content at saturation (m3/m3)
-                                                ! on XDTOPI on ISBA grid
-REAL, ALLOCATABLE, DIMENSION(:,:)   :: XWSTOPT  ! total water content at saturation (m3/m3)
-                                                ! on XDTOPT on TOP-LAT grid
-REAL, ALLOCATABLE, DIMENSION(:)     :: XWFCTOPI ! total field capacity on XDTOPI (m3/m3)
-REAL, ALLOCATABLE, DIMENSION(:,:)   :: XWFCTOPT ! total field capacity on XDTOPT (m3/m3)
-REAL, ALLOCATABLE, DIMENSION(:)     :: XWWTOPI  ! hydraulic conductivity at saturation on 
-                                                ! Isba grid, on XDTOPI
-REAL, ALLOCATABLE, DIMENSION(:,:)   :: XWWTOPT  
-REAL, ALLOCATABLE, DIMENSION(:,:)   :: XWTOPT   ! water storage on TOP-LAT grid, after
-                                                ! lateral distribution
-REAL, ALLOCATABLE, DIMENSION(:,:)   ::  XRUNOFF_IBV_P! Runoff by mesh and catchment on isba grid
-REAL, ALLOCATABLE, DIMENSION(:)       :: XWOVSATI_P  ! Volume of water above saturation buy mesh on isba grid
-!
-! * pour bilans
-REAL, ALLOCATABLE, DIMENSION(:)       :: XAVG_RUNOFFCM !cumulated runoff  (kg/m2) at t-dt
-REAL, ALLOCATABLE, DIMENSION(:)       :: XAVG_DRAINCM ! cumulated drainage calculated from Isba (kg/m2) at t-dt
-REAL, ALLOCATABLE, DIMENSION(:)       :: XRAINFALLCM ! cumulated rainfall calculated from Isba (kg/m2) at t-dt
-REAL, ALLOCATABLE, DIMENSION(:)       :: XAVG_HORTCM ! cumulated Horton calculated from Isba (kg/m2) at t-dt
-!
-REAL, ALLOCATABLE, DIMENSION(:,:)     :: XKA_PRE   ! Hydrological indexes at the previous time step
-REAL, ALLOCATABLE, DIMENSION(:)       :: XKAC_PRE  ! Hydrological index at saturation at the previous time step
-!
-REAL, ALLOCATABLE, DIMENSION(:,:)     :: XDMAXFC   ! Deficit at the field capacity level
-!
-REAL, ALLOCATABLE, DIMENSION(:)      ::  XDRAIN_TOP ! Value of drainage on TOPMODEL grid
-!
-REAL, ALLOCATABLE, DIMENSION(:)      ::  XFRAC_D2 ! fraction of the second layer concerned with lateral transferts
-REAL, ALLOCATABLE, DIMENSION(:)      ::  XFRAC_D3 ! fraction of the third layer concerned with lateral transferts
-!
-REAL, ALLOCATABLE, DIMENSION(:)      ::  XWGI_FULL ! soil ice content
-!
-REAL, ALLOCATABLE, DIMENSION(:,:)    :: XRUN_TOROUT,XDR_TOROUT
-!
-LOGICAL                              :: LSTOCK_TOPD ! true to stock runoff and drainage values (for another simulation)
-!
-INTEGER                              :: NNB_STP_RESTART ! number of time step to restart from a previous simulation
-INTEGER                              :: NNB_STP_STOCK   ! number of time step to write for the next simulation
-!
-INTEGER, DIMENSION(:), ALLOCATABLE :: NYEAR      ! Year of the beginning of the simulation.
-INTEGER, DIMENSION(:), ALLOCATABLE :: NMONTH     ! Month of the beginning of the simulation.
-INTEGER, DIMENSION(:), ALLOCATABLE :: NDAY      ! Date of the beginning of the simulation.
-INTEGER, DIMENSION(:), ALLOCATABLE :: NH      ! Hour of the bFginning of the simulation.
-INTEGER, DIMENSION(:), ALLOCATABLE :: NM      ! Minutes of the beginning of the simulation.
-!
-! **** For special f, dc exponential profile
-REAL, DIMENSION(:), ALLOCATABLE :: XF_PARAM
-REAL, DIMENSION(:), ALLOCATABLE :: XC_DEPTH_RATIO
-!
-! **** For sub-catchments 
-LOGICAL                           :: LDUMMY_SUBCAT    !if T, dummy sub-catchments defined
-LOGICAL                           :: LSUBCAT          !if T, sub-catchments will be computed
-INTEGER, DIMENSION(JPCAT)         :: NSUBCAT
-REAL,    DIMENSION(JPCAT,JPCAT)   :: XLX,XLY
-REAL,    DIMENSION(JPCAT,JPCAT)   :: XQ2,XQ10,XQ50
-CHARACTER(LEN=15), DIMENSION(JPCAT,JPCAT):: CSUBCAT         ! Names of catchments         
-CHARACTER(LEN=15), DIMENSION(JPCAT):: CFILE_SUBCAT         ! File containing Sub cat information         
-LOGICAL                           :: LWRITE_SEVERITY_MAPS !if T, severity maps  will be computed
-!
-END MODULE MODD_COUPLING_TOPD
diff --git a/src/SURFEX/mode_coherence_frac.F90 b/src/SURFEX/mode_coherence_frac.F90
index 9599d81b85f3bcdef5bb29875033d417b6c25955..d68bb4a99a61161133b59aaaa4b5493ca9042d16 100644
--- a/src/SURFEX/mode_coherence_frac.F90
+++ b/src/SURFEX/mode_coherence_frac.F90
@@ -53,6 +53,8 @@ SUBROUTINE COHERENCE_FRAC(HPROGRAM,PFRAC_VALUE, CD_NAME, L_SUM_CHECK)
 USE MODD_CSTS ,ONLY : XSURF_EPSILON
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
@@ -147,6 +149,7 @@ USE MODD_DATA_BEM_n, ONLY : DATA_BEM_t
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/mode_psychro.F90 b/src/SURFEX/mode_psychro.F90
index 1d85dd332a80903f827e2a94005300745b1f08b2..42d795ff1952e15720600f649f8e224ff5f474d3 100644
--- a/src/SURFEX/mode_psychro.F90
+++ b/src/SURFEX/mode_psychro.F90
@@ -262,6 +262,7 @@ function TWB_FROM_TPQ_1D(PT, PP, PQ) RESULT(PTWB)
 !
 USE MODE_THERMOS
 USE MODD_CSTS, ONLY : XTT
+USE MODI_ABOR1_SFX
 !
 ! Robert:
 ! The original version of this calculation based on an iteration
diff --git a/src/SURFEX/pgd_surf_atm.F90 b/src/SURFEX/pgd_surf_atm.F90
index 2d09c380bc00b13a9397a86e285f7ec05e83ba28..27ad27f3510e88ed29f95aa940ffb65ec2d90da1 100644
--- a/src/SURFEX/pgd_surf_atm.F90
+++ b/src/SURFEX/pgd_surf_atm.F90
@@ -81,6 +81,7 @@ USE MODI_PGD_DMS
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/prep_teb.F90 b/src/SURFEX/prep_teb.F90
index b4057032cba591b18b8d5cea0a9d11b170da45b4..b8a2c1f9c23be91877c133b1dc07632eaf09e923 100644
--- a/src/SURFEX/prep_teb.F90
+++ b/src/SURFEX/prep_teb.F90
@@ -73,6 +73,7 @@ USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
 !
 USE MODI_CLEAN_PREP_OUTPUT_GRID
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/read_csvdata_archi_teb.F90 b/src/SURFEX/read_csvdata_archi_teb.F90
index 5240a31885d6aefdfa620287e6f61496905381ea..c6d94b9d311afb1bfb4abe1a87e30023fb9de40e 100644
--- a/src/SURFEX/read_csvdata_archi_teb.F90
+++ b/src/SURFEX/read_csvdata_archi_teb.F90
@@ -47,6 +47,7 @@ SUBROUTINE READ_CSVDATA_ARCHI_TEB(BDD, HPROGRAM, HFILE)
   !
   USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
   USE PARKIND1  ,ONLY : JPRB
+  USE MODI_BLDCODE
   !
   IMPLICIT NONE
   !
diff --git a/src/SURFEX/read_pgd_teb_parn.F90 b/src/SURFEX/read_pgd_teb_parn.F90
index 0dbf024ec259cc434ff4ae3303ec22363a356541..cf84d552874a632782d99ca42d8fa5ee570b5389 100644
--- a/src/SURFEX/read_pgd_teb_parn.F90
+++ b/src/SURFEX/read_pgd_teb_parn.F90
@@ -1525,6 +1525,8 @@ END SUBROUTINE READ_FIELD
 !_______________________________
 SUBROUTINE READ_FIELD_2D(HRECFM,PFIELD,YDIR)
 !
+USE MODI_HOR_INTERPOL  
+!  
 IMPLICIT NONE
 !
 CHARACTER(LEN=*),           INTENT(IN)  :: HRECFM ! name of record in the file
diff --git a/src/SURFEX/roof_layer_e_budget.F90 b/src/SURFEX/roof_layer_e_budget.F90
index 4743ec132f8ec92e6ce9537d91f150105120fa80..b338e4698f5ad058189c434f1dc427d8e1241459 100644
--- a/src/SURFEX/roof_layer_e_budget.F90
+++ b/src/SURFEX/roof_layer_e_budget.F90
@@ -108,6 +108,8 @@ USE MODE_CONV_DOE
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/snow_cover_1layer.F90 b/src/SURFEX/snow_cover_1layer.F90
index 7de03b9cc27f8d5a6472cdb1e803b0c6b8eb14ee..afd5d23111ee2f786f833b2695c8dd48953fc064 100644
--- a/src/SURFEX/snow_cover_1layer.F90
+++ b/src/SURFEX/snow_cover_1layer.F90
@@ -74,6 +74,8 @@ USE MODI_SURFACE_AERO_COND
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/solar_panel.F90 b/src/SURFEX/solar_panel.F90
index 5eb503fc4eba78fbc63e125247599ebd0745810e..24d4ab77536b07e9d18da9fada9d396e969a122a 100644
--- a/src/SURFEX/solar_panel.F90
+++ b/src/SURFEX/solar_panel.F90
@@ -50,6 +50,9 @@ USE MODD_DIAG_MISC_TEB_n, ONLY : DIAG_MISC_TEB_t
 USE MODD_SURF_PAR, ONLY : XUNDEF
 USE MODD_CSTS,     ONLY : XSTEFAN
 !
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
+!
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
 !
diff --git a/src/SURFEX/switch_time.F90 b/src/SURFEX/switch_time.F90
index 16f80829a6d2e4b15754d576646b45531dbdaa3d..4ebcdd2269e236f95c325803c6844e7c96a8dfa3 100644
--- a/src/SURFEX/switch_time.F90
+++ b/src/SURFEX/switch_time.F90
@@ -43,6 +43,8 @@ USE MODD_CSTS,        ONLY: XDAY
 !
 USE MODI_ADD_FORECAST_TO_DATE_SURF
 USE MODI_SUBSTRACT_TO_DATE_SURF
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
diff --git a/src/SURFEX/teb_bld_road.F90 b/src/SURFEX/teb_bld_road.F90
index 308cb79cbbe669341b3549a31dc1470e6e1dc16b..85660b400694c8c60e3fa74ba46431b54bd8e3e3 100644
--- a/src/SURFEX/teb_bld_road.F90
+++ b/src/SURFEX/teb_bld_road.F90
@@ -224,6 +224,8 @@ USE MODI_BLDSOIL_LAYER_E_BUDGET
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/town_energy_balance.F90 b/src/SURFEX/town_energy_balance.F90
index 522c5774e21d16a9da984e3ea4daea7e51b9a279..aba42e3f5f5a38781c39d68bd1ab18de07e7b748 100644
--- a/src/SURFEX/town_energy_balance.F90
+++ b/src/SURFEX/town_energy_balance.F90
@@ -129,6 +129,7 @@ USE MODI_ALLOC_LW_COEF
 USE MODI_DEALLOC_LW_COEF
 USE MODI_TEB_SPARTACUS
 USE MODI_EXPLICIT_LONGWAVE
+USE MODI_ABOR1_SFX
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
diff --git a/src/SURFEX/trad_body_isba.F90 b/src/SURFEX/trad_body_isba.F90
index 32a1280351c501b6de4af6f4ccf92080bdf91c73..8aa308432d17677a7670d38bced7e97d4b2659da 100644
--- a/src/SURFEX/trad_body_isba.F90
+++ b/src/SURFEX/trad_body_isba.F90
@@ -61,6 +61,8 @@ FUNCTION TRAD_BODY_ISBA(HPROGRAM, PSCA_SW, PREF_SW, PEMIT_LW, PLW_RAD,&
 !               ------------
 !
 USE MODD_CSTS, ONLY : XSTEFAN, XPI, XSURF_EPSILON, XI0
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
diff --git a/src/SURFEX/trad_body_teb.F90 b/src/SURFEX/trad_body_teb.F90
index 30cf78e4317ab9334483c4555ddb2545c19a4853..1157cdc69ea837c2ebe4bf07ee75a92f2e951f3b 100644
--- a/src/SURFEX/trad_body_teb.F90
+++ b/src/SURFEX/trad_body_teb.F90
@@ -91,6 +91,8 @@ FUNCTION TRAD_BODY_TEB(HPROGRAM, PSCA_SW, PREF_SW_FAC, PREF_SW_GRND,         &
 !               ------------
 !
 USE MODD_CSTS, ONLY : XSTEFAN, XPI, XSURF_EPSILON, XI0
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
diff --git a/src/SURFEX/urban_solar_abs.F90 b/src/SURFEX/urban_solar_abs.F90
index 1f2e48a58820aff041ed64f68ac2a2b6f51a8dad..5169098678455dc59b95cb799a2c9b01015aef5a 100644
--- a/src/SURFEX/urban_solar_abs.F90
+++ b/src/SURFEX/urban_solar_abs.F90
@@ -196,6 +196,7 @@ USE MODI_WINDOW_SHADING
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/utci_teb.F90 b/src/SURFEX/utci_teb.F90
index 137fbb6c2f3f5ccbfdc44ffbd5e63b9bcb650f0f..80b877d9f78868eea6ccfc9c4d7422b2f9d5db03 100644
--- a/src/SURFEX/utci_teb.F90
+++ b/src/SURFEX/utci_teb.F90
@@ -54,6 +54,7 @@ USE MODD_TEB_OPTION_n, ONLY : TEB_OPTIONS_t
 USE MODD_CSTS, ONLY : XTT
 USE MODI_UTCI_APPROX
 USE MODI_TRAD_BODY_TEB
+USE MODI_ABOR1_SFX
 !
 USE YOMHOOK , ONLY : LHOOK, DR_HOOK
 USE PARKIND1, ONLY : JPRB
diff --git a/src/SURFEX/wall_layer_e_budget.F90 b/src/SURFEX/wall_layer_e_budget.F90
index 8f4801b911a64d3e77512210ba172c73c09e767e..b06cddbe62b5fc167ecc6ed12a5c15c8f50bf9da 100644
--- a/src/SURFEX/wall_layer_e_budget.F90
+++ b/src/SURFEX/wall_layer_e_budget.F90
@@ -117,6 +117,8 @@ USE MODE_CONV_DOE
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
+USE MODI_GET_LUOUT
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/write_diag_pgd_grdnn.F90 b/src/SURFEX/write_diag_pgd_grdnn.F90
index fc1cc0805de4e92047151bdc51db3b425c6002f8..c2d5b6f517abe1b84a61ff9166cc6dc5f9fbdf41 100644
--- a/src/SURFEX/write_diag_pgd_grdnn.F90
+++ b/src/SURFEX/write_diag_pgd_grdnn.F90
@@ -58,6 +58,7 @@ USE MODI_END_IO_SURF_n
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/write_ecoclimap2_data.F90 b/src/SURFEX/write_ecoclimap2_data.F90
index 4304a43b57b3ef5088838e0b86a011bd9b33c644..7bd221f8e3c57e3822685510f4a840941eb19935 100644
--- a/src/SURFEX/write_ecoclimap2_data.F90
+++ b/src/SURFEX/write_ecoclimap2_data.F90
@@ -18,6 +18,7 @@ USE MODD_SURF_PAR, ONLY: LEN_HREC
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/SURFEX/writesurf_tebn.F90 b/src/SURFEX/writesurf_tebn.F90
index 94a986dd658d741ac3d4f41f3d7d1cba8934ffa2..a519acd7bf111e3080fc569a15420d9fbdb5ae5d 100644
--- a/src/SURFEX/writesurf_tebn.F90
+++ b/src/SURFEX/writesurf_tebn.F90
@@ -63,6 +63,7 @@ USE MODI_WRITESURF_TEB_HYDRO_n
 !
 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
 USE PARKIND1  ,ONLY : JPRB
+USE MODI_ABOR1_SFX
 !
 IMPLICIT NONE
 !
diff --git a/src/configure b/src/configure
index d784dab9326032195e3726f7fb32f2d27f6e8aed..b2f270dabc1b5ce614e498a6e7cbe83ab047a00b 100755
--- a/src/configure
+++ b/src/configure
@@ -8,10 +8,10 @@
 if [ "x$XYZ" = "x" ]
 then
 # 
-export VERSION_MASTER=${VERSION_MASTER:-MNH-V5-6}
-export VERSION_BUG=${VERSION_BUG:-2}
+export VERSION_MASTER=${VERSION_MASTER:-MNH-V5-7}
+export VERSION_BUG=${VERSION_BUG:-0}
 export VERSION_XYZ=${VERSION_XYZ:-${VERSION_MASTER}-${VERSION_BUG}${VER_OASIS:+-${VER_OASIS}}}
-export VERSION_DATE=${VERSION_DATE:-"28/11/2023"}
+export VERSION_DATE=${VERSION_DATE:-"08/01/2024"}
 export VERSION_LIBAEC=${VERSION_LIBAEC:-"1.1.2"}
 export VERSION_HDF=${VERSION_HDF:-"1.14.2"}
 export VERSION_CDFC=${VERSION_CDFC:-"4.9.2"}
@@ -66,10 +66,10 @@ module purge
 #module load craype-x86-trento
 module load craype-x86-genoa
 module load craype-network-ofi
-module load PrgEnv-cray/8.3.3
-module load cce/15.0.1
-module load craype/2.7.19
-module load cray-mpich/8.1.24
+module load PrgEnv-cray/8.4.0
+module load cce/16.0.0
+module load craype/2.7.21
+module load cray-mpich/8.1.26
 module load libfabric/1.15.2.0
 #module load craype-accel-amd-gfx90a
 module load rocm/5.3.0
@@ -140,8 +140,8 @@ ulimit -s unlimited
                 export MNHENV=${MNHENV:-"
 module purge
 module load cmake/3.18.0
-module load intel-compilers/19.1.3
-module load intel-mpi/2019.9
+module load intel-oneapi-compilers/2023.1.0
+module load intel-mpi/2021.9
 ulimit -s unlimited
 export SLURM_CPU_BIND=none
 export I_MPI_PIN_PROCESSOR_LIST=all:map=spread
@@ -220,8 +220,8 @@ export MPI_DSM_CPULIST=0-7:allhosts
                 export MNHENV=${MNHENV:-"
 module purge
 module load cmake/3.26.4
-module load inteloneapi/23.1.0
-module load mpi/openmpi/4.1.4
+module load inteloneapi/24.0.0
+module load mpi/openmpi/4.1.5.3
 export SLURM_CPU_BIND=none
 
 export DIR_ECCODES_INSTALL=\${CCCWORKDIR}/ECCODES-2.25.0\${XYZM}
@@ -239,8 +239,8 @@ export DIR_ECCODES_INSTALL=\${CCCWORKDIR}/ECCODES-2.25.0\${XYZM}
                 export MNHENV=${MNHENV:-"
 module purge
 module load cmake/3.26.4
-module load inteloneapi/23.1.0
-module load mpi/openmpi/4.1.4
+module load inteloneapi/24.0.0
+module load mpi/openmpi/4.1.5.3
 export SLURM_CPU_BIND=none
 
 export DIR_ECCODES_INSTALL=\${CCCWORKDIR}/ECCODES-2.25.0\${XYZM}
@@ -484,11 +484,23 @@ export SPLL=spll_new
                 export  VER_MPI=${VER_MPI:-MPIAUTO}
                 export OPTLEVEL=${OPTLEVEL:-DEBUG}
                 export MVWORK=${MVWORK:-NO}
-                export VER_CDF=${VER_CDF:-CDFCTI}
 		export NEED_TOOLS=NO
+		# Ubuntu version
+		case "$(lsb_release -sr)" in
+                      20.04)
+                export VER_CDF=${VER_CDF:-CDFCTI}
                 export MNHENV=${MNHENV:-"
 export SPLL=spll_new
 "}
+                  ;;
+	          22.04)
+                export VER_CDF=${VER_CDF:-CDFAUTO}
+                export MNHENV=${MNHENV:-"
+export PATH=/opt/gcc-9.4.0/bin:\$PATH
+export SPLL=spll_new
+"}
+                 ;;
+		 esac
               ;;
 'Linux nuwa'*)
                 export     ARCH=${ARCH:-LXifort}
diff --git a/src/job_make_examples_Atos_HPCF b/src/job_make_examples_Atos_HPCF
index ae66d0d1a980e1b334a84cf3cd053dba33941af0..046caeb86188e49b6ba19a49c0d63521325a19ab 100755
--- a/src/job_make_examples_Atos_HPCF
+++ b/src/job_make_examples_Atos_HPCF
@@ -21,7 +21,7 @@ hostname
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIAUTO-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIAUTO-O2
 export MONORUN="Mpirun -np 1 "
 export MPIRUN="Mpirun -np 2 "
 export POSTRUN="echo "
diff --git a/src/job_make_examples_BG b/src/job_make_examples_BG
index 049c496096b8c5cb22da726fd5cd04fedcf1dfbd..97ee6e4da9cf694bbfa89fb78cfb7854960a36aa 100755
--- a/src/job_make_examples_BG
+++ b/src/job_make_examples_BG
@@ -20,7 +20,7 @@ cd $LOADL_STEP_INITDIR
 
 unset MAKEFLAGS
 
-.  ../conf/profile_mesonh-BG-R8I4-MNH-V5-6-2-MPIAUTO-O2
+.  ../conf/profile_mesonh-BG-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 
 #001_2Drelief 002_3Drelief 003_KW78 004_Reunion 007_16janvier
diff --git a/src/job_make_examples_BGQ b/src/job_make_examples_BGQ
index 89fd486027972143994f87b08d0e1b74b09569d4..91d5065a300a0f73016af95dd273835af052be4a 100755
--- a/src/job_make_examples_BGQ
+++ b/src/job_make_examples_BGQ
@@ -20,7 +20,7 @@ cd $LOADL_STEP_INITDIR
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-BGQ-R8I4-MNH-V5-6-2-MPIAUTO-O2NAN
+. ../conf/profile_mesonh-BGQ-R8I4-MNH-V5-7-0-MPIAUTO-O2NAN
 
 set -x
 
diff --git a/src/job_make_examples_BullX b/src/job_make_examples_BullX
index 1296ec63c27f63f1ca7376039c7fe178fda88af2..5ac5e6d3dbdf38fd246fcc66dfa61361cadcf5ee 100755
--- a/src/job_make_examples_BullX
+++ b/src/job_make_examples_BullX
@@ -21,7 +21,7 @@ hostname
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIINTEL-O3
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIINTEL-O3
 export MONORUN="Mpirun -np 1 "
 export MPIRUN="Mpirun -np 2 "
 export POSTRUN="time "
diff --git a/src/job_make_examples_BullX_belenos b/src/job_make_examples_BullX_belenos
index 2086f3017e168dc4809281a5bb25d9d47e0086eb..e7858d9ded6189fa56e0a806d5ac95f64d86b523 100755
--- a/src/job_make_examples_BullX_belenos
+++ b/src/job_make_examples_BullX_belenos
@@ -20,7 +20,7 @@ hostname
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-1-MPIAUTO-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIAUTO-O2
 export MONORUN="Mpirun -np 1 "
 export MPIRUN="Mpirun -np 2 "
 export POSTRUN="echo "
diff --git a/src/job_make_examples_BullX_irene b/src/job_make_examples_BullX_irene
index 1b93983b9eb0105fa8e1d5ad4ba0c63bb1d50e99..0a6885406ac9b02a03d91e84104a7d154f2cf852 100755
--- a/src/job_make_examples_BullX_irene
+++ b/src/job_make_examples_BullX_irene
@@ -23,7 +23,7 @@ hostname
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIAUTO-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 set -x
 
diff --git a/src/job_make_examples_BullX_irene_AMD b/src/job_make_examples_BullX_irene_AMD
index 8951653c51c93ac4dfefc2fcb12f58c7a2a048b2..14d7d2f4d75f2fbbb0a1fd766c9c86dde9f1a97d 100755
--- a/src/job_make_examples_BullX_irene_AMD
+++ b/src/job_make_examples_BullX_irene_AMD
@@ -22,7 +22,7 @@ hostname
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-AMD-MPIAUTO-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-AMD-MPIAUTO-O2
 
 set -x
 
diff --git a/src/job_make_examples_BullX_occigen b/src/job_make_examples_BullX_occigen
index ed5c476d24efe1e0a3b6d41d85edcbef6c6168db..81aa099147577d24721e22f892356db7ac8cbd97 100755
--- a/src/job_make_examples_BullX_occigen
+++ b/src/job_make_examples_BullX_occigen
@@ -20,7 +20,7 @@ hostname
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIINTEL-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIINTEL-O2
 export MONORUN="Mpirun -prepend-rank -np 1 "
 export MPIRUN="Mpirun -prepend-rank -np 4 "
 export POSTRUN="echo "
diff --git a/src/job_make_examples_BullX_olympe b/src/job_make_examples_BullX_olympe
index 72f1be33044e505b65b27b077857edf3dff85c9d..9f9c3d68f575e44a7fbe43e824031a6c292ec808 100755
--- a/src/job_make_examples_BullX_olympe
+++ b/src/job_make_examples_BullX_olympe
@@ -19,7 +19,7 @@ hostname
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIINTEL-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIINTEL-O2
 export MONORUN="mpirun -prepend-rank -np 1 "
 export MPIRUN="mpirun -prepend-rank -np 4 "
 export POSTRUN="echo "
diff --git a/src/job_make_examples_CRAY_cca b/src/job_make_examples_CRAY_cca
index 0a5a77910103986878fce1c47af7db7ab8ad3ad2..54ec9adda38de7e0f332ef626f0f23100e69ef49 100755
--- a/src/job_make_examples_CRAY_cca
+++ b/src/job_make_examples_CRAY_cca
@@ -30,7 +30,7 @@ cd ${PBS_O_WORKDIR}
 
 ARCH=LXifort
 #ARCH=LXcray
-. ../conf/profile_mesonh-${ARCH}-R8I4-MNH-V5-6-2-MPICRAY-O2
+. ../conf/profile_mesonh-${ARCH}-R8I4-MNH-V5-7-0-MPICRAY-O2
 
 
 export MONORUN="aprun -n 1 "
diff --git a/src/job_make_examples_HPE_adastra_genoa b/src/job_make_examples_HPE_adastra_genoa
index 86a9e5dc6b8fb7114008a75b57af7af6077dd141..0dee7e946b34a30bb6f4e3874b4ea285cf1e5472 100755
--- a/src/job_make_examples_HPE_adastra_genoa
+++ b/src/job_make_examples_HPE_adastra_genoa
@@ -1,7 +1,8 @@
 #!/bin/bash
 #SBATCH -J Examples
-#SBATCH -N 1            # nodes number
-#SBATCH -n 4            # CPUs number (on all nodes) 
+#SBATCH --nodes=1
+#SBATCH --ntasks-per-node=4 --cpus-per-task=1
+#SBATCH --threads-per-core=1 # --hint=nomultithread
 #SBATCH -C GENOA
 ##SBATCH --exclusive           
 #SBATCH -o Examples.eo%j   #
@@ -21,7 +22,7 @@ hostname
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXcray-R8I4-MNH-V5-6-2-MPICRAY-O2
+. ../conf/profile_mesonh-LXcray-R8I4-MNH-V5-7-0-MPICRAY-O2
 export MONORUN="Exec srun -l -n 1 --export=ALL"
 export MPIRUN="Exec srun -l -n 4 --export=ALL"
 export POSTRUN="echo "
diff --git a/src/job_make_examples_HPE_jeanzay b/src/job_make_examples_HPE_jeanzay
index 8c37f922dc8e969fa6a3d6b13428ed14abf390a2..54e26e6591126b56cc366bfaf9f582e72b443989 100755
--- a/src/job_make_examples_HPE_jeanzay
+++ b/src/job_make_examples_HPE_jeanzay
@@ -21,7 +21,7 @@ hostname
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIINTEL-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIINTEL-O2
 export MONORUN="Exec srun -l -n 1 --export=ALL numabind_core_slurm"
 export MPIRUN="Exec srun -l -n 4 --export=ALL numabind_core_slurm"
 export POSTRUN="echo "
diff --git a/src/job_make_examples_IBM_ada b/src/job_make_examples_IBM_ada
index 5269e3ed36849acc701f1321139fd999df7c22ca..3db69c8a0a1731e82ec7bb78b68bb74200de20c8 100755
--- a/src/job_make_examples_IBM_ada
+++ b/src/job_make_examples_IBM_ada
@@ -21,7 +21,7 @@ cd $LOADL_STEP_INITDIR
 
 unset MAKEFLAGS
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIINTEL-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIINTEL-O2
 
 # Pour avoir l'echo des commandes
 set -x
diff --git a/src/job_make_examples_IBM_sp6_vargas b/src/job_make_examples_IBM_sp6_vargas
index 98e322800d74b5cb9a762d80b90349a1999ea581..49067f0d75d09d3fefa672dab408d2b6da8e1bc9 100755
--- a/src/job_make_examples_IBM_sp6_vargas
+++ b/src/job_make_examples_IBM_sp6_vargas
@@ -26,7 +26,7 @@ cd $LOADL_STEP_INITDIR
 
 unset MAKEFLAGS
 
-.  ../conf/profile_mesonh-AIX64-R8I4-MNH-V5-6-2-MPIAUTO-O2
+.  ../conf/profile_mesonh-AIX64-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 
 #001_2Drelief 002_3Drelief 003_KW78 004_Reunion 007_16janvier
diff --git a/src/job_make_examples_NEC_SX8 b/src/job_make_examples_NEC_SX8
index 26589cc95aa3a1590a68d1ba558b009abd0e800a..3952e0d7d4cbccdf9b5bd42ca3f9b050e004cfcd 100755
--- a/src/job_make_examples_NEC_SX8
+++ b/src/job_make_examples_NEC_SX8
@@ -20,7 +20,7 @@ unset MAKEFLAGS
 
 [ -d $PBS_O_WORKDIR ] && cd $PBS_O_WORKDIR
 #
-. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-6-2-MPIAUTO-O4
+. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-7-0-MPIAUTO-O4
 
 export MONORUN="Mpirun -np 1 "
 export MPIRUN="Mpirun -np 2 "
diff --git a/src/job_make_examples_SGI_datarmor b/src/job_make_examples_SGI_datarmor
new file mode 100755
index 0000000000000000000000000000000000000000..ef27e86bfdc6e9e501fcdb88155b045e8c7de61a
--- /dev/null
+++ b/src/job_make_examples_SGI_datarmor
@@ -0,0 +1,66 @@
+#!/bin/bash
+#MNH_LIC Copyright 1994-2024 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.
+#PBS -S /bin/bash
+#PBS -N Examples
+##PBS -e Examples_errors.txt
+##PBS -o Examples_output.txt
+##PBS -m e
+#PBS -q mpi_1
+#PBS -l walltime=00:30:00
+
+ulimit -c 0
+ulimit -s unlimited
+# Arret du job des la premiere erreur
+set -e
+# Nom de la machine
+hostname 
+# Echo des commandes
+
+unset MAKEFLAGS
+
+cd $PBS_O_WORKDIR
+
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIINTEL-O2
+export MONORUN="Mpirun -np 1 "
+export MPIRUN="Mpirun -np 4 "
+export POSTRUN="time "
+export MNH_PYTHON="NO"
+
+cd $SRC_MESONH/MY_RUN/KTEST/003_KW78 
+make -k
+#
+echo "#################################################################################"
+echo "##CAS SUIVANT####################################################################"
+echo "#################################################################################"
+cd $SRC_MESONH/MY_RUN/KTEST/001_2Drelief 
+make -k
+#
+echo "#################################################################################"
+echo "##CAS SUIVANT####################################################################"
+echo "#################################################################################"
+cd $SRC_MESONH/MY_RUN/KTEST/002_3Drelief 
+make -k
+#
+echo "#################################################################################"
+echo "##CAS SUIVANT####################################################################"
+echo "#################################################################################"
+
+cd $SRC_MESONH/MY_RUN/KTEST/004_Reunion
+make -k << EOF 
+
+
+EOF
+#
+echo "#################################################################################"
+echo "##CAS SUIVANT####################################################################"
+echo "#################################################################################"
+cd $SRC_MESONH/MY_RUN/KTEST/007_16janvier
+make -k << EOF 
+
+
+EOF
+#
+
diff --git a/src/job_make_examples_SX8 b/src/job_make_examples_SX8
index f001453c6e3ca50d16103991f7b8b3a3f3317558..b7b87f7367c1654146d48db033b0ef421867738b 100755
--- a/src/job_make_examples_SX8
+++ b/src/job_make_examples_SX8
@@ -21,7 +21,7 @@ unset MAKEFLAGS
 [ -d $PBS_O_WORKDIR ] && cd $PBS_O_WORKDIR
 #
 
-. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-6-2-MPIAUTO-O2
+. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 export MONORUN="Mpirun -np 1 "
 export MPIRUN="Mpirun -np 2 "
diff --git a/src/job_make_examples_cxa b/src/job_make_examples_cxa
index 492c07550bee2022a46a6ce41ba3e8130fb16ceb..28a849508899931561fc251cc57e8b583c73f78d 100755
--- a/src/job_make_examples_cxa
+++ b/src/job_make_examples_cxa
@@ -36,7 +36,7 @@ cd $LOADL_STEP_INITDIR
 
 unset MAKEFLAGS
 
-.  ../conf/profile_mesonh-AIX64-R8I4-MNH-V5-6-2-MPIAUTO-O2
+.  ../conf/profile_mesonh-AIX64-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 ulimit -c 0 # pas de core
 
diff --git a/src/job_make_mesonh_BG b/src/job_make_mesonh_BG
index 0e08b650dc3a7e2aff8572a8e08a1c37f0e25a61..a32ecc21a68ed599c42ef9313bb11763eea10b24 100755
--- a/src/job_make_mesonh_BG
+++ b/src/job_make_mesonh_BG
@@ -18,7 +18,7 @@
 set -x
 cd $LOADL_STEP_INITDIR
 
-. ../conf/profile_mesonh-BG-R8I4-MNH-V5-6-2-MPIAUTO-O2
+. ../conf/profile_mesonh-BG-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 #time gmake 
 time gmake -r -j8
diff --git a/src/job_make_mesonh_BGQ b/src/job_make_mesonh_BGQ
index dae7ba1ec9fdce5744c122b23d06f521a5e38a43..c983bbea92085cd871fbc253b9627713adb73663 100755
--- a/src/job_make_mesonh_BGQ
+++ b/src/job_make_mesonh_BGQ
@@ -20,7 +20,7 @@ set -x
 
 cd $LOADL_STEP_INITDIR
 
-. ../conf/profile_mesonh-BGQ-R8I4-MNH-V5-6-2-MPIAUTO-O2NAN
+. ../conf/profile_mesonh-BGQ-R8I4-MNH-V5-7-0-MPIAUTO-O2NAN
 
 time gmake -j8 
 time gmake -j8 
diff --git a/src/job_make_mesonh_BullX b/src/job_make_mesonh_BullX
index 43a95cff8ce714bbd0b629e25bcd905e6ac9e94c..a304b72a566f664cb1923cc621c34b141acce631 100755
--- a/src/job_make_mesonh_BullX
+++ b/src/job_make_mesonh_BullX
@@ -19,7 +19,7 @@ set -x
 # On va lancer la compilation dans le répertoire de lancement du job
 pwd
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIINTEL-O3
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIINTEL-O3
 
 time gmake -j 4
 time gmake -j 1 installmaster
diff --git a/src/job_make_mesonh_BullX_belenos b/src/job_make_mesonh_BullX_belenos
index 5f8e7793096f59144740540b03825978c5ed9142..94ce033471423c15b2ec1d8659d70aaf7346ff93 100755
--- a/src/job_make_mesonh_BullX_belenos
+++ b/src/job_make_mesonh_BullX_belenos
@@ -16,7 +16,7 @@ set -x
 # On va lancer la compilation dans le répertoire de lancement du job
 pwd
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-1-MPIAUTO-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 time make -j 16
 time make -j 1 installmaster
diff --git a/src/job_make_mesonh_CRAY_cca b/src/job_make_mesonh_CRAY_cca
index e930aaf5ccea3a5c332d9f401f1f04d29a6964f5..207f674e5ae084e1f507e9319961b51f1762dd51 100755
--- a/src/job_make_mesonh_CRAY_cca
+++ b/src/job_make_mesonh_CRAY_cca
@@ -21,7 +21,7 @@ pwd
 
 ARCH=LXifort
 #ARCH=LXcray
-. ../conf/profile_mesonh-${ARCH}-R8I4-MNH-V5-6-2-MPICRAY-O2
+. ../conf/profile_mesonh-${ARCH}-R8I4-MNH-V5-7-0-MPICRAY-O2
 
 time gmake -j 4 2>&1 | tee sortie_compile_${ARCH}.$$
 time gmake -j 4 2>&1 | tee sortie_compile_${ARCH}2.$$
diff --git a/src/job_make_mesonh_HPE_adastra_genoa b/src/job_make_mesonh_HPE_adastra_genoa
index 3610778312ff94c6ca1a047c5eeeceebe8e84ae4..c61d9e973630b537cd9c85a9b2a99ca54a240ecd 100755
--- a/src/job_make_mesonh_HPE_adastra_genoa
+++ b/src/job_make_mesonh_HPE_adastra_genoa
@@ -15,7 +15,7 @@ set -x
 # On va lancer la compilation dans le répertoire de lancement du job
 pwd
 
-. ../conf/profile_mesonh-LXcray-R8I4-MNH-V5-6-2-MPICRAY-O2
+. ../conf/profile_mesonh-LXcray-R8I4-MNH-V5-7-0-MPICRAY-O2
 
 time make -j 32
 time make -j 1 installmaster
diff --git a/src/job_make_mesonh_HPE_jeanzay b/src/job_make_mesonh_HPE_jeanzay
index 344266251eb510b472ccd2f0ddbdd11d60132bbe..8126b8d490f590f1b5ce9921967e103fea8baf40 100755
--- a/src/job_make_mesonh_HPE_jeanzay
+++ b/src/job_make_mesonh_HPE_jeanzay
@@ -14,7 +14,7 @@ set -x
 # On va lancer la compilation dans le répertoire de lancement du job
 pwd
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIINTEL-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIINTEL-O2
 
 time gmake -j 16
 time gmake -j 1 installmaster
diff --git a/src/job_make_mesonh_IBM_ada b/src/job_make_mesonh_IBM_ada
index 928c3d4bdb1d8e5460dc546b35d54fc04fc92d25..3a9fb2ec880e72520cfcb9dbb4a32bc5165c572b 100755
--- a/src/job_make_mesonh_IBM_ada
+++ b/src/job_make_mesonh_IBM_ada
@@ -16,7 +16,7 @@
 
 cd $LOADL_STEP_INITDIR
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-MPIINTEL-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIINTEL-O2
 
 # Pour avoir l'echo des commandes
 set -x
diff --git a/src/job_make_mesonh_IBM_sp6_vargas b/src/job_make_mesonh_IBM_sp6_vargas
index 9d046b1abcde17a5ed3745142285d6ca6f884370..05070aa8c2d35cd69be29cab32f66d6340de3aba 100755
--- a/src/job_make_mesonh_IBM_sp6_vargas
+++ b/src/job_make_mesonh_IBM_sp6_vargas
@@ -24,7 +24,7 @@
 set -x
 cd $LOADL_STEP_INITDIR
 
-. ../conf/profile_mesonh-AIX64-R8I4-MNH-V5-6-2-MPIAUTO-O2
+. ../conf/profile_mesonh-AIX64-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 time gmake -r -j8
 time gmake installmaster
diff --git a/src/job_make_mesonh_MFSX8 b/src/job_make_mesonh_MFSX8
index 18af1071971ce0352b4bd5ba03c8847da5bff2be..47b0a5f71d6d28e40cc7e7d710b9156a8ac107bb 100644
--- a/src/job_make_mesonh_MFSX8
+++ b/src/job_make_mesonh_MFSX8
@@ -12,7 +12,7 @@ set -x
 # On va lancer la compilation dans le répertoire de lancement du job
 [ ${PBS_O_WORKDIR} ] && cd ${PBS_O_WORKDIR}
 
-. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-6-2-MPIAUTO-O4
+. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-7-0-MPIAUTO-O4
 
 time gmake  -j 4  ########## compile on four processors to speedup the compilation
 time gmake  -j 1 installmaster
diff --git a/src/job_make_mesonh_NEC_SX8 b/src/job_make_mesonh_NEC_SX8
index ce15a0ee577c401801552b0973c3aa38d305a20f..ed9f289203de7e7573436c947cdf14ac93c9be1f 100755
--- a/src/job_make_mesonh_NEC_SX8
+++ b/src/job_make_mesonh_NEC_SX8
@@ -11,7 +11,7 @@ set -x
 # On va lancer la compilation dans le répertoire de lancement du job
 [ $PBS_O_WORKDIR ] && cd $PBS_O_WORKDIR
 
-. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-6-2-MPIAUTO-O4
+. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-7-0-MPIAUTO-O4
 
 time gmake  -j 4  
 time gmake  -j 4   #  some time problem with first pass in parallel compilation
diff --git a/src/job_make_mesonh_cxa b/src/job_make_mesonh_cxa
index f7b78647f7f405a520b766623484477900fa8110..fea9dbbf9476483da297e216b14aef19a00fc4d3 100755
--- a/src/job_make_mesonh_cxa
+++ b/src/job_make_mesonh_cxa
@@ -27,7 +27,7 @@
 set -x
 cd $LOADL_STEP_INITDIR
 
-.  ../conf/profile_mesonh-AIX64-R8I4-MNH-V5-6-2-MPIAUTO-O2
+.  ../conf/profile_mesonh-AIX64-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 time gmake -r -j1
 time gmake installmaster
diff --git a/src/job_make_mesonh_dev_pc_ifpen b/src/job_make_mesonh_dev_pc_ifpen
index d735db715dd27d80153515264580b0432e309900..3a3331be8d63ffaf701393056b09e924ef112e8d 100755
--- a/src/job_make_mesonh_dev_pc_ifpen
+++ b/src/job_make_mesonh_dev_pc_ifpen
@@ -9,7 +9,7 @@ pwd
 set -x
 
 export ARCH=LXgfortran
-export VERSION_XYZ=MNH-V5-6-1
+export VERSION_XYZ=MNH-V5-7-0
 export VER_MPI=MPIAUTO
 export OPTLEVEL=DEBUG
 
diff --git a/src/job_make_mesonh_ener440 b/src/job_make_mesonh_ener440
index 1b2675aecaafe054fdd769bf86ad3681dcb7f9ad..a8153e61664dbc23b8f5e3f739d7ced0cf86a068 100755
--- a/src/job_make_mesonh_ener440
+++ b/src/job_make_mesonh_ener440
@@ -17,7 +17,7 @@
 cd ${SLURM_SUBMIT_DIR}
 
 # Chargement du profil (qui contient le source vers l'env ifpen-mesonh)
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-1-MPIAUTO-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 time gmake -j 10
 time gmake -j 1 installmaster
diff --git a/src/job_make_mesonh_pc_ifpen b/src/job_make_mesonh_pc_ifpen
index 559c64dd8550e7fb40e6054635c7ae1cea02d90d..fd5e0cdda78e70eb89e1bc07bb80b4d2cda44e66 100755
--- a/src/job_make_mesonh_pc_ifpen
+++ b/src/job_make_mesonh_pc_ifpen
@@ -8,7 +8,7 @@
 pwd
 
 # Chargement du profil (qui contient le source vers l'env ifpen-mesonh)
-. ../conf/profile_mesonh-LXgfortran-R8I4-MNH-V5-6-1-MPIAUTO-O2
+. ../conf/profile_mesonh-LXgfortran-R8I4-MNH-V5-7-0-MPIAUTO-O2
 
 time gmake -j 10
 time gmake -j 1 installmaster
diff --git a/src/job_make_mesonh_user_BullX b/src/job_make_mesonh_user_BullX
index ecd10ec5de217c71184db91a04d400d765cf3aeb..83302771c4d166084b324e569af8d2d82a0ce69c 100755
--- a/src/job_make_mesonh_user_BullX
+++ b/src/job_make_mesonh_user_BullX
@@ -19,7 +19,7 @@ export VER_USER=                ########## Your own USER Directory
 set -x
 
 # On va lancer la compilation dans le répertoire de lancement du job
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-2-${VER_USER}-MPIINTEL-O3
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-${VER_USER}-MPIINTEL-O3
 
 time gmake user
 time gmake -j 1 installuser
diff --git a/src/job_make_mesonh_user_BullX_belenos b/src/job_make_mesonh_user_BullX_belenos
index 97961346767835a7d59f67bbf814b2258c8c3adf..7ffdf8f74c26bf08ef0ae75c5c0f607743e60b91 100755
--- a/src/job_make_mesonh_user_BullX_belenos
+++ b/src/job_make_mesonh_user_BullX_belenos
@@ -18,7 +18,7 @@ set -x
 # On va lancer la compilation dans le répertoire de lancement du job
 pwd
 
-. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-6-1-${VER_USER}-MPIAUTO-O2
+. ../conf/profile_mesonh-LXifort-R8I4-MNH-V5-7-0-${VER_USER}-MPIAUTO-O2
 
 time make user -j 2
 time make -j 1 installuser
diff --git a/src/job_make_mesonh_user_MFSX8 b/src/job_make_mesonh_user_MFSX8
index 256aeb224440d4ac3a4d58f5820d77069a120298..d4f48419ff4c5adc8b20d05f8f8af458b1af014b 100644
--- a/src/job_make_mesonh_user_MFSX8
+++ b/src/job_make_mesonh_user_MFSX8
@@ -14,7 +14,7 @@ set -x
 [ ${PBS_O_WORKDIR} ] && cd ${PBS_O_WORKDIR}
 
 
-. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-6-2-${VER_USER}-MPIAUTO-O4
+. ../conf/profile_mesonh-SX8-R8I4-MNH-V5-7-0-${VER_USER}-MPIAUTO-O4
 
 time gmake user
 time gmake -j 1 installuser