From febd2b82818b7b87b7beaf51a2660c7cebf54e8d Mon Sep 17 00:00:00 2001
From: Juan Escobar <escj@aero.obs-mip.fr>
Date: Tue, 9 Jul 2019 16:58:15 +0200
Subject: [PATCH] Juan 09/07/2019: for bug in management of XLSZWSM variable ,
 add/use specific 2D TLSFIELD2D_ll pointer , & other minor correction

---
 src/LIB/SURCOUCHE/src/mode_mppdb.f90 |  9 ++-
 src/MNH/budget.f90                   |  6 +-
 src/MNH/initial_guess.f90            |  3 +
 src/MNH/modd_sub_modeln.f90          | 74 ++++++++++++-----------
 src/MNH/modeln.f90                   | 88 +++++++++++++++-------------
 src/MNH/num_diff.f90                 | 14 ++++-
 src/MNH/rain_ice.f90                 |  5 +-
 7 files changed, 112 insertions(+), 87 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_mppdb.f90 b/src/LIB/SURCOUCHE/src/mode_mppdb.f90
index 575fb7b8e..f8990dcc8 100644
--- a/src/LIB/SURCOUCHE/src/mode_mppdb.f90
+++ b/src/LIB/SURCOUCHE/src/mode_mppdb.f90
@@ -14,6 +14,7 @@ MODULE MODE_MPPDB
 !  Philippe Wautelet: 10/01/2019: use NEWUNIT argument of OPEN
 !  Philippe Wautelet: 22/01/2019: use standard FLUSH statement instead of non standard intrinsics
 !  Philippe Wautelet: 22/01/2019: use sleep_c subroutine instead of non-standard call system
+!  Juan Escobar     : 09/07/2019: Bug, in MPPDB_CHECK_SURFEX3D , recompute IKSIZE_ll for local 0 size array
 !
   use ISO_FORTRAN_ENV, only: OUTPUT_UNIT
   use modi_tools_c
@@ -898,7 +899,7 @@ CONTAINS
     USE MODI_GET_SURF_MASK_n
     USE MODD_IO_SURF_MNH, ONLY : NHALO
     USE MODD_CONFZ     , ONLY : MPI_BUFFER_SIZE
-    USE MODD_MPIF      , ONLY : MPI_INTEGER, MPI_STATUS_IGNORE, MPI_SUM
+    USE MODD_MPIF      , ONLY : MPI_INTEGER, MPI_STATUS_IGNORE, MPI_SUM , MPI_MAX
     USE MODD_MNH_SURFEX_n
 !
     IMPLICIT NONE
@@ -917,23 +918,25 @@ CONTAINS
     INTEGER                              :: IIU,IJU,IKU
     INTEGER                              :: KXOR, KYOR, KXEND, KYEND  ! origin and end of the local physical subdomain
     INTEGER                              :: II,IJ,IK
-    INTEGER, ALLOCATABLE, DIMENSION(:)       :: KMASK
+    INTEGER, ALLOCATABLE, DIMENSION(:)   :: KMASK
     INTEGER                              :: KSIZE
     INTEGER                              :: KSIZEBUF
     INTEGER                              :: KSIZE_FULL
     INTEGER                              :: IGLBSIZEPTAB
     INTEGER                              :: INBSLICES
     INTEGER                              :: IINFO_ll
+    INTEGER                              :: IKSIZE_ll
     !
     IF ( ( .NOT. MPPDB_INITIALIZED ) ) RETURN
     CALL MPI_ALLREDUCE(SIZE(PTAB), IGLBSIZEPTAB, 1,MPI_INTEGER, MPI_SUM, MPPDB_INTRA_COMM, IINFO_ll)
     IF ( IGLBSIZEPTAB == 0 ) RETURN
+    CALL MPI_ALLREDUCE(SIZE(PTAB,2),IKSIZE_ll, 1,MPI_INTEGER, MPI_MAX, MPPDB_INTRA_COMM, IINFO_ll)
     !
     IF ( SIZE(PTAB) == 0 ) THEN   !if the local size of the field is 0, we need to define ZFIELD3D filled with default value 1e20
       CALL GET_INDICE_ll( KXOR, KYOR, KXEND, KYEND )
       IIU = KXEND-KXOR+1+2*JPHEXT
       IJU = KYEND-KYOR+1+2*JPHEXT
