Newer
Older

WAUTELET Philippe
committed
!MNH_LIC Copyright 2002-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_LES_INI_TIMESTEP_n
! #######################
!
!
INTERFACE LES_INI_TIMESTEP_n
!
!
INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step
!
END SUBROUTINE LES_INI_TIMESTEP_n
!
END INTERFACE
!
END MODULE MODI_LES_INI_TIMESTEP_n
! ##############################
! ##############################
!
!
!!**** *LES_INI_TIMESTEP_n* initializes the LES variables for
!! the current time-step of model _n
!!
!!
!! PURPOSE
!! -------
!!
!! EXTERNAL
!! --------
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!! REFERENCE
!! ---------
!!
!! AUTHOR
!! ------
!! V. Masson
!!
!! MODIFICATIONS
!! -------------
!! Original 06/11/02

WAUTELET Philippe
committed
! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
!!
!! --------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CST
USE MODD_NSV
USE MODD_LES
USE MODD_LES_n
USE MODD_FIELD_n
USE MODD_METRICS_n
USE MODD_REF_n
USE MODD_CONF_n
USE MODD_TIME_n
USE MODD_DYN_n
USE MODD_TIME
USE MODD_CONF
USE MODD_LES_BUDGET
!

WAUTELET Philippe
committed
use mode_datetime, only: Datetime_distance
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
USE MODE_ll
USE MODE_MODELN_HANDLER
!
USE MODI_LES_VER_INT
USE MODI_THL_RT_FROM_TH_R
USE MODI_LES_MEAN_ll
USE MODI_SHUMAN
!
USE MODI_SECOND_MNH
USE MODI_LES_CLOUD_MASKS_N
!
IMPLICIT NONE
!
!
!* 0.1 declarations of arguments
!
!
INTEGER, INTENT(IN) :: KTCOUNT ! current model time-step
!
!
! 0.2 declaration of local variables
!
INTEGER :: IXOR_ll, IYOR_ll ! origine point coordinates
! ! of current processor domain
! ! on model domain on all
! ! processors
INTEGER :: IIB_ll, IJB_ll ! SO point coordinates of
! ! current processor phys. domain
! ! on model domain on all
! ! processors
INTEGER :: IIE_ll, IJE_ll ! NE point coordinates of
! ! current processor phys. domain
! ! on model domain on all
! ! processors
INTEGER :: IIINF_MASK, IISUP_MASK ! cart. mask local proc. limits
INTEGER :: IJINF_MASK, IJSUP_MASK ! cart. mask local proc. limits
!
INTEGER :: JK ! vertical loop counter
INTEGER :: IIB, IJB, IIE, IJE ! hor. indices
INTEGER :: IIU, IJU ! hor. indices
INTEGER :: IKU ! ver. index
INTEGER :: IRR, IRRC, IRRR, IRRI, IRRS, IRRG ! moist variables indices
!
INTEGER :: JSV ! scalar variables counter
!
REAL :: ZTIME1, ZTIME2 ! CPU time counters
!
REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL ! theta_l
REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT ! total water
REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZL ! Latent heat of vaporization
REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCP ! Cp
REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Exner function
INTEGER :: IMI ! current model index
!-------------------------------------------------------------------------------
!
!* 1. Does current time-step is a LES time-step?
! -----------------------------------------
!
LLES_CALL= .FALSE.
!
CALL SECOND_MNH(ZTIME1)
!
IF (NLES_TCOUNT==NLES_TIMES) LLES_CALL=.FALSE.
!
IF ( KTCOUNT>1 .AND. MOD (KTCOUNT-1,NLES_DTCOUNT)==0) LLES_CALL=.TRUE.
!
IF (.NOT. LLES_CALL) RETURN
!
CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR, &
LUSERI, LUSERS, LUSERG, LUSERH )
!
NLES_TCOUNT = NLES_TCOUNT + 1
!
NLES_CURRENT_TCOUNT = NLES_TCOUNT
!

