Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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
! ######spl
SUBROUTINE SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, &
HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, &
ONOMIXLG,KSV_LGBEG,KSV_LGEND, &
PIMPL_MF, PTSTEP, PTSTEP_MET, PTSTEP_SV, &
PDZZ, PZZ, &
PRHODJ, PRHODREF, &
PPABSM, PEXNM, &
PSFTH,PSFRV, &
PTHM,PRM,PUM,PVM,PTKEM,PSVM, &
PDUDT_MF,PDVDT_MF, &
PDTHLDT_MF,PDRTDT_MF,PDSVDT_MF, &
PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF, &
PFLXZTHMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, &
PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, &
PU_UP, PV_UP, PTHV_UP, PW_UP, &
PFRAC_UP,PEMF,PDETR,PENTR, &
KKLCL,KKETL,KKCTL )
USE PARKIND1, ONLY : JPRB
USE YOMHOOK , ONLY : LHOOK, DR_HOOK
! #################################################################
!!
!!**** *SHALLOW_MF* -
!!
!!
!! PURPOSE
!! -------
!!**** The purpose of this routine is
!!
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!! J.Pergaud
!!
!! MODIFICATIONS
!! -------------
!! Original
!! V.Masson 09/2010 : optimization
!! S. Riette 18 May 2010 interface changed due to ice correction
!! S.Riette DUAL case
!! S. Riette Jan 2012: support for both order of vertical levels
!! S. Riette Nov 2016: HFRAC_ICE support
!! --------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_CST
USE MODD_PARAMETERS, ONLY: JPVEXT
USE MODD_CMFSHALL
USE MODI_THL_RT_FROM_TH_R_MF
USE MODI_COMPUTE_UPDRAFT
USE MODI_COMPUTE_UPDRAFT_RHCJ10
USE MODI_COMPUTE_UPDRAFT_RAHA
USE MODI_MF_TURB
USE MODI_MF_TURB_EXPL
USE MODI_COMPUTE_MF_CLOUD
!
IMPLICIT NONE
!* 0.1 Declaration of Arguments
!
!
!
INTEGER, INTENT(IN) :: KKA ! near ground array index
INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index
INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise
INTEGER, INTENT(IN) :: KRR ! number of moist var.
INTEGER, INTENT(IN) :: KRRL ! number of liquid water var.
INTEGER, INTENT(IN) :: KRRI ! number of ice water var.
CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme
! 'NONE' if no parameterization
CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud
! scheme
CHARACTER*1, INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme
LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum
LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer
INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer
INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer
REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness
REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep
REAL, INTENT(IN) :: PTSTEP_MET! Timestep for meteorological variables
REAL, INTENT(IN) :: PTSTEP_SV! Timestep for tracer variables
REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height of flux point
REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficients
REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size
REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the
! reference state
REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1
REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt
REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv
REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! Theta at t-dt
REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt
REAL, DIMENSION(:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt
REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! tke at t-dt
REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt
REAL, DIMENSION(:,:), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme
REAL, DIMENSION(:,:), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme
REAL, DIMENSION(:,:), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme
REAL, DIMENSION(:,:), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme
REAL, DIMENSION(:,:,:), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme
REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme
REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme
REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF
REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZRMF
REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZUMF
REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZVMF
REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics
REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics
REAL, DIMENSION(:,:), INTENT(OUT) :: PRV_UP ! Vapor updraft characteristics
REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics
REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics
REAL, DIMENSION(:,:), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics
REAL, DIMENSION(:,:), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics
REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics
REAL, DIMENSION(:,:), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics
REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_UP ! updraft fraction
REAL, DIMENSION(:,:), INTENT(INOUT) :: PEMF ! updraft mass flux
REAL, DIMENSION(:,:), INTENT(OUT) :: PDETR ! updraft detrainment
REAL, DIMENSION(:,:), INTENT(OUT) :: PENTR ! updraft entrainment
INTEGER,DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL
!
! 0.2 Declaration of local variables
!
REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: &
ZTHLM, & !
ZRTM, & !
ZTHVM, & !
ZEMF_O_RHODREF, & ! entrainment/detrainment
ZTHVDT,ZTHDT,ZRVDT, & ! tendencies
ZBUO_INTEG ! integrated buoyancy
REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE
REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: &
ZSV_UP,& ! updraft scalar var.
ZFLXZSVMF ! Flux
REAL, DIMENSION(SIZE(PTHM,1)) :: ZDEPTH ! Deepness of cloud
REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE_UP ! liquid/solid fraction in updraft
REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZRSAT_UP ! Rsat in updraft
LOGICAL :: GENTR_DETR ! flag to recompute entrainment, detrainment and mass flux
INTEGER :: IKB ! near ground physical index
INTEGER :: IKE ! uppest atmosphere physical index
INTEGER, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: IERR
!------------------------------------------------------------------------
!!! 1. Initialisation
REAL(KIND=JPRB) :: ZHOOK_HANDLE
IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',0,ZHOOK_HANDLE)
! vertical boundaries
IKB=KKA+KKL*JPVEXT
IKE=KKU-KKL*JPVEXT
! updraft governing variables
IF (HMF_UPDRAFT == 'EDKF') THEN
PENTR = 1.E20
PDETR = 1.E20
PEMF = 1.E20
ZBUO_INTEG = 1.E20
ENDIF
! Thermodynamics functions
ZFRAC_ICE(:,:) = 0.
WHERE(PRM(:,:,2)+PRM(:,:,4) > 1.E-20)
ZFRAC_ICE(:,:) = PRM(:,:,4) / (PRM(:,:,2)+PRM(:,:,4))
ENDWHERE
CALL COMPUTE_FRAC_ICE(HFRAC_ICE,ZFRAC_ICE(:,:),PTHM(:,:)*PEXNM(:,:), IERR(:,:))
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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
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
! Conservative variables at t-dt
CALL THL_RT_FROM_TH_R_MF(KRR,KRRL,KRRI, &
PTHM, PRM, PEXNM, &
ZTHLM, ZRTM )
! Virtual potential temperature at t-dt
ZTHVM(:,:) = PTHM(:,:)*((1.+XRV / XRD *PRM(:,:,1))/(1.+ZRTM(:,:)))
!
!!! 2. Compute updraft
!!! ---------------
!
IF (HMF_UPDRAFT == 'EDKF') THEN
GENTR_DETR = .TRUE.
CALL COMPUTE_UPDRAFT(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,&
ONOMIXLG,KSV_LGBEG,KSV_LGEND, &
PZZ,PDZZ, &
PSFTH,PSFRV,PPABSM,PRHODREF, &
PUM,PVM,PTKEM, &
PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, &
PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, &
PTHV_UP, PW_UP, PU_UP, PV_UP, ZSV_UP, &
PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,&
PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH )
ELSEIF (HMF_UPDRAFT == 'RHCJ') THEN
CALL COMPUTE_UPDRAFT_RHCJ10(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,&
ONOMIXLG,KSV_LGBEG,KSV_LGEND, &
PZZ,PDZZ, &
PSFTH,PSFRV,PPABSM,PRHODREF, &
PUM,PVM,PTKEM, &
PEXNM,PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, &
PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, &
PTHV_UP, PW_UP, PU_UP, PV_UP, ZSV_UP, &
PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,&
PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH )
ELSEIF (HMF_UPDRAFT == 'RAHA') THEN
CALL COMPUTE_UPDRAFT_RAHA(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,&
ONOMIXLG,KSV_LGBEG,KSV_LGEND, &
PZZ,PDZZ, &
PSFTH,PSFRV,PPABSM,PRHODREF, &
PUM,PVM,PTKEM, &
PEXNM,PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, &
PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, &
PTHV_UP, PW_UP, PU_UP, PV_UP, ZSV_UP, &
PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,&
PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH )
ELSEIF (HMF_UPDRAFT == 'DUAL') THEN
!Updraft characteristics are already computed and received by interface
ELSE
WRITE(*,*) ' STOP'
WRITE(*,*) ' NO UPDRAFT MODEL FOR EDKF : CMF_UPDRAFT =',HMF_UPDRAFT
CALL ABORT
STOP
ENDIF
!!! 5. Compute diagnostic convective cloud fraction and content
!!! --------------------------------------------------------
!
CALL COMPUTE_MF_CLOUD(KKA,IKB,IKE,KKU,KKL,KRR,KRRL,KRRI,&
HMF_CLOUD,ZFRAC_ICE, &
PRC_UP,PRI_UP,PEMF, &
PTHL_UP,PRT_UP,PFRAC_UP, &
PTHV_UP,ZFRAC_ICE_UP, &
ZRSAT_UP,PEXNM,ZTHLM,ZRTM, &
PTHM, ZTHVM, PRM, &
PDZZ,PZZ,KKLCL, &
PPABSM,PRHODREF, &
PRC_MF,PRI_MF,PCF_MF,PSIGMF,ZDEPTH)
!!! 3. Compute fluxes of conservative variables and their divergence = tendency
!!! ------------------------------------------------------------------------
!
ZEMF_O_RHODREF=PEMF/PRHODREF
IF ( PIMPL_MF > 1.E-10 ) THEN
CALL MF_TURB(KKA, IKB, IKE, KKU, KKL, OMIXUV, &
ONOMIXLG,KSV_LGBEG,KSV_LGEND, &
PIMPL_MF, PTSTEP, PTSTEP_MET, PTSTEP_SV, &
PDZZ, &
PRHODJ, &
ZTHLM,ZTHVM,ZRTM,PUM,PVM,PSVM, &
PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF,PDSVDT_MF, &
ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,ZSV_UP,&
PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, &
ZFLXZSVMF )
ELSE
CALL MF_TURB_EXPL(KKA, IKB, IKE, KKU, KKL, OMIXUV, &
PRHODJ, &
ZTHLM,ZTHVM,ZRTM,PUM,PVM, &
PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF, &
ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, &
PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF)
ENDIF
! security in the case HMF_UPDRAFT = 'DUAL'
! to be modified if 'DUAL' is evolving (momentum mixing for example)
IF( HMF_UPDRAFT == 'DUAL') THEN
! Now thetav_up from vdfhghtnn is used!
PFLXZTHVMF=0.
! Yes/No UV mixing!
! PDUDT_MF=0.
! PDVDT_MF=0.
ENDIF
!
IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',1,ZHOOK_HANDLE)
!
CONTAINS
INCLUDE "compute_frac_ice.func.h"
!
END SUBROUTINE SHALLOW_MF