!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
!#####################
MODULE MODI_BOUNDARIES
!#####################
!
INTERFACE
!
      SUBROUTINE BOUNDARIES (                                       &
            PTSTEP,HLBCX,HLBCY,KRR,KSV,KTCOUNT,                     &
            PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,   &
            PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,   &
            PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS,   &
            PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS,   &
            PRHODJ,PRHODREF,                                        &
            PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT                   )
!
REAL,                  INTENT(IN) :: PTSTEP        ! time step dt
CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY   ! X and Y-direc. LBC type
!
INTEGER,               INTENT(IN) :: KRR           ! Number of moist  variables
INTEGER,               INTENT(IN) :: KSV           ! Number of Scalar Variables
INTEGER,               INTENT(IN) :: KTCOUNT       ! Temporal loop COUNTer
                                                   ! (=1 at the segment beginning)
!
! Lateral Boundary fields at time t
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTHM              ! Mass
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYUM,PLBYVM,PLBYWM ! Wind
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTHM              ! Mass
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTKEM          ! TKE
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTKEM
REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
! temporal derivative of the Lateral Boundary fields
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS ! Wind
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTHS              ! Mass
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS ! Wind
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTHS              ! Mass
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTKES          ! TKE
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTKES
REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBXRS  ,PLBXSVS  ! Moisture and SV
REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBYRS  ,PLBYSVS  ! in x and y-dir.
!
REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODJ    ! Jacobian * dry density of
                                                  !  the reference state
REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODREF
!
REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT
                                                      ! Variables at t
!
END SUBROUTINE BOUNDARIES
!
END INTERFACE
!

END MODULE MODI_BOUNDARIES
!
!
!     ####################################################################
      SUBROUTINE BOUNDARIES (                                       &
            PTSTEP,HLBCX,HLBCY,KRR,KSV,KTCOUNT,                     &
            PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM,   &
            PLBYUM,PLBYVM,PLBYWM,PLBYTHM,PLBYTKEM,PLBYRM,PLBYSVM,   &
            PLBXUS,PLBXVS,PLBXWS,PLBXTHS,PLBXTKES,PLBXRS,PLBXSVS,   &
            PLBYUS,PLBYVS,PLBYWS,PLBYTHS,PLBYTKES,PLBYRS,PLBYSVS,   &
            PRHODJ,PRHODREF,                                        &
            PUT,PVT,PWT,PTHT,PTKET,PRT,PSVT,PSRCT                   )
