1 !WRF:MEDIATION_LAYER:PHYSICS
4 MODULE module_cumulus_driver
6 SUBROUTINE cumulus_driver(grid &
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 ,ips,ipe, jps,jpe, kps,kpe &
11 ,i_start,i_end,j_start,j_end,kts,kte,num_tiles &
12 ! Order independent args (use VAR= in call)
17 ,itimestep,dt,dx,cudt,curr_secs,adapt_step_flag &
19 ,rainc,raincv,pratec,nca &
20 ,z,z_at_w,dz8w,mavail,pblh,p8w,psfc,tsk &
22 ,forcet,forceq,w0avg,stepcu,gsw &
23 ,cldefi,lowlyr,xland,cu_act_flag,warm_rain &
24 ,hfx,qfx,cldfra,tpert2d,htop,hbot,kpbl,ht&
25 ,ensdim,maxiens,maxens,maxens2,maxens3 &
26 ,periodic_x,periodic_y &
27 ! Package selection variables
28 ,cu_physics, bl_pbl_physics, sf_sfclay_physics &
29 ! Optional moisture tracers
30 ,qv_curr, qc_curr, qr_curr &
31 ,qi_curr, qs_curr, qg_curr &
32 ,qv_prev, qc_prev, qr_prev &
33 ,qi_prev, qs_prev, qg_prev &
34 ! Optional arguments for GD scheme
35 ,apr_gr,apr_w,apr_mc,apr_st,apr_as,apr_capma &
36 ,apr_capme,apr_capmi,edt_out,clos_choice &
37 ,mass_flux,xf_ens,pr_ens,cugd_avedx,imomentum &
38 ,ishallow,cugd_tten,cugd_qvten,cugd_qcten &
39 ,cugd_ttens,cugd_qvtens &
41 ! Optional output arguments for CAMZM scheme
42 ,cape, zmmu, zmmd, zmdt, zmdq, dlf, rliq &
44 ,evaptzm, fzsntzm, evsntzm, evapqzm, zmflxprc &
45 ,zmflxsnw, zmntprpd, zmntsnpd, zmeiheat &
46 ,cmfmc, cmfmcdzm, preccdzm, precz &
47 ,zmmtu, zmmtv, zmupgu, zmupgd, zmvpgu, zmvpgd &
48 ,zmicuu, zmicud, zmicvu, zmicvd, zmdice, zmdliq &
49 ,k22_shallow,kbcon_shallow,ktop_shallow,xmb_shallow &
50 ! Optional arguments for SAS scheme
51 ,pgcon,sas_mass_flux &
52 ,shalconv,shal_pgcon &
53 ,HPBL2D,EVAP2D,HEAT2D & !Kwon for SAS2010 shallow convection
54 ! Optional arguments for NSAS scheme
56 ! Optional moisture and other tendencies
57 ,rqvcuten,rqccuten,rqrcuten &
58 ,rqicuten,rqscuten,rqgcuten &
61 ,rthcuten,rthraten,rthblten,rthften &
63 ! Optional variables for tiedtke scheme - add by ZCX&YQW
65 ! Optional moisture tracer flags
68 ,CFU1,CFD1,DFU1,EFU1,DFD1,EFD1,f_flux &
69 ! Optional trigger function activation variable
71 #if ( WRF_DFI_RADAR == 1 )
72 ! Optional CAP suppress option --- 3.2 CLEANUP TODO -- THESE SHOULD BE OPTIONAL, NOT #IF/#ENDIF
76 !----------------------------------------------------------------------
77 USE module_model_constants
78 USE module_state_description, ONLY: KFSCHEME,BMJSCHEME &
79 ,KFETASCHEME,GDSCHEME &
81 ,P_QC,P_QI,Param_FIRST_SCALAR &
82 ,CAMZMSCHEME, SASSCHEME &
87 ! *** add new modules of schemes here
89 USE module_cu_kf , ONLY : kfcps
90 USE module_cu_bmj , ONLY : bmjdrv
92 USE module_dm , ONLY : ntasks_x,ntasks_y,local_communicator,mytask,ntasks
94 USE module_comm_dm , ONLY : halo_cup_g3_in_sub, halo_cup_g3_out_sub
97 USE module_domain , ONLY: domain
98 USE module_cu_kfeta , ONLY : kf_eta_cps
99 USE module_cu_gd , ONLY : grelldrv
100 USE module_cu_g3 , ONLY : g3drv,conv_grell_spread3d
103 USE module_cu_camzm_driver, ONLY : camzm_driver
104 USE module_cu_tiedtke, ONLY : cu_tiedtke
105 USE module_cu_nsas , ONLY : cu_nsas
106 USE module_wrf_error , ONLY : wrf_err_message
108 ! This driver calls subroutines for the cumulus parameterizations.
110 ! 1. Kain & Fritsch (1993)
111 ! 2. Betts-Miller-Janjic (Janjic, 1994)
112 ! 3. Grell-Devenyi (Grell and Devenyi, 2002)
113 ! 4. Simplified Arakawa-Schubert scheme (NCEP)
114 ! (adapted by Zhang and Wang to work with ARW in V3.3)
115 ! 5. Grell 3D ensemble scheme
116 ! 6. Modified Tiedtke scheme (Zhang and Wang 2010)
117 ! 14. New simplified Arakawa-Schubert scheme (NCEP, YSU)
119 !----------------------------------------------------------------------
121 !======================================================================
122 ! Grid structure in physics part of WRF
123 !----------------------------------------------------------------------
124 ! The horizontal velocities used in the physics are unstaggered
125 ! relative to temperature/moisture variables. All predicted
126 ! variables are carried at half levels except w, which is at full
127 ! levels. Some arrays with names (*8w) are at w (full) levels.
129 !----------------------------------------------------------------------
130 ! In WRF, kms (smallest number) is the bottom level and kme (largest
131 ! number) is the top level. In your scheme, if 1 is at the top level,
132 ! then you have to reverse the order in the k direction.
134 ! kme - half level (no data at this level)
135 ! kme ----- full level
137 ! kme-1 ----- full level
142 ! kms+2 ----- full level
144 ! kms+1 ----- full level
146 ! kms ----- full level
148 !======================================================================
151 ! Rho_d dry density (kg/m^3)
152 ! Theta_m moist potential temperature (K)
153 ! Qv water vapor mixing ratio (kg/kg)
154 ! Qc cloud water mixing ratio (kg/kg)
155 ! Qr rain water mixing ratio (kg/kg)
156 ! Qi cloud ice mixing ratio (kg/kg)
157 ! Qs snow mixing ratio (kg/kg)
158 !-----------------------------------------------------------------
159 !-- DT time step (second)
160 !-- CUDT cumulus time step (minute)
161 !-- curr_secs current forecast time (seconds)
162 !-- itimestep number of time step (integer)
163 !-- DX horizontal space interval (m)
164 !-- rr dry air density (kg/m^3)
166 !-- RUCUTEN Zonal wind tendency due to
167 ! cumulus scheme precipitation (m/s/s)
168 !-- RVCUTEN Meridional wind tendency due to
169 ! cumulus scheme precipitation (m/s/s)
170 !-- RTHCUTEN Theta tendency due to
171 ! cumulus scheme precipitation (K/s)
172 !-- RQVCUTEN Qv tendency due to
173 ! cumulus scheme precipitation (kg/kg/s)
174 !-- RQRCUTEN Qr tendency due to
175 ! cumulus scheme precipitation (kg/kg/s)
176 !-- RQCCUTEN Qc tendency due to
177 ! cumulus scheme precipitation (kg/kg/s)
178 !-- RQSCUTEN Qs tendency due to
179 ! cumulus scheme precipitation (kg/kg/s)
180 !-- RQICUTEN Qi tendency due to
181 ! cumulus scheme precipitation (kg/kg/s)
183 !-- RAINC accumulated total cumulus scheme precipitation (mm)
184 !-- RAINCV time-step cumulus scheme precipitation (mm)
185 !-- PRATEC precipitiation rate from cumulus scheme (mm/s)
186 !-- NCA counter of the cloud relaxation
187 ! time in KF cumulus scheme (integer)
188 !-- u_phy u-velocity interpolated to theta points (m/s)
189 !-- v_phy v-velocity interpolated to theta points (m/s)
190 !-- th_phy potential temperature (K)
191 !-- t_phy temperature (K)
192 !-- tsk skin temperature (K)
193 !-- tke_pbl turbulent kinetic energy from PBL scheme (m2/s2)
194 !-- ust u* in similarity theory (m/s)
195 !-- w vertical velocity (m/s)
196 !-- moist moisture array (4D - last index is species) (kg/kg)
197 !-- z height above sea level at middle of layers (m)
198 !-- z_at_w height above sea level at layer interfaces (m)
199 !-- dz8w dz between full levels (m)
200 !-- pblh planetary boundary layer height (m)
201 !-- mavail soil moisture availability
202 !-- p8w pressure at full levels (Pa)
203 !-- psfc surface pressure (Pa)
204 !-- p_phy pressure (Pa)
205 !-- pi_phy exner function (dimensionless)
206 ! points (dimensionless)
207 !-- hfx upward heat flux at surface (W/m2)
208 !-- qfx upward moisture flux at surface (kg/m2/s)
209 !-- RTHRATEN radiative temp forcing for Grell-Devenyi scheme
210 !-- RTHBLTEN PBL temp forcing for Grell-Devenyi scheme
211 !-- RQVBLTEN PBL moisture forcing for Grell-Devenyi scheme
218 !-- cldfra cloud fraction
220 !-- W0AVG average vertical velocity, (for KF scheme) (m/s)
221 !-- kfeta_trigger namelist for KF trigger (=1, default; =2, moisture-advection-dependent trigger)
222 !-- rho density (kg/m^3)
223 !-- CLDEFI precipitation efficiency (for BMJ scheme) (dimensionless)
224 !-- STEPCU # of fundamental timesteps between convection calls
225 !-- XLAND land-sea mask (1.0 for land; 2.0 for water)
226 !-- LOWLYR index of lowest model layer above the ground
227 !-- XLV0 latent heat of vaporization constant
228 ! used in temperature dependent formula (J/kg)
229 !-- XLV1 latent heat of vaporization constant
230 ! used in temperature dependent formula (J/kg/K)
231 !-- XLS0 latent heat of sublimation constant
232 ! used in temperature dependent formula (J/kg)
233 !-- XLS1 latent heat of sublimation constant
234 ! used in temperature dependent formula (J/kg/K)
235 !-- R_d gas constant for dry air ( 287. J/kg/K)
236 !-- R_v gas constant for water vapor (461 J/k/kg)
237 !-- Cp specific heat at constant pressure (1004 J/k/kg)
238 !-- rvovrd R_v divided by R_d (dimensionless)
239 !-- G acceleration due to gravity (m/s^2)
240 !-- EP_1 constant for virtual temperature
241 ! (R_v/R_d - 1) (dimensionless)
242 !-- pi_phy the exner function, (p/p0)**(R/Cp) (none unit)
243 !-- ids start index for i in domain
244 !-- ide end index for i in domain
245 !-- jds start index for j in domain
246 !-- jde end index for j in domain
247 !-- kds start index for k in domain
248 !-- kde end index for k in domain
249 !-- ims start index for i in memory
250 !-- ime end index for i in memory
251 !-- jms start index for j in memory
252 !-- jme end index for j in memory
253 !-- kms start index for k in memory
254 !-- kme end index for k in memory
255 !-- i_start start indices for i in tile
256 !-- i_end end indices for i in tile
257 !-- j_start start indices for j in tile
258 !-- j_end end indices for j in tile
259 !-- kts start index for k in tile
260 !-- kte end index for k in tile
261 !-- num_tiles number of tiles
262 !-- HBOT index of lowest model layer with convection
263 !-- HTOP index of highest model layer with convection
264 !-- LBOT index of lowest model layer with convection
265 !-- LTOP index of highest model layer with convection
266 !-- KPBL layer index of the PBL
267 !-- periodic_x T/F this is using periodic lateral boundaries in the X direction
268 !-- periodic_y T/F this is using periodic lateral boundaries in the Y-direction
270 !======================================================================
272 INTEGER, INTENT(IN ) :: &
273 ids,ide, jds,jde, kds,kde, &
274 ims,ime, jms,jme, kms,kme, &
277 LOGICAL periodic_x, periodic_y
278 TYPE(domain) , INTENT(INOUT) :: grid
279 INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
280 & i_start,i_end,j_start,j_end
282 INTEGER, INTENT(IN ) :: &
283 ensdim,maxiens,maxens,maxens2,maxens3
285 INTEGER, OPTIONAL, INTENT(IN ) :: &
286 cugd_avedx,clos_choice,bl_pbl_physics,sf_sfclay_physics
288 INTEGER, INTENT(IN ) :: cu_physics
289 INTEGER, INTENT(IN ) :: STEPCU
290 LOGICAL, INTENT(IN ) :: warm_rain
292 REAL, INTENT(IN), OPTIONAL :: pgcon,shal_pgcon,sas_mass_flux
293 INTEGER, INTENT(IN), OPTIONAL :: shalconv
295 INTEGER,DIMENSION( ims:ime, jms:jme ), &
296 INTENT(IN ) :: LOWLYR
298 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
312 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
313 INTENT(IN ),OPTIONAL :: z_at_w &
317 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
321 REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: &
324 REAL, DIMENSION( ims:ime , jms:jme ), &
325 INTENT(INOUT) :: RAINC &
332 REAL, DIMENSION( kms:kme ), OPTIONAL, INTENT(IN ) :: &
335 REAL, DIMENSION( ims:ime , jms:jme ),INTENT(INOUT),OPTIONAL :: &
336 PRATEC,MAVAIL,PBLH,PSFC,TSK,TPERT2D,UST,HFX,QFX
337 REAL, DIMENSION( ims:ime , jms:jme ) :: tmppratec
339 INTEGER, DIMENSION( ims:ime , jms:jme ), &
342 LOGICAL, DIMENSION( ims:ime , jms:jme ), &
343 INTENT(INOUT) :: CU_ACT_FLAG
345 INTEGER, INTENT(IN ), OPTIONAL :: kfeta_trigger
347 REAL, INTENT(IN ) :: DT, DX
348 INTEGER, INTENT(IN ),OPTIONAL :: &
349 ips,ipe, jps,jpe, kps,kpe,imomentum,ishallow
350 REAL, INTENT(IN ),OPTIONAL :: CUDT
351 REAL, INTENT(IN ),OPTIONAL :: CURR_SECS
352 LOGICAL,INTENT(IN ),OPTIONAL :: adapt_step_flag
353 REAL, INTENT(INOUT ),OPTIONAL :: cudtacttime
354 REAL :: cudt_pass, curr_secs_pass,cudtacttime_pass
355 LOGICAL :: adapt_step_flag_pass
357 INTEGER, INTENT(IN ), OPTIONAL :: mp_physics
358 REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, INTENT(IN) :: STORE_RAND
360 REAL, OPTIONAL, INTENT(INOUT) :: mommix
362 REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, & !Kwon for sas2010 shallow convection
363 INTENT(INOUT) :: HPBL2D, EVAP2D, HEAT2D
365 REAL, DIMENSION( ims:ime, jms:jme, kms:kme ), &
366 INTENT(INOUT) :: rucuten,rvcuten
370 INTEGER, DIMENSION( ims:ime, jms:jme ), &
371 OPTIONAL, INTENT(INOUT) :: &
372 k22_shallow,kbcon_shallow,ktop_shallow
373 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
374 OPTIONAL, INTENT(INOUT) :: &
375 ! optional moisture tracers
376 ! 2 time levels; if only one then use CURR
377 qv_curr, qc_curr, qr_curr &
378 ,qi_curr, qs_curr, qg_curr &
379 ,qv_prev, qc_prev, qr_prev &
380 ,qi_prev, qs_prev, qg_prev &
381 ! optional moisture and other tendencies
382 ,rqvcuten,rqccuten,rqrcuten &
383 ,rqicuten,rqscuten,rqgcuten &
386 ,cugd_tten,cugd_qvten,cugd_qcten &
387 ,cugd_ttens,cugd_qvtens &
391 REAL, DIMENSION( ims:ime , jms:jme ), &
394 apr_gr,apr_w,apr_mc,apr_st,apr_as,apr_capma &
395 ,apr_capme,apr_capmi,edt_out,xmb_shallow &
397 ,cape, pconvb, pconvt, preccdzm, precz, rliq
398 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
399 OPTIONAL, INTENT(INOUT) :: &
400 GD_CLOUD,GD_CLOUD2, &
401 zmmd, zmmu, zmdt, zmdq, dlf, &
402 evaptzm, fzsntzm, evsntzm, evapqzm, zmflxprc, &
403 zmflxsnw, zmntprpd, zmntsnpd, zmeiheat, &
405 zmmtu, zmmtv, zmupgu, zmupgd, zmvpgu, zmvpgd, &
406 zmicuu, zmicud, zmicvu, zmicvd, zmdice, zmdliq
407 REAL, DIMENSION( ims:ime , jms:jme , 1:ensdim ), &
409 INTENT(INOUT) :: XF_ENS, PR_ENS
410 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
421 ! Flags relating to the optional tendency arrays declared above
422 ! Models that carry the optional tendencies will provdide the
423 ! optional arguments at compile time; these flags all the model
424 ! to determine at run-time whether a particular tracer is in
427 LOGICAL, INTENT(IN), OPTIONAL :: &
434 LOGICAL, INTENT(IN), OPTIONAL :: f_flux
436 #if ( WRF_DFI_RADAR == 1 )
438 ! option of cap suppress:
439 ! do_capsuppress = 1 do
440 ! do_capsuppress = other don't
443 INTEGER, INTENT(IN ) ,OPTIONAL :: do_capsuppress
444 REAL, DIMENSION( ims:ime, jms:jme ) :: cap_suppress_loc
449 INTEGER :: i,j,k,its,ite,jts,jte,ij,trigger_kf
452 !-----------------------------------------------------------------
455 if (present(f_flux)) l_flux=f_flux
456 if (.not. PRESENT(CURR_SECS)) then
459 curr_secs_pass = curr_secs
462 if (.not. PRESENT(CUDT)) then
464 cudtacttime_pass = -1
467 cudtacttime_pass = cudtacttime
470 if (.not. PRESENT(adapt_step_flag)) then
471 adapt_step_flag_pass = .false.
473 adapt_step_flag_pass = adapt_step_flag
476 ! Initialize tmppratec to pratec
478 if ( PRESENT ( pratec ) ) then
479 tmppratec(:,:) = pratec(:,:)
484 if (.not. PRESENT(kfeta_trigger)) then
487 trigger_kf = kfeta_trigger
490 IF (cu_physics .eq. 0) return
493 if(cu_physics .eq. 5 ) then
495 !$OMP PRIVATE ( ij,i,j,k,its,ite,jts,jte )
497 DO ij = 1 , num_tiles
502 do j=jts,min(jte,jde-1)
504 do i=its,min(ite,ide-1)
505 RTHFTEN(i,k,j)=(RTHFTEN(i,k,j)+RTHRATEN(i,k,j) &
506 +RTHBLTEN(i,k,j))*pi(i,k,j)
507 RQVFTEN(i,k,j)=RQVFTEN(i,k,j)+RQVBLTEN(i,k,j)
512 !$OMP END PARALLEL DO
515 IF ( cu_physics == G3SCHEME .OR. cu_physics == KFETASCHEME ) THEN
517 #include "HALO_CUP_G3_IN.inc"
522 ! DON'T JUDGE TIME STEP HERE, SINCE KF NEEDS ACCUMULATED W FIELD.
523 ! DO IT INSIDE THE INDIVIDUAL CUMULUS SCHEME
525 ! SET START AND END POINTS FOR TILES
527 !$OMP PRIVATE ( ij ,its,ite,jts,jte, i,j,k)
529 DO ij = 1 , num_tiles
536 cps_select: SELECT CASE(cu_physics)
539 CALL wrf_debug(100,'in kfcps')
542 ! order independent arguments
543 DT=dt ,KTAU=itimestep ,DX=dx , CUDT=cudt_pass &
544 ,CURR_SECS=curr_secs_pass &
545 ,ADAPT_STEP_FLAG=adapt_step_flag_pass &
546 ,CUDTACTTIME=cudtacttime_pass &
548 ,U=u ,V=v ,TH=th ,T=t ,W=w &
550 ,XLV0=xlv0 ,XLV1=xlv1 ,XLS0=xls0 ,XLS1=xls1 &
551 ,RAINCV=raincv, PRATEC=tmppratec, NCA=nca &
554 ,CP=cp ,R=r_d ,G=g ,EP1=ep_1 ,EP2=ep_2 &
555 ,SVP1=svp1 ,SVP2=svp2 ,SVP3=svp3 ,SVPT0=svpt0 &
557 ,CU_ACT_FLAG=cu_act_flag &
558 ,WARM_RAIN=warm_rain &
560 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
561 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
562 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
564 ,RTHCUTEN=rthcuten ,RQVCUTEN=rqvcuten &
565 ,RQCCUTEN=rqccuten ,RQRCUTEN=rqrcuten &
566 ,RQICUTEN=rqicuten ,RQSCUTEN=rqscuten &
567 ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
568 ,F_QI=f_qi,F_QS=f_qs &
572 CALL wrf_debug(100,'in bmj_cps')
574 TH=th,T=T ,RAINCV=raincv, PRATEC=tmppratec &
576 ,DT=dt ,ITIMESTEP=itimestep ,STEPCU=stepcu &
578 ,CURR_SECS=curr_secs_pass &
579 ,ADAPT_STEP_FLAG=adapt_step_flag_pass &
580 ,CUDTACTTIME=cudtacttime_pass &
581 ,CUTOP=htop, CUBOT=hbot, KPBL=kpbl &
582 ,DZ8W=dz8w ,PINT=p8w, PMID=p, PI=pi &
583 ,CP=cp ,R=r_d ,ELWV=xlv ,ELIV=xls ,G=g &
584 ,TFRZ=svpt0 ,D608=ep_1 ,CLDEFI=cldefi &
585 ,LOWLYR=lowlyr ,XLAND=xland &
586 ,CU_ACT_FLAG=cu_act_flag &
588 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
589 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
590 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
592 ,RTHCUTEN=rthcuten ,RQVCUTEN=rqvcuten &
596 CALL wrf_debug(100,'in kf_eta_cps')
598 U=u ,V=v ,TH=th ,T=t ,W=w ,RHO=rho &
600 ,CURR_SECS=curr_secs_pass &
601 ,ADAPT_STEP_FLAG=adapt_step_flag_pass &
602 ,CUDTACTTIME=cudtacttime_pass &
603 ,RAINCV=raincv, PRATEC=tmppratec, NCA=nca &
605 ,PCPS=p, PI=pi ,W0AVG=W0AVG &
606 ,CUTOP=HTOP,CUBOT=HBOT &
607 ,XLV0=XLV0 ,XLV1=XLV1 ,XLS0=XLS0 ,XLS1=XLS1 &
608 ,CP=CP ,R=R_d ,G=G ,EP1=EP_1 ,EP2=EP_2 &
609 ,SVP1=SVP1 ,SVP2=SVP2 ,SVP3=SVP3 ,SVPT0=SVPT0 &
610 ,DT=dt ,KTAU=itimestep ,DX=dx &
612 ,CU_ACT_FLAG=cu_act_flag ,WARM_RAIN=warm_rain &
614 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
615 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
616 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
617 ,trigger=trigger_kf &
620 ,RQVCUTEN=rqvcuten ,RQCCUTEN=rqccuten &
621 ,RQRCUTEN=rqrcuten ,RQICUTEN=rqicuten &
622 ,RQSCUTEN=rqscuten, RQVFTEN=RQVFTEN &
623 ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
624 ,F_QI=f_qi,F_QS=f_qs &
628 CALL wrf_debug(100,'in grelldrv')
630 DT=dt, ITIMESTEP=itimestep, DX=dx &
631 ,U=u,V=v,T=t,W=w ,RHO=rho &
632 ,P=p,PI=pi ,Q=qv_curr ,RAINCV=raincv &
633 ,DZ8W=dz8w,P8W=p8w,XLV=xlv,CP=cp,G=g,R_V=r_v &
635 ,APR_GR=apr_gr,APR_W=apr_w,APR_MC=apr_mc &
636 ,APR_ST=apr_st,APR_AS=apr_as &
637 ,APR_CAPMA=apr_capma,APR_CAPME=apr_capme &
638 ,APR_CAPMI=apr_capmi,MASS_FLUX=mass_flux &
639 ,XF_ENS=xf_ens,PR_ENS=pr_ens,HT=ht &
640 ,xland=xland,gsw=gsw &
641 ,GDC=gd_cloud,GDC2=gd_cloud2 &
642 ,ENSDIM=ensdim,MAXIENS=maxiens,MAXENS=maxens &
643 ,MAXENS2=maxens2,MAXENS3=maxens3 &
644 ,STEPCU=STEPCU,htop=htop,hbot=hbot &
645 ,CU_ACT_FLAG=CU_ACT_FLAG,warm_rain=warm_rain &
646 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
647 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
648 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
649 ,PERIODIC_X=periodic_x,PERIODIC_Y=periodic_y &
652 ,RTHCUTEN=RTHCUTEN ,RTHFTEN=forcet &
653 ,RQICUTEN=RQICUTEN ,RQVFTEN=forceq &
655 ,RTHCUTEN=RTHCUTEN ,RTHFTEN=RTHFTEN &
656 ,RQICUTEN=RQICUTEN ,RQVFTEN=RQVFTEN &
658 ,RTHRATEN=RTHRATEN,RTHBLTEN=RTHBLTEN &
659 ,RQVCUTEN=RQVCUTEN,RQCCUTEN=RQCCUTEN &
661 ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
662 ,F_QI=f_qi,F_QS=f_qs &
663 ,CFU1=CFU1,CFD1=CFD1,DFU1=DFU1,EFU1=EFU1 &
664 ,DFD1=DFD1,EFD1=EFD1,f_flux=l_flux )
665 CALL wrf_debug(200,'back from grelldrv')
669 IF ( adapt_step_flag_pass ) THEN
670 WRITE( wrf_err_message , * ) 'The SAS cumulus option will not work properly with an adaptive time step'
671 CALL wrf_error_fatal ( wrf_err_message )
673 CALL wrf_debug(100,'in cu_sas')
675 DT=dt,ITIMESTEP=itimestep,STEPCU=STEPCU &
676 ,RTHCUTEN=RTHCUTEN,RQVCUTEN=RQVCUTEN &
677 ,RQCCUTEN=RQCCUTEN,RQICUTEN=RQICUTEN &
678 ,RUCUTEN=RUCUTEN, RVCUTEN=RVCUTEN &
679 ,RAINCV=RAINCV,PRATEC=tmpPRATEC,HTOP=HTOP,HBOT=HBOT &
680 ,U3D=u,V3D=v,W=w,T3D=t &
681 ,QV3D=QV_CURR,QC3D=QC_CURR,QI3D=QI_CURR &
683 ,DZ8W=dz8w,PCPS=p,P8W=p8w,XLAND=XLAND &
684 ,CU_ACT_FLAG=CU_ACT_FLAG &
687 ,pgcon=pgcon,sas_mass_flux=sas_mass_flux &
688 ,shalconv=shalconv,shal_pgcon=shal_pgcon &
689 ,hpbl2d=hpbl2d,evap2d=evap2d,heat2d=heat2d &
690 ,P_QI=p_qi,P_FIRST_SCALAR=param_first_scalar &
692 ,CURR_SECS=curr_secs_pass &
693 ,ADAPT_STEP_FLAG=adapt_step_flag_pass &
694 ,CUDTACTTIME=cudtacttime_pass &
695 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
696 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
697 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
701 IF ( adapt_step_flag_pass ) THEN
702 WRITE( wrf_err_message , * ) 'The SAS cumulus option will not work properly with an adaptive time step'
703 CALL wrf_error_fatal ( wrf_err_message )
705 CALL wrf_debug(100,'in cu_osas')
707 DT=dt,ITIMESTEP=itimestep,STEPCU=STEPCU &
708 ,RTHCUTEN=RTHCUTEN,RQVCUTEN=RQVCUTEN &
709 ,RQCCUTEN=RQCCUTEN,RQICUTEN=RQICUTEN &
710 ,RUCUTEN=RUCUTEN, RVCUTEN=RVCUTEN &
711 ,RAINCV=RAINCV,PRATEC=tmpPRATEC,HTOP=HTOP,HBOT=HBOT &
712 ,U3D=u,V3D=v,W=w,T3D=t &
713 ,QV3D=QV_CURR,QC3D=QC_CURR,QI3D=QI_CURR &
715 ,DZ8W=dz8w,PCPS=p,P8W=p8w,XLAND=XLAND &
716 ,CU_ACT_FLAG=CU_ACT_FLAG &
718 ,store_rand=store_rand &
720 ,P_QI=p_qi,P_FIRST_SCALAR=param_first_scalar &
722 ,CURR_SECS=curr_secs_pass &
723 ,ADAPT_STEP_FLAG=adapt_step_flag_pass &
724 ,CUDTACTTIME=cudtacttime_pass &
725 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
726 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
727 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
730 CALL wrf_debug(100,'in grelldrv')
731 #if ( WRF_DFI_RADAR == 1 )
732 if (do_capsuppress == 1) then
733 WRITE( wrf_err_message , * ) 'G3 do CAP suppress',its,jts,min( jte,jde-1 ),min( ite,ide-1 ),kte
734 CALL wrf_debug(200, wrf_err_message)
735 DO j = jts, min( jte,jde-1 )
736 DO i = its, min( ite,ide-1 )
737 cap_suppress_loc(i,j) = grid%dfi_tten_rad(i,kte,j)
743 DT=dt, ITIMESTEP=itimestep, DX=dx &
744 ,U=u,V=v,T=t,W=w ,RHO=rho &
745 ,P=p,PI=pi,Q=qv_curr,RAINCV=raincv &
746 ,DZ8W=dz8w ,P8W=p8w,XLV=xlv,CP=cp,G=g,R_V=r_v &
747 ,APR_GR=apr_gr,APR_W=apr_w,APR_MC=apr_mc &
748 ,APR_ST=apr_st,APR_AS=apr_as,PRATEC=tmppratec &
749 ,APR_CAPMA=apr_capma,APR_CAPME=apr_capme &
750 ,APR_CAPMI=apr_capmi,MASS_FLUX=mass_flux &
751 ,XF_ENS=xf_ens,PR_ENS=pr_ens,HT=ht &
752 ,xland=xland,gsw=gsw,edt_out=edt_out &
753 ,GDC=gd_cloud,GDC2=gd_cloud2,kpbl=kpbl &
754 ,k22_shallow=k22_shallow &
755 ,kbcon_shallow=kbcon_shallow &
756 ,ktop_shallow=ktop_shallow &
757 ,xmb_shallow=xmb_shallow &
758 ,cugd_tten=cugd_tten,cugd_qvten=cugd_qvten &
759 ,cugd_ttens=cugd_ttens,cugd_qvtens=cugd_qvtens &
760 ,cugd_qcten=cugd_qcten,cugd_avedx=cugd_avedx &
761 ,imomentum=imomentum,ishallow_g3=ishallow &
762 ,ENSDIM=ensdim,MAXIENS=maxiens,MAXENS=maxens &
763 ,MAXENS2=maxens2,MAXENS3=maxens3,ichoice=clos_choice &
764 ,STEPCU=STEPCU,htop=htop,hbot=hbot &
765 ,CU_ACT_FLAG=CU_ACT_FLAG,warm_rain=warm_rain &
766 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
767 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
768 ,IPS=ips,IPE=ipe,JPS=jps,JPE=jpe,KPS=kps,KPE=kpe &
769 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
770 ,PERIODIC_X=periodic_x,PERIODIC_Y=periodic_y &
773 ,RTHCUTEN=RTHCUTEN ,RTHFTEN=forcet &
774 ,RQICUTEN=RQICUTEN ,RQVFTEN=forceq &
776 ,RTHCUTEN=RTHCUTEN ,RTHFTEN=RTHFTEN &
777 ,RQICUTEN=RQICUTEN ,RQVFTEN=RQVFTEN &
778 ,rqvblten=rqvblten,rthblten=rthblten &
780 ,RQVCUTEN=RQVCUTEN,RQCCUTEN=RQCCUTEN &
781 ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
782 ,F_QI=f_qi,F_QS=f_qs &
783 #if ( WRF_DFI_RADAR == 1 )
784 ! Optional CAP suppress option
785 ,do_capsuppress=do_capsuppress &
786 ,cap_suppress_loc=cap_suppress_loc &
790 IF (PRESENT(z_at_w) .AND. PRESENT(mavail) &
791 .AND. PRESENT(pblh) .AND. PRESENT(psfc))THEN
792 CALL wrf_debug(100,'in camzm_cps')
794 WRITE( wrf_err_message , * ) 'This cumulus option requires ice microphysics option: f_qi = ', f_qi
795 CALL wrf_error_fatal ( wrf_err_message )
798 IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
799 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
800 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
801 ,ITIMESTEP=itimestep, BL_PBL_PHYSICS=bl_pbl_physics &
802 ,SF_SFCLAY_PHYSICS=sf_sfclay_physics &
803 ,TH=th, T_PHY=t, TSK=tsk, TKE_PBL=tke_pbl, UST=ust &
804 ,QV=qv_curr, QC=qc_curr, QI=qi_curr, MAVAIL=mavail &
805 ,KPBL=kpbl, PBLH=pblh, XLAND=xland &
806 ,Z=z, Z_AT_W=z_at_w &
808 ,P=p, P8W=p8w, PI_PHY=pi, PSFC=psfc &
809 ,U_PHY=u, V_PHY=v, HFX=hfx, QFX=qfx, CLDFRA=cldfra &
810 ,TPERT_CAMUWPBL=tpert2d &
811 ,DX=dx, DT=dt, STEPCU=stepcu, CUDT=cudt &
812 ,CURR_SECS=curr_secs &
813 ,ADAPT_STEP_FLAG=adapt_step_flag &
814 ,CUDTACTTIME=cudtacttime_pass &
816 ,MU_OUT=zmmu, MD_OUT=zmmd &
817 ,ZMDT=zmdt, ZMDQ=zmdq, DLF_OUT=dlf, RLIQ_OUT=rliq &
818 ,PCONVT=pconvt, PCONVB=pconvb, CUBOT=hbot, CUTOP=htop&
819 ,RAINCV=raincv, PRATEC=tmppratec &
820 ,RUCUTEN=rucuten, RVCUTEN=rvcuten &
821 ,RTHCUTEN=rthcuten, RQVCUTEN=rqvcuten &
822 ,RQCCUTEN=rqccuten, RQICUTEN=rqicuten &
823 ,EVAPTZM=evaptzm, FZSNTZM=fzsntzm, EVSNTZM=evsntzm &
824 ,EVAPQZM=evapqzm, ZMFLXPRC=zmflxprc &
825 ,ZMFLXSNW=zmflxsnw, ZMNTPRPD=zmntprpd &
826 ,ZMNTSNPD=zmntsnpd, ZMEIHEAT=zmeiheat &
827 ,CMFMC=cmfmc, CMFMCDZM=cmfmcdzm &
828 ,PRECCDZM=preccdzm, PRECZ=precz &
829 ,ZMMTU=zmmtu, ZMMTV=zmmtv, ZMUPGU=zmupgu &
830 ,ZMUPGD=zmupgd, ZMVPGU=zmvpgu, ZMVPGD=zmvpgd &
831 ,ZMICUU=zmicuu, ZMICUD=zmicud, ZMICVU=zmicvu &
832 ,ZMICVD=zmicvd, ZMDICE=zmdice, ZMDLIQ=zmdliq &
835 WRITE( wrf_err_message , * ) 'Insufficient arguments to call CAMZM cu scheme'
836 CALL wrf_error_fatal ( wrf_err_message )
839 ! TIEDTKE SCHEME - ZCX&YQW (U of Hawaii)
842 IF ( PRESENT ( QFX ) .AND. PRESENT( ZNU ) ) THEN
844 CALL wrf_debug(100,'in cu_tiedtke')
846 DT=dt,ITIMESTEP=itimestep,STEPCU=STEPCU,HFX=hfx &
847 ,RAINCV=RAINCV,PRATEC=tmppratec,QFX=qfx,ZNU=znu &
848 ,U3D=u,V3D=v,W=w,T3D=t,PI3D=pi,RHO3D=rho &
849 ,QV3D=QV_CURR,QC3D=QC_CURR,QI3D=QI_CURR &
850 ,QVFTEN=RQVFTEN,QVPBLTEN=RQVBLTEN &
851 ,DZ8W=dz8w,PCPS=p,P8W=p8w,XLAND=XLAND &
852 ,CU_ACT_FLAG=CU_ACT_FLAG &
854 ,CURR_SECS=curr_secs_pass &
855 ,ADAPT_STEP_FLAG=adapt_step_flag_pass &
856 ,CUDTACTTIME=cudtacttime_pass &
857 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
858 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
859 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
861 ,RTHCUTEN=RTHCUTEN,RQVCUTEN=RQVCUTEN &
862 ,RQCCUTEN=RQCCUTEN,RQICUTEN=RQICUTEN &
863 ,RUCUTEN = RUCUTEN,RVCUTEN = RVCUTEN &
864 ,F_QV=f_qv,F_QC=f_qc,F_QR=f_qr &
865 ,F_QI=f_qi,F_QS=f_qs &
868 CALL wrf_error_fatal('Lacking arguments for CU_TIEDTKE in cumulus driver')
871 ! New GFS SAS SCHEME - (Yonsei Univ., South Korea)
873 IF ( PRESENT ( QFX ) .AND. PRESENT( HFX ) ) THEN
874 CALL wrf_debug(100,'in nsas_cps')
876 DT=dt,P3DI=p8w,P3D=p,PI3D=pi, &
877 QC3D=QC_CURR,QI3D=QI_CURR,RHO3D=rho, &
878 ITIMESTEP=itimestep,STEPCU=STEPCU, &
879 HBOT=HBOT,HTOP=HTOP, &
880 CU_ACT_FLAG=CU_ACT_FLAG,CUDT=cudt_pass, &
881 CURR_SECS=curr_secs_pass, &
882 ADAPT_STEP_FLAG=adapt_step_flag_pass, &
883 CUDTACTTIME=cudtacttime_pass, &
884 RTHCUTEN=RTHCUTEN,RQVCUTEN=RQVCUTEN, &
885 RQCCUTEN=RQCCUTEN,RQICUTEN=RQICUTEN, &
886 RUCUTEN=RUCUTEN,RVCUTEN=RVCUTEN, &
887 QV3D=QV_CURR,T3D=t, &
888 RAINCV=RAINCV,PRATEC=tmpPRATEC, &
889 XLAND=XLAND,DZ8W=dz8w,W=w,U3D=u,V3D=v, &
890 HPBL=pblh,HFX=hfx,QFX=qfx, &
891 MP_PHYSICS=mp_physics, &
893 P_QC=p_qc,P_QI=p_qi, &
894 P_FIRST_SCALAR=param_first_scalar &
895 ,CP=cp,CLIQ=cliq,CPV=cpv,G=g,XLV=xlv,R_D=r_d &
896 ,R_V=r_v,EP_1=ep_1,EP_2=EP_2 &
897 ,CICE=cice,XLS=xls,PSAT=psat &
898 ,F_QI=f_qi,F_QC=f_qc &
899 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
900 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
901 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
904 CALL wrf_error_fatal('Lacking arguments for CU_NSAS in cumulus driver')
909 WRITE( wrf_err_message , * ) 'The cumulus option does not exist: cu_physics = ', cu_physics
910 CALL wrf_error_fatal ( wrf_err_message )
912 END SELECT cps_select
915 !$OMP END PARALLEL DO
917 IF(cu_physics .eq. 5 )then
919 # include "HALO_CUP_G3_OUT.inc"
922 !$OMP PRIVATE ( ij ,its,ite,jts,jte, i,j,k)
923 DO ij = 1 , num_tiles
929 call conv_grell_spread3d(rthcuten=rthcuten,rqvcuten=rqvcuten &
930 & ,rqccuten=rqccuten,raincv=raincv,cugd_avedx=cugd_avedx &
931 & ,cugd_tten=cugd_tten,cugd_qvten=cugd_qvten,rqicuten=rqicuten &
932 & ,cugd_ttens=cugd_ttens,cugd_qvtens=cugd_qvtens &
933 & ,cugd_qcten=cugd_qcten,pi_phy=pi,moist_qv=qv_curr &
934 & ,PRATEC=tmppratec,dt=dt,num_tiles=num_tiles &
935 & ,imomentum=imomentum &
936 & ,F_QV=F_QV,F_QC=F_QC,F_QR=F_QR,F_QI=F_QI,F_QS=F_QS &
937 & ,ids=IDS,ide=IDE, jds=JDS,jde=JDE, kds=KDS,kde=KDE &
938 & ,ips=IPS,ipe=IPE, jps=JPS,jpe=JPE, kps=KPS,kpe=KPE &
939 & ,ims=IMS,ime=IME, jms=JMS,jme=JME, kms=KMS,kme=KME &
940 & ,its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte)
942 !$OMP END PARALLEL DO
947 ! Copy pratec back to output array, if necessary.
949 if (PRESENT(PRATEC)) then
950 pratec(:,:) = tmppratec(:,:)
953 ! Copy cudtacttime back if necessary
955 if ( PRESENT(CUDTACTTIME) ) then
956 cudtacttime = cudtacttime_pass
959 CALL wrf_debug(200,'returning from cumulus_driver')
961 END SUBROUTINE cumulus_driver
963 END MODULE module_cumulus_driver