Newer
Older

WAUTELET Philippe
committed
!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence

WAUTELET Philippe
committed
!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, &

RODIER Quentin
committed
PRHODJ,PRHODREF, &
!
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

RODIER Quentin
committed
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, &

RODIER Quentin
committed
PRHODJ,PRHODREF, &
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
! ####################################################################
!
!!**** *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

Gaelle Tanguy
committed
!! 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

RODIER Quentin
committed
!! Modification 01/2018 (JL Redelsperger) Correction for TKE treatment
!! Modification 03/02/2020 (B. Vié) Correction for SV with LIMA

WAUTELET Philippe
committed
! P. Wautelet 04/06/2020: correct call to Set_conc_lima
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
!
USE MODD_BLOWSNOW, ONLY : LBLOWSNOW,NBLOWSNOW_2D
USE MODD_BLOWSNOW_n

WAUTELET Philippe
committed
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

RODIER Quentin
committed
USE MODD_GRID_n, ONLY : XZZ

WAUTELET Philippe
committed
USE MODD_ELEC_DESCR
USE MODD_ELEC_n
#ifdef MNH_FOREFIRE
USE MODD_FOREFIRE, ONLY : LFOREFIRE
#endif

WAUTELET Philippe
committed
USE MODD_LBC_n, ONLY : XPOND
USE MODE_ll

Gaelle Tanguy
committed
USE MODD_NESTING, ONLY : NDAD

WAUTELET Philippe
committed
USE MODD_NSV
USE MODD_PARAMETERS
USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, LBOUND, LWARM, LCOLD
USE MODD_PARAM_n, ONLY : CELEC,CCLOUD
USE MODD_PASPOL, ONLY : LPASPOL
USE MODD_REF_n
USE MODD_SALT, ONLY : LSALT

WAUTELET Philippe
committed
USE MODE_SET_CONC_LIMA

RODIER Quentin
committed
USE MODI_INIT_AEROSOL_CONCENTRATION

WAUTELET Philippe
committed
USE MODI_ION_BOUNDARIES
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
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

RODIER Quentin
committed
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.
!
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
#ifdef MNH_FOREFIRE
LOGICAL, SAVE, DIMENSION(:), ALLOCATABLE :: GFFBOUNDARY
LOGICAL, SAVE :: GFIRSTCALLFF = .TRUE.
LOGICAL :: GFFTMP
#endif

RODIER Quentin
committed
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
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
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
!
!
!-------------------------------------------------------------------------------
!
!* 3. COMPUTE LB FIELDS AT TIME T
! ---------------------------
!
!
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(:,:,:)
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(:,:,:)
ZLBXTKET(:,:,:) = PLBXTKEM(:,:,:)
END IF
IF ( KRR > 0) THEN
ZLBXRT(:,:,:,:) = PLBXRM(:,:,:,:)
END IF
IF ( KSV > 0) THEN
ZLBXSVT(:,:,:,:) = PLBXSVM(:,:,:,:)
END IF
!
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(:,:,:)
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(:,:,:)
ZLBYTKET(:,:,:) = PLBYTKEM(:,:,:)
END IF
IF ( KRR > 0) THEN
ZLBYRT(:,:,:,:) = PLBYRM(:,:,:,:)
END IF
IF ( KSV > 0) THEN
ZLBYSVT(:,:,:,:) = PLBYSVM(:,:,:,:)
END IF
!
END IF
!
!
!-------------------------------------------------------------------------------
! PONDERATION COEFF for Non-Normal velocities and pot temperature
!

Gaelle Tanguy
committed
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,:,:))
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
!
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
!
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
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
!
!
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
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
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,:))
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
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
!
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
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
!
!
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,:))
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
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
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
!
!

RODIER Quentin
committed
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

RODIER Quentin
committed
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_CCN_FREE+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