diff --git a/build/with_fcm/arch/arch-gnu.fcm b/build/with_fcm/arch/arch-gnu.fcm
index f390165536a46d0142ffea354d0595220cfbfa0b..63e0200e1f57dbbf93ba19ca1d9b3462e10919f5 100644
--- a/build/with_fcm/arch/arch-gnu.fcm
+++ b/build/with_fcm/arch/arch-gnu.fcm
@@ -3,12 +3,12 @@ $FCOMPILER     =     gfortran
 $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 -fopenmp
 $PROD_CFLAGS   =     -O3
 $DEV_CFLAGS    =     -O1
-$DEBUG_CFLAGS  =     -check bounds
+$DEBUG_CFLAGS  =     -fbounds-check
 $OMP_FFLAGS    =
 
 # Preprocessor
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/testprogs/ice_adjust/main_ice_adjust.F90 b/src/testprogs/ice_adjust/main_ice_adjust.F90
index 1a074e1f809dc873f6fd03cb9d8c424e38ca46da..02ab5c6efb1cafa34cf2642f830d35afe00bd490 100644
--- a/src/testprogs/ice_adjust/main_ice_adjust.F90
+++ b/src/testprogs/ice_adjust/main_ice_adjust.F90
@@ -19,41 +19,39 @@ USE PARKIND1, ONLY : JPRB, JPIM
 IMPLICIT NONE
 
 INTEGER      :: KLON 
-INTEGER      :: KIDIA  
-INTEGER      :: KFDIA  
-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      :: 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
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..155ac9f3f3397f8c5da6e8b39196d0c177f2ca5c
--- /dev/null
+++ b/src/testprogs/rain_ice/getdata_rain_ice_mod.F90
@@ -0,0 +1,799 @@
+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/",I3.3,".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 = 1
+
+DO IBL = 1, 150
+  WRITE (CLFILE, '("data/",I3.3,".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
index 580e36e5ccea7c3b256f1c93a035440286f1c6cb..6b167802ea347a377df6cf0bb000c57ddbc6a2d0 100644
--- a/src/testprogs/rain_ice/main_rain_ice.F90
+++ b/src/testprogs/rain_ice/main_rain_ice.F90
@@ -1,85 +1,136 @@
 PROGRAM MAIN_RAIN_ICE
 
+USE XRD_GETOPTIONS
+USE GETDATA_RAIN_ICE_MOD
 USE MODD_CONF
-USE MODD_CST, ONLY: 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 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
 
-USE MODI_RAIN_ICE
 
 IMPLICIT NONE
 
-INTEGER   :: KPROMA  
-INTEGER   :: KKA  
-INTEGER   :: KKU  
-INTEGER   :: KKL  
-INTEGER   :: KLON    
-INTEGER   :: KLEV     
-INTEGER   :: KRR      
-INTEGER   :: KDUM
-
+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 
-
-
-REAL,    ALLOCATABLE, DIMENSION(:,:,:) :: PRS, PRS_1
-REAL,    ALLOCATABLE, DIMENSION(:,:,:) :: PFPR, PFPR_1
-REAL,    ALLOCATABLE, DIMENSION(:,:,:) :: PRT   
-REAL,    ALLOCATABLE, DIMENSION(:,:)   :: PDZZ     
-REAL,    ALLOCATABLE, DIMENSION(:,:)   :: PRHODJ  
-REAL,    ALLOCATABLE, DIMENSION(:,:)   :: PRHODREF
-REAL,    ALLOCATABLE, DIMENSION(:,:)   :: PEXNREF 
-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_1
-REAL,    ALLOCATABLE, DIMENSION(:,:)   :: PCIT, PCIT_1
-REAL,    ALLOCATABLE, DIMENSION(:)     :: PSEA  
-REAL,    ALLOCATABLE, DIMENSION(:)     :: PTOWN  
-REAL,    ALLOCATABLE, DIMENSION(:)     :: PINPRR, PINPRR_1
-REAL,    ALLOCATABLE, DIMENSION(:)     :: PINPRS, PINPRS_1
-REAL,    ALLOCATABLE, DIMENSION(:)     :: PINPRG, PINPRG_1
-REAL,    ALLOCATABLE, DIMENSION(:)     :: ZINDEP, ZINDEP_1
-REAL,    ALLOCATABLE, DIMENSION(:,:)   :: ZRAINFR, ZRAINFR_1
-REAL,    ALLOCATABLE, DIMENSION(:)     :: ZINPRC, ZINPRC_1
-LOGICAL, ALLOCATABLE, DIMENSION(:,:) :: LLMICRO 
-
 LOGICAL :: OWARM 
 LOGICAL :: OCND2 
-
-INTEGER :: IFILE
-
 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
 
-TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RH) :: YLBUDGET 
-TYPE(DIMPHYEX_t) :: D
+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)
 
