Merge branch 'master' into devel
[wrffire.git] / wrfv2_fire / phys / module_cumulus_driver.F
blob691b99a5615058deea8156598fb7e05fecb4bdb1
1 !WRF:MEDIATION_LAYER:PHYSICS
4 MODULE module_cumulus_driver
5 CONTAINS
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)
13                  ! --Prognostic
14                      ,u,v,th,t,w                                      &
15                      ,p,pi,rho                                        &
16                  ! --Other arguments
17                      ,itimestep,dt,dx,cudt,curr_secs,adapt_step_flag  &
18                      ,cudtacttime                                     & 
19                      ,rainc,raincv,pratec,nca                         &
20                      ,z,z_at_w,dz8w,mavail,pblh,p8w,psfc,tsk          &
21                      ,tke_pbl, ust                                    &
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                          &
40                      ,gd_cloud,gd_cloud2                              &
41                  ! Optional output arguments for CAMZM scheme
42                      ,cape, zmmu, zmmd, zmdt, zmdq, dlf, rliq         &
43                      ,pconvb, pconvt                                  &
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
55                      ,mp_physics                                      &
56                  ! Optional moisture and other tendencies
57                      ,rqvcuten,rqccuten,rqrcuten                      &
58                      ,rqicuten,rqscuten,rqgcuten                      &
59                      ,rqvblten,rqvften                                &
60                      ,rucuten,rvcuten                                 &
61                      ,rthcuten,rthraten,rthblten,rthften              &
62                      ,mommix,store_rand                               &
63 ! Optional variables for tiedtke scheme - add by ZCX&YQW 
64                      ,znu                                             &
65                  ! Optional moisture tracer flags 
66                      ,f_qv,f_qc,f_qr                                  &
67                      ,f_qi,f_qs,f_qg                                  &
68                      ,CFU1,CFD1,DFU1,EFU1,DFD1,EFD1,f_flux            &
69                  ! Optional trigger function activation variable
70                      ,kfeta_trigger                                   &
71 #if ( WRF_DFI_RADAR == 1 )
72                  ! Optional CAP suppress option      --- 3.2 CLEANUP TODO -- THESE SHOULD BE OPTIONAL, NOT #IF/#ENDIF
73                      ,do_capsuppress                                  &
74 #endif                                 
75                                                                       )
76 !----------------------------------------------------------------------
77    USE module_model_constants
78    USE module_state_description, ONLY:     KFSCHEME,BMJSCHEME         &
79                                           ,KFETASCHEME,GDSCHEME       &
80                                           ,G3SCHEME                   &
81                                           ,P_QC,P_QI,Param_FIRST_SCALAR &
82                                           ,CAMZMSCHEME, SASSCHEME     &
83                                           ,OSASSCHEME                 &
84                                           ,NSASSCHEME                 &
85                                           ,TIEDTKESCHEME
87 ! *** add new modules of schemes here
89    USE module_cu_kf     ,  ONLY : kfcps
90    USE module_cu_bmj    ,  ONLY : bmjdrv
91 #ifdef DM_PARALLEL
92    USE module_dm        , ONLY : ntasks_x,ntasks_y,local_communicator,mytask,ntasks 
93 # if (EM_CORE == 1)
94    USE module_comm_dm   ,  ONLY : halo_cup_g3_in_sub, halo_cup_g3_out_sub
95 # endif
96 #endif
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
101    USE module_cu_sas
102    USE module_cu_osas   
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.
109    !
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)
118    !
119 !----------------------------------------------------------------------
120    IMPLICIT NONE
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
136 !         kme-1    -   half level
137 !         kme-1  ----- full level
138 !         .
139 !         .
140 !         .
141 !         kms+2    -   half level
142 !         kms+2  ----- full level
143 !         kms+1    -   half level
144 !         kms+1  ----- full level
145 !         kms      -   half level
146 !         kms    ----- full level
148 !======================================================================
149 ! Definitions
150 !-----------
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
212 !-- RTHFTEN
213 !-- RQVFTEN
214 !-- MASS_FLUX
215 !-- XF_ENS
216 !-- PR_ENS
217 !-- warm_rain
218 !-- cldfra        cloud fraction
219 !-- CU_ACT_FLAG
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, &
275                                                         kts,kte, &
276                                       itimestep, num_tiles
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 ),                 &
299          INTENT(IN ) ::                                          &
300                                                               z  &
301                                                       ,    dz8w  &
302                                                       ,     p8w  &
303                                                       ,       p  &
304                                                       ,      pi  &
305                                                       ,       u  &
306                                                       ,       v  &
307                                                       ,      th  &
308                                                       ,       t  &
309                                                       ,     rho  &
310                                                       ,       w  
312    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                 &
313          INTENT(IN ),OPTIONAL ::                         z_at_w  &
314                                                       ,  cldfra  &
315                                                       , tke_pbl  
317    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                 &
318          INTENT(INOUT)  ::                                       &
319                                                           W0AVG
321    REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) ::           &
322           GSW,HT,XLAND
324    REAL, DIMENSION( ims:ime , jms:jme ),                         &
325           INTENT(INOUT) ::                                RAINC  &
326                                                     ,    RAINCV  &
327                                                     ,       NCA  & 
328                                                     ,      HTOP  & 
329                                                     ,      HBOT  &
330                                                     ,    CLDEFI
332    REAL, DIMENSION( kms:kme ), OPTIONAL, INTENT(IN   ) ::        &
333                                                             znu
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
338                                                     
339    INTEGER, DIMENSION( ims:ime , jms:jme ),                      &
340                     INTENT(IN) ::                          KPBL
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
368 ! optional arguments
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                 &
384                      ,rqvblten,rqvften                           &
385                      ,rthraten,rthblten                          &
386                      ,cugd_tten,cugd_qvten,cugd_qcten            &
387                      ,cugd_ttens,cugd_qvtens                     &
388                      ,forcet, forceq                             &
389                      ,rthften,rthcuten
391    REAL, DIMENSION( ims:ime , jms:jme ),                         &
392                     OPTIONAL,                                    &
393                     INTENT(INOUT) ::                             &
394                 apr_gr,apr_w,apr_mc,apr_st,apr_as,apr_capma      &
395                ,apr_capme,apr_capmi,edt_out,xmb_shallow          &
396                                                     , MASS_FLUX  &
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,        &
404                   cmfmc, cmfmcdzm,                               &
405                   zmmtu, zmmtv, zmupgu, zmupgd, zmvpgu, zmvpgd,  &
406                   zmicuu, zmicud, zmicvu, zmicvd, zmdice, zmdliq
407    REAL, DIMENSION( ims:ime , jms:jme , 1:ensdim ),              &
408           OPTIONAL,                                              &
409           INTENT(INOUT) ::                       XF_ENS, PR_ENS
410    REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),              &
411          OPTIONAL,                                              &
412          INTENT(INOUT) ::                                       &
413                                                    CFU1,        &
414                                                    CFD1,        &
415                                                    DFU1,        &
416                                                    EFU1,        &
417                                                    DFD1,        &
418                                                    EFD1
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
425 ! use or not.
427    LOGICAL, INTENT(IN), OPTIONAL ::                             &
428                                                       f_qv      &
429                                                      ,f_qc      &
430                                                      ,f_qr      &
431                                                      ,f_qi      &
432                                                      ,f_qs      &
433                                                      ,f_qg
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
445 #endif
447 ! LOCAL  VAR
449    INTEGER :: i,j,k,its,ite,jts,jte,ij,trigger_kf
450    logical :: l_flux
452 !-----------------------------------------------------------------
454    l_flux=.FALSE.
455    if (present(f_flux)) l_flux=f_flux
456    if (.not. PRESENT(CURR_SECS)) then
457       curr_secs_pass = -1
458    else 
459       curr_secs_pass = curr_secs
460    endif
462    if (.not. PRESENT(CUDT)) then
463       cudt_pass = -1
464       cudtacttime_pass = -1
465    else
466       cudt_pass = cudt
467       cudtacttime_pass = cudtacttime
468    endif
470    if (.not. PRESENT(adapt_step_flag)) then
471       adapt_step_flag_pass = .false.
472    else
473       adapt_step_flag_pass = adapt_step_flag
474    endif
476    ! Initialize tmppratec to pratec
478    if ( PRESENT ( pratec ) ) then
479       tmppratec(:,:) = pratec(:,:)
480    else
481       tmppratec(:,:) = 0.
482    end if
484    if (.not. PRESENT(kfeta_trigger)) then
485       trigger_kf = 1
486    else
487       trigger_kf = kfeta_trigger
488    endif
490    IF (cu_physics .eq. 0) return
492 #if  ( EM_CORE == 1 )
493       if(cu_physics .eq. 5 ) then
494       !$OMP PARALLEL DO   &
495       !$OMP PRIVATE ( ij,i,j,k,its,ite,jts,jte )
497       DO ij = 1 , num_tiles
498         its = i_start(ij)
499         ite = i_end(ij)
500         jts = j_start(ij)
501         jte = j_end(ij)
502         do j=jts,min(jte,jde-1)
503         do k=kts,kte
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)
508        enddo
509        enddo
510        enddo
511       ENDDO
512       !$OMP END PARALLEL DO
513       endif
515       IF ( cu_physics == G3SCHEME .OR. cu_physics == KFETASCHEME ) THEN
516 #ifdef DM_PARALLEL
517 #include "HALO_CUP_G3_IN.inc"
518 #endif
519       ENDIF
520 #endif
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
526       !$OMP PARALLEL DO   &
527       !$OMP PRIVATE ( ij ,its,ite,jts,jte, i,j,k)
529       DO ij = 1 , num_tiles
530         its = i_start(ij)
531         ite = i_end(ij)
532         jts = j_start(ij)
533         jte = j_end(ij)
536    cps_select: SELECT CASE(cu_physics)
538      CASE (KFSCHEME)
539           CALL wrf_debug(100,'in kfcps')
541           CALL 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                    & 
547                ,RHO=rho                                         &
548                ,U=u ,V=v ,TH=th ,T=t ,W=w                       &
549                ,PCPS=p ,PI=pi                                   &
550                ,XLV0=xlv0 ,XLV1=xlv1 ,XLS0=xls0 ,XLS1=xls1      &
551                ,RAINCV=raincv, PRATEC=tmppratec, NCA=nca        &
552                ,DZ8W=dz8w                                       &
553                ,W0AVG=w0avg                                     &
554                ,CP=cp ,R=r_d ,G=g ,EP1=ep_1 ,EP2=ep_2           &
555                ,SVP1=svp1 ,SVP2=svp2 ,SVP3=svp3 ,SVPT0=svpt0    &
556                ,STEPCU=stepcu                                   &
557                ,CU_ACT_FLAG=cu_act_flag                         &
558                ,WARM_RAIN=warm_rain                             &
559                ,QV=qv_curr                                      &
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 &
563               ! optionals
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                             &
569                                                                 )
571      CASE (BMJSCHEME)
572           CALL wrf_debug(100,'in bmj_cps')
573           CALL BMJDRV(                                          &
574                 TH=th,T=T ,RAINCV=raincv, PRATEC=tmppratec      &
575                ,RHO=rho                                         &
576                ,DT=dt ,ITIMESTEP=itimestep ,STEPCU=stepcu       &
577                ,CUDT=cudt_pass                                  &
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                         &
587                ,QV=qv_curr                                      &
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 &
591               ! optionals
592                ,RTHCUTEN=rthcuten ,RQVCUTEN=rqvcuten            &
593                                                                 )
595      CASE (KFETASCHEME)
596           CALL wrf_debug(100,'in kf_eta_cps')
597           CALL KF_ETA_CPS(                                      &
598                 U=u ,V=v ,TH=th ,T=t ,W=w ,RHO=rho              &
599                ,CUDT=cudt_pass                                  &
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        &
604                ,DZ8W=dz8w                                       &
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                    &
611                ,STEPCU=stepcu                                   &
612                ,CU_ACT_FLAG=cu_act_flag ,WARM_RAIN=warm_rain    &
613                ,QV=qv_curr                                      &
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                              &
618               ! optionals
619                ,RTHCUTEN=rthcuten                               &
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                             &
625                                                                 )
627      CASE (GDSCHEME)
628           CALL wrf_debug(100,'in grelldrv')
629           CALL 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     &
634                ,PRATEC=tmppratec                                &
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     &
650               ! optionals
651 #if (NMM_CORE == 1 )
652                ,RTHCUTEN=RTHCUTEN ,RTHFTEN=forcet               &
653                ,RQICUTEN=RQICUTEN ,RQVFTEN=forceq               &
654 #else
655                ,RTHCUTEN=RTHCUTEN ,RTHFTEN=RTHFTEN              &
656                ,RQICUTEN=RQICUTEN ,RQVFTEN=RQVFTEN              &
657 #endif
658                ,RTHRATEN=RTHRATEN,RTHBLTEN=RTHBLTEN             &
659                ,RQVCUTEN=RQVCUTEN,RQCCUTEN=RQCCUTEN             &
660                ,RQVBLTEN=RQVBLTEN                               &
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')
667      CASE (SASSCHEME)
668                                                                                                                                            
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 )
672           END IF
673           CALL wrf_debug(100,'in cu_sas')
674           CALL 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          &
682                ,PI3D=pi,RHO3D=rho                               &
683                ,DZ8W=dz8w,PCPS=p,P8W=p8w,XLAND=XLAND            &
684                ,CU_ACT_FLAG=CU_ACT_FLAG                         &
685                ,P_QC=p_qc                                       &
686                ,MOMMIX=MOMMIX  &
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     &
691                ,CUDT=cudt_pass                                  &
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 &
698                                                                 )
699      CASE (OSASSCHEME)
700                                                                                                                                            
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 )
704           END IF
705           CALL wrf_debug(100,'in cu_osas')
706           CALL 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          &
714                ,PI3D=pi,RHO3D=rho                               &
715                ,DZ8W=dz8w,PCPS=p,P8W=p8w,XLAND=XLAND            &
716                ,CU_ACT_FLAG=CU_ACT_FLAG                         &
717                ,P_QC=p_qc                                       &
718                ,store_rand=store_rand  &
719                ,MOMMIX=MOMMIX  &
720                ,P_QI=p_qi,P_FIRST_SCALAR=param_first_scalar     &
721                ,CUDT=cudt_pass                                  &
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 &
728                                                                 )
729      CASE (G3SCHEME)
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)
738             ENDDO
739             ENDDO
740          endif
741 #endif
742           CALL G3DRV(                                           &
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     &
771               ! optionals
772 #if (NMM_CORE == 1 )
773                ,RTHCUTEN=RTHCUTEN ,RTHFTEN=forcet               &
774                ,RQICUTEN=RQICUTEN ,RQVFTEN=forceq               &
775 #else
776                ,RTHCUTEN=RTHCUTEN ,RTHFTEN=RTHFTEN              &
777                ,RQICUTEN=RQICUTEN ,RQVFTEN=RQVFTEN              &
778                ,rqvblten=rqvblten,rthblten=rthblten             &
779 #endif
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                &
787 #endif                                 
788                                                                 )
789      CASE (CAMZMSCHEME)
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')
793       IF(.not.f_qi)THEN
794          WRITE( wrf_err_message , * ) 'This cumulus option requires ice microphysics option: f_qi = ', f_qi
795          CALL wrf_error_fatal ( wrf_err_message )
796       ENDIF
797           CALL CAMZM_DRIVER(                                        &
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                                  &
807                ,DZ8W=dz8w, HT=ht                                    &
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                        & 
815                ,CAPE_OUT=cape                                       &
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         &
833                                                                     )
834           ELSE
835              WRITE( wrf_err_message , * ) 'Insufficient arguments to call CAMZM cu scheme'
836              CALL wrf_error_fatal ( wrf_err_message )
837           ENDIF
839 ! TIEDTKE SCHEME - ZCX&YQW (U of Hawaii)
840      CASE (TIEDTKESCHEME)
842         IF ( PRESENT ( QFX ) .AND. PRESENT( ZNU ) ) THEN
844           CALL wrf_debug(100,'in cu_tiedtke')
845           CALL 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                         &
853                ,CUDT=cudt_pass                                  &
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 &
860               ! optionals
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                             &
866                                                              )
867         ELSE
868           CALL wrf_error_fatal('Lacking arguments for CU_TIEDTKE in cumulus driver')
869         ENDIF
871 ! New GFS SAS SCHEME - (Yonsei Univ., South Korea)
872      CASE (NSASSCHEME)
873         IF ( PRESENT ( QFX ) .AND. PRESENT( HFX ) ) THEN
874           CALL wrf_debug(100,'in nsas_cps')
875           CALL CU_NSAS(                                         &
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,                          & 
892                 pgcon=pgcon,                                    &
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 &
902                                                                 )
903         ELSE
904           CALL wrf_error_fatal('Lacking arguments for CU_NSAS in cumulus driver')
905         ENDIF
907      CASE DEFAULT 
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
914       ENDDO
915       !$OMP END PARALLEL DO
916 #if  ( EM_CORE == 1 )
917    IF(cu_physics .eq. 5 )then
918 #ifdef DM_PARALLEL
919 #     include "HALO_CUP_G3_OUT.inc"
920 #endif
921       !$OMP PARALLEL DO   &
922       !$OMP PRIVATE ( ij ,its,ite,jts,jte, i,j,k)
923       DO ij = 1 , num_tiles
924         its = i_start(ij)
925         ite = i_end(ij)
926         jts = j_start(ij)
927         jte = j_end(ij)
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)
941       ENDDO
942       !$OMP END PARALLEL DO
943    endif
944 #endif
947    ! Copy pratec back to output array, if necessary.
949    if (PRESENT(PRATEC)) then
950       pratec(:,:) = tmppratec(:,:)
951    endif
953    ! Copy cudtacttime back if necessary
955    if ( PRESENT(CUDTACTTIME) ) then
956       cudtacttime = cudtacttime_pass
957    end if
959    CALL wrf_debug(200,'returning from cumulus_driver')
961    END SUBROUTINE cumulus_driver
963 END MODULE module_cumulus_driver