!     ####################################################################
!
!!****  *BOUNDARIES* - routine to prepare the Lateral Boundary Conditions for
!!                 all variables at a scalar localization relative to the 
!!                 considered boundary.
!!
!!    PURPOSE
!!    -------
!       Fill up the left and right lateral EXTernal zones, for all prognostic
!       variables, at time t and t-dt, to avoid particular cases close to
!       the Lateral Boundaries in routines computing the evolution terms, in
!       particular in the advection routines.
!
!!**  METHOD
!!    ------
!!      3 different options are proposed: 'WALL' 'CYCL' 'OPEN'
!!                    to define the Boundary Condition type,
!!      though the variables HLBCX and HLBCY (for the X and Y-directions
!!      respectively).
!!       For the 'OPEN' type of LBC, the treatment depends
!!      on the flow configuration: i.e. INFLOW or OUTFLOW conditions.
!!   
!!    EXTERNAL 
!!    --------  
!!    GET_INDICE_ll  : get physical sub-domain bounds
!!    LWEAST_ll,LEAST_ll,LNORTH_ll,LSOUTH_ll : position functions
!!
!!    IMPLICIT ARGUMENTS
!!    ------------------  
!!      Module MODD_PARAMETERS : 
!!        JPHEXT ,JPVEXT 
!!
!!      Module MODD_CONF :
!!        CCONF
!!
!!      Module MODE_UPDATE_NSV :
!!        NSV_CHEM, NSV_CHEMBEG, NSV_CHEMEND
!!
!!      Module MODD_CTURB :
!!        XTKEMIN 
!!
!!    REFERENCE
!!    ---------
!!      Book1 and book2 of documentation (routine BOUNDARIES)
!!
!!    AUTHOR
!!    ------
!!	J.-P. Lafore J. Stein     * Meteo France *
!!
!!    MODIFICATIONS
!!    -------------
!!      Original        17/10/94 
!!      Modification    02/11/94  (J.Stein) copy for t-dt at the external points
!!                                          + change the copy formulation
!!      Modification    18/11/94  (J.Stein) bug correction in the normal velocity
!!                                          prescription in the WALL cases
!!      Modification    13/02/95  (Lafore)  to account for the OPEN case and
!!                                          for the LS fields introduction
!!      Modification    03/03/95  (Mallet)  corrections in variables names in 
!!                                          the Y-OPEN case
!!                      16/03/95  (J.Stein) remove R from the historical variables
!!      Modification    31/05/95  (Lafore)  MASTER_DEV2.1 preparation after the
!!                                          LBC tests performed by I. Mallet
!!      Modification    15/03/96  (Richard) bug correction for OPEN CASE: (TOP Y-LBC)
!!                                          Rv case 
!!      Modification    15/03/96  (Shure)   bug correction for SV variable in
!!                                          open x  right case
!!      Modification    24/10/96  (Masson)  initialization of outer points in
!!                                          wall cases for spawning interpolations
!!      Modification    13/03/97  (Lafore)  "surfacic" LS-fields introduction
!!      Modification    10/04/97  (Lafore)  proper treatment of minima for TKE and EPS
!!      Modification    01/09/97  (Masson)  minimum value for water and passive
!!                                          scalars set to zero at instants M,T
!!      Modification    20/10/97  (Lafore)  introduction of DAVI type of lbc
!!                                           suppression of NEST type
!!      Modification    12/11/97  ( Stein ) use the lB fields
!!      Modification    02/06/98  (Lafore)  declaration of local variables (PLBXUM
!!                                          and PLBXWM do'nt have the same size)
!!      Modification    24/08/98   (Jabouille) parallelize the code 
!!      Modification    20/04/99  ( Stein ) use the same conditions for times t
!!                                          and t-dt
!!      Modification    11/04/00  (Mari)    special conditions for chemical variables
!!      Modification    10/01/01  (Tulet)   update for MOCAGE boundary conditions
!!      Modification    22/01/01  (Gazen)   use NSV_CHEM,NSV_CHEMBEG,NSV_CHEMEND variables
!!      Modification    22/06/01(Jabouille) use XSVMIN
!!      Modification    20/11/01(Gazen & Escobar) rewrite GCHBOUNDARY for portability
!!      Modification    14/03/05 (Tulet)    bug : in case of CYCL do not call ch_boundaries
!!      Modification    14/05/05 (Tulet)    add aerosols / dust
!!      Modification    05/06               Suppression of DAVI type of lbc
!!      Modification    05/06               Remove EPS
!!      Modification    12/2010  (Chong)    Add boundary condition for ions
!!                                          (fair weather profiles)
!!      Modification    07/2013  (Bosseur & Filippi) adds Forefire
!!      Modification    04/2013  (C.Lac)    Remove instant M               
!!      Modification    01/2015  (JL Redelsperger) Introduction of ponderation
!!                                 for non normal velocity and potential temp
!!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
!!      Redelsperger & Pianezze : 08/2015 : add XPOND coefficient
!!      Modification    01/2016  (JP Pinty) Add LIMA that is LBC for CCN and IFN
!!      Modification    18/07/17 (Vionnet)  Add blowing snow variables 
!!      Modification    01/2018  (JL Redelsperger) Correction for TKE treatment
!!      Modification    03/02/2020 (B. ViƩ)  Correction for SV with LIMA
!  P. Wautelet 04/06/2020: correct call to Set_conc_lima
!-------------------------------------------------------------------------------
!
!*       0.    DECLARATIONS
!         
USE MODD_BLOWSNOW,  ONLY : LBLOWSNOW,NBLOWSNOW_2D
USE MODD_BLOWSNOW_n
USE MODD_CH_AEROSOL , ONLY : LORILAM
USE MODD_CH_MNHC_n,   ONLY : LUSECHEM, LUSECHIC
USE MODD_CONDSAMP,    ONLY : LCONDSAMP
USE MODD_CONF
USE MODD_CTURB
USE MODD_DUST
USE MODD_GRID_n,    ONLY : XZZ
USE MODD_ELEC_DESCR
USE MODD_ELEC_n
#ifdef MNH_FOREFIRE
USE MODD_FOREFIRE,   ONLY : LFOREFIRE
#endif
USE MODD_LBC_n,      ONLY : XPOND
USE MODE_ll
USE MODD_NESTING,      ONLY : NDAD
USE MODD_NSV
USE MODD_PARAMETERS
USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, LBOUND
USE MODD_PARAM_n,    ONLY : CELEC,CCLOUD
USE MODD_PASPOL,      ONLY : LPASPOL
USE MODD_PRECISION,   ONLY: MNHREAL32
USE MODD_REF_n
USE MODD_SALT,        ONLY : LSALT

USE MODE_MODELN_HANDLER
USE MODE_SET_CONC_LIMA

USE MODI_CH_BOUNDARIES
USE MODI_INIT_AEROSOL_CONCENTRATION
USE MODI_ION_BOUNDARIES

IMPLICIT NONE
!
!
!*       0.1   declarations of arguments
!
!
!
!
REAL,                  INTENT(IN) :: PTSTEP        ! time step dt
CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY   ! X and Y-direc. LBC type
!
INTEGER,               INTENT(IN) :: KRR           ! Number of moist  variables
INTEGER,               INTENT(IN) :: KSV           ! Number of Scalar Variables
INTEGER,               INTENT(IN) :: KTCOUNT       ! Temporal loop COUNTer
                                                   ! (=1 at the segment beginning)
!
! Lateral Boundary fields at time t
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXUM,PLBXVM,PLBXWM ! Wind
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTHM              ! Mass
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYUM,PLBYVM,PLBYWM ! Wind
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTHM              ! Mass
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTKEM          ! TKE
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTKEM
REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBXRM  ,PLBXSVM  ! Moisture and SV
REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBYRM  ,PLBYSVM  ! in x and y-dir.
! temporal derivative of the Lateral Boundary fields
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXUS,PLBXVS,PLBXWS ! Wind
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTHS              ! Mass
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYUS,PLBYVS,PLBYWS ! Wind
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTHS              ! Mass
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBXTKES          ! TKE
REAL, DIMENSION(:,:,:),          INTENT(IN) :: PLBYTKES
REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBXRS  ,PLBXSVS  ! Moisture and SV
REAL, DIMENSION(:,:,:,:),        INTENT(IN) :: PLBYRS  ,PLBYSVS  ! in x and y-dir.
!
REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODJ    ! Jacobian * dry density of
                                                  !  the reference state
REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODREF
!
REAL, DIMENSION(:,:,:),   INTENT(INOUT) :: PUT,PVT,PWT,PTHT,PTKET,PSRCT
REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT,PSVT
                                                      ! Variables at t
!
!*       0.2   declarations of local variables
!
INTEGER             :: IIB       ! indice I Beginning in x direction
INTEGER             :: IJB       ! indice J Beginning in y direction
INTEGER             :: IKB       ! indice K Beginning in z direction
INTEGER             :: IIE       ! indice I End       in x direction 
INTEGER             :: IJE       ! indice J End       in y direction 
INTEGER             :: IKE       ! indice K End       in z direction 
INTEGER             :: JEXT      ! Loop index for EXTernal points
INTEGER             :: JRR       ! Loop index for RR variables (water)
INTEGER             :: JSV       ! Loop index for Scalar Variables
INTEGER             :: IMI       ! Model Index
REAL                :: ZTSTEP    ! effective time step
REAL                :: ZPOND      !  Coeff PONDERATION LS 
INTEGER             :: ILBX,ILBY ! size of LB fields' arrays
LOGICAL, SAVE, DIMENSION(:), ALLOCATABLE :: GCHBOUNDARY, GAERBOUNDARY,&
                    GDSTBOUNDARY, GSLTBOUNDARY, GPPBOUNDARY,          &
                    GCSBOUNDARY, GICBOUNDARY, GLIMABOUNDARY,GSNWBOUNDARY 
LOGICAL, SAVE        :: GFIRSTCALL1 = .TRUE.
LOGICAL, SAVE        :: GFIRSTCALL2 = .TRUE.
LOGICAL, SAVE        :: GFIRSTCALL3 = .TRUE.
LOGICAL, SAVE        :: GFIRSTCALL5 = .TRUE. 
LOGICAL, SAVE        :: GFIRSTCALLPP = .TRUE.                         
LOGICAL, SAVE        :: GFIRSTCALLCS = .TRUE.                         
LOGICAL, SAVE        :: GFIRSTCALLIC = .TRUE.                 
LOGICAL, SAVE        :: GFIRSTCALLLIMA = .TRUE.                 
!
REAL, DIMENSION(SIZE(PLBXWM,1),SIZE(PLBXWM,2),SIZE(PLBXWM,3)) ::  &
                       ZLBXVT,ZLBXWT,ZLBXTHT
REAL, DIMENSION(SIZE(PLBYWM,1),SIZE(PLBYWM,2),SIZE(PLBYWM,3)) ::  &
                       ZLBYUT,ZLBYWT,ZLBYTHT
REAL, DIMENSION(SIZE(PLBXTKEM,1),SIZE(PLBXTKEM,2),SIZE(PLBXTKEM,3)) ::  &
                       ZLBXTKET
REAL, DIMENSION(SIZE(PLBYTKEM,1),SIZE(PLBYTKEM,2),SIZE(PLBYTKEM,3)) ::  &
                       ZLBYTKET
REAL, DIMENSION(SIZE(PLBXRM,1),SIZE(PLBXRM,2),SIZE(PLBXRM,3),SIZE(PLBXRM,4)) :: &
                       ZLBXRT
REAL, DIMENSION(SIZE(PLBYRM,1),SIZE(PLBYRM,2),SIZE(PLBYRM,3),SIZE(PLBYRM,4)) :: &
                       ZLBYRT
REAL, DIMENSION(SIZE(PLBXSVM,1),SIZE(PLBXSVM,2),SIZE(PLBXSVM,3),SIZE(PLBXSVM,4)) :: &
                       ZLBXSVT
REAL, DIMENSION(SIZE(PLBYSVM,1),SIZE(PLBYSVM,2),SIZE(PLBYSVM,3),SIZE(PLBYSVM,4)) :: &
                       ZLBYSVT
LOGICAL              :: GCHTMP
LOGICAL              :: GPPTMP
LOGICAL              :: GCSTMP
!
LOGICAL, SAVE        :: GFIRSTCALL4 = .TRUE.
!
#ifdef MNH_FOREFIRE
LOGICAL, SAVE, DIMENSION(:), ALLOCATABLE ::  GFFBOUNDARY
LOGICAL, SAVE        :: GFIRSTCALLFF = .TRUE.                         
LOGICAL              :: GFFTMP
#endif
!
INTEGER              :: JI,JJ
!
REAL, DIMENSION(SIZE(PSVT,1),SIZE(PSVT,2),SIZE(PSVT,3),SIZE(PSVT,4)) :: ZSVT
REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) :: ZRT
!
!-------------------------------------------------------------------------------
!
!*       1.    COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES:
!              ----------------------------------------------
CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
IKB = 1 + JPVEXT
IKE = SIZE(PUT,3) - JPVEXT
IMI = GET_CURRENT_MODEL_INDEX()
!
!-------------------------------------------------------------------------------
!
!*       2.    UPPER AND LOWER BC FILLING:   
!              ---------------------------
!
!*       2.1    COMPUTE THE FIELD EXTRAPOLATIONS AT THE GROUND
!