WAUTELET Philippe
committed
xles_dates(nles_tcount ) = tdtcur
call Datetime_distance( tdtseg, tdtcur, xles_times(nles_tcount ) )
!
!-------------------------------------------------------------------------------
!
CALL GET_OR_ll ('B',IXOR_ll,IYOR_ll)
CALL GET_DIM_EXT_ll('B',IIU,IJU)
CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
!
IIB_ll=IXOR_ll+IIB-1
IJB_ll=IYOR_ll+IJB-1
IIE_ll=IXOR_ll+IIE-1
IJE_ll=IYOR_ll+IJE-1
!
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
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
!
IMI = GET_CURRENT_MODEL_INDEX()
!
!-------------------------------------------------------------------------------
!
!* 2. Definition of masks
! -------------------
!
!* 2.1 Cartesian (sub-)domain (on local processor)
! ----------------------
!
ALLOCATE(LLES_CURRENT_CART_MASK(IIU,IJU,NLES_K))
!
IIINF_MASK = MAX(IIB, NLESn_IINF(IMI)-(IIB_ll-1-JPHEXT))
IJINF_MASK = MAX(IJB, NLESn_JINF(IMI)-(IJB_ll-1-JPHEXT))
IISUP_MASK = MIN(IIE, NLESn_ISUP(IMI)-(IIB_ll-1-JPHEXT))
IJSUP_MASK = MIN(IJE, NLESn_JSUP(IMI)-(IJB_ll-1-JPHEXT))
!
!
LLES_CURRENT_CART_MASK(:,:,:) = .FALSE.
LLES_CURRENT_CART_MASK(IIINF_MASK:IISUP_MASK,IJINF_MASK:IJSUP_MASK,:) = .TRUE.
!
CLES_CURRENT_LBCX(:) = CLES_LBCX(:,IMI)
CLES_CURRENT_LBCY(:) = CLES_LBCY(:,IMI)
!
!-------------------------------------------------------------------------------
!
!* 3. Definition of LES vertical grid for this model
! ----------------------------------------------
!
IF (CLES_LEVEL_TYPE=='Z') THEN
IF (ALLOCATED(XCOEFLIN_CURRENT_LES)) DEALLOCATE(XCOEFLIN_CURRENT_LES)
IF (ALLOCATED(NKLIN_CURRENT_LES )) DEALLOCATE(NKLIN_CURRENT_LES )
!
ALLOCATE(XCOEFLIN_CURRENT_LES(IIU,IJU,NLES_K))
ALLOCATE(NKLIN_CURRENT_LES (IIU,IJU,NLES_K))
!
XCOEFLIN_CURRENT_LES(:,:,:) = XCOEFLIN_LES(:,:,:)
NKLIN_CURRENT_LES (:,:,:) = NKLIN_LES (:,:,:)
END IF
!
!-------------------------------------------------------------------------------
!
!* 4. Definition of variables used in budgets for current model
! ---------------------------------------------------------
!
IF (LUSERC) THEN
ALLOCATE(XCURRENT_L_O_EXN_CP (IIU,IJU,IKU))
ELSE
ALLOCATE(XCURRENT_L_O_EXN_CP (0,0,0))
END IF
ALLOCATE(XCURRENT_RHODJ (IIU,IJU,IKU))
!
!* coefficients for Th to Thl conversion
!
IF (LUSERC) THEN
ALLOCATE(ZL (IIU,IJU,IKU))
ALLOCATE(ZEXN(IIU,IJU,IKU))
ALLOCATE(ZCP (IIU,IJU,IKU))
!
!* Exner function
!
!
!* Latent heat of vaporization
!
ZL(:,:,:) = XLVTT + (XCPD-XCL) * (XTHT(:,:,:)*ZEXN(:,:,:)-XTT)
!
!* heat capacity at constant pressure of the humid air
!
ZCP(:,:,:) = XCPD
IRR=2
ZCP(:,:,:) = ZCP(:,:,:) + XCPV * XRT(:,:,:,1)
ZCP(:,:,:) = ZCP(:,:,:) + XCL * XRT(:,:,:,2)
ZCP(:,:,:) = ZCP(:,:,:) + XCL * XRT(:,:,:,IRR)
END IF
IF (LUSERI) THEN
IRR=IRR+1
ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR)
END IF
IF (LUSERS) THEN
IRR=IRR+1
ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR)
END IF
IF (LUSERG) THEN
IRR=IRR+1
ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR)
END IF
IF (LUSERH) THEN
IRR=IRR+1
ZCP(:,:,:) = ZCP(:,:,:) + XCI * XRT(:,:,:,IRR)
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
END IF
!
!* L / (Exn * Cp)
!
XCURRENT_L_O_EXN_CP(:,:,:) = ZL(:,:,:) / ZEXN(:,:,:) / ZCP(:,:,:)
!
DEALLOCATE(ZL )
DEALLOCATE(ZEXN)
DEALLOCATE(ZCP )
END IF
!
!* other initializations
!
XCURRENT_RHODJ=XRHODJ
!
LCURRENT_USERV=LUSERV
LCURRENT_USERC=LUSERC
LCURRENT_USERR=LUSERR
LCURRENT_USERI=LUSERI
LCURRENT_USERS=LUSERS
LCURRENT_USERG=LUSERG
LCURRENT_USERH=LUSERH
!
NCURRENT_RR = NRR
!
ALLOCATE(XCURRENT_RTHS (IIU,IJU,IKU))
ALLOCATE(XCURRENT_RTKES(IIU,IJU,IKU))
ALLOCATE(XCURRENT_RRS (IIU,IJU,IKU,NRR))
ALLOCATE(XCURRENT_RTHLS(IIU,IJU,IKU))
ALLOCATE(XCURRENT_RRTS (IIU,IJU,IKU))
!
XCURRENT_RTHS =XRTHS
XCURRENT_RTKES=XRTKES
XCURRENT_RRS =XRRS
CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, &
LUSERI, LUSERS, LUSERG, LUSERH, &
XCURRENT_L_O_EXN_CP, &
XCURRENT_RTHS, XCURRENT_RRS, &
XCURRENT_RTHLS, XCURRENT_RRTS )
ALLOCATE(X_LES_BU_RES_KE (NLES_K,NLES_TOT))
ALLOCATE(X_LES_BU_RES_WThl (NLES_K,NLES_TOT))
ALLOCATE(X_LES_BU_RES_Thl2 (NLES_K,NLES_TOT))
ALLOCATE(X_LES_BU_SBG_Tke (NLES_K,NLES_TOT))
ALLOCATE(X_LES_BU_RES_WRt (NLES_K,NLES_TOT))
ALLOCATE(X_LES_BU_RES_Rt2 (NLES_K,NLES_TOT))
ALLOCATE(X_LES_BU_RES_ThlRt(NLES_K,NLES_TOT))
ALLOCATE(X_LES_BU_RES_Sv2 (NLES_K,NLES_TOT,NSV))
ALLOCATE(X_LES_BU_RES_WSv (NLES_K,NLES_TOT,NSV))
X_LES_BU_RES_KE = 0.
X_LES_BU_RES_WThl = 0.
X_LES_BU_RES_Thl2 = 0.
X_LES_BU_SBG_Tke = 0.
X_LES_BU_RES_WRt = 0.
X_LES_BU_RES_Rt2 = 0.
X_LES_BU_RES_ThlRt= 0.
X_LES_BU_RES_Sv2 = 0.
X_LES_BU_RES_WSv = 0.
!
!-------------------------------------------------------------------------------
!
!* 4. Definition of anomaly fields
! ----------------------------
!
ALLOCATE (XU_ANOM (IIU,IJU,NLES_K))
ALLOCATE (XV_ANOM (IIU,IJU,NLES_K))
ALLOCATE (XW_ANOM (IIU,IJU,NLES_K))
ALLOCATE (XTHL_ANOM(IIU,IJU,NLES_K))
IF (LUSERV) THEN
ALLOCATE (XRT_ANOM (IIU,IJU,NLES_K))
ELSE
ALLOCATE (XRT_ANOM (0,0,0))
END IF
ALLOCATE (XSV_ANOM (IIU,IJU,NLES_K,NSV))
!
!* 4.1 conservative variables
! ----------------------
!
ALLOCATE(ZTHL(IIU,IJU,IKU))
ALLOCATE(ZRT (IIU,IJU,IKU))
CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, &
LUSERI, LUSERS, LUSERG, LUSERH, &
XCURRENT_L_O_EXN_CP, &
ZTHL, ZRT )
!
!* 4.2 anomaly fields on the LES grid
! ------------------------------
!
CALL LES_ANOMALY_FIELD(MXF(XUT),XU_ANOM)
CALL LES_ANOMALY_FIELD(MYF(XVT),XV_ANOM)