-      IKU = KZSIZE
+      IKU = IKSIZE_ll
       ALLOCATE(ZFIELD3D(IIU,IJU,IKU))
       ZFIELD3D = 1.E20
     ELSE
diff --git a/src/MNH/budget.f90 b/src/MNH/budget.f90
index a4d5256d2..4bf7527b7 100644
--- a/src/MNH/budget.f90
+++ b/src/MNH/budget.f90
@@ -77,6 +77,7 @@ END MODULE MODI_BUDGET
 !!      V. Masson   06/10/02  add LES budgets
 !!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!!      J.Escobar : 09/07/2019 : for bit reproductiblity use MPPDB_CHECK with PRECISION=0.0 error 
 !!      
 !-------------------------------------------------------------------------------
 !
@@ -119,18 +120,15 @@ INTEGER  :: IRESP   ! Return code of FM-routines
 REAL     :: ZTIME1  ! CPU time counter
 REAL     :: ZTIME2  ! CPU time counter
 !
-REAL     :: XPRECISION ! for reproductibility checks
-
 !-------------------------------------------------------------------------------
 !
 !* Reproductivity checks
 !  Warning: requires an adaptation of the makefile in order to run two runs in
 !  parallel for comparison
 !
-XPRECISION = 1E-10
 IF (LCHECK) THEN
   print*,'BUDGET :',HBUVAR
-  CALL MPPDB_CHECK3D(PVARS,HBUVAR,XPRECISION)
+  CALL MPPDB_CHECK3D(PVARS,HBUVAR,PRECISION)
 END IF
 !
 !
diff --git a/src/MNH/initial_guess.f90 b/src/MNH/initial_guess.f90
index b999796d6..f7d74b647 100644
--- a/src/MNH/initial_guess.f90
+++ b/src/MNH/initial_guess.f90
@@ -144,6 +144,7 @@ END MODULE MODI_INITIAL_GUESS
 !!                  20/05/06                Remove KEPS
 !!                  10/09    (C.Lac)        FIT for variables advected with PPM
 !!                  04/13    (C.Lac)        FIT for all variables 
+!!                  07/19    (J.Escobar)    add reproductiblity test => MPPDB_CHECK( PRRS/RT/RHO )
 !!
 !-------------------------------------------------------------------------------
 !
@@ -158,6 +159,7 @@ USE MODD_BLOWSNOW_n
 !
 USE MODI_SHUMAN
 USE MODI_BUDGET
+USE MODE_MPPDB
 !
 IMPLICIT NONE
 !
@@ -218,6 +220,7 @@ END IF
 DO JRR=1,KRR
   PRRS(:,:,:,JRR) = PRT(:,:,:,JRR) * ZINVTSTEP * PRHODJ(:,:,:) 
 END DO
+CALL MPPDB_CHECK3DM("initial_guess:PRRS/RT/RHO",PRECISION,PRRS(:,:,:,1) , PRT(:,:,:,1) , PRHODJ)
 !
 ! *** passive tracers
 !
diff --git a/src/MNH/modd_sub_modeln.f90 b/src/MNH/modd_sub_modeln.f90
index 48bfede31..121f5d357 100644
--- a/src/MNH/modd_sub_modeln.f90
+++ b/src/MNH/modd_sub_modeln.f90
@@ -7,6 +7,8 @@
 !  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  J. Escobar : 18/06/2018 , bug compile R*4 => real*8 pointer XT_VISC  
 !  P. Wautelet 08/02/2019: add missing NULL association for pointers
+!  J. Escobar : 09/07/2019 , Norme Doctor -> Rename Module Type variable TZ -> T
+!  J. Escobar : 09/07/2019 , for bug in management of XLSZWSM variable , add/use specific 2D TLSFIELD2D_ll pointer
 !-----------------------------------------------------------------
 !     #################
       MODULE MODD_SUB_MODEL_n
@@ -18,19 +20,20 @@ USE MODD_PARAMETERS, ONLY: JPMODELMAX
 IMPLICIT NONE
 
 TYPE SUB_MODEL_t
