diff --git a/src/ZSOLVER/mode_mppdb.f90 b/src/ZSOLVER/mode_mppdb.f90
deleted file mode 100644
index 3d28a437d09a3bf430adf6b4b82c118dbd7cc320..0000000000000000000000000000000000000000
--- a/src/ZSOLVER/mode_mppdb.f90
+++ /dev/null
@@ -1,2735 +0,0 @@
-!MNH_LIC Copyright 2011-2019 CNRS, Meteo-France and Universite Paul Sabatier
-!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
-!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
-!MNH_LIC for details. version 1.
-!-----------------------------------------------------------------
-!
-#define _COLOR_OUTPUT
-!
-MODULE MODE_MPPDB
-!
-! Modifications:
-!!      J.Escobar 23/10/2012: correct CHECK_LB & format print output
-!!      M.Moge 05/02/2015: MPPDB_CHECK_SURFEX2D and MPPDB_CHECK_SURFEX3D + bug fix in MPPDB_CHECK2D and MPPDB_CHECK3D (call MPI_AllReduce at the beginning)
-!  J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
-!  G.Delautier : 23/06/2016 : surfex v8
-!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
-! P.Wautelet : 25/07/2018: added MPPDB_CHECK1D_LOG, MPPDB_CHECK1D and MPPDB_CHECK3D_LOG
-! P.Wautelet : 12/1/2018: support any array size for MPPDB_CHECK2D + check array size + modified outpout (for simpler grep) + use PRINT_MSG
-!  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
-!  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
-!  P. Wautelet 26/04/2019: use modd_precision parameters for datatypes of MPI communications
-!  J. Escobar  09/07/2019: bug, in MPPDB_CHECK_SURFEX3D, recompute IKSIZE_ll for local 0 size array
-!  J. Escobar  10/10/2022: add MPPDB_CHECK3D_REAL_MG , for MultiGrid check  
-!-----------------------------------------------------------------
-!
-  use ISO_FORTRAN_ENV, only: OUTPUT_UNIT
-
-  use MODE_TOOLS_ll, only: GET_GLOBALDIMS_ll, GET_INDICE_ll
-  use mode_msg
-
-  use modi_tools_c
-
-  IMPLICIT NONE
-
-  INTEGER,            PARAMETER    :: NMAXPAS = 2
-  INTEGER,            PARAMETER    :: NMAXMSGLEN = 256
-  INTEGER,            PARAMETER    :: NTAG = 12345
-
-  INTEGER            ,PARAMETER    :: NSLEEP=30 !Sleep duration to wait for (in seconds)
-  INTEGER            ,PARAMETER    :: chlg=256
-  CHARACTER(LEN=chlg),PARAMETER    :: MPPDB_CONF = "mppdb.nam"
-
-  LOGICAL                          :: MPPDB_INITIALIZED = .FALSE.
-  LOGICAL                          :: MPPDB_DEBUG = .FALSE.
-
-  CHARACTER(LEN=chlg)              :: MPPDB_EXEC  = "PREP_REAL_CASE"
-  CHARACTER(LEN=chlg)              :: MPPDB_HOST  = "localhost"
-  CHARACTER(LEN=chlg)              :: MPPDB_WDIR  = "."
-  INTEGER                          :: MPPDB_NBSON = 1
-
-  INTEGER                          :: MPPDB_INTER_COMM,MPPDB_INTRA_COMM
-  INTEGER                          :: MPPDB_IRANK_WORLD,MPPDB_IRANK_INTRA
-  INTEGER                          :: MPPDB_NBPROC_WORLD,MPPDB_NBPROC_INTRA
-
-  LOGICAL                          :: MPPDB_FATHER_WORLD = .FALSE.
-
-  REAL                             :: PRECISION  = 1e-8 * 0.0 !PW: TODO: remove this variable
-  REAL                             :: XPRECISION = 1e-8 * 0.0
-  LOGICAL                          :: MPPDB_CHECK_LB = .FALSE.
-  LOGICAL                          :: MPPDB_CHECK_LB_CORNERS = .FALSE.
-
-  INTERFACE MPPDB_CHECK
-    MODULE PROCEDURE MPPDB_CHECK1D_INT,MPPDB_CHECK1D_LOG, MPPDB_CHECK1D_REAL, &
-                                                          MPPDB_CHECK2D_REAL, &
-                                       MPPDB_CHECK3D_LOG, MPPDB_CHECK3D_REAL, &
-                                       Mppdb_check4d_real
-  END INTERFACE
-
-  INTERFACE MPPDB_CHECK1D
-    MODULE PROCEDURE MPPDB_CHECK1D_REAL
-  END INTERFACE
-  LOGICAL                          :: MPPDB_ACTIVED  = .FALSE.
-
-  INTERFACE MPPDB_CHECK2D
-    MODULE PROCEDURE MPPDB_CHECK2D_REAL
-  END INTERFACE
-
-  INTERFACE MPPDB_CHECK3D
-    MODULE PROCEDURE MPPDB_CHECK3D_REAL
-  END INTERFACE
-
-  interface mppdb_check4d
-    module procedure mppdb_check4d_real
-  end interface
-
-  INTERFACE
-     SUBROUTINE MPPDB_CHECK3D_REAL_MG(PTAB,MESSAGE,PPRECISION)
-       IMPLICIT NONE
-       !
-       REAL,DIMENSION(:,:,:),INTENT(IN) :: PTAB
-       CHARACTER(LEN=*), INTENT(IN) :: MESSAGE
-       REAL,OPTIONAL,    INTENT(IN) :: PPRECISION
-     END SUBROUTINE MPPDB_CHECK3D_REAL_MG
-  END INTERFACE
-
-  INTERFACE
-     SUBROUTINE MPPDB_CHECK0D_REAL_MG(PTAB,MESSAGE,PPRECISION)
-       IMPLICIT NONE
-       !
-       REAL             ,INTENT(IN) :: PTAB
-       CHARACTER(LEN=*), INTENT(IN) :: MESSAGE
-       REAL,OPTIONAL,    INTENT(IN) :: PPRECISION
-     END SUBROUTINE MPPDB_CHECK0D_REAL_MG
-  END INTERFACE
-  
-  CONTAINS
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-  SUBROUTINE MPPDB_INIT()
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    USE MODD_MPIF
-    !JUANZ
-    USE  MODE_MNH_WORLD , ONLY :  INIT_NMNH_COMM_WORLD
-    USE  MODD_VAR_ll    , ONLY :  NMNH_COMM_WORLD
-    !JUANZ
-
-    IMPLICIT NONE
-
-
-    INTEGER                         :: IUNIT
-    INTEGER                         :: IERR
-!     INTEGER                         :: NBPROC_WORLD,NBPROC_INTRA
-
-    LOGICAL                         :: GISINIT
-    LOGICAL                         :: drapeau
-
-    INTEGER                         :: INFO_SPAWN
-    INTEGER                         :: RANK_FATHER = 0
-    INTEGER,ALLOCATABLE             :: info_error(:)
-    CHARACTER(LEN=40)               :: chaine
-    LOGICAL                         :: isset
-
-
-
-    NAMELIST /NAM_MPPDB/ MPPDB_DEBUG,MPPDB_EXEC,MPPDB_HOST,MPPDB_NBSON,MPPDB_WDIR,MPPDB_CHECK_LB,MPPDB_CHECK_LB_CORNERS
-
-    !NMNH_COMM_WORLD = MPI_COMM_WORLD
-
-    ! If already initialized, nothing to do
-    IF (MPPDB_INITIALIZED) RETURN
-    !
-    MPPDB_INITIALIZED = .TRUE.
-    MPPDB_ACTIVED  = .TRUE.
-    !
-    ! Init MPI
-    !
-    CALL MPI_INITIALIZED(GISINIT, ierr)
-    IF (.NOT. GISINIT) THEN
-       !CALL MPI_INIT(ierr)
-       CALL  INIT_NMNH_COMM_WORLD(ierr)
-    END IF
-    !
-    ! Get me rank in the my world
-    !
-    CALL MPI_COMM_RANK(NMNH_COMM_WORLD, MPPDB_IRANK_WORLD , ierr)
-    CALL MPI_COMM_SIZE(NMNH_COMM_WORLD, MPPDB_NBPROC_WORLD, ierr)
-    !
-    !... Have I a father ?
-    !
-    CALL MPI_COMM_GET_PARENT(MPPDB_INTER_COMM, ierr)
-    IF (MPPDB_INTER_COMM == MPI_COMM_NULL) THEN
-       !
-       ! NO Father !
-       MPPDB_FATHER_WORLD = .TRUE.
-       CALL MPI_BARRIER(NMNH_COMM_WORLD,ierr)
-       !
-       ! if no config file , inactive MPPDB routines
-       !
-       OPEN(newunit=IUNIT,file=MPPDB_CONF,STATUS='OLD',iostat=IERR)
-       IF (IERR.NE.0 ) THEN
-          ! PRINT*,"IOSTAT=",IERR
-          !
-          !no config file => exit from MPPDB not actived
-          !
-          MPPDB_INITIALIZED = .FALSE.
-          RETURN
-       END IF
-       !
-       ! read the parameter
-       !
-       READ(unit=IUNIT,NML=NAM_MPPDB)
-       CLOSE(unit=IUNIT)
-       IF ( .NOT. MPPDB_DEBUG ) THEN
-          ! why don't when MMPDB to work
-          MPPDB_INITIALIZED = .FALSE.
-          RETURN
-       ENDIF
-       !
-       IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          !-------------------------------------------------------------------------!
-          !                                                                         !
-          ! NO Father & rank=0 <=> I'm the root Father so Init all and Clone        !
-          !                                                                         !
-          !-------------------------------------------------------------------------!
-          IF (MPPDB_DEBUG) THEN
-             WRITE(*,NML=NAM_MPPDB)
-          ENDIF
-          !
-          ! Create the info contecte for the son
-          !
-          ! host
-          !
-          CALL MPI_INFO_CREATE (INFO_SPAWN , ierr)
-          !CALL MPI_INFO_SET    (INFO_SPAWN , "host", MPPDB_HOST , ierr)
-          !CALL MPI_INFO_GET    (INFO_SPAWN , "host", 40, chaine, isset ,ierr)
-          !IF (MPPDB_DEBUG) PRINT*,"MPPDB_INIT:: FATHER ::INFO_SPAWN , host=",isset,chaine
-          !IF (ierr.NE.0) STOP 'MPPDB_INIT :: PB MPI_INFO_SET "host" '
-          !
-          ! working directory
-          !
-          CALL MPI_INFO_SET    (INFO_SPAWN , "wdir", MPPDB_WDIR , ierr)
-          CALL MPI_INFO_GET    (INFO_SPAWN , "wdir", 40, chaine, isset ,ierr)
-          IF (MPPDB_DEBUG) PRINT*,"MPPDB_INIT:: FATHER :: INFO_SPAWN , wdir=",isset,chaine
-          if (ierr /= 0 ) call Print_msg( NVERB_FATAL, 'GEN', 'MPPDB_INIT', 'MPI_INFO_SET failed' )
-
-          !
-       ELSE
-          ! other father only do nothing but participate
-          INFO_SPAWN =  MPI_INFO_NULL
-          !
-       END IF !  IF (MPPDB_IRANK_WORLD.EQ.0)
-       !
-       ! clone the son
-       !
-       ALLOCATE(info_error(MPPDB_NBSON))
-       CALL MPI_BARRIER(NMNH_COMM_WORLD,ierr)
-       !
-       CALL MPI_COMM_SPAWN(MPPDB_EXEC, MPI_ARGV_NULL,MPPDB_NBSON,INFO_SPAWN, &
-            RANK_FATHER, NMNH_COMM_WORLD,MPPDB_INTER_COMM ,info_error, ierr)
-       !
-       CALL MPI_BARRIER(NMNH_COMM_WORLD,ierr)
-       !
-       DEALLOCATE(info_error)
-       !
-       ! merge the communicator
-       !
-       drapeau=.FALSE.
-       CALL MPI_INTERCOMM_MERGE(MPPDB_INTER_COMM, drapeau, MPPDB_INTRA_COMM, ierr)
-       !
-       !... Numbre of processus in MPPDB_INTRA_COMM.
-       CALL MPI_COMM_SIZE(MPPDB_INTRA_COMM, mppdb_nbproc_intra, ierr)
-       !
-       !... My rank in MPPDB_INTRA_COMM
-       CALL MPI_COMM_RANK(MPPDB_INTRA_COMM, mppdb_irank_intra, ierr)
-       IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          !  I'm the first father
-       IF (MPPDB_DEBUG) print*,"MPPDB_INIT :: FIRST FATHER mppdb_irank_intra=", mppdb_irank_intra &
-            ,"mppdb_nbproc_intra=",mppdb_nbproc_intra
-       flush(unit=OUTPUT_UNIT)
-       endif
-       !
-       ! Wait the sons
-       !
-       CALL MPI_BARRIER  ( MPPDB_INTRA_COMM , ierr )
-       ! WAIT FOR TOTALVIEW IF NEEDED 
-       call sleep_c(NSLEEP)
-       !
-    ELSE ! (MPPDB_INTER_COMM <> MPI_COMM_NULL)
-       !-------------------------------------------------------------------------!
-       !                                                                         !
-       !  I've a father <=> I'm a son                                            !
-       !                                                                         !
-       !-------------------------------------------------------------------------!
-       !
-       CALL MPI_BARRIER(NMNH_COMM_WORLD,ierr)
-       !
-       ! merge the communicator
-       !
-       drapeau=.TRUE.
-       CALL MPI_INTERCOMM_MERGE(MPPDB_INTER_COMM, drapeau, MPPDB_INTRA_COMM, ierr)
-       !
-       !... Numbre of processus in MPPDB_INTRA_COMM.
-       CALL MPI_COMM_SIZE(MPPDB_INTRA_COMM, mppdb_nbproc_intra, ierr)
-       !
-       !... My rang in MPPDB_INTRA_COMM
-       CALL MPI_COMM_RANK(MPPDB_INTRA_COMM, mppdb_irank_intra, ierr)
-       !
-       !
-       ! Wait the FATHER's
-       !
-       CALL MPI_BARRIER  ( MPPDB_INTRA_COMM , ierr )
-       !
-       ! WAIT FOR TOTALVIEW IF NEEDED 
-       call sleep_c(NSLEEP)
-       !
-       MPPDB_DEBUG = .TRUE.
-       IF (MPPDB_DEBUG) write(200,*) "MPPDB_INIT :: FIRST SON mppdb_irank_intra=", mppdb_irank_intra &
-            ,"MPPDB_IRANK_WORLD=",MPPDB_IRANK_WORLD
-       !
-       IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          !  I'm the first son
-          MPPDB_DEBUG = .TRUE.
-          IF (MPPDB_DEBUG) print*,"MPPDB_INIT :: FIRSTSON mppdb_irank_intra=", mppdb_irank_intra
-       END IF
-    END IF !  IF (MPPDB_INTER_COMM == MPI_COMM_NULL)
-
-    CALL MPI_BARRIER  ( MPPDB_INTRA_COMM , ierr )
-
-#endif
-  END SUBROUTINE MPPDB_INIT
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-  SUBROUTINE MPPDB_START_DEBUG()
-    IMPLICIT NONE
-    MPPDB_ACTIVED = .TRUE.
-  END SUBROUTINE MPPDB_START_DEBUG
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-  SUBROUTINE MPPDB_STOP_DEBUG()
-    IMPLICIT NONE
-    MPPDB_ACTIVED = .FALSE.
-  END SUBROUTINE MPPDB_STOP_DEBUG
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-  SUBROUTINE MPPDB_GET_ACTIVED(OACTIVE)
-    IMPLICIT NONE
-    LOGICAL , INTENT(OUT) :: OACTIVE
-    OACTIVE = MPPDB_ACTIVED 
-  END SUBROUTINE MPPDB_GET_ACTIVED
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-  SUBROUTINE MPPDB_SET_ACTIVED(OACTIVE)
-    IMPLICIT NONE
-    LOGICAL , INTENT(IN) :: OACTIVE
-    MPPDB_ACTIVED = OACTIVE
-  END SUBROUTINE MPPDB_SET_ACTIVED
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
-  SUBROUTINE MPPDB_BARRIER()
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IMPLICIT NONE
-    INTEGER      :: IERR
-    !
-    ! synchronize all father & sons
-    !
-    IF (( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED )) RETURN 
-    !
-    CALL MPI_BARRIER(MPPDB_INTRA_COMM,IERR)
-    !
-#endif
-  END SUBROUTINE MPPDB_BARRIER
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-  SUBROUTINE MPPDB_CHECK1D_INT(KTAB,MESSAGE)
-    !
-    USE MODD_MPIF,      ONLY: MPI_CHARACTER, MPI_STATUS_IGNORE, MPI_SUM, MPI_MAX
-    use modd_precision, only: MNHINT_MPI
-    !
-    USE MODE_DEVICE
-    !
-    IMPLICIT NONE
-    !
-    INTEGER,DIMENSION(:),INTENT(IN) :: KTAB
-    CHARACTER(LEN=*),    INTENT(IN) :: MESSAGE
-    !
-    CHARACTER(len=40)                                  :: YMSG
-    CHARACTER(len=NMAXMSGLEN)                          :: MSG
-    CHARACTER(len=NMAXMSGLEN),DIMENSION(:),ALLOCATABLE :: ALLMSG
-    INTEGER                                            :: IINFO_ll
-    INTEGER                                            :: I_FIRST_FATHER, I_FIRST_SON
-    INTEGER                                            :: IPAS,NPAS,NPAS_ll
-    INTEGER                                            :: IGLBSIZEPTAB
-    INTEGER                                            :: ISIZEOTHER
-    INTEGER,DIMENSION(NMAXPAS)                         :: INUMDIFF
-    LOGICAL                                            :: G_KTAB_ON_DEVICE
-    LOGICAL,DIMENSION(NMAXPAS)                         :: OK
-    INTEGER,DIMENSION(SIZE(KTAB,1))                    :: ITAB, ITAB_SON
-    !
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !get the global size of KTAB
-    CALL MPI_ALLREDUCE(SIZE(KTAB), IGLBSIZEPTAB, 1, MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll)
-    IF ( IGLBSIZEPTAB == 0 ) RETURN
-    !
-    CALL MPPDB_BARRIER()
-    !
-    ALLOCATE(ALLMSG(MPPDB_NBPROC_INTRA))
-    MSG = MESSAGE
-    CALL MPI_ALLGATHER(MSG,LEN(MSG),MPI_CHARACTER,ALLMSG,LEN(MSG),MPI_CHARACTER,MPPDB_INTRA_COMM,IINFO_ll)
-    DO IPAS = 1, MPPDB_NBPROC_INTRA
-      IF ( ALLMSG(IPAS) /= MSG ) &
-        CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK1D_INT','message not similar on all processes (' &
-                       //TRIM(ALLMSG(IPAS))//' vs '//TRIM(MSG)//')')
-    END DO
-    DEALLOCATE(ALLMSG)
-    !
-    !implemented for only 1 process on each side
-    IF (MPPDB_NBPROC_INTRA>2) THEN
-       IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-          CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK1D_INT','only works with 1 process on each side'//MSG)
-       END IF
-       CALL MPPDB_BARRIER()
-       RETURN
-    END IF
-    !
-    CALL GET_FROM_DEVICE(KTAB,ITAB,G_KTAB_ON_DEVICE)
-    !
-    NPAS = 1
-    IF (G_KTAB_ON_DEVICE) NPAS=2
-    CALL MPI_ALLREDUCE(NPAS,NPAS_ll,1,MNHINT_MPI,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll)
-    !
-    IF (NPAS_ll>NMAXPAS) THEN
-      NPAS_ll = NMAXPAS
-      CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK1D_INT','NPAS_ll reduced')
-    END IF
-    !
-    DO IPAS=1,NPAS_ll
-      IF ((IPAS.EQ.2) .AND. G_KTAB_ON_DEVICE ) ITAB = KTAB ! the 2 time test the value on host
-      !
-      IF(MPPDB_FATHER_WORLD) THEN
-        IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          I_FIRST_SON = MPPDB_NBPROC_WORLD
-          CALL MPI_SENDRECV(SIZE(ITAB), 1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-                            ISIZEOTHER ,1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-                            MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-          IF (SIZE(ITAB)==ISIZEOTHER) THEN
-            CALL MPI_RECV(ITAB_SON,SIZE(ITAB_SON),MNHINT_MPI,I_FIRST_SON, &
-                    NTAG,MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-            INUMDIFF(IPAS) = COUNT( ITAB(:)/=ITAB_SON(:) )
-            IF ( INUMDIFF(IPAS)>0 ) THEN
-              OK(IPAS) = .FALSE.
-            ELSE
-              OK(IPAS) = .TRUE.
-            END IF
-          END IF
-        END IF
-      ELSE
-        I_FIRST_FATHER = 0
-        CALL MPI_SENDRECV(SIZE(ITAB),1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-                          ISIZEOTHER,1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-                          MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-        IF (SIZE(ITAB)==ISIZEOTHER) THEN
-          CALL MPI_SEND(ITAB,SIZE(ITAB),MNHINT_MPI,I_FIRST_FATHER, &
-                        NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-        END IF
-      END IF
-      !
-      CALL MPPDB_BARRIER()
-      !
-    END DO
-    !
-    IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-      YMSG=ADJUSTL(MESSAGE)
-      IF (SIZE(ITAB)==ISIZEOTHER) THEN
-        IF (NPAS_ll == 1) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) ) THEN
-            write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                  achar(27)//'[32mMPPDB_CHECK1D :: OK'//achar(27)//'[0m ','',YMSG, INUMDIFF(1),SIZE(KTAB)
-          ELSE
-            write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                achar(27)//'[31mMPPDB_CHECK1D :: KO'//achar(27)//'[0m ','',YMSG, INUMDIFF(1),SIZE(KTAB)
-          END IF
-#else
-          IF ( OK(1) ) THEN
-            write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                  'MPPDB_CHECK1D :: OK','',YMSG, INUMDIFF(1),SIZE(KTAB)
-          ELSE
-            write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                  'MPPDB_CHECK1D :: KO','',YMSG, INUMDIFF(1),SIZE(KTAB)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE IF (NPAS_ll == 2) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  achar(27)//'[32mMPPDB_CHECK1D :: OK on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(KTAB)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  achar(27)//'[31mMPPDB_CHECK1D :: KO on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(KTAB)
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  achar(27)//'[33mMPPDB_CHECK1D :: OK on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(KTAB)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  achar(27)//'[33mMPPDB_CHECK1D :: KO on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(KTAB)
-          END IF
-#else
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  'MPPDB_CHECK1D :: OK on host, OK on device ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(KTAB)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  'MPPDB_CHECK1D :: KO on host, KO on device ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(KTAB)
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  'MPPDB_CHECK1D :: OK on host, KO on device ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(KTAB)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  'MPPDB_CHECK1D :: KO on host, OK on device ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(KTAB)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE
-          CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK1D_INT','NPAS_ll>2 not (yet) implemented')
-        END IF
-      ELSE
-#ifdef _COLOR_OUTPUT
-        WRITE (*,'( A,I10,I10,A40 )') achar(27)//'[31mMPPDB_CHECK1D :: KO: array sizes different on 2 sides'//achar(27)//'[0m ',&
-                                  SIZE(ITAB),ISIZEOTHER,YMSG
-#else
-        WRITE (*,'( A,I10,I10,A40 )') 'MPPDB_CHECK1D :: KO: array sizes different on 2 sides',SIZE(ITAB),ISIZEOTHER,YMSG
-#endif
-      END IF
-    END IF
-#endif
-  END SUBROUTINE MPPDB_CHECK1D_INT
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-  SUBROUTINE MPPDB_CHECK1D_LOG(OTAB,MESSAGE)
-    !
-    USE MODD_MPIF,      ONLY: MPI_CHARACTER, MPI_STATUS_IGNORE, MPI_SUM, MPI_MAX
-    use modd_precision, only: MNHINT_MPI, MNHLOG_MPI
-    !
-    USE MODE_DEVICE
-    !
-    IMPLICIT NONE
-    !
-    LOGICAL,DIMENSION(:),INTENT(IN) :: OTAB
-    CHARACTER(LEN=*),    INTENT(IN) :: MESSAGE
-    !
-    CHARACTER(len=40)                                  :: YMSG
-    CHARACTER(len=NMAXMSGLEN)                          :: MSG
-    CHARACTER(len=NMAXMSGLEN),DIMENSION(:),ALLOCATABLE :: ALLMSG
-    INTEGER                                            :: IINFO_ll
-    INTEGER                                            :: I_FIRST_FATHER, I_FIRST_SON
-    INTEGER                                            :: IPAS,NPAS,NPAS_ll
-    INTEGER                                            :: IGLBSIZEPTAB
-    INTEGER                                            :: ISIZEOTHER
-    INTEGER,DIMENSION(NMAXPAS)                         :: INUMDIFF
-    LOGICAL                                            :: G_OTAB_ON_DEVICE
-    LOGICAL,DIMENSION(NMAXPAS)                         :: OK
-    LOGICAL, DIMENSION(SIZE(OTAB,1))                   :: GTAB, GTAB_SON
-    !
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !get the global size of OTAB
-    CALL MPI_ALLREDUCE(SIZE(OTAB), IGLBSIZEPTAB, 1, MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll)
-    IF ( IGLBSIZEPTAB == 0 ) RETURN
-    !
-    CALL MPPDB_BARRIER()
-    !
-    ALLOCATE(ALLMSG(MPPDB_NBPROC_INTRA))
-    MSG = MESSAGE
-    CALL MPI_ALLGATHER(MSG,LEN(MSG),MPI_CHARACTER,ALLMSG,LEN(MSG),MPI_CHARACTER,MPPDB_INTRA_COMM,IINFO_ll)
-    DO IPAS = 1, MPPDB_NBPROC_INTRA
-      IF ( ALLMSG(IPAS) /= MSG ) &
-        CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK1D_LOG','message not similar on all processes (' &
-                       //TRIM(ALLMSG(IPAS))//' vs '//TRIM(MSG)//')')
-    END DO
-    DEALLOCATE(ALLMSG)
-    !
-    !implemented for only 1 process on each side
-    IF (MPPDB_NBPROC_INTRA>2) THEN
-      IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-         CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK1D_LOG','only works with 1 process on each side'//MSG)
-      END IF
-      CALL MPPDB_BARRIER()
-      RETURN
-    END IF
-    !
-    CALL GET_FROM_DEVICE(OTAB,GTAB,G_OTAB_ON_DEVICE)
-    !
-    NPAS = 1
-    IF (G_OTAB_ON_DEVICE) NPAS=2
-    CALL MPI_ALLREDUCE(NPAS,NPAS_ll,1,MNHINT_MPI,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll)
-    !
-    IF (NPAS_ll>NMAXPAS) THEN
-      NPAS_ll = NMAXPAS
-      CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK1D_LOG','NPAS_ll reduced')
-    END IF
-    !
-    DO IPAS=1,NPAS_ll
-      IF ((IPAS.EQ.2) .AND. G_OTAB_ON_DEVICE ) GTAB = OTAB ! the 2 time test the value on host
-      !
-      IF(MPPDB_FATHER_WORLD) THEN
-        IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          I_FIRST_SON = MPPDB_NBPROC_WORLD
-          CALL MPI_SENDRECV(SIZE(GTAB),1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-                            ISIZEOTHER,1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-                            MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-          IF (SIZE(GTAB)==ISIZEOTHER) THEN
-            CALL MPI_RECV(GTAB_SON,SIZE(GTAB_SON),MNHLOG_MPI,I_FIRST_SON, &
-                    NTAG,MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-            INUMDIFF(IPAS) = COUNT( GTAB(:).NEQV.GTAB_SON(:) )
-            IF ( INUMDIFF(IPAS)>0 ) THEN
-              OK(IPAS) = .FALSE.
-            ELSE
-              OK(IPAS) = .TRUE.
-            END IF
-          END IF
-        END IF
-      ELSE
-        I_FIRST_FATHER = 0
-        CALL MPI_SENDRECV(SIZE(GTAB),1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-                          ISIZEOTHER,1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-                          MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-        IF (SIZE(GTAB)==ISIZEOTHER) THEN
-          CALL MPI_SEND(GTAB,SIZE(GTAB),MNHLOG_MPI,I_FIRST_FATHER, &
-                        NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-        END IF
-      END IF
-      !
-      CALL MPPDB_BARRIER()
-      !
-    END DO
-    !
-    IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-      YMSG=ADJUSTL(MESSAGE)
-      IF (SIZE(GTAB)==ISIZEOTHER) THEN
-        IF (NPAS_ll == 1) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) ) THEN
-            write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                  achar(27)//'[32mMPPDB_CHECK1D :: OK'//achar(27)//'[0m ','',YMSG, INUMDIFF(1),SIZE(OTAB)
-          ELSE
-            write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                achar(27)//'[31mMPPDB_CHECK1D :: KO'//achar(27)//'[0m ','',YMSG, INUMDIFF(1),SIZE(OTAB)
-          END IF
-#else
-          IF ( OK(1) ) THEN
-            write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                  'MPPDB_CHECK1D :: OK','',YMSG, INUMDIFF(1),SIZE(OTAB)
-          ELSE
-            write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                  'MPPDB_CHECK1D :: KO','',YMSG, INUMDIFF(1),SIZE(OTAB)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE IF (NPAS_ll == 2) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  achar(27)//'[32mMPPDB_CHECK1D :: OK on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  achar(27)//'[31mMPPDB_CHECK1D :: KO on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  achar(27)//'[33mMPPDB_CHECK1D :: OK on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  achar(27)//'[33mMPPDB_CHECK1D :: KO on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-          END IF
-#else
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  'MPPDB_CHECK1D :: OK on host, OK on device ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  'MPPDB_CHECK1D :: KO on host, KO on device ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  'MPPDB_CHECK1D :: OK on host, KO on device ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                  'MPPDB_CHECK1D :: KO on host, OK on device ',YMSG, &
-                  INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE
-          CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK1D_LOG','NPAS_ll>2 not (yet) implemented')
-        END IF
-      ELSE
-#ifdef _COLOR_OUTPUT
-        WRITE (*,'( A,I10,I10,A40 )') achar(27)//'[31mMPPDB_CHECK1D :: KO: array sizes different on 2 sides'//achar(27)//'[0m ',&
-                                  SIZE(GTAB),ISIZEOTHER,YMSG
-#else
-        WRITE (*,'( A,I10,I10,A40 )') 'MPPDB_CHECK1D :: KO: array sizes different on 2 sides',SIZE(GTAB),ISIZEOTHER,YMSG
-#endif
-      END IF
-    END IF
-#endif
-  END SUBROUTINE MPPDB_CHECK1D_LOG
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-  SUBROUTINE MPPDB_CHECK1D_REAL(PTAB,MESSAGE,PPRECISION)
-    !
-    USE MODD_MPIF,      ONLY: MPI_CHARACTER, MPI_STATUS_IGNORE, MPI_SUM, MPI_MAX
-    use modd_precision, only: MNHINT_MPI, MNHREAL_MPI
-    !
-    USE MODE_DEVICE
-    !
-    IMPLICIT NONE
-    !
-    REAL,DIMENSION(:),INTENT(IN) :: PTAB
-    CHARACTER(LEN=*), INTENT(IN) :: MESSAGE
-    REAL,OPTIONAL,    INTENT(IN) :: PPRECISION
-    !
-    CHARACTER(len=40)                                  :: YMSG
-    CHARACTER(len=NMAXMSGLEN)                          :: MSG
-    CHARACTER(len=NMAXMSGLEN),DIMENSION(:),ALLOCATABLE :: ALLMSG
-    INTEGER                                            :: IINFO_ll
-    INTEGER                                            :: I_FIRST_FATHER, I_FIRST_SON
-    INTEGER                                            :: IPAS,NPAS,NPAS_ll
-    INTEGER                                            :: IGLBSIZEPTAB
-    INTEGER                                            :: ISIZEOTHER
-    LOGICAL                                            :: G_PTAB_ON_DEVICE
-    LOGICAL,DIMENSION(NMAXPAS)                         :: OK
-    REAL                                               :: ZDIV
-    REAL                                               :: ZPRECISION
-    REAL,DIMENSION(NMAXPAS)                            :: MAX_DIFF , MAX_VAL
-    REAL, DIMENSION(SIZE(PTAB,1))                      :: ZTAB, ZTAB_SON, ZTAB_DIFF
-    !
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !
-    IF ( PRESENT(PPRECISION) ) THEN
-      ZPRECISION = PPRECISION
-    ELSE
-      ZPRECISION = XPRECISION
-    END IF
-    !
-    !get the global size of PTAB
-    CALL MPI_ALLREDUCE(SIZE(PTAB), IGLBSIZEPTAB, 1,MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll)
-    IF ( IGLBSIZEPTAB == 0 ) RETURN
-    !
-    CALL MPPDB_BARRIER()
-    !
-    ALLOCATE(ALLMSG(MPPDB_NBPROC_INTRA))
-    MSG = MESSAGE
-    CALL MPI_ALLGATHER(MSG,LEN(MSG),MPI_CHARACTER,ALLMSG,LEN(MSG),MPI_CHARACTER,MPPDB_INTRA_COMM,IINFO_ll)
-    DO IPAS = 1, MPPDB_NBPROC_INTRA
-      IF ( ALLMSG(IPAS) /= MSG ) &
-        CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK1D_REAL','message not similar on all processes (' &
-                       //TRIM(ALLMSG(IPAS))//' vs '//TRIM(MSG)//')')
-    END DO
-    DEALLOCATE(ALLMSG)
-    !
-    !implemented for only 1 process on each side
-    IF (MPPDB_NBPROC_INTRA>2) THEN
-      IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-         CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK1D_REAL','only works with 1 process on each side::'//MSG)
-      END IF
-      CALL MPPDB_BARRIER()
-      RETURN
-    END IF
-    !
-    CALL GET_FROM_DEVICE(PTAB,ZTAB,G_PTAB_ON_DEVICE)
-    !
-    NPAS = 1
-    IF (G_PTAB_ON_DEVICE) NPAS=2
-    CALL MPI_ALLREDUCE(NPAS,NPAS_ll,1,MNHINT_MPI,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll)
-    !
-    IF (NPAS_ll>NMAXPAS) THEN
-      NPAS_ll = NMAXPAS
-      CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK1D_REAL','NPAS_ll reduced')
-    END IF
-    !
-    MAX_DIFF(:) = 0.0
-    !
-    DO IPAS=1,NPAS_ll
-      IF ((IPAS.EQ.2) .AND. G_PTAB_ON_DEVICE ) ZTAB = PTAB ! the 2 time test the value on host
-      !
-      IF(MPPDB_FATHER_WORLD) THEN
-        IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          I_FIRST_SON = MPPDB_NBPROC_WORLD
-          CALL MPI_SENDRECV(SIZE(ZTAB),1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-                            ISIZEOTHER,1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-                            MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-          IF (SIZE(ZTAB)==ISIZEOTHER) THEN
-            CALL MPI_RECV(ZTAB_SON,SIZE(ZTAB_SON),MNHREAL_MPI,I_FIRST_SON, &
-                    NTAG,MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-            ZTAB_DIFF     = ABS ( ZTAB - ZTAB_SON )
-            MAX_VAL(IPAS)  = MAXVAL( ABS (ZTAB_SON) )
-            MAX_DIFF(IPAS) = MAXVAL( ZTAB_DIFF)
-            !
-            IF ( MAX_VAL(IPAS) .EQ. 0.0 ) THEN
-              ZDIV=1.0
-            ELSE
-              ZDIV=MAX_VAL(IPAS)
-            END IF
-            IF ( MAX_DIFF(IPAS)/ZDIV > ZPRECISION ) THEN
-              OK(IPAS) = .FALSE.
-            ELSE
-              OK(IPAS) = .TRUE.
-            END IF
-          END IF
-        END IF
-      ELSE
-        I_FIRST_FATHER = 0
-        CALL MPI_SENDRECV(SIZE(ZTAB),1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-                          ISIZEOTHER,1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-                          MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-        IF (SIZE(ZTAB)==ISIZEOTHER) THEN
-          CALL MPI_SEND(ZTAB,SIZE(ZTAB),MNHREAL_MPI,I_FIRST_FATHER, &
-                        NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-        END IF
-      END IF
-      !
-      CALL MPPDB_BARRIER()
-      !
-    END DO
-    !
-    IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-      YMSG=ADJUSTL(MESSAGE)
-      IF (SIZE(ZTAB)==ISIZEOTHER) THEN
-        IF (NPAS_ll == 1) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) ) THEN
-            write(*, '( A29,A22,A40," Error:       ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                  achar(27)//'[32mMPPDB_CHECK1D :: OK'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-          ELSE
-            write(*, '( A29,A22,A40," Error:       ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                achar(27)//'[31mMPPDB_CHECK1D :: KO'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-          END IF
-#else
-          IF ( OK(1) ) THEN
-            write(*, '(" MPPDB_CHECK1D :: OK MPPDB_CHECK1D =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) &
-                  MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-          ELSE
-            write(*, '(" MPPDB_CHECK1D :: KO MPPDB_CHECK1D =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) &
-                  MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE IF (NPAS_ll == 2) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[32mMPPDB_CHECK1D :: OK on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[31mMPPDB_CHECK1D :: KO on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[33mMPPDB_CHECK1D :: OK on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[33mMPPDB_CHECK1D :: KO on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          END IF
-#else
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHECK1D :: OK on host, OK on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHECK1D :: KO on host, KO on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHECK1D :: OK on host, KO on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHECK1D :: KO on host, OK on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE
-          CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK1D_REAL','NPAS_ll>2 not (yet) implemented')
-        END IF
-      ELSE
-#ifdef _COLOR_OUTPUT
-        WRITE (*,'( A,I10,I10,A40 )') achar(27)//'[31mMPPDB_CHECK1D :: KO: array sizes different on 2 sides'//achar(27)//'[0m ',&
-                                  SIZE(ZTAB),ISIZEOTHER,YMSG
-#else
-        WRITE (*,'( A,I10,I10,A40 )') 'MPPDB_CHECK1D :: KO: array sizes different on 2 sides',SIZE(ZTAB),ISIZEOTHER,YMSG
-#endif
-      END IF
-    END IF
-#endif
-  END SUBROUTINE MPPDB_CHECK1D_REAL
-  
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-  SUBROUTINE MPPDB_CHECK3D_LOG(OTAB,MESSAGE)
-    !
-    USE MODD_PARAMETERS_ll, ONLY: JPHEXT
-    USE MODD_MPIF,          ONLY: MPI_CHARACTER, MPI_STATUS_IGNORE, MPI_SUM, MPI_MAX
-    use modd_precision,     only: MNHINT_MPI, MNHLOG_MPI
-    !
-    USE MODE_DEVICE
-    USE MODE_GATHER_ll
-    !
-    IMPLICIT NONE
-    !
-    LOGICAL, DIMENSION(:,:,:),INTENT(IN) :: OTAB
-    CHARACTER(len=*),         INTENT(IN) :: MESSAGE
-    !
-    CHARACTER(len=40)                                         :: YMSG
-    CHARACTER(len=NMAXMSGLEN)                                 :: MSG
-    CHARACTER(len=NMAXMSGLEN),DIMENSION(:),ALLOCATABLE        :: ALLMSG
-    INTEGER                                                   :: IIMAX_ll,IJMAX_ll
-    INTEGER                                                   :: IIU_ll,IJU_ll,IKU_ll
-    INTEGER                                                   :: IINFO_ll
-    INTEGER                                                   :: I_FIRST_SON
-    INTEGER                                                   :: I_FIRST_FATHER
-    INTEGER                                                   :: IPAS,NPAS,NPAS_ll
-    INTEGER                                                   :: IIB_ll,IIE_ll,IJB_ll,IJE_ll
-    INTEGER                                                   :: IGLBSIZEOTAB
-    INTEGER                                                   :: IIU_SON_ll,IJU_SON_ll,IKU_SON_ll
-    INTEGER                                                   :: IIB_SON_ll,IIE_SON_ll,IJB_SON_ll,IJE_SON_ll
-    INTEGER                                                   :: IHEXT_SON_ll , IDIFF_HEXT
-    INTEGER                                                   :: JI,JJ,JK
-    INTEGER,DIMENSION(NMAXPAS)                                :: INUMDIFF
-    INTEGER,DIMENSION(3,NMAXPAS)                              :: IFIRSTERROR
-    LOGICAL                                                   :: G_OTAB_ON_DEVICE, GISXYSIZE_GLOB
-    LOGICAL,DIMENSION(NMAXPAS)                                :: OK
-    LOGICAL,DIMENSION(SIZE(OTAB,1),SIZE(OTAB,2),SIZE(OTAB,3)) :: GTAB
-    LOGICAL, DIMENSION(:,:,:),ALLOCATABLE,TARGET              :: TAB_ll,TAB_SON_ll
-    !
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !get the global size of OTAB
-    CALL MPI_ALLREDUCE(SIZE(OTAB), IGLBSIZEOTAB, 1, MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll)
-    IF ( IGLBSIZEOTAB == 0 ) RETURN
-    !
-    CALL CHECK_ISXYSIZE(SIZE(OTAB,1),SIZE(OTAB,2),GISXYSIZE_GLOB)
-    !
-    !If array is not of the mesh size, this subroutine does not work
-    IF (.NOT.GISXYSIZE_GLOB) THEN
-      IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-         CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_LOG','only works with arrays of mesh size'//MSG)
-      END IF
-      CALL MPPDB_BARRIER()
-      RETURN
-    END IF
-    !
-    CALL MPPDB_BARRIER()
-    !
-    ALLOCATE(ALLMSG(MPPDB_NBPROC_INTRA))
-    MSG = MESSAGE
-    CALL MPI_ALLGATHER(MSG,LEN(MSG),MPI_CHARACTER,ALLMSG,LEN(MSG),MPI_CHARACTER,MPPDB_INTRA_COMM,IINFO_ll)
-    DO IPAS = 1, MPPDB_NBPROC_INTRA
-      IF ( ALLMSG(IPAS) /= MSG ) &
-        CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK3D_LOG','message not similar on all processes (' &
-                       //TRIM(ALLMSG(IPAS))//' vs '//TRIM(MSG)//')')
-    END DO
-    DEALLOCATE(ALLMSG)
-    !
-    CALL GET_FROM_DEVICE(OTAB,GTAB,G_OTAB_ON_DEVICE)
-    !
-    NPAS = 1
-    IF (G_OTAB_ON_DEVICE) NPAS=2
-    CALL MPI_ALLREDUCE(NPAS,NPAS_ll,1,MNHINT_MPI,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll)
-    !
-    IF (NPAS_ll>NMAXPAS) THEN
-      NPAS_ll = NMAXPAS
-      CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_LOG','NPAS_ll reduced')
-    END IF
-    !
-    IFIRSTERROR(:,:) = -1
-    !
-    DO IPAS=1,NPAS_ll
-      IF ((IPAS.EQ.2) .AND. G_OTAB_ON_DEVICE ) GTAB = OTAB ! the 2 time test the value on host
-      !
-      IF(MPPDB_FATHER_WORLD) THEN
-        !
-        ! Reconstruct the whole OTAB in TAB_ll
-        !
-        CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll)
-        IIU_ll = IIMAX_ll+2*JPHEXT
-        IJU_ll = IJMAX_ll+2*JPHEXT
-        IKU_ll = SIZE(OTAB,3)
-        IF (.NOT. ALLOCATED(TAB_ll)) ALLOCATE(TAB_ll(IIU_ll,IJU_ll,IKU_ll))
-        CALL GATHERALL_FIELD_ll('XY',GTAB,TAB_ll,IINFO_ll)
-        !
-        IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          !
-          ! I'm the first FATHER => receive the correct global ARRAY from first son
-          !
-          !
-          ! the first son , is the next processus after this 'world' so
-          !
-          I_FIRST_SON = MPPDB_NBPROC_WORLD
-          !
-          ! receive JPHEXT from son if different
-          !
-          CALL MPI_RECV(IHEXT_SON_ll,1,MNHINT_MPI,I_FIRST_SON, &
-                        NTAG, MPPDB_INTRA_COMM,MPI_STATUS_IGNORE, IINFO_ll)
-          !
-          IIU_SON_ll = IIMAX_ll+2*IHEXT_SON_ll
-          IJU_SON_ll = IJMAX_ll+2*IHEXT_SON_ll
-          IKU_SON_ll = SIZE(OTAB,3)
-          !
-          IF (.NOT. ALLOCATED(TAB_SON_ll)) ALLOCATE(TAB_SON_ll(IIU_SON_ll,IJU_SON_ll,IKU_SON_ll))
-          !
-          CALL MPI_RECV(TAB_SON_ll,SIZE(TAB_SON_ll),MNHLOG_MPI,I_FIRST_SON, &
-                        NTAG,MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-          !
-          TAB_ll = TAB_ll.NEQV.TAB_SON_ll
-          !
-          ! Set corners values to zero if we want to check the halos without the corners
-          IF ( MPPDB_CHECK_LB .AND. .NOT.MPPDB_CHECK_LB_CORNERS ) THEN
-            TAB_ll(1:JPHEXT,             1:JPHEXT,             1:IKU_ll) = .FALSE.
-            TAB_ll(1:JPHEXT,             1:JPHEXT,             1:IKU_ll) = .FALSE.
-            TAB_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll) = .FALSE.
-            TAB_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll) = .FALSE.
-            TAB_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT,             1:IKU_ll) = .FALSE.
-            TAB_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT,             1:IKU_ll) = .FALSE.
-            TAB_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll) = .FALSE.
-            TAB_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll) = .FALSE.
-          END IF
-          !
-          IF (MPPDB_CHECK_LB) THEN
-            IDIFF_HEXT = MIN(JPHEXT,IHEXT_SON_ll)
-          ELSE
-            IDIFF_HEXT = 0
-          END IF
-          IIB_ll   = 1 + JPHEXT    ; IJB_ll = 1 + JPHEXT
-          IIE_ll   = IIU_ll-JPHEXT ; IJE_ll = IJU_ll-JPHEXT
-          !
-          IIB_SON_ll   = 1 + IHEXT_SON_ll    ; IJB_SON_ll = 1 + IHEXT_SON_ll
-          IIE_SON_ll   = IIU_SON_ll-IHEXT_SON_ll ; IJE_SON_ll = IJU_SON_ll-IHEXT_SON_ll
-          !
-          INUMDIFF(IPAS) = COUNT( TAB_ll(IIB_SON_ll-IDIFF_HEXT:IIE_SON_ll+IDIFF_HEXT, &
-                                         IJB_SON_ll-IDIFF_HEXT:IJE_SON_ll+IDIFF_HEXT,1:IKU_SON_ll))
-          IF ( INUMDIFF(IPAS) > 0 ) THEN
-            OK(IPAS) = .FALSE.
-            DO JK = 1,SIZE(TAB_ll,3)
-              DO JJ = 1,SIZE(TAB_ll,2)
-                DO JI = 1,SIZE(TAB_ll,1)
-                  IF (TAB_ll(JI,JJ,JK)) THEN
-                    IFIRSTERROR(1,IPAS)=JI
-                    IFIRSTERROR(2,IPAS)=JJ
-                    IFIRSTERROR(3,IPAS)=JK
-                    GOTO 100
-                  END IF
-                END DO
-              END DO
-            END DO
-100 CONTINUE
-          ELSE
-            OK(IPAS) = .TRUE.
-          END IF
-          !
-          DEALLOCATE(TAB_ll,TAB_SON_ll)
-          !
-        END IF
-      ELSE
-        !
-        ! Reconstruct the all OTAB in TAB_ll
-        !
-        CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll)
-        IIU_ll = IIMAX_ll+2*JPHEXT
-        IJU_ll = IJMAX_ll+2*JPHEXT
-        IKU_ll = SIZE(OTAB,3)
-        IF (.NOT. ALLOCATED(TAB_ll)) ALLOCATE(TAB_ll(IIU_ll,IJU_ll,IKU_ll))
-        CALL GATHERALL_FIELD_ll('XY',GTAB,TAB_ll,IINFO_ll)
-        !
-        ! SON WORLD
-        !
-        IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          !
-          ! first son --> send the good array to the first father
-          !
-          I_FIRST_FATHER = 0
-          IHEXT_SON_ll = JPHEXT
-          CALL MPI_SEND(IHEXT_SON_ll,1,MNHINT_MPI,I_FIRST_FATHER, &
-                        NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-          !
-          CALL MPI_SEND(TAB_ll,SIZE(TAB_ll),MNHLOG_MPI,I_FIRST_FATHER, &
-                        NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-        END IF
-      END IF
-      !
-      CALL MPPDB_BARRIER()
-      !
-    END DO
-
-    IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-      YMSG=ADJUSTL(MESSAGE)
-      IF (NPAS_ll == 1) THEN
-#ifdef _COLOR_OUTPUT
-        IF ( OK(1) ) THEN
-          write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                achar(27)//'[32mMPPDB_CHECK3D :: OK'//achar(27)//'[0m ','',YMSG, INUMDIFF(1),SIZE(OTAB)
-        ELSE
-          write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-              achar(27)//'[31mMPPDB_CHECK3D :: KO'//achar(27)//'[0m ','',YMSG, INUMDIFF(1),SIZE(OTAB)
-        END IF
-#else
-        IF ( OK(1) ) THEN
-          write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                'MPPDB_CHECK3D :: OK','',YMSG, INUMDIFF(1),SIZE(OTAB)
-        ELSE
-          write(*, '( A29,A22,A40," Errors/#elts: ",I12,"/",I12 )' ) &
-                'MPPDB_CHECK3D :: KO','',YMSG, INUMDIFF(1),SIZE(OTAB)
-        END IF
-#endif
-        flush(unit=OUTPUT_UNIT)
-      ELSE IF (NPAS_ll == 2) THEN
-#ifdef _COLOR_OUTPUT
-        IF ( OK(1) .AND. OK(2) ) THEN
-          write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                achar(27)//'[32mMPPDB_CHECK3D :: OK on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-        ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-          write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,") POS: host=",I4,I4,I4," device=",I4,I4,I4 )')&
-                achar(27)//'[31mMPPDB_CHECK3D :: KO on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                INUMDIFF(2),INUMDIFF(1),SIZE(OTAB), &
-                IFIRSTERROR(1,2),IFIRSTERROR(2,2),IFIRSTERROR(3,2),IFIRSTERROR(1,1),IFIRSTERROR(2,1),IFIRSTERROR(3,1)
-        ELSE IF ( .NOT.OK(1) ) THEN
-          write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,") POS: host=",I4,I4,I4," device=",I4,I4,I4 )')&
-                achar(27)//'[33mMPPDB_CHECK3D :: OK on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                INUMDIFF(2),INUMDIFF(1),SIZE(OTAB), &
-                IFIRSTERROR(1,2),IFIRSTERROR(2,2),IFIRSTERROR(3,2),IFIRSTERROR(1,1),IFIRSTERROR(2,1),IFIRSTERROR(3,1)
-        ELSE IF ( .NOT.OK(2) ) THEN
-          write(*, '( A51,A40," Errors: host=",I12," device=",I12," (#elts=",I12,") POS: host=",I4,I4,I4," device=",I4,I4,I4 )')&
-                achar(27)//'[33mMPPDB_CHECK3D :: KO on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                INUMDIFF(2),INUMDIFF(1),SIZE(OTAB), &
-                IFIRSTERROR(1,2),IFIRSTERROR(2,2),IFIRSTERROR(3,2),IFIRSTERROR(1,1),IFIRSTERROR(2,1),IFIRSTERROR(3,1)
-        END IF
-#else
-        IF ( OK(1) .AND. OK(2) ) THEN
-          write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,")" )' ) &
-                'MPPDB_CHECK3D :: OK on host, OK on device ',YMSG, &
-                INUMDIFF(2),INUMDIFF(1),SIZE(OTAB)
-        ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-          write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,") POS: host=",I4,I4,I4," device=",I4,I4,I4 )')&
-                'MPPDB_CHECK3D :: KO on host, KO on device ',YMSG, &
-                INUMDIFF(2),INUMDIFF(1),SIZE(OTAB), &
-                IFIRSTERROR(1,2),IFIRSTERROR(2,2),IFIRSTERROR(3,2),IFIRSTERROR(1,1),IFIRSTERROR(2,1),IFIRSTERROR(3,1)
-        ELSE IF ( .NOT.OK(1) ) THEN
-          write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,") POS: host=",I4,I4,I4," device=",I4,I4,I4 )')&
-                'MPPDB_CHECK3D :: OK on host, KO on device ',YMSG, &
-                INUMDIFF(2),INUMDIFF(1),SIZE(OTAB), &
-                IFIRSTERROR(1,2),IFIRSTERROR(2,2),IFIRSTERROR(3,2),IFIRSTERROR(1,1),IFIRSTERROR(2,1),IFIRSTERROR(3,1)
-        ELSE IF ( .NOT.OK(2) ) THEN
-          write(*, '( A42,A40," Errors: host=",I12," device=",I12," (#elts=",I12,") POS: host=",I4,I4,I4," device=",I4,I4,I4 )')&
-                'MPPDB_CHECK3D :: KO on host, OK on device ',YMSG, &
-                INUMDIFF(2),INUMDIFF(1),SIZE(OTAB), &
-                IFIRSTERROR(1,2),IFIRSTERROR(2,2),IFIRSTERROR(3,2),IFIRSTERROR(1,1),IFIRSTERROR(2,1),IFIRSTERROR(3,1)
-        END IF
-#endif
-        flush(unit=OUTPUT_UNIT)
-      ELSE
-        CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_LOG','NPAS_ll>2 not (yet) implemented')
-      END IF
-    END IF
-#endif
-  END SUBROUTINE MPPDB_CHECK3D_LOG
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-  SUBROUTINE MPPDB_CHECK3D_REAL(PTAB,MESSAGE,PPRECISION)
-    !
-    USE MODD_MPIF,          ONLY: MPI_CHARACTER, MPI_STATUS_IGNORE, MPI_SUM, MPI_MAX
-    USE MODD_PARAMETERS_ll, ONLY: JPHEXT
-    use modd_precision,     only: MNHINT_MPI, MNHREAL_MPI
-    !
-    USE MODE_DEVICE
-    USE MODE_GATHER_ll
-    !
-    IMPLICIT NONE
-    !
-    REAL, DIMENSION(:,:,:),INTENT(IN) :: PTAB
-    CHARACTER(len=*),      INTENT(IN) :: MESSAGE
-    REAL,OPTIONAL,         INTENT(IN) :: PPRECISION
-    !
-    CHARACTER(len=40)                                      :: YMSG
-    CHARACTER(len=NMAXMSGLEN)                              :: MSG
-    CHARACTER(len=NMAXMSGLEN),DIMENSION(:),ALLOCATABLE     :: ALLMSG
-    INTEGER                                                :: IIMAX_ll,IJMAX_ll
-    INTEGER                                                :: IIU_ll,IJU_ll,IKU_ll
-    INTEGER                                                :: IINFO_ll
-    INTEGER                                                :: I_FIRST_SON
-    INTEGER                                                :: I_FIRST_FATHER
-    INTEGER                                                :: IIB_ll,IIE_ll,IJB_ll,IJE_ll
-    INTEGER                                                :: IGLBSIZEPTAB
-    INTEGER                                                :: IIU_SON_ll,IJU_SON_ll,IKU_SON_ll
-    INTEGER                                                :: IIB_SON_ll,IIE_SON_ll,IJB_SON_ll,IJE_SON_ll
-    INTEGER                                                :: IHEXT_SON_ll , IDIFF_HEXT
-    INTEGER                                                :: IPAS,NPAS,NPAS_ll
-    LOGICAL                                                :: G_PTAB_ON_DEVICE, GISXYSIZE_GLOB
-    LOGICAL,DIMENSION(NMAXPAS)                             :: OK
-    REAL                                                   :: ZDIV
-    REAL                                                   :: ZPRECISION
-    REAL,DIMENSION(NMAXPAS)                                :: MAX_DIFF, MAX_VAL
-    REAL,DIMENSION(SIZE(PTAB,1),SIZE(PTAB,2),SIZE(PTAB,3)) :: ZTAB
-    REAL,DIMENSION(:,:,:,:),ALLOCATABLE,TARGET             :: TAB_ll
-    REAL,DIMENSION(:,:,:),ALLOCATABLE,TARGET               :: TAB_SON_ll
-
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !
-    IF ( PRESENT(PPRECISION) ) THEN
-      ZPRECISION = PPRECISION
-    ELSE
-      ZPRECISION = XPRECISION
-    END IF
-    !
-    !get the global size of PTAB
-    CALL MPI_ALLREDUCE(SIZE(PTAB), IGLBSIZEPTAB, 1, MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll)
-    IF ( IGLBSIZEPTAB == 0 ) RETURN
-    !
-    CALL CHECK_ISXYSIZE(SIZE(PTAB,1),SIZE(PTAB,2),GISXYSIZE_GLOB)
-    !
-    !If array is not of the mesh size, this subroutine does not work
-    IF (.NOT.GISXYSIZE_GLOB) THEN
-      IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-         CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_REAL','only works with arrays of mesh size'//MSG)
-      END IF
-      CALL MPPDB_BARRIER()
-      RETURN
-    END IF
-    !
-    CALL MPPDB_BARRIER()
-
-    ALLOCATE(ALLMSG(MPPDB_NBPROC_INTRA))
-    MSG = MESSAGE
-    CALL MPI_ALLGATHER(MSG,LEN(MSG),MPI_CHARACTER,ALLMSG,LEN(MSG),MPI_CHARACTER,MPPDB_INTRA_COMM,IINFO_ll)
-    DO IPAS = 1, MPPDB_NBPROC_INTRA
-      IF ( ALLMSG(IPAS) /= MSG ) &
-        CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK3D_REAL','message not similar on all processes (' &
-                       //TRIM(ALLMSG(IPAS))//' vs '//TRIM(MSG)//')')
-    END DO
-    DEALLOCATE(ALLMSG)
-
-    CALL GET_FROM_DEVICE(PTAB,ZTAB,G_PTAB_ON_DEVICE)
-
-    NPAS = 1
-    IF (G_PTAB_ON_DEVICE) NPAS=2
-    CALL MPI_ALLREDUCE(NPAS,NPAS_ll,1,MNHINT_MPI,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll)
-
-    MAX_DIFF(:) = 0.0
-
-    IF (NPAS_ll>NMAXPAS) THEN
-      NPAS_ll = NMAXPAS
-      CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_REAL','NPAS_ll reduced')
-    END IF
-
-    DO IPAS=1,NPAS_ll
-       IF ((IPAS.EQ.2) .AND. G_PTAB_ON_DEVICE ) ZTAB = PTAB ! the 2 time test the value on host
-       !
-       IF(MPPDB_FATHER_WORLD) THEN
-          !
-       ! Reconstruct the whole PTAB in TAB_ll
-          !
-          CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll)
-          IIU_ll = IIMAX_ll+2*JPHEXT
-          IJU_ll = IJMAX_ll+2*JPHEXT
-          IKU_ll = SIZE(PTAB,3)
-          IF (.NOT. ALLOCATED(TAB_ll))      ALLOCATE(TAB_ll(IIU_ll,IJU_ll,IKU_ll,NPAS_ll))
-          CALL GATHERALL_FIELD_ll('XY',ZTAB,TAB_ll(:,:,:,IPAS),IINFO_ll)
-
-          IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-             !
-             ! I'm the first FATHER => receive the correct global ARRAY from first son
-             !
-             !
-             ! the first son , is the next processus after this 'world' so
-             !
-             I_FIRST_SON = MPPDB_NBPROC_WORLD
-             !
-             ! receive JPHEXT from son if different
-             !
-             CALL MPI_RECV(IHEXT_SON_ll,1,MNHINT_MPI,I_FIRST_SON, &
-                  NTAG, MPPDB_INTRA_COMM,MPI_STATUS_IGNORE, IINFO_ll)
-
-             !IHEXT_SON_ll = JPHEXT
-
-             IIU_SON_ll = IIMAX_ll+2*IHEXT_SON_ll
-             IJU_SON_ll = IJMAX_ll+2*IHEXT_SON_ll
-             IKU_SON_ll = SIZE(PTAB,3)
-
-             IF (.NOT. ALLOCATED(TAB_SON_ll)) ALLOCATE(TAB_SON_ll(IIU_SON_ll,IJU_SON_ll,IKU_SON_ll))
-             !
-             CALL MPI_RECV(TAB_SON_ll,SIZE(TAB_SON_ll),MNHREAL_MPI,I_FIRST_SON, &
-                  NTAG,MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-             !
-             TAB_ll(:,:,:,IPAS)      = ABS ( TAB_ll(:,:,:,IPAS) - TAB_SON_ll(:,:,:) )
-             !
-             ! Set corners values to zero if we want to check the halos without the corners
-             IF ( MPPDB_CHECK_LB .AND. .NOT.MPPDB_CHECK_LB_CORNERS ) THEN
-                TAB_ll(1:JPHEXT,             1:JPHEXT,             1:IKU_ll,IPAS) = 0d0
-                TAB_ll(1:JPHEXT,             1:JPHEXT,             1:IKU_ll,IPAS) = 0d0
-                TAB_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll,IPAS) = 0d0
-                TAB_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll,IPAS) = 0d0
-                TAB_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT,             1:IKU_ll,IPAS) = 0d0
-                TAB_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT,             1:IKU_ll,IPAS) = 0d0
-                TAB_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll,IPAS) = 0d0
-                TAB_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll,IPAS) = 0d0
-                TAB_SON_ll(1:JPHEXT,             1:JPHEXT,             1:IKU_ll) = 0d0
-                TAB_SON_ll(1:JPHEXT,             1:JPHEXT,             1:IKU_ll) = 0d0
-                TAB_SON_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll) = 0d0
-                TAB_SON_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll) = 0d0
-                TAB_SON_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT,             1:IKU_ll) = 0d0
-                TAB_SON_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT,             1:IKU_ll) = 0d0
-                TAB_SON_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll) = 0d0
-                TAB_SON_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll, 1:IKU_ll) = 0d0
-             END IF
-             !
-             IF (MPPDB_CHECK_LB) THEN
-                IDIFF_HEXT = MIN(JPHEXT,IHEXT_SON_ll)
-             ELSE
-                IDIFF_HEXT = 0
-             END IF
-             IIB_ll   = 1 + JPHEXT    ; IJB_ll = 1 + JPHEXT
-             IIE_ll   = IIU_ll-JPHEXT ; IJE_ll = IJU_ll-JPHEXT
-
-             IIB_SON_ll   = 1 + IHEXT_SON_ll    ; IJB_SON_ll = 1 + IHEXT_SON_ll
-             IIE_SON_ll   = IIU_SON_ll-IHEXT_SON_ll ; IJE_SON_ll = IJU_SON_ll-IHEXT_SON_ll
-
-             MAX_VAL(IPAS)  = MAXVAL( ABS (TAB_SON_ll(IIB_SON_ll-IDIFF_HEXT:IIE_SON_ll+IDIFF_HEXT,&
-                                                   IJB_SON_ll-IDIFF_HEXT:IJE_SON_ll+IDIFF_HEXT,1:IKU_SON_ll) ) )
-             MAX_DIFF(IPAS) = MAXVAL( TAB_ll(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IJB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT,1:IKU_ll,IPAS))
-             !
-             IF ( MAX_VAL(IPAS) .EQ. 0.0 ) THEN
-               ZDIV=1.0
-             ELSE
-              ZDIV=MAX_VAL(IPAS)
-             END IF
-             IF ( MAX_DIFF(IPAS)/ZDIV > ZPRECISION ) THEN
-                OK(IPAS) = .FALSE.
-                !write(*, '(" MPPDB_CHECK3D :: KO MPPDB_CHECK3D =",A40," Error=",e15.8," MAXVAL=",e15.8," PTAB_ON_DEVICE=",l1," IPAS=",I1)' ) MESSAGE,MAX_DIFF(IPAS),MAX_VAL(IPAS),G_PTAB_ON_DEVICE,IPAS
-             ELSE
-                OK(IPAS) = .TRUE.
-                !write(*, '(" MPPDB_CHECK3D :: OK MPPDB_CHECK3D =",A40," Error=",e15.8," MAXVAL=",e15.8," PTAB_ON_DEVICE=",l1," IPAS=",I1)' ) MESSAGE,MAX_DIFF(IPAS),MAX_VAL(IPAS),G_PTAB_ON_DEVICE,IPAS
-             END IF
-             !flush(unit=OUTPUT_UNIT)
-             !
-             !DEALLOCATE(TAB_ll,TAB_SON_ll)
-             !
-          END IF
-       ELSE
-          !
-          ! Reconstruct the all PTAB in TAB_ll
-          !
-          CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll)
-          IIU_ll = IIMAX_ll+2*JPHEXT
-          IJU_ll = IJMAX_ll+2*JPHEXT
-          IKU_ll = SIZE(PTAB,3)
-          IF (.NOT. ALLOCATED(TAB_ll)) ALLOCATE(TAB_ll(IIU_ll,IJU_ll,IKU_ll,NPAS_ll))
-          CALL GATHERALL_FIELD_ll('XY',ZTAB,TAB_ll(:,:,:,IPAS),IINFO_ll)
-          !
-          ! SON WORLD
-          !
-          IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-             !
-             ! first son --> send the good array to the first father
-             !
-             I_FIRST_FATHER = 0
-             IHEXT_SON_ll = JPHEXT
-             CALL MPI_BSEND(IHEXT_SON_ll,1,MNHINT_MPI,I_FIRST_FATHER, &
-                  NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-
-             CALL MPI_BSEND(TAB_ll(:,:,:,IPAS),SIZE(TAB_ll(:,:,:,IPAS)),MNHREAL_MPI,I_FIRST_FATHER, &
-                  NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-          END IF
-       END IF
-
-       CALL MPPDB_BARRIER()
-
-    END DO
-
-    IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-      YMSG=ADJUSTL(MESSAGE)
-
-      IF (NPAS_ll == 1) THEN
-#ifdef _COLOR_OUTPUT
-        IF ( OK(1) ) THEN
-          write(*, '( A29,A22,A40," Error:       ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                achar(27)//'[32mMPPDB_CHECK3D :: OK'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-        ELSE
-          write(*, '( A29,A22,A40," Error:       ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                achar(27)//'[31mMPPDB_CHECK3D :: KO'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-        END IF
-#else
-        IF ( OK(1) ) THEN
-          write(*, '(" MPPDB_CHECK3D :: OK MPPDB_CHECK3D =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-        ELSE
-          write(*, '(" MPPDB_CHECK3D :: KO MPPDB_CHECK3D =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-        END IF
-#endif
-        flush(unit=OUTPUT_UNIT)
-      ELSE IF (NPAS_ll == 2) THEN
-#ifdef _COLOR_OUTPUT
-        IF ( OK(1) .AND. OK(2) ) THEN
-          write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                achar(27)//'[32mMPPDB_CHECK3D :: OK on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-          write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                achar(27)//'[31mMPPDB_CHECK3D :: KO on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(1) ) THEN
-          write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                achar(27)//'[33mMPPDB_CHECK3D :: OK on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(2) ) THEN
-          write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                achar(27)//'[33mMPPDB_CHECK3D :: KO on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        END IF
-#else
-        IF ( OK(1) .AND. OK(2) ) THEN
-          write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                'MPPDB_CHECK3D :: OK on host, OK on device ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-          write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                'MPPDB_CHECK3D :: KO on host, KO on device ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(1) ) THEN
-          write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                'MPPDB_CHECK3D :: OK on host, KO on device ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(2) ) THEN
-          write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                'MPPDB_CHECK3D :: KO on host, OK on device ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        END IF
-#endif
-        flush(unit=OUTPUT_UNIT)
-      ELSE
-        CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_REAL','NPAS_ll>2 not (yet) implemented')
-      END IF
-     DEALLOCATE(TAB_ll,TAB_SON_ll)
-    END IF
-#endif
-  END SUBROUTINE MPPDB_CHECK3D_REAL
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-  SUBROUTINE MPPDB_CHECK3DM(MESSAGE,PPRECISION &
-                           ,PTAB1,PTAB2,PTAB3,PTAB4,PTAB5,PTAB6,PTAB7,PTAB8,PTAB9,PTAB10 &
-                           ,PTAB11,PTAB12,PTAB13,PTAB14,PTAB15,PTAB16,PTAB17,PTAB18,PTAB19,PTAB20 &
-                           )
-
-    IMPLICIT NONE
-
-    CHARACTER(len=*),                 INTENT(IN) :: MESSAGE
-    REAL,                   OPTIONAL, INTENT(IN) :: PPRECISION
-    REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PTAB1,PTAB2,PTAB3,PTAB4,PTAB5,PTAB6,PTAB7,PTAB8,PTAB9,PTAB10
-    REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PTAB11,PTAB12,PTAB13,PTAB14,PTAB15,PTAB16,PTAB17,PTAB18,PTAB19,PTAB20
-
-    IF (PRESENT(PTAB1)) CALL MPPDB_CHECK3D(PTAB1,MESSAGE//"::PTAB1",PPRECISION)
-    IF (PRESENT(PTAB2)) CALL MPPDB_CHECK3D(PTAB2,MESSAGE//"::PTAB2",PPRECISION)
-    IF (PRESENT(PTAB3)) CALL MPPDB_CHECK3D(PTAB3,MESSAGE//"::PTAB3",PPRECISION)
-    IF (PRESENT(PTAB4)) CALL MPPDB_CHECK3D(PTAB4,MESSAGE//"::PTAB4",PPRECISION)
-    IF (PRESENT(PTAB5)) CALL MPPDB_CHECK3D(PTAB5,MESSAGE//"::PTAB5",PPRECISION)
-    IF (PRESENT(PTAB6)) CALL MPPDB_CHECK3D(PTAB6,MESSAGE//"::PTAB6",PPRECISION)
-    IF (PRESENT(PTAB7)) CALL MPPDB_CHECK3D(PTAB7,MESSAGE//"::PTAB7",PPRECISION)
-    IF (PRESENT(PTAB8)) CALL MPPDB_CHECK3D(PTAB8,MESSAGE//"::PTAB8",PPRECISION)
-    IF (PRESENT(PTAB9)) CALL MPPDB_CHECK3D(PTAB9,MESSAGE//"::PTAB9",PPRECISION)
-    IF (PRESENT(PTAB10)) CALL MPPDB_CHECK3D(PTAB10,MESSAGE//"::PTAB10",PPRECISION)
-    IF (PRESENT(PTAB11)) CALL MPPDB_CHECK3D(PTAB11,MESSAGE//"::PTAB11",PPRECISION)
-    IF (PRESENT(PTAB12)) CALL MPPDB_CHECK3D(PTAB12,MESSAGE//"::PTAB12",PPRECISION)
-    IF (PRESENT(PTAB13)) CALL MPPDB_CHECK3D(PTAB13,MESSAGE//"::PTAB13",PPRECISION)
-    IF (PRESENT(PTAB14)) CALL MPPDB_CHECK3D(PTAB14,MESSAGE//"::PTAB14",PPRECISION)
-    IF (PRESENT(PTAB15)) CALL MPPDB_CHECK3D(PTAB15,MESSAGE//"::PTAB15",PPRECISION)
-    IF (PRESENT(PTAB16)) CALL MPPDB_CHECK3D(PTAB16,MESSAGE//"::PTAB16",PPRECISION)
-    IF (PRESENT(PTAB17)) CALL MPPDB_CHECK3D(PTAB17,MESSAGE//"::PTAB17",PPRECISION)
-    IF (PRESENT(PTAB18)) CALL MPPDB_CHECK3D(PTAB18,MESSAGE//"::PTAB18",PPRECISION)
-    IF (PRESENT(PTAB19)) CALL MPPDB_CHECK3D(PTAB19,MESSAGE//"::PTAB19",PPRECISION)
-    IF (PRESENT(PTAB20)) CALL MPPDB_CHECK3D(PTAB20,MESSAGE//"::PTAB20",PPRECISION)
-
-  END SUBROUTINE MPPDB_CHECK3DM
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-  subroutine Mppdb_check4d_real(ptab,hmsg,pprecision)
-
-    implicit none
-
-    real, dimension(:,:,:,:),intent(in) :: ptab
-    character(len=*),        intent(in) :: hmsg
-    real,optional,           intent(in) :: pprecision
-
-    character(len=3)           :: yidx
-    integer                    :: ji
-
-    do ji = 1, size(ptab,4)
-      write( yidx, '( I3.3 )' ) ji
-      call Mppdb_check3d_real( ptab(:,:,:,ji), hmsg//'(:,:,:,'//yidx//')', pprecision )
-    end do
-  end subroutine Mppdb_check4d_real
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-  SUBROUTINE MPPDB_CHECK2D_REAL(PTAB,MESSAGE,PPRECISION)
-    !
-    USE MODD_MPIF,          ONLY: MPI_CHARACTER, MPI_STATUS_IGNORE, MPI_LAND, MPI_SUM, MPI_MAX
-    USE MODD_PARAMETERS_ll, ONLY: JPHEXT
-    use modd_precision,     only: MNHINT_MPI, MNHREAL_MPI
-    !
-    USE MODE_DEVICE
-    USE MODE_GATHER_ll
-    USE MODE_TOOLS_ll,      ONLY: GET_DIM_EXT_ll
-    !
-    IMPLICIT NONE
-    !
-    REAL, DIMENSION(:,:),  INTENT(IN) :: PTAB
-    CHARACTER(len=*),      INTENT(IN) :: MESSAGE
-    REAL, OPTIONAL,        INTENT(IN) :: PPRECISION
-    !
-    CHARACTER(len=40)                                      :: YMSG
-    CHARACTER(len=NMAXMSGLEN)                              :: MSG
-    CHARACTER(len=NMAXMSGLEN),DIMENSION(:),ALLOCATABLE     :: ALLMSG
-    INTEGER                                                :: IIMAX_ll,IJMAX_ll
-    INTEGER                                                :: IIU_ll,IJU_ll
-    INTEGER                                                :: IINFO_ll
-    INTEGER                                                :: I_FIRST_SON
-    INTEGER                                                :: I_FIRST_FATHER
-    INTEGER                                                :: IIB_ll,IIE_ll,IJB_ll,IJE_ll
-    INTEGER                                                :: IGLBSIZEPTAB
-    INTEGER                                                :: IIU_SON_ll,IJU_SON_ll
-    INTEGER                                                :: IIB_SON_ll,IIE_SON_ll,IJB_SON_ll,IJE_SON_ll
-    INTEGER                                                :: IHEXT_SON_ll , IDIFF_HEXT
-    INTEGER                                                :: IPAS,NPAS,NPAS_ll
-    LOGICAL                                                :: G_PTAB_ON_DEVICE
-    LOGICAL                                                :: GISXYSIZE_GLOB
-    LOGICAL,DIMENSION(NMAXPAS)                             :: OK
-    REAL                                                   :: ZDIV
-    REAL                                                   :: ZPRECISION
-    REAL,DIMENSION(NMAXPAS)                                :: MAX_DIFF, MAX_VAL
-    REAL,DIMENSION(SIZE(PTAB,1),SIZE(PTAB,2)) :: ZTAB
-    REAL,DIMENSION(:,:),ALLOCATABLE,TARGET               :: TAB_ll,TAB_SON_ll
-
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !
-    IF ( PRESENT(PPRECISION) ) THEN
-      ZPRECISION = PPRECISION
-    ELSE
-      ZPRECISION = XPRECISION
-    END IF
-    !
-    !get the global size of PTAB
-    CALL MPI_ALLREDUCE(SIZE(PTAB), IGLBSIZEPTAB, 1,MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll)
-    IF ( IGLBSIZEPTAB == 0 ) RETURN
-    !
-    CALL CHECK_ISXYSIZE(SIZE(PTAB,1),SIZE(PTAB,2),GISXYSIZE_GLOB)
-    !
-    !If array is not of the mesh size, this subroutine works only for 1 process on each side
-    IF (.NOT.GISXYSIZE_GLOB .AND. MPPDB_NBPROC_INTRA>2) THEN
-       IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-          CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK2D_REAL', &
-               'only works with 1 process on each side for arrays not of mesh size'//MSG)
-       END IF
-       CALL MPPDB_BARRIER()
-       RETURN      
-    END IF
-    !
-    CALL MPPDB_BARRIER()
-
-    ALLOCATE(ALLMSG(MPPDB_NBPROC_INTRA))
-    MSG = MESSAGE
-    CALL MPI_ALLGATHER(MSG,LEN(MSG),MPI_CHARACTER,ALLMSG,LEN(MSG),MPI_CHARACTER,MPPDB_INTRA_COMM,IINFO_ll)
-    DO IPAS = 1, MPPDB_NBPROC_INTRA
-      IF ( ALLMSG(IPAS) /= MSG ) &
-        CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK2D_REAL','message not similar on all processes (' &
-                       //TRIM(ALLMSG(IPAS))//' vs '//TRIM(MSG)//')')
-    END DO
-    DEALLOCATE(ALLMSG)
-
-    CALL GET_FROM_DEVICE(PTAB,ZTAB,G_PTAB_ON_DEVICE)
-
-    NPAS = 1
-    IF (G_PTAB_ON_DEVICE) NPAS=2
-    CALL MPI_ALLREDUCE(NPAS,NPAS_ll,1,MNHINT_MPI,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll)
-
-    MAX_DIFF(:) = 0.0
-
-    IF (NPAS_ll>NMAXPAS) THEN
-      NPAS_ll = NMAXPAS
-      CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK2D_REAL','NPAS_ll reduced')
-    END IF
-
-    DO IPAS=1,NPAS_ll
-       IF ((IPAS.EQ.2) .AND. G_PTAB_ON_DEVICE ) ZTAB = PTAB ! the 2 time test the value on host
-       !
-       IF(MPPDB_FATHER_WORLD) THEN
-          !
-          ! Reconstruct the whole PTAB in TAB_ll
-          !
-          IF (GISXYSIZE_GLOB) THEN
-            CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll)
-            IIU_ll = IIMAX_ll+2*JPHEXT
-            IJU_ll = IJMAX_ll+2*JPHEXT
-            IF (.NOT. ALLOCATED(TAB_ll))      ALLOCATE(TAB_ll(IIU_ll,IJU_ll))
-            CALL GATHERALL_FIELD_ll('XY',ZTAB,TAB_ll,IINFO_ll)
-          ELSE
-             IF (MPPDB_NBPROC_INTRA>2) THEN
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK2D_REAL',                                  &
-                     'only works with 1 process on each side for arrays not of mesh size'//MSG)
-                STOP  
-             END IF
-            IIU_ll = SIZE(PTAB,1)
-            IJU_ll = SIZE(PTAB,2)
-            IIMAX_ll = IIU_ll
-            IJMAX_ll = IJU_ll
-            IF (.NOT. ALLOCATED(TAB_ll)) ALLOCATE(TAB_ll(IIU_ll,IJU_ll))
-            TAB_ll(:,:) = ZTAB(:,:)
-          END IF
-          !
-          IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-             !
-             ! I'm the first FATHER => receive the correct global ARRAY from first son
-             !
-             !
-             ! the first son , is the next processus after this 'world' so
-             !
-             I_FIRST_SON = MPPDB_NBPROC_WORLD
-             !
-             ! receive JPHEXT from son if different
-             !
-             IF (GISXYSIZE_GLOB) THEN
-              CALL MPI_RECV(IHEXT_SON_ll,1,MNHINT_MPI,I_FIRST_SON, &
-                    NTAG, MPPDB_INTRA_COMM,MPI_STATUS_IGNORE, IINFO_ll)
-
-                !IHEXT_SON_ll = JPHEXT
-
-                IIU_SON_ll = IIMAX_ll+2*IHEXT_SON_ll
-                IJU_SON_ll = IJMAX_ll+2*IHEXT_SON_ll
-             ELSE
-                IIU_SON_ll = IIMAX_ll
-                IJU_SON_ll = IJMAX_ll
-             END IF
-
-             IF (.NOT. ALLOCATED(TAB_SON_ll)) ALLOCATE(TAB_SON_ll(IIU_SON_ll,IJU_SON_ll))
-             !
-             CALL MPI_RECV(TAB_SON_ll,SIZE(TAB_SON_ll),MNHREAL_MPI,I_FIRST_SON, &
-                  NTAG,MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-             !
-             TAB_ll      = ABS ( TAB_ll - TAB_SON_ll )
-             !
-             ! Set corners values to zero if we want to check the halos without the corners
-             IF ( GISXYSIZE_GLOB .AND. MPPDB_CHECK_LB .AND. .NOT.MPPDB_CHECK_LB_CORNERS ) THEN
-                TAB_ll(1:JPHEXT,             1:JPHEXT            ) = 0d0
-                TAB_ll(1:JPHEXT,             1:JPHEXT            ) = 0d0
-                TAB_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll) = 0d0
-                TAB_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll) = 0d0
-                TAB_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT            ) = 0d0
-                TAB_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT            ) = 0d0
-                TAB_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll) = 0d0
-                TAB_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll) = 0d0
-                TAB_SON_ll(1:JPHEXT,             1:JPHEXT            ) = 0d0
-                TAB_SON_ll(1:JPHEXT,             1:JPHEXT            ) = 0d0
-                TAB_SON_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll) = 0d0
-                TAB_SON_ll(1:JPHEXT,             IJU_ll-JPHEXT:IJU_ll) = 0d0
-                TAB_SON_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT            ) = 0d0
-                TAB_SON_ll(IIU_ll-JPHEXT:IIU_ll, 1:JPHEXT            ) = 0d0
-                TAB_SON_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll) = 0d0
-                TAB_SON_ll(IIU_ll-JPHEXT:IIU_ll, IJU_ll-JPHEXT:IJU_ll) = 0d0
-             END IF
-             !
-             IF (MPPDB_CHECK_LB .AND. GISXYSIZE_GLOB) THEN
-                IDIFF_HEXT = MIN(JPHEXT,IHEXT_SON_ll)
-             ELSE
-                IDIFF_HEXT = 0
-             END IF
-             !
-             IF (GISXYSIZE_GLOB) THEN
-               IIB_ll   = 1 + JPHEXT    ; IJB_ll = 1 + JPHEXT
-               IIE_ll   = IIU_ll-JPHEXT ; IJE_ll = IJU_ll-JPHEXT
-               !
-               IIB_SON_ll   = 1 + IHEXT_SON_ll    ; IJB_SON_ll = 1 + IHEXT_SON_ll
-               IIE_SON_ll   = IIU_SON_ll-IHEXT_SON_ll ; IJE_SON_ll = IJU_SON_ll-IHEXT_SON_ll
-             ELSE
-               IIB_ll   = 1      ; IJB_ll = 1
-               IIE_ll   = IIU_ll ; IJE_ll = IJU_ll
-               !
-               IIB_SON_ll   = 1          ; IJB_SON_ll = 1
-               IIE_SON_ll   = IIU_SON_ll ; IJE_SON_ll = IJU_SON_ll
-             END IF
-
-             MAX_VAL(IPAS)  = MAXVAL( ABS (TAB_SON_ll(IIB_SON_ll-IDIFF_HEXT:IIE_SON_ll+IDIFF_HEXT,&
-                                                   IJB_SON_ll-IDIFF_HEXT:IJE_SON_ll+IDIFF_HEXT) ) )
-             MAX_DIFF(IPAS) = MAXVAL( TAB_ll(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IJB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT))
-             !
-             IF ( MAX_VAL(IPAS) .EQ. 0.0 ) THEN
-               ZDIV=1.0
-             ELSE
-              ZDIV=MAX_VAL(IPAS)
-             END IF
-             IF ( MAX_DIFF(IPAS)/ZDIV > ZPRECISION ) THEN
-                OK(IPAS) = .FALSE.
-             ELSE
-                OK(IPAS) = .TRUE.
-             END IF
-             !
-             !DEALLOCATE(TAB_ll,TAB_SON_ll)
-             !
-          END IF
-       ELSE
-          !
-          ! Reconstruct the all PTAB in TAB_ll
-          !
-          IF (GISXYSIZE_GLOB) THEN
-            CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll)
-            IIU_ll = IIMAX_ll+2*JPHEXT
-            IJU_ll = IJMAX_ll+2*JPHEXT
-            IF (.NOT. ALLOCATED(TAB_ll)) ALLOCATE(TAB_ll(IIU_ll,IJU_ll))
-            CALL GATHERALL_FIELD_ll('XY',ZTAB,TAB_ll,IINFO_ll)
-          ELSE
-             IF (MPPDB_NBPROC_INTRA>2) THEN
-                CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK2D_REAL', &
-                     'only works with 1 process on each side for arrays not of mesh size'//MSG)
-                STOP
-             END IF
-            IIU_ll = SIZE(PTAB,1)
-            IJU_ll = SIZE(PTAB,2)
-            IIMAX_ll = IIU_ll
-            IJMAX_ll = IJU_ll
-            IF (.NOT. ALLOCATED(TAB_ll)) ALLOCATE(TAB_ll(IIU_ll,IJU_ll))
-            TAB_ll(:,:) = ZTAB(:,:)
-          END IF
-          !
-          ! SON WORLD
-          !
-          IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-             !
-             ! first son --> send the good array to the first father
-             !
-             I_FIRST_FATHER = 0
-             IF (GISXYSIZE_GLOB) THEN
-              IHEXT_SON_ll = JPHEXT
-               CALL MPI_BSEND(IHEXT_SON_ll,1,MNHINT_MPI,I_FIRST_FATHER, &
-                    NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-             END IF
-
-             CALL MPI_BSEND(TAB_ll,SIZE(TAB_ll),MNHREAL_MPI,I_FIRST_FATHER, &
-                  NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-          END IF
-       END IF
-
-       CALL MPPDB_BARRIER()
-
-    END DO
-
-    IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-      YMSG=ADJUSTL(MESSAGE)
-
-      IF (NPAS_ll == 1) THEN
-#ifdef _COLOR_OUTPUT
-        IF ( OK(1) ) THEN
-          write(*, '( A29,A22,A40," Error:       ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                achar(27)//'[32mMPPDB_CHECK2D :: OK'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-        ELSE
-          write(*, '( A29,A22,A40," Error:   ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                achar(27)//'[31mMPPDB_CHECK2D :: KO'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-        END IF
-#else
-        IF ( OK(1) ) THEN
-          write(*, '(" MPPDB_CHECK2D :: OK MPPDB_CHECK2D =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-        ELSE
-          write(*, '(" MPPDB_CHECK2D :: KO MPPDB_CHECK2D =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-        END IF
-#endif
-        flush(unit=OUTPUT_UNIT)
-      ELSE IF (NPAS_ll == 2) THEN
-#ifdef _COLOR_OUTPUT
-        IF ( OK(1) .AND. OK(2) ) THEN
-          write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                achar(27)//'[32mMPPDB_CHECK2D :: OK on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-          write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                achar(27)//'[31mMPPDB_CHECK2D :: KO on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(1) ) THEN
-          write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                achar(27)//'[33mMPPDB_CHECK2D :: OK on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(2) ) THEN
-          write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                achar(27)//'[33mMPPDB_CHECK2D :: KO on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        END IF
-#else
-        IF ( OK(1) .AND. OK(2) ) THEN
-          write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                'MPPDB_CHECK2D :: OK on host, OK on device ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-          write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                'MPPDB_CHECK2D :: KO on host, KO on device ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(1) ) THEN
-          write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                'MPPDB_CHECK2D :: OK on host, KO on device ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        ELSE IF ( .NOT.OK(2) ) THEN
-          write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                'MPPDB_CHECK2D :: KO on host, OK on device ',YMSG, &
-                MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-        END IF
-#endif
-        flush(unit=OUTPUT_UNIT)
-      ELSE
-        CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK2D_REAL','NPAS_ll>2 not (yet) implemented')
-      END IF
-      DEALLOCATE(TAB_ll,TAB_SON_ll)
-    END IF
-#endif
-  END SUBROUTINE MPPDB_CHECK2D_REAL
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-  SUBROUTINE MPPDB_CHECKLB(PLB,MESSAGE,PPRECISION,HLBTYPE,KRIM)
-
-    USE MODD_PARAMETERS_ll, ONLY : JPHEXT
-    USE MODD_VAR_ll    , ONLY : NMNH_COMM_WORLD
-    USE MODD_IO ,        ONLY : ISP,ISNPROC,GSMONOPROC,LPACK,L2D
-    USE MODD_MPIF      , ONLY   : MPI_STATUS_IGNORE, MPI_SUM
-
-    USE MODE_DISTRIB_LB
-    USE MODE_TOOLS_ll,     ONLY : GET_GLOBALDIMS_ll
-    USE MODE_MODELN_HANDLER, ONLY : GET_CURRENT_MODEL_INDEX
-    use modd_precision,     only: MNHINT_MPI, MNHREAL_MPI
-    
-    IMPLICIT NONE
-
-    REAL, DIMENSION(:,:,:) , TARGET      :: PLB
-    CHARACTER(len=*)                     :: MESSAGE
-    REAL                                 :: PPRECISION
-    CHARACTER(LEN=*),       INTENT(IN)   ::HLBTYPE! 'LBX','LBXU','LBY' or 'LBYV'
-    INTEGER,                INTENT(IN) ::KRIM  ! size of the LB area
-
-    !
-    ! local var
-    !
-    REAL,ALLOCATABLE, DIMENSION(:,:,:)       :: TAB_ll,TAB_SON_ll,TAB_SAVE_ll
-    REAL,DIMENSION(:,:,:),ALLOCATABLE,TARGET :: Z3D
-    REAL,DIMENSION(:,:,:), POINTER           :: TX3DP
-    INTEGER                              :: IIMAX_ll,IJMAX_ll
-    INTEGER                              :: IIU,IJU,IIU_ll,IJU_ll,IKU_ll
-    INTEGER                              :: IINFO_ll
-
-    INTEGER                              :: I_FIRST_SON
-    INTEGER                              :: I_FIRST_FATHER
-    REAL                                 :: MAX_DIFF , MAX_VAL
-    INTEGER                              :: IIB_ll,IIE_ll,IJB_ll,IJE_ll
-    INTEGER                                  :: JI
-    INTEGER :: IIB,IIE,IJB,IJE
-
-    INTEGER                              :: IIU_SON_ll,IJU_SON_ll,IKU_SON_ll
-    INTEGER                              :: IIB_SON_ll,IIE_SON_ll,IJB_SON_ll,IJE_SON_ll
-    INTEGER                              :: IHEXT_SON_ll , IDIFF_HEXT , IRIM_ll , IRIM_SON_ll
-    INTEGER                              :: IMI , IGLBSIZEPTAB
-
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !get the global size of PLB
-    CALL MPI_ALLREDUCE(SIZE(PLB), IGLBSIZEPTAB, 1,MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll)
-    IF ( IGLBSIZEPTAB == 0 ) RETURN
-    !
-    CALL  MPPDB_BARRIER()
-    !
-    IF(MPPDB_FATHER_WORLD) THEN
-       !
-       ! Reconstruct the all PLB in TAB_ll
-       !
-       CALL GET_GLOBALDIMS_ll (IIMAX_ll,IJMAX_ll)
-       IIU_ll = IIMAX_ll+2*JPHEXT
-       IJU_ll = IJMAX_ll+2*JPHEXT
-       IKU_ll = SIZE(PLB,3)
-       IRIM_ll = MAX(1,KRIM)
-       
-       IF       (HLBTYPE == 'LBX' ) THEN
-          IIU_ll = JPHEXT*2
-       ELSE IF ( HLBTYPE == 'LBXU') THEN
-          IIU_ll = (IRIM_ll+JPHEXT)*2
-       ELSE IF ( HLBTYPE == 'LBY') THEN
-          IJU_ll = JPHEXT*2
-       ELSE IF ( HLBTYPE == 'LBYV') THEN
-          IJU_ll = (IRIM_ll+JPHEXT)*2
-       END IF
-
-       IF (MPPDB_IRANK_WORLD.EQ.0)  THEN
-          ! I/O proc case
-          ALLOCATE(Z3D(IIU_ll,IJU_ll,SIZE(PLB,3)))
-          DO JI = 1,ISNPROC
-             CALL GET_DISTRIB_LB(HLBTYPE,JI,'FM','WRITE',IRIM_ll,IIB,IIE,IJB,IJE)
-             IF (IIB /= 0) THEN
-                TX3DP=>Z3D(IIB:IIE,IJB:IJE,:)
-                IF (ISP /= JI) THEN
-                   CALL MPI_RECV(TX3DP,SIZE(TX3DP),MNHREAL_MPI,JI-1 &
-                        ,99,NMNH_COMM_WORLD,MPI_STATUS_IGNORE,IINFO_ll) 
-                ELSE
-                   CALL GET_DISTRIB_LB(HLBTYPE,JI,'LOC','WRITE',IRIM_ll,IIB,IIE,IJB,IJE)
-                   TX3DP = PLB(IIB:IIE,IJB:IJE,:)
-                END IF
-             END IF
-          END DO
-
-          TX3DP=>Z3D
-
-       ELSE
-          ! Other processors
-          CALL GET_DISTRIB_LB(HLBTYPE,ISP,'LOC','WRITE',IRIM_ll,IIB,IIE,IJB,IJE)
-          IF (IIB /= 0) THEN
-             TX3DP=>PLB(IIB:IIE,IJB:IJE,:)
-             CALL MPI_BSEND(TX3DP,SIZE(TX3DP),MNHREAL_MPI,0,99,NMNH_COMM_WORLD,IINFO_ll)
-          END IF
-       END IF
-
-       IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          !
-          ! I'm the first FATHER => receive the correct global ARRAY from first son
-          !
-          !
-          ! the first son , is the next processus after this 'world' so
-          !
-          I_FIRST_SON = MPPDB_NBPROC_WORLD
-          !
-          ! receive JPHEXT from son if different
-          !
-          CALL MPI_RECV(IHEXT_SON_ll,1,MNHINT_MPI,I_FIRST_SON, &
-               NTAG, MPPDB_INTRA_COMM,MPI_STATUS_IGNORE, IINFO_ll)
-
-          IIU_SON_ll = IIMAX_ll+2*IHEXT_SON_ll
-          IJU_SON_ll = IJMAX_ll+2*IHEXT_SON_ll
-          IKU_SON_ll = SIZE(PLB,3)
-          IRIM_SON_ll = MAX(1,KRIM)
-          !
-          IF       (HLBTYPE == 'LBX' ) THEN
-             IIU_SON_ll = IHEXT_SON_ll*2
-          ELSE IF ( HLBTYPE == 'LBXU') THEN
-             IIU_SON_ll = (IRIM_SON_ll+IHEXT_SON_ll)*2
-          ELSE IF ( HLBTYPE == 'LBY') THEN
-             IJU_SON_ll = IHEXT_SON_ll*2
-          ELSE IF ( HLBTYPE == 'LBYV') THEN
-             IJU_SON_ll = (IRIM_SON_ll+IHEXT_SON_ll)*2
-          END IF          
-          !
-          ALLOCATE(TAB_SON_ll(IIU_SON_ll,IJU_SON_ll,IKU_SON_ll))
-          !
-          CALL MPI_RECV(TAB_SON_ll,SIZE(TAB_SON_ll),MNHREAL_MPI,I_FIRST_SON, &
-               NTAG, MPPDB_INTRA_COMM,MPI_STATUS_IGNORE, IINFO_ll)
-          !
-          IDIFF_HEXT = MIN(JPHEXT,IHEXT_SON_ll)
-          !
-          ALLOCATE(TAB_SAVE_ll(SIZE(Z3D,1),SIZE(Z3D,2),SIZE(Z3D,3)))
-          !
-          IF (HLBTYPE == 'LBX' .OR. HLBTYPE == 'LBXU') THEN
-
-          ELSE
-          END IF
-          IIB_ll   = 1 + JPHEXT    ; IJB_ll = 1 + JPHEXT
-          IIE_ll   = IIU_ll-JPHEXT ; IJE_ll = IJU_ll-JPHEXT
-
-          IIB_SON_ll   = 1 + IHEXT_SON_ll    ; IJB_SON_ll = 1 + IHEXT_SON_ll
-          IIE_SON_ll   = IIU_SON_ll-IHEXT_SON_ll ; IJE_SON_ll = IJU_SON_ll-IHEXT_SON_ll
-          !
-          TAB_SAVE_ll = Z3D
-          Z3D      = 0.0
-          Z3D(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IJB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT,1:IKU_ll)   &
-            = ABS ( TAB_SAVE_ll(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IJB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT,1:IKU_ll) &
-            -       TAB_SON_ll(IIB_SON_ll-IDIFF_HEXT:IIE_SON_ll+IDIFF_HEXT,IJB_SON_ll-IDIFF_HEXT:IJE_SON_ll+IDIFF_HEXT &
-                              ,1:IKU_SON_ll) )
-          !
-          MAX_VAL  = MAXVAL( ABS (TAB_SON_ll(IIB_SON_ll-IDIFF_HEXT:IIE_SON_ll+IDIFF_HEXT,&
-                                             IJB_SON_ll-IDIFF_HEXT:IJE_SON_ll+IDIFF_HEXT,1:IKU_SON_ll) ) )
-          IF ( MAX_VAL .EQ. 0.0 ) MAX_VAL = 1.0
-          !
-          IMI = GET_CURRENT_MODEL_INDEX()
-          MAX_DIFF=MAXVAL(Z3D(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IJB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT,1:IKU_ll)/MAX_VAL)
-          !
-          IF (MAX_DIFF > PPRECISION ) THEN
-             print*," MPPDB_CHECKLB :: KO MPPDB_CHECKLB =", MESSAGE ," Error=",MAX_DIFF , MAX_VAL, IMI
-          ELSE
-             print*," MPPDB_CHECKLB :: OK MPPDB_CHECKLB =", MESSAGE ," Error=",MAX_DIFF , MAX_VAL, IMI
-          END IF
-          flush(unit=OUTPUT_UNIT)
-          !
-          DEALLOCATE(TAB_SON_ll)
-          !
-       END IF
-    ELSE
-       !
-       ! SON WORLD
-       !
-       IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          !
-          ! first son --> send the good array to the first father
-          !
-          I_FIRST_FATHER = 0
-          IHEXT_SON_ll = JPHEXT
-          CALL MPI_BSEND(IHEXT_SON_ll,1,MNHINT_MPI,I_FIRST_FATHER, &
-               NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-          CALL MPI_BSEND(PLB,SIZE(PLB),MNHREAL_MPI,I_FIRST_FATHER, &
-               NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-       END IF
-    END IF
-
-    CALL MPPDB_BARRIER()
-#endif
-  END SUBROUTINE MPPDB_CHECKLB
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-  SUBROUTINE MPPDB_CHECK_SURFEX2D(PTAB,MESSAGE,PPRECISION,KLUOUT,HTYPE,KIU,KJU)
-
-    USE MODD_PARAMETERS, ONLY : JPHEXT
-    USE MODI_GET_1D_MASK
-    USE MODI_UNPACK_SAME_RANK
-    USE MODI_GET_SURF_MASK_n
-    USE MODD_IO_SURF_MNH, ONLY : NHALO
-    USE MODD_MNH_SURFEX_n
-
-    IMPLICIT NONE
-
-    REAL, DIMENSION(:), INTENT(IN)         :: PTAB
-    CHARACTER(len=*), INTENT(IN)           :: MESSAGE
-    REAL, INTENT(IN)                       :: PPRECISION
-    CHARACTER(LEN=*), INTENT(IN),OPTIONAL  :: HTYPE    ! 'WATER', 'NATURE', 'TOWN', 'SEA', 'FULL' (default is 'FULL')
-    INTEGER, INTENT(IN)                    :: KLUOUT   ! output listing logical unit
-    INTEGER, INTENT(IN),OPTIONAL           :: KIU    ! size of local subdomain in X direction, useful in case where GET_INDICE_ll does not give the sire of the desired model (e.g. in pgd2)
-    INTEGER, INTENT(IN),OPTIONAL           :: KJU    ! size of local subdomain in Y direction
-    !
-    ! local var
-    !
-    REAL,ALLOCATABLE, DIMENSION(:)       :: PTAB_UNPACKED
-    REAL,ALLOCATABLE, DIMENSION(:,:)     :: ZFIELD2D
-    INTEGER                              :: IIU,IJU
-    INTEGER                              :: KXOR, KYOR, KXEND, KYEND  ! origin and end of the local physical subdomain
-    INTEGER                              :: II,IJ
-    INTEGER, ALLOCATABLE, DIMENSION(:)       :: KMASK
-    INTEGER                              :: KSIZE
-    INTEGER                              :: KSIZE_FULL
-    !
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !
-!    IF ( SIZE(PTAB) == 0 ) THEN
-!      ALLOCATE(ZFIELD2D(0,0))
-!      RETURN
-    !
-    ! Get the dimensions of the subdomain
-    !
-    IF ( PRESENT(KIU) .AND. PRESENT(KJU) ) THEN
-      IIU = KIU+2*JPHEXT
-      IJU = KJU+2*JPHEXT
-      KSIZE_FULL = KIU*KJU
-    ELSE
-      CALL GET_INDICE_ll( KXOR, KYOR, KXEND, KYEND )
-      IIU = KXEND-KXOR+1+2*JPHEXT
-      IJU = KYEND-KYOR+1+2*JPHEXT
-      KSIZE_FULL = (KXEND-KXOR+1)*(KYEND-KYOR+1)
-      IF ( PRESENT(HTYPE) .AND. KSIZE_FULL /= SIZE(YSURF_CUR%U%XCOVER,1) .AND. NHALO /= JPHEXT ) THEN
-        !IIU = KXEND-KXOR+1+2*JPHEXT+2*NHALO
-        !IJU = KYEND-KYOR+1+2*JPHEXT+2*NHALO
-        KSIZE_FULL = (KXEND-KXOR+1+2*NHALO) * (KYEND-KYOR+1+2*NHALO)
-      ENDIF
-    ENDIF
-    !
-    ! Unpack PTAB
-    !
-    IF(PRESENT(HTYPE)) THEN
-      KSIZE = SIZE( PTAB, 1 )
-      ALLOCATE( KMASK(KSIZE) )
-      ALLOCATE( PTAB_UNPACKED(KSIZE_FULL) )
-      CALL GET_SURF_MASK_n(YSURF_CUR%DTCO,YSURF_CUR%U,HTYPE,KSIZE,KMASK,KSIZE_FULL,KLUOUT)
-      CALL UNPACK_SAME_RANK( KMASK, PTAB, PTAB_UNPACKED )
-    ELSE
-      KSIZE = KSIZE_FULL
-      ALLOCATE( PTAB_UNPACKED(KSIZE) )
-      PTAB_UNPACKED(:) = PTAB(:)
-    ENDIF
-    !
-    ! Redimension PTAB into a 2D field
-    !
-    ALLOCATE(ZFIELD2D(IIU,IJU))
-    ZFIELD2D = 0.
-    DO IJ=1+JPHEXT,IJU-JPHEXT
-      DO II=1+JPHEXT,IIU-JPHEXT
-         IF(PRESENT(HTYPE)) THEN
-            ZFIELD2D(II,IJ) = PTAB_UNPACKED((IJ-JPHEXT-1+NHALO)*(KXEND-KXOR+1+2*NHALO)+II-JPHEXT+NHALO)
-         ELSE
-            ZFIELD2D(II,IJ) = PTAB_UNPACKED((IJ-JPHEXT-1)*(KXEND-KXOR+1)+II-JPHEXT)
-         END IF
-      ENDDO
-    ENDDO
-    !
-    ! Call MPPDB_CHECK2D on ZFIELD3D
-    !
-    IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-      write(6,*) ' MPPDB_CHECK_SURFEX2D :'
-    ENDIF
-    CALL MPPDB_CHECK2D(ZFIELD2D,MESSAGE,PPRECISION)
-
-    IF (ALLOCATED(KMASK)) DEALLOCATE( KMASK )
-    IF (ALLOCATED(PTAB_UNPACKED)) DEALLOCATE( PTAB_UNPACKED )
-    IF (ALLOCATED(ZFIELD2D)) DEALLOCATE( ZFIELD2D )
-    !
-  END SUBROUTINE MPPDB_CHECK_SURFEX2D
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-  SUBROUTINE MPPDB_CHECK_SURFEX3D(PTAB,MESSAGE,PPRECISION,KLUOUT,HTYPE,KZSIZE)
-
-    USE MODD_PARAMETERS, ONLY : JPHEXT
-    USE MODI_GET_1D_MASK
-    USE MODI_UNPACK_SAME_RANK
-    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_STATUS_IGNORE, MPI_MAX, MPI_SUM
-    USE MODD_MNH_SURFEX_n
-    use modd_precision,   only: MNHINT_MPI
-!
-    IMPLICIT NONE
-!
-    REAL, DIMENSION(:,:)               :: PTAB
-    CHARACTER(len=*)                   :: MESSAGE
-    REAL                               :: PPRECISION
-    CHARACTER(LEN=*), INTENT(IN),OPTIONAL  :: HTYPE    ! 'WATER', 'NATURE', 'TOWN', 'SEA', 'FULL' (default is 'FULL')
-    INTEGER, INTENT(IN)                    :: KLUOUT   ! output listing logical unit
-    INTEGER, INTENT(IN),OPTIONAL           :: KZSIZE   ! size of Z-dimension. Necessary if PTAB is of size 0 on one process
-    !
-    ! local var
-    !
-    REAL,ALLOCATABLE, DIMENSION(:,:)       :: PTAB_UNPACKED
-    REAL,ALLOCATABLE, DIMENSION(:,:,:)   :: ZFIELD3D
-    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                              :: KSIZE
-    INTEGER                              :: KSIZEBUF
-    INTEGER                              :: KSIZE_FULL
-    INTEGER                              :: IGLBSIZEPTAB
-    INTEGER                              :: INBSLICES
-    INTEGER                              :: IINFO_ll
-    INTEGER                              :: IKSIZE_ll
-    !
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    CALL MPI_ALLREDUCE(SIZE(PTAB), IGLBSIZEPTAB, 1,MNHINT_MPI, MPI_SUM, MPPDB_INTRA_COMM, IINFO_ll)
-    IF ( IGLBSIZEPTAB == 0 ) RETURN
-    CALL MPI_ALLREDUCE(SIZE(PTAB,2),IKSIZE_ll, 1, MNHINT_MPI, 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 = IKSIZE_ll
-      ALLOCATE(ZFIELD3D(IIU,IJU,IKU))
-      ZFIELD3D = 1.E20
-    ELSE
-      !
-      ! Get the dimensions of the subdomain
-      !
-      CALL GET_INDICE_ll( KXOR, KYOR, KXEND, KYEND )
-      IIU = KXEND-KXOR+1+2*JPHEXT
-      IJU = KYEND-KYOR+1+2*JPHEXT
-      IKU = SIZE(PTAB,2)
-      KSIZE_FULL = (KXEND-KXOR+1)*(KYEND-KYOR+1)
-      IF ( PRESENT(HTYPE) .AND. KSIZE_FULL /= SIZE(YSURF_CUR%U%XCOVER,1) .AND. NHALO /= JPHEXT ) THEN
-        KSIZE_FULL = (KXEND-KXOR+1+2*NHALO) * (KYEND-KYOR+1+2*NHALO)
-      ENDIF
-      !
-      ! Unpack PTAB
-      !
-      IF(PRESENT(HTYPE)) THEN
-        KSIZE = SIZE( PTAB, 1 )
-        ALLOCATE( KMASK(KSIZE) )
-        ALLOCATE( PTAB_UNPACKED(KSIZE_FULL,IKU) )
-        CALL GET_SURF_MASK_n(YSURF_CUR%DTCO,YSURF_CUR%U,HTYPE,KSIZE,KMASK,KSIZE_FULL,KLUOUT)
-        DO II=1,IKU
-          CALL UNPACK_SAME_RANK( KMASK, PTAB(:,II), PTAB_UNPACKED(:,II) )
-        ENDDO
-      ELSE
-        KSIZE = KSIZE_FULL
-        ALLOCATE( PTAB_UNPACKED(KSIZE,IKU) )
-        PTAB_UNPACKED(:,:) = PTAB(:,:)
-      ENDIF
-      !
-      ! Redimension PTAB into a 2D field
-      !
-      ALLOCATE(ZFIELD3D(IIU,IJU,IKU))
-      ZFIELD3D = 0.
-      DO IJ=1+JPHEXT,IJU-JPHEXT
-        DO II=1+JPHEXT,IIU-JPHEXT
-          !ZFIELD3D(II,IJ,:) = PTAB_UNPACKED((IJ-JPHEXT-1)*(KXEND-KXOR+1)+II-JPHEXT,:)
-         ZFIELD3D(II,IJ,:) = PTAB_UNPACKED((IJ-JPHEXT-1+NHALO)*(KXEND-KXOR+1+2*NHALO)+II-JPHEXT+NHALO,:)
-        ENDDO
-      ENDDO
-    ENDIF
-    !
-    ! Call MPPDB_CHECK3D on ZFIELD3D
-    !
-    ! pour eviter de communiquer des tableaux trop grands qui ne passent pas en memoire,
-    ! on "decoupe" le champ en morceaux de taille inferieure a MPI_BUFFER_SIZE*1000000/8
-    !ATTENTION : en fait ça ne suffit pas, il faut prendre une limite plus petite
-    !je choisi arbitrairement 52*102*102 comme limite a la taille globale du champ
-!    IF ( SIZE(ZFIELD3D) > MPI_BUFFER_SIZE*1000000/8 ) THEN
-!      KSIZEBUF = SIZE(ZFIELD3D,3)*8/MPI_BUFFER_SIZE*1000000
-!    IF ( SIZE(ZFIELD3D) > 52*102*102 ) THEN
-    IF ( IGLBSIZEPTAB > MPI_BUFFER_SIZE*1000000/16 ) THEN
-      INBSLICES = IGLBSIZEPTAB/(MPI_BUFFER_SIZE*1000000/16)
-      IF (SIZE(ZFIELD3D,3) >= INBSLICES ) THEN
-        KSIZEBUF = SIZE(ZFIELD3D,3)/INBSLICES
-      ELSE
-        write(6,*) ' MPPDB_CHECK_SURFEX3D : field \"',MESSAGE,'\" is too large to be checked with MPPDB. No checking was done...'
-      ENDIF
-!    IF ( IGLBSIZEPTAB > 52*102*102 ) THEN
-!      INBSLICES = 52
-!      IF (SIZE(ZFIELD3D,3) >=52 ) THEN
-!        KSIZEBUF = SIZE(ZFIELD3D,3)/52
-!      ELSE
-!        KSIZEBUF=1
-!      ENDIF
-      DO IK=1,INBSLICES
-        IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          IF ( KSIZEBUF*INBSLICES==SIZE(ZFIELD3D,3) ) THEN
-            write(6,*) ' MPPDB_CHECK_SURFEX3D part ',IK,'/',INBSLICES,' :'
-          ELSE
-            write(6,*) ' MPPDB_CHECK_SURFEX3D part ',IK,'/',INBSLICES+1,' :'
-          ENDIF
-        ENDIF
-        CALL MPPDB_CHECK3D(ZFIELD3D(:,:,(IK-1)*KSIZEBUF+1:IK*KSIZEBUF),MESSAGE,PPRECISION)
-      ENDDO
-        IF ( KSIZEBUF*INBSLICES==SIZE(ZFIELD3D,3) ) THEN
-        ELSE
-          IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-            write(6,*) ' MPPDB_CHECK_SURFEX3D part ',IK,'/',INBSLICES+1,' :'
-          ENDIF
-        CALL MPPDB_CHECK3D(ZFIELD3D(:,:,KSIZEBUF*INBSLICES+1:),MESSAGE,PPRECISION)
-        ENDIF
-    ELSE
-      IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-        write(6,*) ' MPPDB_CHECK_SURFEX3D :'
-      ENDIF
-      CALL MPPDB_CHECK3D(ZFIELD3D,MESSAGE,PPRECISION)
-    ENDIF
-    IF (ALLOCATED(KMASK)) DEALLOCATE( KMASK )
-    IF (ALLOCATED(PTAB_UNPACKED)) DEALLOCATE( PTAB_UNPACKED )
-    IF (ALLOCATED(ZFIELD3D)) DEALLOCATE( ZFIELD3D )
-    !
-  END SUBROUTINE MPPDB_CHECK_SURFEX3D
-  !
-  !
-  SUBROUTINE CHECK_ISXYSIZE(KX,KY,OISXYSIZE_GLOB)
-    !
-    USE MODD_MPIF,          ONLY: MPI_LAND
-    use modd_precision,     only: MNHLOG_MPI
-    USE MODE_TOOLS_ll,      ONLY: GET_DIM_EXT_ll
-    !
-    IMPLICIT NONE
-    !
-    INTEGER,INTENT(IN)  :: KX,KY
-    LOGICAL,INTENT(OUT) :: OISXYSIZE_GLOB
-    !
-    INTEGER :: IIU, IJU, IINFO_ll
-    LOGICAL :: GISXYSIZE
-    !
-    CALL GET_DIM_EXT_ll('B',IIU,IJU)
-    !Determine if the array has the same size as the mesh
-    IF ( KX==IIU .AND. KY==IJU ) THEN
-      GISXYSIZE = .TRUE.
-    ELSE
-      GISXYSIZE = .FALSE.
-    END IF
-    !
-    CALL MPI_ALLREDUCE(GISXYSIZE,OISXYSIZE_GLOB,1,MNHLOG_MPI,MPI_LAND,MPPDB_INTER_COMM,IINFO_ll)
-    !
-  END SUBROUTINE CHECK_ISXYSIZE
-  !
-END MODULE MODE_MPPDB
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-SUBROUTINE MPPDB_CHECK3D_REAL_MG(PTAB,MESSAGE,PPRECISION)
-    !
-    USE MODD_MPIF,      ONLY: MPI_CHARACTER, MPI_STATUS_IGNORE, MPI_SUM, MPI_MAX
-    use modd_precision, only: MNHINT_MPI, MNHREAL_MPI
-    !
-    USE MODE_DEVICE
-    !
-    USE MODE_MPPDB, ONLY: NMAXMSGLEN,NMAXPAS,NTAG
-    USE MODE_MPPDB, ONLY: mppdb_initialized,mppdb_actived,xprecision
-    USE MODE_MPPDB, ONLY: mppdb_inter_comm,mppdb_nbproc_intra,mppdb_intra_comm
-    USE MODE_MPPDB, ONLY: mppdb_father_world,mppdb_irank_world,mppdb_nbproc_world
-    USE MODE_MPPDB, ONLY: mppdb_barrier
-    USE mode_msg
-    use modi_tools_c
-    use ISO_FORTRAN_ENV, only: OUTPUT_UNIT
-    !
-    IMPLICIT NONE
-    !
-    REAL,DIMENSION(:,:,:),INTENT(IN) :: PTAB
-    CHARACTER(LEN=*), INTENT(IN) :: MESSAGE
-    REAL,OPTIONAL,    INTENT(IN) :: PPRECISION
-    !
-    CHARACTER(len=40)                                  :: YMSG
-    CHARACTER(len=NMAXMSGLEN)                          :: MSG
-    CHARACTER(len=NMAXMSGLEN),DIMENSION(:),ALLOCATABLE :: ALLMSG
-    INTEGER                                            :: IINFO_ll
-    INTEGER                                            :: I_FIRST_FATHER, I_FIRST_SON
-    INTEGER                                            :: IPAS,NPAS,NPAS_ll
-    INTEGER                                            :: IGLBSIZEPTAB
-    INTEGER                                            :: ISIZEOTHER
-    LOGICAL                                            :: G_PTAB_ON_DEVICE
-    LOGICAL,DIMENSION(NMAXPAS)                         :: OK
-    REAL                                               :: ZDIV
-    REAL                                               :: ZPRECISION
-    REAL,DIMENSION(NMAXPAS)                            :: MAX_DIFF , MAX_VAL
-    REAL, DIMENSION(SIZE(PTAB,1),SIZE(PTAB,2),SIZE(PTAB,3)) :: ZTAB_SON
-    REAL, DIMENSION(SIZE(PTAB,1),SIZE(PTAB,2),SIZE(PTAB,3),2) :: ZTAB_DIFF
-    !
-    REAL, ALLOCATABLE , DIMENSION(:,:,:) :: ZTAB
-    !
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !
-    IF ( PRESENT(PPRECISION) ) THEN
-      ZPRECISION = PPRECISION
-    ELSE
-      ZPRECISION = XPRECISION
-    END IF
-    !
-    !get the global size of PTAB
-    CALL MPI_ALLREDUCE(SIZE(PTAB), IGLBSIZEPTAB, 1,MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll)
-    IF ( IGLBSIZEPTAB == 0 ) RETURN
-    !
-    ALLOCATE(ZTAB(SIZE(PTAB,1),SIZE(PTAB,2),SIZE(PTAB,3)))
-    !
-    CALL MPPDB_BARRIER()
-    !
-    !
-    ALLOCATE(ALLMSG(MPPDB_NBPROC_INTRA))
-    MSG = MESSAGE
-    CALL MPI_ALLGATHER(MSG,LEN(MSG),MPI_CHARACTER,ALLMSG,LEN(MSG),MPI_CHARACTER,MPPDB_INTRA_COMM,IINFO_ll)
-    DO IPAS = 1, MPPDB_NBPROC_INTRA
-      IF ( ALLMSG(IPAS) /= MSG ) &
-        CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK3D_REAL_MG','message not similar on all processes (' &
-                       //TRIM(ALLMSG(IPAS))//' vs '//TRIM(MSG)//')')
-    END DO
-    DEALLOCATE(ALLMSG)
-    !
-    !implemented for only 1 process on each side
-    IF (MPPDB_NBPROC_INTRA>2) THEN
-      IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-         CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_REAL_MG','only works with 1 process on each side'//MSG)
-      END IF
-      CALL MPPDB_BARRIER()
-      RETURN
-    END IF
-    !
-    CALL GET_FROM_DEVICE(PTAB,ZTAB,G_PTAB_ON_DEVICE)
-    !
-    NPAS = 1
-    IF (G_PTAB_ON_DEVICE) NPAS=2
-    CALL MPI_ALLREDUCE(NPAS,NPAS_ll,1,MNHINT_MPI,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll)
-    !
-    IF (NPAS_ll>NMAXPAS) THEN
-      NPAS_ll = NMAXPAS
-      CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_REAL_MG','NPAS_ll reduced')
-    END IF
-    !
-    MAX_DIFF(:) = 0.0
-    !
-    DO IPAS=1,NPAS_ll
-      IF ((IPAS.EQ.2) .AND. G_PTAB_ON_DEVICE ) ZTAB = PTAB ! the 2 time test the value on host
-      !
-      IF(MPPDB_FATHER_WORLD) THEN
-        IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          I_FIRST_SON = MPPDB_NBPROC_WORLD
-          CALL MPI_SENDRECV(SIZE(ZTAB),1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-                            ISIZEOTHER,1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-                            MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-          IF (SIZE(ZTAB)==ISIZEOTHER) THEN
-            CALL MPI_RECV(ZTAB_SON,SIZE(ZTAB_SON),MNHREAL_MPI,I_FIRST_SON, &
-                    NTAG,MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-            ZTAB_DIFF(:,:,:,IPAS) = ABS ( ZTAB(:,:,:) - ZTAB_SON(:,:,:) )
-            MAX_VAL(IPAS)  = MAXVAL( ABS (ZTAB_SON) )
-            MAX_DIFF(IPAS) = MAXVAL( ZTAB_DIFF (:,:,:,IPAS) )
-            !
-            IF ( MAX_VAL(IPAS) .EQ. 0.0 ) THEN
-              ZDIV=1.0
-            ELSE
-              ZDIV=MAX_VAL(IPAS)
-            END IF
-            IF ( MAX_DIFF(IPAS)/ZDIV > ZPRECISION ) THEN
-              OK(IPAS) = .FALSE.
-            ELSE
-              OK(IPAS) = .TRUE.
-            END IF
-          END IF
-        END IF
-      ELSE
-        I_FIRST_FATHER = 0
-        CALL MPI_SENDRECV(SIZE(ZTAB),1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-                          ISIZEOTHER,1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-                          MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-        IF (SIZE(ZTAB)==ISIZEOTHER) THEN
-          CALL MPI_SEND(ZTAB,SIZE(ZTAB),MNHREAL_MPI,I_FIRST_FATHER, &
-                        NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-        END IF
-      END IF
-      !
-      CALL MPPDB_BARRIER()
-      !
-    END DO
-    !
-    IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-      YMSG=ADJUSTL(MESSAGE)
-      IF (SIZE(ZTAB)==ISIZEOTHER) THEN
-        IF (NPAS_ll == 1) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) ) THEN
-            write(*, '( A29,A22,A40," Error:       ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                  achar(27)//'[32mMPPDB_CHECKMG :: OK'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-          ELSE
-            write(*, '( A29,A22,A40," Error:       ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                achar(27)//'[31mMPPDB_CHECKMG :: KO'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-          END IF
-#else
-          IF ( OK(1) ) THEN
-            write(*, '(" MPPDB_CHECKMG :: OK MPPDB_CHECKMG =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) &
-                  MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-          ELSE
-            write(*, '(" MPPDB_CHECKMG :: KO MPPDB_CHECKMG =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) &
-                  MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE IF (NPAS_ll == 2) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[32mMPPDB_CHECKMG :: OK on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A519,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8,"LOC=",3I4.3," ",3I4.3 )' ) &
-                  achar(27)//'[31mMPPDB_CHECKMG :: KO on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1),&
-                  MAXLOC(ZTAB_DIFF(:,:,:,2)),MAXLOC(ZTAB_DIFF(:,:,:,1))
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[33mMPPDB_CHECKMG :: OK on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[33mMPPDB_CHECKMG :: KO on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          END IF
-#else
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHECKMG :: OK on host, OK on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHECKMG :: KO on host, KO on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHECKMG :: OK on host, KO on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHECKMG :: KO on host, OK on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE
-          CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECKMG','NPAS_ll>2 not (yet) implemented')
-        END IF
-      ELSE
-#ifdef _COLOR_OUTPUT
-        WRITE (*,'( A,I10,I10,A40 )') achar(27)//'[31mMPPDB_CHECKMG :: KO: array sizes different on 2 sides'//achar(27)//'[0m ',&
-                                  SIZE(ZTAB),ISIZEOTHER,YMSG
-#else
-        WRITE (*,'( A,I10,I10,A40 )') 'MPPDB_CHECKMG :: KO: array sizes different on 2 sides',SIZE(ZTAB),ISIZEOTHER,YMSG
-#endif
-      END IF
-    END IF
-#endif
-  END SUBROUTINE MPPDB_CHECK3D_REAL_MG
-
-  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-  SUBROUTINE MPPDB_CHECK0D_REAL_MG(PTAB,MESSAGE,PPRECISION)
-    !
-    USE MODD_MPIF,      ONLY: MPI_CHARACTER, MPI_STATUS_IGNORE, MPI_SUM, MPI_MAX
-    use modd_precision, only: MNHINT_MPI, MNHREAL_MPI
-    !
-    USE MODE_DEVICE
-    !
-    USE MODE_MPPDB, ONLY: NMAXMSGLEN,NMAXPAS,NTAG
-    USE MODE_MPPDB, ONLY: mppdb_initialized,mppdb_actived,xprecision
-    USE MODE_MPPDB, ONLY: mppdb_inter_comm,mppdb_nbproc_intra,mppdb_intra_comm
-    USE MODE_MPPDB, ONLY: mppdb_father_world,mppdb_irank_world,mppdb_nbproc_world
-    USE MODE_MPPDB, ONLY: mppdb_barrier
-    USE mode_msg
-    use modi_tools_c
-    use ISO_FORTRAN_ENV, only: OUTPUT_UNIT
-    !
-    IMPLICIT NONE
-    !
-    REAL             ,INTENT(IN) :: PTAB
-    CHARACTER(LEN=*), INTENT(IN) :: MESSAGE
-    REAL,OPTIONAL,    INTENT(IN) :: PPRECISION
-    !
-    ! local variable
-    CHARACTER(len=40)                                  :: YMSG
-    CHARACTER(len=NMAXMSGLEN)                          :: MSG
-    CHARACTER(len=NMAXMSGLEN),DIMENSION(:),ALLOCATABLE :: ALLMSG
-    INTEGER                                            :: IINFO_ll
-    INTEGER                                            :: I_FIRST_FATHER, I_FIRST_SON
-    INTEGER                                            :: IPAS,NPAS,NPAS_ll
-    INTEGER                                            :: IGLBSIZEPTAB
-    INTEGER                                            :: ISIZEOTHER
-    LOGICAL                                            :: G_PTAB_ON_DEVICE
-    LOGICAL,DIMENSION(NMAXPAS)                         :: OK
-    REAL                                               :: ZDIV
-    REAL                                               :: ZPRECISION
-    REAL,DIMENSION(NMAXPAS)                            :: MAX_DIFF , MAX_VAL
-    REAL                                               :: ZTAB_SON
-    REAL, DIMENSION(2) :: ZTAB_DIFF
-    !
-    REAL                                                :: ZTAB
-    !
-#ifdef MNH_SP4
-    !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ...
-    RETURN
-#else
-    IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN
-    !
-    IF ( PRESENT(PPRECISION) ) THEN
-      ZPRECISION = PPRECISION
-    ELSE
-      ZPRECISION = XPRECISION
-    END IF
-    !
-    CALL MPPDB_BARRIER()
-    !
-    !
-    ALLOCATE(ALLMSG(MPPDB_NBPROC_INTRA))
-    MSG = MESSAGE
-    CALL MPI_ALLGATHER(MSG,LEN(MSG),MPI_CHARACTER,ALLMSG,LEN(MSG),MPI_CHARACTER,MPPDB_INTRA_COMM,IINFO_ll)
-    DO IPAS = 1, MPPDB_NBPROC_INTRA
-      IF ( ALLMSG(IPAS) /= MSG ) &
-        CALL PRINT_MSG(NVERB_FATAL,'GEN','MPPDB_CHECK3D_REAL_MG','message not similar on all processes (' &
-                       //TRIM(ALLMSG(IPAS))//' vs '//TRIM(MSG)//')')
-    END DO
-    DEALLOCATE(ALLMSG)
-    !
-    !implemented for only 1 process on each side
-!!$    IF (MPPDB_NBPROC_INTRA>2) THEN
-!!$      IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-!!$         CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_REAL_MG','only works with 1 process on each side'//MSG)
-!!$      END IF
-!!$      CALL MPPDB_BARRIER()
-!!$      RETURN
-!!$    END IF
-!!$    !
-!!$    CALL GET_FROM_DEVICE(PTAB,ZTAB,G_PTAB_ON_DEVICE)
-    !
-    ZTAB = PTAB
-    G_PTAB_ON_DEVICE = .FALSE.
-    NPAS = 1
-    IF (G_PTAB_ON_DEVICE) NPAS=2
-    CALL MPI_ALLREDUCE(NPAS,NPAS_ll,1,MNHINT_MPI,MPI_MAX,MPPDB_INTRA_COMM,IINFO_ll)
-    !
-    IF (NPAS_ll>NMAXPAS) THEN
-      NPAS_ll = NMAXPAS
-      CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHECK3D_REAL_MG','NPAS_ll reduced')
-    END IF
-    !
-    MAX_DIFF(:) = 0.0
-    !
-    DO IPAS=1,NPAS_ll
-      IF ((IPAS.EQ.2) .AND. G_PTAB_ON_DEVICE ) ZTAB = PTAB ! the 2 time test the value on host
-      !
-      IF(MPPDB_FATHER_WORLD) THEN
-        IF (MPPDB_IRANK_WORLD.EQ.0) THEN
-          I_FIRST_SON = MPPDB_NBPROC_WORLD
-!!$          CALL MPI_SENDRECV(SIZE(ZTAB),1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-!!$                            ISIZEOTHER,1,MNHINT_MPI,I_FIRST_SON,NTAG, &
-!!$                            MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-!!$          IF (SIZE(ZTAB)==ISIZEOTHER) THEN
-            CALL MPI_RECV(ZTAB_SON,1,MNHREAL_MPI,I_FIRST_SON, &
-                    NTAG,MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-            ZTAB_DIFF(IPAS) = ABS ( ZTAB - ZTAB_SON )
-            MAX_VAL(IPAS)  = ABS (ZTAB_SON) 
-            MAX_DIFF(IPAS) = ZTAB_DIFF(IPAS)
-            !
-            IF ( MAX_VAL(IPAS) .EQ. 0.0 ) THEN
-              ZDIV=1.0
-            ELSE
-              ZDIV=MAX_VAL(IPAS)
-            END IF
-            IF ( MAX_DIFF(IPAS)/ZDIV > ZPRECISION ) THEN
-              OK(IPAS) = .FALSE.
-            ELSE
-              OK(IPAS) = .TRUE.
-            END IF
-!!$          END IF
-        END IF
-      ELSE
-        I_FIRST_FATHER = 0
-!!$        CALL MPI_SENDRECV(SIZE(ZTAB),1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-!!$                          ISIZEOTHER,1,MNHINT_MPI,I_FIRST_FATHER,NTAG, &
-!!$                          MPPDB_INTRA_COMM,MPI_STATUS_IGNORE,IINFO_ll)
-!!$        IF (SIZE(ZTAB)==ISIZEOTHER) THEN
-          CALL MPI_SEND(ZTAB,1,MNHREAL_MPI,I_FIRST_FATHER, &
-                        NTAG, MPPDB_INTRA_COMM, IINFO_ll)
-!!$        END IF
-      END IF
-      !
-      CALL MPPDB_BARRIER()
-      !
-    END DO
-    !
-    IF (MPPDB_FATHER_WORLD .AND. MPPDB_IRANK_WORLD.EQ.0) THEN
-      YMSG=ADJUSTL(MESSAGE)
-!!$      IF (SIZE(ZTAB)==ISIZEOTHER) THEN
-        IF (NPAS_ll == 1) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) ) THEN
-            write(*, '( A29,A22,A40," Error:       ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                  achar(27)//'[32mMPPDB_CHEC0MG :: OK'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-          ELSE
-            write(*, '( A29,A22,A40," Error:       ",e15.8,"                        MAXVAL= ",e15.8 )' ) &
-                achar(27)//'[31mMPPDB_CHEC0MG :: KO'//achar(27)//'[0m ','',YMSG, MAX_DIFF(1),MAX_VAL(1)
-          END IF
-#else
-          IF ( OK(1) ) THEN
-            write(*, '(" MPPDB_CHEC0MG :: OK MPPDB_CHEC0MG =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) &
-                  MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-          ELSE
-            write(*, '(" MPPDB_CHEC0MG :: KO MPPDB_CHEC0MG =",A40," Error=",e15.8," MAXVAL=",e15.8)' ) &
-                  MESSAGE,MAX_DIFF(1),MAX_VAL(1)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE IF (NPAS_ll == 2) THEN
-#ifdef _COLOR_OUTPUT
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[32mMPPDB_CHEC0MG :: OK on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[31mMPPDB_CHEC0MG :: KO on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[33mMPPDB_CHEC0MG :: OK on host, KO on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A51,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  achar(27)//'[33mMPPDB_CHEC0MG :: KO on host, OK on device'//achar(27)//'[0m ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          END IF
-#else
-          IF ( OK(1) .AND. OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHEC0MG :: OK on host, OK on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) .AND. .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHEC0MG :: KO on host, KO on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(1) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHEC0MG :: OK on host, KO on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          ELSE IF ( .NOT.OK(2) ) THEN
-            write(*, '( A42,A40," Errors: host=",e15.8," device=",e15.8," MAXVALS=",e15.8,e15.8 )' ) &
-                  'MPPDB_CHEC0MG :: KO on host, OK on device ',YMSG, &
-                  MAX_DIFF(2),MAX_DIFF(1),MAX_VAL(2),MAX_VAL(1)
-          END IF
-#endif
-          flush(unit=OUTPUT_UNIT)
-        ELSE
-          CALL PRINT_MSG(NVERB_WARNING,'GEN','MPPDB_CHEC0MG','NPAS_ll>2 not (yet) implemented')
-        END IF
-!!$      ELSE
-!!$#ifdef _COLOR_OUTPUT
-!!$        WRITE (*,'( A,I10,I10,A40 )') achar(27)//'[31mMPPDB_CHEC0MG :: KO: array sizes different on 2 sides'//achar(27)//'[0m ',&
-!!$                                  SIZE(ZTAB),ISIZEOTHER,YMSG
-!!$#else
-!!$        WRITE (*,'( A,I10,I10,A40 )') 'MPPDB_CHEC0MG :: KO: array sizes different on 2 sides',SIZE(ZTAB),ISIZEOTHER,YMSG
-!!$#endif
-!!$      END IF
-    END IF
-#endif
-  END SUBROUTINE MPPDB_CHECK0D_REAL_MG