-INTEGER :: IPROMA, ISIZE
-INTEGER :: JLON, JLEV
-
-CHARACTER(LEN=128) :: CLFILE
+KLEV = SIZE (PRS, 3)
+KRR  = SIZE (PRS, 4)
 
+IF (LLVERBOSE) PRINT *, " KLEV = ", KLEV, " KRR = ", KRR
 
+PRINT *, " NPROMA = ", NPROMA, " KLEV = ", KLEV, " NGPBLKS = ", NGPBLKS
 
 CMICRO='ICE3'
 
-CALL GETARG (1, CLFILE)
-
 PTSTEP = 25.0000000000000
 KRR = 6
 OSEDIC = .TRUE.
@@ -96,90 +147,94 @@ 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 ()
 
-IFILE = 77
-OPEN (IFILE, FILE=TRIM (CLFILE), FORM='UNFORMATTED') 
-READ (IFILE) IPROMA, ISIZE
-READ (IFILE) KLON, KDUM, KLEV, KRR
-
-PRINT *, KLON, KDUM, KLEV, KRR
-
-ALLOCATE (PRT       (KLON,KLEV,KRR))
-ALLOCATE (PRS       (KLON,KLEV,KRR), PRS_1  (KLON,KLEV,KRR))
-ALLOCATE (PFPR      (KLON,KLEV,KRR), PFPR_1 (KLON,KLEV,KRR))
-ALLOCATE (PDZZ      (KLON,KLEV))
-ALLOCATE (PRHODJ    (KLON,KLEV))
-ALLOCATE (PRHODREF  (KLON,KLEV))
-ALLOCATE (PEXNREF   (KLON,KLEV))
-ALLOCATE (PPABSM    (KLON,KLEV))
-ALLOCATE (PHLC_HRC  (KLON,KLEV))
-ALLOCATE (PHLC_HCF  (KLON,KLEV))
-ALLOCATE (PHLI_HRI  (KLON,KLEV))
-ALLOCATE (PHLI_HCF  (KLON,KLEV))
-ALLOCATE (PTHT      (KLON,KLEV))
-ALLOCATE (PSIGS     (KLON,KLEV))
-ALLOCATE (PCLDFR    (KLON,KLEV))
-ALLOCATE (PTHS      (KLON,KLEV))
-ALLOCATE (PEVAP     (KLON,KLEV),     PEVAP_1 (KLON,KLEV))
-ALLOCATE (PCIT      (KLON,KLEV),     PCIT_1 (KLON,KLEV))
-ALLOCATE (PSEA      (KLON))
-ALLOCATE (PTOWN     (KLON))
-ALLOCATE (PINPRR    (KLON))
-ALLOCATE (PINPRS    (KLON),          PINPRS_1 (KLON))
-ALLOCATE (PINPRG    (KLON),          PINPRG_1 (KLON))
-ALLOCATE (LLMICRO   (KLON,KLEV))
-ALLOCATE (ZINDEP    (KLON),          ZINDEP_1 (KLON))
-ALLOCATE (ZRAINFR   (KLON,KLEV),     ZRAINFR_1 (KLON,KLEV))
-ALLOCATE (ZINPRC    (KLON),          ZINPRC_1 (KLON))
-
-READ (IFILE) LLMICRO
-READ (IFILE) PEXNREF
-READ (IFILE) PDZZ
-READ (IFILE) PRHODJ
-READ (IFILE) PRHODREF
-READ (IFILE) PEXNREF
-READ (IFILE) PPABSM
-READ (IFILE) PCIT
-READ (IFILE) PCLDFR
-READ (IFILE) PHLC_HRC
-READ (IFILE) PHLC_HCF
-READ (IFILE) PHLI_HRI
-READ (IFILE) PHLI_HCF
-READ (IFILE) PTHT
-READ (IFILE) PRT
-READ (IFILE) PTHS
-READ (IFILE) PRS
-READ (IFILE) PSIGS
-READ (IFILE) PSEA
-READ (IFILE) PTOWN
-
-READ (IFILE) PCIT_1
-READ (IFILE) PRS_1
-READ (IFILE) ZINPRC_1
-READ (IFILE) PINPRR_1
-READ (IFILE) PEVAP_1
-READ (IFILE) PINPRS_1
-READ (IFILE) PINPRG_1
-READ (IFILE) ZINDEP_1
-READ (IFILE) ZRAINFR_1
-READ (IFILE) PFPR_1
-CLOSE (IFILE)
-
-D%NIT  = KLON
-D%NIB  = 1                                                                                                                         
-D%NIE  = KLON
-D%NJT  = 1                                                                                                                         
-D%NJB  = 1                                                                                                                         
-D%NJE  = 1                                                                                                                         
-D%NKL  = -1                                                                                                                        
-D%NKT  = KLEV                                                                                                                      
-D%NKA  = KLEV                                                                                                                      
-D%NKU  = 1                                                                                                                         
-D%NKB  = KLEV                                                                                                                      
-D%NKE  = 1                                                                                                                         
-D%NKTB = 1                                                                                                                         
-D%NKTE = KLEV   
+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, &
@@ -187,35 +242,183 @@ CALL RAIN_ICE (D, CST, PARAM_ICE, RAIN_ICE_PARAM, &
              & HSUBG_AUCV_RC=CSUBG_AUCV_RC, HSUBG_AUCV_RI=CSUBG_AUCV_RI,&
              & OWARM=OWARM, &
              & PTSTEP=2*PTSTEP, &
-             & KRR=KRR, ODMICRO=LLMICRO, PEXN=PEXNREF,            &
-             & PDZZ=PDZZ, PRHODJ=PRHODJ, PRHODREF=PRHODREF,PEXNREF=PEXNREF,&
-             & PPABST=PPABSM, PCIT=PCIT, PCLDFR=PCLDFR,  &
-             & PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, &
-             & PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF, &
-             & PTHT=PTHT,PRVT=PRT(1,1,1),PRCT=PRT(1,1,2), &
-             & PRRT=PRT(1,1,3), &
-             & PRIT=PRT(1,1,4), PRST=PRT(1,1,5), &
-             & PRGT=PRT(1,1,6),       &
-             & PTHS=PTHS, PRVS=PRS(1,1,1),PRCS=PRS(1,1,2),&
-             & PRRS=PRS(1,1,3),&
-             & PRIS=PRS(1,1,4),PRSS= PRS(1,1,5),PRGS= PRS(1,1,6),&
-             & PINPRC=ZINPRC,PINPRR=PINPRR,PEVAP3D=PEVAP,&
-             & PINPRS=PINPRS, PINPRG=PINPRG, PINDEP=ZINDEP, PRAINFR=ZRAINFR, &
-             & PSIGS=PSIGS, &
+             & 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)
+             & PSEA=PSEA, PTOWN=PTOWN, PFPR=PFPR(:,:,:,:,IBL))
+
+#ifdef _OPENACC
+    ENDDO
+#endif
 
-DO JLEV = 1, KLEV
-  WRITE (*, '(I4," | ")', ADVANCE='NO') JLEV
-  DO JLON = 1, KLON
-    WRITE (*, '(E12.5)', ADVANCE='NO') ZRAINFR_1 (JLON, JLEV)
   ENDDO
-  WRITE (*, *)
+
+#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)
 
diff --git a/src/testprogs/ice_adjust/stack_mod.F90 b/src/testprogs/support/stack_mod.F90
similarity index 100%
rename from src/testprogs/ice_adjust/stack_mod.F90
rename to src/testprogs/support/stack_mod.F90