-  TYPE(LIST_ll), POINTER :: TZFIELDS_ll => NULL(), TZLSFIELD_ll => NULL(), TZFIELDM_ll => NULL()
+  TYPE(LIST_ll), POINTER :: TFIELDS_ll => NULL(), TLSFIELD_ll => NULL(), TFIELDM_ll => NULL()
                        ! list of fields to update halo
-  TYPE(HALO2LIST_ll), POINTER :: TZHALO2M_ll => NULL(), TZLSHALO2_ll => NULL()
+  TYPE(LIST_ll), POINTER :: TLSFIELD2D_ll => NULL()
+  TYPE(HALO2LIST_ll), POINTER :: THALO2M_ll => NULL(), TLSHALO2_ll => NULL()
                        ! list of fields for the halo updates (2nd layer)
   ! halo lists and updates for 4th order schemes
 ! list of fields to update halo at time t
-  TYPE(LIST_ll), POINTER :: TZFIELDT_ll  => NULL() ! for meteorological scalars
-  TYPE(LIST_ll), POINTER :: TZFIELDMT_ll => NULL() ! for momentum
-  TYPE(LIST_ll), POINTER :: TZFIELDSC_ll => NULL() ! for tracer scalars
+  TYPE(LIST_ll), POINTER :: TFIELDT_ll  => NULL() ! for meteorological scalars
+  TYPE(LIST_ll), POINTER :: TFIELDMT_ll => NULL() ! for momentum
+  TYPE(LIST_ll), POINTER :: TFIELDSC_ll => NULL() ! for tracer scalars
 ! list of fields for the halo updates (2nd layer) at time t
-  TYPE(HALO2LIST_ll), POINTER :: TZHALO2T_ll  => NULL()
-  TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll => NULL()
-  TYPE(HALO2LIST_ll), POINTER :: TZHALO2SC_ll => NULL()
+  TYPE(HALO2LIST_ll), POINTER :: THALO2T_ll  => NULL()
+  TYPE(HALO2LIST_ll), POINTER :: THALO2MT_ll => NULL()
+  TYPE(HALO2LIST_ll), POINTER :: THALO2SC_ll => NULL()
   INTEGER :: IBAK, IOUT          ! number of the backup / output
   REAL*8,DIMENSION(2)    :: XT_START
   REAL*8,DIMENSION(2)    :: XT_STORE,XT_BOUND,XT_GUESS
