diff --git a/build/with_fcm/arch/arch-gnu.fcm b/build/with_fcm/arch/arch-gnu.fcm
index 5bbff838443dd508f64e32e7f82c863fa38a2d37..63e0200e1f57dbbf93ba19ca1d9b3462e10919f5 100644
--- a/build/with_fcm/arch/arch-gnu.fcm
+++ b/build/with_fcm/arch/arch-gnu.fcm
@@ -1,23 +1,23 @@
 # Compilation
 $FCOMPILER     =     gfortran
-$BASE_FFLAGS   =     -c -fPIC -fdefault-real-8 -fdefault-double-8 -ffree-line-length-none
+$BASE_FFLAGS   =     -c -fPIC -fdefault-real-8 -fdefault-double-8 -ffree-line-length-none -fopenmp -fconvert=swap
 $PROD_FFLAGS   =     -O3
 $DEV_FFLAGS    =     -O1
-$DEBUG_FFLAGS  =     -check bounds 
+$DEBUG_FFLAGS  =     -fbounds-check
 $CCOMPILER     =     gcc
-$BASE_CFLAGS   =     -c -fPIC
+$BASE_CFLAGS   =     -c -fPIC -fopenmp
 $PROD_CFLAGS   =     -O3
 $DEV_CFLAGS    =     -O1
-$DEBUG_CFLAGS  =     -check bounds
+$DEBUG_CFLAGS  =     -fbounds-check
 $OMP_FFLAGS    =
 
 # Preprocessor
-$FPP_FLAGS     =     LINUX REPRO48
-$CPP_FLAGS     =     LINUX
+$FPP_FLAGS     =     LINUX LITTLE_ENDIAN LITTLE REPRO48
+$CPP_FLAGS     =     LINUX LITTLE_ENDIAN LITTLE
 
 # Linker
 $LINK          =     gfortran
-$BASE_LD       =     -fPIC  -fdefault-real-8 -fdefault-double-8
+$BASE_LD       =     -fPIC  -fdefault-real-8 -fdefault-double-8 -fopenmp
 $OMP_LD        =
 $LD_EXE_TO_SHARED = -shared
 
diff --git a/build/with_fcm/fcm-make.cfg b/build/with_fcm/fcm-make.cfg
index b909baed3e89f53fa1fdeb9267a19ee9df101554..ec0b1d1c141a62c1059c939bb623ae2a71b97a75 100644
--- a/build/with_fcm/fcm-make.cfg
+++ b/build/with_fcm/fcm-make.cfg
@@ -25,41 +25,46 @@ build.prop{ld} = $LINK
 build.prop{ar} = $AR
 
 ################################################################################################
-# 3 - TARGET
+# 3 - TARGETS
 
-#############################
-# 3.1 Target definition to build a static lib
-#build.target = libphyex.a
-#build.target-rename = libo.a:libphyex.a
-
-#############################
-# 3.2 Target definition to build a static lib
+#Target definition to build the testprogs programs and a shared lib
 #We need a shared library (.so) but this cannot be build directly with fcm
 #The FCM support team says: "FCM doesn’t support building shared libraries."
 #We use a dummy program to force fcm to use the linker and we add the needed flags
 #to build a shared library instead of a program
 
-# 3.2.a target is the dummy program but linking is hacked and result is renamed
-build.target = libphyex.so
+#############################
+# 3.1 All programs are built
+build.target{task} = link
+build.prop{fc.flags-ld} = $LD_FLAGS
+
+#############################
+# 3.2 Special options for specific progam
+
+# 3.2.a Special treatment for the shared lib
+#target is the dummy program but linking is hacked and result is renamed
 build.target-rename = dummyprog.exe:libphyex.so
-build.prop{fc.flags-ld} = $LD_FLAGS $LD_EXE_TO_SHARED
+build.prop{fc.flags-ld}[libphyex.so] = $LD_FLAGS $LD_EXE_TO_SHARED
+build.prop{dep.o.special}[dummyprog] = $ENTRYPOINTS
+
+# 3.2.b Special treatment for the testprogs
+build.prop{fc.defs}[testprogs] = $FPP_FLAGS WITHOUT_CXXDEMANGLE USE_OPENMP
 
-# 3.2.b dependencies (internal and external)
+#############################
+# 3.3 dependencies (internal and external)
 $util = util1 util2 util3 util4 util5 util6 util7 util8 util9 util10 util11 util12 util13 util14 util15 util16
 $mpi = mpi2 mpi3 mpi4 mpi5 mpi6 mpi7 mpi8 mpi9 mpi10 mpi11 mpi12 mpi13 mpi14 mpi15 mpi16 mpi17 mpi18 mpi19
 $system = system1 system2 system3 system4 system5 system6 system7 system8 system10 system11 system12 system13 system14
 build.prop{ns-dep.o} = common parkind drhook $util $mpi oml mpl gstats1 $system
 build.prop{fc.libs} = $LIBS
 
-# 3.2.c shared lib entry points
-build.prop{dep.o.special} = $ENTRYPOINTS
-
 ################################################################################################
 # 4 - SOURCES
 
 #############################
-# 4.1 Dummy programm to force linking
+# 4.1 Programs and dummy programm to force linking
 build.source[dummyprog] = src/dummyprog.F90
+build.source[testprogs] = src/testprogs
 
 #############################
 # 4.2 Main directory
diff --git a/build/with_fcm/make_fcm.sh b/build/with_fcm/make_fcm.sh
index 0b6ed76074544b436dac460655701f0aa1fab1e3..df2d7cd9efab89d42d69d7c86f23aa836e450852 100755
--- a/build/with_fcm/make_fcm.sh
+++ b/build/with_fcm/make_fcm.sh
@@ -1,5 +1,7 @@
 #!/bin/bash
 
+set -e
+
 fcm_version=tags/2021.05.0
 fiat_version=1295120464c3905e5edcbb887e4921686653eab8
 
@@ -55,7 +57,7 @@ function check_install_fcm() {
     cd fcm
     rm -f .gitkeep
     git clone https://github.com/metomi/fcm.git .
-    git checkout tags/$fcm_version
+    git checkout $fcm_version
     touch .gitkeep
     cd ..
     echo "...FCM installation done"
@@ -182,6 +184,7 @@ cd $builddir
 mkdir src
 cd src
 ln -s ../../../../src/common .
+ln -s ../../../../src/testprogs .
 ln -s ../../fiat/src fiat
 cat <<EOF > dummyprog.F90
 PROGRAM DUMMYPROG
diff --git a/src/common/micro/ini_rain_ice.F90 b/src/common/micro/ini_rain_ice.F90
index 85eb2f09357327c31fa63dca37d906c739fe8db9..ecb3b4244c9656d7935438851b83f745d799863d 100644
--- a/src/common/micro/ini_rain_ice.F90
+++ b/src/common/micro/ini_rain_ice.F90
@@ -166,9 +166,12 @@ REAL     :: PWETLBDAR_MAX,PWETLBDAH_MAX,PWETLBDAR_MIN,PWETLBDAH_MIN
 !
 REAL(KIND=JPRB) :: ZHOOK_HANDLE
 !-------------------------------------------------------------------------------
-!
 IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE)
 !
+IF(.NOT.ASSOCIATED(XCEXVT)) CALL RAIN_ICE_DESCR_ASSOCIATE()
+IF(.NOT.ASSOCIATED(XFSEDC)) CALL RAIN_ICE_PARAM_ASSOCIATE()
+!
+!
 !*       0.     FUNCTION STATEMENTS
 !               -------------------
 !
@@ -178,13 +181,27 @@ IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE)
 !
 !
 !
-IF (ALLOCATED(XRTMIN)) THEN       ! In case of nesting microphysics constants of
+IF (ASSOCIATED(XRTMIN)) THEN       ! In case of nesting microphysics constants of
                                   ! MODD_RAIN_ICE_PARAM are computed only once,
                                   ! but if INI_RAIN_ICE has been called already
                                   ! one must change the XRTMIN size.
-  DEALLOCATE(XRTMIN)
+  CALL RAIN_ICE_DESCR_DEALLOCATE()
+END IF
+!
+IF (HCLOUD == 'ICE4') THEN
+  CALL RAIN_ICE_DESCR_ALLOCATE(7)
+ELSE IF (HCLOUD == 'ICE3') THEN
+  CALL RAIN_ICE_DESCR_ALLOCATE(6)
 END IF
 !
+XRTMIN(1) = 1.0E-20
+XRTMIN(2) = 1.0E-20
+XRTMIN(3) = 1.0E-20
+XRTMIN(4) = 1.0E-20
+XRTMIN(5) = 1.0E-15
+XRTMIN(6) = 1.0E-15
+IF (HCLOUD == 'ICE4') XRTMIN(7) = 1.0E-15
+!
 !-------------------------------------------------------------------------------
 !
 !*       2.     CHARACTERISTICS OF THE SPECIES
@@ -370,20 +387,6 @@ XLBDAG_MAX = 100000.0
 ZCONC_MAX  = 1.E6 ! Maximal concentration for falling particules set to 1 per cc
 XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS)
 !
-IF (HCLOUD == 'ICE4') THEN
-  ALLOCATE( XRTMIN(7) )
-ELSE IF (HCLOUD == 'ICE3') THEN
-  ALLOCATE( XRTMIN(6) )
-END IF
-!
-XRTMIN(1) = 1.0E-20
-XRTMIN(2) = 1.0E-20
-XRTMIN(3) = 1.0E-20
-XRTMIN(4) = 1.0E-20
-XRTMIN(5) = 1.0E-15
-XRTMIN(6) = 1.0E-15
-IF (HCLOUD == 'ICE4') XRTMIN(7) = 1.0E-15
-!
 XCONC_SEA=1E8 ! 100/cm3
 XCONC_LAND=3E8 ! 300/cm3
 XCONC_URBAN=5E8 ! 500/cm3
@@ -545,8 +548,7 @@ IF (GFLAG) THEN
   WRITE(UNIT=KLUOUT,FMT='(" Crit. ice cont. XCRIAUTI=",E13.6)') XCRIAUTI
   WRITE(UNIT=KLUOUT,FMT='(" A Coef. for cirrus law XACRIAUTI=",E13.6)')XACRIAUTI
   WRITE(UNIT=KLUOUT,FMT='(" B Coef. for cirrus law XBCRIAUTI=",E13.6)')XBCRIAUTI
-  WRITE(UNIT=KLUOUT, &
-   & FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI
+  WRITE(UNIT=KLUOUT,FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI
 END IF
 !
 !
@@ -628,9 +630,9 @@ XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha
 XGAMINC_BOUND_MAX = 1.0E7  ! Maximal value of (Lbda * D_cs^lim)**alpha
 ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1))
 !