!
!          at the instant t
!
IF(SIZE(PUT) /= 0) PUT  (:,:,IKB-1)   = PUT  (:,:,IKB) 
IF(SIZE(PVT) /= 0) PVT  (:,:,IKB-1)   = PVT  (:,:,IKB) 
IF(SIZE(PWT) /= 0) PWT  (:,:,IKB-1)   = PWT  (:,:,IKB)  
IF(SIZE(PTHT) /= 0) PTHT (:,:,IKB-1)  = PTHT (:,:,IKB) 
IF(SIZE(PTKET) /= 0) PTKET(:,:,IKB-1) = PTKET(:,:,IKB)
IF(SIZE(PRT) /= 0)  PRT  (:,:,IKB-1,:)= PRT  (:,:,IKB,:)
IF(SIZE(PSVT)/= 0)  PSVT (:,:,IKB-1,:)= PSVT (:,:,IKB,:)
IF(SIZE(PSRCT) /= 0) PSRCT(:,:,IKB-1)   = PSRCT(:,:,IKB)
!
!
!*       2.2    COMPUTE THE FIELD EXTRAPOLATIONS AT THE TOP
!
!          at the instant t
!
IF(SIZE(PWT) /= 0) PWT  (:,:,IKE+1)   = 0.           
IF(SIZE(PUT) /= 0) PUT  (:,:,IKE+1)   = PUT  (:,:,IKE) 
IF(SIZE(PVT) /= 0) PVT  (:,:,IKE+1)   = PVT  (:,:,IKE)
IF(SIZE(PTHT) /= 0) PTHT (:,:,IKE+1)  = PTHT (:,:,IKE)
IF(SIZE(PTKET) /= 0) PTKET(:,:,IKE+1) = PTKET(:,:,IKE)
IF(SIZE(PRT) /= 0) PRT  (:,:,IKE+1,:) = PRT  (:,:,IKE,:)
IF(SIZE(PSVT)/= 0) PSVT (:,:,IKE+1,:) = PSVT (:,:,IKE,:)
IF(SIZE(PSRCT) /= 0) PSRCT(:,:,IKE+1)   = PSRCT(:,:,IKE)

! specific for positive and negative ions mixing ratios (1/kg)

IF (NSV_ELEC .NE. 0) THEN
!
   IF (SIZE(PWT) /= 0) THEN
     WHERE ( PWT(:,:,IKE+1)  .GE. 0.)    ! Outflow
         PSVT (:,:,IKE+1,NSV_ELECBEG) = 2.*PSVT (:,:,IKE,NSV_ELECBEG) -  &
                                           PSVT (:,:,IKE-1,NSV_ELECBEG)
         PSVT (:,:,IKE+1,NSV_ELECEND) = 2.*PSVT (:,:,IKE,NSV_ELECEND) -  &
                                           PSVT (:,:,IKE-1,NSV_ELECEND)
     ELSE WHERE                         ! Inflow from the top
         PSVT (:,:,IKE+1,NSV_ELECBEG) = XCION_POS_FW(:,:,IKE+1)
         PSVT (:,:,IKE+1,NSV_ELECEND) = XCION_NEG_FW(:,:,IKE+1)
     END WHERE
   ENDIF
!
END IF

!
!
!-------------------------------------------------------------------------------
!
!*       3.    COMPUTE LB FIELDS AT TIME T
!              ---------------------------
!
!
IF ( KTCOUNT == 1) THEN
  ZTSTEP = 0.
ELSE
  ZTSTEP = PTSTEP
END IF
!
!
IF ( SIZE(PLBXTHS,1) /= 0 .AND.                      &
   (     HLBCX(1)=='OPEN' .OR. HLBCX(2)=='OPEN')     ) THEN            
  ZLBXVT(:,:,:) = PLBXVM(:,:,:) + ZTSTEP * PLBXVS(:,:,:)
  ZLBXWT(:,:,:) = PLBXWM(:,:,:) + ZTSTEP * PLBXWS(:,:,:)
  ZLBXTHT(:,:,:) = PLBXTHM(:,:,:) + ZTSTEP * PLBXTHS(:,:,:)
  IF ( SIZE(PTKET,1) /= 0 ) THEN
    ZLBXTKET(:,:,:) = PLBXTKEM(:,:,:) + ZTSTEP * PLBXTKES(:,:,:)
  END IF
  IF ( KRR > 0) THEN
    ZLBXRT(:,:,:,:) = PLBXRM(:,:,:,:) + ZTSTEP * PLBXRS(:,:,:,:)
  END IF
  IF ( KSV > 0) THEN
    ZLBXSVT(:,:,:,:) = PLBXSVM(:,:,:,:) + ZTSTEP * PLBXSVS(:,:,:,:)
  END IF
!
ELSE
!
  ZLBXVT(:,:,:) = PLBXVM(:,:,:)
  ZLBXWT(:,:,:) = PLBXWM(:,:,:)
  ZLBXTHT(:,:,:) = PLBXTHM(:,:,:)
  IF ( SIZE(PTKET,1) /= 0 ) THEN
    ZLBXTKET(:,:,:) = PLBXTKEM(:,:,:) 
  END IF
  IF ( KRR > 0) THEN
    ZLBXRT(:,:,:,:) = PLBXRM(:,:,:,:) 
  END IF
  IF ( KSV > 0) THEN
    ZLBXSVT(:,:,:,:) = PLBXSVM(:,:,:,:) 
  END IF
!
END IF
!
!     ============================================================    
!
!  Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result
!
ZLBXVT(:,:,:)  = real(ZLBXVT(:,:,:),kind=MNHREAL32)
ZLBXWT(:,:,:)  = real(ZLBXWT(:,:,:),kind=MNHREAL32)
ZLBXTHT(:,:,:) = real(ZLBXTHT(:,:,:),kind=MNHREAL32)
IF ( SIZE(PTKET,1) /= 0 ) THEN
   ZLBXTKET(:,:,:) = real(ZLBXTKET(:,:,:),kind=MNHREAL32)
END IF
IF ( KRR > 0) THEN
   ZLBXRT(:,:,:,:) = real(ZLBXRT(:,:,:,:),kind=MNHREAL32)
END IF
IF ( KSV > 0) THEN
   ZLBXSVT(:,:,:,:) = real(ZLBXSVT(:,:,:,:),kind=MNHREAL32)
END IF
!     ============================================================ 
!
IF ( SIZE(PLBYTHS,1) /= 0 .AND.                       &
     (    HLBCY(1)=='OPEN' .OR. HLBCY(2)=='OPEN'    ))  THEN          
  ZLBYUT(:,:,:) = PLBYUM(:,:,:) + ZTSTEP * PLBYUS(:,:,:)
  ZLBYWT(:,:,:) = PLBYWM(:,:,:) + ZTSTEP * PLBYWS(:,:,:)
  ZLBYTHT(:,:,:) = PLBYTHM(:,:,:) + ZTSTEP * PLBYTHS(:,:,:)
  IF ( SIZE(PTKET,1) /= 0 ) THEN
    ZLBYTKET(:,:,:) = PLBYTKEM(:,:,:) + ZTSTEP * PLBYTKES(:,:,:)
  END IF
  IF ( KRR > 0) THEN
    ZLBYRT(:,:,:,:) = PLBYRM(:,:,:,:) + ZTSTEP * PLBYRS(:,:,:,:)
  END IF
  IF ( KSV > 0) THEN
    ZLBYSVT(:,:,:,:) = PLBYSVM(:,:,:,:) + ZTSTEP * PLBYSVS(:,:,:,:)
  END IF
!
ELSE
!
  ZLBYUT(:,:,:) = PLBYUM(:,:,:)
  ZLBYWT(:,:,:) = PLBYWM(:,:,:)
  ZLBYTHT(:,:,:) = PLBYTHM(:,:,:)
  IF ( SIZE(PTKET,1) /= 0 ) THEN
    ZLBYTKET(:,:,:) = PLBYTKEM(:,:,:) 
  END IF
  IF ( KRR > 0) THEN
    ZLBYRT(:,:,:,:) = PLBYRM(:,:,:,:) 
  END IF
  IF ( KSV > 0) THEN
    ZLBYSVT(:,:,:,:) = PLBYSVM(:,:,:,:) 
  END IF
!
END IF
!
!
!     ============================================================    
!
!  Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result
!
ZLBYUT(:,:,:)  = real(ZLBYUT(:,:,:),kind=MNHREAL32)
ZLBYWT(:,:,:)  = real(ZLBYWT(:,:,:),kind=MNHREAL32)
ZLBYTHT(:,:,:) = real(ZLBYTHT(:,:,:),kind=MNHREAL32)
IF ( SIZE(PTKET,1) /= 0 ) THEN
   ZLBYTKET(:,:,:) = real(ZLBYTKET(:,:,:),kind=MNHREAL32)
