Newer
Older
!MNH_LIC Copyright 1994-2014 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.
!-----------------------------------------------------------------
!--------------- special set of characters for RCS information
!-----------------------------------------------------------------
! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/boundaries.f90,v $ $Revision: 1.3.2.1.2.1.2.2.12.3 $ $Date: 2014/01/09 15:01:54 $
!-----------------------------------------------------------------
!#####################
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, &
!
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(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, &
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
165
166
167
! ####################################################################
!
!!**** *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
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
!
USE MODD_PARAMETERS
USE MODD_CTURB
USE MODD_CONF
USE MODD_NSV
USE MODD_CH_MNHC_n, ONLY : LUSECHEM, LUSECHIC
USE MODD_SALT, ONLY : LSALT
USE MODD_PASPOL, ONLY : LPASPOL
USE MODD_CONDSAMP, ONLY : LCONDSAMP
USE MODD_ELEC_DESCR
USE MODD_ELEC_n
USE MODD_REF_n

Gaelle Tanguy
committed
USE MODD_LBC_n, ONLY : XPOND
!
USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, LBOUND, LWARM, LCOLD
!
#ifdef MNH_FOREFIRE
USE MODD_FOREFIRE, ONLY : LFOREFIRE
#endif

Gaelle Tanguy
committed
USE MODD_NESTING, ONLY : NDAD
201
202
203
204
205
206
207
208
209
210
211
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
!
USE MODE_MODELN_HANDLER
!
USE MODI_ION_BOUNDARIES
USE MODI_CH_BOUNDARIES
!
USE MODE_ll
!
!
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(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, &
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
!-------------------------------------------------------------------------------
!
!* 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,:,:)
!
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,ZLBXTKET(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
!
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
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
END IF
!
END DO
!
!
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,:,:)
!
END DO
!
IF(SIZE(PUT) /= 0) PUT(IIE+1 ,:,:) = 0. ! set the normal velocity
!
!* 5.2 OPEN CASE:
! =========
!
CASE ('OPEN')
!
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
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,ZLBXTKET(ILBX-JPHEXT+JI,:,:))
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
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
END IF
!
END DO
!
!
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,:)
!
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,ZLBYTKET(:,JJ,:))
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
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
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
END IF
!
END DO
!
!
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,:)
!
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,ZLBYTKET(:,ILBY-JPHEXT+JJ,:))
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
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
!
!
END SELECT
END IF
!
!
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
IF (CCLOUD == 'LIMA' .AND. IMI == 1) THEN
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
DO JSV=NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1 ! LBC for CCN from MACC
IF (GLIMABOUNDARY(JSV-NSV_LIMA_CCN_FREE+1)) THEN
IF (SIZE(PSVT)>0) THEN
CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV))
ENDIF
ENDIF
ENDDO
DO JSV=NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1 ! LBC for IFN from MACC
IF (GLIMABOUNDARY(JSV-NSV_LIMA_IFN_FREE+1)) THEN
IF (SIZE(PSVT)>0) THEN
CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV))
ENDIF
ENDIF
ENDDO
ENDIF
!
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))
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))
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))
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))
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