@@ -54,10 +57,11 @@ END TYPE SUB_MODEL_t
 
 TYPE(SUB_MODEL_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: SUB_MODEL_MODEL
 
-TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL(),TZLSFIELD_ll=>NULL(),TZFIELDM_ll=>NULL()
-TYPE(LIST_ll), POINTER :: TZFIELDT_ll=>NULL(),TZFIELDMT_ll=>NULL(),TZFIELDSC_ll=>NULL()
-TYPE(HALO2LIST_ll), POINTER :: TZHALO2M_ll=>NULL(), TZLSHALO2_ll=>NULL()
-TYPE(HALO2LIST_ll), POINTER :: TZHALO2T_ll=>NULL(), TZHALO2MT_ll=>NULL(), TZHALO2SC_ll=>NULL()
+TYPE(LIST_ll), POINTER :: TFIELDS_ll=>NULL(),TLSFIELD_ll=>NULL(),TFIELDM_ll=>NULL()
+TYPE(LIST_ll), POINTER :: TLSFIELD2D_ll => NULL()
+TYPE(LIST_ll), POINTER :: TFIELDT_ll=>NULL(),TFIELDMT_ll=>NULL(),TFIELDSC_ll=>NULL()
+TYPE(HALO2LIST_ll), POINTER :: THALO2M_ll=>NULL(), TLSHALO2_ll=>NULL()
+TYPE(HALO2LIST_ll), POINTER :: THALO2T_ll=>NULL(), THALO2MT_ll=>NULL(), THALO2SC_ll=>NULL()
 INTEGER, POINTER :: IBAK=>NULL()
 INTEGER, POINTER :: IOUT=>NULL()
 REAL*8,DIMENSION(:), POINTER :: XT_START=>NULL()
@@ -83,32 +87,34 @@ SUBROUTINE SUB_MODEL_GOTO_MODEL(KFROM, KTO)
 INTEGER, INTENT(IN) :: KFROM, KTO
 !
 ! Save current state for allocated arrays
-SUB_MODEL_MODEL(KFROM)%TZFIELDS_ll=>TZFIELDS_ll
-SUB_MODEL_MODEL(KFROM)%TZLSFIELD_ll=>TZLSFIELD_ll
-SUB_MODEL_MODEL(KFROM)%TZFIELDM_ll=>TZFIELDM_ll
-SUB_MODEL_MODEL(KFROM)%TZFIELDT_ll=>TZFIELDT_ll
-SUB_MODEL_MODEL(KFROM)%TZFIELDMT_ll=>TZFIELDMT_ll
-SUB_MODEL_MODEL(KFROM)%TZFIELDSC_ll=>TZFIELDSC_ll
-SUB_MODEL_MODEL(KFROM)%TZHALO2M_ll=>TZHALO2M_ll
-SUB_MODEL_MODEL(KFROM)%TZLSHALO2_ll=>TZLSHALO2_ll
-SUB_MODEL_MODEL(KFROM)%TZHALO2T_ll=>TZHALO2T_ll
-SUB_MODEL_MODEL(KFROM)%TZHALO2MT_ll=>TZHALO2MT_ll
-SUB_MODEL_MODEL(KFROM)%TZHALO2SC_ll=>TZHALO2SC_ll
+SUB_MODEL_MODEL(KFROM)%TFIELDS_ll=>TFIELDS_ll
+SUB_MODEL_MODEL(KFROM)%TLSFIELD_ll=>TLSFIELD_ll
+SUB_MODEL_MODEL(KFROM)%TFIELDM_ll=>TFIELDM_ll
+SUB_MODEL_MODEL(KFROM)%TFIELDT_ll=>TFIELDT_ll
+SUB_MODEL_MODEL(KFROM)%TFIELDMT_ll=>TFIELDMT_ll
+SUB_MODEL_MODEL(KFROM)%TLSFIELD2D_ll=>TLSFIELD2D_ll
+SUB_MODEL_MODEL(KFROM)%TFIELDSC_ll=>TFIELDSC_ll
+SUB_MODEL_MODEL(KFROM)%THALO2M_ll=>THALO2M_ll
+SUB_MODEL_MODEL(KFROM)%TLSHALO2_ll=>TLSHALO2_ll
+SUB_MODEL_MODEL(KFROM)%THALO2T_ll=>THALO2T_ll
+SUB_MODEL_MODEL(KFROM)%THALO2MT_ll=>THALO2MT_ll
+SUB_MODEL_MODEL(KFROM)%THALO2SC_ll=>THALO2SC_ll
 SUB_MODEL_MODEL(KFROM)%ZWT_ACT_NUC=>ZWT_ACT_NUC
 SUB_MODEL_MODEL(KFROM)%GMASKkids=>GMASKkids  
 !
 ! Current model is set to model KTO
-TZFIELDS_ll=>SUB_MODEL_MODEL(KTO)%TZFIELDS_ll
-TZLSFIELD_ll=>SUB_MODEL_MODEL(KTO)%TZLSFIELD_ll
-TZFIELDM_ll=>SUB_MODEL_MODEL(KTO)%TZFIELDM_ll
-TZFIELDT_ll=>SUB_MODEL_MODEL(KTO)%TZFIELDT_ll
-TZFIELDMT_ll=>SUB_MODEL_MODEL(KTO)%TZFIELDMT_ll
-TZFIELDSC_ll=>SUB_MODEL_MODEL(KTO)%TZFIELDSC_ll
-TZHALO2M_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2M_ll
-TZLSHALO2_ll=>SUB_MODEL_MODEL(KTO)%TZLSHALO2_ll
-TZHALO2T_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2T_ll
-TZHALO2MT_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2MT_ll
-TZHALO2SC_ll=>SUB_MODEL_MODEL(KTO)%TZHALO2SC_ll
+TFIELDS_ll=>SUB_MODEL_MODEL(KTO)%TFIELDS_ll
+TLSFIELD_ll=>SUB_MODEL_MODEL(KTO)%TLSFIELD_ll
+TFIELDM_ll=>SUB_MODEL_MODEL(KTO)%TFIELDM_ll
+TFIELDT_ll=>SUB_MODEL_MODEL(KTO)%TFIELDT_ll
+TFIELDMT_ll=>SUB_MODEL_MODEL(KTO)%TFIELDMT_ll
+TLSFIELD2D_ll=>SUB_MODEL_MODEL(KTO)%TLSFIELD2D_ll
+TFIELDSC_ll=>SUB_MODEL_MODEL(KTO)%TFIELDSC_ll
+THALO2M_ll=>SUB_MODEL_MODEL(KTO)%THALO2M_ll
+TLSHALO2_ll=>SUB_MODEL_MODEL(KTO)%TLSHALO2_ll
+THALO2T_ll=>SUB_MODEL_MODEL(KTO)%THALO2T_ll
+THALO2MT_ll=>SUB_MODEL_MODEL(KTO)%THALO2MT_ll
+THALO2SC_ll=>SUB_MODEL_MODEL(KTO)%THALO2SC_ll
 IBAK=>SUB_MODEL_MODEL(KTO)%IBAK
 IOUT=>SUB_MODEL_MODEL(KTO)%IOUT
 XT_START=>SUB_MODEL_MODEL(KTO)%XT_START
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 873112354..2e0017c0e 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -255,6 +255,8 @@ END MODULE MODI_MODEL_n
 !                                  to allow to disable writes (for bench purposes)
 !!                   02/2019 C.Lac add rain fraction as an output field
 !!      Bielli S. 02/2019  Sea salt : significant sea wave height influences salt emission; 5 salt modes
+!!  J. Escobar : 09/07/2019 , Norme Doctor -> Rename Module Type variable TZ -> T
+!!  J. Escobar : 09/07/2019 , for bug in management of XLSZWSM variable , add/use specific 2D TLSFIELD2D_ll pointer
 !!-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -623,10 +625,11 @@ END IF
 !
 IF (KTCOUNT == 1) THEN
 !
-  NULLIFY(TZFIELDS_ll,TZLSFIELD_ll,TZFIELDT_ll)
-  NULLIFY(TZHALO2T_ll)
-  NULLIFY(TZLSHALO2_ll)
-  NULLIFY(TZFIELDSC_ll)
+  NULLIFY(TFIELDS_ll,TLSFIELD_ll,TFIELDT_ll)
+  NULLIFY(TLSFIELD2D_ll)
+  NULLIFY(THALO2T_ll)
+  NULLIFY(TLSHALO2_ll)
+  NULLIFY(TFIELDSC_ll)
 !
   ALLOCATE(ZWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3)))
   ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2)))