END IF
IF ( KRR > 0) THEN
   ZLBYRT(:,:,:,:) = real(ZLBYRT(:,:,:,:),kind=MNHREAL32)
END IF
IF ( KSV > 0) THEN
   ZLBYSVT(:,:,:,:) = real(ZLBYSVT(:,:,:,:),kind=MNHREAL32)
END IF
!     ============================================================ 
!
!-------------------------------------------------------------------------------
! PONDERATION COEFF for  Non-Normal velocities and pot temperature
!
ZPOND = XPOND
!
!*       4.    LBC FILLING IN THE X DIRECTION (LEFT WEST SIDE):   
!              ------------------------------------------------
IF (LWEST_ll( )) THEN
!
!
SELECT CASE ( HLBCX(1) )  
!
!*       4.1  WALL CASE:  
!             ========= 
!
  CASE ('WALL')
!
    DO JEXT=1,JPHEXT
       IF(SIZE(PUT) /= 0) PUT  (IIB-JEXT,:,:)   = PUT  (IIB       ,:,:)   ! never used during run
       IF(SIZE(PVT) /= 0) PVT  (IIB-JEXT,:,:)   = PVT  (IIB-1+JEXT,:,:)
       IF(SIZE(PWT) /= 0) PWT  (IIB-JEXT,:,:)   = PWT  (IIB-1+JEXT,:,:)
       IF(SIZE(PTHT) /= 0) PTHT(IIB-JEXT,:,:)   = PTHT (IIB-1+JEXT,:,:)
       IF(SIZE(PTKET)/= 0) PTKET(IIB-JEXT,:,:)  = PTKET(IIB-1+JEXT,:,:)
       IF(SIZE(PRT) /= 0) PRT  (IIB-JEXT,:,:,:) = PRT  (IIB-1+JEXT,:,:,:)
       IF(SIZE(PSVT) /= 0) PSVT(IIB-JEXT,:,:,:) = PSVT (IIB-1+JEXT,:,:,:)
       IF(SIZE(PSRCT) /= 0) PSRCT (IIB-JEXT,:,:)   = PSRCT (IIB-1+JEXT,:,:)
       IF(LBLOWSNOW) XSNWCANO(IIB-JEXT,:,:)     = XSNWCANO(IIB-1+JEXT,:,:)            
!
    END DO
!
    IF(SIZE(PUT) /= 0) PUT(IIB     ,:,:)   = 0.    ! set the normal velocity
!
!
!*       4.2  OPEN CASE:
!             =========
!
  CASE ('OPEN')
!
    IF(SIZE(PUT) /= 0) THEN
       DO JI=JPHEXT,1,-1
          PUT(JI,:,:)=0.
          WHERE ( PUT(IIB,:,:) <= 0. )               !  OUTFLOW condition
             PVT  (JI,:,:) = 2.*PVT  (JI+1,:,:)  -PVT  (JI+2,:,:)
             PWT  (JI,:,:) = 2.*PWT  (JI+1,:,:)  -PWT  (JI+2,:,:)
             PTHT (JI,:,:) = 2.*PTHT (JI+1,:,:)  -PTHT (JI+2,:,:)
             !
          ELSEWHERE                                   !  INFLOW  condition
             PVT  (JI,:,:) = ZPOND*ZLBXVT   (JI,:,:) + (1.-ZPOND)* PVT(JI+1,:,:) ! 1 
             PWT  (JI,:,:) = ZPOND*ZLBXWT   (JI,:,:) + (1.-ZPOND)* PWT(JI+1,:,:) ! 1
             PTHT (JI,:,:) = ZPOND*ZLBXTHT  (JI,:,:) + (1.-ZPOND)* PTHT(JI+1,:,:)! 1
          ENDWHERE
       ENDDO
    ENDIF
!
!
  IF(SIZE(PTKET) /= 0) THEN
     DO JI=JPHEXT,1,-1
        WHERE ( PUT(IIB,:,:) <= 0. )               !  OUTFLOW condition
           PTKET(JI,:,:) = MAX(XTKEMIN, 2.*PTKET(JI+1,:,:)-PTKET(JI+2,:,:))  
        ELSEWHERE                                  !  INFLOW  condition
           PTKET(JI,:,:) = MAX(XTKEMIN, ZPOND*ZLBXTKET(JI,:,:) + (1.-ZPOND)*PTKET(JI+1,:,:))
        ENDWHERE
     ENDDO
  END IF
    !
!                      Case with KRR moist variables 
! 
! 
!
  DO JRR =1 ,KRR
     IF(SIZE(PUT) /= 0) THEN
        DO JI=JPHEXT,1,-1
           WHERE ( PUT(IIB,:,:) <= 0. )         !  OUTFLOW condition
              PRT(JI,:,:,JRR) = MAX(0.,2.*PRT(JI+1,:,:,JRR) -PRT(JI+2,:,:,JRR))
           ELSEWHERE                            !  INFLOW  condition
              PRT(JI,:,:,JRR) = MAX(0.,ZLBXRT(JI,:,:,JRR)) ! 1
           END WHERE
        END DO
     END IF
     !
  END DO
!
  IF(SIZE(PSRCT) /= 0) THEN
     DO JI=JPHEXT,1,-1
        PSRCT (JI,:,:)   = PSRCT (JI+1,:,:)
     END DO
  END IF
!
!                       Case with KSV scalar variables  
  DO JSV=1 ,KSV
    IF(SIZE(PUT) /= 0) THEN
       DO JI=JPHEXT,1,-1
          WHERE ( PUT(IIB,:,:) <= 0. )         !  OUTFLOW condition
             PSVT(JI,:,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(JI+1,:,:,JSV) - &
                  PSVT(JI+2,:,:,JSV))
          ELSEWHERE                            !  INFLOW  condition
             PSVT(JI,:,:,JSV) = MAX(XSVMIN(JSV),ZLBXSVT(JI,:,:,JSV)) ! 1
          END WHERE
       END DO
    END IF
    !
  END DO
  !
    IF(LBLOWSNOW) THEN
    DO JSV=1 ,NBLOWSNOW_2D
      WHERE ( PUT(IIB,:,IKB) <= 0. )         !  OUTFLOW condition
        XSNWCANO(IIB-1,:,JSV) = MAX(0.,2.*XSNWCANO(IIB,:,JSV) - &
                                             XSNWCANO(IIB+1,:,JSV))
      ELSEWHERE                            !  INFLOW  condition
        XSNWCANO(IIB-1,:,JSV) = 0.         ! Assume no snow enter throug
                                           ! boundaries
      END WHERE
    END DO
   DO JSV=NSV_SNWBEG ,NSV_SNWEND
    IF(SIZE(PUT) /= 0) THEN
      WHERE ( PUT(IIB,:,:) <= 0. )         !  OUTFLOW condition
        PSVT(IIB-1,:,:,JSV) = MAX(0.,2.*PSVT(IIB,:,:,JSV) - &
                                               PSVT(IIB+1,:,:,JSV))
      ELSEWHERE                            !  INFLOW  condition
        PSVT(IIB-1,:,:,JSV) = 0.           ! Assume no snow enter throug
                                           ! boundaries
      END WHERE
    END IF
    !
   END DO
  ENDIF  
!
!
END SELECT
!
END IF
!-------------------------------------------------------------------------------
!
!*       5    LBC FILLING IN THE X DIRECTION (RIGHT EAST SIDE): 
!              ===============--------------------------------
!
IF (LEAST_ll( )) THEN
!
SELECT CASE ( HLBCX(2) ) 
!
!*       5.1  WALL CASE:
!             =========
!
  CASE ('WALL')