WAUTELET Philippe
committed
CALL LES_ANOMALY_FIELD(MZF(XWT),XW_ANOM)
CALL LES_ANOMALY_FIELD(ZTHL,XTHL_ANOM)
IF (LUSERV) CALL LES_ANOMALY_FIELD(ZRT,XRT_ANOM)
DO JSV=1,NSV
CALL LES_ANOMALY_FIELD(XSVT(:,:,:,JSV),XSV_ANOM(:,:,:,JSV))
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
END DO
!
!-------------------------------------------------------------------------------
!
DEALLOCATE(ZTHL)
DEALLOCATE(ZRT )
!-------------------------------------------------------------------------------
!
!* 6.0 Nebulosity masks
! ----------------
!
CALL LES_CLOUD_MASKS_n
!
!-------------------------------------------------------------------------------
CALL SECOND_MNH(ZTIME2)
XTIME_LES_BU = XTIME_LES_BU + ZTIME2 - ZTIME1
!--------------------------------------------------------------------------------
!
CONTAINS
!
!--------------------------------------------------------------------------------
!
SUBROUTINE LES_ANOMALY_FIELD(PF,PF_ANOM)
!
REAL, DIMENSION(:,:,:), INTENT(IN) :: PF
REAL, DIMENSION(:,:,:), INTENT(OUT) :: PF_ANOM
REAL, DIMENSION(SIZE(PF_ANOM,3)) :: ZMEAN
INTEGER :: JI, JJ
CALL LES_VER_INT(PF, PF_ANOM)
CALL LES_MEAN_ll(PF_ANOM, LLES_CURRENT_CART_MASK, ZMEAN )
DO JJ=1,SIZE(PF_ANOM,2)
DO JI=1,SIZE(PF_ANOM,1)
PF_ANOM(JI,JJ,:) = PF_ANOM(JI,JJ,:) - ZMEAN(:)
END DO
END DO
END SUBROUTINE LES_ANOMALY_FIELD
!--------------------------------------------------------------------------------
!
END SUBROUTINE LES_INI_TIMESTEP_n