@@ -647,65 +650,65 @@ IF (KTCOUNT == 1) THEN
 !
 !                 a) Sources terms
 !
-  CALL ADD3DFIELD_ll(TZFIELDS_ll, XRUS)
-  CALL ADD3DFIELD_ll(TZFIELDS_ll, XRVS)
-  CALL ADD3DFIELD_ll(TZFIELDS_ll, XRWS)
-  CALL ADD3DFIELD_ll(TZFIELDS_ll, XRTHS)
-  CALL ADD3DFIELD_ll(TZFIELDS_ll, XRUS_PRES)
-  CALL ADD3DFIELD_ll(TZFIELDS_ll, XRVS_PRES)
-  CALL ADD3DFIELD_ll(TZFIELDS_ll, XRWS_PRES)
-  CALL ADD3DFIELD_ll(TZFIELDS_ll, XRTHS_CLD)
-  IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll(TZFIELDS_ll, XRTKES)
+  CALL ADD3DFIELD_ll(TFIELDS_ll, XRUS)
+  CALL ADD3DFIELD_ll(TFIELDS_ll, XRVS)
+  CALL ADD3DFIELD_ll(TFIELDS_ll, XRWS)
+  CALL ADD3DFIELD_ll(TFIELDS_ll, XRTHS)
+  CALL ADD3DFIELD_ll(TFIELDS_ll, XRUS_PRES)
+  CALL ADD3DFIELD_ll(TFIELDS_ll, XRVS_PRES)
+  CALL ADD3DFIELD_ll(TFIELDS_ll, XRWS_PRES)
+  CALL ADD3DFIELD_ll(TFIELDS_ll, XRTHS_CLD)
+  IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll(TFIELDS_ll, XRTKES)
   DO JRR=1,NRR