!
    DO JEXT=1,JPHEXT
       IF(SIZE(PUT) /= 0) PUT  (IIE+JEXT,:,:)   = PUT  (IIE       ,:,:)   ! never used during run
       IF(SIZE(PVT) /= 0) PVT  (IIE+JEXT,:,:)   = PVT  (IIE+1-JEXT,:,:)
       IF(SIZE(PWT) /= 0) PWT  (IIE+JEXT,:,:)   = PWT  (IIE+1-JEXT,:,:)
       IF(SIZE(PTHT) /= 0) PTHT (IIE+JEXT,:,:)  = PTHT (IIE+1-JEXT,:,:)
       IF(SIZE(PTKET) /= 0) PTKET(IIE+JEXT,:,:) = PTKET(IIE+1-JEXT,:,:)
       IF(SIZE(PRT) /= 0) PRT  (IIE+JEXT,:,:,:) = PRT  (IIE+1-JEXT,:,:,:)
       IF(SIZE(PSVT) /= 0) PSVT(IIE+JEXT,:,:,:) = PSVT (IIE+1-JEXT,:,:,:)
       IF(SIZE(PSRCT) /= 0) PSRCT (IIE+JEXT,:,:)= PSRCT (IIE+1-JEXT,:,:)
       IF(LBLOWSNOW) XSNWCANO(IIE+JEXT,:,:) = XSNWCANO(IIE+1-JEXT,:,:)           
!
    END DO
!
    IF(SIZE(PUT) /= 0) PUT(IIE+1   ,:,:)   = 0.     ! set the normal velocity
!
!*       5.2  OPEN CASE:
!             =========
!
  CASE ('OPEN')
