module_cumulus_driver.F
References to this file elsewhere.
1 !WRF:MEDIATION_LAYER:PHYSICS
2 !
3
4 MODULE module_cumulus_driver
5 CONTAINS
6 SUBROUTINE cumulus_driver( &
7 ! Order dependent args for domain, mem, and tile dims
8 ids,ide, jds,jde, kds,kde &
9 ,ims,ime, jms,jme, kms,kme &
10 ,i_start,i_end,j_start,j_end,kts,kte,num_tiles &
11 ! Order independent args (use VAR= in call)
12 ! --Prognostic
13 ,u,v,th,t,w &
14 ,p,pi,rho &
15 ! --Other arguments
16 ,itimestep,dt,dx &
17 ,rainc,raincv,nca &
18 ,dz8w,p8w,forcet,forceq &
19 ,w0avg,stepcu,gsw &
20 ,cldefi,lowlyr,xland,cu_act_flag,warm_rain &
21 ,htop,hbot,kpbl,ht &
22 ,ensdim,maxiens,maxens,maxens2,maxens3 &
23 ! Package selection variable
24 ,cu_physics &
25 ! Optional moisture tracers
26 ,qv_curr, qc_curr, qr_curr &
27 ,qi_curr, qs_curr, qg_curr &
28 ,qv_prev, qc_prev, qr_prev &
29 ,qi_prev, qs_prev, qg_prev &
30 ! Optional arguments for GD scheme
31 ,apr_gr,apr_w,apr_mc,apr_st,apr_as,apr_capma &
32 ,apr_capme,apr_capmi &
33 ,mass_flux,xf_ens,pr_ens &
34 ,gd_cloud,gd_cloud2 &
35 ! Optional moisture and other tendencies
36 ,rqvcuten,rqccuten,rqrcuten &
37 ,rqicuten,rqscuten,rqgcuten &
38 ,rqvblten,rqvften &
39 ,rthcuten,rthraten,rthblten,rthften &
40 ! Optional moisture tracer flags
41 ,f_qv,f_qc,f_qr &
42 ,f_qi,f_qs,f_qg &
43 )
44 !----------------------------------------------------------------------
45 USE module_model_constants
46 USE module_state_description, ONLY: KFSCHEME,BMJSCHEME &
47 ,KFETASCHEME,GDSCHEME &
48 ,SASSCHEME
49
50 ! *** add new modules of schemes here
51
52 USE module_cu_kf
53 USE module_cu_bmj
54 USE module_cu_kfeta
55 USE module_cu_gd
56 USE module_cu_sas
57
58 ! This driver calls subroutines for the cumulus parameterizations.
59 !
60 ! 1. Kain & Fritsch (1993)
61 ! 2. Betts-Miller-Janjic (Janjic, 1994)
62 !
63 !----------------------------------------------------------------------
64 IMPLICIT NONE
65 !======================================================================
66 ! Grid structure in physics part of WRF
67 !----------------------------------------------------------------------
68 ! The horizontal velocities used in the physics are unstaggered
69 ! relative to temperature/moisture variables. All predicted
70 ! variables are carried at half levels except w, which is at full
71 ! levels. Some arrays with names (*8w) are at w (full) levels.
72 !
73 !----------------------------------------------------------------------
74 ! In WRF, kms (smallest number) is the bottom level and kme (largest
75 ! number) is the top level. In your scheme, if 1 is at the top level,
76 ! then you have to reverse the order in the k direction.
77 !
78 ! kme - half level (no data at this level)
79 ! kme ----- full level
80 ! kme-1 - half level
81 ! kme-1 ----- full level
82 ! .
83 ! .
84 ! .
85 ! kms+2 - half level
86 ! kms+2 ----- full level
87 ! kms+1 - half level
88 ! kms+1 ----- full level
89 ! kms - half level
90 ! kms ----- full level
91 !
92 !======================================================================
93 ! Definitions
94 !-----------
95 ! Rho_d dry density (kg/m^3)
96 ! Theta_m moist potential temperature (K)
97 ! Qv water vapor mixing ratio (kg/kg)
98 ! Qc cloud water mixing ratio (kg/kg)
99 ! Qr rain water mixing ratio (kg/kg)
100 ! Qi cloud ice mixing ratio (kg/kg)
101 ! Qs snow mixing ratio (kg/kg)
102 !-----------------------------------------------------------------
103 !-- DT time step (second)
104 !-- itimestep number of time step (integer)
105 !-- DX horizontal space interval (m)
106 !-- rr dry air density (kg/m^3)
107 !
108 !-- RTHCUTEN Theta tendency due to
109 ! cumulus scheme precipitation (K/s)
110 !-- RQVCUTEN Qv tendency due to
111 ! cumulus scheme precipitation (kg/kg/s)
112 !-- RQRCUTEN Qr tendency due to
113 ! cumulus scheme precipitation (kg/kg/s)
114 !-- RQCCUTEN Qc tendency due to
115 ! cumulus scheme precipitation (kg/kg/s)
116 !-- RQSCUTEN Qs tendency due to
117 ! cumulus scheme precipitation (kg/kg/s)
118 !-- RQICUTEN Qi tendency due to
119 ! cumulus scheme precipitation (kg/kg/s)
120 !
121 !-- RAINC accumulated total cumulus scheme precipitation (mm)
122 !-- RAINCV cumulus scheme precipitation (mm)
123 !-- NCA counter of the cloud relaxation
124 ! time in KF cumulus scheme (integer)
125 !-- u_phy u-velocity interpolated to theta points (m/s)
126 !-- v_phy v-velocity interpolated to theta points (m/s)
127 !-- th_phy potential temperature (K)
128 !-- t_phy temperature (K)
129 !-- w vertical velocity (m/s)
130 !-- moist moisture array (4D - last index is species) (kg/kg)
131 !-- dz8w dz between full levels (m)
132 !-- p8w pressure at full levels (Pa)
133 !-- p_phy pressure (Pa)
134 !-- pi_phy exner function (dimensionless)
135 ! points (dimensionless)
136 !-- RTHRATEN radiative temp forcing for Grell-Devenyi scheme
137 !-- RTHBLTEN PBL temp forcing for Grell-Devenyi scheme
138 !-- RQVBLTEN PBL moisture forcing for Grell-Devenyi scheme
139 !-- RTHFTEN
140 !-- RQVFTEN
141 !-- MASS_FLUX
142 !-- XF_ENS
143 !-- PR_ENS
144 !-- warm_rain
145 !-- CU_ACT_FLAG
146 !-- W0AVG average vertical velocity, (for KF scheme) (m/s)
147 !-- rho density (kg/m^3)
148 !-- CLDEFI precipitation efficiency (for BMJ scheme) (dimensionless)
149 !-- STEPCU # of fundamental timesteps between convection calls
150 !-- XLAND land-sea mask (1.0 for land; 2.0 for water)
151 !-- LOWLYR index of lowest model layer above the ground
152 !-- XLV0 latent heat of vaporization constant
153 ! used in temperature dependent formula (J/kg)
154 !-- XLV1 latent heat of vaporization constant
155 ! used in temperature dependent formula (J/kg/K)
156 !-- XLS0 latent heat of sublimation constant
157 ! used in temperature dependent formula (J/kg)
158 !-- XLS1 latent heat of sublimation constant
159 ! used in temperature dependent formula (J/kg/K)
160 !-- R_d gas constant for dry air ( 287. J/kg/K)
161 !-- R_v gas constant for water vapor (461 J/k/kg)
162 !-- Cp specific heat at constant pressure (1004 J/k/kg)
163 !-- rvovrd R_v divided by R_d (dimensionless)
164 !-- G acceleration due to gravity (m/s^2)
165 !-- EP_1 constant for virtual temperature
166 ! (R_v/R_d - 1) (dimensionless)
167 !-- pi_phy the exner function, (p/p0)**(R/Cp) (none unit)
168 !-- ids start index for i in domain
169 !-- ide end index for i in domain
170 !-- jds start index for j in domain
171 !-- jde end index for j in domain
172 !-- kds start index for k in domain
173 !-- kde end index for k in domain
174 !-- ims start index for i in memory
175 !-- ime end index for i in memory
176 !-- jms start index for j in memory
177 !-- jme end index for j in memory
178 !-- kms start index for k in memory
179 !-- kme end index for k in memory
180 !-- i_start start indices for i in tile
181 !-- i_end end indices for i in tile
182 !-- j_start start indices for j in tile
183 !-- j_end end indices for j in tile
184 !-- kts start index for k in tile
185 !-- kte end index for k in tile
186 !-- num_tiles number of tiles
187 !-- HBOT index of lowest model layer with convection
188 !-- HTOP index of highest model layer with convection
189 !-- LBOT index of lowest model layer with convection
190 !-- LTOP index of highest model layer with convection
191 !-- KPBL layer index of the PBL
192 !
193 !======================================================================
194
195 INTEGER, INTENT(IN ) :: &
196 ids,ide, jds,jde, kds,kde, &
197 ims,ime, jms,jme, kms,kme, &
198 kts,kte, &
199 itimestep, num_tiles
200 INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
201 & i_start,i_end,j_start,j_end
202
203 INTEGER, INTENT(IN ) :: &
204 ensdim,maxiens,maxens,maxens2,maxens3
205
206 INTEGER, INTENT(IN ) :: cu_physics
207 INTEGER, INTENT(IN ) :: STEPCU
208 LOGICAL, INTENT(IN ) :: warm_rain
209
210 INTEGER,DIMENSION( ims:ime, jms:jme ), &
211 INTENT(IN ) :: LOWLYR
212
213 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
214 INTENT(IN ) :: &
215 dz8w &
216 , p8w &
217 , p &
218 , pi &
219 , u &
220 , v &
221 , th &
222 , t &
223 , rho &
224 , w
225
226 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
227 INTENT(INOUT) :: &
228 W0AVG
229
230 REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: &
231 GSW,HT,XLAND
232
233 REAL, DIMENSION( ims:ime , jms:jme ), &
234 INTENT(INOUT) :: RAINC &
235 , RAINCV &
236 , NCA &
237 , HTOP &
238 , HBOT &
239 , CLDEFI
240
241
242 INTEGER, DIMENSION( ims:ime , jms:jme ), &
243 INTENT(IN) :: KPBL
244
245
246 LOGICAL, DIMENSION( ims:ime , jms:jme ), &
247 INTENT(INOUT) :: CU_ACT_FLAG
248
249 REAL, INTENT(IN ) :: DT, DX
250
251 !
252 ! optional arguments
253 !
254 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
255 OPTIONAL, INTENT(INOUT) :: &
256 ! optional moisture tracers
257 ! 2 time levels; if only one then use CURR
258 qv_curr, qc_curr, qr_curr &
259 ,qi_curr, qs_curr, qg_curr &
260 ,qv_prev, qc_prev, qr_prev &
261 ,qi_prev, qs_prev, qg_prev &
262 ! optional moisture and other tendencies
263 ,rqvcuten,rqccuten,rqrcuten &
264 ,rqicuten,rqscuten,rqgcuten &
265 ,rqvblten,rqvften &
266 ,rthraten,rthblten &
267 , forcet &
268 , forceq &
269 ,rthften,rthcuten
270
271 REAL, DIMENSION( ims:ime , jms:jme ), &
272 OPTIONAL, &
273 INTENT(INOUT) :: &
274 apr_gr,apr_w,apr_mc,apr_st,apr_as,apr_capma &
275 ,apr_capme,apr_capmi &
276 , MASS_FLUX
277 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
278 OPTIONAL, INTENT(INOUT) :: &
279 GD_CLOUD,GD_CLOUD2
280 REAL, DIMENSION( ims:ime , jms:jme , 1:ensdim ), &
281 OPTIONAL, &
282 INTENT(INOUT) :: XF_ENS, PR_ENS
283
284 !
285 ! Flags relating to the optional tendency arrays declared above
286 ! Models that carry the optional tendencies will provdide the
287 ! optional arguments at compile time; these flags all the model
288 ! to determine at run-time whether a particular tracer is in
289 ! use or not.
290 !
291 LOGICAL, INTENT(IN), OPTIONAL :: &
292 f_qv &
293 ,f_qc &
294 ,f_qr &
295 ,f_qi &
296 ,f_qs &
297 ,f_qg
298
299
300 ! LOCAL VAR
301
302 INTEGER :: i,j,k,its,ite,jts,jte,ij
303
304 !-----------------------------------------------------------------
305
306 IF (cu_physics .eq. 0) return
307
308 ! DON'T JUDGE TIME STEP HERE, SINCE KF NEEDS ACCUMULATED W FIELD.
309 ! DO IT INSIDE THE INDIVIDUAL CUMULUS SCHEME
310
311 ! SET START AND END POINTS FOR TILES
312 !$OMP PARALLEL DO &
313 !$OMP PRIVATE ( ij ,its,ite,jts,jte, i,j,k)
314
315 DO ij = 1 , num_tiles
316 its = i_start(ij)
317 ite = i_end(ij)
318 jts = j_start(ij)
319 jte = j_end(ij)
320
321
322 cps_select: SELECT CASE(cu_physics)
323
324 CASE (KFSCHEME)
325 CALL wrf_debug(100,'in kfcps')
326
327 CALL KFCPS( &
328 ! order independent arguments
329 DT=dt ,KTAU=itimestep ,DX=dx ,RHO=rho &
330 ,U=u ,V=v ,TH=th ,T=t ,W=w &
331 ,PCPS=p ,PI=pi &
332 ,XLV0=xlv0 ,XLV1=xlv1 ,XLS0=xls0 ,XLS1=xls1 &
333 ,RAINCV=raincv ,NCA=nca &
334 ,DZ8W=dz8w &
335 ,W0AVG=w0avg &
336 ,CP=cp ,R=r_d ,G=g ,EP1=ep_1 ,EP2=ep_2 &
337 ,SVP1=svp1 ,SVP2=svp2 ,SVP3=svp3 ,SVPT0=svpt0 &
338 ,STEPCU=stepcu &
339 ,CU_ACT_FLAG=cu_act_flag &
340 ,WARM_RAIN=warm_rain &
341 ,QV=qv_curr &
342 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
343 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
344 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
345 ! optionals
346 ,RTHCUTEN=rthcuten ,RQVCUTEN=rqvcuten &
347 ,RQCCUTEN=rqccuten ,RQRCUTEN=rqrcuten &
348 ,RQICUTEN=rqicuten ,RQSCUTEN=rqscuten &
349 ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
350 ,F_QI=f_qi,F_QS=f_qs &
351 )
352
353 CASE (BMJSCHEME)
354 CALL wrf_debug(100,'in bmj_cps')
355 CALL BMJDRV( &
356 TH=th,T=T ,RAINCV=raincv, RHO=rho &
357 ,DT=dt ,ITIMESTEP=itimestep ,STEPCU=stepcu &
358 ,CUTOP=htop, CUBOT=hbot, KPBL=kpbl &
359 ,DZ8W=dz8w ,PINT=p8w, PMID=p, PI=pi &
360 ,CP=cp ,R=r_d ,ELWV=xlv ,ELIV=xls ,G=g &
361 ,TFRZ=svpt0 ,D608=ep_1 ,CLDEFI=cldefi &
362 ,LOWLYR=lowlyr ,XLAND=xland &
363 ,CU_ACT_FLAG=cu_act_flag &
364 ,QV=qv_curr &
365 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
366 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
367 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
368 ! optionals
369 ,RTHCUTEN=rthcuten ,RQVCUTEN=rqvcuten &
370 )
371
372 CASE (KFETASCHEME)
373 CALL wrf_debug(100,'in kf_eta_cps')
374 CALL KF_ETA_CPS( &
375 U=u ,V=v ,TH=th ,T=t ,W=w ,RHO=rho &
376 ,RAINCV=raincv, NCA=nca ,DZ8W=dz8w &
377 ,PCPS=p, PI=pi ,W0AVG=W0AVG &
378 ,CUTOP=HTOP,CUBOT=HBOT &
379 ,XLV0=XLV0 ,XLV1=XLV1 ,XLS0=XLS0 ,XLS1=XLS1 &
380 ,CP=CP ,R=R_d ,G=G ,EP1=EP_1 ,EP2=EP_2 &
381 ,SVP1=SVP1 ,SVP2=SVP2 ,SVP3=SVP3 ,SVPT0=SVPT0 &
382 ,DT=dt ,KTAU=itimestep ,DX=dx &
383 ,STEPCU=stepcu &
384 ,CU_ACT_FLAG=cu_act_flag ,warm_rain=warm_rain &
385 ,QV=qv_curr &
386 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
387 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
388 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
389 ! optionals
390 ,RTHCUTEN=rthcuten &
391 ,RQVCUTEN=rqvcuten ,RQCCUTEN=rqccuten &
392 ,RQRCUTEN=rqrcuten ,RQICUTEN=rqicuten &
393 ,RQSCUTEN=rqscuten &
394 ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
395 ,F_QI=f_qi,F_QS=f_qs &
396 )
397
398 CASE (GDSCHEME)
399 CALL wrf_debug(100,'in grelldrv')
400 CALL GRELLDRV( &
401 DT=dt, ITIMESTEP=itimestep, DX=dx &
402 ,U=u,V=v,T=t,W=w ,RHO=rho &
403 ,P=p,PI=pi ,Q=qv_curr ,RAINCV=raincv &
404 ,DZ8W=dz8w,P8W=p8w,XLV=xlv,CP=cp,G=g,R_V=r_v &
405 ,APR_GR=apr_gr,APR_W=apr_w,APR_MC=apr_mc &
406 ,APR_ST=apr_st,APR_AS=apr_as &
407 ,APR_CAPMA=apr_capma,APR_CAPME=apr_capme &
408 ,APR_CAPMI=apr_capmi,MASS_FLUX=mass_flux &
409 ,XF_ENS=xf_ens,PR_ENS=pr_ens,HT=ht &
410 ,xland=xland,gsw=gsw &
411 ,GDC=gd_cloud,GDC2=gd_cloud2 &
412 ,ENSDIM=ensdim,MAXIENS=maxiens,MAXENS=maxens &
413 ,MAXENS2=maxens2,MAXENS3=maxens3 &
414 ,STEPCU=STEPCU,htop=htop,hbot=hbot &
415 ,CU_ACT_FLAG=CU_ACT_FLAG,warm_rain=warm_rain &
416 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
417 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
418 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
419 ! optionals
420 #if (NMM_CORE == 1 )
421 ,RTHCUTEN=RTHCUTEN ,RTHFTEN=forcet &
422 ,RQICUTEN=RQICUTEN ,RQVFTEN=forceq &
423 #else
424 ,RTHCUTEN=RTHCUTEN ,RTHFTEN=RTHFTEN &
425 ,RQICUTEN=RQICUTEN ,RQVFTEN=RQVFTEN &
426 #endif
427 ,RTHRATEN=RTHRATEN,RTHBLTEN=RTHBLTEN &
428 ,RQVCUTEN=RQVCUTEN,RQCCUTEN=RQCCUTEN &
429 ,RQVBLTEN=RQVBLTEN &
430 ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
431 ,F_QI=f_qi,F_QS=f_qs &
432 )
433 CASE (SASSCHEME)
434
435 CALL wrf_debug(100,'in cu_sas')
436 CALL CU_SAS( &
437 DT=dt,ITIMESTEP=itimestep,STEPCU=STEPCU &
438 ,RAINCV=RAINCV,HTOP=HTOP,HBOT=HBOT &
439 ,U3D=u,V3D=v,W=w,T3D=t,PI3D=pi,RHO3D=rho &
440 ,QV3D=QV_CURR,QC3D=QC_CURR,QI3D=QI_CURR &
441 ,DZ8W=dz8w,PCPS=p,P8W=p8w,XLAND=XLAND &
442 ,CU_ACT_FLAG=CU_ACT_FLAG &
443 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
444 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
445 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
446 ! optionals
447 ,RTHCUTEN=RTHCUTEN,RQVCUTEN=RQVCUTEN &
448 ,RQCCUTEN=RQCCUTEN,RQICUTEN=RQICUTEN &
449 ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
450 ,F_QI=f_qi,F_QS=f_qs &
451 )
452
453 CASE DEFAULT
454
455 WRITE( wrf_err_message , * ) 'The cumulus option does not exist: cu_physics = ', cu_physics
456 CALL wrf_error_fatal ( wrf_err_message )
457
458 END SELECT cps_select
459
460 ENDDO
461 !$OMP END PARALLEL DO
462
463 END SUBROUTINE cumulus_driver
464
465 END MODULE module_cumulus_driver