-    CALL ADD3DFIELD_ll(TZFIELDS_ll, XRRS(:,:,:,JRR))
-    CALL ADD3DFIELD_ll(TZFIELDS_ll, XRRS_CLD(:,:,:,JRR))
+    CALL ADD3DFIELD_ll(TFIELDS_ll, XRRS(:,:,:,JRR))
+    CALL ADD3DFIELD_ll(TFIELDS_ll, XRRS_CLD(:,:,:,JRR))
   ENDDO
   DO JSV=1,NSV
-    CALL ADD3DFIELD_ll(TZFIELDS_ll, XRSVS(:,:,:,JSV))
-    CALL ADD3DFIELD_ll(TZFIELDS_ll, XRSVS_CLD(:,:,:,JSV))
+    CALL ADD3DFIELD_ll(TFIELDS_ll, XRSVS(:,:,:,JSV))
+    CALL ADD3DFIELD_ll(TFIELDS_ll, XRSVS_CLD(:,:,:,JSV))
   ENDDO
-  IF (SIZE(XSRCT,1) /= 0) CALL ADD3DFIELD_ll(TZFIELDS_ll, XSRCT)
+  IF (SIZE(XSRCT,1) /= 0) CALL ADD3DFIELD_ll(TFIELDS_ll, XSRCT)
   !
   IF ((LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV) ) THEN
   !
   !                 b) LS fields
   !
-    CALL ADD3DFIELD_ll(TZLSFIELD_ll, XLSUM)
-    CALL ADD3DFIELD_ll(TZLSFIELD_ll, XLSVM)
-    CALL ADD3DFIELD_ll(TZLSFIELD_ll, XLSWM)
-    CALL ADD3DFIELD_ll(TZLSFIELD_ll, XLSTHM)
-    CALL ADD2DFIELD_ll(TZLSFIELD_ll, XLSZWSM)
+    CALL ADD3DFIELD_ll(TLSFIELD_ll, XLSUM)
+    CALL ADD3DFIELD_ll(TLSFIELD_ll, XLSVM)
+    CALL ADD3DFIELD_ll(TLSFIELD_ll, XLSWM)
+    CALL ADD3DFIELD_ll(TLSFIELD_ll, XLSTHM)
+    CALL ADD2DFIELD_ll(TLSFIELD2D_ll, XLSZWSM)
     IF (NRR >= 1) THEN
-      CALL ADD3DFIELD_ll(TZLSFIELD_ll, XLSRVM)
+      CALL ADD3DFIELD_ll(TLSFIELD_ll, XLSRVM)
     ENDIF
   !
   !                 c) Fields at t
   !
-    CALL ADD3DFIELD_ll(TZFIELDT_ll, XUT)
-    CALL ADD3DFIELD_ll(TZFIELDT_ll, XVT)
-    CALL ADD3DFIELD_ll(TZFIELDT_ll, XWT)
-    CALL ADD3DFIELD_ll(TZFIELDT_ll, XTHT)
-    IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll(TZFIELDT_ll, XTKET)
+    CALL ADD3DFIELD_ll(TFIELDT_ll, XUT)
+    CALL ADD3DFIELD_ll(TFIELDT_ll, XVT)
+    CALL ADD3DFIELD_ll(TFIELDT_ll, XWT)
+    CALL ADD3DFIELD_ll(TFIELDT_ll, XTHT)
+    IF (SIZE(XRTKES,1) /= 0) CALL ADD3DFIELD_ll(TFIELDT_ll, XTKET)
     DO JRR=1,NRR
-      CALL ADD3DFIELD_ll(TZFIELDT_ll, XRT(:,:,:,JRR))
+      CALL ADD3DFIELD_ll(TFIELDT_ll, XRT(:,:,:,JRR))
     ENDDO
     DO JSV=1,NSV