!
     ILBX = SIZE(PLBXVM,1)
     IF(SIZE(PUT) /= 0) THEN
        DO JI=1,JPHEXT
           WHERE ( PUT(IIE+1,:,:) >= 0. )               !  OUTFLOW condition
              PVT  (IIE+JI,:,:) = 2.*PVT  (IIE+JI-1,:,:)   -PVT  (IIE+JI-2,:,:)
              PWT  (IIE+JI,:,:) = 2.*PWT  (IIE+JI-1,:,:)   -PWT  (IIE+JI-2,:,:)
              PTHT (IIE+JI,:,:) = 2.*PTHT (IIE+JI-1,:,:)   -PTHT (IIE+JI-2,:,:)
              !
           ELSEWHERE                                   !  INFLOW  condition
              PVT  (IIE+JI,:,:) = ZPOND*ZLBXVT   (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PVT(IIE+JI-1,:,:)
              PWT  (IIE+JI,:,:) = ZPOND*ZLBXWT   (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PWT(IIE+JI-1,:,:)
              PTHT (IIE+JI,:,:) = ZPOND*ZLBXTHT  (ILBX-JPHEXT+JI,:,:) + (1.-ZPOND)* PTHT(IIE+JI-1,:,:)
           ENDWHERE
        END DO
     ENDIF
     !
     IF(SIZE(PTKET) /= 0) THEN
        ILBX = SIZE(PLBXTKEM,1)
        DO JI=1,JPHEXT
           WHERE ( PUT(IIE+1,:,:) >= 0. )             !  OUTFLOW condition
              PTKET(IIE+JI,:,:) = MAX(XTKEMIN, 2.*PTKET(IIE+JI-1,:,:)-PTKET(IIE+JI-2,:,:))  
           ELSEWHERE                                  !  INFLOW  condition
              PTKET(IIE+JI,:,:) =  MAX(XTKEMIN, ZPOND*ZLBXTKET(ILBX-JPHEXT+JI,:,:) + &
                                   (1.-ZPOND)*PTKET(IIE+JI-1,:,:))
           ENDWHERE
        END DO
     END IF
    !
!
!                      Case with KRR moist variables 
! 
! 
  DO JRR =1 ,KRR
    ILBX=SIZE(PLBXRM,1)
    !
    IF(SIZE(PUT) /= 0) THEN
       DO JI=1,JPHEXT  
          WHERE ( PUT(IIE+1,:,:) >= 0. )       !  OUTFLOW condition
             PRT(IIE+JI,:,:,JRR) = MAX(0.,2.*PRT(IIE+JI-1,:,:,JRR) -PRT(IIE+JI-2,:,:,JRR))
          ELSEWHERE                            !  INFLOW  condition
             PRT(IIE+JI,:,:,JRR) = MAX(0.,ZLBXRT(ILBX-JPHEXT+JI,:,:,JRR))
          END WHERE
       END DO
    END IF
    !
  END DO
!
  IF(SIZE(PSRCT) /= 0) THEN
     DO JI=1,JPHEXT 
        PSRCT (IIE+JI,:,:)   = PSRCT (IIE+JI-1,:,:)
     END DO
  END IF
!                       Case with KSV scalar variables  
  DO JSV=1 ,KSV
    ILBX=SIZE(PLBXSVM,1)
    IF(SIZE(PUT) /= 0) THEN
       DO JI=1,JPHEXT 
          WHERE ( PUT(IIE+1,:,:) >= 0. )       !  OUTFLOW condition
             PSVT(IIE+JI,:,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(IIE+JI-1,:,:,JSV) - &
                  PSVT(IIE+JI-2,:,:,JSV))
          ELSEWHERE                            !  INFLOW  condition
             PSVT(IIE+JI,:,:,JSV) = MAX(XSVMIN(JSV),ZLBXSVT(ILBX-JPHEXT+JI,:,:,JSV))
          END WHERE
       END DO
    END IF
    !
  END DO
!
  IF(LBLOWSNOW) THEN
    DO JSV=1 ,3
      WHERE ( PUT(IIE+1,:,IKB) >= 0. )       !  OUTFLOW condition
        XSNWCANO(IIE+1,:,JSV) = MAX(0.,2.*XSNWCANO(IIE,:,JSV) - &
                                              XSNWCANO(IIE-1,:,JSV))
      ELSEWHERE                            !  INFLOW  condition
        XSNWCANO(IIE+1,:,JSV) = 0.         ! Assume no snow enter throug
                                           ! boundaries
      END WHERE
    END DO
    DO JSV=NSV_SNWBEG ,NSV_SNWEND
    IF(SIZE(PUT) /= 0) THEN
      WHERE ( PUT(IIE+1,:,:) >= 0. )       !  OUTFLOW condition
        PSVT(IIE+1,:,:,JSV) = MAX(0.,2.*PSVT(IIE,:,:,JSV) - &
                                               PSVT(IIE-1,:,:,JSV))
      ELSEWHERE                            !  INFLOW  condition
        PSVT(IIE+1,:,:,JSV) = 0.           ! Assume no snow enter throug
                                           ! boundaries
      END WHERE
    END IF
    !
  END DO
  END IF
!
END SELECT
!
END IF
!-------------------------------------------------------------------------------
!
!*       6.    LBC FILLING IN THE Y DIRECTION (BOTTOM SOUTH SIDE): 
!              ------------------------------
IF (LSOUTH_ll( )) THEN
!
SELECT CASE ( HLBCY(1) )              
!
!*       6.1  WALL CASE:
!             ========= 
!
  CASE ('WALL')
!
    DO JEXT=1,JPHEXT
       IF(SIZE(PUT) /= 0) PUT  (:,IJB-JEXT,:)   = PUT  (:,IJB-1+JEXT,:)
       IF(SIZE(PVT) /= 0) PVT  (:,IJB-JEXT,:)   = PVT  (:,IJB       ,:)   ! never used during run
       IF(SIZE(PWT) /= 0) PWT  (:,IJB-JEXT,:)   = PWT  (:,IJB-1+JEXT,:)
       IF(SIZE(PTHT) /= 0) PTHT (:,IJB-JEXT,:)  = PTHT (:,IJB-1+JEXT,:)
       IF(SIZE(PTKET) /= 0) PTKET(:,IJB-JEXT,:) = PTKET(:,IJB-1+JEXT,:)
       IF(SIZE(PRT) /= 0) PRT  (:,IJB-JEXT,:,:) = PRT  (:,IJB-1+JEXT,:,:)
       IF(SIZE(PSVT) /= 0) PSVT (:,IJB-JEXT,:,:)= PSVT (:,IJB-1+JEXT,:,:)
       IF(SIZE(PSRCT) /= 0) PSRCT(:,IJB-JEXT,:) = PSRCT(:,IJB-1+JEXT,:)
       IF(LBLOWSNOW) XSNWCANO(:,IJB-JEXT,:)     = XSNWCANO(:,IJB-1+JEXT,:)     
!
    END DO
!
    IF(SIZE(PVT) /= 0) PVT(:,IJB     ,:)   = 0.       ! set the normal velocity
!
!*       6.2  OPEN CASE:
!             =========
!
  CASE ('OPEN')
!
    IF(SIZE(PVT) /= 0) THEN
       DO JJ=JPHEXT,1,-1
          PVT(:,JJ,:)=0.
          WHERE ( PVT(:,IJB,:) <= 0. )               !  OUTFLOW condition
             PUT  (:,JJ,:) = 2.*PUT  (:,JJ+1,:)   -PUT  (:,JJ+2,:)
             PWT  (:,JJ,:) = 2.*PWT  (:,JJ+1,:)   -PWT  (:,JJ+2,:)
             PTHT (:,JJ,:) = 2.*PTHT (:,JJ+1,:)   -PTHT (:,JJ+2,:)
          ELSEWHERE                                   !  INFLOW  condition
             PUT  (:,JJ,:) = ZPOND*ZLBYUT   (:,JJ,:) + (1.-ZPOND)* PUT(:,JJ+1,:)
             PWT  (:,JJ,:) = ZPOND*ZLBYWT   (:,JJ,:) + (1.-ZPOND)* PWT(:,JJ+1,:)
             PTHT (:,JJ,:) = ZPOND*ZLBYTHT  (:,JJ,:) + (1.-ZPOND)* PTHT(:,JJ+1,:)
          ENDWHERE
       END DO
    ENDIF
!
  IF(SIZE(PTKET) /= 0) THEN
     DO JJ=JPHEXT,1,-1
        WHERE ( PVT(:,IJB,:) <= 0. )             !  OUTFLOW condition
           PTKET(:,JJ,:) = MAX(XTKEMIN, 2.*PTKET(:,JJ+1,:)-PTKET(:,JJ+2,:))  
        ELSEWHERE                                !  INFLOW  condition
           PTKET(:,JJ,:) =  MAX(XTKEMIN,ZPOND*ZLBYTKET(:,JJ,:) +  &
                            (1.-ZPOND)*PTKET(:,JJ+1,:))
        ENDWHERE
     END DO
  END IF
    !
!
!                      Case with KRR moist variables 
! 
! 
  DO JRR =1 ,KRR
    IF(SIZE(PVT) /= 0) THEN
       DO JJ=JPHEXT,1,-1
          WHERE ( PVT(:,IJB,:) <= 0. )         !  OUTFLOW condition
             PRT(:,JJ,:,JRR) = MAX(0.,2.*PRT(:,JJ+1,:,JRR) -PRT(:,JJ+2,:,JRR))
          ELSEWHERE                            !  INFLOW  condition
             PRT(:,JJ,:,JRR) = MAX(0.,ZLBYRT(:,JJ,:,JRR))
          END WHERE
       END DO
    END IF
    !
  END DO
!
  IF(SIZE(PSRCT) /= 0) THEN
     DO JJ=JPHEXT,1,-1
        PSRCT(:,JJ,:)   = PSRCT(:,JJ+1,:)
     END DO
  END IF
!
!                       Case with KSV scalar variables  
!
  DO JSV=1 ,KSV
    IF(SIZE(PVT) /= 0) THEN
       DO JJ=JPHEXT,1,-1
          WHERE ( PVT(:,IJB,:) <= 0. )         !  OUTFLOW condition
             PSVT(:,JJ,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(:,JJ+1,:,JSV) - &
                  PSVT(:,JJ+2,:,JSV))
          ELSEWHERE                            !  INFLOW  condition
             PSVT(:,JJ,:,JSV) = MAX(XSVMIN(JSV),ZLBYSVT(:,JJ,:,JSV))
          END WHERE
       END DO
    END IF
    !
  END DO
!
   IF(LBLOWSNOW) THEN
    DO JSV=1 ,3
      WHERE ( PVT(:,IJB,IKB) <= 0. )         !  OUTFLOW condition
        XSNWCANO(:,IJB-1,JSV) = MAX(0.,2.*XSNWCANO(:,IJB,JSV) - &
                                             XSNWCANO(:,IJB+1,JSV))
      ELSEWHERE                            !  INFLOW  condition
        XSNWCANO(:,IJB-1,JSV) = 0.         ! Assume no snow enter throug
                                           ! boundaries
      END WHERE
    END DO
   DO JSV=NSV_SNWBEG ,NSV_SNWEND
    IF(SIZE(PVT) /= 0) THEN
      WHERE ( PVT(:,IJB,:) <= 0. )         !  OUTFLOW condition
        PSVT(:,IJB-1,:,JSV) = MAX(0.,2.*PSVT(:,IJB,:,JSV) - &
                                               PSVT(:,IJB+1,:,JSV))
      ELSEWHERE                            !  INFLOW  condition
        PSVT(:,IJB-1,:,JSV) = 0.           ! Assume no snow enter throug
                                           ! boundaries
      END WHERE
    END IF
    !
  END DO
  END IF 
!
!
END SELECT
!
END IF
!-------------------------------------------------------------------------------
!
!*       7.    LBC FILLING IN THE Y DIRECTION (TOP NORTH SIDE): 
!              ===============
!
IF (LNORTH_ll( )) THEN
!
SELECT CASE ( HLBCY(2) ) 
!
!*       4.3.1  WALL CASE:
!               ========= 
!
  CASE ('WALL')
!
    DO JEXT=1,JPHEXT
       IF(SIZE(PUT) /= 0) PUT  (:,IJE+JEXT,:)   = PUT  (:,IJE+1-JEXT,:)
       IF(SIZE(PVT) /= 0) PVT  (:,IJE+JEXT,:)   = PVT  (:,IJE       ,:)   ! never used during run
       IF(SIZE(PWT) /= 0) PWT  (:,IJE+JEXT,:)   = PWT  (:,IJE+1-JEXT,:)
       IF(SIZE(PTHT) /= 0) PTHT (:,IJE+JEXT,:)  = PTHT (:,IJE+1-JEXT,:)
       IF(SIZE(PTKET) /= 0) PTKET(:,IJE+JEXT,:) = PTKET(:,IJE+1-JEXT,:)
       IF(SIZE(PRT) /= 0) PRT  (:,IJE+JEXT,:,:) = PRT  (:,IJE+1-JEXT,:,:)
       IF(SIZE(PSVT) /= 0) PSVT (:,IJE+JEXT,:,:)= PSVT (:,IJE+1-JEXT,:,:)
       IF(SIZE(PSRCT) /= 0) PSRCT(:,IJE+JEXT,:) = PSRCT(:,IJE+1-JEXT,:)
       IF(LBLOWSNOW) XSNWCANO(:,IJE+JEXT,:)     = XSNWCANO(:,IJE+1-JEXT,:)   
!
    END DO
!
    IF(SIZE(PVT) /= 0) PVT(:,IJE+1   ,:)   = 0.    ! set the normal velocity
!
!*       4.3.2  OPEN CASE:
!               ========= 
!
  CASE ('OPEN')
!
!
    ILBY=SIZE(PLBYUM,2)
    IF(SIZE(PVT) /= 0) THEN
       DO JJ=1,JPHEXT
          WHERE ( PVT(:,IJE+1,:) >= 0. )               !  OUTFLOW condition
             PUT  (:,IJE+JJ,:) = 2.*PUT  (:,IJE+JJ-1,:)   -PUT  (:,IJE+JJ-2,:)
             PWT  (:,IJE+JJ,:) = 2.*PWT  (:,IJE+JJ-1,:)   -PWT  (:,IJE+JJ-2,:)
             PTHT (:,IJE+JJ,:) = 2.*PTHT (:,IJE+JJ-1,:)   -PTHT (:,IJE+JJ-2,:)
          ELSEWHERE                                   !  INFLOW  condition
             PUT  (:,IJE+JJ,:) = ZPOND*ZLBYUT   (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PUT(:,IJE+JJ-1,:)
             PWT  (:,IJE+JJ,:) = ZPOND*ZLBYWT   (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PWT(:,IJE+JJ-1,:)
             PTHT (:,IJE+JJ,:) = ZPOND*ZLBYTHT  (:,ILBY-JPHEXT+JJ,:) + (1.-ZPOND)* PTHT(:,IJE+JJ-1,:)
          ENDWHERE
       END DO
    ENDIF
!
  IF(SIZE(PTKET) /= 0) THEN
    ILBY=SIZE(PLBYTKEM,2)
    DO JJ=1,JPHEXT
       WHERE ( PVT(:,IJE+1,:) >= 0. )             !  OUTFLOW condition
          PTKET(:,IJE+JJ,:) = MAX(XTKEMIN, 2.*PTKET(:,IJE+JJ-1,:)-PTKET(:,IJE+JJ-2,:))  
       ELSEWHERE                                  !  INFLOW  condition
          PTKET(:,IJE+JJ,:) = MAX(XTKEMIN,ZPOND*ZLBYTKET(:,ILBY-JPHEXT+JJ,:) + &
                              (1.-ZPOND)*PTKET(:,IJE+JJ-1,:))
       ENDWHERE
    END DO
  ENDIF
    !
!                      Case with KRR moist variables 
! 
! 
  DO JRR =1 ,KRR
    ILBY=SIZE(PLBYRM,2)
    !
    IF(SIZE(PVT) /= 0) THEN
       DO JJ=1,JPHEXT
          WHERE ( PVT(:,IJE+1,:) >= 0. )         !  OUTFLOW condition
             PRT(:,IJE+JJ,:,JRR) = MAX(0.,2.*PRT(:,IJE+JJ-1,:,JRR) -PRT(:,IJE+JJ-2,:,JRR))
          ELSEWHERE                            !  INFLOW  condition
             PRT(:,IJE+JJ,:,JRR) = MAX(0.,ZLBYRT(:,ILBY-JPHEXT+JJ,:,JRR))
          END WHERE
       END DO
    END IF
    !
  END DO
!
  IF(SIZE(PSRCT) /= 0) THEN
      DO JJ=1,JPHEXT
         PSRCT(:,IJE+JJ,:)   = PSRCT(:,IJE+JJ-1,:)
      END DO
  END IF
!
!                       Case with KSV scalar variables  
  DO JSV=1 ,KSV
    ILBY=SIZE(PLBYSVM,2)
    !
    IF(SIZE(PVT) /= 0) THEN
       DO JJ=1,JPHEXT
          WHERE ( PVT(:,IJE+1,:) >= 0. )         !  OUTFLOW condition
             PSVT(:,IJE+JJ,:,JSV) = MAX(XSVMIN(JSV),2.*PSVT(:,IJE+JJ-1,:,JSV) - &
                  PSVT(:,IJE+JJ-2,:,JSV))
          ELSEWHERE                            !  INFLOW  condition
             PSVT(:,IJE+JJ,:,JSV) = MAX(XSVMIN(JSV),ZLBYSVT(:,ILBY-JPHEXT+JJ,:,JSV))
          END WHERE
       END DO
    END IF
    !
  END DO
!
    IF(LBLOWSNOW) THEN
  DO JSV=1 ,3
    WHERE ( PVT(:,IJE+1,IKB) >= 0. )         !  OUTFLOW condition
      XSNWCANO(:,IJE+1,JSV) = MAX(0.,2.*XSNWCANO(:,IJE,JSV) - &
                                            XSNWCANO(:,IJE-1,JSV))
    ELSEWHERE                            !  INFLOW  condition
      XSNWCANO(:,IJE+1,JSV) = 0.         ! Assume no snow enter throug
                                         ! boundaries
    END WHERE
  END DO
  DO JSV=NSV_SNWBEG ,NSV_SNWEND
    !
    IF(SIZE(PVT) /= 0) THEN
      WHERE ( PVT(:,IJE+1,:) >= 0. )         !  OUTFLOW condition
        PSVT(:,IJE+1,:,JSV) = MAX(0.,2.*PSVT(:,IJE,:,JSV) - &
                                               PSVT(:,IJE-1,:,JSV))
      ELSEWHERE                            !  INFLOW  condition
        PSVT(:,IJE+1,:,JSV) = 0.           ! Assume no snow enter throug
                                           ! boundaries
      END WHERE
    END IF
    !
  END DO
  ENDIF
!
END SELECT
END IF
!
!
IF (CCLOUD == 'LIMA' .AND. IMI == 1 .AND. CPROGRAM=='MESONH') THEN

   ZSVT=PSVT
   ZRT=PRT

  IF (GFIRSTCALLLIMA) THEN
    ALLOCATE(GLIMABOUNDARY(NSV_LIMA))
    GFIRSTCALLLIMA = .FALSE.
    DO JSV=NSV_LIMA_BEG,NSV_LIMA_END
       GCHTMP = .FALSE.
       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
       GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1) = GCHTMP
    ENDDO
  ENDIF
  CALL INIT_AEROSOL_CONCENTRATION(PRHODREF,ZSVT,XZZ)
  DO JSV=NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 ! LBC for CCN
     IF (GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1)) THEN
        PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV)
        PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV)
        PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV)
        PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV)
     ENDIF
  END DO
  DO JSV=NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 ! LBC for IFN
     IF (GLIMABOUNDARY(JSV-NSV_LIMA_BEG+1)) THEN
        PSVT(IIB-1,:,:,JSV)=ZSVT(IIB-1,:,:,JSV)
        PSVT(IIE+1,:,:,JSV)=ZSVT(IIE+1,:,:,JSV)
        PSVT(:,IJB-1,:,JSV)=ZSVT(:,IJB-1,:,JSV)
        PSVT(:,IJE+1,:,JSV)=ZSVT(:,IJE+1,:,JSV)
     ENDIF
  END DO

  CALL SET_CONC_LIMA( IMI, 'NONE', PRHODREF, ZRT(:, :, :, :), ZSVT(:, :, :, NSV_LIMA_BEG:NSV_LIMA_END) )
  IF (NSV_LIMA_NC.GE.1) THEN
     IF (GLIMABOUNDARY(NSV_LIMA_NC-NSV_LIMA_BEG+1)) THEN
        PSVT(IIB-1,:,:,NSV_LIMA_NC)=ZSVT(IIB-1,:,:,NSV_LIMA_NC) ! cloud
        PSVT(IIE+1,:,:,NSV_LIMA_NC)=ZSVT(IIE+1,:,:,NSV_LIMA_NC)
        PSVT(:,IJB-1,:,NSV_LIMA_NC)=ZSVT(:,IJB-1,:,NSV_LIMA_NC)
        PSVT(:,IJE+1,:,NSV_LIMA_NC)=ZSVT(:,IJE+1,:,NSV_LIMA_NC)
     ENDIF
  ENDIF
  IF (NSV_LIMA_NR.GE.1) THEN
     IF (GLIMABOUNDARY(NSV_LIMA_NR-NSV_LIMA_BEG+1)) THEN
        PSVT(IIB-1,:,:,NSV_LIMA_NR)=ZSVT(IIB-1,:,:,NSV_LIMA_NR) ! rain
        PSVT(IIE+1,:,:,NSV_LIMA_NR)=ZSVT(IIE+1,:,:,NSV_LIMA_NR)
        PSVT(:,IJB-1,:,NSV_LIMA_NR)=ZSVT(:,IJB-1,:,NSV_LIMA_NR)
        PSVT(:,IJE+1,:,NSV_LIMA_NR)=ZSVT(:,IJE+1,:,NSV_LIMA_NR)
     ENDIF
  ENDIF
  IF (NSV_LIMA_NI.GE.1) THEN
     IF (GLIMABOUNDARY(NSV_LIMA_NI-NSV_LIMA_BEG+1)) THEN
        PSVT(IIB-1,:,:,NSV_LIMA_NI)=ZSVT(IIB-1,:,:,NSV_LIMA_NI) ! ice
        PSVT(IIE+1,:,:,NSV_LIMA_NI)=ZSVT(IIE+1,:,:,NSV_LIMA_NI)
        PSVT(:,IJB-1,:,NSV_LIMA_NI)=ZSVT(:,IJB-1,:,NSV_LIMA_NI)
        PSVT(:,IJE+1,:,NSV_LIMA_NI)=ZSVT(:,IJE+1,:,NSV_LIMA_NI)
     ENDIF
  END IF
