splitting off fire_pixels3d.m
[wrffire.git] / wrfv2_fire / phys / module_microphysics_driver.F
blob62bad4cd101280a2eb160c2d6e73cf605b420366
1 !WRF:MEDIATION_LAYER:PHYSICS
2 ! *** add new modules of schemes here
4 MODULE module_microphysics_driver
5 CONTAINS
7 SUBROUTINE microphysics_driver(                                          &
8                        th, rho, pi_phy, p                                &
9                       ,ht, dz8w, p8w, dt,dx,dy                           &
10                       ,mp_physics, spec_zone                             &
11                       ,specified, channel_switch                         &
12                       ,warm_rain                                         &
13                       ,t8w                                               &
14                       ,chem_opt, progn                                   &
15                       ,cldfra, cldfra_old, exch_h, nsource               &
16                       ,qlsink, precr, preci, precs, precg                &
17                       ,xland,itimestep                                   &
18                       ,f_ice_phy,f_rain_phy,f_rimef_phy                  &
19                       ,lowlyr,sr, id                                     &
20                       ,ids,ide, jds,jde, kds,kde                         &
21                       ,ims,ime, jms,jme, kms,kme                         &
22                       ,ips,ipe, jps,jpe, kps,kpe                         &
23                       ,i_start,i_end,j_start,j_end,kts,kte               &
24                       ,num_tiles, naer                                   &
25                       ,qv_curr,qc_curr,qr_curr,qi_curr,qs_curr,qg_curr   &
26                       ,qndrop_curr,qni_curr,qh_curr,qnh_curr             &
27                       ,qzr_curr,qzi_curr,qzs_curr,qzg_curr,qzh_curr      &
28                       ,qns_curr,qnr_curr,qng_curr,qnn_curr,qnc_curr      &
29                       ,qvolg_curr                                        &
30                       ,f_qv,f_qc,f_qr,f_qi,f_qs,f_qg,f_qndrop,f_qni      &
31                       ,f_qns,f_qnr,f_qng,f_qnc,f_qnn,f_qh,f_qnh          &
32                       ,            f_qzr,f_qzi,f_qzs,f_qzg,f_qzh         &
33                       ,f_qvolg                                           &
34                       ,qrcuten, qscuten, qicuten, mu                     &
35                       ,qt_curr,f_qt                                      &
36                       ,mp_restart_state,tbpvs_state,tbpvs0_state         & ! for etampnew or etampold
37                       ,hail,ice2                                         & ! for mp_gsfcgce
38 !                     ,ccntype                                           & ! for mp_milbrandt2mom
39                       ,w ,z                                              &
40                       ,rainnc,    rainncv                                &
41                       ,snownc,    snowncv                                &
42                       ,hailnc,    hailncv                                &
43                       ,graupelnc, graupelncv                             &
44 #ifdef WRF_CHEM
45                       ,rainprod, evapprod                                &
46                       ,qv_b4mp, qc_b4mp, qi_b4mp, qs_b4mp                &
47 #endif
48                       ,refl_10cm                                         & ! HM, 9/22/09, add for refl
49 ! YLIN
50 ! Added the RI_CURR array to the call
51                       ,ri_curr                                           &
52                       ,diagflag                                          &
53                                                    )
54 ! Framework
55 #if(NMM_CORE==1)
56    USE module_state_description, ONLY :                                  &
57                      KESSLERSCHEME, LINSCHEME, SBU_YLINSCHEME, WSM3SCHEME, WSM5SCHEME    &
58                     ,WSM6SCHEME, ETAMPNEW, ETAMPOLD, etamp_HWRF,THOMPSON, MORR_TWO_MOMENT     &
59                     ,GSFCGCESCHEME, WDM5SCHEME, WDM6SCHEME &
60                     ,MILBRANDT2MOM !,MILBRANDT3MOM 
61 #else
62    USE module_state_description, ONLY :                                  &
63                      KESSLERSCHEME, LINSCHEME, SBU_YLINSCHEME, WSM3SCHEME, WSM5SCHEME    &
64                     ,WSM6SCHEME, ETAMPNEW, ETAMPOLD, THOMPSON, MORR_TWO_MOMENT     &
65                     ,GSFCGCESCHEME, WDM5SCHEME, WDM6SCHEME, NSSL_2MOM, NSSL_2MOMCCN  &
66                     ,MILBRANDT2MOM !,MILBRANDT3MOM
67 #endif
69 ! Model Layer
70    USE module_model_constants
71    USE module_wrf_error
73 ! *** add new modules of schemes here
75    USE module_mp_kessler
76    USE module_mp_lin
77    USE module_mp_sbu_ylin
78    USE module_mp_wsm3
79    USE module_mp_wsm5
80    USE module_mp_wsm6
81    USE module_mp_etanew
82    USE module_mp_etaold
83    USE module_mp_thompson
84    USE module_mp_gsfcgce
85    USE module_mp_morr_two_moment
86    USE module_mp_wdm5
87    USE module_mp_wdm6
88    USE module_mp_milbrandt2mom
89 !  USE module_mp_milbrandt3mom
90 #if (EM_CORE==1)
91    USE module_mp_nssl_2mom
92 #endif
94    USE module_mp_HWRF
95    USE module_mixactivate, only: prescribe_aerosol_mixactivate
97 !----------------------------------------------------------------------
98    ! This driver calls subroutines for the microphys.
99    !
100    ! Schemes
101    !
102    ! Kessler scheme
103    ! Lin et al. (1983), Rutledge and Hobbs (1984)
104    ! WRF Single-Moment 3-class, Hong, Dudhia and Chen (2004)
105    ! WRF Single-Moment 5-class, Hong, Dudhia and Chen (2004)
106    ! WRF Single-Moment 6-class, Lim and Hong (2003 WRF workshop)
107    ! Eta Grid-scale Cloud and Precipitation scheme (EGCP01, Ferrier)
108    !   * etampnew - what's in the operational 4-km High-Resolution Window Runs
109    !   * etampold - what was run in the 12-km operational NAM
110    ! Milbrandt and Yau (2005)
112 !----------------------------------------------------------------------
113    IMPLICIT NONE
114 !======================================================================
115 ! Grid structure in physics part of WRF
116 !----------------------------------------------------------------------
117 ! The horizontal velocities used in the physics are unstaggered
118 ! relative to temperature/moisture variables. All predicted
119 ! variables are carried at half levels except w, which is at full
120 ! levels. Some arrays with names (*8w) are at w (full) levels.
122 !----------------------------------------------------------------------
123 ! In WRF, kms (smallest number) is the bottom level and kme (largest
124 ! number) is the top level.  In your scheme, if 1 is at the top level,
125 ! then you have to reverse the order in the k direction.
127 !         kme      -   half level (no data at this level)
128 !         kme    ----- full level
129 !         kme-1    -   half level
130 !         kme-1  ----- full level
131 !         .
132 !         .
133 !         .
134 !         kms+2    -   half level
135 !         kms+2  ----- full level
136 !         kms+1    -   half level
137 !         kms+1  ----- full level
138 !         kms      -   half level
139 !         kms    ----- full level
141 !======================================================================
142 ! Definitions
143 !-----------
144 ! Rho_d      dry density (kg/m^3)
145 ! Theta_m    moist potential temperature (K)
146 ! Qv         water vapor    mixing ratio (kg/kg)
147 ! Qc         cloud water    mixing ratio (kg/kg)
148 ! Qr         rain water     mixing ratio (kg/kg)
149 ! Qi         cloud ice      mixing ratio (kg/kg)
150 ! Qs         snow           mixing ratio (kg/kg)
151 ! Qg         graupel        mixing ratio (kg/kg)
152 ! Qh         hail           mixing ratio (kg/kg)
153 ! Qndrop     droplet number mixing ratio (#/kg)
154 ! Qni        cloud ice number concentration (#/kg)
155 ! Qns        snow      number concentration (#/kg)
156 ! Qnr        rain      number concentration (#/kg)
157 ! Qng        graupel   number concentration (#/kg)
158 ! Qnh        hail      number concentration (#/kg)
160 ! Qzr        rain             reflectivity (m6/kg)
161 ! Qzi        ice              reflectivity (m6/kg)
162 ! Qzs        snow             reflectivity (m6/kg)
163 ! Qzg        graupel          reflectivity (m6/kg)
164 ! Qzh        hail             reflectivity (m6/kg)
166 ! Qvolg        graupel   particle volume (m3/kg)
169 !----------------------------------------------------------------------
170 !-- th        potential temperature    (K)
171 !-- moist_new     updated moisture array   (kg/kg)
172 !-- moist_old     Old moisture array       (kg/kg)
173 !-- rho           density of air           (kg/m^3)
174 !-- pi_phy        exner function           (dimensionless)
175 !-- p             pressure                 (Pa)
176 !-- RAINNC        grid scale precipitation (mm)
177 !-- RAINNCV       one time step grid scale precipitation (mm/step)
178 !-- SNOWNC        grid scale snow and ice (mm)
179 !-- SNOWNCV       one time step grid scale snow and ice (mm/step)
180 !-- GRAUPELNC     grid scale graupel (mm)
181 !-- GRAUPELNCV    one time step grid scale graupel (mm/step)
182 !-- HAILNC        grid scale hail (mm)
183 !-- HAILNCV       one time step grid scale hail (mm/step)
184 !-- SR            one time step mass ratio of snow to total precip
185 !-- z             Height above sea level   (m)
186 !-- dt            Time step              (s)
187 !-- G             acceleration due to gravity  (m/s^2)
188 !-- CP            heat capacity at constant pressure for dry air (J/kg/K)
189 !-- R_d           gas constant for dry air (J/kg/K)
190 !-- R_v           gas constant for water vapor (J/kg/K)
191 !-- XLS           latent heat of sublimation   (J/kg)
192 !-- XLV           latent heat of vaporization  (J/kg)
193 !-- XLF           latent heat of melting       (J/kg)
194 !-- rhowater      water density                      (kg/m^3)
195 !-- rhosnow       snow density               (kg/m^3)
196 !-- F_ICE_PHY     Fraction of ice.
197 !-- F_RAIN_PHY    Fraction of rain.
198 !-- F_RIMEF_PHY   Mass ratio of rimed ice (rime factor)
199 !-- t8w           temperature at layer interfaces
200 !-- cldfra, cldfra_old, current, previous cloud fraction
201 !-- exch_h        vertical diffusivity (m2/s)
202 !-- qlsink        Fractional cloud water sink (/s)
203 !-- precr         rain precipitation rate at all levels (kg/m2/s)
204 !-- preci         ice precipitation rate at all levels (kg/m2/s)
205 !-- precs         snow precipitation rate at all levels (kg/m2/s)
206 !-- precg         graupel precipitation rate at all levels (kg/m2/s)                             &
207 !-- P_QV          species index for water vapor
208 !-- P_QC          species index for cloud water
209 !-- P_QR          species index for rain water
210 !-- P_QI          species index for cloud ice
211 !-- P_QS          species index for snow
212 !-- P_QG          species index for graupel
213 !-- P_QH          species index for hail
214 !-- P_QNDROP      species index for cloud drop mixing ratio
215 !-- P_QNR         species index for rain number concentration,
216 !-- P_QNI         species index for cloud ice number concentration
217 !-- P_QNS         species index for snow number concentration,
218 !-- P_QNG         species index for graupel number concentration,
219 !-- P_QNH         species index for hail number concentration,
220 !-- P_QZR         species index for rain    reflectivity
221 !-- P_QZI         species index for ice     reflectivity
222 !-- P_QZS         species index for snow    reflectivity
223 !-- P_QZG         species index for graupel reflectivity
224 !-- P_QZH         species index for hail    reflectivity
225 !-- P_QVOLG       species index for graupel particle volume,
226 !-- id            grid id number
227 !-- ids           start index for i in domain
228 !-- ide           end index for i in domain
229 !-- jds           start index for j in domain
230 !-- jde           end index for j in domain
231 !-- kds           start index for k in domain
232 !-- kde           end index for k in domain
233 !-- ims           start index for i in memory
234 !-- ime           end index for i in memory
235 !-- jms           start index for j in memory
236 !-- jme           end index for j in memory
237 !-- kms           start index for k in memory
238 !-- kme           end index for k in memory
239 !-- i_start       start indices for i in tile
240 !-- i_end         end indices for i in tile
241 !-- j_start       start indices for j in tile
242 !-- j_end         end indices for j in tile
243 !-- its           start index for i in tile
244 !-- ite           end index for i in tile
245 !-- jts           start index for j in tile
246 !-- jte           end index for j in tile
247 !-- kts           start index for k in tile
248 !-- kte           end index for k in tile
249 !-- num_tiles     number of tiles
250 !-- diagflag      Logical to tell us when to produce diagnostics for history or restart
252 !======================================================================
254    INTEGER,    INTENT(IN   )    :: mp_physics
255    LOGICAL,    INTENT(IN   )    :: specified
256    INTEGER, OPTIONAL, INTENT(IN   )    :: chem_opt, progn
257    INTEGER, OPTIONAL, INTENT(IN   )    :: hail, ice2 !, ccntype
259    INTEGER,      INTENT(IN   )    ::       ids,ide, jds,jde, kds,kde
260    INTEGER,      INTENT(IN   )    ::       ims,ime, jms,jme, kms,kme
261    INTEGER, OPTIONAL, INTENT(IN   )    ::       ips,ipe, jps,jpe, kps,kpe
262    INTEGER,      INTENT(IN   )    ::                         kts,kte
263    INTEGER,      INTENT(IN   )    ::     itimestep,num_tiles,spec_zone
264    INTEGER, DIMENSION(num_tiles), INTENT(IN) ::                       &
265      &           i_start,i_end,j_start,j_end
267    LOGICAL,      INTENT(IN   )    ::   warm_rain
269    REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                    &
270          INTENT(INOUT) ::                                         th
274    REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                    &
275          INTENT(IN   ) ::                                             &
276                                                                  rho, &
277                                                                 dz8w, &
278                                                                  p8w, &
279                                                               pi_phy, &
280                                                                    p
283    REAL, INTENT(INOUT),  DIMENSION(ims:ime, kms:kme, jms:jme ) ::     &
284                                      F_ICE_PHY,F_RAIN_PHY,F_RIMEF_PHY
285 !!$#ifdef WRF_CHEM
286 !  REAL, INTENT(OUT), DIMENSION(ims:ime, kms:kme, jms:jme ) ::     &
287    REAL, OPTIONAL, INTENT(OUT), DIMENSION(ims:ime, kms:kme, jms:jme ) ::     &
288 !!$#else
289 !!$  REAL, DIMENSION(ims:ime, kms:kme, jms:jme ) ::     &
290 !!$#endif
291          qlsink, & ! cloud water sink (/s)
292          precr, & ! rain precipitation rate at all levels (kg/m2/s)
293          preci, & ! ice precipitation rate at all levels (kg/m2/s)
294          precs, & ! snow precipitation rate at all levels (kg/m2/s)
295          precg    ! graupel precipitation rate at all levels (kg/m2/s)
299    REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN)   :: XLAND
301    REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(OUT)   :: SR
303    REAL, INTENT(IN   ) :: dt,dx,dy
305    INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT) :: LOWLYR
308 ! Optional
310    REAL, OPTIONAL, DIMENSION( ims:ime , kms:kme, jms:jme ) , INTENT(OUT) :: refl_10cm
312    LOGICAL,  OPTIONAL,   INTENT(IN   )    :: channel_switch
313    REAL, OPTIONAL,  INTENT(INOUT   ) :: naer  ! aerosol number concentration (/kg)
314    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
315          OPTIONAL,                                                &
316          INTENT(INOUT ) ::                                        &
317                   w, z, t8w                                       &
318                  ,cldfra, cldfra_old, exch_h                      &
319                  ,qv_curr,qc_curr,qr_curr,qi_curr,qs_curr,qg_curr &
320                  ,qt_curr,qndrop_curr,qni_curr,qh_curr,qnh_curr   &
321                  ,qns_curr,qnr_curr,qng_curr,qnn_curr,qnc_curr    &
322                  ,qzr_curr,qzi_curr,qzs_curr,qzg_curr,qzh_curr    &
323                  ,qvolg_curr
325    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
326          OPTIONAL,                                                &
327          INTENT(IN) :: qrcuten, qscuten, qicuten
328 #ifdef WRF_CHEM
329    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
330          INTENT(INOUT) :: rainprod, evapprod
331    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
332          INTENT(INOUT) :: qv_b4mp, qc_b4mp, qi_b4mp, qs_b4mp
333 #endif
334    REAL, DIMENSION( ims:ime, jms:jme ),                           &
335          OPTIONAL,                                                &
336          INTENT(IN) :: mu
337 ! YLIN
338 ! Added RI_CURR similar to microphysics fields above
339    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                  &
340          OPTIONAL,                                                &
341          INTENT(INOUT) :: ri_curr
344    REAL, DIMENSION(ims:ime, kms:kme, jms:jme ),                   &
345          OPTIONAL,                                                &
346          INTENT(OUT ) ::                                          &
347                   nsource
350    REAL, DIMENSION( ims:ime , jms:jme ),                          &
351          INTENT(INOUT),                                           &
352          OPTIONAL   ::                                            &
353                                                            RAINNC &
354                                                          ,RAINNCV &
355                                                           ,SNOWNC &
356                                                          ,SNOWNCV &
357                                                        ,GRAUPELNC &
358                                                       ,GRAUPELNCV &
359                                                           ,HAILNC &
360                                                          ,HAILNCV
361    INTEGER,OPTIONAL,INTENT(IN   )    ::                        id
363    REAL , DIMENSION( ims:ime , jms:jme ) , OPTIONAL ,             &
364          INTENT(IN)   ::                                       ht
366    REAL, DIMENSION (:), OPTIONAL, INTENT(INOUT) :: mp_restart_state &
367                                          ,tbpvs_state,tbpvs0_state
370    LOGICAL, OPTIONAL :: f_qv,f_qc,f_qr,f_qi,f_qs,f_qg,f_qndrop,f_qni,f_qt    &
371                        ,f_qns,f_qnr,f_qng,f_qnn,f_qnc,f_qh,f_qnh,f_qzr       &
372                        ,f_qzi,f_qzs,f_qzg,f_qzh,f_qvolg
374    LOGICAL, OPTIONAL :: diagflag
376 ! LOCAL  VAR
378    INTEGER :: i,j,k,its,ite,jts,jte,ij,sz,n
379    LOGICAL :: channel
381 !---------------------------------------------------------------------
382 !  check for microphysics type.  We need a clean way to
383 !  specify these things!
384 !---------------------------------------------------------------------
386    channel = .FALSE.
387    IF ( PRESENT ( channel_switch ) ) channel = channel_switch
389    if (mp_physics .eq. 0) return
390    IF( specified ) THEN
391      sz = spec_zone
392    ELSE
393      sz = 0
394    ENDIF
396 #ifndef RUN_ON_GPU
397    !$OMP PARALLEL DO   &
398    !$OMP PRIVATE ( ij, its, ite, jts, jte, i,j,k,n )
400    DO ij = 1 , num_tiles
401        IF (channel) THEN
402          its = max(i_start(ij),ids)
403          ite = min(i_end(ij),ide-1)
404        ELSE
405          its = max(i_start(ij),ids+sz)
406          ite = min(i_end(ij),ide-1-sz)
407        ENDIF
408        jts = max(j_start(ij),jds+sz)
409        jte = min(j_end(ij),jde-1-sz)
410 #else
411    DO ij = 1 , 1
412        IF (channel) THEN
413          its = max(ips,ids)
414          ite = min(ipe,ide-1)
415        ELSE
416          its = max(ips,ids+sz)
417          ite = min(ipe,ide-1-sz)
418        ENDIF
419        jts = max(jps,jds+sz)
420        jte = min(jpe,jde-1-sz)
421 #endif
424 ! 2009-06009 rce - zero all these for safety
425        IF( PRESENT(qlsink) ) qlsink(its:ite,kts:kte,jts:jte) = 0.
426        IF( PRESENT(precr ) ) precr(its:ite,kts:kte,jts:jte)  = 0.
427        IF( PRESENT(preci ) ) preci(its:ite,kts:kte,jts:jte)  = 0.
428        IF( PRESENT(precs ) ) precs(its:ite,kts:kte,jts:jte)  = 0.
429        IF( PRESENT(precg ) ) precg(its:ite,kts:kte,jts:jte)  = 0.
431 !-----------
432        IF( PRESENT(chem_opt) .AND. PRESENT(progn) ) THEN
433        IF( chem_opt==0 .AND. progn==1 .AND. (mp_physics==LINSCHEME  .OR. mp_physics==MORR_TWO_MOMENT)) THEN
434           IF( PRESENT( QNDROP_CURR ) ) THEN
435              CALL wrf_debug ( 100 , 'microphysics_driver: calling prescribe_aerosol_mixactivate' )
436 ! 06-nov-2005 rce - id  & itimestep added to arg list
437              call prescribe_aerosol_mixactivate (               &
438                   id, itimestep, dt, naer,                      &
439                   rho, th, pi_phy, w, cldfra, cldfra_old,       &
440                   z, dz8w, p8w, t8w, exch_h,                    &
441                   qv_curr, qc_curr, qi_curr, qndrop_curr,       &
442                   nsource,                                      &
443                   ids,ide, jds,jde, kds,kde,                    &
444                   ims,ime, jms,jme, kms,kme,                    &
445                   its,ite, jts,jte, kts,kte,                    &
446                   F_QC=f_qc, F_QI=f_qi                          )
447           END IF
448        ELSE IF( progn==1 .AND. mp_physics/=LINSCHEME .AND. mp_physics/=MORR_TWO_MOMENT) THEN
449              call wrf_error_fatal("SETTINGS ERROR: Prognostic cloud droplet number can only be used with the mp_physics=LINSCHEME or MORRISON.")
450        END IF
451        END IF
453      micro_select: SELECT CASE(mp_physics)
455         CASE (KESSLERSCHEME)
456              CALL wrf_debug ( 100 , 'microphysics_driver: calling kessler' )
457              IF ( PRESENT( QV_CURR ) .AND. PRESENT( QC_CURR ) .AND.  &
458                                            PRESENT( QR_CURR ) .AND.  &
459                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV ) .AND.  &
460                                            PRESENT( Z       ))  THEN
461                CALL kessler(                                        &
462                   T=th                                              &
463                  ,QV=qv_curr                                        &
464                  ,QC=qc_curr                                        &
465                  ,QR=qr_curr                                        &
466                  ,RHO=rho, PII=pi_phy,DT_IN=dt, Z=z, XLV=xlv, CP=cp &
467                  ,EP2=ep_2,SVP1=svp1,SVP2=svp2                      &
468                  ,SVP3=svp3,SVPT0=svpt0,RHOWATER=rhowater           &
469                  ,DZ8W=dz8w                                         &
470                  ,RAINNC=rainnc,RAINNCV=rainncv                     &
471                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
472                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
473                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
474                                                                     )
475              ELSE
476                 CALL wrf_error_fatal ( 'arguments not present for calling kessler' )
477              ENDIF
480         CASE (THOMPSON)
481              CALL wrf_debug ( 100 , 'microphysics_driver: calling thompson' )
482              IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND.  &
483                   PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND.  &
484                   PRESENT( QS_CURR ) .AND. PRESENT ( QG_CURR ) .AND.  &
485                   PRESENT( QNR_CURR) .AND. PRESENT ( QNI_CURR) .AND.  &
486                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV ) ) THEN
487 #ifdef WRF_CHEM
488                  qv_b4mp(its:ite,kts:kte,jts:jte) = qv_curr(its:ite,kts:kte,jts:jte)
489                  qc_b4mp(its:ite,kts:kte,jts:jte) = qc_curr(its:ite,kts:kte,jts:jte)
490                  qi_b4mp(its:ite,kts:kte,jts:jte) = qi_curr(its:ite,kts:kte,jts:jte)
491                  qs_b4mp(its:ite,kts:kte,jts:jte) = qs_curr(its:ite,kts:kte,jts:jte)
492 #endif
493              CALL mp_gt_driver(                          &
494                      QV=qv_curr,                         &
495                      QC=qc_curr,                         &
496                      QR=qr_curr,                         &
497                      QI=qi_curr,                         &
498                      QS=qs_curr,                         &
499                      QG=qg_curr,                         &
500                      NI=qni_curr,                        &
501                      NR=qnr_curr,                        &
502                      TH=th,                              &
503                      PII=pi_phy,                         &
504                      P=p,                                &
505                      DZ=dz8w,                            &
506                      DT_IN=dt,                           &
507                      ITIMESTEP=itimestep,                &
508                      RAINNC=RAINNC,                      &
509                      RAINNCV=RAINNCV,                    &
510                      SNOWNC=SNOWNC,                      &
511                      SNOWNCV=SNOWNCV,                    &
512                      GRAUPELNC=GRAUPELNC,                &
513                      GRAUPELNCV=GRAUPELNCV,              &
514                      SR=SR,                              &
515 #ifdef WRF_CHEM
516                      RAINPROD=rainprod,                  &
517                      EVAPPROD=evapprod,                  &
518 #endif
519 !                    refl_10cm, grid_clock, grid_alarms, &
520                  IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
521                  IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
522                  ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte)
523              ELSE
524                 CALL wrf_error_fatal ( 'arguments not present for calling thompson_et_al' )
525              ENDIF
528     CASE (MORR_TWO_MOMENT)
529          CALL wrf_debug(100, 'microphysics_driver: calling morrison two moment')
530          IF (PRESENT (QV_CURR) .AND. PRESENT (QC_CURR) .AND. &
531              PRESENT (QR_CURR) .AND. PRESENT (QI_CURR) .AND. &
532          PRESENT (QS_CURR) .AND. PRESENT (QG_CURR) .AND. &
533          PRESENT (QR_CURR) .AND. PRESENT (QI_CURR) .AND. &
534          PRESENT (QNS_CURR) .AND. PRESENT (QNI_CURR).AND. &
535          PRESENT (QNR_CURR) .AND. PRESENT (QNG_CURR).AND. &
536          PRESENT (MU) .AND. PRESENT (QSCUTEN).AND. &
537          PRESENT (QRCUTEN) .AND. PRESENT (QICUTEN).AND. &
538          PRESENT (RAINNC ) .AND. PRESENT (RAINNCV) .AND. &
539          PRESENT (Z      ) .AND.PRESENT ( W      )  ) THEN
540          CALL mp_morr_two_moment(                            &
541                      ITIMESTEP=itimestep,                &  !*
542                      TH=th,                              &  !*
543                      QV=qv_curr,                         &  !*
544                      QC=qc_curr,                         &  !*
545                      QR=qr_curr,                         &  !*
546                      QI=qi_curr,                         &  !*
547                      QS=qs_curr,                         &  !*
548                      QG=qg_curr,                         &  !*
549                      NI=qni_curr,                        &  !*
550                      NS=qns_curr,                        &  !* ! VVT
551                      NR=qnr_curr,                        &  !* ! VVT
552                      NG=qng_curr,                        &  !* ! VVT
553                      RHO=rho,                            &  !*
554                      PII=pi_phy,                         &  !*
555                      P=p,                                &  !*
556                      DT_IN=dt,                           &  !*
557                      DZ=dz8w,                            &  !* !hm
558                      HT=ht,                              &  !*
559                      W=w                                 &  !*
560                     ,RAINNC=RAINNC                       &  !*
561                     ,RAINNCV=RAINNCV                     &  !*
562                     ,SR=SR                               &  !* !hm
563                     ,qrcuten=qrcuten                     &  ! hm
564                     ,qscuten=qscuten                     &  ! hm
565                     ,qicuten=qicuten                     &  ! hm
566                     ,mu=mu                          &  ! hm
567                     ,F_QNDROP=f_qndrop                   &  ! hm for wrf-chem
568                  ,QNDROP=qndrop_curr                     &  ! hm for wrf-chem
569                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
570                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
571                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
572                  ,QLSINK=qlsink                                     & ! jdf for wrf-chem
573                  ,PRECR=precr,PRECI=preci,PRECS=precs,PRECG=precg   & ! jdf for wrf-chem
574                                                                     )
575         ELSE
576            Call wrf_error_fatal( 'arguments not present for calling morrison two moment')
577         ENDIF
580     CASE (MILBRANDT2MOM)
581          CALL wrf_debug(100, 'microphysics_driver: calling milbrandt2mom')
582          IF (PRESENT (QV_CURR) .AND.                           &
583              PRESENT (QC_CURR) .AND. PRESENT (QNC_CURR)  .AND. &
584              PRESENT (QR_CURR) .AND. PRESENT (QNR_CURR)  .AND. &
585              PRESENT (QI_CURR) .AND. PRESENT (QNI_CURR)  .AND. &
586              PRESENT (QS_CURR) .AND. PRESENT (QNS_CURR)  .AND. &
587              PRESENT (QG_CURR) .AND. PRESENT (QNG_CURR)  .AND. &
588              PRESENT (QH_CURR) .AND. PRESENT (QNH_CURR)  .AND. &
589              PRESENT (RAINNC ) .AND. PRESENT (RAINNCV)   .AND. &
590              PRESENT (SNOWNC ) .AND. PRESENT (SNOWNCV)   .AND. &
591              PRESENT (HAILNC ) .AND. PRESENT (HAILNCV)   .AND. &
592              PRESENT (GRAUPELNC).AND.PRESENT (GRAUPELNCV).AND. &
593              PRESENT (Z      ) .AND. PRESENT ( W      )  ) THEN
594 !            PRESENT (ccntype)                                 &
596          CALL mp_milbrandt2mom_driver(                   &
597                      ITIMESTEP=itimestep,                &
598                      TH=th,                              &
599                      QV=qv_curr,                         &
600                      QC=qc_curr,                         &
601                      QR=qr_curr,                         &
602                      QI=qi_curr,                         &
603                      QS=qs_curr,                         &
604                      QG=qg_curr,                         &
605                      QH=qh_curr,                         &
606                      NC=qnc_curr,                        &
607                      NR=qnr_curr,                        &
608                      NI=qni_curr,                        &
609                      NS=qns_curr,                        &
610                      NG=qng_curr,                        &
611                      NH=qnh_curr,                        &
612                      PII=pi_phy,                         &
613                      P=p,                                &
614                      DT_IN=dt,                           &
615                      DZ=dz8w,                            &
616                      W=w,                                &
617                      RAINNC   = RAINNC,                  &
618                      RAINNCV  = RAINNCV,                 &
619                      SNOWNC   = SNOWNC,                  &
620                      SNOWNCV  = SNOWNCV,                 &
621                      HAILNC   = HAILNC,                  &
622                      HAILNCV  = HAILNCV,                 &
623                      GRPLNC   = GRAUPELNC,               &
624                      GRPLNCV  = GRAUPELNCV,              &
625                      SR=SR,                              &
626 !                    ccntype  = ccntype,                 &
627                      Zet      = refl_10cm,               & ! HM, 9/22/09 for refl
628                   IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
629                   IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
630                   ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte  &
631                                                                     )
632         ELSE
633            Call wrf_error_fatal( 'arguments not present for calling milbrandt2mom')
634         ENDIF
637 !     CASE (MILBRANDT3MOM)
638 !          CALL wrf_debug(100, 'microphysics_driver: calling milbrandt3mom')
639 !          IF (PRESENT (QV_CURR) .AND.                          &
640 !              PRESENT (QC_CURR) .AND. PRESENT (QNC_CURR) .AND. &
641 !              PRESENT (QR_CURR) .AND. PRESENT (QNR_CURR) .AND. PRESENT (QZR_CURR) .AND.  &
642 !              PRESENT (QI_CURR) .AND. PRESENT (QNI_CURR) .AND. PRESENT (QZI_CURR) .AND.  &
643 !              PRESENT (QS_CURR) .AND. PRESENT (QNS_CURR) .AND. PRESENT (QZS_CURR) .AND.  &
644 !              PRESENT (QG_CURR) .AND. PRESENT (QNG_CURR) .AND. PRESENT (QZG_CURR) .AND.  &
645 !              PRESENT (QH_CURR) .AND. PRESENT (QNH_CURR) .AND. PRESENT (QZH_CURR) .AND.  &
646 !              PRESENT (RAINNC ) .AND. PRESENT (RAINNCV)  .AND. &
647 !              PRESENT (Z      ) .AND. PRESENT ( W      )  ) THEN
648 !          CALL mp_milbrandt3mom_driver(                   &
649 !                      ITIMESTEP=itimestep,                &  !*
650 !                      TH=th,                              &  !*
651 !                      QV=qv_curr,                         &  !*
652 !                      QC=qc_curr,                         &  !*
653 !                      QR=qr_curr,                         &  !*
654 !                      QI=qi_curr,                         &  !*
655 !                      QS=qs_curr,                         &  !*
656 !                      QG=qg_curr,                         &  !*
657 !                      QH=qh_curr,                         &  !*
658 !                      NC=qnc_curr,                        &  !*
659 !                      NR=qnr_curr,                        &  !*
660 !                      NI=qni_curr,                        &  !*
661 !                      NS=qns_curr,                        &  !*
662 !                      NG=qng_curr,                        &  !*
663 !                      NH=qnh_curr,                        &  !*
664 !                      ZR=qzr_curr,                        &  !*
665 !                      ZI=qzi_curr,                        &  !*
666 !                      ZS=qzs_curr,                        &  !*
667 !                      ZG=qzg_curr,                        &  !*
668 !                      ZH=qzh_curr,                        &  !*
669 !                      PII=pi_phy,                         &  !*
670 !                      P=p,                                &  !*
671 !                      DT_IN=dt,                           &  !*
672 !                      DZ=dz8w,                            &  !* ! h
673 !                      W=w                                 &  !*
674 !                     ,RAINNC=RAINNC                       &  !*
675 !                     ,RAINNCV=RAINNCV                     &  !*
676 !                     ,SR=SR                               &  !* !hm
677 !                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
678 !                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
679 !                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
680 !                                                                     )
681 !         ELSE
682 !            Call wrf_error_fatal( 'arguments not present for calling milbrandt3mom')
683 !         ENDIF
685 #if (EM_CORE==1)
686     CASE (NSSL_2MOM)
687          CALL wrf_debug(100, 'microphysics_driver: calling nssl2mom')
688          IF (PRESENT (QV_CURR) .AND.                           &
689              PRESENT (QC_CURR) .AND. PRESENT (QNC_CURR)  .AND. &
690              PRESENT (QR_CURR) .AND. PRESENT (QNR_CURR)  .AND. &
691              PRESENT (QI_CURR) .AND. PRESENT (QNI_CURR)  .AND. &
692              PRESENT (QS_CURR) .AND. PRESENT (QNS_CURR)  .AND. &
693              PRESENT (QG_CURR) .AND. PRESENT (QNG_CURR)  .AND. &
694              PRESENT (QH_CURR) .AND. PRESENT (QNH_CURR)  .AND. &
695              PRESENT (RAINNC ) .AND. PRESENT (RAINNCV)   .AND. &
696              PRESENT (SNOWNC ) .AND. PRESENT (SNOWNCV)   .AND. &
697              PRESENT (HAILNC ) .AND. PRESENT (HAILNCV)   .AND. &
698              PRESENT (GRAUPELNC).AND.PRESENT (GRAUPELNCV).AND. &
699              PRESENT (Z      ) .AND. PRESENT ( W      )  .AND. &
700              PRESENT (QVOLG_CURR) ) THEN
701              
703          CALL nssl_2mom_driver(                          &
704                      ITIMESTEP=itimestep,                &
705                      TH=th,                              &
706                      QV=qv_curr,                         &
707                      QC=qc_curr,                         &
708                      QR=qr_curr,                         &
709                      QI=qi_curr,                         &
710                      QS=qs_curr,                         &
711                      QH=qg_curr,                         &
712                      QHL=qh_curr,                        &
713                      CCW=qnc_curr,                       &
714                      CRW=qnr_curr,                       &
715                      CCI=qni_curr,                       &
716                      CSW=qns_curr,                       &
717                      CHW=qng_curr,                       &
718                      CHL=qnh_curr,                       &
719                      VHW=qvolg_curr,                     &
720                      PII=pi_phy,                         &
721                      P=p,                                &
722                      W=w,                                &
723                      DZ=dz8w,                            &
724                      DTP=dt,                             &
725                      DN=rho,                             &
726                      RAINNC   = RAINNC,                  &
727                      RAINNCV  = RAINNCV,                 &
728                      SNOWNC   = SNOWNC,                  &
729                      SNOWNCV  = SNOWNCV,                 &
730                      HAILNC   = HAILNC,                  &
731                      HAILNCV  = HAILNCV,                 &
732                      GRPLNC   = GRAUPELNC,               &
733                      GRPLNCV  = GRAUPELNCV,              &
734                      SR=SR,                              &
735                      dbz      = refl_10cm,               &
736                      diagflag = diagflag,                &
737                   IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
738                   IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
739                   ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte  &
740                                                                     )
741         ELSE
742            Call wrf_error_fatal( 'arguments not present for calling nssl_2mom')
743         ENDIF
745     CASE (NSSL_2MOMCCN)
746          CALL wrf_debug(100, 'microphysics_driver: calling nssl_2momccn')
747          IF (PRESENT (QV_CURR) .AND.                           &
748              PRESENT (QC_CURR) .AND. PRESENT (QNC_CURR)  .AND. &
749              PRESENT (QR_CURR) .AND. PRESENT (QNR_CURR)  .AND. &
750              PRESENT (QI_CURR) .AND. PRESENT (QNI_CURR)  .AND. &
751              PRESENT (QS_CURR) .AND. PRESENT (QNS_CURR)  .AND. &
752              PRESENT (QG_CURR) .AND. PRESENT (QNG_CURR)  .AND. &
753              PRESENT (QH_CURR) .AND. PRESENT (QNH_CURR)  .AND. &
754              PRESENT (RAINNC ) .AND. PRESENT (RAINNCV)   .AND. &
755              PRESENT (SNOWNC ) .AND. PRESENT (SNOWNCV)   .AND. &
756              PRESENT (HAILNC ) .AND. PRESENT (HAILNCV)   .AND. &
757              PRESENT (GRAUPELNC).AND.PRESENT (GRAUPELNCV).AND. &
758              PRESENT (Z      ) .AND. PRESENT ( W      )  .AND. &
759              PRESENT (QVOLG_CURR) .AND. PRESENT( QNN_CURR )  ) THEN
760              
762          CALL nssl_2mom_driver(                          &
763                      ITIMESTEP=itimestep,                &
764                      TH=th,                              &
765                      QV=qv_curr,                         &
766                      QC=qc_curr,                         &
767                      QR=qr_curr,                         &
768                      QI=qi_curr,                         &
769                      QS=qs_curr,                         &
770                      QH=qg_curr,                         &
771                      QHL=qh_curr,                        &
772                      CCW=qnc_curr,                       &
773                      CRW=qnr_curr,                       &
774                      CCI=qni_curr,                       &
775                      CSW=qns_curr,                       &
776                      CHW=qng_curr,                       &
777                      CHL=qnh_curr,                       &
778                      VHW=qvolg_curr,                     &
779                      cn=qnn_curr,                        &
780                      PII=pi_phy,                         &
781                      P=p,                                &
782                      W=w,                                &
783                      DZ=dz8w,                            &
784                      DTP=dt,                             &
785                      DN=rho,                             &
786                      RAINNC   = RAINNC,                  &
787                      RAINNCV  = RAINNCV,                 &
788                      SNOWNC   = SNOWNC,                  &
789                      SNOWNCV  = SNOWNCV,                 &
790                      HAILNC   = HAILNC,                  &
791                      HAILNCV  = HAILNCV,                 &
792                      GRPLNC   = GRAUPELNC,               &
793                      GRPLNCV  = GRAUPELNCV,              &
794                      SR=SR,                              &
795                      dbz      = refl_10cm,               &
796                      diagflag = diagflag,                &
797                   IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde, &
798                   IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme, &
799                   ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte  &
800                                                                     )
801         ELSE
802            Call wrf_error_fatal( 'arguments not present for calling nssl_2momccn')
803         ENDIF
804 #endif
806         CASE (GSFCGCESCHEME)
807              CALL wrf_debug ( 100 , 'microphysics_driver: calling GSFCGCE' )
808              IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND.  &
809                   PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND.  &
810                   PRESENT( QS_CURR )                           .AND.  &
811                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV ) .AND.  &
812                   PRESENT( HAIL    ) .AND. PRESENT ( ICE2    ) .AND.  &
813                   PRESENT( Z       ) .AND. PRESENT ( W       )  ) THEN
814                CALL gsfcgce(                                        &
815                   TH=th                                             &
816                  ,QV=qv_curr                                        &
817                  ,QL=qc_curr                                        &
818                  ,QR=qr_curr                                        &
819                  ,QI=qi_curr                                        &
820                  ,QS=qs_curr                                        &
821                  ,RHO=rho, PII=pi_phy, P=p, DT_IN=dt, Z=z           &
822                  ,HT=ht, DZ8W=dz8w, GRAV=G                          &
823                  ,RHOWATER=rhowater, RHOSNOW=rhosnow                &
824                  ,ITIMESTEP=itimestep                               &
825                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
826                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
827                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
828                  ,RAINNC=rainnc, RAINNCV=rainncv                    &
829                  ,SNOWNC=snownc, SNOWNCV=snowncv ,SR=sr             &
830                  ,GRAUPELNC=graupelnc ,GRAUPELNCV=graupelncv        &
831                  ,F_QG=f_qg                                         &
832                  ,QG=qg_curr                                        &
833                  ,IHAIL=hail, ICE2=ice2                             &
834                                                                     )
835 ! HAIL = 1,  run gsfcgce with hail option
836 !        0,  run gsfcgce with graupel option   <---- default
837 !        note: no effect if ice2 = 1
838 ! ICE2 = 1,  run gsfcgce with only snow, ice
839 !        2,  run gsfcgce with only graupel, ice
840 !        0,  run gsfcgce with snow, ice and hail/graupel   <---- default
842              ELSE
843                 CALL wrf_error_fatal ( 'arguments not present for calling GSFCGCE' )
844              ENDIF
846         CASE (LINSCHEME)
847              CALL wrf_debug ( 100 , 'microphysics_driver: calling lin_et_al' )
848              IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND.  &
849                   PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND.  &
850                   PRESENT( QS_CURR )                           .AND.  &
851                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV ) .AND.  &
852                   PRESENT( Z       ) ) THEN
853                CALL lin_et_al(                                      &
854                   TH=th                                             &
855                  ,QV=qv_curr                                        &
856                  ,QL=qc_curr                                        &
857                  ,QR=qr_curr                                        &
858                  ,QI=qi_curr                                        &
859                  ,QS=qs_curr                                        &
860                  ,QLSINK=qlsink                                     &
861                  ,RHO=rho, PII=pi_phy, P=p, DT_IN=dt, Z=z           &
862                  ,HT=ht, DZ8W=dz8w, GRAV=G,  CP=cp                  &
863                  ,RAIR=r_d, RVAPOR=R_v                              &
864                  ,XLS=xls, XLV=xlv, XLF=xlf                         &
865                  ,RHOWATER=rhowater, RHOSNOW=rhosnow                &
866                  ,EP2=ep_2,SVP1=svp1,SVP2=svp2                      &
867                  ,SVP3=svp3,SVPT0=svpt0                             &
868                  ,RAINNC=rainnc, RAINNCV=rainncv                    &
869                  ,SNOWNC=snownc, SNOWNCV=snowncv                    &
870                  ,GRAUPELNC=graupelnc, GRAUPELNCV=graupelncv, SR=sr &
871                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
872                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
873                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
874                  ,PRECR=precr,PRECI=preci,PRECS=precs,PRECG=precg   &
875                  ,F_QG=f_qg, F_QNDROP=f_qndrop                      &
876                  ,QG=qg_curr                                        &
877                  ,QNDROP=qndrop_curr                                &
878                                                                     )
879              ELSE
880                 CALL wrf_error_fatal ( 'arguments not present for calling lin_et_al' )
881              ENDIF
883        CASE (SBU_YLINSCHEME)
884              CALL wrf_debug ( 100 , 'microphysics_driver: calling sbu_ylin' )
885              IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND.  &
886                   PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND.  &
887                   PRESENT( QS_CURR )                           .AND.  &
888                   PRESENT( RI_CURR )                           .AND.  &
889                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV ) .AND.  &
890                   PRESENT( Z       ) ) THEN
891                CALL sbu_ylin(                                       &
892                   TH=th                                             &
893                  ,QV=qv_curr                                        &
894                  ,QL=qc_curr                                        &
895                  ,QR=qr_curr                                        &
896                  ,QI=qi_curr                                        &
897                  ,QS=qs_curr                                        &
898                  ,RI3D=ri_curr                                      &
899 !                 ,QLSINK=qlsink                                     &
900                  ,RHO=rho, PII=pi_phy, P=p, DT_IN=dt, Z=z           &
901                  ,HT=ht, DZ8W=dz8w                                  &
902 !                 , GRAV=G,  CP=cp                  &
903 !                 ,RAIR=r_d, RVAPOR=R_v                              &
904 !                 ,XLS=xls, XLV=xlv, XLF=xlf                         &
905 !                 ,RHOWATER=rhowater, RHOSNOW=rhosnow                &
906 !                 ,EP2=ep_2,SVP1=svp1,SVP2=svp2                      &
907 !                 ,SVP3=svp3,SVPT0=svpt0                             &
908                  ,RAINNC=rainnc, RAINNCV=rainncv                    &
909 !                 ,SNOWNC=snownc, SNOWNCV=snowncv                    &
910 !                 ,GRAUPELNC=graupelnc, GRAUPELNCV=graupelncv, SR=sr &
911                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
912                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
913                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
914 !                 ,PRECR=precr,PRECI=preci,PRECS=precs,PRECG=precg   &
915 !                 ,F_QG=f_qg                                         &
916 !                 ,F_QNDROP=f_qndrop                      &
917 !                 ,QG=qg_curr                                        &
918 !                 ,QNDROP=qndrop_curr                                &
919                                                                      )
920              ELSE
921                 CALL wrf_error_fatal ( 'arguments not present for calling sbu_ylin' )
922              ENDIF
925         CASE (WSM3SCHEME)
926              CALL wrf_debug ( 100 , 'microphysics_driver: calling wsm3' )
927              IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND.  &
928                   PRESENT( QR_CURR ) .AND.                            &
929                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV ) .AND.  &
930                   PRESENT( W       )                            ) THEN
931              CALL wsm3(                                             &
932                   TH=th                                             &
933                  ,Q=qv_curr                                         &
934                  ,QCI=qc_curr                                       &
935                  ,QRS=qr_curr                                       &
936                  ,W=w,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w              &
937                  ,DELT=dt,G=g,CPD=cp,CPV=cpv                        &
938                  ,RD=r_d,RV=r_v,T0C=svpt0                           &
939                  ,EP1=ep_1, EP2=ep_2, QMIN=epsilon                  &
940                  ,XLS=xls, XLV0=xlv, XLF0=xlf                       &
941                  ,DEN0=rhoair0, DENR=rhowater                       &
942                  ,CLIQ=cliq,CICE=cice,PSAT=psat                     &
943                  ,RAIN=rainnc ,RAINNCV=rainncv                      &
944                  ,SNOW=snownc ,SNOWNCV=snowncv                      &
945                  ,SR=sr                                             &
946                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
947                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
948                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
949                                                                     )
950              ELSE
951                 CALL wrf_error_fatal ( 'arguments not present for calling wsm3' )
952              ENDIF
954         CASE (WSM5SCHEME)
955              CALL wrf_debug ( 100 , 'microphysics_driver: calling wsm5' )
956              IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND.  &
957                   PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND.  &
958                   PRESENT( QS_CURR ) .AND.                            &
959                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV )  ) THEN
960              CALL wsm5(                                             &
961                   TH=th                                             &
962                  ,Q=qv_curr                                         &
963                  ,QC=qc_curr                                        &
964                  ,QR=qr_curr                                        &
965                  ,QI=qi_curr                                        &
966                  ,QS=qs_curr                                        &
967                  ,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w                  &
968                  ,DELT=dt,G=g,CPD=cp,CPV=cpv                        &
969                  ,RD=r_d,RV=r_v,T0C=svpt0                           &
970                  ,EP1=ep_1, EP2=ep_2, QMIN=epsilon                  &
971                  ,XLS=xls, XLV0=xlv, XLF0=xlf                       &
972                  ,DEN0=rhoair0, DENR=rhowater                       &
973                  ,CLIQ=cliq,CICE=cice,PSAT=psat                     &
974                  ,RAIN=rainnc ,RAINNCV=rainncv                      &
975                  ,SNOW=snownc ,SNOWNCV=snowncv                      &
976                  ,SR=sr                                             &
977                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
978                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
979                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
980                                                                     )
981              ELSE
982                 CALL wrf_error_fatal ( 'arguments not present for calling wsm5' )
983              ENDIF
985         CASE (WSM6SCHEME)
986              CALL wrf_debug ( 100 , 'microphysics_driver: calling wsm6' )
987              IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND.  &
988                   PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND.  &
989                   PRESENT( QS_CURR ) .AND. PRESENT ( QG_CURR ) .AND.  &
990                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV )  ) THEN
991              CALL wsm6(                                             &
992                   TH=th                                             &
993                  ,Q=qv_curr                                         &
994                  ,QC=qc_curr                                        &
995                  ,QR=qr_curr                                        &
996                  ,QI=qi_curr                                        &
997                  ,QS=qs_curr                                        &
998                  ,QG=qg_curr                                        &
999                  ,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w                  &
1000                  ,DELT=dt,G=g,CPD=cp,CPV=cpv                        &
1001                  ,RD=r_d,RV=r_v,T0C=svpt0                           &
1002                  ,EP1=ep_1, EP2=ep_2, QMIN=epsilon                  &
1003                  ,XLS=xls, XLV0=xlv, XLF0=xlf                       &
1004                  ,DEN0=rhoair0, DENR=rhowater                       &
1005                  ,CLIQ=cliq,CICE=cice,PSAT=psat                     &
1006                  ,RAIN=rainnc ,RAINNCV=rainncv                      &
1007                  ,SNOW=snownc ,SNOWNCV=snowncv                      &
1008                  ,SR=sr                                             &
1009                  ,GRAUPEL=graupelnc ,GRAUPELNCV=graupelncv          &
1010                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
1011                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
1012                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
1013                                                                     )
1014              ELSE
1015                 CALL wrf_error_fatal ( 'arguments not present for calling wsm6' )
1016              ENDIF
1018         CASE (WDM5SCHEME)
1019              CALL wrf_debug ( 100 , 'microphysics_driver: calling wdm5' )
1020              IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND.  &
1021                   PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND.  &
1022                   PRESENT( QS_CURR ) .AND. PRESENT( QNN_CURR ) .AND.  &
1023                   PRESENT ( QNC_CURR ) .AND. PRESENT( QNR_CURR ).AND.  &
1024                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV )  ) THEN
1025              CALL wdm5(                                             &
1026                   TH=th                                             &
1027                  ,Q=qv_curr                                         &
1028                  ,QC=qc_curr                                        &
1029                  ,QR=qr_curr                                        &
1030                  ,QI=qi_curr                                        &
1031                  ,QS=qs_curr                                        &
1032                  ,NN=qnn_curr                                       &
1033                  ,NC=qnc_curr                                       &
1034                  ,NR=qnr_curr                                       &
1035                  ,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w                  &
1036                  ,DELT=dt,G=g,CPD=cp,CPV=cpv,CCN0=n_ccn0            &
1037                  ,RD=r_d,RV=r_v,T0C=svpt0                           &
1038                  ,EP1=ep_1, EP2=ep_2, QMIN=epsilon                  &
1039                  ,XLS=xls, XLV0=xlv, XLF0=xlf                       &
1040                  ,DEN0=rhoair0, DENR=rhowater                       &
1041                  ,CLIQ=cliq,CICE=cice,PSAT=psat                     &
1042                  ,RAIN=rainnc ,RAINNCV=rainncv                      &
1043                  ,SNOW=snownc ,SNOWNCV=snowncv                      &
1044                  ,SR=sr                                             &
1045                  ,ITIMESTEP=itimestep                               & 
1046                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
1047                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
1048                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
1049                                                                     )
1050              ELSE
1051                 CALL wrf_error_fatal ( 'arguments not present for calling wdm5')
1052              ENDIF
1054        CASE (WDM6SCHEME)
1055              CALL wrf_debug ( 100 , 'microphysics_driver: calling wdm6' )
1056              IF ( PRESENT( QV_CURR ) .AND. PRESENT ( QC_CURR ) .AND.  &
1057                   PRESENT( QR_CURR ) .AND. PRESENT ( QI_CURR ) .AND.  &
1058                   PRESENT( QS_CURR ) .AND. PRESENT ( QG_CURR ) .AND.  &
1059                   PRESENT( QNN_CURR ) .AND. PRESENT ( QNC_CURR ) .AND. &
1060                   PRESENT( QNR_CURR ).AND.                            &
1061                  PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV )  ) THEN
1062              CALL wdm6(                                             &
1063                   TH=th                                             &
1064                  ,Q=qv_curr                                         &
1065                  ,QC=qc_curr                                        &
1066                  ,QR=qr_curr                                        &
1067                  ,QI=qi_curr                                        &
1068                  ,QS=qs_curr                                        &
1069                  ,QG=qg_curr                                        &
1070                  ,NN=qnn_curr                                       &
1071                  ,NC=qnc_curr                                       &
1072                  ,NR=qnr_curr                                       &
1073                  ,DEN=rho,PII=pi_phy,P=p,DELZ=dz8w                  &
1074                  ,DELT=dt,G=g,CPD=cp,CPV=cpv,CCN0=n_ccn0            &
1075                  ,RD=r_d,RV=r_v,T0C=svpt0                           &
1076                  ,EP1=ep_1, EP2=ep_2, QMIN=epsilon                  &
1077                  ,XLS=xls, XLV0=xlv, XLF0=xlf                       &
1078                  ,DEN0=rhoair0, DENR=rhowater                       &
1079                  ,CLIQ=cliq,CICE=cice,PSAT=psat                     &
1080                  ,RAIN=rainnc ,RAINNCV=rainncv                      &
1081                  ,SNOW=snownc ,SNOWNCV=snowncv                      &
1082                  ,SR=sr                                             &
1083                  ,GRAUPEL=graupelnc ,GRAUPELNCV=graupelncv          &
1084                  ,ITIMESTEP=itimestep                               & 
1085                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
1086                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
1087                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
1088                                                                     )
1089              ELSE
1090                CALL wrf_error_fatal ( 'arguments not present for calling wdm6')
1091              ENDIF
1092 #if(NMM_CORE==1)
1093         CASE (ETAMP_HWRF)
1094              CALL wrf_debug ( 100 , 'microphysics_driver: calling etampnew_HWRF')
1096              IF ( PRESENT( qv_curr ) .AND. PRESENT( qt_curr ) .AND. &
1097                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV ) .AND.  &
1098                   PRESENT( mp_restart_state )                  .AND. &
1099                   PRESENT( tbpvs_state )                      .AND. &
1100                   PRESENT( tbpvs0_state )                       ) THEN
1102                CALL ETAMP_NEW_HWRF(                                      &
1103                   ITIMESTEP=itimestep,DT=dt,DX=dx,DY=dy, GID=id &
1104                  ,RAINNC=rainnc,RAINNCV=rainncv                     &
1105                  ,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,PI_PHY=pi_phy,TH_PHY=th &
1106                  ,QV=qv_curr                                        &
1107                  ,QT=qt_curr                                        &
1108                  ,LOWLYR=LOWLYR,SR=SR                               &
1109                  ,F_ICE_PHY=F_ICE_PHY,F_RAIN_PHY=F_RAIN_PHY         &
1110                  ,F_RIMEF_PHY=F_RIMEF_PHY                           &
1111                  ,QC=qc_curr,QR=Qr_curr,QI=Qi_curr                  &
1112                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
1113                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
1114                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
1115                                                                     )
1116              ELSE
1117                 CALL wrf_error_fatal ( 'arguments not present for calling etampnew' )
1118              ENDIF
1119 #endif
1120         CASE (ETAMPNEW)    !-- Operational 4-km High-Resolution Window (HRW) version
1121              CALL wrf_debug ( 100 , 'microphysics_driver: calling etampnew')
1123              IF ( PRESENT( qv_curr ) .AND. PRESENT( qt_curr ) .AND. &
1124                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV ) .AND.  &
1125                   PRESENT( mp_restart_state )                  .AND. &
1126                   PRESENT( tbpvs_state )                      .AND. &
1127                   PRESENT( tbpvs0_state )                       ) THEN
1128                CALL ETAMP_NEW(                                      &
1129                   ITIMESTEP=itimestep,DT=dt,DX=dx,DY=dy             &
1130                  ,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,PI_PHY=pi_phy,TH_PHY=th &
1131                  ,QV=qv_curr                                        &
1132                  ,QC=qc_curr                                        &
1133                  ,QS=qs_curr                                        &
1134                  ,QR=qr_curr                                        &
1135                  ,QT=qt_curr                                        &
1136                  ,LOWLYR=LOWLYR,SR=SR                               &
1137                  ,F_ICE_PHY=F_ICE_PHY,F_RAIN_PHY=F_RAIN_PHY         &
1138                  ,F_RIMEF_PHY=F_RIMEF_PHY                           &
1139                  ,RAINNC=rainnc,RAINNCV=rainncv                     &
1140                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
1141                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
1142                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
1143                  ,MP_RESTART_STATE=mp_restart_state                 &
1144                  ,TBPVS_STATE=tbpvs_state,TBPVS0_STATE=tbpvs0_state &
1145                                                                     )
1146              ELSE
1147                 CALL wrf_error_fatal ( 'arguments not present for calling etampnew' )
1148              ENDIF
1150         CASE (ETAMPOLD)   !-- What was run in the operational NAM (WRF NMM)
1151              CALL wrf_debug ( 100 , 'microphysics_driver: calling etampold')
1153              IF ( PRESENT( qv_curr ) .AND. PRESENT( qt_curr ) .AND. &
1154                   PRESENT( RAINNC  ) .AND. PRESENT ( RAINNCV ) .AND.  &
1155                   PRESENT( mp_restart_state )                  .AND. &
1156                   PRESENT( tbpvs_state )                      .AND. &
1157                   PRESENT( tbpvs0_state )                       ) THEN
1158                CALL ETAMP_OLD(                                      &
1159                   ITIMESTEP=itimestep,DT=dt,DX=dx,DY=dy             &
1160                  ,DZ8W=dz8w,RHO_PHY=rho,P_PHY=p,PI_PHY=pi_phy,TH_PHY=th &
1161                  ,QV=qv_curr                                        &
1162                  ,QC=qc_curr                                        &
1163                  ,QS=qs_curr                                        &
1164                  ,QR=qr_curr                                        &
1165                  ,QT=qt_curr                                        &
1166                  ,LOWLYR=LOWLYR,SR=SR                               &
1167                  ,F_ICE_PHY=F_ICE_PHY,F_RAIN_PHY=F_RAIN_PHY         &
1168                  ,F_RIMEF_PHY=F_RIMEF_PHY                           &
1169                  ,RAINNC=rainnc,RAINNCV=rainncv                     &
1170                  ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
1171                  ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
1172                  ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte &
1173                  ,MP_RESTART_STATE=mp_restart_state                 &
1174                  ,TBPVS_STATE=tbpvs_state,TBPVS0_STATE=tbpvs0_state &
1175                                                                     )
1176              ELSE
1177                 CALL wrf_error_fatal ( 'arguments not present for calling etampold' )
1178              ENDIF
1180       CASE DEFAULT
1182          WRITE( wrf_err_message , * ) 'The microphysics option does not exist: mp_physics = ', mp_physics
1183          CALL wrf_error_fatal ( wrf_err_message )
1185       END SELECT micro_select
1187    ENDDO
1188 #ifndef RUN_ON_GPU
1189    !$OMP END PARALLEL DO
1190 #endif
1192    CALL wrf_debug ( 200 , 'microphysics_driver: returning from' )
1194    RETURN
1196    END SUBROUTINE microphysics_driver
1198 END MODULE module_microphysics_driver