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