END IF
!
!
IF (LUSECHEM .AND. IMI == 1) THEN
  IF (GFIRSTCALL1) THEN
    ALLOCATE(GCHBOUNDARY(NSV_CHEM))
    GFIRSTCALL1 = .FALSE.
    DO JSV=NSV_CHEMBEG,NSV_CHEMEND
       GCHTMP = .FALSE.
       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
       GCHBOUNDARY(JSV-NSV_CHEMBEG+1) = GCHTMP
    ENDDO
  ENDIF

  DO JSV=NSV_CHEMBEG,NSV_CHEMEND
    IF (GCHBOUNDARY(JSV-NSV_CHEMBEG+1))  THEN
      IF (SIZE(PSVT)>0) THEN
        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
      ENDIF
    ENDIF
  ENDDO
ENDIF
!
IF (LUSECHIC .AND. IMI == 1) THEN
  IF (GFIRSTCALLIC) THEN
    ALLOCATE(GICBOUNDARY(NSV_CHIC))
    GFIRSTCALLIC = .FALSE.
    DO JSV=NSV_CHICBEG,NSV_CHICEND
       GCHTMP = .FALSE.
       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
       GICBOUNDARY(JSV-NSV_CHICBEG+1) = GCHTMP
    ENDDO
  ENDIF

  DO JSV=NSV_CHICBEG,NSV_CHICEND
    IF (GICBOUNDARY(JSV-NSV_CHICBEG+1))  THEN
      IF (SIZE(PSVT)>0) THEN
        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
      ENDIF
    ENDIF
  ENDDO