-      CALL ADD3DFIELD_ll(TZFIELDT_ll, XSVT(:,:,:,JSV))
+      CALL ADD3DFIELD_ll(TFIELDT_ll, XSVT(:,:,:,JSV))
     ENDDO
   !
   !*       1.5   Initialize the list of fields for the halo updates (2nd layer)
   !
     INBVAR = 4+NRR+NSV
     IF (SIZE(XRTKES,1) /= 0) INBVAR=INBVAR+1
-    CALL INIT_HALO2_ll(TZHALO2T_ll,INBVAR,IIU,IJU,IKU)
-    CALL INIT_HALO2_ll(TZLSHALO2_ll,4+MIN(1,NRR),IIU,IJU,IKU)
+    CALL INIT_HALO2_ll(THALO2T_ll,INBVAR,IIU,IJU,IKU)
+    CALL INIT_HALO2_ll(TLSHALO2_ll,4+MIN(1,NRR),IIU,IJU,IKU)
   !
   !*       1.6   Initialise the 2nd layer of the halo of the LS fields
   !
     IF ( LSTEADYLS ) THEN
-       CALL UPDATE_HALO_ll(TZLSFIELD_ll, IINFO_ll)
-       CALL DEL2DFIELD_ll(TZLSFIELD_ll,XLSZWSM,IINFO_ll) 
-       CALL UPDATE_HALO2_ll(TZLSFIELD_ll, TZLSHALO2_ll, IINFO_ll)
+       CALL UPDATE_HALO_ll(TLSFIELD_ll, IINFO_ll)
+       CALL UPDATE_HALO_ll(TLSFIELD2D_ll,IINFO_ll) 
+       CALL UPDATE_HALO2_ll(TLSFIELD_ll, TLSHALO2_ll, IINFO_ll)
     END IF
   END IF
   !
@@ -1227,11 +1230,12 @@ XTIME_LES_BU_PROCESS = 0.
 !
 IF ( LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV ) THEN
 !
-  CALL UPDATE_HALO_ll(TZFIELDT_ll, IINFO_ll)
-  CALL UPDATE_HALO2_ll(TZFIELDT_ll, TZHALO2T_ll, IINFO_ll)
+  CALL UPDATE_HALO_ll(TFIELDT_ll, IINFO_ll)
+  CALL UPDATE_HALO2_ll(TFIELDT_ll, THALO2T_ll, IINFO_ll)
   IF ( .NOT. LSTEADYLS ) THEN
-     CALL UPDATE_HALO_ll(TZLSFIELD_ll, IINFO_ll)
-     CALL UPDATE_HALO2_ll(TZLSFIELD_ll, TZLSHALO2_ll, IINFO_ll)
+     CALL UPDATE_HALO_ll(TLSFIELD_ll, IINFO_ll)
+     CALL UPDATE_HALO_ll(TLSFIELD2D_ll,IINFO_ll) 
+     CALL UPDATE_HALO2_ll(TLSFIELD_ll, TLSHALO2_ll, IINFO_ll)
   END IF
   CALL NUM_DIFF ( CLBCX, CLBCY, NRR, NSV,                               &
                   XDK2U, XDK4U, XDK2TH, XDK4TH, XDK2SV, XDK4SV, IMI,    &
@@ -1239,7 +1243,7 @@ IF ( LNUMDIFU .OR. LNUMDIFTH .OR. LNUMDIFSV ) THEN
                   XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XRHODJ,               &
                   XRUS, XRVS, XRWS, XRTHS, XRTKES, XRRS, XRSVS,         &
                   LZDIFFU,LNUMDIFU, LNUMDIFTH, LNUMDIFSV,               &
-                  TZHALO2T_ll, TZLSHALO2_ll,XZDIFFU_HALO2      )
+                  THALO2T_ll, TLSHALO2_ll,XZDIFFU_HALO2      )
 END IF
 !
 DO JSV = NSV_CHEMBEG,NSV_CHEMEND
@@ -1964,7 +1968,7 @@ END IF
 !
 ZTIME1 = ZTIME2
 !
