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