ENDIF
IF (LORILAM .AND. IMI == 1) THEN
  IF (GFIRSTCALL2) THEN
    ALLOCATE(GAERBOUNDARY(NSV_AER))
    GFIRSTCALL2 = .FALSE.
    DO JSV=NSV_AERBEG,NSV_AEREND
       GCHTMP = .FALSE.
       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
       GAERBOUNDARY(JSV-NSV_AERBEG+1) = GCHTMP
    ENDDO
  ENDIF

  DO JSV=NSV_AERBEG,NSV_AEREND
    IF (GAERBOUNDARY(JSV-NSV_AERBEG+1)) THEN
      IF (SIZE(PSVT)>0) THEN
        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
      ENDIF
    ENDIF
  ENDDO
ENDIF
!
IF (LDUST .AND. IMI == 1) THEN
  IF (GFIRSTCALL3) THEN
    ALLOCATE(GDSTBOUNDARY(NSV_DST))
    GFIRSTCALL3 = .FALSE.
    DO JSV=NSV_DSTBEG,NSV_DSTEND
       GCHTMP = .FALSE.
       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
       GDSTBOUNDARY(JSV-NSV_DSTBEG+1) = GCHTMP
    ENDDO
    ENDIF

  DO JSV=NSV_DSTBEG,NSV_DSTEND
    IF (GDSTBOUNDARY(JSV-NSV_DSTBEG+1)) THEN
      IF (SIZE(PSVT)>0) THEN
        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
      ENDIF
    ENDIF
  ENDDO 
ENDIF
!
IF (LSALT .AND. IMI == 1) THEN
  IF (GFIRSTCALL5) THEN
    ALLOCATE(GSLTBOUNDARY(NSV_SLT))
    GFIRSTCALL5 = .FALSE.
    DO JSV=NSV_SLTBEG,NSV_SLTEND
       GCHTMP = .FALSE.
       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
       GSLTBOUNDARY(JSV-NSV_SLTBEG+1) = GCHTMP
    ENDDO
  ENDIF

  DO JSV=NSV_SLTBEG,NSV_SLTEND
    IF (GSLTBOUNDARY(JSV-NSV_SLTBEG+1)) THEN
      IF (SIZE(PSVT)>0) THEN
        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
      ENDIF
    ENDIF
  ENDDO
ENDIF
!
IF ( LPASPOL .AND. IMI == 1) THEN
  IF (GFIRSTCALLPP) THEN
    ALLOCATE(GPPBOUNDARY(NSV_PP))
    GFIRSTCALLPP = .FALSE.
    DO JSV=NSV_PPBEG,NSV_PPEND
      GPPTMP = .FALSE.
      IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
      IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
      IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
      IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GPPTMP = GPPTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
      GPPBOUNDARY(JSV-NSV_PPBEG+1) = GPPTMP
    ENDDO
  ENDIF

  DO JSV=NSV_PPBEG,NSV_PPEND
    IF (GPPBOUNDARY(JSV-NSV_PPBEG+1)) THEN
      IF (SIZE(PSVT)>0) THEN
        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
      ENDIF
    ENDIF
  ENDDO
ENDIF
!
IF ( LCONDSAMP .AND. IMI == 1) THEN
  IF (GFIRSTCALLCS) THEN
    ALLOCATE(GCSBOUNDARY(NSV_CS))
    GFIRSTCALLCS = .FALSE.
    DO JSV=NSV_CSBEG,NSV_CSEND
      GCSTMP = .FALSE.
      IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
      IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
      IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
      IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCSTMP = GCSTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
      GCSBOUNDARY(JSV-NSV_CSBEG+1) = GCSTMP
    ENDDO
  ENDIF

  DO JSV=NSV_CSBEG,NSV_CSEND
    IF (GCSBOUNDARY(JSV-NSV_CSBEG+1)) THEN
      IF (SIZE(PSVT)>0) THEN
        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
      ENDIF
    ENDIF
  ENDDO
ENDIF

IF (LBLOWSNOW .AND. IMI == 1) THEN
  IF (GFIRSTCALL3) THEN
    ALLOCATE(GSNWBOUNDARY(NSV_SNW))
    GFIRSTCALL3 = .FALSE.
    DO JSV=NSV_SNWBEG,NSV_SNWEND
       GCHTMP = .FALSE.
       IF (LWEST_ll().AND.HLBCX(1)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(1,:,:,JSV)==0)
       IF (LEAST_ll().AND.HLBCX(2)=='OPEN')  GCHTMP = GCHTMP .OR. ALL(PLBXSVM(ILBX,:,:,JSV)==0)
       IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,1,:,JSV)==0)
       IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GCHTMP = GCHTMP .OR. ALL(PLBYSVM(:,ILBY,:,JSV)==0)
       GSNWBOUNDARY(JSV-NSV_SNWBEG+1) = GCHTMP
    ENDDO
  ENDIF
ENDIF

#ifdef MNH_FOREFIRE
!ForeFire 
IF ( LFOREFIRE .AND. IMI == 1) THEN
  IF (GFIRSTCALLFF) THEN
    ALLOCATE(GFFBOUNDARY(NSV_FF))
    GFIRSTCALLFF = .FALSE.
    DO JSV=NSV_FFBEG,NSV_FFEND
      GFFTMP = .FALSE.
      IF (LWEST_ll().AND.HLBCX(1)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBXSVM(JPHEXT,:,:,JSV)==0)
      IF (LEAST_ll().AND.HLBCX(2)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBXSVM(ILBX-JPHEXT+1,:,:,JSV)==0)
      IF (LSOUTH_ll().AND.HLBCY(1)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBYSVM(:,JPHEXT,:,JSV)==0)
      IF (LNORTH_ll().AND.HLBCY(2)=='OPEN') GFFTMP = GFFTMP .OR. ALL(PLBYSVM(:,ILBY-JPHEXT+1,:,JSV)==0)
      GFFBOUNDARY(JSV-NSV_FFBEG+1) = GFFTMP
    ENDDO
  ENDIF

  DO JSV=NSV_FFBEG,NSV_FFEND
    IF (GFFBOUNDARY(JSV-NSV_FFBEG+1)) THEN
      IF (SIZE(PSVT)>0) THEN
        CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV))
      ENDIF
    ENDIF
  ENDDO
ENDIF
#endif
!
IF ( CELEC /= 'NONE' .AND. (NSV_ELEC_A(NDAD(IMI)) == 0 .OR. IMI == 1)) THEN
  CALL ION_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT)
ENDIF
!
!-------------------------------------------------------------------------------
!
END SUBROUTINE BOUNDARIES