-CALL EXCHANGE (XTSTEP,NRR,NSV,XRHODJ,TZFIELDS_ll,     &
+CALL EXCHANGE (XTSTEP,NRR,NSV,XRHODJ,TFIELDS_ll,     &
                XRUS, XRVS,XRWS,XRTHS,XRRS,XRTKES,XRSVS)
 !
 CALL SECOND_MNH2(ZTIME2)
diff --git a/src/MNH/num_diff.f90 b/src/MNH/num_diff.f90
index af0265cb6..52e477ac1 100644
--- a/src/MNH/num_diff.f90
+++ b/src/MNH/num_diff.f90
@@ -215,6 +215,7 @@ END MODULE MODI_NUM_DIFF
 !!                 07/09    (C.Lac)        Correction on budget calls
 !!     J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
 !!     J.Escobar : 05/12/2017 : Pb SegFault , correct IF(ONUMDIFTH/OZDIFFU) nesting
+!!     J.Escobar : 09/07/2019 : add TTZHALO2*LIST structure , to match all case of diffusion/U/TH activation T/F
 !!
 !-------------------------------------------------------------------------------
 !
@@ -288,6 +289,7 @@ INTEGER :: IKU
 LOGICAL     :: GTKEALLOC                 ! true if TKE arrays are not zero-sized
 !
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2LIST, TZHALO2LSLIST
+TYPE(HALO2LIST_ll), TARGET  :: TTZHALO2LIST, TTZHALO2LSLIST
 !
 INTEGER :: IGRID ! localisation on the model grid
 !
@@ -305,11 +307,19 @@ GTKEALLOC = SIZE(PTKEM,1) /= 0
 !*       2.     CALL THE NUM_DIFF_ALGO ROUTINE FOR EACH FIELD
 !               ---------------------------------------------
 !
+!
+! Initialized TZHALO2*LIST%NEXT to match all case of diffusion activation T/F
+!
+TTZHALO2LIST%NEXT => TPHALO2LIST
+TTZHALO2LSLIST%NEXT => TPHALO2LSLIST
+TZHALO2LIST => TTZHALO2LIST
+TZHALO2LSLIST => TTZHALO2LSLIST
+!
 IF (ONUMDIFU) THEN
  IGRID = 2
 !!$ IF(NHALO == 1) THEN
-  TZHALO2LIST => TPHALO2LIST
-  TZHALO2LSLIST => TPHALO2LSLIST
+  TZHALO2LIST => TZHALO2LIST%NEXT
+  TZHALO2LSLIST => TZHALO2LSLIST%NEXT
   CALL NUM_DIFF_ALGO(PRUS, PUM, IGRID, MXM(PRHODJ), PDK2U, PDK4U, &
                      PLSUM,TZHALO2LIST%HALO2, TZHALO2LSLIST%HALO2)
 !!$ ELSE
diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90
index 7bffe8cfd..94e8cf0b8 100644
--- a/src/MNH/rain_ice.f90
+++ b/src/MNH/rain_ice.f90
@@ -240,6 +240,7 @@ END MODULE MODI_RAIN_ICE
 !!      J.Escobar : 8/2018 : for real*4 , bis => limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG
 !!      P.Wautelet 01/02/2019: add missing initialization for PFPR
 !!                   02/2019 C.Lac add rain fraction as an output field
+!!      J.Escobar 09/07/2019 : for reproductiblity MPPDB_CHECK , add missing LCHECK test in ZRHODJ de/allocate
 !
 !*       0.    DECLARATIONS
 !              ------------
@@ -615,7 +616,7 @@ IF( IMICRO >= 0 ) THEN
     ALLOCATE(ZZW1(IMICRO,6))
   ENDIF
 !
-  IF (LBU_ENABLE .OR. LLES_CALL) THEN
+  IF (LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) THEN
     ALLOCATE(ZRHODJ(IMICRO))
     ZRHODJ(:) = PACK( PRHODJ(:,:,:),MASK=GMICRO(:,:,:) )
   END IF
@@ -940,7 +941,7 @@ IF( IMICRO >= 0 ) THEN
   DEALLOCATE(ZPRES)
   DEALLOCATE(ZRHODREF)
   DEALLOCATE(ZZT)
-  IF(LBU_ENABLE .OR. LLES_CALL) DEALLOCATE(ZRHODJ)
+  IF(LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) DEALLOCATE(ZRHODJ)
   DEALLOCATE(ZTHS)
   DEALLOCATE(ZTHT)
   DEALLOCATE(ZTHLT)
-- 
GitLab