-IF( .NOT.ALLOCATED(XGAMINC_RIM1) ) ALLOCATE( XGAMINC_RIM1(NGAMINC) )
-IF( .NOT.ALLOCATED(XGAMINC_RIM2) ) ALLOCATE( XGAMINC_RIM2(NGAMINC) )
-IF( .NOT.ALLOCATED(XGAMINC_RIM4) ) ALLOCATE( XGAMINC_RIM4(NGAMINC) )
+IF( .NOT.ASSOCIATED(XGAMINC_RIM1) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM1', NGAMINC)
+IF( .NOT.ASSOCIATED(XGAMINC_RIM2) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM2', NGAMINC)
+IF( .NOT.ASSOCIATED(XGAMINC_RIM4) ) CALL RAIN_ICE_PARAM_ALLOCATE('XGAMINC_RIM4', NGAMINC)
 !
 DO J1=1,NGAMINC
   ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1)
@@ -680,9 +682,9 @@ IND      = 50    ! Interval number, collection efficiency and infinite diameter
 ZESR     = 1.0   ! factor used to integrate the dimensional distributions when
 ZFDINFTY = 20.0  ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG
 !
-IF( .NOT.ALLOCATED(XKER_RACCSS) ) ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) )
-IF( .NOT.ALLOCATED(XKER_RACCS ) ) ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) )
-IF( .NOT.ALLOCATED(XKER_SACCRG) ) ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) )
+IF( .NOT.ASSOCIATED(XKER_RACCSS) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCSS', NACCLBDAS,NACCLBDAR)
+IF( .NOT.ASSOCIATED(XKER_RACCS ) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RACCS', NACCLBDAS,NACCLBDAR)
+IF( .NOT.ASSOCIATED(XKER_SACCRG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SACCRG', NACCLBDAR,NACCLBDAS)
 !
 CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND,                                &
                       PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, &
@@ -890,7 +892,7 @@ IND      = 50    ! Interval number, collection efficiency and infinite diameter
 ZEGS     = 1.0   ! factor used to integrate the dimensional distributions when
 ZFDINFTY = 20.0  ! computing the kernels XKER_SDRYG
 !
-IF( .NOT.ALLOCATED(XKER_SDRYG) ) ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) )
+IF( .NOT.ASSOCIATED(XKER_SDRYG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SDRYG', NDRYLBDAG,NDRYLBDAS)
 !
 CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND,                              &
                    PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS,      &
@@ -956,7 +958,7 @@ IND      = 50    ! Number of interval used to integrate the dimensional
 ZEGR     = 1.0   ! distributions when computing the kernel XKER_RDRYG
 ZFDINFTY = 20.0
 !
-IF( .NOT.ALLOCATED(XKER_RDRYG) ) ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) )
+IF( .NOT.ASSOCIATED(XKER_RDRYG) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RDRYG', NDRYLBDAG,NDRYLBDAR)
 !
 CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND,                              &
                    PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR,      &
@@ -1094,7 +1096,7 @@ IND      = 50    ! Interval number, collection efficiency and infinite diameter
 ZEHS     = 1.0   ! factor used to integrate the dimensional distributions when
 ZFDINFTY = 20.0  ! computing the kernels XKER_SWETH
 !
-IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) )
+IF( .NOT.ASSOCIATED(XKER_SWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_SWETH', NWETLBDAH,NWETLBDAS)
 !
 CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND,                              &
                    PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS,      &
@@ -1160,7 +1162,7 @@ IND      = 50    ! Number of interval used to integrate the dimensional
 ZEHG     = 1.0   ! distributions when computing the kernel XKER_GWETH
 ZFDINFTY = 20.0
 !
-IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) )
+IF( .NOT.ASSOCIATED(XKER_GWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_GWETH', NWETLBDAH,NWETLBDAG)
 !
 CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND,                              &
                    PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG,      &
@@ -1226,7 +1228,7 @@ IND      = 50    ! Number of interval used to integrate the dimensional
 ZEHR     = 1.0   ! distributions when computing the kernel XKER_RWETH
 ZFDINFTY = 20.0
 !
-IF( .NOT.ALLOCATED(XKER_RWETH) ) ALLOCATE( XKER_RWETH(NWETLBDAH,NWETLBDAR) )
+IF( .NOT.ASSOCIATED(XKER_RWETH) ) CALL RAIN_ICE_PARAM_ALLOCATE('XKER_RWETH', NWETLBDAH,NWETLBDAR)
 !
 CALL READ_XKER_RWETH (KWETLBDAH,KWETLBDAR,KND,                              &
                    PALPHAH,PNUH,PALPHAR,PNUR,PEHR,PBR,PCH,PDH,PCR,PDR,      &
diff --git a/src/common/micro/rain_ice.F90 b/src/common/micro/rain_ice.F90
index 3e4f608a375fc61b3197ab391677a2822fde66e4..6ffbe59f82850016314b9cd21b713137a2c8f2a7 100644
--- a/src/common/micro/rain_ice.F90
+++ b/src/common/micro/rain_ice.F90
@@ -680,7 +680,7 @@ ENDIF
 !  optimization by looking for locations where
 !  the microphysical fields are larger than a minimal value only !!!
 !
-IF (KSIZE /= COUNT(ODMICRO)) THEN
+IF (KSIZE /= COUNT(ODMICRO(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE))) THEN
     CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'RAIN_ICE : KSIZE /= COUNT(ODMICRO)')
 ENDIF
 
diff --git a/src/mesonh/micro/ini_rain_ice.f90 b/src/mesonh/micro/ini_rain_ice.f90
index 4e9c50f03ca7056561c18ef31e3eda8bf0eb5cd8..18b47a203ed33c8745e2ac8d4ef6f4d6ffbdef26 100644
--- a/src/mesonh/micro/ini_rain_ice.f90
+++ b/src/mesonh/micro/ini_rain_ice.f90
@@ -178,7 +178,6 @@ IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE)
 !
 IF(.NOT.ASSOCIATED(XCEXVT)) CALL RAIN_ICE_DESCR_ASSOCIATE()
 IF(.NOT.ASSOCIATED(XFSEDC)) CALL RAIN_ICE_PARAM_ASSOCIATE()
-
 !
 !
 !*       0.     FUNCTION STATEMENTS
@@ -578,8 +577,7 @@ IF (GFLAG) THEN
   WRITE(UNIT=KLUOUT,FMT='(" Crit. ice cont. XCRIAUTI=",E13.6)') XCRIAUTI
   WRITE(UNIT=KLUOUT,FMT='(" A Coef. for cirrus law XACRIAUTI=",E13.6)')XACRIAUTI
   WRITE(UNIT=KLUOUT,FMT='(" B Coef. for cirrus law XBCRIAUTI=",E13.6)')XBCRIAUTI
-  WRITE(UNIT=KLUOUT, &
-   & FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI
+  WRITE(UNIT=KLUOUT,FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI
 END IF
 !
 !
diff --git a/src/testprogs/ice_adjust/getdata_ice_adjust_mod.F90 b/src/testprogs/ice_adjust/getdata_ice_adjust_mod.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1fb0a4a02b8fa38b5c6f656665c38fe7a8dcbe13
--- /dev/null
+++ b/src/testprogs/ice_adjust/getdata_ice_adjust_mod.F90
@@ -0,0 +1,580 @@
+MODULE GETDATA_ICE_ADJUST_MOD
+
+USE OMP_LIB
+
+INTERFACE REPLICATE
+  MODULE PROCEDURE REPLICATE3
+  MODULE PROCEDURE REPLICATE4
+END INTERFACE
+
+INTERFACE NPROMIZE
+  MODULE PROCEDURE NPROMIZE4
+  MODULE PROCEDURE NPROMIZE5
+END INTERFACE
+
+INTERFACE INTERPOLATE
+  MODULE PROCEDURE INTERPOLATE4
+  MODULE PROCEDURE INTERPOLATE5
+END INTERFACE
+
+INTERFACE SET
+  MODULE PROCEDURE SET3
+  MODULE PROCEDURE SET4
+  MODULE PROCEDURE SET5
+END INTERFACE
+
+CONTAINS
+
+SUBROUTINE GETDATA_ICE_ADJUST (NPROMA, NGPBLKS, NFLEVG, PRHODJ_B, PEXNREF_B, PRHODREF_B, PPABSM_B, PTHT_B, ZICE_CLD_WGT_B, &
+& ZSIGQSAT_B, PSIGS_B, PMFCONV_B, PRC_MF_B, PRI_MF_B, PCF_MF_B, PTHS_B, PRS_B, PSRCS_B, PCLDFR_B, PHLC_HRC_B, PHLC_HCF_B,   &
+& PHLI_HRI_B, PHLI_HCF_B, ZRS_B, ZZZ_B, PRS_OUT_B, PSRCS_OUT_B, PCLDFR_OUT_B, PHLC_HRC_OUT_B, PHLC_HCF_OUT_B,         &
+& PHLI_HRI_OUT_B, PHLI_HCF_OUT_B, LDVERBOSE)
+
+USE IEEE_ARITHMETIC, ONLY : IEEE_SIGNALING_NAN, IEEE_VALUE
+
+IMPLICIT NONE
+
+INTEGER, PARAMETER :: IFILE = 77
+
+INTEGER      :: KLON 
+INTEGER      :: KIDIA  
+INTEGER      :: KFDIA  
+INTEGER      :: KLEV  
+INTEGER      :: KRR  
+INTEGER      :: KDUM
+
+LOGICAL :: LDVERBOSE
+
+REAL, ALLOCATABLE   :: PRHODJ_B       (:,:,:,:)   
+REAL, ALLOCATABLE   :: PEXNREF_B      (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRHODREF_B     (:,:,:,:)   
+REAL, ALLOCATABLE   :: PPABSM_B       (:,:,:,:)   
+REAL, ALLOCATABLE   :: PTHT_B         (:,:,:,:)   
+REAL, ALLOCATABLE   :: ZICE_CLD_WGT_B (:,:,:)
+REAL, ALLOCATABLE   :: ZSIGQSAT_B     (:,:,:)
+REAL, ALLOCATABLE   :: PSIGS_B        (:,:,:,:)   
+REAL, ALLOCATABLE   :: PMFCONV_B      (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRC_MF_B       (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRI_MF_B       (:,:,:,:)   
+REAL, ALLOCATABLE   :: PCF_MF_B       (:,:,:,:)   
+REAL, ALLOCATABLE   :: PTHS_B         (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRS_B          (:,:,:,:,:) 
+REAL, ALLOCATABLE   :: PRS_OUT_B      (:,:,:,:,:) 
+REAL, ALLOCATABLE   :: PSRCS_B        (:,:,:,:)   
+REAL, ALLOCATABLE   :: PSRCS_OUT_B    (:,:,:,:)   
+REAL, ALLOCATABLE   :: PCLDFR_B       (:,:,:,:)   
+REAL, ALLOCATABLE   :: PCLDFR_OUT_B   (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLC_HRC_B     (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLC_HRC_OUT_B (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLC_HCF_B     (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLC_HCF_OUT_B (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLI_HRI_B     (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLI_HRI_OUT_B (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLI_HCF_B     (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLI_HCF_OUT_B (:,:,:,:)   
+REAL, ALLOCATABLE   :: ZRS_B          (:,:,:,:,:) 
+REAL, ALLOCATABLE   :: ZZZ_B          (:,:,:,:)   
+
+REAL, ALLOCATABLE   :: PRHODJ         (:,:,:,:)   
+REAL, ALLOCATABLE   :: PEXNREF        (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRHODREF       (:,:,:,:)   
+REAL, ALLOCATABLE   :: PPABSM         (:,:,:,:)   
+REAL, ALLOCATABLE   :: PTHT           (:,:,:,:)   
+REAL, ALLOCATABLE   :: PSIGS          (:,:,:,:)   
+REAL, ALLOCATABLE   :: PMFCONV        (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRC_MF         (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRI_MF         (:,:,:,:)   
+REAL, ALLOCATABLE   :: PCF_MF         (:,:,:,:)   
+REAL, ALLOCATABLE   :: PTHS           (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRS            (:,:,:,:,:) 
+REAL, ALLOCATABLE   :: PRS_OUT        (:,:,:,:,:) 
+REAL, ALLOCATABLE   :: PSRCS_OUT      (:,:,:,:)   
+REAL, ALLOCATABLE   :: PCLDFR_OUT     (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLC_HRC_OUT   (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLC_HCF_OUT   (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLI_HRI_OUT   (:,:,:,:)   
+REAL, ALLOCATABLE   :: PHLI_HCF_OUT   (:,:,:,:)   
+REAL, ALLOCATABLE   :: ZRS            (:,:,:,:,:) 
+REAL, ALLOCATABLE   :: ZZZ            (:,:,:,:)   
+
+INTEGER :: NGPTOT, NPROMA, NGPBLKS, NFLEVG
+INTEGER :: IOFF, IBL
+LOGICAL :: LLEXIST
+CHARACTER(LEN=32) :: CLFILE
+REAL :: ZNAN
+
+KRR=6
+NGPTOT = NPROMA * NGPBLKS
+
+IBL = 1
+WRITE (CLFILE, '("data/",I8.8,".dat")') IBL
+OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') 
+READ (IFILE) KLON, KDUM, KLEV
+CLOSE (IFILE)
+
+IF (NFLEVG < 0) NFLEVG = KLEV
+
+ALLOCATE (ZSIGQSAT_B      (NPROMA,1,NGPBLKS))
+ALLOCATE (ZICE_CLD_WGT_B  (NPROMA,1,NGPBLKS))
+ALLOCATE (PSRCS_B         (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PCLDFR_B        (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLC_HRC_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLC_HCF_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLI_HRI_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLI_HCF_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRHODJ_B        (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PEXNREF_B       (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRHODREF_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PPABSM_B        (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PTHT_B          (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PSIGS_B         (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PMFCONV_B       (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRC_MF_B        (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRI_MF_B        (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PCF_MF_B        (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PTHS_B          (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRS_B           (NPROMA,1,NFLEVG,KRR,NGPBLKS))
+ALLOCATE (PRS_OUT_B       (NPROMA,1,NFLEVG,KRR,NGPBLKS))
+ALLOCATE (PSRCS_OUT_B     (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PCLDFR_OUT_B    (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (ZRS_B           (NPROMA,1,NFLEVG,0:KRR,NGPBLKS))
+ALLOCATE (ZZZ_B           (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLC_HRC_OUT_B  (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLC_HCF_OUT_B  (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLI_HRI_OUT_B  (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLI_HCF_OUT_B  (NPROMA,1,NFLEVG,NGPBLKS))
+
+ZNAN = IEEE_VALUE (ZNAN, IEEE_SIGNALING_NAN)
+
+
+CALL SET (ZSIGQSAT_B    )
+CALL SET (ZICE_CLD_WGT_B)
+CALL SET (PSRCS_B       )
+CALL SET (PCLDFR_B      )
+CALL SET (PHLC_HRC_B    )
+CALL SET (PHLC_HCF_B    )
+CALL SET (PHLI_HRI_B    )
+CALL SET (PHLI_HCF_B    )
+CALL SET (PRHODJ_B      )
+CALL SET (PEXNREF_B     )
+CALL SET (PRHODREF_B    )
+CALL SET (PPABSM_B      )
+CALL SET (PTHT_B        )
+CALL SET (PSIGS_B       )
+CALL SET (PMFCONV_B     )
+CALL SET (PRC_MF_B      )
+CALL SET (PRI_MF_B      )
+CALL SET (PCF_MF_B      )
+CALL SET (PTHS_B        )
+CALL SET (PRS_B         )
+CALL SET (PRS_OUT_B     )
+CALL SET (PSRCS_OUT_B   )
+CALL SET (PCLDFR_OUT_B  )
+CALL SET (ZRS_B         )
+CALL SET (ZZZ_B         )
+CALL SET (PHLC_HRC_OUT_B)
+CALL SET (PHLC_HCF_OUT_B)
+CALL SET (PHLI_HRI_OUT_B)
+CALL SET (PHLI_HCF_OUT_B)
+
+
+
+ZSIGQSAT_B     = 2.0000000000000000E-002
+ZICE_CLD_WGT_B = 1.5
+PSRCS_B        = ZNAN
+PCLDFR_B       = ZNAN
+PHLI_HCF_B     = ZNAN
+PHLI_HRI_B     = ZNAN
+PHLC_HCF_B     = ZNAN
+PHLC_HRC_B     = ZNAN
+
+
+IOFF = 0
+IBL = 0
+LLEXIST = .TRUE.
+
+DO WHILE(LLEXIST)
+  IBL = IBL + 1
+  WRITE (CLFILE, '("data/",I8.8,".dat")') IBL
+
+  INQUIRE (FILE=TRIM (CLFILE), EXIST=LLEXIST)
+
+  IF (LDVERBOSE) PRINT *, TRIM (CLFILE)
+
+  IF (.NOT. LLEXIST) EXIT
+
+  OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') 
+  
+  READ (IFILE) KLON, KDUM, KLEV
+
+  IF (IBL == 1) THEN
+    ALLOCATE (PRHODJ       (NGPTOT,1,KLEV,1))
+    ALLOCATE (PEXNREF      (NGPTOT,1,KLEV,1))
+    ALLOCATE (PRHODREF     (NGPTOT,1,KLEV,1))
+    ALLOCATE (PPABSM       (NGPTOT,1,KLEV,1))
+    ALLOCATE (PTHT         (NGPTOT,1,KLEV,1))
+    ALLOCATE (PSIGS        (NGPTOT,1,KLEV,1))
+    ALLOCATE (PMFCONV      (NGPTOT,1,KLEV,1))
+    ALLOCATE (PRC_MF       (NGPTOT,1,KLEV,1))
+    ALLOCATE (PRI_MF       (NGPTOT,1,KLEV,1))
+    ALLOCATE (PCF_MF       (NGPTOT,1,KLEV,1))
+    ALLOCATE (PTHS         (NGPTOT,1,KLEV,1))
+    ALLOCATE (PRS          (NGPTOT,1,KLEV,KRR,1))
+    ALLOCATE (PRS_OUT      (NGPTOT,1,KLEV,KRR,1))
+    ALLOCATE (PSRCS_OUT    (NGPTOT,1,KLEV,1))
+    ALLOCATE (PCLDFR_OUT   (NGPTOT,1,KLEV,1))
+    ALLOCATE (ZRS          (NGPTOT,1,KLEV,0:KRR,1))
+    ALLOCATE (ZZZ          (NGPTOT,1,KLEV,1))
+    ALLOCATE (PHLC_HRC_OUT (NGPTOT,1,KLEV,1))
+    ALLOCATE (PHLC_HCF_OUT (NGPTOT,1,KLEV,1))
+    ALLOCATE (PHLI_HRI_OUT (NGPTOT,1,KLEV,1))
+    ALLOCATE (PHLI_HCF_OUT (NGPTOT,1,KLEV,1))
+  ENDIF
+
+  IF (IOFF+KLON > NGPTOT) THEN
+    EXIT
+  ENDIF
+
+  READ (IFILE) PRHODJ       (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PEXNREF      (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PRHODREF     (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PSIGS        (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PMFCONV      (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PPABSM       (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) ZZZ          (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PCF_MF       (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PRC_MF       (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PRI_MF       (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) ZRS          (IOFF+1:IOFF+KLON,:,:,:,1) 
+  READ (IFILE) PRS          (IOFF+1:IOFF+KLON,:,:,:,1) 
+  READ (IFILE) PTHS         (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PRS_OUT      (IOFF+1:IOFF+KLON,:,:,:,1) 
+  READ (IFILE) PSRCS_OUT    (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PCLDFR_OUT   (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PHLC_HRC_OUT (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PHLC_HCF_OUT (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PHLI_HRI_OUT (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PHLI_HCF_OUT (IOFF+1:IOFF+KLON,:,:,1) 
+  
+  CLOSE (IFILE)
+
+  IOFF = IOFF + KLON
+
+ENDDO
+
+IF (NFLEVG /= KLEV) THEN
+  CALL INTERPOLATE (NFLEVG, IOFF, PRHODJ      )
+  CALL INTERPOLATE (NFLEVG, IOFF, PEXNREF     )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRHODREF    )
+  CALL INTERPOLATE (NFLEVG, IOFF, PSIGS       )
+  CALL INTERPOLATE (NFLEVG, IOFF, PMFCONV     )
+  CALL INTERPOLATE (NFLEVG, IOFF, PPABSM      )
+  CALL INTERPOLATE (NFLEVG, IOFF, ZZZ         )
+  CALL INTERPOLATE (NFLEVG, IOFF, PCF_MF      )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRC_MF      )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRI_MF      )
+  CALL INTERPOLATE (NFLEVG, IOFF, ZRS         )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRS         )
+  CALL INTERPOLATE (NFLEVG, IOFF, PTHS        )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRS_OUT     )
+  CALL INTERPOLATE (NFLEVG, IOFF, PSRCS_OUT   )
+  CALL INTERPOLATE (NFLEVG, IOFF, PCLDFR_OUT  )
+  CALL INTERPOLATE (NFLEVG, IOFF, PHLC_HRC_OUT)
+  CALL INTERPOLATE (NFLEVG, IOFF, PHLC_HCF_OUT)
+  CALL INTERPOLATE (NFLEVG, IOFF, PHLI_HRI_OUT)
+  CALL INTERPOLATE (NFLEVG, IOFF, PHLI_HCF_OUT)
+ENDIF
+
+CALL REPLICATE (IOFF, PRHODJ       (:, :, :, 1))
+CALL REPLICATE (IOFF, PEXNREF      (:, :, :, 1))
+CALL REPLICATE (IOFF, PRHODREF     (:, :, :, 1))
+CALL REPLICATE (IOFF, PSIGS        (:, :, :, 1))
+CALL REPLICATE (IOFF, PMFCONV      (:, :, :, 1))
+CALL REPLICATE (IOFF, PPABSM       (:, :, :, 1))
+CALL REPLICATE (IOFF, ZZZ          (:, :, :, 1))
+CALL REPLICATE (IOFF, PCF_MF       (:, :, :, 1))
+CALL REPLICATE (IOFF, PRC_MF       (:, :, :, 1))
+CALL REPLICATE (IOFF, PRI_MF       (:, :, :, 1))
+CALL REPLICATE (IOFF, ZRS          (:, :, :, :, 1))
+CALL REPLICATE (IOFF, PRS          (:, :, :, :, 1))
+CALL REPLICATE (IOFF, PTHS         (:, :, :, 1))
+CALL REPLICATE (IOFF, PRS_OUT      (:, :, :, :, 1))
+CALL REPLICATE (IOFF, PSRCS_OUT    (:, :, :, 1))
+CALL REPLICATE (IOFF, PCLDFR_OUT   (:, :, :, 1))
+CALL REPLICATE (IOFF, PHLC_HRC_OUT (:, :, :, 1))
+CALL REPLICATE (IOFF, PHLC_HCF_OUT (:, :, :, 1))
+CALL REPLICATE (IOFF, PHLI_HRI_OUT (:, :, :, 1))
+CALL REPLICATE (IOFF, PHLI_HCF_OUT (:, :, :, 1))
+
+CALL NPROMIZE (NPROMA, PRHODJ      ,  PRHODJ_B        )
+CALL NPROMIZE (NPROMA, PEXNREF     ,  PEXNREF_B       )
+CALL NPROMIZE (NPROMA, PRHODREF    ,  PRHODREF_B      )
+CALL NPROMIZE (NPROMA, PSIGS       ,  PSIGS_B         )
+CALL NPROMIZE (NPROMA, PMFCONV     ,  PMFCONV_B       )
+CALL NPROMIZE (NPROMA, PPABSM      ,  PPABSM_B        )
+CALL NPROMIZE (NPROMA, ZZZ         ,  ZZZ_B           )
+CALL NPROMIZE (NPROMA, PCF_MF      ,  PCF_MF_B        )
+CALL NPROMIZE (NPROMA, PRC_MF      ,  PRC_MF_B        )
+CALL NPROMIZE (NPROMA, PRI_MF      ,  PRI_MF_B        )
+CALL NPROMIZE (NPROMA, ZRS         ,  ZRS_B           )
+CALL NPROMIZE (NPROMA, PRS         ,  PRS_B           )
+CALL NPROMIZE (NPROMA, PTHS        ,  PTHS_B          )
+CALL NPROMIZE (NPROMA, PRS_OUT     ,  PRS_OUT_B       )
+CALL NPROMIZE (NPROMA, PSRCS_OUT   ,  PSRCS_OUT_B     )
+CALL NPROMIZE (NPROMA, PCLDFR_OUT  ,  PCLDFR_OUT_B    )
+CALL NPROMIZE (NPROMA, PHLC_HRC_OUT,  PHLC_HRC_OUT_B  )
+CALL NPROMIZE (NPROMA, PHLC_HCF_OUT,  PHLC_HCF_OUT_B  )
+CALL NPROMIZE (NPROMA, PHLI_HRI_OUT,  PHLI_HRI_OUT_B  )
+CALL NPROMIZE (NPROMA, PHLI_HCF_OUT,  PHLI_HCF_OUT_B  )
+
+END SUBROUTINE 
+
+SUBROUTINE REPLICATE4 (KOFF, P)
+
+INTEGER :: KOFF
+REAL    :: P (:,:,:,:)
+
+INTEGER :: I, J
+
+DO I = KOFF+1, SIZE (P, 1)
+  J = 1 + MODULO (I - 1, KOFF)
+  P (I, :, :, :) = P (J, :, :, :)
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE REPLICATE3 (KOFF, P)
+
+INTEGER :: KOFF
+REAL    :: P (:,:,:)
+
+INTEGER :: I, J
+
+DO I = KOFF+1, SIZE (P, 1)
+  J = 1 + MODULO (I - 1, KOFF)
+  P (I, :, :) = P (J, :, :)
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE NPROMIZE4 (KPROMA, PI, PO)
+
+INTEGER :: KPROMA
+REAL, INTENT (IN)  :: PI (:,:,:,:) 
+REAL, INTENT (OUT) :: PO (:,:,:,:)
+
+INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA
+
+IF (SIZE (PI, 4) /= 1) STOP 1
+
+IGPTOT = SIZE (PI, 1)
+IGPBLK = 1 + (IGPTOT-1) / KPROMA
+
+DO IGP = 1, IGPTOT, KPROMA
+  IBL = 1 + (IGP - 1) / KPROMA
+  JIDIA = 1
+  JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA)
+
+  DO JLON = JIDIA, JFDIA
+    PO (JLON, :, :, IBL) = PI (IGP + (JLON - 1), :, :, 1)
+  ENDDO
+
+  DO JLON = JFDIA+1, KPROMA
+    PO (JLON, :, :, IBL) = PO (JFDIA, :, :, IBL)
+  ENDDO
+
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE NPROMIZE5 (KPROMA, PI, PO)
+
+INTEGER :: KPROMA
+REAL, INTENT (IN)  :: PI (:,:,:,:,:) 
+REAL, INTENT (OUT) :: PO (:,:,:,:,:)
+
+INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA
+
+IF (SIZE (PI, 5) /= 1) STOP 1
+
+IGPTOT = SIZE (PI, 1)
+IGPBLK = 1 + (IGPTOT-1) / KPROMA
+
+DO IGP = 1, IGPTOT, KPROMA
+  IBL = 1 + (IGP - 1) / KPROMA
+  JIDIA = 1
+  JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA)
+
+  DO JLON = JIDIA, JFDIA
+    PO (JLON, :, :, :, IBL) = PI (IGP + (JLON - 1), :, :, :, 1)
+  ENDDO
+
+  DO JLON = JFDIA+1, KPROMA
+    PO (JLON, :, :, :, IBL) = PI (JFDIA, :, :, :, IBL)
+  ENDDO
+
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE INTERPOLATE4 (KFLEVG, KOFF, P)
+
+INTEGER :: KFLEVG, KOFF
+REAL, ALLOCATABLE :: P (:,:,:,:)
+REAL :: Z (LBOUND (P, 1):UBOUND (P, 1), &
+         & LBOUND (P, 2):UBOUND (P, 2), &
+         & LBOUND (P, 3):UBOUND (P, 3), &
+         & LBOUND (P, 4):UBOUND (P, 4))
+INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2
+REAL :: ZWA, ZWB, ZLEV1, ZLEV2
+
+Z = P
+
+NLEV1 = SIZE (P, 3)
+NLEV2 = KFLEVG
+
+DEALLOCATE (P)
+
+ALLOCATE (P (LBOUND (Z, 1):UBOUND (Z, 1), &
+           & LBOUND (Z, 2):UBOUND (Z, 2), &
+           & KFLEVG, &
+           & LBOUND (Z, 4):UBOUND (Z, 4)))
+
+DO ILEV2 = 1, NLEV2
+  ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1)
+  ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1)
+  ILEV1B = MIN (CEILING (ZLEV1), NLEV1)
+  ILEV1A = MAX (FLOOR   (ZLEV1),     1)
+
+  IF (ILEV1A == ILEV1B) THEN
+    ZWA = 1.
+    ZWB = 0.
+  ELSE
+    ZWA = REAL (ILEV1B) - ZLEV1
+    ZWB = ZLEV1 - REAL (ILEV1A)
+  ENDIF
+
+! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') &
+!   & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB
+
+  P (1:KOFF, :, ILEV2, :) = ZWA * Z (1:KOFF, :, ILEV1A, :) + ZWB * Z (1:KOFF, :, ILEV1B, :) 
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE INTERPOLATE5 (KFLEVG, KOFF, P)
+
+INTEGER :: KFLEVG, KOFF
+REAL, ALLOCATABLE :: P (:,:,:,:,:)
+REAL :: Z (LBOUND (P, 1):UBOUND (P, 1), &
+         & LBOUND (P, 2):UBOUND (P, 2), &
+         & LBOUND (P, 3):UBOUND (P, 3), &
+         & LBOUND (P, 4):UBOUND (P, 4), &
+         & LBOUND (P, 5):UBOUND (P, 5))
+INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2
+REAL :: ZWA, ZWB, ZLEV1, ZLEV2
+
+Z = P
+
+NLEV1 = SIZE (P, 3)
+NLEV2 = KFLEVG
+
+DEALLOCATE (P)
+
+ALLOCATE (P (LBOUND (Z, 1):UBOUND (Z, 1), &
+           & LBOUND (Z, 2):UBOUND (Z, 2), &
+           & KFLEVG, &
+           & LBOUND (Z, 4):UBOUND (Z, 4), &
+           & LBOUND (Z, 5):UBOUND (Z, 5)))
+
+DO ILEV2 = 1, NLEV2
+  ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1)
+  ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1)
+  ILEV1B = MIN (CEILING (ZLEV1), NLEV1)
+  ILEV1A = MAX (FLOOR   (ZLEV1),     1)
+
+  IF (ILEV1A == ILEV1B) THEN
+    ZWA = 1.
+    ZWB = 0.
+  ELSE
+    ZWA = REAL (ILEV1B) - ZLEV1
+    ZWB = ZLEV1 - REAL (ILEV1A)
+  ENDIF
+
+! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') &
+!   & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB
+
+  P (1:KOFF, :, ILEV2, :, :) = ZWA * Z (1:KOFF, :, ILEV1A, :, :) + ZWB * Z (1:KOFF, :, ILEV1B, :, :) 
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE SET3 (P)
+
+REAL :: P (:,:,:)
+INTEGER :: IBL, IGPBLKS
+INTEGER :: NTID, ITID, JBLK1, JBLK2
+
+
+IGPBLKS = SIZE (P, 3)
+
+!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID)
+NTID = OMP_GET_MAX_THREADS ()
+ITID = OMP_GET_THREAD_NUM ()
+JBLK1 = 1 +  (IGPBLKS * (ITID+0)) / NTID
+JBLK2 =      (IGPBLKS * (ITID+1)) / NTID
+
+DO IBL = JBLK1, JBLK2
+  P (:,:,IBL) = ZNAN
+ENDDO
+
+!$OMP END PARALLEL
+
+END SUBROUTINE
+
+SUBROUTINE SET4 (P)
+
+REAL :: P (:,:,:,:)
+INTEGER :: IBL, IGPBLKS
+INTEGER :: NTID, ITID, JBLK1, JBLK2
+
+IGPBLKS = SIZE (P, 4)
+
+!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID)
+NTID = OMP_GET_MAX_THREADS ()
+ITID = OMP_GET_THREAD_NUM ()
+JBLK1 = 1 +  (IGPBLKS * (ITID+0)) / NTID
+JBLK2 =      (IGPBLKS * (ITID+1)) / NTID
+
+DO IBL = JBLK1, JBLK2
+  P (:,:,:,IBL) = ZNAN
+ENDDO
+
+!$OMP END PARALLEL
+
+END SUBROUTINE
+
+SUBROUTINE SET5 (P)
+
+REAL :: P (:,:,:,:,:)
+INTEGER :: IBL, IGPBLKS
+INTEGER :: NTID, ITID, JBLK1, JBLK2
+
+IGPBLKS = SIZE (P, 5)
+
+!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID)
+NTID = OMP_GET_MAX_THREADS ()
+ITID = OMP_GET_THREAD_NUM ()
+JBLK1 = 1 +  (IGPBLKS * (ITID+0)) / NTID
+JBLK2 =      (IGPBLKS * (ITID+1)) / NTID
+
+DO IBL = JBLK1, JBLK2
+  P (:,:,:,:,IBL) = ZNAN
+ENDDO
+
+!$OMP END PARALLEL
+
+END SUBROUTINE
+
+
+END  MODULE
diff --git a/src/testprogs/ice_adjust/main_ice_adjust.F90 b/src/testprogs/ice_adjust/main_ice_adjust.F90
new file mode 100644
index 0000000000000000000000000000000000000000..02ab5c6efb1cafa34cf2642f830d35afe00bd490
--- /dev/null
+++ b/src/testprogs/ice_adjust/main_ice_adjust.F90
@@ -0,0 +1,367 @@
+PROGRAM MAIN_ICE_ADJUST
+
+USE XRD_GETOPTIONS
+USE GETDATA_ICE_ADJUST_MOD
+USE MODI_ICE_ADJUST
+USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
+USE MODD_CST,        ONLY: CST_t, CST
+USE MODD_NEB,        ONLY: NEB_t, NEB
+USE MODD_RAIN_ICE_PARAM, ONLY : RAIN_ICE_PARAM_t
+USE MODI_INI_CST
+USE MODI_INI_NEB
+USE MODD_BUDGET, ONLY: TBUDGETDATA, NBUDGET_RI, TBUCONF
+USE STACK_MOD
+USE OMP_LIB
+USE YOMHOOK, ONLY : LHOOK, DR_HOOK
+USE PARKIND1, ONLY : JPRB, JPIM
+
+
+IMPLICIT NONE
+
+INTEGER      :: KLON 
+INTEGER      :: KLEV
+INTEGER      :: KRR
+
+REAL,    ALLOCATABLE   :: PRHODJ         (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PEXNREF        (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PRHODREF       (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PPABSM         (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PTHT           (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PSIGS          (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PMFCONV        (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PRC_MF         (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PRI_MF         (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PCF_MF         (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PTHS           (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PRS            (:,:,:,:,:) 
+REAL,    ALLOCATABLE   :: PSRCS          (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PCLDFR         (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PHLC_HRC       (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PHLC_HCF       (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PHLI_HRI       (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PHLI_HCF       (:,:,:,:)   
+REAL,    ALLOCATABLE   :: ZRS            (:,:,:,:,:) 
+REAL,    ALLOCATABLE   :: ZZZ            (:,:,:,:)   
+REAL,    ALLOCATABLE   :: ZSIGQSAT       (:,:,:)   
+REAL,    ALLOCATABLE   :: ZICE_CLD_WGT   (:,:,:)   
+
+REAL,    ALLOCATABLE   :: PRS_OUT        (:,:,:,:,:) 
+REAL,    ALLOCATABLE   :: PSRCS_OUT      (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PCLDFR_OUT     (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PHLC_HRC_OUT   (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PHLC_HCF_OUT   (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PHLI_HRI_OUT   (:,:,:,:)   
+REAL,    ALLOCATABLE   :: PHLI_HCF_OUT   (:,:,:,:)   
+
+INTEGER :: NPROMA, NGPBLKS, NFLEVG
+INTEGER :: IBL, JLON, JLEV
+
+TYPE(DIMPHYEX_t)         :: D, D0
+TYPE(RAIN_ICE_PARAM_t)   :: ICEP
+CHARACTER(LEN=1)         :: HFRAC_ICE
+CHARACTER(LEN=80)        :: HCONDENS
+CHARACTER(LEN=4)         :: HLAMBDA3 
+CHARACTER(LEN=4)         :: HBUNAME  
+LOGICAL                  :: OSUBG_COND
+LOGICAL                  :: OSIGMAS  
+LOGICAL                  :: OCND2    
+LOGICAL                  :: LMFCONV
+CHARACTER(LEN=80)        :: HSUBG_MF_PDF
+REAL                     :: PTSTEP    
+TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RI) :: YLBUDGET
+LOGICAL                  :: LLCHECK
+LOGICAL                  :: LLCHECKDIFF
+LOGICAL                  :: LLDIFF
+INTEGER                  :: IBLOCK1, IBLOCK2
+INTEGER                  :: ISTSZ, JBLK1, JBLK2
+INTEGER                  :: NTID, ITID
+INTEGER                  :: JRR
+
+REAL, ALLOCATABLE :: PSTACK(:,:)
+TYPE (STACK) :: YLSTACK
+
+REAL(KIND=8) :: TS,TE
+REAL(KIND=8) :: TSC, TEC, TSD, TED, ZTC, ZTD 
+INTEGER :: ITIME, NTIME
+INTEGER :: IRANK, ISIZE
+LOGICAL :: LLVERBOSE, LLSTAT, LLBIND
+REAL (KIND=JPRB) :: ZHOOK_HANDLE
+
+CALL INITOPTIONS ()
+NGPBLKS = 296
+CALL GETOPTION ("--blocks", NGPBLKS)
+NPROMA = 32
+CALL GETOPTION ("--nproma", NPROMA)
+NFLEVG = -1
+CALL GETOPTION ("--nflevg", NFLEVG)
+CALL GETOPTION ("--check",  LLCHECK)
+CALL GETOPTION ("--checkdiff",  LLCHECKDIFF)
+IBLOCK1 = 1
+CALL GETOPTION ("--check-block-1", IBLOCK1)
+IBLOCK2 = NGPBLKS
+CALL GETOPTION ("--check-block-2", IBLOCK2)
+CALL GETOPTION ("--stat", LLSTAT)
+NTIME = 1
+CALL GETOPTION ("--times", NTIME)
+CALL GETOPTION ("--verbose", LLVERBOSE)
+CALL GETOPTION ("--bind", LLBIND)
+CALL CHECKOPTIONS ()
+
+LLDIFF = .FALSE.
+
+IRANK = 0
+ISIZE = 1
+IF (LLBIND) THEN
+  CALL LINUX_BIND      (IRANK, ISIZE)
+  CALL LINUX_BIND_DUMP (IRANK, ISIZE)
+ENDIF
+
+CALL GETDATA_ICE_ADJUST (NPROMA, NGPBLKS, NFLEVG, PRHODJ, PEXNREF, PRHODREF, PPABSM, PTHT, ZICE_CLD_WGT,     &
+& ZSIGQSAT, PSIGS, PMFCONV, PRC_MF, PRI_MF, PCF_MF, PTHS, PRS, PSRCS, PCLDFR, PHLC_HRC, PHLC_HCF, &
+& PHLI_HRI, PHLI_HCF, ZRS, ZZZ, PRS_OUT, PSRCS_OUT, PCLDFR_OUT, PHLC_HRC_OUT, PHLC_HCF_OUT,       &
+& PHLI_HRI_OUT, PHLI_HCF_OUT, LLVERBOSE)
+
+
+KLEV = SIZE (PRS, 3)
+KRR  = SIZE (PRS, 4)
+
+IF (LLVERBOSE) PRINT *, " KLEV = ", KLEV, " KRR = ", KRR
+
+PRINT *, " NPROMA = ", NPROMA, " KLEV = ", KLEV, " NGPBLKS = ", NGPBLKS
+
+CALL INI_CST
+CALL INI_NEB
+
+! Taken from ini_rain_ice.F90; we only need these for ice_adjust.F90
+ICEP%XCRIAUTI  = 0.2E-4 
+ICEP%XCRIAUTC  = 0.5E-3
+ICEP%XACRIAUTI = 0.06
+ICEP%XBCRIAUTI = -3.5
+
+! As provided by S. Riette, AROME specific
+
+ICEP%XCRIAUTC  = 1.0000000000000000E-003
+ICEP%XCRIAUTI  = 2.0000000000000001E-004
+ICEP%XACRIAUTI = 6.2974856647312144E-002
+ICEP%XBCRIAUTI = -3.3840957210994582    
+
+
+HFRAC_ICE    = 'S'
+HCONDENS     = 'CB02'
+HLAMBDA3     = 'CB'
+HBUNAME      = 'DEPI'
+OSUBG_COND   = .TRUE.
+OSIGMAS      = .TRUE.
+OCND2        = .FALSE.
+HSUBG_MF_PDF = 'TRIANGLE'
+PTSTEP       = 50.000000000000000    
+LMFCONV      = .TRUE.
+DO JRR=1, NBUDGET_RI
+  YLBUDGET(JRR)%NBUDGET=JRR
+ENDDO
+
+D0%NIT  = NPROMA
+D0%NIB  = 1
+D0%NIE  = NPROMA
+D0%NJT  = 1
+D0%NJB  = 1
+D0%NJE  = 1
+D0%NKL  = -1
+D0%NKT  = KLEV
+D0%NKA  = KLEV
+D0%NKU  = 1
+D0%NKB  = KLEV 
+D0%NKE  = 1
+D0%NKTB = 1
+D0%NKTE = KLEV
+
+ISTSZ = NPROMA * 20 * KLEV
+ALLOCATE (PSTACK (ISTSZ, NGPBLKS))
+
+TS = OMP_GET_WTIME ()
+
+ZTD = 0.
+ZTC = 0.
+
+IF (LHOOK) CALL DR_HOOK ('MAIN',0,ZHOOK_HANDLE)
+
+DO ITIME = 1, NTIME
+
+  TSD = OMP_GET_WTIME ()
+
+!$acc data &
+!$acc      & copyin  (D0, CST, ICEP, NEB, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3, HBUNAME, OSUBG_COND, OSIGMAS, OCND2, HSUBG_MF_PDF, PTSTEP, LMFCONV, &
+!$acc      &          ZSIGQSAT, PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABSM, ZZZ, PCF_MF, PRC_MF, PRI_MF, ZRS, ZICE_CLD_WGT) &
+!$acc      & copy    (PRS, PTHS), &
+!$acc      & copyout (PSRCS, PCLDFR, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF) &
+!$acc      & create  (PSTACK) 
+
+  TSC = OMP_GET_WTIME ()
+
+#ifdef USE_OPENMP
+!$OMP PARALLEL PRIVATE (D, ITID, JBLK1, JBLK2)
+#endif
+
+#ifdef _OPENACC
+JBLK1 = 1 
+JBLK2 = NGPBLKS
+#endif
+
+#ifdef USE_OPENMP
+NTID = OMP_GET_MAX_THREADS ()
+ITID = OMP_GET_THREAD_NUM ()
+JBLK1 = 1 +  (NGPBLKS * (ITID+0)) / NTID
+JBLK2 =      (NGPBLKS * (ITID+1)) / NTID
+
+
+!PRINT *, ITID, JBLK1, JBLK2
+
+#endif
+
+!$acc parallel loop gang vector private (YLSTACK, IBL, JLON, D) collapse (2)
+
+  DO IBL = JBLK1, JBLK2
+
+
+#ifdef _OPENACC
+  DO JLON = 1, NPROMA
+    D = D0
+    D%NIB = JLON
+    D%NIE = JLON
+#endif
+
+#ifdef USE_OPENMP
+    D = D0
+#endif
+
+#ifdef USE_STACK
+    YLSTACK%L = LOC (PSTACK (1, IBL))
+    YLSTACK%U = YLSTACK%L + ISTSZ * KIND (PSTACK)
+#else
+    YLSTACK%L = 0
+    YLSTACK%U = 0
+#endif
+
+    CALL ICE_ADJUST (D, CST, ICEP, NEB, TBUCONF, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3, HBUNAME, OSUBG_COND,                       &
+    & OSIGMAS, OCND2, HSUBG_MF_PDF, PTSTEP, ZSIGQSAT (:, :, IBL), PRHODJ=PRHODJ (:, :, :, IBL), PEXNREF=PEXNREF (:, :, :, IBL), &
+    & PRHODREF=PRHODREF (:, :, :, IBL), PSIGS=PSIGS (:, :, :, IBL), LMFCONV=LMFCONV, PMFCONV=PMFCONV (:, :, :, IBL),            &
+    & PPABST=PPABSM (:, :, :, IBL), PZZ=ZZZ (:, :, :, IBL), PEXN=PEXNREF (:, :, :, IBL), PCF_MF=PCF_MF (:, :, :, IBL),          &
+    & PRC_MF=PRC_MF (:, :, :, IBL), PRI_MF=PRI_MF  (:, :, :, IBL), PRV=ZRS(:, :, :, 1, IBL), PRC=ZRS(:, :, :, 2, IBL),          &
+    & PRVS=PRS(:, :, :, 1, IBL), PRCS=PRS(:, :, :, 2, IBL), PTH=ZRS(:, :, :, 0, IBL), PTHS=PTHS (:, :, :, IBL),                 &
+    & OCOMPUTE_SRC=.TRUE.,                                                                                                      &
+    & PSRCS=PSRCS (:, :, :, IBL), PCLDFR=PCLDFR (:, :, :, IBL), PRR=ZRS(:, :, :, 3, IBL), PRI=ZRS(:, :, :, 4, IBL),             &
+    & PRIS=PRS(:, :, :, 4, IBL), PRS=ZRS(:, :, :, 5, IBL), PRG=ZRS(:, :, :, 6, IBL), PHLC_HRC=PHLC_HRC(:, :, :, IBL),           &
+    & PHLC_HCF=PHLC_HCF(:, :, :, IBL), PHLI_HRI=PHLI_HRI(:, :, :, IBL), PHLI_HCF=PHLI_HCF(:, :, :, IBL),                        &
+    & TBUDGETS=YLBUDGET, KBUDGETS=NBUDGET_RI, &
+    & PICE_CLD_WGT=ZICE_CLD_WGT(:, :, IBL) &
+#ifdef USE_STACK
+    & , YDSTACK=YLSTACK &
+#endif
+    & )
+
+#ifdef _OPENACC
+    ENDDO
+#endif
+
+  ENDDO
+
+#ifdef USE_OPENMP
+!$OMP END PARALLEL
+#endif
+
+!$acc end parallel loop
+
+  TEC = OMP_GET_WTIME ()
+
+!$acc end data
+
+  TED = OMP_GET_WTIME ()
+
+  ZTC = ZTC + (TEC - TSC)
+  ZTD = ZTD + (TED - TSD)
+
+ENDDO
+
+IF (LHOOK) CALL DR_HOOK ('MAIN',1,ZHOOK_HANDLE)
+
+TE = OMP_GET_WTIME()
+
+WRITE (*,'(A,F8.2,A)') 'elapsed time : ',TE-TS,' s'
+WRITE (*,'(A,F8.4,A)') '          i.e. ',1000.*(TE-TS)/(NPROMA*NGPBLKS)/NTIME,' ms/gp'
+
+PRINT *, " ZTD = ", ZTD, ZTD / REAL (NPROMA*NGPBLKS*NTIME)
+PRINT *, " ZTC = ", ZTC, ZTC / REAL (NPROMA*NGPBLKS*NTIME)
+
+
+IF (LLCHECK .OR. LLSTAT .OR. LLCHECKDIFF) THEN
+  DO IBL = IBLOCK1, IBLOCK2
+    PRINT *, " IBL = ", IBL
+    CALL DIFF ("PSRCS",    PSRCS_OUT    (:,:,:,IBL), PSRCS    (:,:,:,IBL))
+    CALL DIFF ("PCLDFR",   PCLDFR_OUT   (:,:,:,IBL), PCLDFR   (:,:,:,IBL))
+    CALL DIFF ("PHLC_HRC", PHLC_HRC_OUT (:,:,:,IBL), PHLC_HRC (:,:,:,IBL))
+    CALL DIFF ("PHLC_HCF", PHLC_HCF_OUT (:,:,:,IBL), PHLC_HCF (:,:,:,IBL))
+    CALL DIFF ("PHLI_HRI", PHLI_HRI_OUT (:,:,:,IBL), PHLI_HRI (:,:,:,IBL))
+    CALL DIFF ("PHLI_HCF", PHLI_HCF_OUT (:,:,:,IBL), PHLI_HCF (:,:,:,IBL))
+  ENDDO
+ENDIF
+
+IF (LLCHECKDIFF) THEN
+  IF (LLDIFF) THEN
+    PRINT*, "THERE ARE DIFF SOMEWHERE"
+  ELSE
+    PRINT*, "THERE IS NO DIFF AT ALL"
+  ENDIF
+ENDIF
+
+STOP
+
+CONTAINS
+
+SUBROUTINE DIFF (CDNAME, PREF, POUT)
+
+CHARACTER (LEN=*) :: CDNAME
+REAL :: PREF (:,:,:)
+REAL :: POUT (:,:,:)
+
+INTEGER :: JLON, JLEV
+
+PRINT *, CDNAME
+IF (LLSTAT) THEN
+  PRINT *, MINVAL (PREF), MAXVAL (PREF), SUM (PREF) / SIZE (PREF)
+  PRINT *, MINVAL (POUT), MAXVAL (POUT), SUM (POUT) / SIZE (POUT)
+ENDIF
+
+IF (LLCHECK) THEN
+  IF (SUM (ABS (POUT) + ABS (PREF)) > 0) THEN
+  WRITE (*, '(A4)', ADVANCE='NO') ""
+  DO JLON = 1, NPROMA
+    WRITE (*, '("|",I12,A12)', ADVANCE='NO') JLON, ""
+  ENDDO
+  WRITE (*, '("|")')
+  DO JLEV = 1, KLEV
+    WRITE (*, '(I4)', ADVANCE='NO') JLEV
+    DO JLON = 1, NPROMA
+      IF (ABS (PREF (JLON, 1, JLEV)) + ABS (POUT (JLON, 1, JLEV)) == 0.) THEN
+      WRITE (*, '("|",2A12)', ADVANCE='NO') "", ""
+      ELSE
+      WRITE (*, '("|",2E12.5)', ADVANCE='NO') PREF (JLON, 1, JLEV), POUT (JLON, 1, JLEV)
+      ENDIF
+    ENDDO
+    WRITE (*, '("|")')
+  ENDDO
+  ENDIF
+ENDIF
+
+IF (LLCHECKDIFF) THEN
+  IF (SUM(ABS(POUT-PREF)) > 0.) THEN
+    PRINT*, "THERE ARE DIFF"
+    LLDIFF = .TRUE.
+  ELSE
+    PRINT*, "THERE IS NO DIFF"
+  ENDIF
+ENDIF
+
+END SUBROUTINE
+
+
+END
diff --git a/src/testprogs/rain_ice/getdata_rain_ice_mod.F90 b/src/testprogs/rain_ice/getdata_rain_ice_mod.F90
new file mode 100644
index 0000000000000000000000000000000000000000..57c28b427d7a1b776b1ffcf68894bbf84e8b9e23
--- /dev/null
+++ b/src/testprogs/rain_ice/getdata_rain_ice_mod.F90
@@ -0,0 +1,801 @@
+MODULE GETDATA_RAIN_ICE_MOD
+
+USE OMP_LIB
+
+INTERFACE REPLICATE
+  MODULE PROCEDURE REPLICATE2
+  MODULE PROCEDURE REPLICATE3
+  MODULE PROCEDURE REPLICATE4
+  MODULE PROCEDURE REPLICATEL
+END INTERFACE
+
+INTERFACE NPROMIZE
+  MODULE PROCEDURE NPROMIZE3
+  MODULE PROCEDURE NPROMIZE4
+  MODULE PROCEDURE NPROMIZE5
+  MODULE PROCEDURE NPROMIZEL
+END INTERFACE
+
+INTERFACE INTERPOLATE
+  MODULE PROCEDURE INTERPOLATE4
+  MODULE PROCEDURE INTERPOLATE5
+  MODULE PROCEDURE INTERPOLATEL
+END INTERFACE
+
+INTERFACE SET
+  MODULE PROCEDURE SET3
+  MODULE PROCEDURE SET4
+  MODULE PROCEDURE SET5
+END INTERFACE
+
+CONTAINS
+
+SUBROUTINE GETDATA_RAIN_ICE (NPROMA, NGPBLKS, NFLEVG, LLMICRO_B, PEXNREF_B, PDZZ_B, PRHODJ_B, PRHODREF_B, &
+  &PEXNREF2_B, PPABSM_B, PCIT_B, PCLDFR_B, PHLC_HRC_B, PHLC_HCF_B, PHLI_HRI_B, PHLI_HCF_B, PTHT_B, PRT_B, PTHS_B, &
+  &PRS_B, PSIGS_B, PSEA_B, PTOWN_B, PCIT_OUT_B, PRS_OUT_B, ZINPRC_B, ZINPRC_OUT_B, PINPRR_B, PINPRR_OUT_B, PEVAP_B, PEVAP_OUT_B, &
+  &PINPRS_B, PINPRS_OUT_B, PINPRG_B, PINPRG_OUT_B, ZINDEP_B, ZINDEP_OUT_B, ZRAINFR_B, ZRAINFR_OUT_B, PFPR_B, PFPR_OUT_B, LDVERBOSE)
+
+USE IEEE_ARITHMETIC, ONLY : IEEE_SIGNALING_NAN, IEEE_VALUE
+
+IMPLICIT NONE
+
+INTEGER, PARAMETER :: IFILE = 77
+
+INTEGER      :: KLON 
+INTEGER      :: KIDIA  
+INTEGER      :: KFDIA  
+INTEGER      :: KLEV  
+INTEGER      :: KRR  
+INTEGER      :: KDUM
+
+LOGICAL :: LDVERBOSE
+
+LOGICAL, ALLOCATABLE:: LLMICRO_B      (:,:,:,:)
+REAL, ALLOCATABLE   :: PEXNREF_B      (:,:,:,:)
+REAL, ALLOCATABLE   :: PDZZ_B         (:,:,:,:)
+REAL, ALLOCATABLE   :: PRHODJ_B       (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRHODREF_B     (:,:,:,:)   
+REAL, ALLOCATABLE   :: PEXNREF2_B     (:,:,:,:)
+REAL, ALLOCATABLE   :: PPABSM_B       (:,:,:,:)
+REAL, ALLOCATABLE   :: PCIT_B         (:,:,:,:)
+REAL, ALLOCATABLE   :: PCLDFR_B       (:,:,:,:)
+REAL, ALLOCATABLE   :: PHLC_HRC_B     (:,:,:,:)
+REAL, ALLOCATABLE   :: PHLC_HCF_B     (:,:,:,:)
+REAL, ALLOCATABLE   :: PHLI_HRI_B     (:,:,:,:)
+REAL, ALLOCATABLE   :: PHLI_HCF_B     (:,:,:,:)
+REAL, ALLOCATABLE   :: PTHT_B         (:,:,:,:)
+REAL, ALLOCATABLE   :: PRT_B          (:,:,:,:,:)
+REAL, ALLOCATABLE   :: PTHS_B         (:,:,:,:)
+REAL, ALLOCATABLE   :: PRS_B          (:,:,:,:,:)
+REAL, ALLOCATABLE   :: PSIGS_B        (:,:,:,:)
+REAL, ALLOCATABLE   :: PSEA_B         (:,:,:)
+REAL, ALLOCATABLE   :: PTOWN_B        (:,:,:)
+REAL, ALLOCATABLE   :: PCIT_OUT_B     (:,:,:,:)
+REAL, ALLOCATABLE   :: PRS_OUT_B      (:,:,:,:,:)
+REAL, ALLOCATABLE   :: ZINPRC_B       (:,:,:)
+REAL, ALLOCATABLE   :: ZINPRC_OUT_B   (:,:,:)
+REAL, ALLOCATABLE   :: PINPRR_B       (:,:,:)
+REAL, ALLOCATABLE   :: PINPRR_OUT_B   (:,:,:)
+REAL, ALLOCATABLE   :: PEVAP_B        (:,:,:,:)
+REAL, ALLOCATABLE   :: PEVAP_OUT_B    (:,:,:,:)
+REAL, ALLOCATABLE   :: PINPRS_B       (:,:,:)
+REAL, ALLOCATABLE   :: PINPRS_OUT_B   (:,:,:)
+REAL, ALLOCATABLE   :: PINPRG_B       (:,:,:)
+REAL, ALLOCATABLE   :: PINPRG_OUT_B   (:,:,:)
+REAL, ALLOCATABLE   :: ZINDEP_B       (:,:,:)
+REAL, ALLOCATABLE   :: ZINDEP_OUT_B   (:,:,:)
+REAL, ALLOCATABLE   :: ZRAINFR_B      (:,:,:,:)
+REAL, ALLOCATABLE   :: ZRAINFR_OUT_B  (:,:,:,:)
+REAL, ALLOCATABLE   :: PFPR_B         (:,:,:,:,:)
+REAL, ALLOCATABLE   :: PFPR_OUT_B     (:,:,:,:,:)
+
+LOGICAL, ALLOCATABLE   :: LLMICRO        (:,:,:,:)
+REAL, ALLOCATABLE   :: PEXNREF        (:,:,:,:)
+REAL, ALLOCATABLE   :: PDZZ           (:,:,:,:)
+REAL, ALLOCATABLE   :: PRHODJ         (:,:,:,:)   
+REAL, ALLOCATABLE   :: PRHODREF       (:,:,:,:)   
+REAL, ALLOCATABLE   :: PEXNREF2       (:,:,:,:)
+REAL, ALLOCATABLE   :: PPABSM         (:,:,:,:)   
+REAL, ALLOCATABLE   :: PCIT           (:,:,:,:)
+REAL, ALLOCATABLE   :: PCLDFR         (:,:,:,:)
+REAL, ALLOCATABLE   :: PHLC_HRC       (:,:,:,:)
+REAL, ALLOCATABLE   :: PHLC_HCF       (:,:,:,:)
+REAL, ALLOCATABLE   :: PHLI_HRI       (:,:,:,:)
+REAL, ALLOCATABLE   :: PHLI_HCF       (:,:,:,:)
+REAL, ALLOCATABLE   :: PTHT           (:,:,:,:)
+REAL, ALLOCATABLE   :: PRT            (:,:,:,:,:)
+REAL, ALLOCATABLE   :: PTHS           (:,:,:,:)
+REAL, ALLOCATABLE   :: PRS            (:,:,:,:,:)
+REAL, ALLOCATABLE   :: PSIGS          (:,:,:,:)
+REAL, ALLOCATABLE   :: PSEA           (:,:,:)
+REAL, ALLOCATABLE   :: PTOWN          (:,:,:)
+REAL, ALLOCATABLE   :: PCIT_OUT       (:,:,:,:)
+REAL, ALLOCATABLE   :: PRS_OUT        (:,:,:,:,:)
+REAL, ALLOCATABLE   :: ZINPRC_OUT     (:,:,:)
+REAL, ALLOCATABLE   :: PINPRR_OUT     (:,:,:)
+REAL, ALLOCATABLE   :: PEVAP_OUT      (:,:,:,:)
+REAL, ALLOCATABLE   :: PINPRS_OUT     (:,:,:)
+REAL, ALLOCATABLE   :: PINPRG_OUT     (:,:,:)
+REAL, ALLOCATABLE   :: ZINDEP_OUT     (:,:,:)
+REAL, ALLOCATABLE   :: ZRAINFR_OUT    (:,:,:,:)
+REAL, ALLOCATABLE   :: PFPR_OUT       (:,:,:,:,:)
+
+
+INTEGER :: IPROMA, ISIZE
+INTEGER :: NGPTOT, NPROMA, NGPBLKS, NFLEVG
+INTEGER :: IOFF, IBL
+LOGICAL :: LLEXIST
+CHARACTER(LEN=32) :: CLFILE
+REAL :: ZNAN
+
+KRR=6
+NGPTOT = NPROMA * NGPBLKS
+
+IBL = 1
+WRITE (CLFILE, '("data/",I8.8,".dat")') IBL
+OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') 
+READ (IFILE) IPROMA, ISIZE
+READ (IFILE) KLON, KDUM, KLEV, KRR
+CLOSE (IFILE)
+
+IF (NFLEVG < 0) NFLEVG = KLEV
+
+ALLOCATE (LLMICRO_B       (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PEXNREF_B       (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PDZZ_B          (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRHODJ_B        (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRHODREF_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PEXNREF2_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PPABSM_B        (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PCIT_B          (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PCLDFR_B        (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLC_HRC_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLC_HCF_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLI_HRI_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PHLI_HCF_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PTHT_B          (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRT_B           (NPROMA,1,NFLEVG,KRR,NGPBLKS))
+ALLOCATE (PTHS_B          (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRS_B           (NPROMA,1,NFLEVG,KRR,NGPBLKS))
+ALLOCATE (PSIGS_B         (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PSEA_B          (NPROMA,1,NGPBLKS))
+ALLOCATE (PTOWN_B         (NPROMA,1,NGPBLKS))
+ALLOCATE (PCIT_OUT_B      (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PRS_OUT_B       (NPROMA,1,NFLEVG,KRR,NGPBLKS))
+ALLOCATE (ZINPRC_B        (NPROMA,1,NGPBLKS))
+ALLOCATE (ZINPRC_OUT_B    (NPROMA,1,NGPBLKS))
+ALLOCATE (PINPRR_B        (NPROMA,1,NGPBLKS))
+ALLOCATE (PINPRR_OUT_B    (NPROMA,1,NGPBLKS))
+ALLOCATE (PEVAP_B         (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PEVAP_OUT_B     (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PINPRS_B        (NPROMA,1,NGPBLKS))
+ALLOCATE (PINPRS_OUT_B    (NPROMA,1,NGPBLKS))
+ALLOCATE (PINPRG_B        (NPROMA,1,NGPBLKS))
+ALLOCATE (PINPRG_OUT_B    (NPROMA,1,NGPBLKS))
+ALLOCATE (ZINDEP_B        (NPROMA,1,NGPBLKS))
+ALLOCATE (ZINDEP_OUT_B    (NPROMA,1,NGPBLKS))
+ALLOCATE (ZRAINFR_B       (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (ZRAINFR_OUT_B   (NPROMA,1,NFLEVG,NGPBLKS))
+ALLOCATE (PFPR_B          (NPROMA,1,NFLEVG,KRR,NGPBLKS))
+ALLOCATE (PFPR_OUT_B      (NPROMA,1,NFLEVG,KRR,NGPBLKS))
+
+
+ZNAN = IEEE_VALUE (ZNAN, IEEE_SIGNALING_NAN)
+
+
+!CALL SET (LLMICRO_B     )
+CALL SET (PEXNREF_B     )
+CALL SET (PDZZ_B        )
+CALL SET (PRHODJ_B      )
+CALL SET (PRHODREF_B    )
+CALL SET (PEXNREF2_B    )
+CALL SET (PPABSM_B      )
+CALL SET (PCIT_B        )
+CALL SET (PCLDFR_B      )
+CALL SET (PHLC_HRC_B    )
+CALL SET (PHLC_HCF_B    )
+CALL SET (PHLI_HRI_B    )
+CALL SET (PHLI_HCF_B    )
+CALL SET (PTHT_B        )
+CALL SET (PRT_B         )
+CALL SET (PTHS_B        )
+CALL SET (PRS_B         )
+CALL SET (PSIGS_B       )
+CALL SET (PSEA_B        )
+CALL SET (PTOWN_B       )
+CALL SET (PCIT_OUT_B    )
+CALL SET (PRS_OUT_B     )
+CALL SET (ZINPRC_OUT_B  )
+CALL SET (PINPRR_OUT_B  )
+CALL SET (PEVAP_OUT_B   )
+CALL SET (PINPRS_OUT_B  )
+CALL SET (PINPRG_OUT_B  )
+CALL SET (ZINDEP_OUT_B  )
+CALL SET (ZRAINFR_OUT_B )
+CALL SET (PFPR_OUT_B    )
+
+ZINPRC_OUT_B  =     ZNAN
+PINPRR_OUT_B  =     ZNAN
+PEVAP_OUT_B   =     ZNAN
+PINPRS_OUT_B  =     ZNAN
+PINPRG_OUT_B  =     ZNAN
+ZINDEP_OUT_B  =     ZNAN
+ZRAINFR_OUT_B =     ZNAN
+PFPR_OUT_B    =     ZNAN
+
+IOFF = 0
+IBL = 0
+LLEXIST = .TRUE.
+
+DO WHILE(LLEXIST)
+  IBL = IBL + 1
+  WRITE (CLFILE, '("data/",I8.8,".dat")') IBL
+
+  INQUIRE (FILE=TRIM (CLFILE), EXIST=LLEXIST)
+
+  IF (LDVERBOSE) PRINT *, TRIM (CLFILE)
+
+  IF (.NOT. LLEXIST) EXIT
+
+  OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') 
+  
+  READ (IFILE) IPROMA, ISIZE
+  READ (IFILE) KLON, KDUM, KLEV, KRR
+
+  IF (IBL == 1) THEN
+    ALLOCATE (LLMICRO      (NGPTOT,1,KLEV,1))
+    ALLOCATE (PEXNREF      (NGPTOT,1,KLEV,1))
+    ALLOCATE (PDZZ         (NGPTOT,1,KLEV,1))
+    ALLOCATE (PRHODJ       (NGPTOT,1,KLEV,1))
+    ALLOCATE (PRHODREF     (NGPTOT,1,KLEV,1))
+    ALLOCATE (PEXNREF2     (NGPTOT,1,KLEV,1))
+    ALLOCATE (PPABSM       (NGPTOT,1,KLEV,1))
+    ALLOCATE (PCIT         (NGPTOT,1,KLEV,1))
+    ALLOCATE (PCLDFR       (NGPTOT,1,KLEV,1))
+    ALLOCATE (PHLC_HRC     (NGPTOT,1,KLEV,1))
+    ALLOCATE (PHLC_HCF     (NGPTOT,1,KLEV,1))
+    ALLOCATE (PHLI_HRI     (NGPTOT,1,KLEV,1))
+    ALLOCATE (PHLI_HCF     (NGPTOT,1,KLEV,1))
+    ALLOCATE (PTHT         (NGPTOT,1,KLEV,1))
+    ALLOCATE (PRT          (NGPTOT,1,KLEV,KRR,1))
+    ALLOCATE (PTHS         (NGPTOT,1,KLEV,1))
+    ALLOCATE (PRS          (NGPTOT,1,KLEV,KRR,1))
+    ALLOCATE (PSIGS        (NGPTOT,1,KLEV,1))
+    ALLOCATE (PSEA         (NGPTOT,1,1))
+    ALLOCATE (PTOWN        (NGPTOT,1,1))
+    ALLOCATE (PCIT_OUT     (NGPTOT,1,KLEV,1))
+    ALLOCATE (PRS_OUT      (NGPTOT,1,KLEV,KRR,1))
+    ALLOCATE (ZINPRC_OUT   (NGPTOT,1,1))
+    ALLOCATE (PINPRR_OUT   (NGPTOT,1,1))
+    ALLOCATE (PEVAP_OUT    (NGPTOT,1,KLEV,1))
+    ALLOCATE (PINPRS_OUT   (NGPTOT,1,1))
+    ALLOCATE (PINPRG_OUT   (NGPTOT,1,1))
+    ALLOCATE (ZINDEP_OUT   (NGPTOT,1,1))
+    ALLOCATE (ZRAINFR_OUT  (NGPTOT,1,KLEV,1))
+    ALLOCATE (PFPR_OUT     (NGPTOT,1,KLEV,KRR,1))
+  ENDIF
+
+  IF (IOFF+KLON > NGPTOT) THEN
+    EXIT
+  ENDIF
+
+  READ (IFILE) LLMICRO      (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PEXNREF      (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PDZZ         (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PRHODJ       (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PRHODREF     (IOFF+1:IOFF+KLON,:,:,1) 
+  READ (IFILE) PEXNREF2     (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PPABSM       (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PCIT         (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PCLDFR       (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PHLC_HRC     (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PHLC_HCF     (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PHLI_HRI     (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PHLI_HCF     (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PTHT         (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PRT          (IOFF+1:IOFF+KLON,:,:,:,1)
+  READ (IFILE) PTHS         (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PRS          (IOFF+1:IOFF+KLON,:,:,:,1)
+  READ (IFILE) PSIGS        (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PSEA         (IOFF+1:IOFF+KLON,:,1)
+  READ (IFILE) PTOWN        (IOFF+1:IOFF+KLON,:,1)
+  READ (IFILE) PCIT_OUT     (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PRS_OUT      (IOFF+1:IOFF+KLON,:,:,:,1)
+  READ (IFILE) ZINPRC_OUT   (IOFF+1:IOFF+KLON,:,1)
+  READ (IFILE) PINPRR_OUT   (IOFF+1:IOFF+KLON,:,1)
+  READ (IFILE) PEVAP_OUT    (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PINPRS_OUT   (IOFF+1:IOFF+KLON,:,1)
+  READ (IFILE) PINPRG_OUT   (IOFF+1:IOFF+KLON,:,1)
+  READ (IFILE) ZINDEP_OUT   (IOFF+1:IOFF+KLON,:,1)
+  READ (IFILE) ZRAINFR_OUT  (IOFF+1:IOFF+KLON,:,:,1)
+  READ (IFILE) PFPR_OUT     (IOFF+1:IOFF+KLON,:,:,:,1)
+  
+  CLOSE (IFILE)
+
+  IOFF = IOFF + KLON
+
+ENDDO
+
+IF (NFLEVG /= KLEV) THEN
+  CALL INTERPOLATE (NFLEVG, IOFF, LLMICRO     )
+  CALL INTERPOLATE (NFLEVG, IOFF, PEXNREF     )
+  CALL INTERPOLATE (NFLEVG, IOFF, PDZZ        )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRHODJ      )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRHODREF    )
+  CALL INTERPOLATE (NFLEVG, IOFF, PEXNREF2    )
+  CALL INTERPOLATE (NFLEVG, IOFF, PPABSM      )
+  CALL INTERPOLATE (NFLEVG, IOFF, PCIT        )
+  CALL INTERPOLATE (NFLEVG, IOFF, PCLDFR      )
+  CALL INTERPOLATE (NFLEVG, IOFF, PHLC_HRC    )
+  CALL INTERPOLATE (NFLEVG, IOFF, PHLC_HCF    )
+  CALL INTERPOLATE (NFLEVG, IOFF, PHLI_HRI    )
+  CALL INTERPOLATE (NFLEVG, IOFF, PHLI_HCF    )
+  CALL INTERPOLATE (NFLEVG, IOFF, PTHT        )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRT         )
+  CALL INTERPOLATE (NFLEVG, IOFF, PTHS        )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRS         )
+  CALL INTERPOLATE (NFLEVG, IOFF, PSIGS       )
+!  CALL INTERPOLATE (NFLEVG, IOFF, PSEA        )
+!  CALL INTERPOLATE (NFLEVG, IOFF, PTOWN       )
+  CALL INTERPOLATE (NFLEVG, IOFF, PCIT_OUT    )
+  CALL INTERPOLATE (NFLEVG, IOFF, PRS_OUT     )
+!  CALL INTERPOLATE (NFLEVG, IOFF, ZINPRC_OUT  )
+!  CALL INTERPOLATE (NFLEVG, IOFF, PINPRR_OUT  )
+  CALL INTERPOLATE (NFLEVG, IOFF, PEVAP_OUT   )
+!  CALL INTERPOLATE (NFLEVG, IOFF, PINPRS_OUT  )
+!  CALL INTERPOLATE (NFLEVG, IOFF, PINPRG_OUT  )
+!  CALL INTERPOLATE (NFLEVG, IOFF, ZINDEP_OUT  )
+  CALL INTERPOLATE (NFLEVG, IOFF, ZRAINFR_OUT )
+  CALL INTERPOLATE (NFLEVG, IOFF, PFPR_OUT    )
+
+ENDIF
+
+CALL REPLICATE (IOFF, LLMICRO      (:, :, :, 1))
+CALL REPLICATE (IOFF, PEXNREF      (:, :, :, 1))
+CALL REPLICATE (IOFF, PDZZ         (:, :, :, 1))
+CALL REPLICATE (IOFF, PRHODJ       (:, :, :, 1))
+CALL REPLICATE (IOFF, PRHODREF     (:, :, :, 1))
+CALL REPLICATE (IOFF, PEXNREF2     (:, :, :, 1))
+CALL REPLICATE (IOFF, PPABSM       (:, :, :, 1))
+CALL REPLICATE (IOFF, PCIT         (:, :, :, 1))
+CALL REPLICATE (IOFF, PCLDFR       (:, :, :, 1))
+CALL REPLICATE (IOFF, PHLC_HRC     (:, :, :, 1))
+CALL REPLICATE (IOFF, PHLC_HCF     (:, :, :, 1))
+CALL REPLICATE (IOFF, PHLI_HRI     (:, :, :, 1))
+CALL REPLICATE (IOFF, PHLI_HCF     (:, :, :, 1))
+CALL REPLICATE (IOFF, PTHT         (:, :, :, 1))
+CALL REPLICATE (IOFF, PRT          (:, :, :, :, 1))
+CALL REPLICATE (IOFF, PTHS         (:, :, :, 1))
+CALL REPLICATE (IOFF, PRS          (:, :, :, :, 1))
+CALL REPLICATE (IOFF, PSIGS        (:, :, :, 1))
+CALL REPLICATE (IOFF, PSEA         (:, :, 1))
+CALL REPLICATE (IOFF, PTOWN        (:, :, 1))
+CALL REPLICATE (IOFF, PCIT_OUT     (:, :, :, 1))
+CALL REPLICATE (IOFF, PRS_OUT      (:, :, :, :, 1))
+CALL REPLICATE (IOFF, ZINPRC_OUT   (:, :, 1))
+CALL REPLICATE (IOFF, PINPRR_OUT   (:, :, 1))
+CALL REPLICATE (IOFF, PEVAP_OUT    (:, :, :, 1))
+CALL REPLICATE (IOFF, PINPRS_OUT   (:, :, 1))
+CALL REPLICATE (IOFF, PINPRG_OUT   (:, :, 1))
+CALL REPLICATE (IOFF, ZINDEP_OUT   (:, :, 1))
+CALL REPLICATE (IOFF, ZRAINFR_OUT  (:, :, :, 1))
+CALL REPLICATE (IOFF, PFPR_OUT     (:, :, :, :, 1))
+
+
+CALL NPROMIZE (NPROMA, LLMICRO     ,  LLMICRO_B       )
+CALL NPROMIZE (NPROMA, PEXNREF     ,  PEXNREF_B       )
+CALL NPROMIZE (NPROMA, PDZZ        ,  PDZZ_B          )
+CALL NPROMIZE (NPROMA, PRHODJ      ,  PRHODJ_B        )
+CALL NPROMIZE (NPROMA, PRHODREF    ,  PRHODREF_B      )
+CALL NPROMIZE (NPROMA, PEXNREF2    ,  PEXNREF2_B      )
+CALL NPROMIZE (NPROMA, PPABSM      ,  PPABSM_B        )
+CALL NPROMIZE (NPROMA, PCIT        ,  PCIT_B          )
+CALL NPROMIZE (NPROMA, PCLDFR      ,  PCLDFR_B        )
+CALL NPROMIZE (NPROMA, PHLC_HRC    ,  PHLC_HRC_B      )
+CALL NPROMIZE (NPROMA, PHLC_HCF    ,  PHLC_HCF_B      )
+CALL NPROMIZE (NPROMA, PHLI_HRI    ,  PHLI_HRI_B      )
+CALL NPROMIZE (NPROMA, PHLI_HCF    ,  PHLI_HCF_B      )
+CALL NPROMIZE (NPROMA, PTHT        ,  PTHT_B          )
+CALL NPROMIZE (NPROMA, PRT         ,  PRT_B           )
+CALL NPROMIZE (NPROMA, PTHS        ,  PTHS_B          )
+CALL NPROMIZE (NPROMA, PRS         ,  PRS_B           )
+CALL NPROMIZE (NPROMA, PSIGS       ,  PSIGS_B         )
+CALL NPROMIZE (NPROMA, PSEA        ,  PSEA_B          )
+CALL NPROMIZE (NPROMA, PTOWN       ,  PTOWN_B         )
+CALL NPROMIZE (NPROMA, PCIT_OUT    ,  PCIT_OUT_B      )
+CALL NPROMIZE (NPROMA, PRS_OUT     ,  PRS_OUT_B       )
+CALL NPROMIZE (NPROMA, ZINPRC_OUT  ,  ZINPRC_OUT_B    )
+CALL NPROMIZE (NPROMA, PINPRR_OUT  ,  PINPRR_OUT_B    )
+CALL NPROMIZE (NPROMA, PEVAP_OUT   ,  PEVAP_OUT_B     )
+CALL NPROMIZE (NPROMA, PINPRS_OUT  ,  PINPRS_OUT_B    )
+CALL NPROMIZE (NPROMA, PINPRG_OUT  ,  PINPRG_OUT_B    )
+CALL NPROMIZE (NPROMA, ZINDEP_OUT  ,  ZINDEP_OUT_B    )
+CALL NPROMIZE (NPROMA, ZRAINFR_OUT ,  ZRAINFR_OUT_B   )
+CALL NPROMIZE (NPROMA, PFPR_OUT    ,  PFPR_OUT_B      )
+
+
+END SUBROUTINE 
+
+SUBROUTINE REPLICATE4 (KOFF, P)
+
+INTEGER :: KOFF
+REAL    :: P (:,:,:,:)
+
+INTEGER :: I, J
+
+DO I = KOFF+1, SIZE (P, 1)
+  J = 1 + MODULO (I - 1, KOFF)
+  P (I, :, :, :) = P (J, :, :, :)
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE REPLICATE3 (KOFF, P)
+
+INTEGER :: KOFF
+REAL    :: P (:,:,:)
+
+INTEGER :: I, J
+
+DO I = KOFF+1, SIZE (P, 1)
+  J = 1 + MODULO (I - 1, KOFF)
+  P (I, :, :) = P (J, :, :)
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE REPLICATE2 (KOFF, P)
+
+INTEGER :: KOFF
+REAL    :: P (:,:)
+
+INTEGER :: I, J
+
+DO I = KOFF+1, SIZE (P, 1)
+  J = 1 + MODULO (I - 1, KOFF)
+  P (I, :) = P (J, :)
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE REPLICATEL (KOFF, L)
+
+INTEGER :: KOFF
+LOGICAL :: L (:,:,:)
+
+INTEGER :: I, J
+
+DO I = KOFF+1, SIZE (L, 1)
+  J = 1 + MODULO (I - 1, KOFF)
+  L (I, :, :) = L (J, :, :)
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE NPROMIZE3 (KPROMA, PI, PO)
+
+INTEGER :: KPROMA
+REAL, INTENT (IN)  :: PI (:,:,:) 
+REAL, INTENT (OUT) :: PO (:,:,:)
+
+INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA
+
+IF (SIZE (PI, 3) /= 1) STOP 1
+
+IGPTOT = SIZE (PI, 1)
+IGPBLK = 1 + (IGPTOT-1) / KPROMA
+
+DO IGP = 1, IGPTOT, KPROMA
+  IBL = 1 + (IGP - 1) / KPROMA
+  JIDIA = 1
+  JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA)
+
+  DO JLON = JIDIA, JFDIA
+    PO (JLON, :, IBL) = PI (IGP + (JLON - 1), :, 1)
+  ENDDO
+
+  DO JLON = JFDIA+1, KPROMA
+    PO (JLON, :, IBL) = PO (JFDIA, :, IBL)
+  ENDDO
+
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE NPROMIZE4 (KPROMA, PI, PO)
+
+INTEGER :: KPROMA
+REAL, INTENT (IN)  :: PI (:,:,:,:) 
+REAL, INTENT (OUT) :: PO (:,:,:,:)
+
+INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA
+
+IF (SIZE (PI, 4) /= 1) STOP 1
+
+IGPTOT = SIZE (PI, 1)
+IGPBLK = 1 + (IGPTOT-1) / KPROMA
+
+DO IGP = 1, IGPTOT, KPROMA
+  IBL = 1 + (IGP - 1) / KPROMA
+  JIDIA = 1
+  JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA)
+
+  DO JLON = JIDIA, JFDIA
+    PO (JLON, :, :, IBL) = PI (IGP + (JLON - 1), :, :, 1)
+  ENDDO
+
+  DO JLON = JFDIA+1, KPROMA
+    PO (JLON, :, :, IBL) = PO (JFDIA, :, :, IBL)
+  ENDDO
+
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE NPROMIZE5 (KPROMA, PI, PO)
+
+INTEGER :: KPROMA
+REAL, INTENT (IN)  :: PI (:,:,:,:,:) 
+REAL, INTENT (OUT) :: PO (:,:,:,:,:)
+
+INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA
+
+IF (SIZE (PI, 5) /= 1) STOP 1
+
+IGPTOT = SIZE (PI, 1)
+IGPBLK = 1 + (IGPTOT-1) / KPROMA
+
+DO IGP = 1, IGPTOT, KPROMA
+  IBL = 1 + (IGP - 1) / KPROMA
+  JIDIA = 1
+  JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA)
+
+  DO JLON = JIDIA, JFDIA
+    PO (JLON, :, :, :, IBL) = PI (IGP + (JLON - 1), :, :, :, 1)
+  ENDDO
+
+  DO JLON = JFDIA+1, KPROMA
+    PO (JLON, :, :, :, IBL) = PI (JFDIA, :, :, :, IBL)
+  ENDDO
+
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE NPROMIZEL (KPROMA, LI, LO)
+
+INTEGER :: KPROMA
+LOGICAL, INTENT (IN)  :: LI (:,:,:,:) 
+LOGICAL, INTENT (OUT) :: LO (:,:,:,:)
+
+INTEGER :: I, J, IGPBLK, IGPTOT, IGP, JLON, JIDIA, JFDIA
+
+IF (SIZE (LI, 4) /= 1) STOP 1
+
+IGPTOT = SIZE (LI, 1)
+IGPBLK = 1 + (IGPTOT-1) / KPROMA
+
+DO IGP = 1, IGPTOT, KPROMA
+  IBL = 1 + (IGP - 1) / KPROMA
+  JIDIA = 1
+  JFDIA = MIN (KPROMA, IGPTOT - (IBL - 1) * KPROMA)
+
+  DO JLON = JIDIA, JFDIA
+    LO (JLON, :, :, IBL) = LI (IGP + (JLON - 1), :, :, 1)
+  ENDDO
+
+  DO JLON = JFDIA+1, KPROMA
+    LO (JLON, :, :, IBL) = LI (JFDIA, :, :, IBL)
+  ENDDO
+
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE INTERPOLATE4 (KFLEVG, KOFF, P)
+
+INTEGER :: KFLEVG, KOFF
+REAL, ALLOCATABLE :: P (:,:,:,:)
+REAL :: Z (LBOUND (P, 1):UBOUND (P, 1), &
+         & LBOUND (P, 2):UBOUND (P, 2), &
+         & LBOUND (P, 3):UBOUND (P, 3), &
+         & LBOUND (P, 4):UBOUND (P, 4))
+INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2
+REAL :: ZWA, ZWB, ZLEV1, ZLEV2
+
+Z = P
+
+NLEV1 = SIZE (P, 3)
+NLEV2 = KFLEVG
+
+DEALLOCATE (P)
+
+ALLOCATE (P (LBOUND (Z, 1):UBOUND (Z, 1), &
+           & LBOUND (Z, 2):UBOUND (Z, 2), &
+           & KFLEVG, &
+           & LBOUND (Z, 4):UBOUND (Z, 4)))
+
+DO ILEV2 = 1, NLEV2
+  ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1)
+  ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1)
+  ILEV1B = MIN (CEILING (ZLEV1), NLEV1)
+  ILEV1A = MAX (FLOOR   (ZLEV1),     1)
+
+  IF (ILEV1A == ILEV1B) THEN
+    ZWA = 1.
+    ZWB = 0.
+  ELSE
+    ZWA = REAL (ILEV1B) - ZLEV1
+    ZWB = ZLEV1 - REAL (ILEV1A)
+  ENDIF
+
+! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') &
+!   & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB
+
+  P (1:KOFF, :, ILEV2, :) = ZWA * Z (1:KOFF, :, ILEV1A, :) + ZWB * Z (1:KOFF, :, ILEV1B, :) 
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE INTERPOLATE5 (KFLEVG, KOFF, P)
+
+INTEGER :: KFLEVG, KOFF
+REAL, ALLOCATABLE :: P (:,:,:,:,:)
+REAL :: Z (LBOUND (P, 1):UBOUND (P, 1), &
+         & LBOUND (P, 2):UBOUND (P, 2), &
+         & LBOUND (P, 3):UBOUND (P, 3), &
+         & LBOUND (P, 4):UBOUND (P, 4), &
+         & LBOUND (P, 5):UBOUND (P, 5))
+INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2
+REAL :: ZWA, ZWB, ZLEV1, ZLEV2
+
+Z = P
+
+NLEV1 = SIZE (P, 3)
+NLEV2 = KFLEVG
+
+DEALLOCATE (P)
+
+ALLOCATE (P (LBOUND (Z, 1):UBOUND (Z, 1), &
+           & LBOUND (Z, 2):UBOUND (Z, 2), &
+           & KFLEVG, &
+           & LBOUND (Z, 4):UBOUND (Z, 4), &
+           & LBOUND (Z, 5):UBOUND (Z, 5)))
+
+DO ILEV2 = 1, NLEV2
+  ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1)
+  ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1)
+  ILEV1B = MIN (CEILING (ZLEV1), NLEV1)
+  ILEV1A = MAX (FLOOR   (ZLEV1),     1)
+
+  IF (ILEV1A == ILEV1B) THEN
+    ZWA = 1.
+    ZWB = 0.
+  ELSE
+    ZWA = REAL (ILEV1B) - ZLEV1
+    ZWB = ZLEV1 - REAL (ILEV1A)
+  ENDIF
+
+! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') &
+!   & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB
+
+  P (1:KOFF, :, ILEV2, :, :) = ZWA * Z (1:KOFF, :, ILEV1A, :, :) + ZWB * Z (1:KOFF, :, ILEV1B, :, :) 
+ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE INTERPOLATEL (KFLEVG, KOFF, L)
+
+INTEGER :: KFLEVG, KOFF
+LOGICAL, ALLOCATABLE :: L (:,:,:,:)
+LOGICAL :: Z (LBOUND (L, 1):UBOUND (L, 1), &
+            & LBOUND (L, 2):UBOUND (L, 2), &
+            & LBOUND (L, 3):UBOUND (L, 3), &
+            & LBOUND (L, 4):UBOUND (L, 4))
+INTEGER :: ILEV1A, ILEV1B, ILEV2, NLEV1, NLEV2
+REAL :: ZWA, ZWB, ZLEV1, ZLEV2
+
+Z = L
+
+NLEV1 = SIZE (L, 3)
+NLEV2 = KFLEVG
+
+DEALLOCATE (L)
+
+ALLOCATE (L (LBOUND (Z, 1):UBOUND (Z, 1), &
+           & LBOUND (Z, 2):UBOUND (Z, 2), &
+           & KFLEVG, &
+           & LBOUND (Z, 4):UBOUND (Z, 4)))
+
+DO ILEV2 = 1, NLEV2
+  ZLEV2 = REAL (ILEV2 - 1) / REAL (NLEV2 -1)
+  ZLEV1 = 1. + ZLEV2 * REAL (NLEV1 - 1)
+  ILEV1B = MIN (CEILING (ZLEV1), NLEV1)
+  ILEV1A = MAX (FLOOR   (ZLEV1),     1)
+
+  IF (ILEV1A == ILEV1B) THEN
+    ZWA = 1.
+    ZWB = 0.
+  ELSE
+    ZWA = REAL (ILEV1B) - ZLEV1
+    ZWB = ZLEV1 - REAL (ILEV1A)
+  ENDIF
+
+! WRITE (*, '(" ZLEV2 = ",E12.5," ZLEV1 = ",E12.5," ILEV2 = ",I4," ILEV1A = ",I4," ZWA = ",E12.5," ILEV1B = ",I4," ZWB = ",E12.5)') &
+!   & ZLEV2, ZLEV1, ILEV2, ILEV1A, ZWA, ILEV1B, ZWB
+
+  L (1:KOFF, :, ILEV2, :) = ZWA * MERGE(1., 0., Z (1:KOFF, :, ILEV1A, :)) + ZWB * MERGE(1., 0., Z (1:KOFF, :, ILEV1B, :)) >= 0.5
+ENDDO
+
+END SUBROUTINE
+
+
+SUBROUTINE SET3 (P)
+
+REAL :: P (:,:,:)
+INTEGER :: IBL, IGPBLKS
+INTEGER :: NTID, ITID, JBLK1, JBLK2
+
+
+IGPBLKS = SIZE (P, 3)
+
+!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID)
+NTID = OMP_GET_MAX_THREADS ()
+ITID = OMP_GET_THREAD_NUM ()
+JBLK1 = 1 +  (IGPBLKS * (ITID+0)) / NTID
+JBLK2 =      (IGPBLKS * (ITID+1)) / NTID
+
+DO IBL = JBLK1, JBLK2
+  P (:,:,IBL) = ZNAN
+ENDDO
+
+!$OMP END PARALLEL
+
+END SUBROUTINE
+
+SUBROUTINE SET4 (P)
+
+REAL :: P (:,:,:,:)
+INTEGER :: IBL, IGPBLKS
+INTEGER :: NTID, ITID, JBLK1, JBLK2
+
+IGPBLKS = SIZE (P, 4)
+
+!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID)
+NTID = OMP_GET_MAX_THREADS ()
+ITID = OMP_GET_THREAD_NUM ()
+JBLK1 = 1 +  (IGPBLKS * (ITID+0)) / NTID
+JBLK2 =      (IGPBLKS * (ITID+1)) / NTID
+
+DO IBL = JBLK1, JBLK2
+  P (:,:,:,IBL) = ZNAN
+ENDDO
+
+!$OMP END PARALLEL
+
+END SUBROUTINE
+
+SUBROUTINE SET5 (P)
+
+REAL :: P (:,:,:,:,:)
+INTEGER :: IBL, IGPBLKS
+INTEGER :: NTID, ITID, JBLK1, JBLK2
+
+IGPBLKS = SIZE (P, 5)
+
+!$OMP PARALLEL PRIVATE (ITID, JBLK1, JBLK2, NTID)
+NTID = OMP_GET_MAX_THREADS ()
+ITID = OMP_GET_THREAD_NUM ()
+JBLK1 = 1 +  (IGPBLKS * (ITID+0)) / NTID
+JBLK2 =      (IGPBLKS * (ITID+1)) / NTID
+
+DO IBL = JBLK1, JBLK2
+  P (:,:,:,:,IBL) = ZNAN
+ENDDO
+
+!$OMP END PARALLEL
+
+END SUBROUTINE
+
+
+END  MODULE
diff --git a/src/testprogs/rain_ice/main_rain_ice.F90 b/src/testprogs/rain_ice/main_rain_ice.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6b167802ea347a377df6cf0bb000c57ddbc6a2d0
--- /dev/null
+++ b/src/testprogs/rain_ice/main_rain_ice.F90
@@ -0,0 +1,507 @@
+PROGRAM MAIN_RAIN_ICE
+
+USE XRD_GETOPTIONS
+USE GETDATA_RAIN_ICE_MOD
+USE MODD_CONF
+USE MODD_DIMPHYEX,   ONLY: DIMPHYEX_t
+USE MODD_CST,        ONLY: CST_t, CST
+USE MODD_RAIN_ICE_DESCR, ONLY : RAIN_ICE_DESCR
+USE MODD_RAIN_ICE_PARAM, ONLY : RAIN_ICE_PARAM
+USE MODD_PARAM_ICE,      ONLY: PARAM_ICE
+USE MODI_RAIN_ICE
+USE MODI_INI_CST
+USE MODD_BUDGET, ONLY: TBUDGETDATA, NBUDGET_RH, TBUCONF
+USE STACK_MOD
+USE OMP_LIB
+USE YOMHOOK, ONLY : LHOOK, DR_HOOK
+USE PARKIND1, ONLY : JPRB, JPIM
+
+
+IMPLICIT NONE
+
+INTEGER      :: KLON 
+INTEGER      :: KLEV
+INTEGER      :: KRR
+
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:,:) :: PRS, PRS_OUT
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:,:) :: PFPR, PFPR_OUT
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:,:) :: PRT   
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PDZZ     
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PRHODJ  
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PRHODREF
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PEXNREF 
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PEXNREF2
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PPABSM  
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PHLC_HRC
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PHLC_HCF
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PHLI_HRI
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PHLI_HCF
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PTHT    
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PSIGS   
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PCLDFR  
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PTHS    
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PEVAP, PEVAP_OUT
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: PCIT, PCIT_OUT
+REAL,    ALLOCATABLE, DIMENSION(:,:,:)     :: PSEA  
+REAL,    ALLOCATABLE, DIMENSION(:,:,:)     :: PTOWN  
+REAL,    ALLOCATABLE, DIMENSION(:,:,:)     :: PINPRR, PINPRR_OUT
+REAL,    ALLOCATABLE, DIMENSION(:,:,:)     :: PINPRS, PINPRS_OUT
+REAL,    ALLOCATABLE, DIMENSION(:,:,:)     :: PINPRG, PINPRG_OUT
+REAL,    ALLOCATABLE, DIMENSION(:,:,:)     :: ZINDEP, ZINDEP_OUT
+REAL,    ALLOCATABLE, DIMENSION(:,:,:,:)   :: ZRAINFR, ZRAINFR_OUT
+REAL,    ALLOCATABLE, DIMENSION(:,:,:)     :: ZINPRC, ZINPRC_OUT
+LOGICAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: LLMICRO 
+
+INTEGER :: NPROMA, NGPBLKS, NFLEVG
+INTEGER :: IBL, JLON, JLEV
+
+TYPE(DIMPHYEX_t)         :: D, D0
+CHARACTER (LEN=4)   :: CSUBG_AUCV_RC
+CHARACTER (LEN=80)  :: CSUBG_AUCV_RI
+LOGICAL             :: OSEDIC 
+CHARACTER (LEN=4)   :: CSEDIM  
+CHARACTER (LEN=4)   :: CMICRO  
+REAL                :: PTSTEP 
+LOGICAL :: OWARM 
+LOGICAL :: OCND2 
+LOGICAL :: LCRIAUTI
+REAL :: ZCRIAUTI, ZT0CRIAUTI, ZCRIAUTC
+TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RH) :: YLBUDGET
+LOGICAL                  :: LLCHECK
+LOGICAL                  :: LLCHECKDIFF
+LOGICAL                  :: LLDIFF
+INTEGER                  :: IBLOCK1, IBLOCK2
+INTEGER                  :: ISTSZ, JBLK1, JBLK2
+INTEGER                  :: NTID, ITID
+INTEGER                  :: JRR
+
+
+INTEGER :: IPROMA
+REAL, ALLOCATABLE :: PSTACK(:,:)
+TYPE (STACK) :: YLSTACK
+
+REAL(KIND=8) :: TS,TE
+REAL(KIND=8) :: TSC, TEC, TSD, TED, ZTC, ZTD 
+INTEGER :: ITIME, NTIME
+INTEGER :: IRANK, ISIZE
+LOGICAL :: LLVERBOSE, LLSTAT, LLBIND
+REAL (KIND=JPRB) :: ZHOOK_HANDLE
+CHARACTER(LEN=32) :: CLTEXT
+
+CALL INITOPTIONS ()
+NGPBLKS = 150
+CALL GETOPTION ("--blocks", NGPBLKS)
+NPROMA = 32
+CALL GETOPTION ("--nproma", NPROMA)
+NFLEVG = -1
+CALL GETOPTION ("--nflevg", NFLEVG)
+CALL GETOPTION ("--check",  LLCHECK)
+CALL GETOPTION ("--checkdiff",  LLCHECKDIFF)
+IBLOCK1 = 1
+CALL GETOPTION ("--check-block-1", IBLOCK1)
+IBLOCK2 = NGPBLKS
+CALL GETOPTION ("--check-block-2", IBLOCK2)
+CALL GETOPTION ("--stat", LLSTAT)
+NTIME = 1
+CALL GETOPTION ("--times", NTIME)
+CALL GETOPTION ("--verbose", LLVERBOSE)
+CALL GETOPTION ("--bind", LLBIND)
+CALL CHECKOPTIONS ()
+
+LLDIFF = .FALSE.
+
+IRANK = 0
+ISIZE = 1
+IF (LLBIND) THEN
+  CALL LINUX_BIND      (IRANK, ISIZE)
+  CALL LINUX_BIND_DUMP (IRANK, ISIZE)
+ENDIF
+
+CALL GETDATA_RAIN_ICE (NPROMA, NGPBLKS, NFLEVG, LLMICRO, PEXNREF, PDZZ, PRHODJ, PRHODREF, &
+&PEXNREF2, PPABSM, PCIT, PCLDFR, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, PTHT, PRT, PTHS, &
+&PRS, PSIGS, PSEA, PTOWN, PCIT_OUT, PRS_OUT, ZINPRC, ZINPRC_OUT, PINPRR, PINPRR_OUT, PEVAP, PEVAP_OUT, &
+&PINPRS, PINPRS_OUT, PINPRG, PINPRG_OUT, ZINDEP, ZINDEP_OUT, ZRAINFR, ZRAINFR_OUT, PFPR, PFPR_OUT, LLVERBOSE)
+
+KLEV = SIZE (PRS, 3)
+KRR  = SIZE (PRS, 4)
+
+IF (LLVERBOSE) PRINT *, " KLEV = ", KLEV, " KRR = ", KRR
+
+PRINT *, " NPROMA = ", NPROMA, " KLEV = ", KLEV, " NGPBLKS = ", NGPBLKS
+
+CMICRO='ICE3'
+
+PTSTEP = 25.0000000000000
+KRR = 6
+OSEDIC = .TRUE.
+OCND2 = .FALSE.
+CSEDIM = 'STAT'
+CSUBG_AUCV_RC = 'PDF'
+CSUBG_AUCV_RI = 'NONE'
+OWARM = .TRUE.
+
+LCRIAUTI=.TRUE.
+ZCRIAUTI=0.2E-3
+ZT0CRIAUTI=-5.
+ZCRIAUTC=0.1E-2
+
+CALL INIT_PHYEX (20, OWARM, CMICRO, CSEDIM, &
+            & LCRIAUTI, ZCRIAUTI, ZT0CRIAUTI, ZCRIAUTC)
+DO JRR=1, NBUDGET_RH
+  YLBUDGET(JRR)%NBUDGET=JRR
+ENDDO
+
+D0%NIT  = NPROMA
+D0%NIB  = 1
+D0%NIE  = NPROMA
+D0%NJT  = 1
+D0%NJB  = 1
+D0%NJE  = 1
+D0%NKL  = -1
+D0%NKT  = KLEV
+D0%NKA  = KLEV
+D0%NKU  = 1
+D0%NKB  = KLEV 
+D0%NKE  = 1
+D0%NKTB = 1
+D0%NKTE = KLEV
+
+ISTSZ = NPROMA * 20 * KLEV
+ALLOCATE (PSTACK (ISTSZ, NGPBLKS))
+
+TS = OMP_GET_WTIME ()
+
+ZTD = 0.
+ZTC = 0.
+
+IF (LHOOK) CALL DR_HOOK ('MAIN',0,ZHOOK_HANDLE)
+
+DO ITIME = 1, NTIME
+
+  TSD = OMP_GET_WTIME ()
+
+!directives pas a jour !$acc data &
+!directives pas a jour !$acc      & copyin  (D0, CST, ICEP, NEB, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3, HBUNAME, OSUBG_COND, OSIGMAS, OCND2, HSUBG_MF_PDF, PTSTEP, LMFCONV, &
+!directives pas a jour !$acc      &          ZSIGQSAT, PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABSM, ZZZ, PCF_MF, PRC_MF, PRI_MF, ZRS, ZICE_CLD_WGT) &
+!directives pas a jour !$acc      & copy    (PRS, PTHS), &
+!directives pas a jour !$acc      & copyout (PSRCS, PCLDFR, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF) &
+!directives pas a jour !$acc      & create  (PSTACK) 
+
+  TSC = OMP_GET_WTIME ()
+
+#ifdef USE_OPENMP
+!$OMP PARALLEL PRIVATE (D, ITID, JBLK1, JBLK2, IPROMA, ISIZE)
+#endif
+
+#ifdef _OPENACC
+JBLK1 = 1 
+JBLK2 = NGPBLKS
+#endif
+
+#ifdef USE_OPENMP
+NTID = OMP_GET_MAX_THREADS ()
+ITID = OMP_GET_THREAD_NUM ()
+JBLK1 = 1 +  (NGPBLKS * (ITID+0)) / NTID
+JBLK2 =      (NGPBLKS * (ITID+1)) / NTID
+
+
+!PRINT *, ITID, JBLK1, JBLK2
+
+#endif
+
+!$acc parallel loop gang vector private (YLSTACK, IBL, JLON, D) collapse (2)
+
+  DO IBL = JBLK1, JBLK2
+
+
+#ifdef _OPENACC
+  DO JLON = 1, NPROMA
+    D = D0
+    D%NIB = JLON
+    D%NIE = JLON
+#endif
+
+#ifdef USE_OPENMP
+    D = D0
+#endif
+
+#ifdef USE_STACK
+    YLSTACK%L = LOC (PSTACK (1, IBL))
+    YLSTACK%U = YLSTACK%L + ISTSZ * KIND (PSTACK)
+#else
+    YLSTACK%L = 0
+    YLSTACK%U = 0
+#endif
+
+IPROMA=COUNT(LLMICRO(D%NIB:D%NIE,D%NJB:D%NJE,D%NKTB:D%NKTE,IBL))
+ISIZE=IPROMA
+CALL RAIN_ICE (D, CST, PARAM_ICE, RAIN_ICE_PARAM, &
+             & RAIN_ICE_DESCR, TBUCONF, &
+             & IPROMA, ISIZE, &
+             & OSEDIC=OSEDIC, OCND2=OCND2, HSEDIM=CSEDIM, &
+             & HSUBG_AUCV_RC=CSUBG_AUCV_RC, HSUBG_AUCV_RI=CSUBG_AUCV_RI,&
+             & OWARM=OWARM, &
+             & PTSTEP=2*PTSTEP, &
+             & KRR=KRR, ODMICRO=LLMICRO(:,:,:,IBL), PEXN=PEXNREF(:,:,:,IBL),            &
+             & PDZZ=PDZZ(:,:,:,IBL), PRHODJ=PRHODJ(:,:,:,IBL), PRHODREF=PRHODREF(:,:,:,IBL),PEXNREF=PEXNREF2(:,:,:,IBL),&
+             & PPABST=PPABSM(:,:,:,IBL), PCIT=PCIT(:,:,:,IBL), PCLDFR=PCLDFR(:,:,:,IBL),  &
+             & PHLC_HRC=PHLC_HRC(:,:,:,IBL), PHLC_HCF=PHLC_HCF(:,:,:,IBL), &
+             & PHLI_HRI=PHLI_HRI(:,:,:,IBL), PHLI_HCF=PHLI_HCF(:,:,:,IBL), &
+             & PTHT=PTHT,PRVT=PRT(:,:,:,1,IBL),PRCT=PRT(:,:,:,2,IBL), &
+             & PRRT=PRT(:,:,:,3,IBL), &
+             & PRIT=PRT(:,:,:,4,IBL), PRST=PRT(:,:,:,5,IBL), &
+             & PRGT=PRT(:,:,:,6,IBL),       &
+             & PTHS=PTHS(:,:,:,IBL), PRVS=PRS(:,:,:,1,IBL),PRCS=PRS(:,:,:,2,IBL),&
+             & PRRS=PRS(:,:,:,3,IBL),&
+             & PRIS=PRS(:,:,:,4,IBL),PRSS= PRS(:,:,:,5,IBL),PRGS= PRS(:,:,:,6,IBL),&
+             & PINPRC=ZINPRC(:,:,IBL),PINPRR=PINPRR(:,:,IBL),PEVAP3D=PEVAP(:,:,:,IBL),&
+             & PINPRS=PINPRS(:,:,IBL), PINPRG=PINPRG(:,:,IBL), PINDEP=ZINDEP(:,:,IBL), PRAINFR=ZRAINFR(:,:,:,IBL), &
+             & PSIGS=PSIGS(:,:,:,IBL), &
+             & TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET), &
+             & PSEA=PSEA, PTOWN=PTOWN, PFPR=PFPR(:,:,:,:,IBL))
+
+#ifdef _OPENACC
+    ENDDO
+#endif
+
+  ENDDO
+
+#ifdef USE_OPENMP
+!$OMP END PARALLEL
+#endif
+
+!$acc end parallel loop
+
+  TEC = OMP_GET_WTIME ()
+
+!$acc end data
+
+  TED = OMP_GET_WTIME ()
+
+  ZTC = ZTC + (TEC - TSC)
+  ZTD = ZTD + (TED - TSD)
+
+ENDDO
+
+IF (LHOOK) CALL DR_HOOK ('MAIN',1,ZHOOK_HANDLE)
+
+TE = OMP_GET_WTIME()
+
+WRITE (*,'(A,F8.2,A)') 'elapsed time : ',TE-TS,' s'
+WRITE (*,'(A,F8.4,A)') '          i.e. ',1000.*(TE-TS)/(NPROMA*NGPBLKS)/NTIME,' ms/gp'
+
+PRINT *, " ZTD = ", ZTD, ZTD / REAL (NPROMA*NGPBLKS*NTIME)
+PRINT *, " ZTC = ", ZTC, ZTC / REAL (NPROMA*NGPBLKS*NTIME)
+
+
+IF (LLCHECK .OR. LLSTAT .OR. LLCHECKDIFF) THEN
+  DO IBL = IBLOCK1, IBLOCK2
+    PRINT *, " IBL = ", IBL
+    DO JRR=1, KRR
+      WRITE (CLTEXT, '("PRS JRR=",I3.3)') JRR
+      CALL DIFF3 (CLTEXT,      PRS_OUT       (:,:,:,JRR,IBL), PRS      (:,:,:,JRR,IBL))
+      IF(JRR>=2) THEN
+        WRITE (CLTEXT, '("PFPR JRR=",I3.3)') JRR
+        CALL DIFF3 (CLTEXT,     PFPR_OUT      (:,:,:,JRR,IBL), PFPR     (:,:,:,JRR,IBL))
+      ENDIF
+    ENDDO
+    CALL DIFF3 ("PCIT",     PCIT_OUT      (:,:,:,IBL), PCIT     (:,:,:,IBL))
+    CALL DIFF2 ("ZINPRC",   ZINPRC_OUT    (:,:,IBL),   ZINPRC   (:,:,IBL))
+    CALL DIFF2 ("PINPRRRS", PINPRR_OUT    (:,:,IBL),   PINPRR   (:,:,IBL))
+    CALL DIFF3 ("PEVAP",    PEVAP_OUT     (:,:,:,IBL), PEVAP    (:,:,:,IBL))
+    CALL DIFF2 ("PINPRS",   PINPRS_OUT    (:,:,IBL),   PINPRS   (:,:,IBL))
+    CALL DIFF2 ("PINPRG",   PINPRG_OUT    (:,:,IBL),   PINPRG   (:,:,IBL))
+    CALL DIFF2 ("ZINDEP",   ZINDEP_OUT    (:,:,IBL),   ZINDEP   (:,:,IBL))
+    CALL DIFF3 ("ZRAINFR",  ZRAINFR_OUT   (:,:,:,IBL), ZRAINFR  (:,:,:,IBL))
+  ENDDO
+ENDIF
+
+IF (LLCHECKDIFF) THEN
+  IF (LLDIFF) THEN
+    PRINT*, "THERE ARE DIFF SOMEWHERE"
+  ELSE
+    PRINT*, "THERE IS NO DIFF AT ALL"
+  ENDIF
+ENDIF
+
+STOP
+
+CONTAINS
+
+SUBROUTINE DIFF3 (CDNAME, PREF, POUT)
+
+CHARACTER (LEN=*) :: CDNAME
+REAL :: PREF (:,:,:)
+REAL :: POUT (:,:,:)
+
+INTEGER :: JLON, JLEV
+
+PRINT *, CDNAME
+IF (LLSTAT) THEN
+  PRINT *, MINVAL (PREF), MAXVAL (PREF), SUM (PREF) / SIZE (PREF)
+  PRINT *, MINVAL (POUT), MAXVAL (POUT), SUM (POUT) / SIZE (POUT)
+ENDIF
+
+IF (LLCHECK) THEN
+  IF (SUM (ABS (POUT) + ABS (PREF)) > 0) THEN
+  WRITE (*, '(A4)', ADVANCE='NO') ""
+  DO JLON = 1, NPROMA
+    WRITE (*, '("|",I12,A12)', ADVANCE='NO') JLON, ""
+  ENDDO
+  WRITE (*, '("|")')
+  DO JLEV = 1, KLEV
+    WRITE (*, '(I4)', ADVANCE='NO') JLEV
+    DO JLON = 1, NPROMA
+      IF (ABS (PREF (JLON, 1, JLEV)) + ABS (POUT (JLON, 1, JLEV)) == 0.) THEN
+      WRITE (*, '("|",2A12)', ADVANCE='NO') "", ""
+      ELSE
+      WRITE (*, '("|",2E12.5)', ADVANCE='NO') PREF (JLON, 1, JLEV), POUT (JLON, 1, JLEV)
+      ENDIF
+    ENDDO
+    WRITE (*, '("|")')
+  ENDDO
+  ENDIF
+ENDIF
+
+IF (LLCHECKDIFF) THEN
+  IF (SUM(ABS(POUT-PREF)) > 0.) THEN
+    PRINT*, "THERE ARE DIFF"
+    LLDIFF = .TRUE.
+  ELSE
+    PRINT*, "THERE IS NO DIFF"
+  ENDIF
+ENDIF
+
+END SUBROUTINE
+
+SUBROUTINE DIFF2 (CDNAME, PREF, POUT)
+
+CHARACTER (LEN=*) :: CDNAME
+REAL :: PREF (:,:)
+REAL :: POUT (:,:)
+
+INTEGER :: JLON
+
+PRINT *, CDNAME
+IF (LLSTAT) THEN
+  PRINT *, MINVAL (PREF), MAXVAL (PREF), SUM (PREF) / SIZE (PREF)
+  PRINT *, MINVAL (POUT), MAXVAL (POUT), SUM (POUT) / SIZE (POUT)
+ENDIF
+
+IF (LLCHECK) THEN
+  IF (SUM (ABS (POUT) + ABS (PREF)) > 0) THEN
+  WRITE (*, '(A4)', ADVANCE='NO') ""
+  DO JLON = 1, NPROMA
+    WRITE (*, '("|",I12,A12)', ADVANCE='NO') JLON, ""
+  ENDDO
+  WRITE (*, '("|")')
+  WRITE (*, '(I4)', ADVANCE='NO') 0
+  DO JLON = 1, NPROMA
+    IF (ABS (PREF (JLON, 1)) + ABS (POUT (JLON, 1)) == 0.) THEN
+    WRITE (*, '("|",2A12)', ADVANCE='NO') "", ""
+    ELSE
+    WRITE (*, '("|",2E12.5)', ADVANCE='NO') PREF (JLON, 1), POUT (JLON, 1)
+    ENDIF
+  ENDDO
+  WRITE (*, '("|")')
+  ENDIF
+ENDIF
+
+IF (LLCHECKDIFF) THEN
+  IF (SUM(ABS(POUT-PREF)) > 0.) THEN
+    PRINT*, "THERE ARE DIFF"
+    LLDIFF = .TRUE.
+  ELSE
+    PRINT*, "THERE IS NO DIFF"
+  ENDIF
+ENDIF
+
+END SUBROUTINE
+
+
+SUBROUTINE INIT_PHYEX(KULOUT,LDWARM,CMICRO,CCSEDIM,LDCRIAUTI,&
+                   PCRIAUTI,PT0CRIAUTI,PCRIAUTC)
+
+USE MODD_RAIN_ICE_DESCR
+USE MODD_RAIN_ICE_PARAM
+USE MODD_PARAM_ICE
+USE MODD_TURB_N, ONLY: TURB_GOTO_MODEL, CSUBG_MF_PDF
+
+USE MODD_REF
+USE MODI_INI_RAIN_ICE
+
+IMPLICIT NONE
+! -----------------------------------------------------------------------
+!     DUMMY INTEGER SCALARS
+INTEGER, INTENT (IN) :: KULOUT
+LOGICAL, INTENT (IN) :: LDWARM
+CHARACTER(4), INTENT (IN) :: CMICRO 
+CHARACTER(4), INTENT (IN) :: CCSEDIM
+LOGICAL, INTENT (IN) :: LDCRIAUTI
+REAL, INTENT (IN) :: PCRIAUTI
+REAL, INTENT (IN) :: PT0CRIAUTI
+REAL, INTENT (IN) :: PCRIAUTC
+!-----------------------------------------------------------------------
+!    LOCAL VARIABLES
+REAL :: ZCRI0, ZTCRI0    
+! -----------------------------------------------------------------------
+
+CALL INI_CST
+CALL TURB_GOTO_MODEL(1,1)
+CALL PARAM_ICE_ASSOCIATE
+
+!        1. Set implicit default values for MODD_PARAM_ICE
+LWARM=LDWARM
+CPRISTINE_ICE='PLAT'
+CSEDIM=CCSEDIM
+CSUBG_AUCV_RC='PDF'
+CSUBG_AUCV_RI='NONE'
+CSUBG_RC_RR_ACCR='NONE'
+CSUBG_RR_EVAP='NONE'
+CSUBG_PR_PDF='SIGM'
+CSUBG_MF_PDF='TRIANGLE'
+! Snow riming                                                                                                                       
+CSNOWRIMING='M90 '
+XFRACM90=0.1 ! Fraction used for the Murakami 1990 formulation
+!                                                                                                                                   
+LFEEDBACKT=.TRUE. ! When .TRUE. feed back on temperature is taken into account
+LEVLIMIT=.TRUE.   ! When .TRUE. water vapour pressure is limited by saturation
+LNULLWETG=.TRUE.  ! When .TRUE. graupel wet growth is activated with null rate (to allow water shedding)
+LWETGPOST=.TRUE.  ! When .TRUE. graupel wet growth is activated with positive temperature (to allow water shedding)
+LNULLWETH=.TRUE.  ! Same as LNULLWETG but for hail
+LWETHPOST=.TRUE.  ! Same as LWETGPOST but for hail
+LCONVHG=.TRUE. ! TRUE to allow the conversion from hail to graupel
+LCRFLIMIT=.TRUE. !True to limit rain contact freezing to possible heat exchange
+CFRAC_ICE_ADJUST='S' ! Ice/liquid partition rule to use in adjustment
+CFRAC_ICE_SHALLOW_MF='S' ! Ice/liquid partition rule to use in shallow_mf
+LSEDIM_AFTER=.FALSE. ! Sedimentation done after microphysics
+XSPLIT_MAXCFL=0.8
+LDEPOSC=.FALSE.  ! water deposition on vegetation
+XVDEPOSC=0.02    ! deposition speed (2 cm.s-1)
+!
+!        2. Set implicit default values for MODD_RAIN_ICE_DESCR 
+!                     et MODD_RAIN_ICE_PARAM
+XTHVREFZ=300.
+!
+CALL INI_RAIN_ICE (KULOUT, CMICRO)
+!update values from namparar
+IF (LDCRIAUTI) THEN
+
+  XCRIAUTI=PCRIAUTI
+  XCRIAUTC=PCRIAUTC
+  XT0CRIAUTI=PT0CRIAUTI
+  !second point to determine 10**(aT+b) law
+  ZTCRI0=-40.0
+  ZCRI0=1.25E-6
+  
+  XBCRIAUTI=-( LOG10(XCRIAUTI) - LOG10(ZCRI0)*PT0CRIAUTI/ZTCRI0 )&
+                   *ZTCRI0/(XT0CRIAUTI-ZTCRI0)
+  XACRIAUTI=(LOG10(ZCRI0)-XBCRIAUTI)/ZTCRI0
+  
+ENDIF
+! -----------------------------------------------------------------------
+
+END SUBROUTINE INIT_PHYEX
+
+END PROGRAM
+
diff --git a/src/testprogs/support/stack_mod.F90 b/src/testprogs/support/stack_mod.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b02784fb84a2c467b8d521b6a56614f9e4350bda
--- /dev/null
+++ b/src/testprogs/support/stack_mod.F90
@@ -0,0 +1,26 @@
+MODULE STACK_MOD
+
+IMPLICIT NONE
+
+TYPE STACK
+  INTEGER*8 :: L, U
+END TYPE
+
+PRIVATE
+
+PUBLIC :: STACK, SOF
+
+CONTAINS
+
+SUBROUTINE SOF (CDFILE, KLINE)
+!$acc routine (SOF) seq
+
+CHARACTER (LEN=*) :: CDFILE
+INTEGER :: KLINE
+
+PRINT *, 'AT ', CDFILE, ':', KLINE
+STOP 1
+
+END SUBROUTINE
+
+END MODULE
diff --git a/src/testprogs/support/xrd_getoptions.F90 b/src/testprogs/support/xrd_getoptions.F90
new file mode 100644
index 0000000000000000000000000000000000000000..0d726c9c040f3903c84e0bc0491be2612a0c315f
--- /dev/null
+++ b/src/testprogs/support/xrd_getoptions.F90
@@ -0,0 +1,828 @@
+MODULE XRD_GETOPTIONS
+
+!**** *XRD_GETOPTIONS*  - Parse command lines options in long form
+
+!     Author. 
+!     ------- 
+!      Philippe Marguinaud *METEO FRANCE*
+!      Original : 11-09-2012
+
+USE PARKIND1, ONLY: JPIM, JPRB, JPLM
+
+USE XRD_UNIX_ENV, ONLY: XRD_IARGC, XRD_GETARG, &
+  XRD_BASENAME, XRD_COUNTWORDS, XRD_GETENV,    &
+  XRD_ISALPHA, XRD_ISDIGIT, XRD_EXIT
+
+IMPLICIT NONE
+
+INTERFACE GETOPTION
+  MODULE PROCEDURE GETOPTIONS, GETOPTIONSL, &
+                   GETOPTIONI, GETOPTIONIL, &
+                   GETOPTIONR, GETOPTIONRL, &
+                   GETOPTIONB
+                   
+END INTERFACE
+
+!! @TODO : LIST WITH FIXED SIZE
+
+PUBLIC :: GETOPTION, INITOPTIONS, CHECKOPTIONS, ADDGROUP
+
+INTEGER, PARAMETER :: ARGSIZEMAX = 256
+
+CHARACTER(LEN=ARGSIZEMAX), POINTER :: MYARGS(:) => NULL()
+LOGICAL(KIND=JPLM), POINTER :: CHECK_ARGS(:) => NULL()
+LOGICAL(KIND=JPLM) :: LHELP  = .FALSE., LSHELL = .FALSE.
+
+CHARACTER(LEN=1056) :: MESSAGE_OPT = ""
+
+
+TYPE XRD_OPT
+  CHARACTER(LEN=32) :: KEY, TYPE
+  CHARACTER(LEN=1024) :: USE
+  LOGICAL(KIND=JPLM) :: GROUP = .FALSE.
+END TYPE
+
+INTEGER(KIND=JPIM) :: NOPT_SEEN
+TYPE(XRD_OPT), POINTER :: OPT_SEEN(:) => NULL()
+
+PRIVATE
+
+CONTAINS
+
+SUBROUTINE ADDGROUP( USE )
+CHARACTER(LEN=*), INTENT(IN) :: USE
+
+CALL INIT_OPT_SEEN()
+NOPT_SEEN = NOPT_SEEN + 1
+CALL GROW_OPT_SEEN()
+
+OPT_SEEN(NOPT_SEEN)%GROUP = .TRUE.
+OPT_SEEN(NOPT_SEEN)%USE = USE
+
+
+END SUBROUTINE
+
+CHARACTER(LEN=ARGSIZEMAX) FUNCTION GET_ENV_OPT( KEY )
+CHARACTER(LEN=*), INTENT(IN) :: KEY
+CHARACTER(LEN=ARGSIZEMAX) :: KEY_ENV, VAL_ENV
+INTEGER(KIND=JPIM) :: I, N
+CHARACTER :: C
+
+KEY_ENV = KEY(3:)
+
+N = LEN(TRIM(KEY_ENV))
+DO I = 1, N
+  C = KEY_ENV(I:I)
+  IF((.NOT.XRD_ISALPHA(C)) .AND. &
+     (.NOT.XRD_ISDIGIT(C)) .AND. &
+     (C .NE. '_' )) THEN
+    KEY_ENV(I:I) = '_'
+  ENDIF
+ENDDO
+
+VAL_ENV = ""
+CALL XRD_GETENV( 'XRD_OPT_'//TRIM(KEY_ENV), VAL_ENV )
+
+!PRINT *, " KEY = ", TRIM(KEY_ENV), " VAL = ", TRIM(VAL_ENV)
+
+GET_ENV_OPT = VAL_ENV
+
+END FUNCTION
+
+SUBROUTINE MYGETARG( I, S )
+  INTEGER(KIND=JPIM), INTENT(IN)  :: I
+  CHARACTER(LEN=*),      INTENT(OUT) :: S
+!
+  IF( I .LE. UBOUND( MYARGS, 1 ) ) THEN
+    S = MYARGS(I)
+  ELSE
+    S = ""
+   ENDIF
+END SUBROUTINE
+
+INTEGER FUNCTION MYIARGC()
+  INTEGER :: N
+  N = UBOUND( MYARGS, 1 )
+  MYIARGC = N
+END FUNCTION
+
+SUBROUTINE ADDOPT_SHELL( KEY, TYPE, MND, USE )
+  CHARACTER*(*), INTENT(IN) :: KEY, TYPE, USE
+  LOGICAL(KIND=JPLM), INTENT(IN) :: MND
+  OPTIONAL :: USE, MND
+!
+  CHARACTER(LEN=ARGSIZEMAX) :: STR
+  INTEGER :: NN, N, N1, I1, I2, K
+  CHARACTER(LEN=ARGSIZEMAX), POINTER :: MYARGS1(:)
+
+  MYARGS1 => NULL()
+
+  IF( PRESENT( USE ) ) WRITE( *, '("> ",A)' ) TRIM(USE)
+  IF( PRESENT( MND ) ) THEN
+    IF( MND ) WRITE( *, * ) "[MANDATORY]"
+  ENDIF 
+  WRITE( *, * ) "* OPTION: [", TYPE, "]", " ", TRIM(KEY)
+  READ( *, '(A)' ) STR
+
+! PRINT *, "STR = ",TRIM(STR)
+  IF( TRIM(STR) .NE. "" )  THEN
+    IF( TYPE .EQ. 'FLAG' ) THEN
+      NN = 0
+    ELSE
+      NN = XRD_COUNTWORDS( STR )
+    ENDIF
+    N  = UBOUND( MYARGS, 1 )
+    N1 = N + NN + 1
+
+!
+! REALLOC MYARGS
+!
+    ALLOCATE( MYARGS1(0:N1) )
+    MYARGS1(0:N) = MYARGS(0:N)
+    DEALLOCATE( MYARGS )
+    MYARGS => MYARGS1
+    MYARGS(N+1) = KEY
+
+!
+! PARSE ARGUMENT LIST
+!
+    IF( TYPE .NE. 'FLAG' ) THEN
+      K = 1
+      I1 = 1
+      LOOP_I1 : DO 
+        DO
+          IF( I1 .GT. LEN(STR)) EXIT LOOP_I1
+          IF( STR(I1:I1) .NE. ' ' ) EXIT
+          I1 = I1+1
+        ENDDO
+        I2 = I1+1
+        DO
+          IF( I2 .GT. LEN(STR)) EXIT
+          IF( STR(I2:I2) .EQ. ' ' ) EXIT
+          I2 = I2+1
+        ENDDO
+!PRINT *, I1, I2
+        MYARGS(N+1+K) = STR(I1:I2-1)
+!PRINT *, K, TRIM(MYARGS(N+1+K))
+        K = K+1
+        I1 = I2+1
+      ENDDO LOOP_I1
+    ENDIF
+  ENDIF
+
+END SUBROUTINE
+
+SUBROUTINE INIT_OPT_SEEN()
+
+  IF( .NOT. ASSOCIATED( OPT_SEEN ) ) THEN
+    NOPT_SEEN = 0
+    ALLOCATE( OPT_SEEN( 32 ) )
+  ENDIF
+
+END SUBROUTINE
+
+SUBROUTINE GROW_OPT_SEEN()
+  INTEGER(KIND=JPIM) :: N
+  TYPE(XRD_OPT), POINTER :: OPT_SEEN1(:)
+
+  N = SIZE( OPT_SEEN )
+  IF( NOPT_SEEN .GE. N ) THEN ! REALLOC DATA
+    OPT_SEEN1 => OPT_SEEN
+    ALLOCATE( OPT_SEEN( 2 * N ) )
+    OPT_SEEN(1:NOPT_SEEN) = OPT_SEEN1(1:NOPT_SEEN)
+    DEALLOCATE( OPT_SEEN1 )
+  ENDIF
+
+END SUBROUTINE
+
+SUBROUTINE ADDOPT( KEY, TYPE, USE )
+  CHARACTER*(*), INTENT(IN) :: KEY, TYPE, USE
+  OPTIONAL :: USE
+
+  CALL INIT_OPT_SEEN()
+
+  NOPT_SEEN = NOPT_SEEN + 1
+
+  CALL GROW_OPT_SEEN()
+
+  OPT_SEEN(NOPT_SEEN)%KEY  = KEY
+  OPT_SEEN(NOPT_SEEN)%TYPE = TYPE
+
+  IF( PRESENT( USE ) ) THEN
+    OPT_SEEN(NOPT_SEEN)%USE  = USE
+  ELSE
+    OPT_SEEN(NOPT_SEEN)%USE  = ''
+  ENDIF
+
+END SUBROUTINE
+
+SUBROUTINE INITOPTIONS( CDMESSAGE, KOPTMIN, KOPTMAX, CDARGS )
+ CHARACTER(LEN=*),    OPTIONAL, INTENT (IN) :: CDMESSAGE
+ INTEGER (KIND=JPIM), OPTIONAL, INTENT (IN) :: KOPTMIN, KOPTMAX
+ CHARACTER (LEN=*),   OPTIONAL, INTENT (IN) :: CDARGS (0:)
+ INTEGER(KIND=JPIM) :: N, I
+ INTEGER(KIND=JPIM) :: IOPTMIN, IOPTMAX
+ CHARACTER*32 :: STR
+
+ IF (PRESENT (CDARGS)) THEN
+   N = UBOUND (CDARGS, 1)
+ ELSE
+   N = XRD_IARGC()
+ ENDIF
+
+ IOPTMIN = 0
+ IOPTMAX = N
+ IF (PRESENT (KOPTMIN)) IOPTMIN = KOPTMIN
+ IF (PRESENT (KOPTMAX)) IOPTMAX = KOPTMAX
+
+ N = IOPTMAX-IOPTMIN
+
+ ALLOCATE( MYARGS(0:N) )
+ DO I = 0, N
+   IF (PRESENT (CDARGS)) THEN
+     MYARGS(I) = CDARGS (IOPTMIN+I)
+   ELSE
+     CALL XRD_GETARG( IOPTMIN+I, MYARGS(I) )
+   ENDIF
+ ENDDO
+
+ IF( PRESENT( CDMESSAGE ) ) THEN
+  MESSAGE_OPT = CDMESSAGE
+ ELSE
+  MESSAGE_OPT = ""
+ ENDIF
+
+ IF( N .EQ. 1 ) THEN
+   CALL MYGETARG( 1_JPIM, STR )
+   IF( TRIM( STR ) .EQ. '--help' ) THEN
+     LHELP = .TRUE.
+     RETURN
+   ELSE IF( TRIM( STR ) .EQ. '--shell' ) THEN
+     LSHELL = .TRUE.
+     RETURN
+   ENDIF
+ ENDIF
+
+ LHELP = .FALSE.
+ ALLOCATE( CHECK_ARGS( N ) )
+ CHECK_ARGS = .FALSE.
+
+END SUBROUTINE
+
+
+
+SUBROUTINE CHECKOPTIONS()
+ INTEGER(KIND=JPIM) :: I, N, IS, NS, KS
+ CHARACTER(LEN=ARGSIZEMAX) :: OPT, PROG
+ LOGICAL(KIND=JPLM) :: PB
+ CHARACTER(LEN=10) :: FMT
+ CHARACTER(LEN=110) :: BUF
+
+ CALL MYGETARG( 0_JPIM, PROG )
+
+ IF( LHELP ) THEN
+   PRINT *, "PROGRAM: ", TRIM(XRD_BASENAME( PROG ))
+   IF( TRIM(MESSAGE_OPT) .NE. "" ) THEN
+     NS = LEN(MESSAGE_OPT)
+     DO IS = 1, NS / 96
+       KS = LEN( TRIM(MESSAGE_OPT(1+(IS-1)*96:IS*96)) )
+       IF( KS .GT. 0 ) THEN
+         IF( IS .EQ. 1 ) THEN
+           WRITE( *, '("    ")', ADVANCE = 'NO' )
+         ELSE
+           WRITE( *, '("  > ")', ADVANCE = 'NO' )
+         ENDIF
+         WRITE( FMT, '("(A",I2,")")' ) KS
+         WRITE( *, FMT ) TRIM(MESSAGE_OPT(1+(IS-1)*96:IS*96))
+       ENDIF
+     ENDDO
+   ENDIF
+   DO I = 1, NOPT_SEEN
+
+     IF(OPT_SEEN(I)%GROUP) THEN
+       WRITE( *, * ) 
+       IF( TRIM(OPT_SEEN(I)%USE) .NE. "" ) &
+         WRITE( *, * ) '* '//TRIM(OPT_SEEN(I)%USE)
+       CYCLE
+     ENDIF
+
+     BUF = ""
+
+     WRITE( BUF, '(A32," = ",A15)' ) &
+         TRIM(OPT_SEEN(I)%KEY), &
+         TRIM(OPT_SEEN(I)%TYPE)
+
+     IF( TRIM(OPT_SEEN(I)%USE) .NE. '' ) THEN
+       NS = LEN( OPT_SEEN(I)%USE) 
+       DO IS = 1, NS / 48
+         KS = LEN(TRIM(OPT_SEEN(I)%USE(1+(IS-1)*48:IS*48)))
+         IF( KS .GT. 0 ) THEN
+           IF( IS .EQ. 1 ) THEN
+             BUF = TRIM(BUF)//" :   "//TRIM(OPT_SEEN(I)%USE(1+(IS-1)*48:IS*48))
+           ELSE
+!                   000000000011111111112222222222333333333344444444445555555555
+!                   012345678901234567890123456789012345678901234567890123456789
+             BUF = "                                                     > "&
+                   //TRIM(OPT_SEEN(I)%USE(1+(IS-1)*48:IS*48))
+           ENDIF
+           WRITE( *, * ) BUF
+         ENDIF
+       ENDDO
+     ELSE
+       WRITE( *, * ) BUF
+       WRITE( *, * )
+     ENDIF
+
+   ENDDO
+   STOP
+ ELSE IF( ASSOCIATED( CHECK_ARGS ) ) THEN
+   N = SIZE( CHECK_ARGS )
+   PB = .FALSE.
+   DO I = 1, N
+     IF( .NOT. CHECK_ARGS(I) ) THEN
+       CALL MYGETARG( I, OPT )
+       IF( OPT(1:2) .EQ. '--' ) THEN
+         PRINT *, 'INVALID OPTION: ', TRIM(OPT)
+         PB = .TRUE.
+         CHECK_ARGS(I) = .TRUE.
+       ENDIF
+     ENDIF
+   ENDDO
+
+   DO I = 1, N
+     IF( .NOT. CHECK_ARGS(I) ) THEN
+       CALL MYGETARG( I, OPT )
+       PRINT *, 'GARBAGE IN OPTIONS:`', TRIM(OPT), "'"
+       PB = .TRUE.
+       EXIT
+     ENDIF
+   ENDDO
+
+   IF( PB ) CALL XRD_EXIT(1_JPIM)
+
+   DEALLOCATE( CHECK_ARGS )
+ ELSE IF( LSHELL ) THEN
+   OPEN( 77, FILE = TRIM(PROG)//'.sh', FORM = 'FORMATTED' )
+   WRITE( 77, '("#!/bin/sh")' )
+   WRITE( 77, * )
+   WRITE( 77, '(A)', ADVANCE = 'NO' ) TRIM(PROG)
+   N = UBOUND( MYARGS, 1 )
+   DO I = 1, N
+     IF( MYARGS(I) .EQ. '--shell' ) CYCLE
+     IF( MYARGS(I)(1:2) .EQ. '--' ) THEN
+       WRITE( 77, '(" \")' )
+       WRITE( 77, '("    ")', ADVANCE = 'NO' )
+     ENDIF
+     WRITE( 77, '(" ",A)', ADVANCE = 'NO' ) TRIM(MYARGS(I))
+   ENDDO
+   WRITE( 77, * )
+   CLOSE(77)
+ ENDIF
+
+
+
+ IF( ASSOCIATED( OPT_SEEN ) ) DEALLOCATE( OPT_SEEN )
+ IF( ASSOCIATED( MYARGS ) ) DEALLOCATE( MYARGS )
+END SUBROUTINE
+
+
+SUBROUTINE CHECK_MND( KEY, MND, USE )
+ CHARACTER(LEN=*),           INTENT(IN) :: KEY
+ CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
+ LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
+!
+ CHARACTER(LEN=ARGSIZEMAX) :: PROG
+
+ IF( PRESENT( MND ) ) THEN
+   IF( MND ) THEN
+     CALL MYGETARG( 0_JPIM, PROG )
+     WRITE( *, '("PROGRAM: ",(A))' ) TRIM( PROG )
+     WRITE( *, '("ERROR:   OPTION `",(A),"'' IS MANDATORY")' ) TRIM( KEY )
+     IF( PRESENT( USE ) ) WRITE( *, '("         ",(A)," : ",(A))' ) TRIM( KEY ), TRIM( USE )
+     CALL XRD_EXIT(1_JPIM)
+   ENDIF
+ ENDIF
+
+END SUBROUTINE
+
+SUBROUTINE FINDARGINDEX( KEY, I, N )
+ CHARACTER(LEN=*),      INTENT(IN)  :: KEY
+ INTEGER(KIND=JPIM), INTENT(OUT) :: I, N
+ CHARACTER(LEN=ARGSIZEMAX) :: ARG
+
+ N = MYIARGC()
+ DO I = 1, N
+   CALL MYGETARG( I, ARG )
+   IF( TRIM( ARG ) .EQ. TRIM( KEY ) ) RETURN
+ ENDDO
+ I = -1_JPIM
+END SUBROUTINE
+
+SUBROUTINE FINDNEXTARGINDEX( I, J )
+ INTEGER(KIND=JPIM), INTENT(IN)  :: I
+ INTEGER(KIND=JPIM), INTENT(OUT) :: J
+!
+ CHARACTER(LEN=ARGSIZEMAX) :: ARG
+ INTEGER(KIND=JPIM) :: N
+
+ N = MYIARGC()
+ DO J = I+1, N
+  CALL MYGETARG( J, ARG )
+  IF( ARG(1:2) .EQ. '--' ) EXIT
+ ENDDO
+
+END SUBROUTINE
+
+SUBROUTINE GETOPTIONS( KEY, VAL, MND, USE )
+!
+ CHARACTER(LEN=*), INTENT(IN)  :: KEY
+ CHARACTER(LEN=*), INTENT(INOUT) :: VAL
+ LOGICAL(KIND=JPLM), INTENT(IN), OPTIONAL :: MND
+ CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: USE
+!
+ INTEGER(KIND=JPIM) :: I, N
+ CHARACTER(LEN=ARGSIZEMAX) :: ARG
+ LOGICAL(KIND=JPLM) :: LSHELL1
+ LOGICAL(KIND=JPLM) :: FOUND
+
+ LSHELL1 = LSHELL
+
+ IF( LHELP ) THEN
+   CALL ADDOPT( KEY, 'STRING', USE )
+   RETURN
+ ELSE IF( LSHELL ) THEN
+   LSHELL = .FALSE.
+   CALL ADDOPT_SHELL( KEY, 'STRING', MND, USE )
+ ENDIF
+
+ CALL FINDARGINDEX( KEY, I, N )
+
+ FOUND = ( 0 .LT. I ) .AND. ( I .LT. N )
+
+ IF( FOUND ) THEN
+   IF( ASSOCIATED( CHECK_ARGS ) ) THEN
+     CHECK_ARGS(I)   = .TRUE.
+     CHECK_ARGS(I+1) = .TRUE.
+   ENDIF
+   CALL MYGETARG( I+1_JPIM, VAL )
+ ELSE
+   ARG = GET_ENV_OPT( KEY )
+   FOUND = ARG .NE. ""
+   IF( FOUND ) VAL = ARG
+ ENDIF
+
+ IF( .NOT. FOUND ) &
+   CALL CHECK_MND( KEY, MND, USE )
+
+ LSHELL = LSHELL1
+
+END SUBROUTINE
+
+SUBROUTINE GETOPTIONI( KEY, VAL, MND, USE )
+!
+ CHARACTER(LEN=*),      INTENT(IN)  :: KEY
+ INTEGER(KIND=JPIM), INTENT(INOUT) :: VAL
+ LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
+ CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
+!
+ CHARACTER(LEN=ARGSIZEMAX) :: SVAL
+ INTEGER :: ERR
+ LOGICAL(KIND=JPLM) :: LSHELL1
+
+ LSHELL1 = LSHELL
+ 
+ IF( LHELP ) THEN
+   CALL ADDOPT( KEY, 'INTEGER', USE )
+   RETURN
+ ELSE IF( LSHELL ) THEN
+   LSHELL = .FALSE.
+   CALL ADDOPT_SHELL( KEY, 'INTEGER', MND, USE )
+ ENDIF
+ 
+ SVAL = ""
+ CALL GETOPTIONS( KEY, SVAL, MND, USE )
+ IF( TRIM( SVAL ) .NE. "" ) THEN
+   READ( SVAL, *, IOSTAT = ERR ) VAL
+   IF( ERR .NE. 0 ) THEN
+     PRINT *, "ERROR WHILE PARSING OPTION "//TRIM(KEY)
+     CALL XRD_EXIT(1_JPIM)
+   ENDIF
+ ENDIF
+
+ LSHELL = LSHELL1
+
+END SUBROUTINE
+
+SUBROUTINE GETOPTIONR( KEY, VAL, MND, USE )
+!
+ CHARACTER(LEN=*),   INTENT(IN)  :: KEY
+ REAL(KIND=JPRB), INTENT(INOUT) :: VAL
+ LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
+ CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
+!
+ CHARACTER(LEN=ARGSIZEMAX) :: SVAL
+ INTEGER :: ERR
+ LOGICAL(KIND=JPLM) :: LSHELL1
+
+ LSHELL1 = LSHELL
+ 
+ IF( LHELP ) THEN
+   CALL ADDOPT( KEY, 'REAL', USE )
+   RETURN
+ ELSE IF( LSHELL ) THEN
+   LSHELL = .FALSE.
+   CALL ADDOPT_SHELL( KEY, 'REAL', MND, USE )
+ ENDIF
+ 
+ SVAL = ""
+ CALL GETOPTIONS( KEY, SVAL, MND, USE )
+ IF( TRIM( SVAL ) .NE. "" ) THEN
+   READ( SVAL, *, IOSTAT = ERR ) VAL
+   IF( ERR .NE. 0 ) THEN
+     PRINT *, "ERROR WHILE PARSING OPTION "//TRIM(KEY)
+     CALL XRD_EXIT(1_JPIM)
+   ENDIF
+ ENDIF
+
+ LSHELL = LSHELL1
+
+END SUBROUTINE
+
+SUBROUTINE READASLFROMSTRING( VAL, SVAL )
+ CHARACTER(LEN=*), INTENT(OUT) :: VAL(:)
+ CHARACTER(LEN=*), INTENT(IN) :: SVAL
+!
+ INTEGER(KIND=JPIM) :: I, J, K, N
+
+ N = LEN( SVAL )
+
+ I = 1
+ K = 1
+ DO1 : DO 
+   DO
+     IF( I .GT. N ) EXIT DO1
+     IF( SVAL(I:I) .NE. ' ' ) EXIT
+     I = I + 1
+   ENDDO
+   J = I
+   DO
+     IF( J .GT. N ) EXIT 
+     IF( SVAL(J:J) .EQ. ' ' ) EXIT
+     J = J + 1
+   ENDDO
+
+   VAL(K) = SVAL(I:J-1)
+   I = J
+   K = K + 1
+ ENDDO DO1
+
+
+END SUBROUTINE
+
+SUBROUTINE READSLFROMSTRING( VAL, SVAL )
+ CHARACTER(LEN=*), POINTER :: VAL(:)
+ CHARACTER(LEN=*), INTENT(IN) :: SVAL
+!
+ INTEGER(KIND=JPIM) :: N
+
+ N = XRD_COUNTWORDS( SVAL )
+ ALLOCATE( VAL( N ) )
+
+ CALL READASLFROMSTRING( VAL, SVAL )
+
+END SUBROUTINE
+
+SUBROUTINE READSLFROMFILE( VAL, SVAL )
+ CHARACTER(LEN=*), POINTER :: VAL(:)
+ CHARACTER(LEN=*), INTENT(IN) :: SVAL
+!
+ INTEGER(KIND=JPIM) :: K, N
+ INTEGER(KIND=JPIM) :: IOERR
+ CHARACTER(LEN=4096) :: BUFFER
+
+ OPEN( 77, FILE = TRIM(SVAL), FORM = 'FORMATTED', STATUS = 'OLD', IOSTAT = IOERR )
+ IF( IOERR .NE. 0 ) THEN
+   PRINT '( "COULD NOT OPEN ",A, " FOR READING")', TRIM(SVAL)
+   CALL XRD_EXIT(1_JPIM)
+ ENDIF
+ N = 0_JPIM
+ DO 
+   READ( 77, '(A)', END = 500 ) BUFFER
+   N = N + XRD_COUNTWORDS( BUFFER )
+ ENDDO
+
+ 500 CONTINUE
+
+ REWIND( 77 )
+
+ ALLOCATE( VAL( N ) )
+ 
+ K = 1
+ DO 
+   READ( 77, '(A)', END = 600 ) BUFFER
+   N = XRD_COUNTWORDS( BUFFER )
+   CALL READASLFROMSTRING( VAL(K:K+N-1), BUFFER )
+   K = K + N
+ ENDDO
+
+ 600 CONTINUE
+
+
+ CLOSE( 77 )
+ 
+END SUBROUTINE
+
+SUBROUTINE GETOPTIONSL( KEY, VAL, MND, USE )
+!
+ CHARACTER(LEN=*), INTENT(IN) :: KEY
+ CHARACTER(LEN=*), POINTER :: VAL(:)
+ LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
+ CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
+!
+ INTEGER(KIND=JPIM) :: I, J, K, N
+ CHARACTER(LEN=ARGSIZEMAX) :: ARG
+ CHARACTER(LEN=ARGSIZEMAX) :: SVAL
+ LOGICAL(KIND=JPLM) :: LSHELL1
+ LOGICAL(KIND=JPLM) :: FOUND
+
+ LSHELL1 = LSHELL
+ 
+ IF( LHELP ) THEN
+   CALL ADDOPT( KEY, 'STRING-LIST', USE )
+   RETURN
+ ELSE IF( LSHELL ) THEN
+   LSHELL = .FALSE.
+   CALL ADDOPT_SHELL( KEY, 'STRING-LIST', MND, USE )
+ ENDIF
+ 
+ CALL FINDARGINDEX( KEY, I, N )
+
+ FOUND = I >= 0
+
+ IF( FOUND ) THEN
+
+   CALL FINDNEXTARGINDEX( I, J )
+
+   ALLOCATE( VAL( J - I - 1 ) )
+   
+   IF( ASSOCIATED( CHECK_ARGS ) ) &
+     CHECK_ARGS(I) = .TRUE.
+   
+   DO K = I+1, J-1
+     IF( ASSOCIATED( CHECK_ARGS ) ) &
+       CHECK_ARGS(K)   = .TRUE.
+     CALL MYGETARG( K, ARG )
+     IF ((I+1.EQ.J-1) .AND. (ARG(1:7).EQ.'file://')) THEN
+       DEALLOCATE (VAL)
+       ARG = ARG(8:)
+       CALL READSLFROMFILE( VAL, ARG )
+     ELSE
+       VAL(K-I) = ARG
+     ENDIF
+   ENDDO
+
+ ENDIF
+ 
+ IF(.NOT. FOUND) THEN
+   SVAL = GET_ENV_OPT( KEY )
+   FOUND = SVAL .NE. ""
+   IF( FOUND ) &
+     CALL READSLFROMSTRING( VAL, SVAL )
+ ENDIF
+
+ IF( .NOT. FOUND ) &
+   CALL CHECK_MND( KEY, MND, USE )
+
+ LSHELL = LSHELL1
+
+END SUBROUTINE
+
+SUBROUTINE GETOPTIONIL( KEY, VAL, MND, USE )
+!
+ CHARACTER(LEN=*),      INTENT(IN) :: KEY
+ INTEGER(KIND=JPIM), POINTER    :: VAL(:)
+ LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
+ CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
+!
+ CHARACTER(LEN=ARGSIZEMAX), POINTER :: SVAL(:)
+ INTEGER(KIND=JPIM) :: I, N
+ INTEGER :: ERR
+ LOGICAL(KIND=JPLM) :: LSHELL1
+
+ NULLIFY (SVAL)
+
+ LSHELL1 = LSHELL
+
+ IF( LHELP ) THEN
+   CALL ADDOPT( KEY, 'INTEGER-LIST', USE )
+   RETURN
+ ELSE IF( LSHELL ) THEN
+   LSHELL = .FALSE.
+   CALL ADDOPT_SHELL( KEY, 'INTEGER-LIST', MND, USE )
+ ENDIF
+ 
+ CALL GETOPTIONSL( KEY, SVAL, MND, USE )
+
+ IF( .NOT. ASSOCIATED( SVAL ) ) GOTO 999
+
+ N = SIZE( SVAL )
+ ALLOCATE( VAL( N ) )
+ DO I = 1, N
+   READ( SVAL( I ), *, IOSTAT = ERR ) VAL( I )
+   IF( ERR .NE. 0 ) THEN
+     PRINT *, "ERROR WHILE PARSING OPTION "//TRIM(KEY)
+     CALL XRD_EXIT(1_JPIM)
+   ENDIF
+ ENDDO
+
+ DEALLOCATE( SVAL )
+
+999 CONTINUE
+ LSHELL = LSHELL1
+
+END SUBROUTINE
+
+SUBROUTINE GETOPTIONRL( KEY, VAL, MND, USE )
+!
+ CHARACTER(LEN=*),   INTENT(IN) :: KEY
+ REAL(KIND=JPRB), POINTER    :: VAL(:)
+ LOGICAL(KIND=JPLM), OPTIONAL, INTENT(IN) :: MND
+ CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
+!
+ CHARACTER(LEN=ARGSIZEMAX), POINTER :: SVAL(:)
+ INTEGER(KIND=JPIM) :: I, N
+ INTEGER :: ERR
+ LOGICAL(KIND=JPLM) :: LSHELL1
+
+ NULLIFY (SVAL)
+
+ LSHELL1 = LSHELL
+
+ IF( LHELP ) THEN
+   CALL ADDOPT( KEY, 'REAL-LIST', USE )
+   RETURN
+ ELSE IF( LSHELL ) THEN
+   LSHELL = .FALSE.
+   CALL ADDOPT_SHELL( KEY, 'REAL-LIST', MND, USE )
+ ENDIF
+ 
+ CALL GETOPTIONSL( KEY, SVAL, MND, USE )
+
+ IF( .NOT. ASSOCIATED( SVAL ) ) GOTO 999
+
+ N = SIZE( SVAL )
+ ALLOCATE( VAL( N ) )
+ DO I = 1, N
+   READ( SVAL( I ), *, IOSTAT = ERR ) VAL( I )
+   IF( ERR .NE. 0 ) THEN
+     PRINT *, "ERROR WHILE PARSING OPTION "//TRIM(KEY)
+     CALL XRD_EXIT(1_JPIM)
+   ENDIF
+ ENDDO
+
+ DEALLOCATE( SVAL )
+
+999 CONTINUE
+ LSHELL = LSHELL1
+
+END SUBROUTINE
+
+SUBROUTINE GETOPTIONB( KEY, VAL, USE )
+!
+ CHARACTER(LEN=*), INTENT(IN)  :: KEY
+ LOGICAL(KIND=JPLM), INTENT(INOUT) :: VAL
+ CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: USE
+!
+ LOGICAL(KIND=JPLM) :: LSHELL1
+ LOGICAL(KIND=JPLM) :: FOUND
+ CHARACTER(LEN=ARGSIZEMAX) :: SVAL
+ INTEGER(KIND=JPIM) :: I, N
+ 
+ LSHELL1 = LSHELL
+
+ VAL = .FALSE.
+
+ IF( LHELP ) THEN
+   CALL ADDOPT( KEY, 'FLAG', USE )
+   RETURN
+ ELSE IF( LSHELL ) THEN
+   LSHELL = .FALSE.
+   CALL ADDOPT_SHELL( KEY, 'FLAG', .FALSE._JPLM, USE )
+ ENDIF
+ 
+ CALL FINDARGINDEX( KEY, I, N )
+ FOUND = I > 0
+ IF( FOUND .AND. ASSOCIATED( CHECK_ARGS ) ) THEN
+   CHECK_ARGS(I)   = .TRUE.
+   VAL = .TRUE.
+ ELSE
+   SVAL = GET_ENV_OPT( KEY )
+   IF( SVAL .NE. "" ) &
+     READ( SVAL, * ) VAL
+ ENDIF
+
+ LSHELL = LSHELL1
+
+END SUBROUTINE
+
+END MODULE
diff --git a/src/testprogs/support/xrd_unix_env.F90 b/src/testprogs/support/xrd_unix_env.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c689c6255ffed05f25c2f988961d679f3d186476
--- /dev/null
+++ b/src/testprogs/support/xrd_unix_env.F90
@@ -0,0 +1,181 @@
+MODULE XRD_UNIX_ENV
+
+!**** *XRD_UNIX_ENV*  - 
+
+!     Author. 
+!     ------- 
+!      Philippe Marguinaud *METEO FRANCE*
+!      Original : 11-09-2012
+
+USE PARKIND1, ONLY : JPIM, JPRB, JPLM
+IMPLICIT NONE
+
+CONTAINS
+
+SUBROUTINE XRD_GETENV( KEY, VAL )
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: KEY
+  CHARACTER(LEN=*), INTENT(OUT) :: VAL
+
+  CALL GET_ENVIRONMENT_VARIABLE( KEY, VAL )
+END SUBROUTINE
+
+
+FUNCTION XRD_IARGC()
+  IMPLICIT NONE
+  INTEGER(KIND=JPIM) :: XRD_IARGC
+  XRD_IARGC = COMMAND_ARGUMENT_COUNT()
+END FUNCTION
+
+SUBROUTINE XRD_GETARG( KEY, VAL )
+  IMPLICIT NONE
+  INTEGER(KIND=JPIM), INTENT(IN) :: KEY
+  CHARACTER(LEN=*), INTENT(OUT) :: VAL
+  CALL GETARG( INT(KEY,SELECTED_INT_KIND(9)), VAL )
+END SUBROUTINE
+
+SUBROUTINE XRD_EXIT( STATUS )
+  IMPLICIT NONE
+  INTEGER(KIND=JPIM), INTENT(IN) :: STATUS
+  CALL EXIT( INT(STATUS,SELECTED_INT_KIND(9)) )
+END SUBROUTINE
+
+SUBROUTINE XRD_MKDIR( PATH )
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: PATH
+  CALL SYSTEM( "mkdir -p "//TRIM(PATH))
+END SUBROUTINE
+
+CHARACTER*256 FUNCTION XRD_DIRNAME( PATH )
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: PATH
+
+  INTEGER(KIND=JPIM) :: I
+  XRD_DIRNAME = ""
+  I = LEN( TRIM( PATH ) ) - 1
+  DO
+    IF( I .LE. 0 ) RETURN
+    IF( PATH(I:I) .EQ. '/' ) EXIT
+    I = I - 1
+  ENDDO
+  XRD_DIRNAME = PATH(1:I)
+END FUNCTION
+
+FUNCTION XRD_BASENAME( PATH )
+  IMPLICIT NONE
+  CHARACTER*256 :: XRD_BASENAME
+  CHARACTER(LEN=*), INTENT(IN) :: PATH
+
+  INTEGER(KIND=JPIM) :: I
+  XRD_BASENAME = ""
+  I = LEN( TRIM( PATH ) ) - 1
+  DO
+    IF( I .LE. 0 ) THEN
+      I = 0
+      EXIT
+    ENDIF
+    IF( PATH(I:I) .EQ. '/' ) EXIT
+    I = I - 1
+  ENDDO
+  XRD_BASENAME = PATH(I+1:)
+END FUNCTION
+
+ELEMENTAL SUBROUTINE XRD_LOWER_CASE(OUS,INS)
+IMPLICIT NONE
+! CONVERT A WORD TO LOWER CASE
+CHARACTER (LEN=*) , INTENT(OUT) :: OUS
+CHARACTER (LEN=*) , INTENT(IN) :: INS
+INTEGER :: I,IC,NLEN
+NLEN = LEN(INS)
+OUS = ''
+DO I=1,NLEN
+   IC = ICHAR(INS(I:I))
+   IF (IC >= 65 .AND. IC < 90) THEN
+     OUS(I:I) = CHAR(IC+32)
+   ELSE
+     OUS(I:I) = INS(I:I)
+   ENDIF
+END DO
+END SUBROUTINE XRD_LOWER_CASE
+
+FUNCTION XRD_ISALPHA(C)
+IMPLICIT NONE
+LOGICAL(KIND=JPLM) :: XRD_ISALPHA
+CHARACTER, INTENT(IN) :: C
+
+XRD_ISALPHA = ((C.GE.'A').AND.(C.LE.'Z'))&
+            .OR.((C.GE.'a').AND.(C.LE.'z'))
+
+END FUNCTION
+
+FUNCTION XRD_ISDIGIT(C)
+IMPLICIT NONE
+LOGICAL(KIND=JPLM) :: XRD_ISDIGIT
+CHARACTER, INTENT(IN) :: C
+
+XRD_ISDIGIT = (C.GE.'0').AND.(C.LE.'9')
+
+END FUNCTION
+
+SUBROUTINE XRD_DATE_AND_TIME( VL )
+IMPLICIT NONE
+INTEGER(KIND=JPIM), INTENT(OUT) :: VL(8)
+!
+INTEGER :: VLX(8)
+
+  CALL DATE_AND_TIME( VALUES = VLX )
+
+  VL = VLX
+END SUBROUTINE
+
+SUBROUTINE XRD_CPU_TIME( T )
+  IMPLICIT NONE
+  REAL,INTENT(OUT) :: T
+  CALL CPU_TIME( T )
+END SUBROUTINE
+
+SUBROUTINE XRD_COUNTLINES( NLINES, F, ERR )
+IMPLICIT NONE
+INTEGER(KIND=JPIM), INTENT(OUT) :: NLINES
+CHARACTER*(*), INTENT(IN) :: F
+INTEGER(KIND=JPIM), INTENT(OUT) :: ERR
+CHARACTER*32 :: STR
+
+NLINES = 0
+OPEN( 77, FILE = F, ERR = 888 )
+
+DO
+  READ( 77, *, ERR = 888, END = 777 ) STR
+  NLINES = NLINES + 1
+ENDDO
+
+777 CONTINUE
+
+CLOSE( 77 )
+
+RETURN
+888 CONTINUE
+  ERR = 1
+END SUBROUTINE
+
+FUNCTION XRD_COUNTWORDS( S )
+  IMPLICIT NONE
+  INTEGER(KIND=JPIM) :: XRD_COUNTWORDS
+  CHARACTER(LEN=*), INTENT(IN) :: S
+  INTEGER(KIND=JPIM) :: N, I, L
+  LOGICAL(KIND=JPLM) :: IN
+  N = 0_JPIM
+  IN = .FALSE.
+  L = LEN( TRIM( S ) )
+  DO I = 1, L
+    IF( S(I:I) .EQ. ' ' ) THEN
+      IN = .FALSE.
+    ELSE IF( .NOT. IN ) THEN
+      N = N + 1
+      IN = .TRUE.
+    ENDIF
+  ENDDO
+  XRD_COUNTWORDS = N
+END FUNCTION
+
+END MODULE