Update version info for release v4.6.1 (#2122)
[WRF.git] / phys / module_mp_nssl_2mom.F
blobd89baf3571f4b046f5482911aafed07921a685ba
1 !WRF:MODEL_LAYER:PHYSICS
3 ! prepocessed on "Aug 14 2023" at "16:15:23"
11 !---------------------------------------------------------------------
12 ! IMPORTANT: Best results are attained using the 5th-order WENO (Weighted Essentially Non-Oscillatory) advection option (4) for scalars:
13 ! moist_adv_opt                       = 4,
14 ! scalar_adv_opt                      = 4, (can also use option 3, which is WENO without the positive definite filter)
15 ! The WENO-5 scheme provides a 5th-order (horizontal and vertical) adaptive weighting of components that 
16 ! better preserve monotinicity in strong gradients. The standard 5th-order formulation is prone to undershoots 
17 ! (negative values) of mass and number concentrations at cloud edges. The WENO scheme helps 
18 ! to prevent undershoots and results in less noise at cloud and reflectivity boundaries. This is particularly
19 ! useful for multi-moment schemes to preserve relationships between mass and number concentration. An option is also available
20 ! for WENO-5 advection of momentum, but this can result in excessive damping of poorly-resolved features. For both scalar and momentum
21 ! the steps 1 and 2 of the Runge-Kutta time integration use standare 5th-order advection, and the WENO-5 is applied on the 3rd (final)
22 ! RK step. Option 3 applies the WENO-5, and option 4 adds the positive definite filter (as also used in option 1). 
24 ! WENO references: Jiang and Shu, 1996, J. Comp. Phys. v. 126, 202-223; Shu 2003, Int. J. Comp. Fluid Dyn. v. 17 107-118;
26 !! This module provides a 1/2/3-moment bulk microphysics scheme based on a combination of
27 !! Straka and Mansell (2005, JAM) and Zeigler (1985, JAS) and modified/upgraded in
28 !! in Mansell, Zeigler, and Bruning (2010, JAS).  Two-moment adaptive sedimentation
29 !! follows Mansell (2010, JAS), using parameter infall = 4.
31 !! Added info on graupel density and soaking is in Mansell and Ziegler (2013, JAS)
33 !! Average graupel and hail particle densities are predicted, which affects fall speed as well.
35 !! Maintainer: Ted Mansell, National Severe Storms Laboratory <ted.mansell@noaa.gov>
37 !! Microphysics References:
39 !! Mansell, E. R., C. L. Ziegler, and E. C. Bruning, 2010: Simulated electrification of a small
40 !!   thunderstorm with two-moment bulk microphysics. J. Atmos. Sci., 67, 171-194, doi:10. 1175/2009JAS2965.1.
42 !!  Mansell, E. R. and C. L. Ziegler, 2013: Aerosol effects on simulated storm electrification and
43 !!     precipitation in a two-moment bulk microphysics model. J. Atmos. Sci., 70 (7), 2032-2050,
44 !!     doi:10.1175/JAS-D-12-0264.1.
46 !! Ziegler, C. L., 1985: Retrieval of thermal and microphysical variables in observed convective storms.
47 !!    Part I: Model development and preliminary testing. J. Atmos. Sci., 42, 1487-1509.
49 !! Sedimentation reference:
51 !! Mansell, E. R., 2010: On sedimentation and advection in multimoment bulk microphysics.
52 !!    J. Atmos. Sci., 67, 3084-3094, doi:10.1175/2010JAS3341.1.
54 ! Possible parameters to adjust:
56 !  ccn : base cloud condensation nuclei concentration (use namelist.input value "nssl_cccn")
57 !  alphah, alphahl : Size distribution shape parameters for graupel (h) and hail (hl)
58 !  infall : changes sedimentation options to see effects (see below)
60 ! lightning model references:
62 !    Fierro, A. O., E.R. Mansell, C. Ziegler and D. R. MacGorman 2013: The
63 !    implementation of an explicit charging and discharge lightning scheme
64 !    within the WRF-ARW model: Benchmark simulations of a continental squall line, a
65 !    tropical cyclone and a winter storm. Monthly Weather Review, Volume 141, 2390-2415
67 !    Mansell et al. 2005: Charge structure and lightning sensitivity in a simulated
68 !     multicell thunderstorm. J. Geophys. Res., 110, D12101, doi:10.1029/2004JD005287
70 ! Note: Some parameters below apply to unreleased features.
73 !---------------------------------------------------------------------
74 ! Apr. 2023 (WRF-4.6)
75 !  - Update to 3-moment for rain, graupel, and hail
76 !  - Change default graupel/hail fall speeds to icdx/icdxhl=6 (Milbrandt & Morrison 2013)
77 !     and also set default ehw0=0.9 and ehlw0=0.9 to compensate for lower fall speeds.
78 !  - Change default hail conversion to ihlcnh=-1, and then =1 for 2-mom or =3 for 3-mom,
79 !     using wet growth diameter to convert large graupel
80 !---------------------------------------------------------------------
81 ! Sept. 2021:
82 ! Fixes:
83 !   Restored previous formulation of snow reflectivity, as it was realized that the last change incorrectly assumed a fixed
84 !     density independent of size. Generally lower snow reflectivity values as a result (no effect on microphysics)
85 ! Other:
86 !   Generic fall speed coeffecients (axx,bxx) to accomodate future frozen drops category (no effect)
87 !   Reordered collection coefficients (dab1lh) to be consistent (no effect)
88 !   Switched to full calculation of rain number loss via collection by graupel (chacr; to be consisted with collection by hail) (minor effects)
89 !---------------------------------------------------------------------
90 ! April 2021:
91 ! Fixes:
92 !  Fall speed air density factor limited to air density of 0.05 (for very high model top) to mitigate excessive fall speeds
93 !  Fixed issue of spurious creation of large concentrations of very small droplets and transient large condensation (also increased minimum droplet size)
94 !  Fixed issue of negligible "seed" values of graupel from Bigg freezing at relatively high temperatures (thanks to S. Lasher-Trapp)
95 !  Minor bug fix in effective radius calculation of snow. (thanks to T. Iguchi)
96 ! Updates:
97 !  Enabled regeneration of CCN by droplet evaporation and background restore (default time constant of 3600s)
98 !  Updated the routine that handles single-moment variables on the first time step. This sets a higher threshold for meaningful mixing ratios and sets a more realistic droplet concentration (also activating CCN as needed).
99 !  Enabled radar reflectivity from cloud ice (new formulation) ( idbzci = 1 )
100 !  Added internal option for ice crystal nucleation by DeMott et al. (2010, PNAS) (inucopt=4)
101 !  Allow greater fraction of hail to melt in one time step
102 !  Reduced minimum number concentration from 1e-4 to 1e-8 (based on CAPS input)
103 !  Added internal namelist for easier access to internal variables for development/testing and easier setup for ensemble microphysics diversity
104 !    (namelist read is disabled by default)
105 !  Increased resolution of lookup table for incomplete gamma functions
107 !---------------------------------------------------------------------
108 ! Sept. 2019:
109 ! Bug fixes:
110 !  - Effective radius calculation was only done at history times. Now every time step (though should be just before radiation is called)
111 !  - Snow reflectivity: Previous "fix" was incorrect and yields snow dBZ that is too low. Reverted to old version which was correct
112 !  - Incorrectly updated a state value in the reflectivity code. (Could cause small differences if reflectivity is not calculated)
113 ! Updates:
114 !  - Added code hints to use the "axtra2d" array to communicate rates from the microphysics routine into any 3d arrays that are passed in to the driver.
115 !  - Graupel and hail drag coefficients are returned from fall speed subroutine to use in ventilation coeffs. for consistency (minor change)
116 !  - Added (compile) option flag to turn on diagnosis of cloud droplet shape parameter based on number concentration
117 !  - Added (compile) option flag icracr to turn off rain self-collection
118 !  - Added compile options 'depfac' and 'meltfac' to adjust deposition/sublimation and melting (not freezing) rates of graupel/hail by a constant factor (for experimentation). Default value is 1.0
119 !  - Put limit on snow volume (2 cm) in aggregation rate
120 !---------------------------------------------------------------------
121 ! WRF 4.0 update:
122 !  Major:
123 !   Fixed excessive sublimation that could occur in very strong downdrafts (3.9.1.1 update)
125 !  Minor:
126 !    icefallopt=3 : New ice crystal fall speed that has faster speeds for small ice particles. Main effect
127 !                   is on anvil clouds to help them decay a bit faster. Old behavior can be recovered with icefallopt=1
128 !    Cosmetic: removed stray single quotes because some preprocessors complain about unclosed quotes even in comments
130 !---------------------------------------------------------------------
131 ! WRF 3.9.1.1 update:
133 !  Added a check on overdepletion of ice by sublimation, which could sometimes result in water supersaturation
134 !  Bug fix: setting of t7 used 'dn' instead of 'dn1' (Thanks to Chunxi Zhang)
136 !---------------------------------------------------------------------
137 ! WRF 3.9 updates:
139 !   2-moment scheme now creates number concentration tendencies from cumulus scheme mass mixing ratio rates
140 !   Renamed internal gamma function routine from 'gamma' to 'gamma_sp' to avoid name conflicts
141 !   Restored older settings that allow snow aggregation starting at T > -25C
142 !   Adjusted Meyers number of activated nuclei by the local air density to compensate for using data at surface
143 !   Minor updates to rain-ice crystal and hail-rain collection efficiencies
145 !   
146 !   Reduced minimum mean snow diameter from 100 microns to 10 microns
148 !---------------------------------------------------------------------
149 ! WRF 3.8 updates:
150 !   Fixed issue with reflectivity conservation for graupel melting into rain. Rain number concentrations were too low,
151 !       resulting in excessive reflectivity of a couple dBZ
152 !   Changed default value of iusewetgraupel to 1 (turns off diagnostic meltwater on graupel for reflectivity)
153 !   Apply a 70 m/s fall speed limit for sedimentation
154 !   Changed vapor ice nucleation to Meyers-Ferrier method (original scheme)
155 !   New method for Bigg freezing (ibiggopt=2)
156 !   Reduced snow aggregration efficiency and restricted aggregation to higher temperatures (assuming dendrites and mechanical aggregation)
157 !   Increased maximum graupel-droplet collection efficiency when hail is turned off (nssl_2momg)
158 !   Updates for compatibility with WRF-NMM
159 !   Added calculation of hail number concentration in calcnfromq (creates number concentration from mixing ratio
160 !       when starting from an analysis). And fixed error in graupel intercept
161 !   Bug fix in snow fall speeds
162 !   Further fix in snow reflectivity
163 !   Use diameter of maximum mass rather than mean diamter when checking maximum size
164 !   Helped performance in sedimentation with flag "do_accurate_sedimentation" to control recalculation of fall speeds when
165 !       more than one sub-time step is needed (often happens with large time steps and small dz near the ground):
166 !        = .true. : recalculates fall speed after each substep (more accurate)
167 !        = .false. : (default) reuses fall speeds calculated on the first substep (typical for most schemes), theoretically could cause an occasional glitch, but none seen in practice
168 !   Increased maximum mean droplet radius from 40 to 60 microns, which alleviates spurious number concentration increases at low CCN concentration.
169 !   Removed a duplicate factor from hail reflectivity that was causing a loss of about 6 dBZ (since WRF 3.5).
171 !---------------------------------------------------------------------
175 MODULE module_mp_nssl_2mom
176   IMPLICIT NONE
177   
178   public nssl_2mom_driver
179   public nssl_2mom_init
180   private gamma_sp,gamxinf,GAML02, GAML02d300, GAML02d500, fqvs, fqis
181   private gamma_dp, gamxinfdp, gamma_dpr
182   private delbk, delabk
183   private gammadp
184   
185   logical, private :: cleardiag = .false.
186   PRIVATE
188 #if ( WRF_CHEM == 1 )
189   integer, parameter :: wrfchem_flag = 1
190 #else
191   integer, parameter :: wrfchem_flag = 0
192 #endif
194    LOGICAL, PRIVATE:: is_aerosol_aware = .false.
195       
196       logical, private :: turn_on_cin = .false.
197   
198   integer, private :: eqtset = 1 ! Flag for use with cm1 to use alternate equation set (changes latent heating rates)
199                                  ! value of > 2 invokes the equivalent version of eqtset=2 that applies updates to both theta and Pi.
200    double precision, parameter, public :: zscale = 1.0d0 ! 1.000e-10
201    double precision, parameter, public :: zscaleinv = 1.0d0/zscale ! 1.000e-10
203   
204   real, parameter :: warmonly = 0.0 ! testing parameter, set to 1.0 to reduce to warm-rain physics (ice variables stay zero)
205   
206   logical, parameter :: lwsm6 = .false. ! act like wsm6 for some single moment interactions
208 ! some constants from WSM6
209   real, parameter  :: dimax = 500.e-6    ! limited maximum value for the cloud-ice diamter
210   real, parameter  :: roqimax = 2.08e22*dimax**8
211   
212 ! Params for dbz:
213   integer  :: iuseferrier = 1  ! =1: use dry graupel only from Ferrier 1994; = 0: Use Smith (wet graupel)
214   integer  :: idbzci      = 1
215   integer  :: iusewetgraupel = 1 ! =1 to turn on use of QHW for graupel reflectivity (only for ZVDM -- mixedphase)
216                                  ! =2 turn on for graupel density less than 300. only 
217   integer  :: iusewethail = 0 ! =1 to turn on use of QHW for graupel reflectivity (only for ZVDM -- mixedphase)
218   integer  :: iusewetsnow = 0 ! =1 to turn on diagnosed bright band; =2 'old' snow reflectivity (dry), =3 'old' snow dbz + brightband
219 ! microphysics
221   real, private :: rho_qr = 1000., cnor = 8.0e5  ! cnor is set in namelist!!  rain params
222   real, private :: rho_qs =  100., cnos = 3.0e6  ! set in namelist!!  snow params
223   real, private :: rho_qh =  500., cnoh = 4.0e5  ! set in namelist!!  graupel params
224   real, private :: rho_qhl=  800., cnohl = 4.0e4 ! set in namelist!!  hail params
226   real, private :: hdnmn  = 170.0  ! minimum graupel density (for variable density graupel)
227   real, private :: hldnmn = 500.0  ! minimum hail density (for variable density hail)
229   real :: cnohmn  = 1.e-2 ! minimum intercept for 2-moment graupel (alphah < 0.5)
230   real :: cnohlmn = 1.e-2 ! minimum intercept for 2-moment hail (alphahl < 0.5)
231   
232 ! Autoconversion parameters
234   real   , private :: qcmincwrn      = 2.0e-3    ! qc threshold for autonconversion (LFO; for 10ICE use qminrncw for ircnw != 5)
235   real   , private :: cwdiap         = 20.0e-6   ! threshold diameter of cloud drops (Ferrier 1994 autoconversion)
236   real   , private :: cwdisp         = 0.15      ! assume droplet dispersion parameter (can be 0.3 for maritime)
237   real   , private :: ccn            = 0.6e+09   ! set in namelist!! Central plains CCN value
238   real   , private :: ccnuf          = 0        ! set in namelist!! Central plains CCN value
239   real   , public  :: qccn, qccnuf               ! ccn "mixing ratio"
240   real   , private :: old_qccn = -1.0
241   integer, private :: iauttim        = 1         ! 10-ice rain delay flag
242   real   , private :: auttim         = 300.      ! 10-ice rain delay time
243   real   , private :: qcwmntim       = 1.0e-5    ! 10-ice rain delay min qc for time accrual
245 #if (NMM_CORE == 1)
246 ! NMM WRF core does not have special boundary conditions for CCN, therefore set invertccn to true
247       logical, parameter :: invertccn = .true. ! =true for base state of ccn=0, =false for ccn initialized in the base state
248 #else
249       logical, private :: invertccn = .false. ! =true for base state of ccn=0, =false for ccn initialized in the base state
250 #endif
251   logical :: switchccn = .false.
252   real    :: old_cccn = -1.0
253   logical :: restoreccn = .true. ! whether or not to nudge CCN back to base state (qccn) (only applies if CCNA is NOT predicted)
254   real    :: ccntimeconst = 3600.  ! time constant for CCN restore (either for CCNA or when restoreccn = true)
255   real, private  :: restoreccnfrac = 1.0  ! fraction of evaporated droplets that restore CCN
256   real    :: ufccntimeconst = 6.*3600.  ! time constant for UFCCN decay (Blossey et al. 2018)
257   real    :: ufbackground = 0.1e9       ! background ccnuf value (Blossey et al.)
258   logical :: decayufccn = .false.
259   integer :: i_uf_or_ccn = 0      ! 0 = ship adds UF; 1 = treat UF as regular ccn (add to qccn)
261 ! sedimentation flags
262 ! itfall -> 0 = 1st order fallout (other options removed)
263 ! iscfall, infall -> fallout options for charge and number concentration, respectively
264 !                    1 = mass-weighted fall speed; 2 = number-weighted fallspeed.
265   integer, private :: itfall = 0
266   integer, private :: iscfall = 1
267   integer, private :: irfall = -1
268   integer, private :: isfall =  2 ! default limit with method II (more restrictive)
269   logical, private :: do_accurate_sedimentation = .false. ! if true, recalculate fall speeds on sub time steps; (more expensive)
270                                                          ! if false, reuse fall speeds on multiple steps (can have a noticeable speedup)
271                                                          ! Mainly is an issue for small dz near the surface. 
272   integer, private :: interval_sedi_vt = 1 ! interval for recalculating Vt in sedimentation subloop (only when do_accurate_sedimentation = .true.)
273   integer, private :: infall = 4   ! 0 -> uses number-wgt for N; NO correction applied (results in excessive size sorting)
274                           ! 1 -> uses mass-weighted fallspeed for N ALWAYS
275                           ! 2 -> uses number-wgt for N and mass-weighted correction for N (Method II in Mansell, 2010 JAS)
276                           ! 3 -> uses number-wgt for N and Z-weighted correction for N (Method I in Mansell, 2010 JAS)
277                           ! 4 -> Hybrid of 2 and 3: Uses minimum N from each method (z-wgt and m-wgt corrections) (Method I+II in Mansell, 2010 JAS)
278                           ! 5 -> uses number-wgt for N and uses average of N-wgt and q-wgt instead of Max.
279   integer :: imydiagalpha = 0 ! apply MY diagnostic shape parameter for fall speeds (1=for fall speed only; 2=also for microphysics rates)
280   real, private    :: rainfallfac = 1.0 ! factor to adjust rain fall speed (single moment only)
281   real, private    :: icefallfac = 1.0 ! factor to adjust ice fall speed
282   real, private    :: snowfallfac = 1.0 ! factor to adjust snow fall speed
283   real, private    :: graupelfallfac = 1.0 ! factor to adjust graupel fall speed
284   real, private    :: hailfallfac = 1.0 ! factor to adjust hail fall speed
285   integer, private :: icefallopt = 3 ! 1= default, 2 = Ferrier ice fall speed; 3 = adjusted Ferrier (slightly high Vt)
286   integer, private :: icdx = 6 ! (graupel) 0=Ferrier; 1=leave drag coef. cd fixed; 2=vary by density, 4=set by user with cdxmin,cdxmax,etc.
287                                ! 6= Milbrandt and Morrison (2013) density-based fall speed
288   integer, private :: icdxhl = 6 ! (hail) 0=Ferrier; 1=leave drag coef. cd fixed; 2=vary by density, 4=set by user with cdxmin,cdxmax,etc.
289                                ! 6= Milbrandt and Morrison (2013) density-based fall speed
290   real    :: axh = 75.7149, bxh = 0.5
291   real    :: axf = 75.7149, bxf = 0.5
292   real    :: axhl = 206.984, bxhl = 0.6384
293   real   , private :: cdhmin = 0.45, cdhmax = 0.8        ! defaults for graupel (icdx=4)
294   real   , private :: cdhdnmin = 500., cdhdnmax = 800.0  ! defaults for graupel (icdx=4)
295   real   , private :: cdhlmin = 0.45, cdhlmax = 0.6      ! defaults for hail (icdx=4)
296   real   , private :: cdhldnmin = 500., cdhldnmax = 800.0  ! defaults for hail (icdx=4)
297   real   , private :: vtmaxsed = 70. ! Limit on fall speed (m/s, all moments) for sedimentation calculations. Not applied to fall speeds for microphysical rates
298   
299   integer :: rssflg = 1   ! Rain size-sorting allowed (1, default), or disallowed (0).  If 0, sets N and Z-weighted fall speeds to q-weighted value
300   integer :: sssflg = 1   ! As above but for snow
301   integer :: hssflg = 1   ! As above but for graupel
302   integer :: hlssflg = 1  ! As above but for hail
304 ! input flags
306   integer, private :: ndebug = -1, ncdebug = 0
307   integer, private :: ipconc = 5
308   integer, private :: inucopt = 0
309   integer, private :: ichaff = 0
310   integer, parameter :: ilimit = 0
311   
312   real, private :: constccw = -1.
314   real, private :: cimn = 1.0e3, cimx = 1.0e6
316   real   , private :: rhofrz = 900 ! density of freezing drops
317   real   , private :: ifrzg = 1.0 ! fraction of frozen drops (Bigg freezing) going to graupel. 1=freeze all rain to graupel, 0=freeze all to hail
318   real   , private :: ifiacrg = 1.0 ! fraction of frozen drops (3-component freezing qiacr) going to graupel. 1=freeze all rain to graupel, 0=freeze all to hail
319   real   , private :: ifrzs = 1.0 ! fraction of small frozen drops going to snow. 1=freeze rain to snow, 0=freeze to cloud ice
320   real   , private :: ffrzs = 0.0 ! fraction of other initiated cloud ice going to snow. 1=freeze rain to snow, 0=freeze to cloud ice
321   real   , private :: f2h = 1.0 ! fraction of cloud ice conversion going to graupel (vs. frozen drops). For testing
322   integer, private :: irwfrz = 1 ! compute total rain that can freeze (checks heat budget)
323   integer, private :: irimtim = 0 ! future use
324 !  integer, private :: infdo = 1   ! 1 = calculate number-weighted fall speeds
326   integer, private :: irimdenopt = 1 ! = 1 for default Heymsfield and Pflaum (1985); = 2 for experimental Cober and List (1993); = 3 Macklin
327   real   , private :: rimc1 = 300.0, rimc2 = 0.44  ! rime density coeff. and power (Default Heymsfield and Pflaum, 1985)
328   real   , private :: rimc3 = 170.0                ! minimum rime density
329   real    :: rimc4 = 900.0                ! maximum rime density
330   real   , private :: rimtim = 120.0               ! cut-off rime time (10ICE)
331   real   , private :: eqtot = 1.0e-9               ! threshold for mass budget reporting
332   real, private :: rimdenvwgt = 0.0 ! weight (0-1) given to number-weighted fall speed when calculating rime density
334   integer, private :: ireadmic = 0
336   integer, private :: idiagnosecnu = 0 ! =1 to diagnose cnu based on Chandrakar et al. 2016 data; =2 for Geoffroy et al. (2010, ACP)
337   integer, private :: iccwflg = 1     ! sets max size of first droplets in parcel to 4 micron radius (in two-moment liquid)
338                              ! (first nucleation is done with a KW sat. adj. step)
339   integer, private :: issfilt = 0     ! flag to turn on filtering of supersaturation field
340   integer, private :: icnuclimit = 0  ! limit droplet nucleation based on Konwar et al. (2012) and Chandrakar et al. (2016)
341   integer, private :: irenuc = 2      ! =1 to always allow renucleation of droplets within the cloud (do no use, obsolete)
342                                       ! =2 renucleation following Twomey/Cohard&Pinty
343                                       ! =7 New renucleation that requires prediction of the number of activated nuclei
344                              ! i.e., not only at cloud base
345   integer, private :: irenuc3d = 0      ! =1 to include horizontal gradient in renucleation of droplets within the cloud
346   real    :: renucfrac = 0.0 ! = 0 : cnuc = cwccn
347                              ! = 1 : cnuc = actual available CCN
348                              ! otherwise cnuc = cwccn*(1. - renufrac) + ccnc(1:ngscnt)*renucfrac
349   real    :: ssf2kmax = 10. ! max value for ssf**cck in irenuc=4 or 5
350   real   , private :: cck = 0.6       ! exponent in Twomey expression
351   real   , private :: ciintmx = 1.0e6 ! limit on ice concentration from primary nucleation
353   real   , private :: cwccn ! , cwmasn,cwmasx
354   real   , private :: ccwmx
356   integer, private :: idocw = 1, idorw = 1, idoci = 1, idoir = 1, idoip = 1, idosw = 1
357   integer, private :: idogl = 1, idogm = 1, idogh = 1, idofw = 1, idohw = 1, idohl = 1
358 !  integer, private :: ido(3:14) = / 12*1 /
361 ! 0,2, 5.00e-10, 1, 0, 0, 0      : itype1,itype2,cimas0,icfn,ihrn,ibfc,iacr
362   integer, private :: itype1 = 0, itype2 = 2  ! controls Hallett-Mossop process
363   integer, private :: in_freeze_rain_first = 0 ! =1 use IN to freezed rain drops (if none, then freeze droplets)
364   integer, private :: icenucopt = 1       ! =1 Meyers/Ferrier primary ice nucleation; =2 Thompson/Cooper, =3 Phillips (Meyers/Demott), =4 DeMott (2010)
365   real, private :: naer = 1.0e6  ! background large aerosol conc. for DeMott
366   integer, private :: icfn = 2                ! contact freezing: 0 = off; 1 = hack (ok for single moment); 2 = full Cotton/Meyers version
367   integer, private :: ihrn = 0            ! Hobbs-Rangno ice multiplication (Ferrier, 1994; use in 10-ice only)
368   integer, private :: ibfc = 1            ! Flag to use Bigg freezing on droplets (0 = off (uses alternate freezing), 1 = on)
369   real, private  :: cwfrz2snowfrac = 0.0 ! fraction of freezing droplet mass to send to snow
370   real, private  :: cwfrz2snowratio = 5. ! Assumed number of frozen droplets in a cluster
371   integer, private :: iremoveqwfrz = 1    ! Whether to remove (=1) or not (=0) the newly-frozen cloud droplets (ibfc=1) from the CWC used for charge separation
372   integer, private :: iacr = 2            ! Flag for drop contact freezing with crytals
373                                  ! (0=off; 1=drops > 500micron diameter; 2 = > 300micron)
374   integer, private :: icrcev = 1          ! 1 = old crcev; 2 = crcev scaled by vtrain ratio (num/mass); 3 = set to zero
375   integer, private :: icracr = 1          ! Flag to turn rain self-collection on/off (=0 to turn off)
376   integer, private :: icracrthresh = 1    ! For rain self-coll. thresh. use: 1 = mean diam of 2mm; 2 = rain median volume diam of 1.9mm
377   integer, private :: ibfr = 2            ! Flag for Bigg freezing conversion of freezing drops to graupel
378                                  ! (1=min graupel size is vr1mm; 2=use min size of dfrz, 5= as for 2 and apply dbz conservation)
379   integer, private :: ibiggopt = 2        ! 1 = old Bigg; 2 = experimental Bigg (only for imurain = 1, however)
380   integer :: ibiggsmallrain = 0  ! 1 = When rain is too small, freeze none to graupel and send all to snow (experimental)
381   integer, private :: iacrsize = 5        ! assumed min size of drops freezing by capture
382                                  !  1: > 500 micron diam
383                                  !  2: > 300 micron
384                                  !  3: > 40 micron
385                                  !  4: all sizes
386                                  !  5: > 150 micron (only for imurain = 1)
387   real   , private :: cimas0 = 6.62e-11   ! default mass of Hallett-Mossop crystals
388                                  ! 6.62e-11kg results in half the diam. (60 microns) of old default value of 5.0e-10
389   real   , private :: cimas1 = 6.88e-13   ! default mass of new ice crystals
390   real   , private :: splintermass = 6.88e-13
391   real   , private :: cfnfac = 0.1        ! Hack factor that goes with icfn=1
392   integer, private :: iscni = 4           ! default option for ice crystal aggregation/conversion to snow
393   real   , private :: fscni = 1.0         ! factor for calculating cscni
394   logical, private :: imeyers5 = .false.  ! .false.=off, true=on for Meyers ice nucleation for temp > -5 C
395   real   , private :: dmincw = 15.0e-6    ! minimum droplet diameter for collection for iehw=3
396   integer, private :: iehw = 1            ! 0 -> ehw=ehw0; 1 -> old ehw; 2 -> test ehw with Mason table data
397   integer, private :: iefw = 1            ! 0 -> ehw=ehw0; 1 -> old ehw; 2 -> test ehw with Mason table data
398   integer, private :: iehlw = 1           ! 0 -> ehlw=ehlw0; 1 -> old ehlw; 2 -> test ehlw with Mason table data
399                                  ! For ehw/ehlw = 1, ehw0/ehlw0 act as maximum limit on collection efficiency (defaults are 1.0)
400   integer, private :: ierw = 1            ! for single-moment rain (LFO/Z)
401   integer, private :: iehr0c = 0          ! 0 -> no collection for T > 0C;  1 -> turn on collection/shedding for T > 0C
402   integer, private :: iehlr0c = 0         ! 0 -> no collection for T > 0C;  1 -> turn on collection/shedding for T > 0C
403   real   , private :: ehw0 = 0.9 ! 0.5          ! constant or max assumed graupel-droplet collection efficiency
404   real   , private :: erw0 = 1.0          ! constant assumed rain-droplet collection efficiency
405   real   , private :: ehlw0 = 0.9 ! 0.75        ! constant or max assumed hail-droplet collection efficiency
406   real   , private :: efw0 = 0.5          ! constant or max assumed graupel-droplet collection efficiency
407   real    :: ehr0 = 1.0          ! constant or max assumed graupel-rain collection efficiency
408   real    :: efr0 = 1.0          ! constant or max assumed graupel-rain collection efficiency
409   real    :: ehlr0 = 1.0         ! constant or max assumed hail-rain collection efficiency
410   real   , private :: exwmindiam = 0.0    ! minimum diameter of droplets for riming. If set > 0, will exclude that fraction of mass/number from accretion (idea from Furtado and Field 2017 JAS but also Fierro and Mansell 2017)
411   
413   real   , private :: esilfo0 = 1.0       ! factor for LFO collection efficiency of snow for cloud ice.
414   real   , private :: ehslfo0 = 1.0       ! factor for LFO collection efficiency of hail/graupel for snow.
416   integer, private :: ircnw    = 5        ! single-moment warm-rain autoconversion option.  5= Ferrier 1994.
417   real   , private :: qminrncw = 2.0e-3   ! qc threshold for rain autoconversion (NA for ircnw=5)
419   integer, private :: iqcinit = 2         ! For ZVDxx schemes, flag to choose which way to initialize droplets
420                                  ! 1 = Soong-Ogura adjustment
421                                  ! 2 = Saturation adjustment to value of ssmxinit
422                                  ! 3 = KW adjustment
424   real   , private :: ssmxinit = 0.4      ! saturation percentage to adjust down to for initial cloud
425                                  ! formation (ZVDxx scheme only)
427   real   , private :: ewfac = 1.0         ! hack factor applied to graupel and hail collection eff. for droplets
428   real   , private :: eii0 = 0.1 ,eii1 = 0.1  ! graupel-crystal coll. eff. parameters: eii0*exp(eii1*min(temcg(mgs),0.0))
429                                      ! set eii1 = 0 to get a constant value of eii0
430   real   , private :: eii0hl = 0.2 ,eii1hl = 0.0  ! hail-crystal coll. eff. parameters: eii0hl*exp(eii1hl*min(temcg(mgs),0.0))
431                                      ! set eii1hl = 0 to get a constant value of eii0hl
432   real, private :: ewi_dcmin = 15.0e-06 ! minimum droplet diameter for nonzero ewi
433   real, private :: ewi_dimin = 30.0e-06 ! minimum ice crystal diameter for nonzero ewi
434   real   , private :: eri0 = 0.1   ! rain efficiency to collect ice crystals
435   real   , private :: eri_cimin = 10.e-6      ! minimum ice crystal diameter for collection by rain
436   real   , private :: esi0 = 0.1              ! linear factor in snow-ice collection efficiency
437   real   , private :: ehs0 = 0.1, ehs1 = 0.1  ! graupel-snow coll. eff. parameters: ehs0*exp(ehs1*min(temcg(mgs),0.0))
438                                      ! set ehs1 = 0 to get a constant value of ehs0
439   integer :: iessopt = 1  ! 1 = Original (no factor); 2 = factor based on wvel; 3 = factor based on SSI
440                           ! 4 = as 3 but sets min factor of 0.1 and goes to full value at 0.5% SSI
441   real   , private :: ess0 = 0.5, ess1 = 0.05 ! snow aggregation coefficients: ess0*exp(ess1*min(temcg(mgs),0.0))
442                                      ! set ess1 = 0 to get a constant value of ess0
443   real   , private :: esstem1 = -15.  ! lower temperature where snow aggregation turns on
444   real   , private :: esstem2 = -10.  ! higher temperature for linear ramp of ess from zero at esstem1 to formula value at esstem2
445   real   , private :: essrmax = 0.02  ! maximum snow radius (meters) for csacs
446   real   , private :: essfrac1 = 0.5  ! snow mass fraction 1 for aggregation roll-off
447   real   , private :: essfrac2 = 0.75 ! snow mass fraction 2 for aggregation roll-off
448   integer, private :: iessec0flag = 0 ! flag to activate aggregation roll-off
449   real   , private :: ehsfrac = 1.0           ! multiplier for graupel collection efficiency in wet growth
450   real   , private :: ehimin = 0.0 ! Minimum collection efficiency (graupel - ice crystal)
451   real   , private :: ehimax = 1.0 ! Maximum collection efficiency (graupel - ice crystal)
452   real   , private :: ehsmax = 0.5 ! Maximum collection efficiency (graupel - snow)
453   real   , private :: ecollmx = 0.5 ! Maximum collision efficiency for graup/hail with ice; used only for charging rates
454   integer, private :: iglcnvi = 1  ! flag for riming conversion from cloud ice to rimed ice/graupel
455   integer, private :: iglcnvs = 2  ! flag for conversion from snow to rimed ice/graupel
457   real   , private :: rz          ! reflectivity conservation factor for graupel/rain
458                          ! now calculated in icezvd_dr.F from alphah and rnu
459                          ! currently only used for graupel melting to rain
460   real   , private :: rzhl        ! reflectivity conservation factor for hail/rain
461                          ! now calculated in icezvd_dr.F from alphahl and rnu
463   real   , private :: rzs     ! reflectivity conservation factor for snow(imusnow=3) with rain (imurain=1)
465   real   , private :: alphahacx = 0.0 ! assumed minimum shape parameter for zhacw and zhacr
467   real   , private :: fconv = 1.0  ! factor to boost max graupel depletion by riming conversions in 10ICE
469   real   , private :: rg0 = 400.0  ! reference graupel density for graupel fall speed
471   integer, private :: rcond = 2    ! (Z only) rcond = 2 includes rain condensation in loop with droplet condensation
472                                    ! 0 = no condensation on rain; 1 = bulk condensation on rain
473   integer, parameter, private :: icond = 1    ! (Z only) icond = 1 calculates ice deposition (crystals and snow) BEFORE droplet condensation
474                           ! icond = 2 does not work (intended to calc. dep in loop with droplet cond.)
475   integer, private :: iqis0 = 2    ! = 1 for normal qis; = 2 to set qis to use T = 0C when T > 0C  
476   
477   real   , private :: dfrz = 0.15e-3 ! 0.25e-3  ! minimum diameter of frozen drops from Bigg freezing (used for vfrz) for iacr > 1
478                             ! and for ciacrf for iacr=4
479   real   , private :: dmlt = 3.0e-3  ! maximum diameter for rain melting from graupel and hail
480   real   , private :: dshd = 1.0e-3  ! nominal diameter for rain drops shed from graupel/hail
481   integer, private :: ivshdgs   = 1  ! 0 = use 1mm for all shedding (non-mixedphase); 1 = use vshdgs with sheddiam
482   integer, private :: ished2cld = 0  ! 1: Send shed liquid (from wet growth) to cloud droplets
484   integer, private :: ihmlt = 2      ! 1=old melting with vmlt; 2=new melting using mean volume diam of graupel/hail
485   integer, private :: imltshddmr = 2 ! 0 (default)=mean diameter of drops produced during melting+shedding as before (using mean diameter of graupel/hail
486                             ! and max mean diameter of rain)
487                             ! 1=new method where mean diameter of rain during melting is adjusted linearly downward 
488                             ! toward 3 mm for large (> sheddiam) graupel and hail, to take into account shedding of 
489                             ! smaller drops.  sheddiam0 controls the size of graupel/hail above which the assumed 
490                             ! mean diameter of rain is set to 3 mm
491                             ! Only valid for ihmlt = 2 for ZVD(H) but also applies to ZVD(H)M
492                             ! 2 = method that sets the resulting rain size ( vshdgs ) according to the mass-weighted diameter of the ice
494    real  :: mltdiam1 = 9.0e-3, mltdiam2 = 16.0e-3, mltdiam3 = 19.0e-3, mltdiam4 = 200.0e-3, mltdiam05 = 4.5e-3
496   integer, private :: nsplinter = 0  ! number of ice splinters per freezing drop, if negative, then per resulting graupel particle
497   real,    private :: lawson_splinter_fac = 2.5e-11  ! constant in Lawson et al. (2015, JAS) for ice particle production from freezing drops
498   integer, private :: isnwfrac = 0   ! 0= no snow fragmentation; 1 = turn on snow fragmentation (Schuur, 2000)
500 !  integer, private :: denscale = 1  ! 1=scale num. conc. and charge by air density for advection, 0=turn off for comparison
502   real, private  :: qhdpvdn = -1.
503   real, private  :: qhacidn = -1.
505   integer, private :: iraintypes = 0
506   logical, private :: mixedphase = .false.   ! .false.=off, true=on to include mixed phase graupel
507   integer, private :: imixedphase = 0
508   logical, private :: qsdenmod = .false.     ! true = modify snow density by linear interpolation of snow and rain density
509   logical, private :: qhdenmod = .false.     ! true = modify graupel density by linear interpolation of graupel and rain density
510   logical, private :: qsvtmod = .false.      ! true = modify snow fall speed by linear interpolation of snow and rain vt
511   real   , private :: sheddiam   = 8.0e-03  ! minimum diameter of graupel before shedding occurs
512   real    :: sheddiamlg = 10.0e-03  ! diameter of hail to use fwmlarge
513   real    :: sheddiam0  = 20.0e-03  ! diameter of hail at which all water is shed
514   
515   integer :: ifwmhopt = 2 ! option for calculating maximum liquid fraction when fwmh and/or fwmhl is set to -1
516                           ! 1 = maximum based on size of maximum mass diameter
517                           ! 2 = integrate over spectrum for maximum liquid (experimental)
519   integer :: ihxw2rain = 0 ! = 0 no transfer
520                            ! = 1 transfer completely melted (99.5%) graupel/hail to rain when fwmh/fwmhl is set to -1.
522   real   , private :: fwms = 0.5 ! maximum liquid water fraction on snow
523   real   , private :: fwmh = 0.5 ! maximum liquid water fraction on graupel
524   real   , private :: fwmhl = 0.5 ! maximum liquid water fraction on hail
525   real    :: fwmlarge = 0.2 ! maximum liquid water fraction on hail larger than sheddiam
526   integer :: ifwmfall = 0   ! whether to interpolate toward rain fall speed for graupel and hail
527                             ! when diam < sheddiam and liquid fraction is predicted (0=no, 1=yes)
528   
529   logical :: rescale_high_alpha = .false.  ! whether to rescale number. conc. when alpha = alphamax (3-moment only)
530   logical :: rescale_low_alpha = .true.    ! whether to rescale Z (graupel/hail) when alpha = alphamin (3-moment only)
531   logical :: rescale_low_alphar = .true.    ! whether to rescale Z for rain when alpha = alphamin (3-moment only)
532   logical :: rescale_low_alphah = .true.    ! whether to rescale Z for rain when alpha = alphamin (3-moment only)
533   logical :: rescale_low_alphahl = .true.    ! whether to rescale Z for rain when alpha = alphamin (3-moment only)
535   real, parameter :: alpharmax = 8. ! limited for rwvent calculation
536   
537   integer, private ::  ihlcnh = -1  ! which graupel -> hail conversion to use
538                           ! 1 = Milbrandt and Yau (2005) using Ziegler 1985 wet growth diameter
539                           ! 2 = Straka and Mansell (2005) conversion using size threshold
540                           ! 3 = Conversion using wet growth diameter
541   real, private :: hlcnhdia = 1.e-3 ! threshold diameter for graupel -> hail conversion for ihlcnh = 1 option.
542   real, private :: hlcnhqmin = 0.1e-3 ! minimum graupel mass content for graupel -> hail conversion (ihlcnh = 1)
543   real   , private :: hldia1 = 10.0e-3  ! threshold diameter for graupel -> hail conversion for ihlcnh = 2 option.
544   integer, private  :: incwet = 0    ! flag to do wet growth only on D > D_wet
545   integer, private  :: iusedw = 0    ! flag to use experimental wet growth ice diameter for gr -> hl conversion (=1 turns on)
546   real   , private  :: dwmin   = 5.0e-3  ! Minimum diameter with iusedw (can stay at 0 or be set to something larger)
547   real   , private  :: dwetmin = 5.0e-3  ! Minimum diameter with iusedw (can stay at 0 or be set to something larger)
548   real   , private  :: dwmax  = 15.e-3 ! for ihlcnh, always convert this size and larger whether or not there is wet growth
549   real   , private  :: dwtempmin = 242. ! lowest temperature to allow wet growth conversion to hail
550   real   , private  :: dwehwmin = 0.   ! Minimum ehw to use to find wet growth diameter (if > ehw0, then wet growth diam becomes smaller)
551   real   , private  :: dg0thresh = 0.15 ! graupel wet growth diameter above which we say do not bother
552   integer :: ifddenfac = 0  ! = 1 to use density threshold to count FD as GR when converting to HL
553   real    :: fddenthresh = 500. ! if ifddenfac > 0, then hail from FD with lower density are considered to come from graupel
554   integer :: icvhl2h = 0   ! allow conversion of hail back to graupel when hail density gets close to minimum allowed
556   integer, private :: imurain = 1 ! 3 for gamma-volume, 1 for gamma-diameter DSD for rain.
557   integer, private :: imusnow = 3 ! 3 for gamma-volume, 1 for gamma-diameter DSD for snow (=1 NOT IMPLEMENTED!!).
558   integer, private :: iturbenhance = 0 ! warm-rain collision enhancement
559                               ! 1 = enhance autoconversion only
560                               ! 2 = add rain collection of cloud
561                               ! 3 = add rain self-collection
562   integer, private :: isedonly = 0 ! 1= only do sedimentation and skip other microphysics
563   integer, private :: iferwisventr = 2 ! =1 for Ferrier rwvent, =2 for Wisner rwvent (imurain=1)
564   integer, private :: izwisventr   = 2 ! =1 for old Ziegler rwvent, =2 for Wisner-style rwvent (imurain=3)
565   integer :: iresetmoments = 0 ! if >0, then set all moments to zero when one of them is zero (3-moment only)
566   integer, private :: imaxdiaopt = 3 
567                                ! = 1 use mean diameter for breakup
568                                ! = 2 use maximum mass diameter for breakup
569                                ! = 3 use mass-weighted diameter for breakup
570   integer :: iraintailbreak = 0 ! 1 = on
571   real    :: draintail      = 8.e-3 ! starting size for rain breakup
572   integer, private :: dmrauto       = 0 
573                               ! = -1 no limiter on crcnw
574                               ! =  0 limit crcnw when qr > 1.2*L (Cohard-Pinty 2002)
575                               ! =  1 DTD version based on MY code
576                               ! =  2 DTD mass-weighted version based on MY code
577                               ! =  3 Milbrandt version (from Cohard and Pinty code
578   integer :: dmropt = 0 ! extra option for crcnw
579   integer :: dmhlopt = 0 ! options for graupel -> hail conversion
580   integer :: irescalerainopt = 3 ! 0 = default option
581                                  ! 1 = qx(mgs,lc) > qxmin(lc) 
582                                  ! 2 = qx(mgs,lc) > qxmin(lc) .and. wvel(mgs) < 3.0
583                                  ! 3 = temcg(mgs) > 0.0.and. qx(mgs,lc) > qxmin(lc) .and. wvel(mgs) < 3.0 
584   real    :: rescale_wthresh = 3.0
585   real    :: rescale_tempthresh = 0.0
586   real, parameter :: alpharaut = 0.0 ! MY2005 for autoconversion
587   real    :: cxmin = 1.e-8  ! threshold cutoff for number concentration
588   real    :: zxmin = 1.e-28 ! threshold cutoff for reflectivity moment
589   
590   integer :: ithompsoncnoh = 0 ! For single moment graupel only
591                            ! 0 = fixed intercept
592                            ! 1 = intercept based on graupel mass
594   integer :: ivhmltsoak = 1   ! 0=off, 1=on : flag to simulate soaking (graupel/hail) during melting 
595                          ! when liquid fraction is not predicted
596   logical, private :: iwetsoak = .true. ! soak and freeze during wet growth or not
597   integer, private :: ioldlimiter = 0 ! test switch for new(=0) or old(=1) size limiter at the end of GS for 3-moment categories
598   integer, private :: isnowfall = 2   ! Option for choosing between snow fall speed parameters
599                          ! 1 = original Zrnic et al. (Mansell et al. 2010)
600                          ! 2 = Ferrier 1994 (results in slower fall speeds)
602   integer, private :: isnowdens = 1   ! Option for choosing between snow density options
603                              ! 1 = constant of 100 kg m^-3
604                              ! 2 = Option based on Cox 
605   
606   integer, private  :: ibiggsnow   = 3 ! 1 = switch conversion over to snow for small frozen drops from Bigg freezing
607                                        ! 2 = switch conversion over to snow for small frozen drops from rain-ice interaction
608                                        ! 3 = switch conversion over to snow for small frozen drops from both
609   real    :: biggsnowdiam = -1.0 ! If >0, use for ibiggsnow threshold
610   
611   integer, private  :: ixtaltype = 1 ! =1 column, =2 disk (similar to Takahashi)
613   real, private  :: takshedsize1 = 0.15 ! diameter (cm) of drop shed from ice with D > 1.9 cm
614   real, private  :: takshedsize2 = 0.3 ! diameter (cm) of drop shed from ice with D < 1.9 cm and D > 0.8 cm
615   real, private  :: takshedsize3 = 0.45 ! diameter (cm) of drop shed from ice with D < 1.6 cm and D > 0.8 cm
616   integer, private  :: numshedregimes = 3
617   
618   real, private     :: evapfac     = 1.0 ! Multiplier on rain evaporation rate
619   real, private     :: depfac      = 1.0 ! Multiplier on graupel/hail deposition/sublimation rate
620   real,private,parameter :: meltfac     = 1.0 ! Multiplier on graupel/hail melting rate
622   integer, private :: ibinhmlr = 0  ! =1 use incomplete gammas to determine melting from larger and smaller sizes of graupel, and appropriate shed drop sizes 
623                            ! =2 to test melting by temporary bins
624   integer, private :: ibinhlmlr = 0  ! =1 use incomplete gammas to determine melting from larger and smaller sizes of hail, and appropriate shed drop sizes 
625                             ! =2 to test melting by temporary bins
626   integer, private :: ibinnum   = 2  ! number of bins for melting of smaller ice (for ibinhmlr = 1)
627   integer, private :: iqhacrmlr = 1  ! turn on/off qhacrmlr
628   integer, private :: iqhlacrmlr = 1  ! turn on/off qhlacrmlr
629   integer, private :: iqhacwshr = 1  ! turn on/off qhacw for T > 0
630   integer, private :: iqhlacwshr = 1  ! turn on/off qhlacw for T > 0
631   real, private :: binmlrmxdia = 40.e-3 ! threshold diameter (graupel/hail) to switch bin-bulk melting to use standard chmlr
632   real, private :: binmlrzrrfac = 1.0 ! factor for reflectivity change ice that sheds while melting
633   real, private :: snowmeltdia = 0 ! If nonzero, sets the size of rain drops from melting snow.
634   real, private :: alphasmlr0 = 14.0 ! shape parameter for drops formed from melting/shedding snow
635   real, private :: delta_alphamlr = 0.5 ! offset from alphamax at which melting does not further collapse the shape parameter
636   
637   integer :: iqvsopt = 0 ! =0 use old default for tabqvs; =1 use Bolton formulation (Rogers and Yau)
639   integer :: imaxsupopt = 4 ! how to treat saturation adjustment in two-moment droplets
640                             ! 1 = add droplets with same mean mass as current droplets
641                             ! 2 = add droplets with minimum radius of 30 microns
642                             ! 3 = only add 1.5*cxmin to number concentration (allow max size to apply)
643                             ! 4 = add droplets with minimum radius of 20 microns
644   real    :: maxsupersat = 1.9 ! maximum supersaturation ratio, above which a saturation adustment is done
645   real    :: maxlowtempss = 1.08 ! Sat. ratio threshold for allowing droplet nucleation at T < tfrh
646   real    :: ssmxuf = 4.0 ! supersaturation at which to start using "ultrafine" CCN (if ccnuf > 0.)
647   
649   integer, parameter :: icespheres = 0 ! turn ice spheres (frozen droplets) on (1) or off (0). NOT COMPLETE IN WRF/ARPS/CM1 CODE!
650   integer, parameter :: lqmx = 30
651   integer, parameter :: lt = 1
652   integer, parameter :: lv = 2
653   integer, parameter :: lc = 3
654   integer, parameter :: lr = 4
655   integer, parameter :: li = 5
656   integer, private :: lis = 0
657   integer, private :: ls = 6
658   integer, private :: lh = 7
659   integer, private :: lf = 0
660   integer, private :: lhl = 0
662   integer, private  :: lccn = 9 ! 0 or 9, other indices adjusted accordingly
663   integer, private :: lccnuf = 0
664   integer, private :: lccna = 0
665   integer, private :: lcina = 0
666   integer, private :: lcin = 0
667   integer, private :: lnc = 9
668   integer, private :: lnr = 10
669   integer, private :: lni = 11
670   integer, private :: lnis = 0
671   integer, private :: lns = 12
672   integer, private :: lnh = 13
673   integer, private :: lnf = 0
674   integer, private :: lnhl = 0
675   integer, private :: lnhf = 0
676   integer, private :: lnhlf = 0
677   integer, private :: lss = 0
678   integer :: lvh = 15
680   integer, private :: lhab = 8
681   integer, private :: lg = 7
683 ! Particle volume
685   integer :: lvi = 0
686   integer :: lvs = 0
687   integer :: lvgl = 0
688   integer :: lvgm = 0
689   integer :: lvgh = 0
690   integer :: lvf = 0
691 !  integer :: lvh = 16
692   integer :: lvhl = 0
694 ! liquid water fraction (not predicted here but tested for)
695   integer :: lhw = 0
696   integer :: lfw = 0
697   integer :: lsw = 0
698   integer :: lhlw = 0
699   integer :: lhwlg = 0
700   integer :: lhlwlg = 0
702 ! reflectivity (6th moment) ! not predicted here but may be tested against
704   integer :: lzr = 0
705   integer :: lzi = 0
706   integer :: lzs = 0
707   integer :: lzgl = 0
708   integer :: lzgm = 0
709   integer :: lzgh = 0
710   integer :: lzf = 0
711   integer :: lzh = 0
712   integer :: lzhl = 0
714 ! Space charge
716   integer :: lscw = 0
717   integer :: lscr = 0
718   integer :: lsci = 0
719   integer :: lscis = 0
720   integer :: lscs = 0
721   integer :: lsch = 0
722   integer :: lscf = 0
723   integer :: lschl = 0
724   integer :: lscwi = 0
725   integer :: lscpi = 0
726   integer :: lscni = 0
727   integer :: lscpli = 0
728   integer :: lscnli = 0
729   integer :: lschab = 0
731   integer :: lscb = 0
732   integer :: lsce = 0
733   integer :: lsceq = 0
735 !  integer, parameter :: lscmx = 100
737   integer :: lne = 0 ! last varible for transforming
739   real :: cnoh0 = 4.0e+5
740   real :: hwdn1 = 700.0
742   real    :: alphai  = 0.0 ! shape parameter for ZIEG ice crystals ! not currently used
743   real    :: alphas  = 0.0 ! shape parameter for ZIEG snow         ! used only for single moment
744   real    :: alphar  = 0.0 ! shape parameter for rain (imurain=1 only)
745   real, private    :: alphah  = 0.0 ! set in namelist!! shape parameter for ZIEG graupel
746   real, private    :: alphahl = 1.0 ! set in namelist!! shape parameter for ZIEG hail
748   real    :: dmuh    = 1.0  ! power in exponential part (graupel)
749   real    :: dmuhl   = 1.0  ! power in exponential part (hail)
751   real, private   :: alphamax = 15.
752   real, private   :: alphamin = 0.
753   real, parameter :: rnumin = -0.8
754   real, parameter :: rnumax = 15.0
756   
757   real            :: cnu = 0.0 ! default value of droplet shape parameter. Can be diagnosed by setting idiagnosecnu=1
758   real, parameter :: rnu = -0.8, snu = -0.8, cinu = 0.0
759 !      parameter ( cnu = 0.0, rnu = -0.8, snu = -0.8, cinu = 0.0 )
760   
761   real xnu(lc:lqmx) ! 1st shape parameter (mass)
762   real xmu(lc:lqmx) ! 2nd shape parameter (mass)
763   real dnu(lc:lqmx) ! 1st shape parameter (diameter)
764   real dmu(lc:lqmx) ! 2nd shape parameter (diameter)
765   
766   real ax(lc:lqmx)
767   real bx(lc:lqmx)
768   real fx(lc:lqmx)
770       real da0 (lc:lqmx)          ! collection coefficients from Seifert 2005
771       real dab0(lc:lqmx,lc:lqmx)  ! collection coefficients from Seifert 2005
772       real dab1(lc:lqmx,lc:lqmx)  ! collection coefficients from Seifert 2005
773       real da1 (lc:lqmx)          ! collection coefficients from Seifert 2005
774       real bb  (lc:lqmx)
777 ! put ipelec here for now....
778   integer :: ipelec = 0
779   integer :: isaund = 0
780   logical :: idoniconly = .false.
781   integer, private :: elec_on_time = -1     ! time (seconds) to turn on charge separation.
782   integer, private :: elec_ramp_time = 0   ! time (interval) for linear ramp after elec_on_time 
783                                    ! (i.e., linear factor on chg sep to smoothly turn on elec)
784                                    ! full charging rate is achieved at time = elec_on_time + elec_ramp_time
785   integer :: jchgs = 3  ! number of points near boundary where charging is turned off (to keep lightning from getting wonky)
786   integer :: jchgn = 2
787   integer :: ichge = 3
788   integer :: ichgw = 2
789   real    :: charging_border = 4000. ! width of no-charging zone from boundary
790       real, private    :: delqnw = -1.0e-10!-1.0e-12 !
791       real, private    :: delqxw =  1.0e-10! 1.0e-12 !
792       real :: tindmn = 233, tindmx = 298.0  ! min and max temperatures where inductive charging is allowed
795 !  gamma function lookup table
797       integer ngm0,ngm1,ngm2
798       parameter (ngm0=3001,ngm1=500,ngm2=500)
799       double precision, parameter :: dgam = 0.01, dgami = 100.
800       double precision gmoi(0:ngm0) ! ,gmod(0:ngm1,0:ngm2),gmdi(0:ngm1,0:ngm2)
802       integer, parameter :: nqiacralpha =  300 !480 ! 240 ! 120 ! 15
803       integer, parameter :: nqiacrratio =  400 ! 500 !50  ! 25
804 !      real,    parameter :: maxratiolu = 25.
805       real,    parameter :: maxratiolu = 100. ! 25.
806       real,    parameter :: maxalphalu = 15.
807       real,    parameter :: minalphalu = -0.95
808       real,    parameter :: dqiacralpha = maxalphalu/Float(nqiacralpha), dqiacrratio = maxratiolu/Float(nqiacrratio) 
809       real,    parameter :: dqiacrratioinv = 1./dqiacrratio, dqiacralphainv = 1./dqiacralpha
810       integer, parameter :: ialpstart = minalphalu*dqiacralphainv
811       real :: ciacrratio(0:nqiacrratio,ialpstart:nqiacralpha)
812       real :: qiacrratio(0:nqiacrratio,ialpstart:nqiacralpha)
813       real :: ziacrratio(0:nqiacrratio,ialpstart:nqiacralpha)
814       double precision :: gamxinflu(0:nqiacrratio,ialpstart:nqiacralpha,12,2) ! last index for graupel (1) or hail (2)
815 !      real :: ciacrratio(0:nqiacrratio,0:nqiacralpha)
816 !      real :: qiacrratio(0:nqiacrratio,0:nqiacralpha)
817 !      real :: ziacrratio(0:nqiacrratio,0:nqiacralpha)
818 !      double precision :: gamxinflu(0:nqiacrratio,0:nqiacralpha,12,2) ! last index for graupel (1) or hail (2)
820 ! for 3-moment collection coefficients
821       real, save :: dab0lu(ialpstart:nqiacralpha,ialpstart:nqiacralpha,lc:lqmx,lc:lqmx)  ! collection coefficients from Seifert 2005
822       real, save :: dab1lu(ialpstart:nqiacralpha,ialpstart:nqiacralpha,lc:lqmx,lc:lqmx)  ! collection coefficients from Seifert 2005
824     integer, parameter :: ngdnmm = 9
825     real :: mmgraupvt(ngdnmm,3)  ! Milbrandt and Morrison (2013) fall speed coefficients for graupel/hail
827     DATA mmgraupvt(:,1) / 50., 150., 250., 350., 450., 550., 650., 750., 850./
828     DATA mmgraupvt(:,2) / 62.923, 94.122, 114.74, 131.21, 145.26, 157.71, 168.98, 179.36, 189.02 /
829     DATA mmgraupvt(:,3) / 0.67819, 0.63789, 0.62197, 0.61240, 0.60572, 0.60066, 0.59663, 0.59330, 0.59048 /
831       integer lsc(lc:lqmx)
832       integer ln(lc:lqmx)
833       integer ipc(lc:lqmx)
834       integer lvol(lc:lqmx)
835       integer lz(lc:lqmx)
836       integer lliq(li:lqmx)
837       integer denscale(lc:lqmx) ! flag for density scaling (mixing ratio conversion)
839       integer ido(lc:lqmx)
840       logical ldovol
842       real xdn0(lc:lqmx)
843       real xdnmx(lc:lqmx), xdnmn(lc:lqmx)
844       real cdx(lc:lqmx)
845       real cno(lc:lqmx)
846       real xvmn(lc:lqmx), xvmx(lc:lqmx)
847       real qxmin(lc:lqmx)
848       real qxmin_init(lc:lqmx)
850       integer nqsat
851       parameter (nqsat=1000001) ! (nqsat=20001)
852       real fqsat,fqsati
853       parameter (fqsat=0.002,fqsati=1./fqsat)
854       real tabqvs(nqsat),tabqis(nqsat),dtabqvs(nqsat),dtabqis(nqsat)
857 !  constants
859       real, parameter :: ar = 841.99666         ! rain terminal velocity power law coefficient (LFO)
860       real, parameter :: br = 0.8               ! rain terminal velocity power law coefficient (LFO)
861       real, parameter :: aradcw = -0.27544      !
862       real, parameter :: bradcw = 0.26249e+06   !
863       real, parameter :: cradcw = -1.8896e+10   !
864       real, parameter :: dradcw = 4.4626e+14    !
865       real, parameter :: bta1 = 0.6             ! beta-1 constant used for ice nucleation by deposition (Ferrier 94, among others)
866       real, parameter :: cnit = 1.0e-02         ! No for ice nucleation by deposition (Cotton et al. 86)
867       real, parameter :: dragh = 0.60           ! coefficient used to adjust fall speed for hail versus graupel (Pruppacher and Klett 78)
868       real, parameter :: dnz00 = 1.225          ! reference/MSL air density
869       real, parameter :: rho00 = 1.225          ! reference/MSL air density
870 !      cs = 4.83607122       ! snow terminal velocity power law coefficient (LFO)
871 !      ds = 0.25             ! snow terminal velocity power law coefficient (LFO)
872 !  new values for  cs and ds
873       real, parameter :: cs = 12.42             ! snow terminal velocity power law coefficient 
874       real, parameter :: ds = 0.42              ! snow terminal velocity power law coefficient 
875       real, parameter :: cp608 = 0.608          ! constant used in conversion of T to Tv
877       real, parameter :: gr = 9.8
879       real, parameter :: pi = 3.141592653589793
880       real, parameter :: piinv = 1./pi
881       real, parameter :: pid4 = pi/4.0
884 ! max and min mean volumes
886       real xvrmn, xvrmx0  ! min, max rain volumes
887       real xvsmn, xvsmx  ! min, max snow volumes
888       real xvfmn, xvfmx  ! min, max frozen drop volumes
889       real xvgmn, xvgmx  ! min, max graupel volumes
890       real xvhmn, xvhmn0, xvhmx, xvhmx0  ! min, max hail volumes
891       real xvhlmn, xvhlmx  ! min, max lg hail volumes
893       real, parameter :: dhlmn = 0.3e-3, dhlmx = 40.e-3
894       real, parameter :: dhmn0 = 0.3e-3
895       real, private :: dhmn = dhmn0, dhmx = -1.
897       real, parameter :: cwradn = 2.0e-6, xcradmn = cwradn    ! minimum radius
898       real, parameter :: cwradx = 60.e-6, xcradmx = cwradx    ! maximum radius
899       real, parameter :: cwc1 = 6.0/(pi*1000.)
901 !      parameter( xvcmn=4.188e-18 )   ! mks  min volume = 3 micron radius
902       real, parameter :: xvcmn=0.523599*(2.*cwradn)**3    ! mks  min volume = 2.5 micron radius
903       real, parameter :: xvcmx=0.523599*(2.*xcradmx)**3    ! mks  max volume = 60 micron radius
904       real, parameter :: cwmasn = 1000.*xvcmn   ! minimum mass, defined by radius of 5.0e-6
905       real, parameter :: cwmasx = 1000.*xvcmx   ! maximum mass, defined by radius of 50.0e-6
906       real, parameter :: cwmasn5 = 1000.*0.523599*(2.*5.0e-6)**3 !  5.23e-13
908       real, parameter :: xvimn=0.523599*(2.*5.e-6)**3    ! mks  min volume = 5 micron radius
909       real, parameter :: xvimx=0.523599*(2.*1.e-3)**3    ! mks  max volume = 1 mm radius (solid sphere approx)
910       
911       real, private   :: xvdmx = -1.0 ! 3.0e-3
912       real     :: xvrmx
913       parameter( xvrmn=0.523599*(80.e-6)**3, xvrmx0=0.523599*(6.e-3)**3 ) !( was 4.1887e-9 )  ! mks
914       parameter( xvsmn=0.523599*(0.01e-3)**3, xvsmx=0.523599*(10.e-3)**3 ) !( was 4.1887e-9 )  ! mks
915       parameter( xvfmn=0.523599*(0.1e-3)**3, xvfmx=0.523599*(10.e-3)**3 )  ! mks xvfmx = (pi/6)*(10mm)**3
916       parameter( xvgmn=0.523599*(0.1e-3)**3, xvgmx=0.523599*(10.e-3)**3 )  ! mks xvfmx = (pi/6)*(10mm)**3
917       parameter( xvhmn0=0.523599*(0.3e-3)**3, xvhmx0=0.523599*(20.e-3)**3 )  ! mks xvfmx = (pi/6)*(20mm)**3
918       parameter( xvhlmn=0.523599*(dhlmn)**3, xvhlmx=0.523599*(dhlmx)**3 )  ! mks xvfmx = (pi/6)*(40mm)**3
921 !  electrical permitivity of air C / (N m**2) -  check the units
923       real eperao
924       parameter (eperao  = 8.8592e-12 )
926       real ec,eci  ! fundamental unit of charge
927       parameter (ec = 1.602e-19)
928       parameter (eci = 1.0/ec)
930       real    :: scwppmx = 20.0e-12
931       real    :: scippmx = 20.0e-12
933 !  constants
935       real, parameter :: c1f3 = 1.0/3.0
937       real, parameter :: cai = 21.87455
938       real, parameter :: caw = 17.2693882
939       real, parameter :: cbi = 7.66
940       real, parameter :: cbw = 35.86
942       real, parameter :: cbwbolton = 29.65 ! constants for Bolton formulation
943       real, parameter :: cawbolton = 17.67
945       real, parameter :: tfrh = 233.15
946       real, parameter :: tfr = 273.15
948       real, parameter :: cp = 1004.0, rd = 287.04
949       real, parameter :: rw = 461.5              ! gas const. for water vapor
950       real, parameter ::      cpl = 4190.0
951       real, parameter ::      cpigb = 2106.0
952       real, parameter :: cpi = 1./cp
953       real, parameter :: cap = rd/cp
954       real, parameter :: tfrcbw = tfr - cbw
955       real, parameter :: tfrcbi = tfr - cbi
956       real, parameter :: rovcp = rd/cp
957       real :: rdorv = 0.622
958       real, parameter :: poo = 1.0e+05
959       real, parameter :: advisc0 = 1.832e-05     ! reference dynamic viscosity (SMT; see Beard & Pruppacher 71)
960       real, parameter :: advisc1 = 1.718e-05     ! dynamic viscosity constant used in thermal conductivity calc
961       real, parameter :: tka0 = 2.43e-02         ! reference thermal conductivity
963      ! GHB: Needed for eqtset=2 in cm1
964 !     REAL, PRIVATE ::      cv = cp - rd
965       real, private, parameter ::      cv = 717.0             ! specific heat at constant volume - air
966       REAL, PRIVATE, parameter ::      cvv = 1408.5
967      ! GHB
969       real, parameter ::  bfnu0 = (rnu + 2.0)/(rnu + 1.0) 
970       real :: ventr, ventrn, ventc, c1sw
973       real :: cckm,ccne,ccnefac,cnexp,CCNE0
975       integer :: na = 9
976       integer :: nxtra = 1
977       real gf4p5, gf4ds, gf4br
978       real gsnow1, gsnow53, gsnow73
979       real gfcinu1, gfcinu1p47, gfcinu2p47
980       real gfcinu1p22,gfcinu2p22
981       real gfcinu1p18,gfcinu2p18
983       real :: cwchtmp0 = 1.0
984       real :: cwchltmp0 = 1.0
986       real    :: esctot = 1.0e-13
988       integer iexy(lc:lqmx,lc:lqmx)
989       integer :: ieswi = 1,  ieswc = 1, ieswr = 0
990       integer :: iehlsw = 1, iehli = 1,  iehlc = 1, iehlr = 0
991       integer :: iehwsw = 1, iehwi = 1,  iehwc = 1, iehwr = 0
993       logical, parameter :: do_satadj_for_wrfchem = .true.
995       integer, parameter :: ac_opt = 0 ! option flag for alternate aerosol (for NUWRF only)
996       logical, private :: nuaccoinp = .false.
998 ! Note to users: Many of these options are for development and not guaranteed to perform well.
999 ! Some may not be functional depending on the version of the code.
1000 ! Some may be useful for ensemble physics diversity. Feel free to contact Ted Mansell if you have questions
1001 ! in that regard.
1002   NAMELIST /nssl_mp_params/               &
1003                         ndebug, ncdebug,&
1004                         iusewetgraupel, &
1005                         iusewethail,    &
1006                         iusewetsnow,    &
1007                         idbzci,         &
1008                         vtmaxsed,       &
1009                         itfall,iscfall, &
1010                         infall,irfall,isfall,  &
1011                         rssflg,         &
1012                         sssflg,         &
1013                         hssflg,         &
1014                         hlssflg,        &
1015                         irimdenopt,rimdenvwgt,     &
1016                         rimc1, rimc2, rimc3, rimc4,   &
1017                         idiagnosecnu,   &
1018                         icnuclimit,     &
1019                         irenuc,         &
1020                         restoreccn, ccntimeconst, cck, &
1021                         decayufccn, ufccntimeconst, &
1022                         switchccn, old_cccn,  &
1023                         ciintmx,        &
1024                         itype1, itype2, &
1025                         icenucopt, in_freeze_rain_first,     &
1026                         naer,           &
1027                         icfn,           &
1028                         ibfc, iacr, icracr, &
1029                         icracrthresh,   &
1030                         cwfrz2snowfrac, cwfrz2snowratio, &
1031                         ibfr,           &
1032                         ibiggopt,       &
1033                         ibiggsmallrain, &
1034                         ifrzg,ifiacrg,  &
1035                         ifrzs,ffrzs,    &
1036                         iacrsize,       &
1037                         cimas0, cimas1, cfnfac, &
1038                         splintermass,   &
1039                         ewfac,          &
1040                         eii0, eii1,     &
1041                         eri0, esi0,     &
1042                         eri_cimin,      &
1043                         eii0hl, eii1hl, &
1044                         ehs0, ehs1,     &
1045                         ess0, ess1, iessopt,    &
1046                         esstem1,esstem2, &
1047                         ircnw, qminrncw,& ! single-moment only
1048                         iglcnvi,        &
1049                         iglcnvs,        &
1050                         alphahacx,      &
1051                         fconv,          &
1052                         eqtot,          &
1053                         imeyers5,       &
1054                         iehw,           &
1055                         ierw,           &
1056                         iehr0c,iehlr0c, &
1057                         alphai,         &
1058                         alphar,         &
1059                         alphas,         & ! note that alphah and alphahl come through physics namelist
1060                         cnu,            &
1061                         iscni,fscni,    &
1062                         dfrz,           &
1063                         dmlt,           &
1064                         rainfallfac,    &
1065                         icefallfac,     &
1066                         snowfallfac,    &
1067                         graupelfallfac,    &
1068                         hailfallfac,    &
1069                         icefallopt,     &
1070                         icdx,icdxhl,    &
1071                         axh,bxh,axf,bxf,axhl,bxhl, &
1072                         cdhmin, cdhmax,       &
1073                         cdhdnmin, cdhdnmax,   &
1074                         cdhlmin, cdhlmax,     &
1075                         cdhldnmin, cdhldnmax, &
1076                         ihmlt,          &
1077                         ehimin,         &
1078                         ehimax,         &
1079                         ehsmax,         &
1080                         ecollmx,        &
1081                         ehw0, ehlw0,    &
1082                         ehr0, ehlr0,    &
1083                         erw0,           &
1084                         exwmindiam,     &
1085                         nsplinter,      &
1086                         lawson_splinter_fac, &
1087                         iqcinit,        &
1088                         ssmxinit,      &
1089                         xvdmx,          &
1090                         dhmn, dhmx,     &
1091                         fwms,fwmh,fwmhl,  &
1092                         ifwmhopt,         &
1093                         ihxw2rain,        &
1094                         fwmlarge,         &
1095                         ifwmfall,         &
1096                         iturbenhance,     &
1097                         qsdenmod,qhdenmod, &
1098                         qsvtmod,          &
1099                         alphamin,alphamax, &
1100                         isnwfrac,          &
1101                         rescale_low_alpha, &
1102                         rescale_low_alphar, &
1103                         rescale_low_alphah, &
1104                         rescale_low_alphahl, &
1105                         rescale_high_alpha, &
1106                         ihlcnh, hldia1,iusedw, dwehwmin, dwmin, dwmax, dwtempmin, dg0thresh, &
1107                         icvhl2h, hldnmn,hdnmn,    &
1108                         hlcnhdia, hlcnhqmin, &
1109                         isedonly,           &
1110                         iresetmoments,      &
1111                         cxmin, zxmin,       &
1112                         imurain,            &
1113                         iferwisventr,       &
1114                         izwisventr,         &
1115                         qhdpvdn,            &
1116                         qhacidn,            &
1117                         sheddiam,sheddiamlg, &
1118                         sheddiam0,           &
1119                         mltdiam1,mltdiam2,mltdiam3,mltdiam4,mltdiam05, &
1120                         imaxdiaopt,          &
1121                         ithompsoncnoh,       &
1122                         cnohmn,             &
1123                         ivhmltsoak,         &
1124                         ioldlimiter,        &
1125                         isnowfall,          &
1126                         isnowdens,          &
1127                         ibiggsnow,          &
1128                         ixtaltype,          &
1129                         evapfac,    &
1130                         depfac,             &
1131                         dmrauto,irescalerainopt, dmropt,dmhlopt,     &
1132                         rescale_tempthresh, rescale_wthresh, &
1133                         ibinhmlr,ibinhlmlr,imltshddmr, binmlrmxdia, binmlrzrrfac,ibinnum,   &
1134                         iqhacrmlr, iqhlacrmlr, &
1135                         snowmeltdia,    &
1136                         delta_alphamlr, &
1137                         iqvsopt,     &
1138                         maxsupersat, &
1139                         do_accurate_sedimentation, interval_sedi_vt
1140 ! #####################################################################
1141 ! #####################################################################
1143  CONTAINS
1145 ! #####################################################################
1146 ! #####################################################################
1149  REAL FUNCTION fqvs(t)
1150   implicit none
1151   real :: t
1152   fqvs = exp(caw*(t-273.15)/(t-cbw))
1153  END FUNCTION fqvs
1155  REAL FUNCTION fqis(t)
1156   implicit none
1157   real :: t
1158   fqis = exp(cai*(t-273.15)/(t-cbi))
1159  END FUNCTION fqis
1166 ! #####################################################################
1167 ! #####################################################################
1168        SUBROUTINE nssl_2mom_init(  &
1169      & ims,ime, jms,jme, kms,kme, nssl_params, ipctmp, mixphase,ihvol,idoniconlytmp, &
1170      & nssl_graupelfallfac, &
1171      & nssl_hailfallfac, &
1172      & nssl_ehw0, &
1173      & nssl_ehlw0, &
1174      & nssl_icdx, &
1175      & nssl_icdxhl, &
1176      & nssl_icefallfac, &
1177      & nssl_snowfallfac, &
1178      & nssl_cccn,   &
1179      & nssl_ufccn,  &
1180      & nssl_alphah, &
1181      & nssl_alphahl, &
1182      & nssl_alphar, &
1183      & nssl_density_on, nssl_hail_on, nssl_ccn_on, nssl_icecrystals_on, ccn_is_ccna, &
1184      & infileunit, &
1185      & myrank, mpiroot &
1186      )
1188   implicit none
1189   
1190    real, intent(in), optional ::  &
1191      & nssl_graupelfallfac, &
1192      & nssl_hailfallfac, &
1193      & nssl_ehw0, &
1194      & nssl_ehlw0, &
1195      & nssl_icefallfac, &
1196      & nssl_snowfallfac, &
1197      & nssl_cccn,   &
1198      & nssl_alphah, &
1199      & nssl_alphahl, &
1200      & nssl_alphar
1201    integer, intent(in), optional ::  &
1202      & nssl_icdx, &
1203      & nssl_icdxhl, myrank, mpiroot, &
1204      & nssl_ufccn
1205    logical, intent(in), optional :: nssl_density_on, nssl_hail_on, nssl_ccn_on, nssl_icecrystals_on
1206    integer, intent(inout), optional :: ccn_is_ccna
1208   integer, intent(in),optional      :: infileunit
1210    integer, intent(in), optional :: ims,ime, jms,jme, kms,kme
1212    real,  intent(in), dimension(20), optional :: nssl_params
1216    integer, intent(in) :: ipctmp,mixphase
1217    integer, optional, intent(in) :: ihvol
1218    logical, optional, intent(in) :: idoniconlytmp
1220     integer :: igvol_local = 1
1221     logical :: wrote_namelist = .false.
1222     logical :: wrf_dm_on_monitor
1223     integer :: hail_on = -1, density_on = -1, icecrystals_on = 1
1224     integer :: ccn_on = -1
1226      double precision :: arg
1227      real    :: temq
1228      integer :: igam
1229      integer :: i,il,j,l
1230      integer :: ltmp
1231      integer :: isub
1232      real    :: bxh1,bxhl1
1234       real    :: alp,ratio
1235       double precision  :: x,y,y2,y7
1236       logical :: turn_on_ccna, turn_on_cina
1237       integer :: iufccn = 0
1238       integer :: istat
1240       real :: alpjj, alpii, xnuii, xnujj
1241       integer :: ii, jj
1242      
1244      turn_on_ccna = .false.
1245      turn_on_cina = .false.
1247 !      IF ( present( igvol ) ) THEN
1248 !        igvol_local = igvol
1249 !      ENDIF
1250       
1251       IF ( present( nssl_hail_on ) ) THEN
1252         IF ( nssl_hail_on ) THEN
1253           hail_on = 1
1254         ELSE
1255           hail_on = 0
1256         ENDIF
1257       ENDIF
1259       IF ( present( nssl_density_on ) ) THEN
1260         IF ( nssl_density_on ) THEN
1261           density_on = 1
1262         ELSE
1263           density_on = 0
1264         ENDIF
1265       ENDIF
1266       
1267       IF ( present( nssl_icecrystals_on ) ) THEN
1268         IF ( nssl_icecrystals_on ) THEN
1269           icecrystals_on = 1
1270         ELSE
1271           icecrystals_on = 0
1272           ! renucfrac = 1.0 ! why was this set to 1?
1273           ffrzs = 1.0
1274         ENDIF
1275       ENDIF
1279 ! set some global values from namelist input
1282       IF ( present( nssl_params ) ) THEN
1283       ccn      = Abs( nssl_params(1) )
1284       alphah   = nssl_params(2)
1285       alphahl  = nssl_params(3)
1286       cnoh     = nssl_params(4)
1287       cnohl    = nssl_params(5)
1288       cnor     = nssl_params(6)
1289       cnos     = nssl_params(7)
1290       rho_qh   = nssl_params(8)
1291       rho_qhl  = nssl_params(9)
1292       rho_qs   = nssl_params(10)
1293       IF ( Nint(nssl_params(13)) == 1 ) THEN
1294       ! hack to switch CCN field to CCNA (activated ccn)
1295 !       invertccn = .true.
1296         turn_on_ccna = .true.
1297         irenuc = 7
1298       ENDIF
1299       ccnuf     = Abs( nssl_params(14) )
1300       IF ( present(nssl_ufccn) ) iufccn = nssl_ufccn
1302       ENDIF
1303 !      ipelec   = Nint(nssl_params(11))
1304 !      isaund   = Nint(nssl_params(12))
1307       IF ( present(nssl_graupelfallfac) ) graupelfallfac = nssl_graupelfallfac
1308       IF ( present(nssl_hailfallfac) ) hailfallfac = nssl_hailfallfac
1309       IF ( present(nssl_ehw0) ) THEN
1310         IF ( nssl_ehw0 > 0.0 ) ehw0 = nssl_ehw0
1311       ENDIF
1312       IF ( present(nssl_ehlw0) ) THEN
1313         IF ( nssl_ehlw0 > 0.0 ) ehlw0 = nssl_ehlw0
1314       ENDIF
1315       IF ( present(nssl_icdx) ) icdx = nssl_icdx
1316       IF ( present(nssl_icdxhl) ) icdxhl = nssl_icdxhl
1317       IF ( present(nssl_icefallfac) ) icefallfac = nssl_icefallfac
1318       IF ( present(nssl_snowfallfac) ) snowfallfac = nssl_snowfallfac
1319       IF ( present(nssl_cccn) ) THEN
1320         IF (nssl_cccn > 1 ) ccn = nssl_cccn
1321       ENDIF
1322       IF ( present(nssl_alphah) ) THEN
1323         IF ( nssl_alphah > -1. ) alphah = nssl_alphah
1324       ENDIF
1325       IF ( present(nssl_alphahl) ) THEN
1326         IF ( nssl_alphahl > -1. ) alphahl = nssl_alphahl
1327       ENDIF
1328       IF ( present(nssl_alphar) ) THEN
1329         IF ( nssl_alphar > -1.0 ) alphar = nssl_alphar
1330       ENDIF
1333     ipconc = ipctmp
1334     
1335     IF ( ipconc < 5 ) THEN
1336        ihlcnh = 0
1337     ENDIF
1339     IF ( ihlcnh <= 0 ) THEN
1340       IF ( ipconc == 5 ) THEN
1341        ihlcnh = 3
1342       ELSEIF ( ipconc >= 6 ) THEN
1343        ihlcnh = 3
1344       ENDIF
1345     ENDIF
1347       
1351       IF ( .true. ) THEN ! set to true to enable internal namelist read
1352       open(15,file='namelist.input',status='old',form='formatted',action='read')
1353       rewind(15)
1354       read(15,NML=nssl_mp_params,iostat=istat)
1355       close(15)
1356       IF ( istat /= 0 ) THEN
1357 #ifdef WRF_ELEC
1358         IF ( wrf_dm_on_monitor() ) THEN
1359         write(0,*) 'NSSL_2MOM_INIT: PROBLEM WITH NSSL_MP_PARAMS namelist: not found or bad token'
1360         ENDIF
1361 #else
1362        ! write(0,*) 'NSSL_2MOM_INIT: PROBLEM WITH NSSL_MP_PARAMS namelist: not found or bad token'
1363 #endif
1364       ENDIF
1365         IF ( wrf_dm_on_monitor() .and. .not. wrote_namelist ) THEN
1366           open(15,file='namelist.output',status='old',action='readwrite', position='append',form='formatted')
1367           write(15,NML=nssl_mp_params)
1368           close(15)
1369           wrote_namelist = .true.
1370         ENDIF
1371        ENDIF
1375       IF ( iufccn > 0 ) THEN ! make sure to use option that uses UF ccn
1376         irenuc = 7
1377         IF ( ccnuf <= 0.0 ) decayufccn = .true. ! assume surface emission and need decay
1378         IF ( i_uf_or_ccn > 0 ) THEN
1379           ufbackground = 0.0
1380           ccntimeconst = ufccntimeconst
1381         ENDIF
1382       ENDIF
1384         IF ( present( nssl_ccn_on ) ) THEN
1385           IF ( nssl_ccn_on ) THEN
1386             ccn_on = 1
1387           ELSE
1388             ccn_on = 0
1389             irenuc = 2
1390           ENDIF
1391         ENDIF
1393       IF ( irenuc >= 5 ) THEN
1394         turn_on_ccna = .true.
1395         IF ( present( nssl_ccn_on ) ) THEN
1396           IF ( .not. nssl_ccn_on ) THEN
1397       write(0,*) 'NSSL_MP Error: Must have nssl_ccn_on=1 for irenuc >= 5!'
1398         STOP
1399           ENDIF
1400         ENDIF
1401       ENDIF
1403       IF ( present( ccn_is_ccna ) .and. ccn_on == 1 ) THEN
1404         IF ( ccn_is_ccna > 0 ) THEN
1405           turn_on_ccna = .true.
1406         ELSE
1407           IF ( irenuc >= 5 ) THEN
1408             ccn_is_ccna = 1
1409           ENDIF
1410         ENDIF
1411       ENDIF
1413       cwccn = ccn
1415       lhab = 8
1416       lhl = 8
1417       IF ( icespheres >= 1 ) THEN
1418         lhab = lhab + 1
1419         lis = li + 1
1420         ls = ls + 1
1421         lh = lh + 1
1422         lhl = lhl + 1
1423       ENDIF
1424       IF ( hail_on == -1 ) THEN ! hail_on is not set
1425         hail_on = 1
1426         IF ( ihvol <= -1 .or. ihvol == 2 ) THEN
1427           IF ( ihvol == -1 .or. ihvol == -2 ) THEN
1428           lhab = lhab - 1  ! turns off hail 
1429           lhl = 0
1430           hail_on = 0
1431           ! past me thought it would be a good idea to change graupel factors when hail is off....
1432           ! ehw0 = 0.75
1433           ! iehw = 2
1434           ! dfrz = Max( dfrz, 0.5e-3 )
1435           ENDIF
1436           IF ( ihvol == -2 .or. ihvol == 2 .or. icecrystals_on == 0 ) THEN ! ice crystals are turned off
1437            ! a value of 2? means to turn off ice crystals but turn on hail
1438            ! renucfrac = 1.0 ! why?
1439             ffrzs = 1.0
1440            ! idoci = 0 ! try this later
1441           ENDIF
1442         ENDIF
1443       
1444       ELSE ! hail_on is set
1445         IF ( hail_on == 0 ) THEN
1446           lhab = lhab - 1  ! turns off hail 
1447           lhl = 0
1448         ELSE
1449           ! assume default that hail is on
1450         ENDIF
1451       ENDIF
1452       
1453       IF ( density_on == -1 ) THEN ! density flag not set, so default is to predict it
1454         density_on = 1
1455       ENDIF
1458 !      write(0,*) 'wrf_init: lhab,lhl,hail_on,density_on = ',lhab,lhl,hail_on,density_on
1460 !      IF ( ipelec > 0 ) idonic = .true.
1463 ! Build lookup table for saturation mixing ratio (Soong and Ogura 73)
1466       do l = 1,nqsat
1467       temq = 163.15 + (l-1)*fqsat
1468       IF ( iqvsopt == 0 ) THEN
1469       tabqvs(l) = exp(caw*(temq-273.15)/(temq-cbw))
1470       dtabqvs(l) = ((-caw*(-273.15 + temq))/(temq - cbw)**2 + &
1471      &                 caw/(temq - cbw))*tabqvs(l)
1472       ELSE
1473       tabqvs(l) = exp(caw*(temq-273.15)/(temq-cbw))
1474       dtabqvs(l) = ((-cawbolton*(-273.15 + temq))/(temq - cbwbolton)**2 + &
1475      &                 cawbolton/(temq - cbwbolton))*tabqvs(l)
1476       ENDIF
1477       tabqis(l) = exp(cai*(temq-273.15)/(temq-cbi))
1478       dtabqis(l) = ((-cai*(-273.15 + temq))/(temq - cbi)**2 + &
1479      &                 cai/(temq - cbi))*tabqis(l)
1480       end do
1482       bx(lr) = 0.85
1483       ax(lr) = 1647.81
1484       fx(lr) = 135.477
1486       
1487       IF ( icdx == 6 ) THEN
1488         bx(lh) = 0.6 ! Milbrandt and Morrison (2013) for density of 550.
1489         ax(lh) = 157.71
1490 !      ELSEIF ( icdx == 1 ) THEN
1491 !        bx(lh) = bxh
1492 !        ax(lh) = axh
1493       ELSEIF ( icdx > 1 ) THEN
1494         bx(lh) = 0.5
1495         ax(lh) = 75.7149
1496       ELSEIF ( icdx == 0 ) THEN
1497         bx(lh) = 0.37 ! 0.6  ! Ferrier 1994 graupel
1498         ax(lh) = 19.3
1499       ELSE ! icdx < 0
1500 !        ax(lh) = 206.984 ! Ferrier 1994 hail/frozen drops
1501 !        bx(lh) = 0.6384
1502         bx(lh) = bxh
1503         ax(lh) = axh
1504       ENDIF
1506 !      bx(lh) = 0.6
1508       IF ( lhl .gt. 1 ) THEN
1509         IF ( icdxhl == 6 ) THEN
1510           bx(lhl) = 0.593 ! Milbrandt and Morrison (2013) for density of 750.
1511           ax(lhl) = 179.36
1512         ELSEIF (icdxhl == 0 ) THEN
1513           ax(lhl) = 206.984 ! Ferrier 1994
1514           bx(lhl) = 0.6384
1515         ELSEIF (icdxhl > 0 ) THEN
1516          bx(lhl) = 0.5
1517          ax(lhl) = 75.7149
1518         ELSE
1519          bx(lhl) = bxhl
1520          ax(lhl) = axhl
1521         ENDIF
1522       ENDIF
1524 ! fill in the complete gamma function lookup table
1525      gmoi(0) = 1.d32
1526      do igam = 1,ngm0
1527       arg = dgam*igam
1528       gmoi(igam) = gamma_dp(arg)
1529      end do
1531      ! build lookup table to compute the number and mass fractions of rain drops 
1532      ! (imurain=1) greater than a given diameter. Used for qiacr and ciacr
1533      ! Uses incomplete gamma functions
1534      ! The terms with bxh or bxhl will be off if the actual bxh or bxhl is different from the base value (icdx=6 option)
1535       
1536       bxh1 = bx(lh)
1537       bxhl1 = bx(Max(lh,lhl))
1538       
1539 !      DO j = 0,nqiacralpha
1540       DO j = ialpstart,nqiacralpha
1541       alp = float(j)*dqiacralpha
1542       y = gamma_dpr(1.+alp)
1543       y2 = gamma_dpr(2.+alp)
1544       DO i = 0,nqiacrratio
1545         ratio = float(i)*dqiacrratio
1546         x = gamxinfdp( 1.+alp, ratio )
1547 !        write(0,*) 'i, x/y = ',i, x/y
1548         ciacrratio(i,j) = x/y
1550         ! graupel (.,.,.,1)
1551         gamxinflu(i,j,1,1) = x/y
1552         gamxinflu(i,j,2,1) = gamxinfdp( 2.0+alp, ratio )/y
1553         gamxinflu(i,j,3,1) = gamxinfdp( 2.5+alp+0.5*bxh1, ratio )/y
1554         gamxinflu(i,j,5,1) = (gamma_dpr(5.0+alp) - gamxinfdp( 5.0+alp, ratio ))/y
1555         gamxinflu(i,j,6,1) = (gamma_dpr(5.5+alp+0.5*bxh1) - gamxinfdp( 5.5+alp+0.5*bxh1, ratio ))/y
1556         gamxinflu(i,j,9,1) = gamxinfdp( 1.0+alp, ratio )/y
1557         gamxinflu(i,j,10,1)= gamxinfdp( 4.0+alp, ratio )/y
1559         gamxinflu(i,j,12,1) = gamxinfdp( 2.0+alp, ratio )/y2
1560        
1561         ! hail (.,.,.,2)
1562         gamxinflu(i,j,1,2) = gamxinflu(i,j,1,1)
1563         gamxinflu(i,j,2,2) = gamxinflu(i,j,2,1)
1564         gamxinflu(i,j,3,2) = gamxinfdp( 2.5+alp+0.5*bxhl1, ratio )/y
1565         gamxinflu(i,j,5,2) = gamxinflu(i,j,5,1)
1566         gamxinflu(i,j,6,2) = (gamma_dpr(5.5+alp+0.5*bxhl1) - gamxinfdp( 5.5+alp+0.5*bxhl1, ratio ))/y
1567         gamxinflu(i,j,9,2) = gamxinflu(i,j,9,1)
1568         gamxinflu(i,j,10,2)= gamxinflu(i,j,10,1)
1570       IF ( alp > 1.1 ) THEN
1571 !       gamxinflu(i,j,7,1) = gamxinfdp( alp - 1., ratio )/y
1572        gamxinflu(i,j,7,1) = (gamma_dpr(alp - 1.) - gamxinfdp( alp - 1., ratio ))/y
1573 !       gamxinflu(i,j,8,1) = gamxinfdp( alp - 0.5 + 0.5*bxh, ratio )/y
1574        gamxinflu(i,j,8,1) = (gamma_dpr(alp - 0.5 + 0.5*bxh1) - gamxinfdp( alp - 0.5 + 0.5*bxh1, ratio ))/y
1575 !       gamxinflu(i,j,8,2) = gamxinfdp( alp - 0.5 + 0.5*bxhl1, ratio )/y
1576        gamxinflu(i,j,8,2) = (gamma_dpr(alp - 0.5 + 0.5*bxhl1) - gamxinfdp( alp - 0.5 + 0.5*bxhl1, ratio ))/y
1577       ELSE
1578 !       gamxinflu(i,j,7,1) = gamxinfdp( .1, ratio )/y
1579        gamxinflu(i,j,7,1) = (gamma_dpr(0.1) - gamxinfdp( 0.1, ratio ) )/y
1580 !       gamxinflu(i,j,8,1) = gamxinfdp( 1.1 - 0.5 + 0.5*bxh1, ratio )/y
1581 !       gamxinflu(i,j,8,2) = gamxinfdp( 1.1 - 0.5 + 0.5*bxhl1, ratio )/y
1582        gamxinflu(i,j,8,1) = (gamma_dpr(1.1 - 0.5 + 0.5*bxh1) - gamxinfdp( 1.1 - 0.5 + 0.5*bxh1, ratio ) )/y
1583        gamxinflu(i,j,8,2) = (gamma_dpr(1.1 - 0.5 + 0.5*bxhl1) - gamxinfdp( 1.1 - 0.5 + 0.5*bxhl1, ratio ) )/y
1584       ENDIF
1585         
1586         gamxinflu(i,j,7,2) = gamxinflu(i,j,7,1)
1588       ENDDO
1589       ENDDO
1590       ciacrratio(0,:) = 1.0
1592       DO j = ialpstart,nqiacralpha
1593       alp = float(j)*dqiacralpha
1594       y = gamma_sp(4.+alp)
1595       y7 = gamma_sp(7.+alp)
1596       DO i = 0,nqiacrratio
1597         ratio = float(i)*dqiacrratio
1598         
1599         ! mass fraction
1600         x = gamxinfdp( 4.+alp, ratio )
1601 !        write(0,*) 'i, x/y = ',i, x/y
1602         qiacrratio(i,j) = x/y
1603         gamxinflu(i,j,4,1) = x/y
1604         gamxinflu(i,j,4,2) = x/y
1606         ! reflectivity fraction
1607         x = gamxinfdp( 7.+alp, ratio )
1608         ziacrratio(i,j) = x/y7
1609         gamxinflu(i,j,11,1) = x/y7
1610         gamxinflu(i,j,11,2) = x/y7
1612       ENDDO
1613       ENDDO
1614       qiacrratio(0,:) = 1.0
1617       lccn = 0
1618       lccnuf = 0
1619       lccna = 0
1620       lnc = 0
1621       lnr = 0
1622       lni = 0
1623       lnis = 0
1624       lns = 0
1625       lnh = 0
1626       lnhl = 0
1627       lvh = 0
1628       lvhl = 0
1629       lzr = 0
1630       lzh = 0
1631       lzhl = 0
1632       lsw = 0
1633       lhw = 0
1634       lhlw = 0
1636       denscale(:) = 0
1637       
1638 !      lccn = 9
1641     IF ( ipconc == 0 ) THEN
1642        IF ( hail_on == 1 ) THEN ! turn on graupel density for 1-moment scheme
1643        lvh = 9
1644        ltmp = 9
1645        denscale(lvh) = 1
1646        ELSE ! no hail, 'LFO' scheme
1647        ltmp = lhab
1648        lhl = 0
1649        ENDIF
1650     ELSEIF ( ipconc == 5 ) THEN
1651       ltmp = lhab
1652       IF ( iufccn > 0 ) THEN
1653         ltmp = ltmp+1
1654         lccnuf = ltmp
1655         denscale(lccnuf) = 1
1656       ENDIF
1657       lccn= ltmp+1 ! 9
1658       lnc = ltmp+2 ! 10
1659       lnr = ltmp+3 ! 11
1660       lni = ltmp+4 !12
1661       lns = ltmp+5 !13
1662       lnh = ltmp+6 !14
1663       ltmp = lnh
1664       IF ( hail_on == 1 ) THEN
1665       ltmp = ltmp + 1
1666       lnhl = ltmp ! lhab+7 ! 15
1667       ENDIF
1668       IF ( density_on >= 1 ) THEN
1669       ltmp = ltmp + 1
1670       lvh = ltmp ! lhab+8 + isub ! 16 + isub ! isub adjusts to 15 if hail is off
1671 !      ltmp = lvh
1672       ENDIF
1673       denscale(lccn:ltmp) = 1
1674       IF ( density_on == 1 .and. hail_on == 1 ) THEN
1675        ltmp = ltmp + 1
1676        lvhl = ltmp
1677 !       ltmp = lvhl
1678        denscale(lvhl) = 1
1679       ENDIF
1680       IF ( mixedphase ) THEN
1681       ltmp = ltmp + 1
1682       lsw  = ltmp
1683       ltmp = ltmp + 1
1684       lhw  = ltmp
1685         IF ( lhl > 1 ) THEN
1686           ltmp = ltmp + 1
1687           lhlw = ltmp
1688         ENDIF
1689 !      ltmp = lhlw
1690       ENDIF
1691     ELSEIF ( ipconc >= 6 ) THEN
1692       ltmp = lhab
1693       IF ( iufccn > 0 ) THEN
1694         ltmp = ltmp+1
1695         lccnuf = ltmp
1696         denscale(lccnuf) = 1
1697       ENDIF
1699       lccn= ltmp+1 ! 9
1700       lnc = ltmp+2 ! 10
1701       lnr = ltmp+3 ! 11
1702       lni = ltmp+4 !12
1703       lns = ltmp+5 !13
1704       lnh = ltmp+6 !14
1705       ltmp = lnh
1706       IF ( lhl > 0 ) THEN
1707       ltmp = ltmp + 1
1708       lnhl = ltmp ! lhab+7 ! 15
1709       ENDIF
1710       IF ( density_on == 1 ) THEN
1711       ltmp = ltmp + 1
1712       lvh = ltmp ! lhab+8 + isub ! 16 + isub ! isub adjusts to 15 if hail is off
1713       ENDIF
1714 !      ltmp = lvh
1715       denscale(lccn:ltmp) = 1
1716       IF ( density_on == 1 .and. hail_on == 1 ) THEN
1717        ltmp = ltmp + 1
1718        lvhl = ltmp
1719 !       ltmp = lvhl
1720        denscale(lvhl) = 1
1721       ENDIF
1723       IF ( ipconc == 6 ) THEN
1724        ltmp = ltmp + 1
1725        lzh = ltmp
1726       ELSEIF ( ipconc == 7 ) THEN
1727        ltmp = ltmp + 1
1728        lzh = ltmp
1729        ltmp = ltmp + 1
1730        lzr = ltmp
1731       ELSEIF ( ipconc == 8 ) THEN
1732        ltmp = ltmp + 1
1733        lzh = ltmp
1734        ltmp = ltmp + 1
1735        lzr = ltmp
1736        IF ( lhl > 1 ) THEN
1737          ltmp = ltmp + 1
1738          lzhl = ltmp
1739        ENDIF
1740       ! write(0,*) 'ipcon,lzr = ',ipconc,lzr,lzh,lzhl
1741       ENDIF
1742 !      ltmp = lvh
1743  !     denscale(lccn:lvh) = 1
1744       IF ( mixedphase ) THEN
1745       ltmp = ltmp + 1
1746       lsw  = ltmp
1747       ltmp = ltmp + 1
1748       lhw  = ltmp
1749         IF ( lhl > 1 ) THEN
1750           ltmp = ltmp + 1
1751           lhlw = ltmp
1752         ENDIF
1753 !      ltmp = lhlw
1754       ENDIF
1755     ELSE
1756       CALL wrf_error_fatal( 'nssl_2mom_init: Invalid value of ipctmp' )
1757     ENDIF
1761       ! write(0,*) 'wrf_init: lh,lhl,lzh,lzhl = ',lh,lhl,lzh,lzhl 
1762       ! write(0,*) 'wrf_init: ipconc = ',ipconc
1763       ! write(0,*) 'wrf_init: irenuc, turn_on_ccna = ',irenuc, turn_on_ccna 
1764       IF ( turn_on_ccna ) THEN
1765         ltmp = ltmp + 1
1766         lccna = ltmp
1767         denscale(ltmp) = 1
1768       ENDIF
1770       IF ( turn_on_cina ) THEN
1771         ltmp = ltmp + 1
1772         lcina = ltmp
1773         denscale(ltmp) = 1
1774       ENDIF
1776       IF ( turn_on_cin .or. is_aerosol_aware ) THEN
1777         ltmp = ltmp + 1
1778         lcin = ltmp
1779         denscale(ltmp) = 1
1780 !debug        write(0,*) 'Setting lcin to ',lcin
1781       ENDIF
1782       na = ltmp
1783       
1784       ln(lc) = lnc
1785       ln(lr) = lnr
1786       ln(li) = lni
1787       ln(ls) = lns
1788       ln(lh) = lnh
1789       IF ( lhl .gt. 1 ) ln(lhl) = lnhl
1791       ipc(lc) = 2
1792       ipc(lr) = 3
1793       ipc(li) = 1
1794       ipc(ls) = 4
1795       ipc(lh) = 5
1796       IF ( lhl .gt. 1 ) ipc(lhl) = 5
1797       
1798       ldovol = .false.
1799       lvol(:) = 0
1800       lvol(li) = lvi
1801       lvol(ls) = lvs
1802       lvol(lh) = lvh
1803       IF ( lhl .gt. 1 .and. lvhl .gt. 1 ) lvol(lhl) = lvhl
1804       
1805       lne = Max(lnh,lnhl)
1806       lne = Max(lne,lvh)
1807       lne = Max(lne,lvhl)
1808       lne = Max(lne,na)
1810       lsc(:) = 0
1811       lsc(lc) = lscw
1812       lsc(lr) = lscr
1813       lsc(li) = lsci
1814       lsc(ls) = lscs
1815       lsc(lh) = lsch
1816       IF ( lhl .gt. 1 ) lsc(lhl) = lschl
1819       DO il = lc,lhab
1820         ldovol = ldovol .or. ( lvol(il) .gt. 1 )
1821       ENDDO
1823 !      write(0,*) 'nssl_2mom_init: ldovol = ',ldovol
1825       lz(:) = 0
1826       lz(lr) = lzr
1827       lz(li) = lzi
1828       lz(ls) = lzs
1829       lz(lh) = lzh
1830       IF ( lhl .gt. 1 .and. lzhl > 1 ) lz(lhl) = lzhl
1832       lliq(:) = 0
1833       lliq(ls) = lsw
1834       lliq(lh) = lhw
1835       IF ( lhl .gt. 1 ) lliq(lhl) = lhlw
1836       IF ( mixedphase ) THEN
1837 !       write(0,*) 'lsw,lhw,lhlw = ',lsw,lhw,lhlw
1838       ENDIF
1842       xnu(lc) = cnu
1843       xmu(lc) = 1.
1844       
1845       IF ( imurain == 3 ) THEN
1846         xnu(lr) = rnu
1847         xmu(lr) = 1.
1848       ELSEIF ( imurain == 1 ) THEN
1849         xnu(lr) = (alphar - 2.0)/3.0
1850         xmu(lr) = 1./3.
1851       ENDIF
1853       xnu(li) = cinu
1854       xmu(li) = 1.
1856       IF ( lis >= 1 ) THEN
1857       xnu(lis) = 0.0
1858       xmu(lis) = 1.
1859       ENDIF
1861       dnu(lc) = 3.*xnu(lc) + 2. ! alphac
1862       dmu(lc) = 3.*xmu(lc)
1864       dnu(lr) = 3.*xnu(lr) + 2. ! alphar
1865       dmu(lr) = 3.*xmu(lr)
1867       xnu(ls) = snu
1868       xmu(ls) = 1.
1870       dnu(ls) = 3.*xnu(ls) + 2.  ! -0.4 ! alphas
1871       dmu(ls) = 3.*xmu(ls)
1874       dnu(lh) = alphah
1875       dmu(lh) = dmuh
1877       xnu(lh) = (dnu(lh) - 2.)/3.
1878       xmu(lh) = dmuh/3.
1881       IF ( imurain == 3 ) THEN ! rain is gamma of volume
1882       rz =  ((4. + alphah)*(5. + alphah)*(6. + alphah)*(1. + xnu(lr)))/ & 
1883      &  ((1 + alphah)*(2 + alphah)*(3 + alphah)*(2. + xnu(lr)))
1885 !      IF ( ipconc .lt. 5 ) alphahl = alphah
1886       
1887       rzhl =  ((4. + alphahl)*(5. + alphahl)*(6. + alphahl)*(1. + xnu(lr)))/ & 
1888      &  ((1. + alphahl)*(2. + alphahl)*(3. + alphahl)*(2. + xnu(lr)))
1890       rzs =  1. ! assume rain and snow are both gamma volume
1892       ELSE ! rain is gamma of diameter
1893       
1894       rz =  ((4. + alphah)*(5. + alphah)*(6. + alphah)*(1. + alphar)*(2. + alphar)*(3. + alphar))/ & 
1895      &  ((1 + alphah)*(2 + alphah)*(3 + alphah)*(4. + alphar)*(5. + alphar)*(6. + alphar))
1896       
1897       rzhl =  ((4. + alphahl)*(5. + alphahl)*(6. + alphahl)*(1. + alphar)*(2. + alphar)*(3. + alphar))/ & 
1898      &  ((1 + alphahl)*(2 + alphahl)*(3 + alphahl)*(4. + alphar)*(5. + alphar)*(6. + alphar))
1900       
1901       rzs =   & 
1902      &  ((1. + alphar)*(2. + alphar)*(3. + alphar)*(2. + xnu(ls)))/  &
1903      &  ((4. + alphar)*(5. + alphar)*(6. + alphar)*(1. + xnu(ls)))
1904        
1906       ENDIF
1908       IF ( ipconc <= 5 ) THEN 
1909         imltshddmr = Min(1, imltshddmr)
1910         ibinhmlr = 0
1911         ibinhlmlr = 0
1912       ENDIF
1914       IF ( ipconc > 5 .and. (ibinhmlr == 0 .and. ibinhlmlr == 0 ) ) THEN 
1915         imltshddmr = Min(1, imltshddmr)
1916       ENDIF
1918 !      write(0,*) 'rz,rzhl = ', rz,rzhl
1920       IF ( ipconc .lt. 4 ) THEN
1922       dnu(ls) = alphas
1923       dmu(ls) = 1.
1925       xnu(ls) = (dnu(ls) - 2.)/3.
1926       xmu(ls) = 1./3.
1929       ENDIF
1931       IF ( lhl .gt. 1 ) THEN
1933       dnu(lhl) = alphahl
1934       dmu(lhl) = dmuhl
1936       xnu(lhl) = (dnu(lhl) - 2.)/3.
1937       xmu(lhl) = dmuhl/3.
1939       ENDIF
1941       cno(lc)  = 1.0e+08
1942       IF ( li .gt. 1 ) cno(li)  = 1.0e+08
1943       cno(lr)  = cnor
1944       IF ( ls .gt. 1 ) cno(ls)  = cnos ! 8.0e+06
1945       IF ( lh .gt. 1 ) cno(lh)  = cnoh ! 4.0e+05
1946       IF ( lhl .gt. 1 ) cno(lhl)  = cnohl ! 4.0e+05
1948 !  density maximums and minimums
1950       xdnmx(:) = 900.0
1952       xdnmx(lr) = 1000.0
1953       xdnmx(lc) = 1000.0
1954       xdnmx(li) =  917.0
1955       xdnmx(ls) =  300.0
1956       xdnmx(lh) =  900.0
1957       IF ( lhl .gt. 1 ) xdnmx(lhl) = 900.0
1959       xdnmn(:) = 900.0
1961       xdnmn(lr) = 1000.0
1962       xdnmn(lc) = 1000.0
1963       xdnmn(li) =  100.0
1964       xdnmn(ls) =  100.0
1965       xdnmn(lh) =  hdnmn
1966       IF ( lhl .gt. 1 ) xdnmn(lhl) = hldnmn
1968       xdn0(:) = 900.0
1970       xdn0(lc) = 1000.0
1971       xdn0(li) = 900.0
1972       xdn0(lr) = 1000.0
1973       xdn0(ls) = rho_qs ! 100.0
1974       xdn0(lh) = rho_qh ! (0.5)*(xdnmn(lh)+xdnmx(lh))
1975       IF ( lhl .gt. 1 ) xdn0(lhl) = rho_qhl ! 800.0
1978 !  Set terminal velocities...
1979 !    also set drag coefficients
1981       cdx(lr) = 0.60
1982       cdx(lh) = 0.8 ! 1.0 ! 0.45
1983       cdx(ls) = 2.00
1984       IF ( lhl .gt. 1 ) cdx(lhl) = 0.45
1986       ido(lc) = idocw
1987       ido(lr) = idorw
1988       ido(li) = idoci
1989       ido(ls) = idosw
1990       ido(lh)  = idohw
1991       IF ( lhl .gt. 1 ) ido(lhl) = idohl
1993       IF ( irfall .lt. 0 ) irfall = infall
1994       IF ( isfall .lt. 0 ) isfall = infall
1995       IF ( lzr > 0 ) irfall = 0
1997       qccn = ccn/rho00
1998       qccnuf = ccnuf/rho00
1999       IF ( old_cccn > 0.0 ) THEN
2000          old_qccn = old_cccn/rho00
2001       ELSE
2002          old_qccn = qccn
2003       ENDIF
2004 !      xvcmx = (4./3.)*pi*xcradmx**3
2006 ! set max rain diameter
2007       IF ( xvdmx .gt. 0.0 ) THEN
2008         xvrmx = 0.523599*(xvdmx)**3
2009       ELSE
2010         xvrmx = xvrmx0
2011       ENDIF
2013          IF ( dhmn <= 0.0 ) THEN
2014            xvhmn = xvhmn0
2015 !           xvhmn = Min(xvhmn0, 0.523599*(dfrz)**3 )
2016          ELSE
2017            xvhmn = 0.523599*(dhmn)**3
2018 !           xvhmn = 0.523599*(Min(dhmn,dfrz))**3
2019          ENDIF
2021          IF ( dhmx <= 0.0 ) THEN
2022            xvhmx = xvhmx0
2023          ELSE
2024            xvhmx = 0.523599*(dhmx)**3
2025          ENDIF
2026          
2027          IF ( qhdpvdn < 0. ) qhdpvdn = xdnmn(lh)
2028          IF ( qhacidn < 0. ) qhacidn = xdnmn(lh)
2030 ! load max/min diameters
2031       xvmn(lc) = xvcmn
2032       xvmn(li) = xvimn
2033       xvmn(lr) = xvrmn
2034       xvmn(ls) = xvsmn
2035       xvmn(lh) = xvhmn
2037       xvmx(lc) = xvcmx
2038       xvmx(li) = xvimx
2039       xvmx(lr) = xvrmx
2040       xvmx(ls) = xvsmx
2041       xvmx(lh) = xvhmx
2043       IF ( lhl .gt. 1 ) THEN
2044       xvmn(lhl) = xvhlmn
2045       xvmx(lhl) = xvhlmx
2046       ENDIF
2049 !  cloud water constants in mks units
2051 !      cwmasn = 4.25e-15  ! radius of 1.0e-6
2052 !      cwmasn = 5.23e-13   ! minimum mass, defined by radius of 5.0e-6
2053 !      cwmasn5 =  5.23e-13
2054 !      cwradn = 5.0e-6     ! minimum radius
2055 !      cwmasx = 5.25e-10   ! maximum mass, defined by radius of 50.0e-6
2056 !      mwfac = 6.0**(1./3.)
2057       IF ( ipconc .ge. 2 ) THEN
2058 !        cwmasn = xvmn(lc)*1000.  ! minimum mass, defined by minimum droplet volume
2059 !        cwradn = 1.0e-6          ! minimum radius
2060 !        cwmasx = xvmx(lc)*1000.  ! maximum mass, defined by maximum droplet volume
2061         
2062       ENDIF
2063 !        rwmasn = xvmn(lr)*1000.  ! minimum mass, defined by minimum rain volume
2064 !        rwmasx = xvmx(lr)*1000.  ! maximum mass, defined by maximum rain volume
2066       IF ( lhl < 1 ) ifrzg = 1
2068       ventr = 1.
2069       IF ( imurain == 3 ) THEN
2070 !       IF ( izwisventr == 1 ) THEN
2071         ventr = Gamma_sp(rnu + 4./3.)/((rnu + 1.)**(1./3.)*Gamma_sp(rnu + 1.)) ! Ziegler 1985
2072 !       ELSE
2073         ventrn =  Gamma_sp(rnu + 1.5 + br/6.)/(Gamma_sp(rnu + 1.)*(rnu + 1.)**((1.+br)/6. + 1./3.) ) ! adapted from Wisner et al. 1972; for second term in rwvent
2074 !        ventr = Gamma_sp(rnu + 4./3.)/((rnu + 1.)**(1./3.)*Gamma_sp(rnu + 1.)) ! Ziegler 1985, still use for first term in rwvent
2075 !        ventr  = Gamma_sp(rnu + 4./3.)/Gamma_sp(rnu + 1.) 
2076 !       ENDIF
2077       ELSE ! imurain == 1
2078 !       IF ( iferwisventr == 1 ) THEN
2079         ventr = Gamma_sp(2. + alphar)  ! Ferrier 1994
2080 !       ELSEIF ( iferwisventr == 2 ) THEN
2081         ventrn =  Gamma_sp(alphar + 2.5 + br/2.)/Gamma_sp(alphar + 1.) ! adapted from Wisner et al. 1972
2082 !       ENDIF
2083       ENDIF
2084       ventc   = Gamma_sp(cnu + 4./3.)/(cnu + 1.)**(1./3.)/Gamma_sp(cnu + 1.)
2085       c1sw = Gamma_sp(snu + 4./3.)*(snu + 1.0)**(-1./3.)/gamma_sp(snu + 1.0)
2087   ! set threshold mixing ratios
2089       qxmin(:) = 1.0e-12
2091       qxmin(lc) = 1.e-9
2092       qxmin(lr) = 1.e-7
2093       IF ( li > 1 ) qxmin(li) = 1.e-12
2094       IF ( ls > 1 ) qxmin(ls) = 1.e-7
2095       IF ( lh > 1 ) qxmin(lh) = 1.e-7
2096       IF ( lhl .gt. 1 ) qxmin(lhl) = 1.e-7
2098       IF ( lc .gt. 1 .and. lnc .gt. 1 ) qxmin(lc) = 1.0e-13
2099       IF ( lr .gt. 1 .and. lnr .gt. 1 ) qxmin(lr) = 1.0e-12
2101       IF ( li .gt. 1 .and. lni .gt. 1 ) qxmin(li ) = 1.0e-13
2102       IF ( ls .gt. 1 .and. lns .gt. 1 ) qxmin(ls ) = 1.0e-13
2103       IF ( lh .gt. 1 .and. lnh .gt. 1 ) qxmin(lh ) = 1.0e-12
2104       IF ( lhl.gt. 1 .and. lnhl.gt. 1 ) qxmin(lhl) = 1.0e-12
2106       qxmin_init(:) = 1.0e-8 ! threshold for considering single-moment initial condition mixing ratios
2107   ! constants for droplet nucleation
2109       cckm = cck-1.
2110       ccnefac =  (1.63/(cck * beta(3./2., cck/2.)))**(cck/(cck + 2.0))
2111       cnexp   = (3./2.)*cck/(cck+2.0)
2112 ! ccne is all the factors with w in eq. A7 in Mansell et al. 2010 (JAS).  The constant changes
2113 ! if k (cck) is changed!
2114       ccne = ccnefac*1.e6*(1.e-6*Abs(cwccn))**(2./(2.+cck))
2115       ccne0 = ccnefac*1.e6*(1.e-6)**(2./(2.+cck))
2116 !      write(0,*) 'cwccn, cck, ccne = ',cwccn,cck,ccne,ccnefac,cnexp
2117       IF ( cwccn .lt. 0.0 ) THEN
2118       cwccn = Abs(cwccn)
2119       ccwmx = 50.e9 ! cwccn
2120       ELSE
2121       ccwmx = 50.e9 ! cwccn ! *1.4
2122       ENDIF
2126 !  Set collection coefficients (Seifert and Beheng 05)
2128       bb(:) = 1.0/3.0
2129       bb(li) = 0.3429
2130       DO il = lc,lhab
2131         da0(il) = delbk(bb(il), xnu(il), xmu(il), 0)
2132         da1(il) = delbk(bb(il), xnu(il), xmu(il), 1)
2134 !        write(0,*) 'il, da0, da1, xnu, xmu = ', il, da0(il), da1(il), xnu(il), xmu(il)
2135       ENDDO
2137       dab0(:,:) = 0.0
2138       dab1(:,:) = 0.0
2140       DO il = lc,lhab
2141         DO j = lc,lhab
2142           IF ( il .ne. j ) THEN
2144             dab0(il,j) = delabk(bb(il), bb(j), xnu(il), xnu(j), xmu(il), xmu(j), 0)
2145             dab1(il,j) = delabk(bb(il), bb(j), xnu(il), xnu(j), xmu(il), xmu(j), 1)
2147 !           write(0,*) 'il, j, dab0, dab1 = ',il, j, dab0(il,j), dab1(il,j)
2148           ENDIF
2149         ENDDO
2150       ENDDO
2152       dab0lu(:,:,:,:) = 0.0
2153       dab1lu(:,:,:,:) = 0.0
2154       
2155       IF ( ipconc >= 6 ) THEN
2156       DO il = lc,lhab ! collector
2157         DO j = lc,lhab ! collected
2158           IF ( il .ne. j ) THEN
2160             DO jj = ialpstart,nqiacralpha
2161                 alpjj = float(jj)*dqiacralpha
2162                 xnujj = (alpjj - 2.)/3.
2163             DO ii = ialpstart,nqiacralpha
2164                 alpii = float(ii)*dqiacralpha
2165                 xnuii = (alpii - 2.)/3.
2166           
2167             dab0lu(ii,jj,il,j) = delabk(bb(il), bb(j), xnuii, xnujj, xmu(il), xmu(j), 0)
2168             dab1lu(ii,jj,il,j) = delabk(bb(il), bb(j), xnuii, xnujj, xmu(il), xmu(j), 1)
2169           
2170             ENDDO
2171             ENDDO
2172 !           write(0,*) 'il, j, dab0, dab1 = ',il, j, dab0(il,j), dab1(il,j)
2173           ENDIF
2174         ENDDO
2175       ENDDO
2176       
2177       ENDIF
2179         gf4br = gamma_sp(4.0+br)
2180         gf4ds = gamma_sp(4.0+ds)
2181         gf4p5 = gamma_sp(4.0+0.5)
2182         gfcinu1 = gamma_sp(cinu + 1.0)
2183         gfcinu1p47 = gamma_sp(cinu + 1.47167)
2184         gfcinu2p47 = gamma_sp(cinu + 2.47167)
2185         gfcinu1p22 = gamma_sp(cinu + 1.22117)
2186         gfcinu2p22 = gamma_sp(cinu + 2.22117)
2187         gfcinu1p18 = gamma_sp(cinu + 1.18333)
2188         gfcinu2p18 = gamma_sp(cinu + 2.18333)
2189         
2190         gsnow1 = gamma_sp(snu + 1.0)
2191         gsnow53 = gamma_sp(snu + 5./3.)
2192         gsnow73 = gamma_sp(snu + 7./3.)
2194         IF ( lh  .gt. 1 ) cwchtmp0 = 6.0/pi*gamma_sp( (xnu(lh) + 1.)/xmu(lh) )/gamma_sp( (xnu(lh) + 2.)/xmu(lh) )
2195         IF ( lhl .gt. 1 ) cwchltmp0 = 6.0/pi*gamma_sp( (xnu(lhl) + 1)/xmu(lhl) )/gamma_sp( (xnu(lhl) + 2)/xmu(lhl) )
2198       iexy(:,:)=0; ! sets to zero the ones Imight have forgotten
2200 !     snow
2201       iexy(ls,li) = ieswi
2202       iexy(ls,lc) = ieswc ; iexy(ls,lr) = ieswr ;
2204 !     graupel
2205       iexy(lh,ls)  = iehwsw ; iexy(lh,li) = iehwi ;
2206       iexy(lh,lc) = iehwc ; iexy(lh,lr)  = iehwr ;
2208 !     hail
2209       IF (lhl .gt. 1 ) THEN
2210       iexy(lhl,ls)  = iehlsw ; iexy(lhl,li) = iehli ;
2211       iexy(lhl,lc) = iehlc ; iexy(lhl,lr)  = iehlr ;
2212       ENDIF
2213       
2214 !      IF ( icefallfac /= 1.0 ) write(0,*) 'icefallfac = ',icefallfac
2215 !      IF ( snowfallfac /= 1.0 ) write(0,*) 'snowfallfac = ',snowfallfac
2218   RETURN
2219 END SUBROUTINE nssl_2mom_init
2221 ! #####################################################################
2222 ! #####################################################################
2224 SUBROUTINE nssl_2mom_driver(qv, qc, qr, qi, qs, qh, qhl, ccw, crw, cci, csw, chw, chl,  &
2225                               cn, vhw, vhl, cna, cni, f_cn, f_cna, f_cina,              &
2226                               f_qc, f_qr, f_qi, f_qs, f_qh, f_qhl,                      &
2227                               cnuf, f_cnuf,                                             &
2228                               zrw, zhw, zhl, f_zrw, f_zhw, f_zhl, f_vhw, f_vhl,         &
2229                               qsw, qhw, qhlw,                                           &
2230                               tt, th, pii, p, w, dn, dz, dtp, itimestep,                &
2231                               is_theta_or_temp,                                         &
2232                               ntmul, ntcnt, lastloop,                                   &
2233                               RAINNC,RAINNCV,                                           &
2234                               dx, dy,                                                   &
2235                               axtra,                                                    &
2236                               SNOWNC, SNOWNCV, GRPLNC, GRPLNCV,                         &
2237                               SR,HAILNC, HAILNCV,                                       &
2238                               hail_maxk1, hail_max2d, nwp_diagnostics,                  &
2239                               tkediss,                                                  &
2240                               re_cloud, re_ice, re_snow, re_rain,                       &
2241                               re_graup, re_hail,                                        &
2242                               has_reqc, has_reqi, has_reqs, has_reqr,                   &
2243                               has_reqg, has_reqh,                                       &
2244                               rainncw2, rainnci2,                                       &
2245                               dbz, vzf,compdbz,                                         &
2246                               rscghis_2d,rscghis_2dp,rscghis_2dn,                       &
2247                               scr,scw,sci,scs,sch,schl,sctot,                           &
2248                               elec_physics,                                             &
2249                               induc,elecz,scion,sciona,                                 &
2250                               noninduc,noninducp,noninducn,                             &
2251                               pcc2, pre2, depsubr,      &
2252                               mnucf2, melr2, ctr2,     &
2253                               rim1_2, rim2_2,rim3_2, &
2254                               nctr2, nnuccd2, nnucf2, &
2255                               effc2,effr2,effi2,       &
2256                               effs2, effg2,                       &
2257                               fc2, fr2,fi2,fs2,fg2, &
2258                               fnc2, fnr2,fni2,fns2,fng2, &
2259 !                              qcond,qdep,qfrz,qrauto,qhcnvi,qhcollw,qscollw,            &
2260 !                              ncauto, niinit,nifrz,                                     &
2261 !                              re_liquid, re_graupel, re_hail, re_icesnow,               &
2262 !                              vtcloud, vtrain, vtsnow, vtgraupel, vthail,               &
2263                               ipelectmp,                                                &
2264                               diagflag,ke_diag,                                         &
2265                               nssl_progn,                                              & ! wrf-chem 
2266 ! 20130903 acd_mb_washout start
2267                               wetscav_on, rainprod, evapprod,                           & ! wrf-chem 
2268 ! 20130903 acd_mb_washout end
2269                               cu_used, qrcuten, qscuten, qicuten, qccuten,              & ! hm added
2270                               ids,ide, jds,jde, kds,kde,                                &  ! domain dims
2271                               ims,ime, jms,jme, kms,kme,                                &  ! memory dims
2272                               its,ite, jts,jte, kts,kte)                                   ! tile dims
2278       implicit none
2281  !Subroutine arguments:
2283       integer, intent(in)::                                                             &
2284                             ids,ide, jds,jde, kds,kde,                                   &
2285                             ims,ime, jms,jme, kms,kme,                                   &
2286                             its,ite, jts,jte, kts,kte
2287       real, dimension(ims:ime, kms:kme, jms:jme), intent(inout)::                        &
2288                             qv,qc,qr,qs,qh
2289       ! tt is air temperature -- used by CCPP instead of th (theta)
2290       real, dimension(ims:ime, kms:kme, jms:jme), optional, intent(inout)::                       &
2291                               th, tt,                                                   &
2292                               zrw, zhw, zhl,                                            &
2293                               qsw, qhw, qhlw,                                           &
2294                             qi,qhl,ccw,crw,cci,csw,chw,chl,vhw,vhl
2295       integer, optional, intent(in) :: is_theta_or_temp
2296       logical, optional, intent(in) ::  f_zrw, f_zhw, f_zhl, f_vhw, f_vhl ! not used yet
2297       real, dimension(ims:ime, kms:kme, jms:jme), optional, intent(inout):: dbz, vzf, cn, cna, cni, cnuf
2298       real, dimension(ims:ime, jms:jme), optional, intent(inout):: compdbz
2299       real, dimension(ims:ime, jms:jme), optional, intent(inout):: rscghis_2d,  & ! 2D accumulation arrays for vertically-integrated charging rate
2300                                                                    rscghis_2dp, & ! 2D accumulation arrays for vertically-integrated charging rate (positive only)
2301                                                                    rscghis_2dn    ! 2D accumulation arrays for vertically-integrated charging rate (negative only)
2302 !      real, dimension(ims:ime, kms:kme, jms:jme), optional, intent(inout)::rscghis_3d
2303       integer, optional, intent(in) :: elec_physics
2304       real, dimension(ims:ime, kms:kme, jms:jme),  optional, intent(inout)::                   &
2305                             scr,scw,sci,scs,sch,schl,sciona,sctot  ! space charge
2306       real, dimension(ims:ime, kms:kme, jms:jme),  optional, intent(inout)::                   &
2307                             induc,noninduc,noninducp,noninducn  ! charging rates: inductive, noninductive (all, positive, negative to graupel)
2308       real, dimension(ims:ime, kms:kme, jms:jme),  optional, intent(in) :: elecz ! elecsave = Ez
2309       real, dimension(ims:ime, kms:kme, jms:jme,2),optional, intent(inout) :: scion
2310       real, dimension(ims:ime, kms:kme, jms:jme), intent(in)::  p,w,dz,dn
2312       real, dimension(ims:ime, kms:kme, jms:jme), intent(in)::  pii
2313       real, dimension(ims:ime, kms:kme, jms:jme), optional, intent(inout)::   &
2314                               pcc2, pre2, depsubr,      &
2315                               mnucf2, melr2, ctr2,     &
2316                               rim1_2, rim2_2,rim3_2, &
2317                               nctr2, nnuccd2, nnucf2, &
2318                               effc2,effr2,effi2,       &
2319                               effs2, effg2,                       &
2320                               fc2, fr2,fi2,fs2,fg2, &
2321                               fnc2, fnr2,fni2,fns2,fng2
2322 !                              qcond,qdep,qfrz,qrauto,qhcnvi,qhcollw,qscollw,            &
2323 !                              ncauto, niinit,nifrz,                                     &
2324 !                              re_liquid, re_graupel, re_hail, re_icesnow,               &
2325 !                              vtcloud, vtrain, vtsnow, vtgraupel, vthail               
2327        real, dimension(ims:ime, kms:kme, jms:jme), optional, intent(inout) :: axtra
2329 ! WRF variables
2330       real, dimension(ims:ime, jms:jme) ::                                 &
2331                             RAINNC,RAINNCV    ! accumulated precip (NC) and rate (NCV)
2332       real, dimension(ims:ime, jms:jme), optional, intent(inout)::                                 &
2333                             SNOWNC,SNOWNCV,GRPLNC,GRPLNCV,SR        ! accumulated precip (NC) and rate (NCV)
2334       real, dimension(ims:ime, jms:jme), optional, intent(inout)::                                 &
2335                             HAILNC,HAILNCV ! accumulated precip (NC) and rate (NCV)
2336       real, dimension(ims:ime, jms:jme), optional, intent(inout) :: hail_maxk1, hail_max2d
2337       integer, optional, intent(in) :: nwp_diagnostics
2338 !     for cm1, set nproctot=44 (or as needed) to get domain total rates
2339       integer, parameter :: nproc = 1
2340       double precision :: proctot(nproc),proctotmpi(nproc)
2341       REAL, DIMENSION(ims:ime, kms:kme, jms:jme), optional, INTENT(INOUT)::  re_cloud, re_ice, re_snow, &
2342                                                                    re_rain, re_graup, re_hail
2343       REAL, DIMENSION(ims:ime, kms:kme, jms:jme), optional, INTENT(IN):: tkediss
2344       INTEGER, INTENT(IN), optional :: has_reqc, has_reqi, has_reqs, has_reqr, has_reqg, has_reqh
2345       real, dimension(ims:ime, jms:jme), intent(out), optional ::                                 &
2346                             rainncw2, rainnci2       ! liquid rain, ice, accumulation rates
2347       real, optional, intent(in) :: dx,dy
2348       real, intent(in)::    dtp
2349       integer, intent(in):: itimestep !, ccntype
2350       integer, intent(in), optional :: ntmul, ntcnt
2351       logical, optional, intent(in) :: lastloop
2352       logical, optional, intent(in) :: diagflag, f_cna, f_cn, f_cina, f_cnuf
2353       logical, optional, intent(in) :: f_qc, f_qr, f_qi, f_qs, f_qh, f_qhl
2354       integer, optional, intent(in) :: ipelectmp, ke_diag
2357   LOGICAL, INTENT(IN), OPTIONAL ::    nssl_progn   ! flags for wrf-chem 
2358   
2359 !   REAL, DIMENSION(ims:ime, kms:kme, jms:jme), optional,INTENT(INOUT):: qndrop
2360   LOGICAL :: flag_qndrop  ! wrf-chem
2361   LOGICAL :: flag_qnifa , flag_qnwfa
2362   logical :: flag_cnuf = .false.
2363   logical :: flag_ccn = .false.
2364   logical :: flag_qi  = .true.
2365   logical :: has_reqr_local = .false., has_reqg_local = .false., has_reqh_local = .false.
2366   logical :: flag
2367   logical :: nwp_diagflag = .false.
2368   real :: cinchange, t7max,testmax,wmax
2370 ! 20130903 acd_ck_washout start
2371 ! rainprod - total tendency of conversion of cloud water/ice and graupel to rain (kg kg-1 s-1)
2372 ! evapprod - tendency of evaporation of rain (kg kg-1 s-1)
2373 ! 20130903 acd_ck_washout end
2374    REAL, DIMENSION(ims:ime, kms:kme, jms:jme), optional,INTENT(INOUT)::  rainprod, evapprod
2376 ! qrcuten, rain tendency from parameterized cumulus convection
2377 ! qscuten, snow tendency from parameterized cumulus convection
2378 ! qicuten, cloud ice tendency from parameterized cumulus convection
2379 ! mu : air mass in column
2380    REAL, DIMENSION(ims:ime, kms:kme, jms:jme), optional, INTENT(IN):: qrcuten, qscuten, qicuten, qccuten
2381    INTEGER, optional, intent(in) :: cu_used
2382    LOGICAL, optional, intent(in) :: wetscav_on
2385 ! local variables
2387      real, dimension(its:ite, 1, kts:kte) :: elec2 ! ez = elecsave slab
2388 !     real, dimension(its:ite, 1, kts:kte,2) :: scion2 ! 1=- , 2=+
2389      real, dimension(its:ite, kts:kte) :: rainprod2d, evapprod2d,tke2d
2390      real, dimension(its:ite, 1, kts:kte, na) :: an, ancuten
2391      real, dimension(its:ite, 1, kts:kte, nxtra) :: axtra2d
2392      real, dimension(its:ite, 1, kts:kte, 3) :: alpha2d
2393      real, dimension(its:ite, 1, kts:kte) :: t0,t1,t2,t3,t4,t5,t6,t7,t8,t9
2394      real, dimension(its:ite, 1, kts:kte) :: dn1,t00,t77,ssat,pn,wn,dz2d,dz2dinv,dbz2d,vzf2d
2395      real, dimension(its:ite, 1, na) :: xfall
2396      real, dimension(its:ite, 1) :: hailmax1d,hailmaxk1
2397      real, dimension(kts:kte, nproc) :: thproclocal
2398      integer, parameter :: nor = 0, ng = 0
2399      integer :: nx,ny,nz,ngs
2400      integer ix,jy,kz,i,j,k,il,n
2401      integer :: infdo
2402      real :: ssival, ssifac, t8s, t9s, qvapor
2403      integer :: ltemq
2404      double precision :: dp1
2405      integer :: jye, lnb
2406      integer :: imx,kmx
2407      real    :: dbzmx,refl
2408      integer :: vzflag0 = 0
2409      logical :: makediag
2410      real    :: dx1,dy1
2411       real, parameter :: cnin20 = 1.0e3
2412       real, parameter :: cnin10 = 5.0e1
2413       real, parameter :: cnin1a = 4.5
2414       real, parameter :: cnin2a = 12.96
2415       real, parameter :: cnin2b = 0.639
2417       double precision :: cwmass1,cwmass2
2418       double precision :: rwmass1,rwmass2
2419       double precision :: icemass1,icemass2
2420       double precision :: swmass1,swmass2
2421       double precision :: grmass1,grmass2
2422       double precision :: hlmass1,hlmass2
2423       double precision :: wvol5,wvol10
2424       real :: tmp,dv,dv1,tmpchg
2425       real :: rdt
2426       
2427       double precision :: dt1,dt2
2428       double precision :: timesed,timesed1,timesed2,timesed3, timegs, timenucond, timedbz,zmaxsed
2429       double precision :: timevtcalc,timesetvt
2430       
2431       logical :: f_cnatmp, f_cinatmp
2432       logical :: has_wetscav
2434       integer :: kediagloc
2435       integer :: iunit
2437       real :: ycent, y, emissrate, emissrate0, emissrate1, z, fac, factot
2438       real :: fach(kts:kte)
2439       
2440       logical, parameter :: debugdriver = .false.
2441       
2442       integer :: loopcnt, loopmax, outerloopcnt
2443       logical :: lastlooptmp
2446 ! -------------------------------------------------------------------
2449       rdt = 1.0/dtp
2450       
2451      IF ( debugdriver ) write(0,*) 'N2M: entering routine'
2453      flag_qndrop = .false.
2454      flag_qnifa = .false.
2455      flag_qnwfa = .false.
2456      flag_cnuf = .false.
2457      flag_ccn = .false.
2458      nwp_diagflag = .false.
2459      
2460      IF ( PRESENT ( nssl_progn ) ) flag_qndrop = nssl_progn
2461      IF ( present ( f_cnuf ) ) flag_cnuf = f_cnuf
2462      IF ( present ( nwp_diagnostics ) ) nwp_diagflag = ( nwp_diagnostics > 0 )
2464      IF ( present ( f_cn ) .and. present( cn ) ) THEN 
2465        flag_ccn = f_cn
2466      ELSEIF ( present( cn ) ) THEN
2467        flag_ccn = .true.
2468      ENDIF
2469      
2470      IF ( present( f_qi ) ) THEN
2471        flag_qi = f_qi
2472      ELSE
2473        IF ( ffrzs < 1.0 ) THEN
2474          flag_qi = .true.
2475        ELSE
2476          flag_qi = .false.
2477        ENDIF
2478      ENDIF
2479      
2480      IF ( .not. flag_qi .and. ffrzs < 1.0 ) ffrzs = 1.0
2482      
2483      IF ( PRESENT ( has_reqr ) ) has_reqr_local = has_reqr > 0
2484      IF ( PRESENT ( has_reqg ) ) has_reqg_local = has_reqg > 0
2485      IF ( PRESENT ( has_reqh ) ) has_reqh_local = has_reqh > 0
2486      
2487      loopmax = 1
2488      outerloopcnt = 1
2489      lastlooptmp = .true.
2490      IF ( present( ntmul ) .and. present( ntcnt ) .and. present( lastloop ) ) THEN
2491        loopmax = ntmul
2492        outerloopcnt = ntcnt
2493        lastlooptmp = lastloop
2494      ENDIF
2495           
2497          has_wetscav = .false.
2498          IF ( wrfchem_flag > 0 ) THEN
2499            IF ( PRESENT( wetscav_on ) ) THEN
2500              has_wetscav = wetscav_on
2501            ENDIF
2502          ENDIF
2504      IF ( present( f_cna ) ) THEN
2505        f_cnatmp = f_cna
2506      ELSE 
2507        f_cnatmp = .false.
2508      ENDIF
2510      IF ( present( f_cina ) ) THEN
2511        f_cinatmp = f_cina
2512      ELSE 
2513        f_cinatmp = .false.
2514      ENDIF
2515        
2516      IF ( present( vzf ) ) vzflag0 = 1
2517      
2518      IF ( present( ipelectmp ) ) THEN
2519        ipelec = ipelectmp
2520      ELSE
2521        ipelec = 0
2522      ENDIF
2523 !       IF ( present( dbz ) ) THEN
2524 !       DO jy = jts,jte
2525 !         DO kz = kts,kte
2526 !           DO ix = its,ite
2527 !             dbz(ix,kz,jy) = 0.0
2528 !           ENDDO
2529 !         ENDDO
2530 !       ENDDO
2531 !       ENDIF
2533      IF ( present( dx ) .and. present( dy ) ) THEN
2534         dx1 = dx
2535         dy1 = dy
2536      ELSE
2537         dx1 = 1.0
2538         dy1 = 1.0
2539      ENDIF
2541      
2542      makediag = .true.
2543      IF ( present( diagflag ) ) THEN
2544       makediag = diagflag .or. itimestep == 1
2545      ENDIF
2547      IF ( debugdriver ) write(0,*) 'N2M: makediag = ',makediag
2548      
2549      
2550      nx = ite-its+1
2551      ny = 1         ! set up as 2D slabs
2552      nz = kte-kts+1
2553      ngs = 64
2554      
2555      IF ( .not. flag_ccn ) THEN
2556        renucfrac = 1.0
2557      ENDIF
2559      
2560 ! set up CCN array and some other static local values
2561      IF ( itimestep == 1 .and. .not. invertccn .and.  flag_ccn ) THEN
2562      ! this is not needed for WRF 3.8 and later because it is done in physics_init, 
2563      ! but kept for backwards compatibility with earlier versions
2564       IF ( lccna > 1 .and. .not. ( present( cna ) .and. f_cnatmp ) ) THEN
2565       ! using cn array for cna and use background qccn for local cn array
2566         DO jy = jts,jte
2567          DO kz = kts,kte
2568           DO ix = its,ite
2569             cn(ix,kz,jy) = 0.0
2570           ENDDO
2571          ENDDO
2572         ENDDO
2574       ELSEIF ( cn((ite+its)/2,(kte+kts)/2,(jte+jts)/2) < 10.0 ) THEN ! initialize ccn if not already done
2575         DO jy = jts,jte
2576          DO kz = kts,kte
2577           DO ix = its,ite
2578             cn(ix,kz,jy) = qccn
2579           ENDDO
2580          ENDDO
2581         ENDDO
2582       ENDIF
2584        IF ( lccnuf > 1 .and. flag_cnuf .and. ccnuf > 1.0 ) THEN
2585 !       write(0,*) 'set cnuf1'
2586         DO jy = jts,jte
2587          DO kz = kts,kte
2588           DO ix = its,ite
2589             cnuf(ix,kz,jy) = qccnuf
2590           ENDDO
2591          ENDDO
2592         ENDDO
2593        ENDIF
2595      ENDIF
2597      IF ( itimestep == 1 .and. invertccn .and.  flag_ccn ) THEN
2598      ! this is not needed for WRF 3.8 and later because it is done in physics_init, 
2599      ! but kept for backwards compatibility with earlier versions
2600         DO jy = jts,jte
2601          DO kz = kts,kte
2602           DO ix = its,ite
2603             cn(ix,kz,jy) = 0.0
2604           ENDDO
2605          ENDDO
2606         ENDDO
2607       ENDIF
2608      
2609       IF ( invertccn .and.  flag_ccn ) THEN ! hack for WRF to convert activated ccn to unactivated, then do not have to 
2610                                               ! worry about initial and boundary conditions - they are zero
2611         DO jy = jts,jte
2612          DO kz = kts,kte
2613            DO ix = its,ite
2614              cn(ix,kz,jy) = Max( 0.0, qccn - cn(ix,kz,jy) )
2615            ENDDO
2616          ENDDO
2617        ENDDO
2619        IF ( lccnuf > 1 .and. flag_cnuf .and. ccnuf > 1.0 ) THEN
2620 !       write(0,*) 'set cnuf (invertccn)'
2621         DO jy = jts,jte
2622          DO kz = kts,kte
2623           DO ix = its,ite
2624              cnuf(ix,kz,jy) = qccnuf - cnuf(ix,kz,jy)
2625           ENDDO
2626          ENDDO
2627         ENDDO
2628        ENDIF
2629        
2630       ENDIF
2633 !     ENDIF ! itimestep == 1
2636 ! sedimentation settings
2638       infdo = 2
2639       
2640       IF ( infall .ne. 1 .or. iscfall .ge. 2 ) THEN
2641          infdo = 1
2642       ELSE
2643          infdo = 0
2644       ENDIF
2646       IF ( infall .ge. 3 .or. ipconc .ge. 6 ) THEN
2647          infdo = 2
2648       ENDIF
2649      
2651       IF ( present( HAILNCV ) .and. lhl < 1 ) THEN ! for WRF 3.1 compatibility
2652         HAILNCV(its:ite,jts:jte) = 0.
2653       ENDIF
2655       tke2d(:,:) = 0.0 ! initialize if not used
2657      lnb = Max(lh,lhl)+1 ! lnc
2658 !     IF ( lccn > 1 ) lnb = lccn
2660        jye = jte
2662      IF ( present( compdbz ) .and. makediag ) THEN
2663      DO jy = jts,jye
2664        DO ix = its,ite
2665         compdbz(ix,jy) = -3.0
2666        ENDDO
2667      ENDDO
2668      ENDIF
2670       zmaxsed = 0.0d0
2671       timevtcalc = 0.0d0
2672       timesetvt = 0.0d0
2673       timesed = 0.0d0
2674       timesed1 = 0.0d0
2675       timesed2 = 0.0d0
2676       timesed3 = 0.0d0
2677       timegs = 0.0d0
2678       timenucond = 0.0d0
2682      IF ( debugdriver ) write(0,*) 'N2M: jy loop 1, lhl,na = ',lhl,na,present(qhl)
2684           ancuten(its:ite,1,kts:kte,:) = 0.0
2685           thproclocal(:,:) = 0.0
2688      DO jy = jts,jye
2689      
2690 !     write(0,*) 'N2M: load an, jy,lccn = ',jy,lccn,qccn
2692      IF ( present( pcc2 ) .and. makediag ) THEN
2693          axtra2d(its:ite,1,kts:kte,:) = 0.0
2694      ENDIF
2696      IF ( nwp_diagflag ) THEN
2697         alpha2d(its:ite,1,kts:kte,1) = alphar
2698         alpha2d(its:ite,1,kts:kte,2) = alphah
2699         alpha2d(its:ite,1,kts:kte,3) = alphahl
2700      ENDIF
2703    ! copy from 3D array to 2D slab
2704    
2705        DO kz = kts,kte
2706         DO ix = its,ite
2707           an(ix,1,kz,lt) = th(ix,kz,jy)
2708           an(ix,1,kz,lv)   = qv(ix,kz,jy)
2709           an(ix,1,kz,lc)   = qc(ix,kz,jy)
2710           an(ix,1,kz,lr)   = qr(ix,kz,jy)
2711           IF ( flag_qi ) THEN
2712             an(ix,1,kz,li)   = qi(ix,kz,jy)
2713           ELSE
2714             an(ix,1,kz,li) = 0.0
2715           ENDIF
2716           an(ix,1,kz,ls)   = qs(ix,kz,jy)
2717           an(ix,1,kz,lh)   = qh(ix,kz,jy)
2718           IF ( lhl > 1 ) an(ix,1,kz,lhl)  = qhl(ix,kz,jy)
2719           IF ( lccn > 1 ) THEN
2720            IF ( is_aerosol_aware .and. flag_qnwfa ) THEN
2721             ! 
2722            ELSEIF ( flag_ccn ) THEN
2723              IF ( lccna > 1 .and. .not. ( present( cna ) .and. f_cnatmp ) ) THEN
2724                an(ix,1,kz,lccna) = cn(ix,kz,jy)
2725                an(ix,1,kz,lccn) = qccn ! cn(ix,kz,jy)
2726              ELSE
2727                an(ix,1,kz,lccn) = cn(ix,kz,jy)
2728              ENDIF
2729              IF ( i_uf_or_ccn > 0 .and. lccnuf > 1 ) THEN ! UF ccn are extra regular ccn
2730                an(ix,1,kz,lccn) = an(ix,1,kz,lccn) + cnuf(ix,kz,jy)
2731              ENDIF
2732            ELSE
2733             IF ( lccna == 0 .and. ( .not. f_cnatmp ) ) THEN
2734               an(ix,1,kz,lccn) = qccn - ccw(ix,kz,jy)
2735             ELSE
2736               an(ix,1,kz,lccn) = qccn 
2737             ENDIF
2738            
2739            ENDIF
2740           ENDIF
2742           IF ( lccnuf > 0 .and. flag_cnuf ) THEN
2743             IF ( i_uf_or_ccn == 0 ) THEN ! UF are UF
2744               an(ix,1,kz,lccnuf) = Max(0.0, cnuf(ix,kz,jy) )
2745             ELSE ! UF were added to lccn
2746               an(ix,1,kz,lccnuf) = 0.0
2747             ENDIF
2748           ENDIF
2750           IF ( lccna > 1 ) THEN
2751             IF ( present( cna ) .and. f_cnatmp ) THEN
2752               an(ix,1,kz,lccna) = cna(ix,kz,jy)
2753             ENDIF
2754           ENDIF
2756           IF ( lcina > 1 ) THEN
2757             IF ( present( cni ) .and. f_cinatmp ) THEN
2758               an(ix,1,kz,lcina) = cni(ix,kz,jy)
2759             ENDIF
2760           ENDIF
2761           
2762           IF ( ipconc >= 5 ) THEN
2763              an(ix,1,kz,lnc)  = ccw(ix,kz,jy)
2764           IF ( constccw > 0.0 ) THEN
2765             an(ix,1,kz,lnc)  = constccw
2766           ENDIF
2767           an(ix,1,kz,lnr)  = crw(ix,kz,jy)
2768           IF ( present( cci ) ) THEN
2769             an(ix,1,kz,lni)  = cci(ix,kz,jy)
2770           ELSE
2771             an(ix,1,kz,lni) = 0.0
2772           ENDIF
2773           an(ix,1,kz,lns)  = csw(ix,kz,jy)
2774           an(ix,1,kz,lnh)  = chw(ix,kz,jy)
2775           IF ( lhl > 1 ) an(ix,1,kz,lnhl) = chl(ix,kz,jy)
2776           ENDIF
2777           IF ( lvh > 0 ) an(ix,1,kz,lvh)  = vhw(ix,kz,jy)
2778           IF ( lvhl > 0 .and. present( vhl ) ) an(ix,1,kz,lvhl)  = vhl(ix,kz,jy)
2780           IF ( ipconc >= 6 ) THEN
2781             IF ( lzr > 0 )  an(ix,1,kz,lzr)  = zrw(ix,kz,jy)*zscale
2782             IF ( lzh > 0 )  an(ix,1,kz,lzh)  = zhw(ix,kz,jy)*zscale
2783             IF ( lzhl > 0 ) an(ix,1,kz,lzhl) = zhl(ix,kz,jy)*zscale
2784           ENDIF
2785           
2788         ENDDO
2789        ENDDO
2790        
2791        DO kz = kts,kte
2792         DO ix = its,ite
2794           
2795           t0(ix,1,kz) = th(ix,kz,jy)*pii(ix,kz,jy) ! temperature (Kelvin)
2796           t00(ix,1,kz) = 380.0/p(ix,kz,jy)
2797           t77(ix,1,kz) = pii(ix,kz,jy)
2798           dbz2d(ix,1,kz) = 0.0
2799           vzf2d(ix,1,kz) = 0.0
2800         ENDDO
2801        ENDDO
2802        
2803        DO ix = its,ite
2804          RAINNCV(ix,jy) = 0.0
2805          IF ( present( GRPLNCV ) ) GRPLNCV(ix,jy) = 0.0
2806          IF ( present( HAILNCV ) ) HAILNCV(ix,jy) = 0.0
2807          IF ( present( SNOWNCV ) ) SNOWNCV(ix,jy) = 0.0
2808        ENDDO
2810       DO loopcnt = 1,loopmax
2811        
2812        DO kz = kts,kte
2813         DO ix = its,ite
2815           
2816           t1(ix,1,kz) = 0.0
2817           t2(ix,1,kz) = 0.0
2818           t3(ix,1,kz) = 0.0
2819           t4(ix,1,kz) = 0.0
2820           t5(ix,1,kz) = 0.0
2821           t6(ix,1,kz) = 0.0
2822           t7(ix,1,kz) = 0.0
2823           t8(ix,1,kz) = 0.0
2824           t9(ix,1,kz) = 0.0
2826           pn(ix,1,kz) = p(ix,kz,jy)
2827           wn(ix,1,kz) = w(ix,kz,jy)
2828           dn1(ix,1,kz) = dn(ix,kz,jy)
2829 !          wmax = Max(wmax,wn(ix,1,kz))
2830           dz2d(ix,1,kz) = dz(ix,kz,jy)
2831           dz2dinv(ix,1,kz) = 1./dz(ix,kz,jy)
2832           
2833          ltemq = Int( (t0(ix,1,kz)-163.15)/fqsat+1.5 )
2834          ltemq = Min( nqsat, Max(1,ltemq) )
2836 ! saturation mixing ratio
2838       t8s = t00(ix,1,kz)*tabqvs(ltemq)  !saturation mixing ratio wrt water
2839       t9s = t00(ix,1,kz)*tabqis(ltemq)  !saturation mixing ratio wrt ice
2842 !  calculate rate of nucleation
2844       ssival = Min(t8s,max(an(ix,1,kz,lv),0.0))/t9s  ! qv/qvi
2847       if ( ssival .gt. 1.0 ) then
2849       IF ( icenucopt == 1 ) THEN
2851       if ( t0(ix,1,kz).le.268.15 ) then
2853        dp1 = dn1(ix,1,kz)/rho00*cnin20*exp( Min( 57.0 ,(cnin2a*(ssival-1.0)-cnin2b) ) )
2854        t7(ix,1,kz) = Min(dp1, 1.0d30)
2855       end if
2858 !   Default value of imeyers5 turns off nucleation by Meyer at higher temperatures
2859 !  This is really from Ferrier (1994), eq. 4.31 - 4.34
2860       IF ( imeyers5 ) THEN
2861       if ( t0(ix,1,kz).lt.tfr .and. t0(ix,1,kz).gt.268.15 ) then
2862       qvapor = max(an(ix,1,kz,lv),0.0)
2863       ssifac = 0.0
2864       if ( (qvapor-t9s) .gt. 1.0e-5 ) then
2865       if ( (t8s-t9s) .gt. 1.0e-5 ) then
2866       ssifac = (qvapor-t9s) /(t8s-t9s)
2867       ssifac = ssifac**cnin1a
2868       end if
2869       end if
2870       t7(ix,1,kz) = dn1(ix,1,kz)/rho00*cnin10*ssifac*exp(-(t0(ix,1,kz)-tfr)*bta1)
2871       end if
2872       ENDIF
2873       
2874 !       t7max = Max(t7max,  t7(ix,1,kz) )
2876       ELSEIF ( icenucopt == 2 ) THEN ! Thompson/Cooper; Note Thompson 2004 has constants of
2877                                      ! 0.005 and 0.304 because the line function was estimated from Cooper plot
2878                                      ! Here, the fit line values from Cooper 1986 are converted. Very little difference 
2879                                      ! in practice
2880       
2881         t7(ix,1,kz) = 1000.*0.00446684*exp(0.3108*(273.16 - Max(233.0, t0(ix,1,kz) ) ) ) ! factor of 1000 to convert L**-1 to m**-3
2883 !        write(0,*) 'Cooper t7,ssival = ',ix,kz,t7(ix,1,kz),ssival
2884       
2885       ELSEIF ( icenucopt == 3 ) THEN ! Phillips (Meyers/DeMott)
2887       if ( t0(ix,1,kz).le.268.15 .and.  t0(ix,1,kz) > 243.15 ) then ! Meyers with factor of Psi=0.06
2888         
2889        dp1 = 0.06*cnin20*exp( Min( 57.0 ,(cnin2a*(ssival-1.0)-cnin2b) ) )
2890        t7(ix,1,kz) = Min(dp1, 1.0d30)
2891       elseif ( t0(ix,1,kz) <= 243.15 ) then ! Phillips estimate of DeMott et al (2003) data
2892        dp1 = 1000.*( exp( Min( 57.0 ,cnin2a*(ssival-1.1) ) ) )**0.3
2893        t7(ix,1,kz) = Min(dp1, 1.0d30)
2894       
2895       end if
2897       ELSEIF ( icenucopt == 4 ) THEN ! DeMott 2010
2899         IF ( t0(ix,1,kz) < 268.16 .and.  t0(ix,1,kz) > 223.15 .and. ssival > 1.001 ) THEN ! 
2900       
2901         ! a = 0.0000594, b = 3.33, c = 0.0264, d = 0.0033,
2902         ! nint = a*(-Tc)**b * naer**(c*(-Tc) + d)
2903         ! nint has units of per (standard) liter, so mult by 1.e3 and scale by dn/rho00
2904         ! naer needs units of cm**-3, so mult by 1.e-6
2905         
2906         !  dp1 = 1.e3*0.0000594*(273.16 - t0(ix,1,kz))**3.33 * (1.e-6*cin*dn(ix,1,kz))**(0.0264*(273.16 - t0(ix,1,kz)) + 0.0033)
2907             tmp = 1.e-6*naer
2908           dp1 = 1.e3*dn1(ix,1,kz)/rho00*0.0000594*(273.16 - t0(ix,1,kz))**3.33 * tmp**(0.0264*(273.16 - t0(ix,1,kz)) + 0.0033)
2909           t7(ix,1,kz) = Min(dp1, 1.0d30)
2910       
2911         ELSE
2912        !   t7(ix,1,kz) = 0.0
2913         ENDIF
2914       
2915       ENDIF ! icenucopt
2919       end if ! ( ssival .gt. 1.0 )
2922         ENDDO ! ix
2923        ENDDO ! kz
2925       IF ( wrfchem_flag > 0 ) THEN
2926           IF ( has_wetscav ) THEN
2927             IF ( PRESENT( rainprod ) ) rainprod2d(its:ite,kts:kte) = 0
2928             IF ( PRESENT( evapprod ) ) evapprod2d(its:ite,kts:kte) = 0
2929           ENDIF
2930       ENDIF
2931          
2933    ! transform from number mixing ratios to number conc.
2934      
2935     IF ( loopcnt == 1 ) THEN
2936      DO il = lnb,na
2937        IF ( denscale(il) == 1 ) THEN
2938          DO kz = kts,kte
2939           DO ix = its,ite
2940            an(ix,1,kz,il) = an(ix,1,kz,il)*dn1(ix,1,kz) ! dn(ix,kz,jy)
2941           ENDDO
2942          ENDDO
2943        ENDIF
2944      ENDDO ! il
2945     ENDIF
2947         
2948 ! sedimentation
2949       xfall(:,:,:) = 0.0
2950        
2952 !      IF ( .true. ) THEN
2955 ! #ifndef CM1
2956 ! for real cases when hydrometeor mixing ratios have been initialized without concentrations
2957        IF ( itimestep == 1 .and. ipconc > 0 .and. loopcnt == 1 ) THEN
2958          call calcnfromq(nx,ny,nz,an,na,nor,nor,dn1)
2959        ENDIF
2960 ! #endif
2962       IF ( present(cu_used) .and.         &
2963            ( present( qrcuten ) .or. present( qscuten ) .or.  &
2964              present( qicuten ) .or. present( qccuten ) ) ) THEN !{
2966        IF ( cu_used == 1 ) THEN !{
2967        DO kz = kts,kte
2968         DO ix = its,ite
2970          IF ( present( qrcuten ) ) ancuten(ix,1,kz,lr) = dtp*qrcuten(ix,kz,jy)
2971          IF ( present( qscuten ) ) ancuten(ix,1,kz,ls) = dtp*qscuten(ix,kz,jy)
2972          IF ( present( qicuten ) ) ancuten(ix,1,kz,li) = dtp*qicuten(ix,kz,jy)
2973          IF ( present( qccuten ) ) ancuten(ix,1,kz,lc) = dtp*qccuten(ix,kz,jy)
2974          
2975         ENDDO
2976        ENDDO
2977        
2978          call calcnfromcuten(nx,ny,nz,ancuten,an,na,nor,nor,dn1)
2980        DO kz = kts,kte
2981         DO ix = its,ite
2984           IF ( ipconc >= 6 ) THEN
2985 !            IF ( lzr > 0 )  an(ix,1,kz,lzr)  = an(ix,1,kz,lzr) + ancuten(ix,1,kz,lzr) 
2986           ENDIF
2987          
2988         ENDDO
2989        ENDDO
2990        
2991        ENDIF !}
2992        
2993       ENDIF !}
2994       
2995       
2998       call sediment1d(dtp,nx,ny,nz,an,na,nor,nor,xfall,dn1,dz2d,dz2dinv, &
2999      &                    t0,t7,infdo,jy,its,jts &
3000      &   ,timesed1,timesed2,timesed3,zmaxsed,timesetvt)
3003 ! copy xfall to appropriate places...
3005      IF ( debugdriver ) write(0,*) 'N2M: end sediment, jy = ',jy
3007        DO ix = its,ite
3008          IF ( lhl > 1 ) THEN
3009          RAINNCV(ix,jy) = RAINNCV(ix,jy) + &
3010                           dtp*dn1(ix,1,1)*(xfall(ix,1,lr) + xfall(ix,1,ls)*1000./xdn0(lr) + &
3011               &            xfall(ix,1,lh)*1000./xdn0(lr) + xfall(ix,1,lhl)*1000./xdn0(lr) )
3012          ELSE
3013          RAINNCV(ix,jy) = RAINNCV(ix,jy) + &
3014                            dtp*dn1(ix,1,1)*(xfall(ix,1,lr) + xfall(ix,1,ls)*1000./xdn0(lr) + &
3015               &            xfall(ix,1,lh)*1000./xdn0(lr) )
3016          ENDIF
3017          IF ( present ( rainncw2 ) ) THEN ! rain only
3018            rainncw2(ix,jy) =  rainncw2(ix,jy) +  dtp*dn1(ix,1,1)*xfall(ix,1,lr)
3019          ENDIF
3020          IF ( present ( rainnci2 ) ) THEN ! ice only
3021            IF ( lhl > 1 ) THEN
3022              rainnci2(ix,jy) =rainnci2(ix,jy) + dtp*dn1(ix,1,1)*(xfall(ix,1,ls)*1000./xdn0(lr) + &
3023      &            xfall(ix,1,lh)*1000./xdn0(lr) + xfall(ix,1,lhl)*1000./xdn0(lr) )
3024            ELSE
3025              rainnci2(ix,jy) = rainnci2(ix,jy) + dtp*dn1(ix,1,1)*(xfall(ix,1,ls)*1000./xdn0(lr) + &
3026      &            xfall(ix,1,lh)*1000./xdn0(lr) )
3027            ENDIF
3028          ENDIF
3029          IF ( present( SNOWNCV ) ) SNOWNCV(ix,jy) = SNOWNCV(ix,jy) + dtp*dn1(ix,1,1)*xfall(ix,1,ls)*1000./xdn0(lr)
3030          IF ( present( GRPLNCV ) ) THEN 
3031            IF ( lhl > 1 .and. .not. present( HAILNC) ) THEN ! if no separate hail accum, then add to graupel
3032              GRPLNCV(ix,jy) = GRPLNCV(ix,jy) + dtp*dn1(ix,1,1)*(xfall(ix,1,lh) + xfall(ix,1,lhl)) *1000./xdn0(lr)
3033            ELSE
3034              GRPLNCV(ix,jy) = GRPLNCV(ix,jy) + dtp*dn1(ix,1,1)*xfall(ix,1,lh)*1000./xdn0(lr)
3035            ENDIF
3036          ENDIF
3037          IF ( loopcnt == loopmax ) RAINNC(ix,jy)  = RAINNC(ix,jy) + RAINNCV(ix,jy)
3039          IF ( present (SNOWNC) .and. present (SNOWNCV) .and. loopcnt == loopmax ) THEN
3040            SNOWNC(ix,jy)  = SNOWNC(ix,jy) + SNOWNCV(ix,jy)
3041          ENDIF
3042          IF ( lhl > 1 ) THEN
3043 !#ifdef CM1
3044 !           IF ( .true. ) THEN
3045 !#else
3046            IF ( present( HAILNC ) ) THEN
3047 !#endif
3048              HAILNCV(ix,jy) = dtp*dn1(ix,1,1)*xfall(ix,1,lhl)*1000./xdn0(lr)
3049              IF ( loopcnt == loopmax ) HAILNC(ix,jy)  = HAILNC(ix,jy) + HAILNCV(ix,jy)
3050 !           ELSEIF ( present( GRPLNCV ) ) THEN ! if no separate hail accum, then add to graupel
3051 !             GRPLNCV(ix,jy) = GRPLNCV(ix,jy) + dtp*dn1(ix,1,1)*xfall(ix,1,lhl)*1000./xdn0(lr)
3052            ENDIF
3053          ENDIF
3054          IF ( present( GRPLNCV ) .and. loopcnt == loopmax ) THEN
3055            GRPLNC(ix,jy)  = GRPLNC(ix,jy) + GRPLNCV(ix,jy)
3056          ENDIF
3057         IF ( present( SR ) .and. present (SNOWNCV) .and. present(GRPLNCV) .and. loopcnt == loopmax ) THEN
3058          IF ( present( HAILNC ) ) THEN
3059            SR(ix,jy)      = (SNOWNCV(ix,jy)+HAILNCV(ix,jy)+GRPLNCV(ix,jy))/(RAINNCV(ix,jy)+1.e-12)
3060          ELSE
3061            SR(ix,jy)      = (SNOWNCV(ix,jy)+GRPLNCV(ix,jy))/(RAINNCV(ix,jy)+1.e-12)
3062          ENDIF
3063         ENDIF
3064        ENDDO
3065        
3066 !      ENDIF ! .false.
3068       IF ( isedonly /= 1 ) THEN
3069    ! call nssl_2mom_gs: main gather-scatter routine to calculate microphysics
3071      IF ( debugdriver ) write(0,*) 'N2M: gs, jy = ',jy
3072 !      IF ( isedonly /= 2 ) THEN
3075       call nssl_2mom_gs   &
3076      &  (nx,ny,nz,na,jy   &
3077      &  ,nor,nor          &
3078      &  ,dtp,dz2d       &
3079      &  ,t0,t1,t2,t3,t4,t5,t6,t7,t8,t9     &
3080      &  ,an,dn1,t77                        &
3081      &  ,pn,wn,0                           &
3082      &  ,t00,t77,                          &
3083      &   ventr,ventc,c1sw,1,ido,           &
3084      &   xdnmx,xdnmn,                      &
3085 !     &   ln,ipc,lvol,lz,lliq,              &
3086      &   cdx,                              &
3087      &   xdn0,dbz2d,tke2d,                 &
3088      &   thproclocal,nproc,dx1,dy1,ngs,    &
3089      &   timevtcalc,axtra2d, makediag        &
3090      &   ,has_wetscav, rainprod2d, evapprod2d, alpha2d  &
3091      &   ,elec2,its,ids,ide,jds,jde          &
3092      & )
3098    ENDIF ! isedonly /= 1
3099    
3100  ! droplet nucleation/condensation/evaporation
3101    IF ( .true. ) THEN
3102    CALL NUCOND    &
3103      &  (nx,ny,nz,na,jy & 
3104      &  ,nor,nor,dtp,nx  &
3105      &  ,dz2d & 
3106      &  ,t0,t9 & 
3107      &  ,an,dn1,t77 & 
3108      &  ,pn,wn &
3109      &  ,ngs   &
3110      &  ,axtra2d, makediag  &
3111      &  ,ssat,t00,t77,flag_qndrop)
3115    ENDIF
3120      ENDDO ! loopcnt=1,loopmax
3121      IF ( present( pcc2 ) .and. makediag ) THEN
3122          DO kz = kts,kte
3123           DO ix = its,ite
3124 ! example of using the 'axtra2d' array to get rates out of the microphysics routine for output.
3125 ! Search for 'axtra' to find example code below
3126 !            pcc2(ix,kz,jy)    = axtra2d(ix,1,kz,1)
3127           ENDDO
3128          ENDDO
3129      ENDIF
3132 ! compute diagnostic S-band reflectivity if needed
3133      IF ( present( dbz ) .and. makediag .and. lastlooptmp ) THEN
3134    ! calc dbz
3135       
3136       IF ( .true. ) THEN
3137       IF ( present(ke_diag) ) THEN
3138         kediagloc = ke_diag
3139       ELSE
3140         kediagloc = nz
3141       ENDIF
3142       call radardd02(nx,ny,nz,nor,na,an,t0,         &
3143      &    dbz2d,dn1,nz,cnoh,rho_qh,ipconc,kediagloc, 0)
3144       ENDIF ! .false.
3146      
3147        DO kz = kts,kediagloc ! kte
3148         DO ix = its,ite
3149          dbz(ix,kz,jy) = dbz2d(ix,1,kz)
3150          IF ( present( vzf ) ) THEN
3151            vzf(ix,kz,jy) = vzf2d(ix,1,kz)
3152            IF ( dbz2d(ix,1,kz) <= 0.0 ) THEN
3153              vzf(ix,kz,jy) = 0.0
3154            ELSEIF ( dbz2d(ix,1,kz) <= 15.0 ) THEN
3155              refl = 10**(0.1*dbz2d(ix,1,kz))
3156              vzf(ix,kz,jy) = Min( vzf2d(ix,1,kz), 2.6 * Max(0.0,refl)**0.107 * (1.2/dn1(ix,1,kz))**0.4 )
3157            ENDIF
3158          ENDIF
3159           IF ( present( compdbz ) ) THEN
3160             compdbz(ix,jy) = Max( compdbz(ix,jy), dbz2d(ix,1,kz) )
3161           ENDIF
3162         ENDDO
3163        ENDDO
3165        ENDIF
3169 ! Following Greg Thompson, calculation for effective radii. Used by RRTMG LW/SW schemes if enabled in module_physics_init.F
3170       IF ( present( has_reqc ).and. present( has_reqi ) .and. present( has_reqs ) .and.  &
3171            present( re_cloud ).and. present( re_ice ) .and. present( re_snow )    .and.  &
3172            lastlooptmp) THEN
3173        IF ( has_reqc.ne.0 .or. has_reqi.ne.0 .or. has_reqs.ne.0) THEN
3174          DO kz = kts,kte
3175           DO ix = its,ite
3176              re_cloud(ix,kz,jy)  = 2.51E-6
3177              re_ice(ix,kz,jy)    = 10.01E-6
3178              re_snow(ix,kz,jy)   = 25.E-6
3179              t1(ix,1,kz) = 2.51E-6
3180              t2(ix,1,kz) = 10.01E-6
3181              t3(ix,1,kz) = 25.E-6
3182              t4(ix,1,kz) = 50.e-6
3183           ENDDO
3184          ENDDO
3187           call calc_eff_radius   &
3188      &         (nx,ny,nz,na,jy & 
3189      &          ,nor,nor & 
3190      &          ,t1=t1,t2=t2,t3=t3,t4=t4,t5=t5,t6=t6 &
3191      &          ,f_t4=has_reqr_local,f_t5=has_reqg_local, f_t6=has_reqh_local  & 
3192      &          ,an=an,dn=dn1 )
3194         DO kz = kts,kte
3195           DO ix = its,ite
3196              re_cloud(ix,kz,jy) = MAX(2.51E-6, MIN(t1(ix,1,kz), 50.E-6))
3197              re_ice(ix,kz,jy)   = MAX(10.01E-6, MIN(t2(ix,1,kz), 125.E-6))
3198              re_snow(ix,kz,jy)  = MAX(25.E-6, MIN(t3(ix,1,kz), 999.E-6))
3199              ! check for case where snow needs to be treated as cloud ice (for rrtmg radiation)
3200              IF ( .not. present(qi) ) re_ice(ix,kz,jy)  = MAX(10.E-6, MIN(t3(ix,1,kz), 125.E-6))
3201           ENDDO
3202          ENDDO
3204        IF ( present(has_reqr) .and. present( re_rain ) ) THEN
3205          IF ( has_reqr /= 0 ) THEN
3206          DO kz = kts,kte
3207            DO ix = its,ite
3208             re_rain(ix,kz,jy)  = MAX(50.E-6, MIN(t4(ix,1,kz), 2999.E-6))
3209            ENDDO
3210          ENDDO
3211          ENDIF
3212        ENDIF
3214        IF ( present(has_reqg) .and. present( re_graup ) ) THEN
3215          IF ( has_reqg /= 0 ) THEN
3216          DO kz = kts,kte
3217            DO ix = its,ite
3218             re_graup(ix,kz,jy)  = MAX(50.E-6, MIN(t5(ix,1,kz), 10.E-3))
3219            ENDDO
3220          ENDDO
3221          ENDIF
3222        ENDIF
3224        IF ( present(has_reqh) .and. present( re_hail ) ) THEN
3225          IF ( has_reqh /= 0 ) THEN
3226          DO kz = kts,kte
3227            DO ix = its,ite
3228             re_hail(ix,kz,jy)  = MAX(50.E-6, MIN(t5(ix,1,kz), 40.E-3))
3229            ENDDO
3230          ENDDO
3231          ENDIF
3232        ENDIF
3233        
3234          ENDIF
3235         ENDIF
3238      IF ( present( hail_maxk1 ) .and. present( hail_max2d ) .and. nwp_diagflag ) THEN
3239          DO ix = its,ite
3240             hailmax1d(ix,1) = hail_max2d(ix,jy)
3241             hailmaxk1(ix,1) = hail_maxk1(ix,jy)
3242          ENDDO
3244          call hailmaxd(dtp,nx,ny,nz,an,na,nor,nor,alpha2d,dn1,   &
3245                           hailmax1d,hailmaxk1,1 )
3247          DO ix = its,ite
3248            hail_max2d(ix,jy) = hailmax1d(ix,1)
3249            hail_maxk1(ix,jy) = hailmaxk1(ix,1)
3250          ENDDO
3251 !       ENDIF
3252      ENDIF
3253    
3254 ! transform concentrations back to mixing ratios
3255      DO il = lnb,na
3256       IF ( denscale(il) == 1 ) THEN
3257        DO kz = kts,kte
3258         DO ix = its,ite
3259          an(ix,1,kz,il) = an(ix,1,kz,il)/dn1(ix,1,kz) ! dn(ix,kz,jy)
3260         ENDDO
3261        ENDDO
3262       ENDIF
3263      ENDDO ! il
3264    
3265    ! copy 2D slabs back to 3D
3267    
3268        DO kz = kts,kte
3269         DO ix = its,ite
3270         
3271          th(ix,kz,jy)  = an(ix,1,kz,lt)
3273          qv(ix,kz,jy)  = an(ix,1,kz,lv)
3274          qc(ix,kz,jy)  = an(ix,1,kz,lc)
3275          qr(ix,kz,jy)  = an(ix,1,kz,lr)
3276          IF ( flag_qi ) qi(ix,kz,jy)  = an(ix,1,kz,li)
3277          qs(ix,kz,jy)  = an(ix,1,kz,ls)
3278          qh(ix,kz,jy)  = an(ix,1,kz,lh)
3279          IF ( lhl > 1 ) qhl(ix,kz,jy) = an(ix,1,kz,lhl)
3280          
3281          IF ( lccn > 1 .and. is_aerosol_aware .and. flag_qnwfa ) THEN
3282            ! not used here
3283          ELSEIF ( flag_ccn .and. lccn > 1 .and. .not. flag_qndrop) THEN
3284             IF ( lccna > 1 .and. .not. ( present( cna ) .and. f_cnatmp ) ) THEN
3285               cn(ix,kz,jy) = Max(0.0, an(ix,1,kz,lccna) )
3286             ELSE
3287               cn(ix,kz,jy) = an(ix,1,kz,lccn)
3288             ENDIF
3289          ENDIF
3290          IF ( lccna > 1 ) THEN
3291            IF ( present( cna ) .and. f_cnatmp ) THEN
3292               cna(ix,kz,jy) = Max(0.0, an(ix,1,kz,lccna) )
3293            ENDIF
3294          ENDIF
3296          IF ( lcina > 1 ) THEN
3297            IF ( present( cni ) .and. f_cinatmp ) THEN
3298               cni(ix,kz,jy) = Max(0.0, an(ix,1,kz,lcina) )
3299            ENDIF
3300          ENDIF
3302          IF ( lccnuf > 0 .and. flag_cnuf ) THEN
3303            IF ( i_uf_or_ccn > 0 ) THEN ! UF are ccn and lccnuf is zero, so put cnuf into lccnuf to do decay
3304              an(ix,1,kz,lccnuf) = Max(0.0, cnuf(ix,kz,jy) )
3305            ENDIF
3306            IF ( decayufccn ) THEN
3307              IF ( an(ix,1,kz,lccnuf) > ufbackground ) THEN
3308                an(ix,1,kz,lccnuf) = an(ix,1,kz,lccnuf) - (an(ix,1,kz,lccnuf) - &
3309                             ufbackground)*(1.0 - exp(-dtp/ufccntimeconst))
3310              ENDIF
3311            ENDIF
3312            cnuf(ix,kz,jy) = an(ix,1,kz,lccnuf)
3313          ENDIF
3317          IF ( ipconc >= 5 ) THEN
3319           ccw(ix,kz,jy) = an(ix,1,kz,lnc)
3320           crw(ix,kz,jy) = an(ix,1,kz,lnr)
3321           IF ( present( cci ) ) cci(ix,kz,jy) = an(ix,1,kz,lni)
3322           csw(ix,kz,jy) = an(ix,1,kz,lns)
3323           chw(ix,kz,jy) = an(ix,1,kz,lnh)
3324           IF ( lhl > 1 ) chl(ix,kz,jy) = an(ix,1,kz,lnhl)
3325          ENDIF
3327          IF ( ipconc >= 6 ) THEN
3328             IF ( lzr > 0 )  zrw(ix,kz,jy) = an(ix,1,kz,lzr) *zscaleinv
3329             IF ( lzh > 0 )  zhw(ix,kz,jy) = an(ix,1,kz,lzh) *zscaleinv
3330             IF ( lzhl > 0 ) zhl(ix,kz,jy) = an(ix,1,kz,lzhl)*zscaleinv
3331          ENDIF
3335          IF ( lvh > 0 )  vhw(ix,kz,jy) = an(ix,1,kz,lvh)
3336          IF ( lvhl > 0 .and. present( vhl ) ) vhl(ix,kz,jy) = an(ix,1,kz,lvhl)
3338 #if ( WRF_CHEM == 1 )
3339          IF ( has_wetscav ) THEN
3340            IF ( loopmax > 1 ) THEN
3341              ! wrferror not supported
3342            ENDIF
3343            IF ( PRESENT( rainprod ) ) rainprod(ix,kz,jy) = rainprod2d(ix,kz)
3344            IF ( PRESENT( evapprod ) ) evapprod(ix,kz,jy) = evapprod2d(ix,kz)
3345          ENDIF
3346 #endif
3348         ENDDO
3349        ENDDO
3352      ENDDO ! jy
3353      
3354      
3356      
3357       IF (  invertccn .and. flag_ccn ) THEN ! hack to convert unactivated ccn  back to activated
3358         DO jy = jts,jte
3359          DO kz = kts,kte
3360            DO ix = its,ite
3361              cn(ix,kz,jy) = Max( 0.0, qccn - cn(ix,kz,jy) )
3362            ENDDO
3363          ENDDO
3364        ENDDO
3365        ENDIF
3367        IF ( lccnuf > 1 .and. flag_cnuf .and. ccnuf > 1.0 ) THEN
3368         DO jy = jts,jte
3369          DO kz = kts,kte
3370           DO ix = its,ite
3371             cnuf(ix,kz,jy) = qccnuf - cnuf(ix,kz,jy)
3372           ENDDO
3373          ENDDO
3374         ENDDO
3375        ENDIF
3382   RETURN
3383 END SUBROUTINE nssl_2mom_driver
3385 ! #####################################################################
3386 ! #####################################################################
3388       REAL FUNCTION GAMMA_SP(xx)
3390       implicit none
3391       real xx
3392       integer j
3394 ! Double precision ser,stp,tmp,x,y,cof(6)
3396       real*8 ser,stp,tmp,x,y,cof(6)
3397       SAVE cof,stp
3398       DATA cof,stp/76.18009172947146d+0,  &
3399      &            -86.50532032941677d0,   &
3400      &             24.01409824083091d0,   &
3401      &             -1.231739572450155d0,  &
3402      &              0.1208650973866179d-2,&
3403      &             -0.5395239384953d-5,   &
3404      &              2.5066282746310005d0/
3406       IF ( xx <= 0.0 ) THEN
3407         write(0,*) 'Argument to gamma must be > 0!! xx = ',xx
3408         STOP
3409       ENDIF
3410       
3411       x = xx
3412       y = x
3413       tmp = x + 5.5d0
3414       tmp = (x + 0.5d0)*Log(tmp) - tmp
3415       ser = 1.000000000190015d0
3416       DO j=1,6
3417         y = y + 1.0d0
3418         ser = ser + cof(j)/y
3419       END DO
3420       gamma_sp = Exp(tmp + log(stp*ser/x))
3422       RETURN
3423       END FUNCTION GAMMA_SP
3425 ! #####################################################################
3427       DOUBLE PRECISION FUNCTION GAMMA_DPR(x)
3428       ! dp gamma with real input
3429         implicit none
3430         real :: x
3431         double precision :: xx
3432         
3433         xx = x
3434         
3435         gamma_dpr = gamma_dp(xx)
3436         
3437         return
3438         end FUNCTION GAMMA_DPR
3439         
3443 ! #####################################################################
3445         real function GAMXINF(A1,X1)
3447 !       ===================================================
3448 !       Purpose: Compute the incomplete gamma function
3449 !                from x to infinity
3450 !       Input :  a   --- Parameter ( a  170 )
3451 !                x   --- Argument 
3452 !       Output:  GIM --- gamma(a,x) t=x,Infinity
3453 !       Routine called: GAMMA for computing gamma(x)
3454 !       ===================================================
3456 !        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3457         implicit none
3458         real :: a1,x1
3459         double precision :: xam,dlog,s,r,ga,t0,a,x
3460         integer :: k
3461         double precision :: gin, gim
3462         
3463         a = a1
3464         x = x1
3465         IF ( x1 <= 0.0 ) THEN
3466            gamxinf = GAMMA_SP(A1)
3467            return
3468         ENDIF
3469         XAM=-X+A*DLOG(X)
3470         IF (XAM.GT.700.0.OR.A.GT.170.0) THEN
3471            WRITE(*,*)'a and/or x too large'
3472            STOP
3473         ENDIF
3474         IF (X.EQ.0.0) THEN
3475            GIN=0.0
3476            GIM = GAMMA_SP(A1)
3477         ELSE IF (X.LE.1.0+A) THEN
3478            S=1.0D0/A
3479            R=S
3480            DO 10 K=1,60
3481               R=R*X/(A+K)
3482               S=S+R
3483               IF (DABS(R/S).LT.1.0D-15) GO TO 15
3484 10         CONTINUE
3485 15         GIN=DEXP(XAM)*S
3486            ga = GAMMA_SP(A1)
3487            GIM=GA-GIN
3488         ELSE IF (X.GT.1.0+A) THEN
3489            T0=0.0D0
3490            DO 20 K=60,1,-1
3491               T0=(K-A)/(1.0D0+K/(X+T0))
3492 20         CONTINUE
3493            GIM=DEXP(XAM)/(X+T0)
3494 !           GA = GAMMA_SP(A1)
3495 !           GIN=GA-GIM
3496         ENDIF
3497         
3498         gamxinf = GIM
3499         return
3500         END function GAMXINF
3502 ! #####################################################################
3504         double precision function GAMXINFDP(A1,X1)
3506 !       ===================================================
3507 !       Purpose: Compute the incomplete gamma function
3508 !                from x to infinity
3509 !       Input :  a   --- Parameter ( a < 170 )
3510 !                x   --- Argument 
3511 !       Output:  GIM --- Gamma(a,x) t=x,Infinity
3512 !       Routine called: GAMMA for computing gamma_dp(x)
3513 !       ===================================================
3515 !        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3516         implicit none
3517         real :: a1,x1
3518 ! dont declare gamma_dp because it is within the module
3519 !        double precision :: gamma_dp
3520         double precision :: xam,dlog,s,r,ga,t0,a,x
3521         integer :: k
3522         double precision :: gin, gim
3523         
3524         a = a1
3525         x = x1
3526         IF ( x1 <= 0.0 ) THEN
3527            gamxinfdp = GAMMA_DP(A)
3528            return
3529         ENDIF
3530         XAM=-X+A*DLOG(X)
3531         IF (XAM.GT.700.0.OR.A.GT.170.0) THEN
3532            WRITE(*,*)'a and/or x too large'
3533            STOP
3534         ENDIF
3535         IF (X.EQ.0.0) THEN
3536            GIN=0.0
3537            GIM = GAMMA_dp(A)
3538         ELSE IF (X.LE.1.0+A) THEN
3539            S=1.0D0/A
3540            R=S
3541            DO 10 K=1,60
3542               R=R*X/(A+K)
3543               S=S+R
3544               IF (DABS(R/S).LT.1.0D-15) GO TO 15
3545 10         CONTINUE
3546 15         GIN=DEXP(XAM)*S
3547            ga = GAMMA_DP(A)
3548            GIM=GA-GIN
3549         ELSE IF (X.GT.1.0+A) THEN
3550            T0=0.0D0
3551            DO 20 K=60,1,-1
3552               T0=(K-A)/(1.0D0+K/(X+T0))
3553 20         CONTINUE
3554            GIM=DEXP(XAM)/(X+T0)
3555 !           GA = GAMMA_dp(A)
3556 !           GIN=GA-GIM
3557         ENDIF
3558         
3559         gamxinfdp = GIM
3560         return
3561         END function GAMXINFDP
3564 ! #####################################################################
3566       real function gaminterp(ratio, alp, luindex, ilh)
3567       
3568       implicit none
3570       real, intent(in) :: ratio, alp
3571       integer, intent(in) :: ilh  ! 1 = graupel, 2 = hail
3572       integer, intent(in) :: luindex ! which argument: 
3573                          ! gamxinflu(i,j,1,1) = x/y
3574                           ! gamxinflu(i,j,2,1) = gamxinf( 2.0+alp, ratio )/y
3575                           ! gamxinflu(i,j,3,1) = gamxinf( 2.5+alp+0.5*bxh, ratio )/y
3576                           ! gamxinflu(i,j,5,1) = gamxinf( 5.0+alp, ratio )/y
3577                           ! gamxinflu(i,j,6,1) = gamxinf( 5.5+alp+0.5*bxh, ratio )/y
3579       
3580       real :: delx, dely, tmp1, tmp2, temp3
3581       integer :: i,j,ip1,jp1 !,ilh
3582       
3583 !      ilh = Abs(ilh0)
3586            i = Min(nqiacrratio,Int(ratio*dqiacrratioinv))
3587            j = Int(Max(0.0,Min(maxalphalu,alp))*dqiacralphainv)
3588            delx = Min(maxratiolu,ratio) - float(i)*dqiacrratio
3589            dely = alp - float(j)*dqiacralpha
3590            ip1 = Min( i+1, nqiacrratio )
3591            jp1 = Min( j+1, nqiacralpha )
3593            ! interpolate along x, i.e., ratio; 
3594            tmp1 = gamxinflu(i,j,luindex,ilh) + delx*dqiacrratioinv*         &
3595      &                 (gamxinflu(ip1,j,luindex,ilh) - gamxinflu(i,j,luindex,ilh))
3596            tmp2 = gamxinflu(i,jp1,luindex,ilh) + delx*dqiacrratioinv*       &
3597      &                 (gamxinflu(ip1,jp1,luindex,ilh) - gamxinflu(i,jp1,luindex,ilh))
3598            
3599            ! interpolate along alpha; 
3600            
3601            gaminterp = (tmp1 + dely*dqiacralphainv*(tmp2 - tmp1))
3602            
3603            ! debug
3604 !           IF ( ilh0 < 0 ) THEN
3605 !             write(0,*) 'gaminterp: ',i,j,ilh,ratio,delx,dely,gamxinflu(i,j,luindex,ilh),tmp1,tmp2
3606 !           ENDIF
3607            
3608         END FUNCTION gaminterp
3609 ! #####################################################################
3611 !**************************** GAML02 *********************** 
3612 !  This calculates Gamma(0.2,x)/Gamma[0.2], where is a ratio
3613 !   It is used for qiacr with the gamma of volume to calculate what 
3614 !   fraction of drops exceed a certain size (this version is for 40 micron drops)
3615 ! **********************************************************
3616       real FUNCTION GAML02(x) 
3617       implicit none
3618       integer ig, i, ii, n, np
3619       real x
3620       integer ng
3621       parameter(ng=12)
3622       real gamxg(ng), xg(ng)
3623       DATA xg/0.01,0.02,0.025,0.04,0.075,0.1,0.25,0.5,0.75,1.,2.,10./ 
3624       DATA gamxg/  &
3625      &  7.391019203578037e-8,0.02212726874591478,0.06959352407989682, &
3626      &  0.2355654024970809,0.46135930387500346,0.545435791452399,     &
3627      &  0.7371571313308203,                                           &
3628      &  0.8265676632204345,0.8640182781845841,0.8855756211304151,     &
3629      &  0.9245079225301251,                                           &
3630      &  0.9712578342732681/
3631       IF ( x .ge. xg(ng) ) THEN
3632         gaml02 = xg(ng)
3633         RETURN
3634       ENDIF
3635       IF ( x .lt. xg(1) ) THEN
3636         gaml02 = 0.0
3637         RETURN
3638       ENDIF
3639       DO ii = 1,ng-1
3640         i = ng - ii
3641         n = i
3642         np = n + 1
3643         IF ( x .ge. xg(i) ) THEN
3644 !         GOTO 2 
3645           gaml02 = gamxg(N)+((X-XG(N))/(XG(NP)-XG(N)))* &
3646      &            ( gamxg(NP) - gamxg(N) ) 
3647           RETURN
3648         ENDIF
3649       ENDDO
3650       RETURN
3651       END FUNCTION GAML02
3653 !**************************** GAML02d300 *********************** 
3654 !  This calculates Gamma(0.2,x)/Gamma[0.2], where is a ratio
3655 !   It is used for qiacr with the gamma of volume to calculate what 
3656 !   fraction of drops exceed a certain size (this version is for 300 micron drops) (see zieglerstuff.nb)
3657 ! **********************************************************
3658      real FUNCTION GAML02d300(x)
3659       implicit none
3660       integer ig, i, ii, n, np
3661       real x
3662       integer ng
3663       parameter(ng=9)
3664       real gamxg(ng), xg(ng)
3665       DATA xg/0.04,0.075,0.1,0.25,0.5,0.75,1.,2.,10./ 
3666       DATA gamxg/                           &
3667      &  0.0,                                  &
3668      &  7.391019203578011e-8,0.0002260640810600053,  &
3669      &  0.16567071824457152,                         &
3670      &  0.4231369044918005,0.5454357914523988,       &
3671      &  0.6170290936864555,                           &
3672      &  0.7471346054110058,0.9037156157718299 /
3673       IF ( x .ge. xg(ng) ) THEN
3674         GAML02d300 = xg(ng)
3675         RETURN
3676       ENDIF
3677       IF ( x .lt. xg(1) ) THEN
3678         GAML02d300 = 0.0
3679         RETURN
3680       ENDIF
3681       DO ii = 1,ng-1
3682         i = ng - ii
3683         n = i
3684         np = n + 1
3685         IF ( x .ge. xg(i) ) THEN
3686 !         GOTO 2 
3687           GAML02d300 = gamxg(N)+((X-XG(N))/(XG(NP)-XG(N)))*  &
3688      &            ( gamxg(NP) - gamxg(N) ) 
3689           RETURN
3690         ENDIF
3691       ENDDO
3692       RETURN
3693       END FUNCTION GAML02d300
3696 ! #####################################################################
3697 ! #####################################################################
3699 !**************************** GAML02 *********************** 
3700 !  This calculates Gamma(0.2,x)/Gamma[0.2], where is a ratio
3701 !   It is used for qiacr with the gamma of volume to calculate what 
3702 !   fraction of drops exceed a certain size (this version is for 500 micron drops) (see zieglerstuff.nb)
3703 ! **********************************************************
3704       real FUNCTION GAML02d500(x) 
3705       implicit none
3706       integer ig, i, ii, n, np
3707       real x
3708       integer ng
3709       parameter(ng=9)
3710       real gamxg(ng), xg(ng)
3711       DATA xg/0.04,0.075,0.1,0.25,0.5,0.75,1.,2.,10./ 
3712       DATA gamxg/  &
3713      &  0.0,0.0,   &
3714      &  2.2346039e-13, 0.0221272687459,  &
3715      &  0.23556540,  0.38710348,         &
3716      &  0.48136183,0.6565833,            &
3717      &  0.86918315 /
3718       IF ( x .ge. xg(ng) ) THEN
3719         GAML02d500 = xg(ng)
3720         RETURN
3721       ENDIF
3722       IF ( x .lt. xg(1) ) THEN
3723         GAML02d500 = 0.0
3724         RETURN
3725       ENDIF
3726       DO ii = 1,ng-1
3727         i = ng - ii
3728         n = i
3729         np = n + 1
3730         IF ( x .ge. xg(i) ) THEN
3731 !         GOTO 2 
3732           GAML02d500 = gamxg(N)+((X-XG(N))/(XG(NP)-XG(N)))*  &
3733      &            ( gamxg(NP) - gamxg(N) ) 
3734           RETURN
3735         ENDIF
3736       ENDDO
3737       RETURN
3738       END FUNCTION GAML02d500
3741 ! #####################################################################
3743 ! #####################################################################
3746         real function BETA(P,Q)
3748 !       ==========================================
3749 !       Purpose: Compute the beta function B(p,q)
3750 !       Input :  p  --- Parameter  ( p > 0 )
3751 !                q  --- Parameter  ( q > 0 )
3752 !       Output:  BT --- B(p,q)
3753 !       Routine called: GAMMA for computing gamma(x)
3754 !       ==========================================
3756 !        IMPLICIT real (A-H,O-Z)
3757         implicit none
3758         double precision p1,gp,q1,gq, ppq,gpq
3759         real p,q
3760         
3761         p1 = p
3762         q1 = q
3763         CALL GAMMADP(P1,GP)
3764         CALL GAMMADP(Q1,GQ)
3765         PPQ=P1+Q1
3766         CALL GAMMADP(PPQ,GPQ)
3767         beta=GP*GQ/GPQ
3768         RETURN
3769         END function BETA
3771 ! #####################################################################
3772 ! #####################################################################
3774       DOUBLE PRECISION FUNCTION GAMMA_DP(xx)
3776       implicit none
3777       double precision xx
3778       integer j
3780 ! Double precision ser,stp,tmp,x,y,cof(6)
3782       real*8 ser,stp,tmp,x,y,cof(6)
3783       SAVE cof,stp
3784       DATA cof,stp/76.18009172947146d+0,  &
3785      &            -86.50532032941677d0,   &
3786      &             24.01409824083091d0,   &
3787      &             -1.231739572450155d0,  &
3788      &              0.1208650973866179d-2,&
3789      &             -0.5395239384953d-5,   &
3790      &              2.5066282746310005d0/
3792       x = xx
3793       y = x
3794       tmp = x + 5.5d0
3795       tmp = (x + 0.5d0)*Log(tmp) - tmp
3796       ser = 1.000000000190015d0
3797       DO j=1,6
3798         y = y + 1.0d0
3799         ser = ser + cof(j)/y
3800       END DO
3801       gamma_dp = Exp(tmp + log(stp*ser/x))
3803       RETURN
3804       END function gamma_dp
3805 ! #####################################################################
3807         SUBROUTINE GAMMADP(X,GA)
3809 !       ==================================================
3810 !       Purpose: Compute gamma function Gamma(x)
3811 !       Input :  x  --- Argument of Gamma(x)
3812 !                       ( x is not equal to 0,-1,-2,...)
3813 !       Output:  GA --- gamma(x)
3814 !       ==================================================
3816 !        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3817         implicit none
3818         
3819         double precision, parameter :: PI=3.141592653589793D0
3820         double precision :: x,ga,z,r,gr
3821         integer :: k,m1,m
3822         
3823         double precision :: G(26)
3824         
3825         IF (X.EQ.INT(X)) THEN
3826            IF (X.GT.0.0D0) THEN
3827               GA=1.0D0
3828               M1=X-1
3829               DO K=2,M1
3830                 GA=GA*K
3831               ENDDO
3832            ELSE
3833               GA=1.0D+300
3834            ENDIF
3835         ELSE
3836            IF (DABS(X).GT.1.0D0) THEN
3837               Z=DABS(X)
3838               M=INT(Z)
3839               R=1.0D0
3840               DO K=1,M
3841                  R=R*(Z-K)
3842               ENDDO
3843               Z=Z-M
3844            ELSE
3845               Z=X
3846            ENDIF
3847            DATA G/1.0D0,0.5772156649015329D0,                  &
3848      &          -0.6558780715202538D0, -0.420026350340952D-1,  &
3849      &          0.1665386113822915D0,-.421977345555443D-1,     &
3850      &          -.96219715278770D-2, .72189432466630D-2,       &
3851      &          -.11651675918591D-2, -.2152416741149D-3,       &
3852      &          .1280502823882D-3, -.201348547807D-4,          &
3853      &          -.12504934821D-5, .11330272320D-5,             &
3854      &          -.2056338417D-6, .61160950D-8,                 &
3855      &          .50020075D-8, -.11812746D-8,                   &
3856      &          .1043427D-9, .77823D-11,                       &
3857      &          -.36968D-11, .51D-12,                          &
3858      &          -.206D-13, -.54D-14, .14D-14, .1D-15/
3859            GR=G(26)
3860            DO K=25,1,-1
3861              GR=GR*Z+G(K)
3862            ENDDO
3863            GA=1.0D0/(GR*Z)
3864            IF (DABS(X).GT.1.0D0) THEN
3865               GA=GA*R
3866               IF (X.LT.0.0D0) GA=-PI/(X*GA*DSIN(PI*X))
3867            ENDIF
3868         ENDIF
3869         RETURN
3870         END SUBROUTINE GAMMADP
3873 ! #####################################################################
3874 ! #####################################################################
3877 ! #####################################################################
3878       Function delbk(bb,nu,mu,k)
3879 !   
3880 !  Purpose: Caluculates collection coefficients following Siefert (2006)
3882 !  delbk is equation (90) (b collecting b -- self-collection)
3883 !  mass-diameter relationship: D = a*x**(b), where x = particle mass
3884 !  general distribution: n(x) = A*x**(nu)*Exp(-lam*x**(mu))
3885 !  where
3886 !      A = mu*N/(Gamma((nu+1)/mu)) *lam**((nu+1)/mu)
3888 !      lam = ( Gamma((nu+1)/mu)/Gamma((nu+2)/mu) * xbar )**(-mu)
3890 !     where  xbar = L/N  (mass content)/(number concentration) = q*rhoa/N
3893       implicit none
3894       real delbk
3895       real nu, mu, bb
3896       integer k
3897       
3898       real tmp, del
3899       real x1, x2, x3, x4
3900       integer i
3902         tmp = ((1.0 + nu)/mu)
3903         i = Int(dgami*(tmp))
3904         del = tmp - dgam*i
3905         x1 = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
3907         tmp = ((2.0 + nu)/mu)
3908         i = Int(dgami*(tmp))
3909         del = tmp - dgam*i
3910         x2 = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
3912         tmp = ((1.0 + 2.0*bb + k + nu)/mu)
3913         i = Int(dgami*(tmp))
3914         del = tmp - dgam*i
3915         x3 = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
3916       
3917 !      delbk =  &
3918 !     &  ((Gamma_sp((1.0 + nu)/mu)/Gamma_sp((2.0 + nu)/mu))**(2.0*bb + k)* &
3919 !     &    Gamma_sp((1.0 + 2.0*bb + k + nu)/mu))/Gamma_sp((1.0 + nu)/mu)
3921       delbk =  &
3922      &  ((x1/x2)**(2.0*bb + k)* &
3923      &    x3)/x1
3924       
3925       RETURN
3926       END  Function delbk
3927       
3928 ! #####################################################################
3931 ! #####################################################################
3932 ! Equation (91) in Seifert and Beheng (2006) ("a" collecting "b")
3933       Function delabk(ba,bb,nua,nub,mua,mub,k)
3934       
3935       implicit none
3936       real delabk
3937       real nua, mua, ba
3938       integer k
3939       real nub, mub, bb
3940       
3941       integer i
3942       real tmp,del
3943       
3944       real g1pnua, g2pnua, g1pbapnua, g1pbbpk, g1pnub, g2pnub
3945       
3946         tmp = (1. + nua)/mua
3947         i = Int(dgami*(tmp))
3948         del = tmp - dgam*i
3949         IF ( i+1 > ngm0 ) THEN
3950           write(0,*) 'delabk: i+1 > ngm0!!!!',i,ngm0,nua,mua,tmp
3951            STOP
3952         ENDIF
3953         g1pnua = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
3954 !        write(91,*) 'delabk: g1pnua,gamma = ',g1pnua,Gamma_sp((1. + nua)/mua)
3956         tmp = ((2. + nua)/mua)
3957         i = Int(dgami*(tmp))
3958         del = tmp - dgam*i
3959         g2pnua = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
3961         tmp = ((1. + ba + nua)/mua)
3962         i = Int(dgami*(tmp))
3963         del = tmp - dgam*i
3964         g1pbapnua = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
3966         tmp = ((1. + nub)/mub)
3967         i = Int(dgami*(tmp))
3968         del = tmp - dgam*i
3969         g1pnub = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
3971         tmp = ((2 + nub)/mub)
3972         i = Int(dgami*(tmp))
3973         del = tmp - dgam*i
3974         g2pnub = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
3976         tmp = ((1. + bb + k + nub)/mub)
3977         i = Int(dgami*(tmp))
3978         del = tmp - dgam*i
3979         g1pbbpk = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
3981       delabk =  &
3982      &  (2.*(g1pnua/g2pnua)**ba*     &
3983      &    g1pbapnua*                                               &
3984      &    (g1pnub/g2pnub)**(bb + k)*                                &
3985      &    g1pbbpk)/                                                &
3986      &  (g1pnua*g1pnub)              
3987       
3988       RETURN
3989       END Function delabk
3993 ! #####################################################################
3995 ! #####################################################################
3996 !--------------------------------------------------------------------------
3997       subroutine cld_cpu(string)
3999       implicit none
4000       character( LEN = * ) string
4001       
4002       return
4003       
4004       end subroutine cld_cpu
4007 !--------------------------------------------------------------------------
4009 !--------------------------------------------------------------------------
4011 ! #######################################################################
4012 !  HAILMAXD - calculated maximum expected hail size
4013 ! #######################################################################
4014      subroutine hailmaxd(dtp,nx,ny,nz,an,na,nor,norz,alpha2d,dn,  &
4015      &                    hailmax1d,hailmaxk1,jslab ) 
4017 ! Calculate maximum hail size from the tail of of the distribution. The value
4018 ! of thresh_conc sets the minimum concentration in the integral over (Dmax, Inf).
4019 ! This uses the lookup tables for incomplete gamma functions and simply search for
4020 ! the expected value (and linearly interpolate) on D.
4022 !  Written by ERM 7/2023
4026       implicit none
4028       integer nx,ny,nz,nor,norz,ngt,jgs,na,ia
4029       integer id ! =1 use density, =0 no density
4030 !      integer :: its,ite ! x-range to calculate
4031       
4032       integer ng1
4033       parameter(ng1 = 1)
4035       real an(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz,na)
4036       real dn(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
4038 !      real gz(-nor+ng1:nz+nor),z1d(-nor+ng1:nz+nor,4)
4039       real dtp
4040       real alpha2d(-nor+1:nx+nor,1,-norz+1:nz+norz,3)  ! array for PSD shape parameters
4041       real  :: hailmax1d(nx,ny),hailmaxk1(nx,ny)
4042       integer infdo
4043       integer jslab ! which line of xfall to use
4044             
4045       integer ix,jy,kz,ndfall,n,k,il,in
4046       double precision :: tmp, ratio, del, g1palp
4047       real, parameter :: dz = 200.
4049       real :: db1(nx,nz+1),dtz1(nz+1,nx,0:1),dz2dinv(nz+1,nx),db1inv(nx,nz+1)
4050       
4051       real :: rhovtzx(nz,nx)
4053       real :: alp, diam, diam1, hwdn
4054       
4055 !      real, parameter :: cmin = 0.001 ! threshold number per m^3 for maximum diamter (threshold from diag_nwp)
4056       DOUBLE PRECISION, PARAMETER:: thresh_conc = 0.0005d0                 ! number conc. of graupel/hail per cubic meter
4057       real :: cwchtmp,cwchltmp, maxdia
4059 !-----------------------------------------------------------------------------
4061       integer :: ixb, jyb, kzb
4062       integer :: ixe, jye, kze
4063       integer :: plo, phi
4064       integer :: ialp, i, j
4066       logical :: debug_mpi = .TRUE.
4068 ! ###################################################################
4071       IF ( lh > 1 ) THEN
4072         cwchtmp  = ((3. + dnu(lh))*(2. + dnu(lh))*(1.0 + dnu(lh)))**(-1./3.)
4073       ENDIF
4074       IF ( lhl > 1 ) THEN
4075         cwchltmp = ((3. + dnu(lhl))*(2. + dnu(lhl))*(1.0 + dnu(lhl)))**(-1./3.)
4076       ENDIF
4079       kzb = 1
4080       kze = nz
4082       ixb = 1  ! aliased its
4083       ixe = nx ! aliased ite
4086       jy = jslab
4087       jgs = jy
4090 !      hailmax1d(:,jy) = 0.0
4091 !      hailmaxk1(:,jy) = 0.0
4093       if ( ndebug .gt. 0 ) write(0,*) 'dbg = 3a'
4096 ! first graupel, even if hail is also predicted, since graupel can sometime be large on its own
4097       IF ( lh > 1 .and. lnh > 1 ) THEN
4098       DO kz = kzb,kze
4099       DO ix = ixb,ixe
4100         IF ( an(ix,jy,kz,lh) .gt. qxmin(lh) .and. an(ix,jy,kz,lnh) .gt. thresh_conc ) THEN
4101           IF ( lvh .gt. 1 ) THEN
4102             hwdn = dn(ix,jy,kz)*an(ix,jy,kz,lh)/an(ix,jy,kz,lvh)
4103           ELSE
4104             hwdn = rho_qh
4105           ENDIF
4107           tmp = 1. + alpha2d(ix,1,kz,2)
4108           i = Int(dgami*(tmp))
4109           del = tmp - dgam*i
4110           g1palp = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
4112           tmp = dn(ix,jy,kz)*an(ix,jy,kz,lh)/(hwdn*an(ix,jy,kz,lnh))
4113           diam = (6.0*tmp/pi)**(1./3.)
4114           IF ( lzh > 1 ) THEN ! 3moment
4115             cwchtmp = ((3. + alpha2d(ix,1,kz,2))*(2. + alpha2d(ix,1,kz,2))*(1.0 + alpha2d(ix,1,kz,2)))**(-1./3.)
4116           ENDIF
4117           diam1 = diam*cwchtmp ! characteristic diameter, i.e., 1/lambda
4118          ! want cxd1 = thresh_conc
4119          !  tmp = gaminterp(ratio,alpha(mgs,lh),1,1)
4120          ! cxd1 = cx(mgs,lh)*(tmp)/g1palp
4121          ! tmp = thresh_conc*g1palp/cx
4122          ! 
4123          tmp = thresh_conc*g1palp/an(ix,jy,kz,lnh)
4124          alp = alpha2d(ix,1,kz,2)
4125          ! gamxinflu(i,j,luindex,ilh)
4126            j = Int(Max(0.0,Min(maxalphalu,alp))*dqiacralphainv)
4127            ratio = 0.0
4128            maxdia = 0.0
4129            ! eventually could replace with bisection search, but final value of i is usually small
4130            ! compared to nqiacrratio
4131            DO i = 0,nqiacrratio-1
4132               IF ( gamxinflu(i,j,1,1) >= tmp .and. tmp >= gamxinflu(i+1,j,1,1) ) THEN
4133                !  interpolate here for FWIW
4134                 ratio = i*dqiacrratio
4135                 del = tmp - gamxinflu(i,j,1,1)
4136                 ratio = (float(i) + del/(gamxinflu(i+1,j,1,1) - gamxinflu(i,j,1,1)))*dqiacrratio
4137                 exit
4138               ENDIF
4139            ENDDO
4140            
4141            IF ( ratio > 0.0 ) THEN
4142               maxdia = ratio*diam1 ! units of m
4143            ENDIF
4145            IF ( kz == kzb ) THEN
4146              hailmaxk1(ix,jy) = Max( maxdia, hailmaxk1(ix,jy) )
4147 !             IF ( maxdia > 0.1 ) THEN
4148 !            IF ( an(ix,jy,kz,lh) > 1.e-4 ) THEN
4149 !              write(0,*) 'maxdia,tmp,alp,ratio,diam,diam1= ',maxdia,tmp,alp,ratio,diam*100.,diam1*100.
4150 !              write(0,*) 'hwdn, cxhl, qx, g1palp = ',hwdn, an(ix,jy,kz,lnhl), an(ix,jy,kz,lhl), g1palp
4151 !              write(0,*) 'j,gamxinflu(0,2,4) = ',j,gamxinflu(0,j,1,1),gamxinflu(2,j,1,1), &
4152 !                gamxinflu(4,j,1,1)
4153 !            ENDIF
4154            ENDIF
4155            
4156            hailmax1d(ix,jy) = Max(maxdia, hailmax1d(ix,jy) )
4158         ! 
4160         ENDIF
4162       ENDDO
4163       ENDDO
4165       ENDIF ! lh
4167 ! And diam for hail if present
4168       IF ( lhl > 1 .and. lnhl > 1 ) THEN
4169       DO kz = kzb,kze
4170       DO ix = ixb,ixe
4171         IF ( an(ix,jy,kz,lhl) .gt. qxmin(lhl) .and. an(ix,jy,kz,lnhl) .gt. thresh_conc ) THEN
4172           IF ( lvhl .gt. 1 ) THEN
4173             hwdn = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/an(ix,jy,kz,lvhl)
4174           ELSE
4175             hwdn = rho_qhl
4176           ENDIF
4178           tmp = 1. + alpha2d(ix,1,kz,3)
4179           i = Int(dgami*(tmp))
4180           del = tmp - dgam*i
4181           g1palp = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
4183           tmp = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/(hwdn*an(ix,jy,kz,lnhl))
4184           diam = (6.0*tmp/pi)**(1./3.)
4185           IF ( lzhl > 1 ) THEN ! 3moment
4186             cwchltmp = ((3. + alpha2d(ix,1,kz,3))*(2. + alpha2d(ix,1,kz,3))*(1.0 + alpha2d(ix,1,kz,3)))**(-1./3.)
4187           ENDIF
4188           diam1 = diam*cwchltmp ! characteristic diameter, i.e., 1/lambda
4189          ! want cxd1 = thresh_conc
4190          !  tmp = gaminterp(ratio,alpha(mgs,lh),1,1)
4191          ! cxd1 = cx(mgs,lh)*(tmp)/g1palp
4192          ! tmp = thresh_conc*g1palp/cx
4193          ! 
4194          tmp = thresh_conc*g1palp/an(ix,jy,kz,lnhl)
4195          alp = alpha2d(ix,1,kz,3)
4196          ! gamxinflu(i,j,luindex,ilh)
4197            j = Int(Max(0.0,Min(maxalphalu,alp))*dqiacralphainv)
4198            ratio = 0.0
4199            maxdia = 0.0
4200            ! eventually could replace with bisection search, but final value of i is usually small
4201            ! compared to nqiacrratio
4202            DO i = 0,nqiacrratio-1
4203               IF ( gamxinflu(i,j,1,1) >= tmp .and. tmp >= gamxinflu(i+1,j,1,1) ) THEN
4204                !  interpolate here for FWIW
4205                 ratio = i*dqiacrratio
4206                 del = tmp - gamxinflu(i,j,1,1)
4207                 ratio = (float(i) + del/(gamxinflu(i+1,j,1,1) - gamxinflu(i,j,1,1)))*dqiacrratio
4208                 exit
4209               ENDIF
4210            ENDDO
4211            
4212            IF ( ratio > 0.0 ) THEN
4213               maxdia = ratio*diam1 ! units of m
4214            ENDIF
4216            IF ( kz == kzb ) THEN
4217              hailmaxk1(ix,jy) = Max( maxdia, hailmaxk1(ix,jy) )
4218 !             IF ( maxdia > 0.1 ) THEN
4219 !            IF ( an(ix,jy,kz,lhl) > 1.e-4 ) THEN
4220 !              write(0,*) 'maxdia,tmp,alp,ratio,diam,diam1= ',maxdia,tmp,alp,ratio,diam*100.,diam1*100.
4221 !              write(0,*) 'hwdn, cxhl, qx, g1palp = ',hwdn, an(ix,jy,kz,lnhl), an(ix,jy,kz,lhl), g1palp
4222 !              write(0,*) 'j,gamxinflu(0,2,4) = ',j,gamxinflu(0,j,1,1),gamxinflu(2,j,1,1), &
4223 !                gamxinflu(4,j,1,1)
4224 !            ENDIF
4225            ENDIF
4226            
4227            hailmax1d(ix,jy) = Max(maxdia, hailmax1d(ix,jy) )
4229         ! 
4231         ENDIF
4233       ENDDO
4234       ENDDO
4236       ENDIF
4239      END SUBROUTINE HAILMAXD
4240 ! #######################################################################
4241 ! #######################################################################
4242      subroutine sediment1d(dtp,nx,ny,nz,an,na,nor,norz,xfall,dn,dz3d,dz3dinv, &
4243      &                    t0,t7,infdo,jslab,its,jts,  &
4244      &   timesed1,timesed2,timesed3,zmaxsed,timesetvt) ! used for timing
4246 ! Sedimentation driver -- column by column
4248 !  Written by ERM 10/2011
4252       implicit none
4254       integer nx,ny,nz,nor,norz,ngt,jgs,na,ia
4255       integer id ! =1 use density, =0 no density
4256       integer :: its,jts ! SW point of local tile
4257       
4258       integer ng1
4259       parameter(ng1 = 1)
4261       real an(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz,na)
4262       real dn(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
4263       real dz3d(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
4264       real dz3dinv(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
4265       real t0(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
4266       real t7(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
4268 !      real gz(-nor+ng1:nz+nor),z1d(-nor+ng1:nz+nor,4)
4269       real dtp
4270       real xfall(nx,ny,na)  ! array for stuff landing on the ground
4271 !      real xfall0(nx,ny)    ! dummy array
4272       integer infdo
4273       integer jslab ! which line of xfall to use
4274             
4275       integer ix,jy,kz,ndfall,n,k,il,in
4276       real tmp, vtmax, dtptmp, dtfrac
4277       real, parameter :: dz = 200.
4279 !      real :: xvt(nz+1,nx,3,lc:lhab) ! (nx,nz,2,lc:lhab) ! 1=mass-weighted, 2=number-weighted
4280 !      real :: tmpn(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
4281 !      real :: tmpn2(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
4282 !      real :: z(-nor+ng1:nx+nor,-norz+ng1:nz+norz,lr:lhab)
4283 !      real :: db1(nx,nz+1),dtz1(nz+1,nx,0:1),dz2dinv(nz+1,nx),db1inv(nx,nz+1)
4284       
4285 !      real :: rhovtzx(nz,nx)
4287       real, allocatable :: db1(:,:), dtz1(:,:,:),dz2dinv(:,:),db1inv(:,:) ! db1(nx,nz+1),dtz1(nz+1,nx,0:1),dz2dinv(nz+1,nx),db1inv(nx,nz+1)
4288       real, allocatable :: rhovtzx(:,:)
4289       real, allocatable :: xfall0(:,:), xvt(:,:,:,:),tmpn(:,:,:),tmpn2(:,:,:),z(:,:,:)
4290       
4291       double precision :: timesed1,timesed2,timesed3, zmaxsed,timesetvt,dummy
4292       double precision :: dt1,dt2,dt3,dt4
4294       integer :: ngs ! = 512
4295       integer :: ngscnt,mgs,ipconc0
4296       
4297 !     real ::  qx(ngs,lv:lhab) 
4298 !     real ::  qxw(ngs,ls:lhab) 
4299 !     real ::  cx(ngs,lc:lhab) 
4300 !     real ::  xv(ngs,lc:lhab) 
4301 !     real ::  vtxbar(ngs,lc:lhab,3) 
4302 !     real ::  xmas(ngs,lc:lhab) 
4303 !     real ::  xdn(ngs,lc:lhab) 
4304 !     real ::  xdia(ngs,lc:lhab,3) 
4305 !     real ::  vx(ngs,li:lhab) 
4306 !     real ::  alpha(ngs,lc:lhab) 
4307 !     real ::  zx(ngs,lr:lhab) 
4308 !     logical :: hasmass(nx,lc+1:lhab)
4310 !     integer igs(ngs),kgs(ngs)
4311 !     
4312 !     real rho0(ngs),temcg(ngs)
4314 !     real temg(ngs)
4315 !     
4316 !     real rhovt(ngs)
4317 !     
4318 !     real cwnc(ngs),cinc(ngs)
4319 !     real fadvisc(ngs),cwdia(ngs),cipmas(ngs)
4320 !     
4321 !     real cimasn,cimasx,cnina(ngs),cimas(ngs)
4322 !     
4323 !     real cnostmp(ngs)
4325       real, allocatable ::  qx(:,:)
4326       real, allocatable ::  qxw(:,:)
4327       real, allocatable ::  cx(:,:)
4328       real, allocatable ::  xv(:,:)
4329       real, allocatable ::  vtxbar(:,:,:)
4330       real, allocatable ::  xmas(:,:)
4331       real, allocatable ::  xdn(:,:)
4332       real, allocatable ::  xdia(:,:,:)
4333       real, allocatable ::  vx(:,:)
4334       real, allocatable ::  alpha(:,:)
4335       real, allocatable ::  zx(:,:)
4336       logical, allocatable :: hasmass(:,:)
4338       integer, allocatable :: igs(:),kgs(:)
4339       
4340       real, allocatable :: rho0(:),temcg(:)
4342       real, allocatable :: temg(:)
4343       
4344       real, allocatable :: rhovt(:)
4345       
4346       real, allocatable :: cwnc(:),cinc(:)
4347       real, allocatable :: fadvisc(:),cwdia(:),cipmas(:)
4348       
4349       real, allocatable :: cnina(:),cimas(:)
4350       
4351       real, allocatable :: cnostmp(:)
4352       
4353       real :: cimasn,cimasx
4354       
4356 !-----------------------------------------------------------------------------
4358       integer :: ixb, jyb, kzb
4359       integer :: ixe, jye, kze
4360       integer :: plo, phi
4362       logical :: debug_mpi = .TRUE.
4364 ! ###################################################################
4367       allocate( db1(nx,nz+1),dtz1(nz+1,nx,0:1),dz2dinv(nz+1,nx),db1inv(nx,nz+1),rhovtzx(nz,nx) )
4368       allocate( xfall0(nx,ny), xvt(nz+1,nx,3,lc:lhab), tmpn(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz) )
4369       allocate( tmpn2(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz), z(-nor+ng1:nx+nor,-norz+ng1:nz+norz,lr:lhab))
4371       ngs = nz+3
4372       
4373       allocate( qx(ngs,lv:lhab),  &
4374                 qxw(ngs,ls:lhab),  &
4375                 cx(ngs,lc:lhab),  &
4376                 xv(ngs,lc:lhab),  &
4377                 vtxbar(ngs,lc:lhab,3),  &
4378                 xmas(ngs,lc:lhab),  &
4379                 xdn(ngs,lc:lhab),  &
4380                 xdia(ngs,lc:lhab,3),  &
4381                 vx(ngs,li:lhab),  &
4382                 alpha(ngs,lc:lhab),  &
4383                 zx(ngs,lr:lhab),     &
4384                 hasmass(nx,lc+1:lhab), &
4385                 igs(ngs),kgs(ngs), &
4386                 rho0(ngs),temcg(ngs),temg(ngs), rhovt(ngs), &
4387                 cwnc(ngs),cinc(ngs), &
4388                 fadvisc(ngs),cwdia(ngs),cipmas(ngs), &
4389                 cnina(ngs),cimas(ngs), &
4390                 cnostmp(ngs) )
4392       kzb = 1
4393       kze = nz
4395       ixb = 1
4396       ixe = nx
4399       jy = 1
4400       jgs = jy
4404 !  zero the precip flux arrays (2d)
4407       xvt(:,:,:,:) = 0.0
4409       if ( ndebug .gt. 0 ) write(0,*) 'dbg = 3a'
4412       DO kz = kzb,kze
4413       DO ix = ixb,ixe
4414        db1(ix,kz) = dn(ix,jy,kz)
4415        db1inv(ix,kz) = 1./dn(ix,jy,kz)
4416        rhovtzx(kz,ix) = Sqrt(rho00*Min(1.0/0.05, db1inv(ix,kz))) ! prevent excessive rhovt
4417       ENDDO
4418       ENDDO
4420       DO kz = kzb,kze
4421       DO ix = ixb,ixe
4422        dtz1(kz,ix,0) = dz3dinv(ix,jy,kz)
4423        dtz1(kz,ix,1) = dz3dinv(ix,jy,kz)*db1inv(ix,kz) 
4424        dz2dinv(kz,ix) = dz3dinv(ix,jy,kz)
4425       ENDDO
4426       ENDDO
4428       IF ( lzh .gt. 1 ) THEN
4429       DO kz = kzb,kze
4430       DO ix = ixb,ixe
4431         an(ix,jy,kz,lzh) = Max( 0., an(ix,jy,kz,lzh) )
4432       ENDDO
4433       ENDDO
4434       ENDIF
4436       
4437       DO il = lc+1,lhab
4438        DO ix = ixb,ixe
4439 !        hasmass(ix,il) = Any( an(ix,jy,:,il) > qxmin(il) )
4440        ENDDO
4441       ENDDO
4446       if (ndebug .gt. 0 ) write(0,*) 'dbg = 3a2'
4448 ! loop over columns
4449       DO ix = ixb,ixe
4450       
4451       dummy = 0.d0
4453       
4454       call ziegfall1d(nx,ny,nz,nor,norz,na,dtp,jgs,ix, & 
4455      &  xvt, rhovtzx, & 
4456      &  an,dn,ipconc,t0,t7,cwmasn,cwmasx, & 
4457      &  cwradn, & 
4458      &  qxmin,xdnmx,xdnmn,cdx,cno,xdn0,xvmn,xvmx, & 
4459      &  ngs,qx,qxw,cx,xv,vtxbar,xmas,xdn,xdia,vx,alpha,zx,igs,kgs, &
4460      &  rho0,temcg,temg,rhovt,cwnc,cinc,fadvisc,cwdia,cipmas,cnina,cimas, &
4461      &  cnostmp,              &
4462      &  infdo,0               &
4463      & )
4466 ! loop over each species and do sedimentation for all moments
4467      DO il = lc,lhab
4468        IF ( ido(il) == 0 ) CYCLE
4470 !       IF ( .not. hasmass(ix,il) ) CYCLE
4472 !      plo = nz
4473 !      phi = 0
4476       vtmax = 0.0
4477       
4478       do kz = kzb,kze
4480       ! apply limit vtmaxsed (08/20/2015)
4481       xvt(kz,ix,1,il) = Min( vtmaxsed,  xvt(kz,ix,1,il) )
4482       xvt(kz,ix,2,il) = Min( vtmaxsed,  xvt(kz,ix,2,il) )
4483       xvt(kz,ix,3,il) = Min( vtmaxsed,  xvt(kz,ix,3,il) )
4484       
4485       vtmax = Max(vtmax,xvt(kz,ix,1,il)*dz2dinv(kz,ix))
4486       vtmax = Max(vtmax,xvt(kz,ix,2,il)*dz2dinv(kz,ix))
4487       vtmax = Max(vtmax,xvt(kz,ix,3,il)*dz2dinv(kz,ix))
4489 !      IF ( dtp*xvt(kz,ix,1,il)*dz2dinv(kz,ix) >= 0.7 .or. &
4490 !     &     dtp*xvt(kz,ix,2,il)*dz2dinv(kz,ix) >= 0.7 .or. &
4491 !     &     dtp*xvt(kz,ix,3,il)*dz2dinv(kz,ix) >= 0.7 ) THEN
4492 !          
4493 !          zmaxsed = Max(zmaxsed, float(kz) )
4494 !!          plo = Min(plo,kz)
4495 !!          phi = Max(phi,kz)
4496 !           
4497 !      ENDIF
4498       
4499       ENDDO
4500       
4501       IF ( vtmax == 0.0 ) CYCLE
4504       
4505       IF ( dtp*vtmax .lt. 0.7 ) THEN ! check whether multiple steps are needed.
4506         ndfall = 1
4507       ELSE
4508        IF ( dtp > 20.0 ) THEN ! more stringent subdivision for large time steps
4509          ndfall = Max(2, Int(dtp*vtmax/0.7) + 1)
4510        ELSE ! more relaxed for small time steps, but might still be a problem for very thin vertical layers near the ground
4511          ndfall = 1+Int(dtp*vtmax + 0.301)
4512        ENDIF
4513       ENDIF
4514       
4515       IF ( ndfall .gt. 1 ) THEN
4516         dtptmp = dtp/Real(ndfall)
4517 !        write(0,*) 'subdivide fallout on its,jts,ix,plo,phi = ',its,jts,ix,plo,phi
4518 !        write(0,*) 'for il,jsblab,c,ndfall = ',il,jslab,dtp*vtmax,ndfall
4519       ELSE
4520         dtptmp = dtp
4521       ENDIF
4522       
4523       dtfrac = dtptmp/dtp
4526       DO n = 1,ndfall
4528       IF ( do_accurate_sedimentation .and. n .ge. 2 .and. ( n == interval_sedi_vt*(n/interval_sedi_vt) ) ) THEN
4530 !  zero the precip flux arrays (2d)
4532       
4533       dummy = 0.d0
4535       xvt(kzb:kze,ix,1:3,il) = 0.0 ! reset to zero because routine will only compute points with q > qmin
4537       call ziegfall1d(nx,ny,nz,nor,norz,na,dtp,jgs,ix, & 
4538      &  xvt, rhovtzx, & 
4539      &  an,dn,ipconc,t0,t7,cwmasn,cwmasx, & 
4540      &  cwradn, & 
4541      &  qxmin,xdnmx,xdnmn,cdx,cno,xdn0,xvmn,xvmx, & 
4542      &  ngs,qx,qxw,cx,xv,vtxbar,xmas,xdn,xdia,vx,alpha,zx,igs,kgs, &
4543      &  rho0,temcg,temg,rhovt,cwnc,cinc,fadvisc,cwdia,cipmas,cnina,cimas, &
4544      &  cnostmp,             &
4545      &  infdo,il)
4548       DO kz = kzb,kze
4549       ! apply limit vtmaxsed (08/20/2015)
4550         xvt(kz,ix,1,il) = Min( vtmaxsed,  xvt(kz,ix,1,il) )
4551         xvt(kz,ix,2,il) = Min( vtmaxsed,  xvt(kz,ix,2,il) )
4552         xvt(kz,ix,3,il) = Min( vtmaxsed,  xvt(kz,ix,3,il) )
4553       ENDDO
4558       ENDIF ! (n .ge. 2)
4561         IF ( il >= lr .and. ( infall .eq. 3 .or. infall .eq. 4 ) .and. ln(il) > 0 ) THEN
4562            IF ( (il .eq. lr .and. irfall .eq. infall .and. lzr < 1) .or. & 
4563                  (il .ge. lh .and. lz(il) .lt. 1 ) .or. (il == ls .and. isfall == infall ) ) THEN
4564             call calczgr1d(nx,ny,nz,nor,na,an,ixe,kze, & 
4565      &         z,db1,jgs,ipconc, dnu(il), il, ln(il), qxmin(il), xvmn(il), xvmx(il), lvol(il), xdn0(il), ix )
4566            ENDIF
4567         ENDIF
4569       if (ndebug .gt. 0 ) write(0,*) 'dbg = 1b'
4571 ! mixing ratio
4573       call fallout1d(nx,ny,nz,nor,na,dtptmp,dtfrac,jgs,xvt(1,1,1,il), & 
4574      &             an,db1,il,1,xfall,dtz1,ix)
4577       if (ndebug .gt. 0 ) write(0,*) 'dbg = 3c'
4579 ! volume
4581       IF ( ldovol .and. il >= li ) THEN
4582         IF ( lvol(il) .gt. 1 ) THEN
4583          call fallout1d(nx,ny,nz,nor,na,dtptmp,dtfrac,jgs,xvt(1,1,1,il), & 
4584      &              an,db1,lvol(il),0,xfall,dtz1,ix)
4585         ENDIF
4586       ENDIF
4588 ! reflectivity
4590       IF ( ipconc .ge. 6 ) THEN
4591         IF ( lz(il) .gt. 1 ) THEN
4592          call fallout1d(nx,ny,nz,nor,na,dtptmp,dtfrac,jgs,xvt(1,1,3,il), & 
4593      &              an,db1,lz(il),0,xfall,dtz1,ix)
4594         ENDIF
4595       ENDIF
4597       if (ndebug .gt. 0 ) write(0,*) 'dbg = 3d'
4599       
4600       IF ( ipconc .gt. 0 ) THEN !{
4601         IF ( ipconc .ge. ipc(il) ) THEN
4603       IF ( ( infall .ge. 2 .or. (infall .eq. 0 .and. il .lt. lh) ) .and. lz(il) .lt. 1) THEN !{
4605 ! load number conc. into tmpn to do fallout by mass-weighted mean fall speed
4606 !  to put a lower bound on number conc.
4609         IF ( ( infall .eq. 3 .or. infall .eq. 4 ) .and. (  (il == ls .and. isfall .eq. infall ) &
4610      &        .or. il .eq. lh .or. il .eq. lhl .or.  il == lf .or. & 
4611      &      ( il .eq. lr .and. irfall .eq. infall) ) ) THEN
4613           ! set up for method I+II
4614           DO kz = kzb,kze
4615 !            DO ix = ixb,ixe
4616               tmpn2(ix,jy,kz) = z(ix,kz,il)
4617 !            ENDDO
4618           ENDDO
4619           DO kz = kzb,kze
4620 !            DO ix = ixb,ixe
4621               tmpn(ix,jy,kz) = an(ix,jy,kz,ln(il))
4622 !            ENDDO
4623           ENDDO
4624         
4625         ELSE
4626           ! set up for method II only
4627           DO kz = kzb,kze
4628 !            DO ix = ixb,ixe
4629               tmpn(ix,jy,kz) = an(ix,jy,kz,ln(il))
4630 !            ENDDO
4631           ENDDO
4633         ENDIF
4635       ENDIF !}
4638       if (ndebug .gt. 0 ) write(0,*) 'dbg = 3f'
4640        in = 2
4641        IF ( infall .eq. 1 ) in = 1
4643          call fallout1d(nx,ny,nz,nor,na,dtptmp,dtfrac,jgs,xvt(1,1,in,il), & 
4644      &        an,db1,ln(il),0,xfall,dtz1,ix)
4647          IF ( lz(il) .lt. 1 ) THEN ! if not 3-moment, run one of the correction schemes
4648          IF ( (infall .ge. 2 .or. infall .eq. 3) .and. .not. (infall .eq. 0 .and. il .ge. lh) & 
4649      &       .and. ( il .eq. lr .or. (il .ge. li .and. il .le. lhab) )) THEN
4650 !     :        .or. il .eq. lhl )) THEN
4651            
4652            xfall0(:,jgs) = 0.0
4654            IF ( ( infall .eq. 3 .or. infall .eq. 4 ) .and.  & 
4655      &        ( il .ge. lh .or. (il .eq. lr .and. irfall .eq. infall)    &
4656                    .or. (il .eq. ls .and. isfall .eq. infall) ) ) THEN
4657              call fallout1d(nx,ny,nz,nor,1,dtptmp,dtfrac,jgs,xvt(1,1,3,il), & 
4658      &         tmpn2,db1,1,0,xfall0,dtz1,ix)
4659              call fallout1d(nx,ny,nz,nor,1,dtptmp,dtfrac,jgs,xvt(1,1,1,il), & 
4660      &         tmpn,db1,1,0,xfall0,dtz1,ix)
4661            ELSE
4662              call fallout1d(nx,ny,nz,nor,1,dtptmp,dtfrac,jgs,xvt(1,1,1,il), & 
4663      &         tmpn,db1,1,0,xfall0,dtz1,ix)
4664            ENDIF
4666            IF ( ( infall .eq. 3 .or. infall .eq. 4 ) .and. ( (il .eq. lr .and. irfall .eq. infall) & 
4667      &            .or. il .ge. lh .or. (il == ls .and. isfall .eq. infall ) ) ) THEN
4668 ! "Method I" - dbz correction
4670              call calcnfromz1d(nx,ny,nz,nor,na,an,tmpn2,ixe,kze, & 
4671      &       z,db1,jgs,ipconc, dnu(il), il, ln(il), qxmin(il), xvmn(il), xvmx(il),tmpn,  & 
4672      &       lvol(il), xdn0(il), infall, ix)
4674            ELSEIF ( infall .eq. 5 .and. il .ge. lh .or. ( il == lr .and. irfall == 5 ) ) THEN
4676              DO kz = kzb,kze
4677 !              DO ix = ixb,ixe
4678                an(ix,jgs,kz,ln(il)) = Max( an(ix,jgs,kz,ln(il)), 0.5* ( an(ix,jgs,kz,ln(il)) + tmpn(ix,jy,kz) ))
4679               
4680 !              ENDDO
4681              ENDDO           
4683            ELSEIF ( .not. (il .eq. lr .and. irfall .eq. 0) .and. .not. (il .eq. ls .and. isfall .eq. 0) ) THEN
4684 ! "Method II" M-wgt N-fallout correction
4686              DO kz = kzb,kze
4687 !              DO ix = ixb,ixe
4689                an(ix,jgs,kz,ln(il)) = Max( an(ix,jgs,kz,ln(il)), tmpn(ix,jy,kz) )
4690               
4691 !              ENDDO
4692              ENDDO
4693            ENDIF 
4694            ENDIF ! lz(il) .lt. 1
4695            
4697          ENDIF
4698         ENDIF
4701       ENDIF !}
4704       ENDDO ! n=1,ndfall
4705       ENDDO ! il
4706       
4707       ENDDO ! ix
4710       deallocate( db1,dtz1,dz2dinv,db1inv,rhovtzx )
4711       deallocate( xfall0, xvt, tmpn )
4712       deallocate( tmpn2, z)
4714       deallocate( qx,  &
4715                 qxw,  &
4716                 cx,  &
4717                 xv,  &
4718                 vtxbar,  &
4719                 xmas,  &
4720                 xdn,  &
4721                 xdia,  &
4722                 vx,  &
4723                 alpha,  &
4724                 zx,     &
4725                 hasmass, &
4726                 igs,kgs, &
4727                 rho0,temcg,temg, rhovt, &
4728                 cwnc,cinc, &
4729                 fadvisc,cwdia,cipmas, &
4730                 cnina,cimas, &
4731                 cnostmp )
4733       RETURN
4734       END SUBROUTINE SEDIMENT1D
4737 ! #####################################################################
4740 ! #####################################################################
4744 !--------------------------------------------------------------------------
4746 !--------------------------------------------------------------------------
4748       subroutine fallout1d(nx,ny,nz,nor,na,dtp,dtfrac,jgs,vt,   &
4749      &  a,db1,ia,id,xfall,dtz1,ixcol)
4751 ! First-order, upwind fallout scheme
4753 !  Written by ERM 6/10/2011
4757       implicit none
4759       integer nx,ny,nz,nor,ngt,jgs,na,ia
4760       integer id ! =1 use density, =0 no density
4761       integer ng1
4762       parameter(ng1 = 1)
4763       integer :: ixcol
4765 !      real dz3dinv(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor)
4766 !      real a(nx,ny,nz,na)
4767       real a(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor,na) ! quantity to be 'advected'
4768       real vt(nz+1,nx)  ! terminal speed for a
4769       real dtp,dtfrac
4770       real cmax
4771       real xfall(nx,ny,na)  ! array for stuff landing on the ground
4772       real db1(nx,nz+1),dtz1(nz+1,nx,0:1)
4774 ! Local
4775            
4776       integer ix,jy,kz,n,k
4777       integer iv1,iv2
4778       real tmp
4779       integer imn,imx,kmn,kmx
4780       real qtmp1(nz+1)
4782 !-----------------------------------------------------------------------------
4784       integer :: ixb, jyb, kzb
4785       integer :: ixe, jye, kze
4787       logical :: debug_mpi = .TRUE.
4789 ! ###################################################################
4791       jy = 1
4793       iv1 = 0
4794       iv2 = 0
4796       imn = nx
4797       imx = 1
4798       kmn = nz
4799       kmx = 1
4801       cmax = 0.0
4803       kzb = 1
4804       kze = nz
4806       ixb = ixcol
4807       ixe = ixcol
4808       ix  = ixcol
4810       qtmp1(nz+1) = 0.0
4811       
4812       DO kz = kzb,kze
4813 !        DO ix = ixb,ixe
4814 !         cmax = Max(cmax, vt(ix,kz)*dz3dinv(ix,jy,kz)) 
4815          
4816          IF ( id == 1 ) THEN
4817          qtmp1(kz) = a(ix,jgs,kz,ia)*vt(kz,ix)*db1(ix,kz)
4818          ELSE
4819          qtmp1(kz) = a(ix,jgs,kz,ia)*vt(kz,ix)
4820          ENDIF
4821          
4822          IF ( a(ix,jgs,kz,ia) .ne. 0.0 ) THEN
4823 !           imn = Min(ix,imn)
4824 !           imx = Max(ix,imx)
4825            kmn = Min(kz,kmn)
4826            kmx = Max(kz,kmx)
4827          ENDIF
4828 !        ENDDO
4829       ENDDO
4830       
4831       kmn = Max(1,kmn-1)
4832       
4833 ! first check if fallout is worth doing
4834 !      IF ( cmax .eq. 0.0 .or. imn .gt. imx ) THEN
4835 !        RETURN
4836 !      ENDIF
4837       
4838       IF ( kmn == 1 ) THEN
4839       
4840       kz = 1
4841 !      do ix = imn,imx ! 1,nx-1
4842          xfall(ix,jy,ia) = xfall(ix,jy,ia) + a(ix,jgs,kz,ia)*vt(kz,ix)*dtfrac
4843 !      enddo
4844       
4845       ENDIF
4847       do kz = 1,nz
4848 !      do ix = 1,nx
4849         a(ix,jgs,kz,ia) =  a(ix,jgs,kz,ia) + dtp*dtz1(kz,ix,id)*(qtmp1(kz+1) - qtmp1(kz) )
4850 !      enddo
4851       enddo
4853       
4854       RETURN
4855       END SUBROUTINE FALLOUT1D
4857 ! ##############################################################################
4858 ! ##############################################################################
4860       subroutine calczgr1d(nx,ny,nz,nor,na,a,ixe,kze,              &
4861      &    z,db,jgs,ipconc, alpha, l,ln, qmin, xvmn,xvmx, lvol, rho_qx, ixcol)
4864       implicit none
4866       integer nx,ny,nz,nor,na,ngt,jgs
4867       integer :: ixcol
4868       integer, parameter :: norz = 3
4869       real a(-nor+1:nx+nor,-nor+1:ny+nor,-nor+1:nz+nor,na)
4870       real z(-nor+1:nx+nor,-nor+1:nz+nor,lr:lhab)   ! reflectivity
4871       real db(nx,nz+1)  ! air density
4872 !      real gt(-nor+1:nx+nor,-nor+1:ny+nor,-nor+1:nz+nor,ngt)
4874       integer ixe,kze
4875       real    alpha
4876       real    qmin
4877       real    xvmn,xvmx
4878       integer ipconc
4879       integer l   ! index for q
4880       integer ln  ! index for N
4881       integer lvol ! index for volume
4882       real    rho_qx
4885       integer ix,jy,kz
4886       real vr,qr,nrx,rd,xv,g1,zx,chw,xdn,ynu
4887       
4888       
4889       jy = jgs
4890       ix = ixcol
4891       
4892       IF ( l .eq. lh .or. l .eq. lhl .or. ( l .eq. lr .and. imurain == 1 )  &
4893            .or. ( l .eq. ls .and. imusnow == 1 ) ) THEN
4894       
4895       
4896       DO kz = 1,kze
4897           
4898           
4899           
4900           IF (  a(ix,jy,kz,l) .gt. qmin .and. a(ix,jy,kz,ln) .gt. 1.e-15 ) THEN
4901             
4902             IF ( lvol .gt. 1 ) THEN
4903                 IF ( a(ix,jy,kz,lvol) .gt. 0.0 ) THEN
4904                   xdn = db(ix,kz)*a(ix,jy,kz,l)/a(ix,jy,kz,lvol)
4905                   xdn = Min( 900., Max( hdnmn, xdn ) )
4906                 ELSE
4907                   xdn = rho_qx
4908                 ENDIF
4909             ELSE
4910                 xdn = rho_qx
4911             ENDIF
4913             IF ( l == lr ) xdn = 1000.
4915             qr = a(ix,jy,kz,l)
4916             xv = db(ix,kz)*a(ix,jy,kz,l)/(xdn*a(ix,jy,kz,ln))
4917             chw = a(ix,jy,kz,ln)
4919              IF ( xv .lt. xvmn .or. xv .gt. xvmx ) THEN
4920               xv = Min( xvmx, Max( xvmn,xv ) )
4921               chw = db(ix,kz)*a(ix,jy,kz,l)/(xv*xdn)
4922              ENDIF
4924              g1 = (6.0 + alpha)*(5.0 + alpha)*(4.0 + alpha)/  &
4925      &            ((3.0 + alpha)*(2.0 + alpha)*(1.0 + alpha))
4926              zx = g1*db(ix,kz)**2*(a(ix,jy,kz,l))*a(ix,jy,kz,l)/chw
4927 !             z(ix,kz,l)  = 1.e18*zx*(6./(pi*1000.))**2
4928              z(ix,kz,l)  = zx*(6./(pi*1000.))**2
4931 !          IF ( ny.eq.2 .and. kz .ge. 25 .and. kz .le. 29 .and. z(ix,kz,l) .gt. 0. ) THEN
4932 !             write(*,*) 'calczgr: z,dbz,xdn = ',ix,kz,z(ix,kz,l),10*log10(z(ix,kz,l)),xdn
4933 !          ENDIF
4934           
4935           ELSE
4936            
4937             z(ix,kz,l) = 0.0
4938            
4939           ENDIF
4940           
4941       ENDDO
4942       
4943       ELSEIF ( (l == ls .and. imusnow == 3) .or. ( l .eq. lr .and. imurain == 3 ) ) THEN
4945       xdn = rho_qx ! 1000.
4946       IF ( l == ls ) ynu = snu
4947       IF ( l == lr ) ynu = rnu
4948       
4949       DO kz = 1,kze
4951           IF (  a(ix,jy,kz,l) .gt. qmin .and. a(ix,jy,kz,ln) .gt. 1.e-15 ) THEN
4953             vr = db(ix,kz)*a(ix,jy,kz,l)/(xdn*a(ix,jy,kz,ln))
4954 !            z(ix,kz,l) = 3.6e18*(ynu+2.0)*a(ix,jy,kz,ln)*vr**2/(ynu+1.0)
4955             z(ix,kz,l) = 3.6*(ynu+2.0)*a(ix,jy,kz,ln)*vr**2/(ynu+1.0)
4956 !            qr = a(ix,jy,kz,lr)
4957 !            nrx = a(ix,jy,kz,lnr)
4958           
4959           ELSE
4960            
4961             z(ix,kz,l) = 0.0
4962            
4963           ENDIF
4964       
4965           
4966       ENDDO
4967       
4968       ENDIF
4969       
4970       RETURN
4971       
4972       END subroutine calczgr1d
4974 ! ##############################################################################
4975 ! ##############################################################################
4977 !  Subroutine to correct number concentration to prevent reflectivity growth by 
4978 !  sedimentation in 2-moment ZXX scheme.
4979 !  Calculation is in a slab (constant jgs)
4982       subroutine calcnfromz1d(nx,ny,nz,nor,na,a,t0,ixe,kze,    &
4983      &    z0,db,jgs,ipconc, alpha, l,ln, qmin, xvmn,xvmx,t1, &
4984      &    lvol, rho_qx, infall, ixcol)
4986       
4987       implicit none
4989       integer nx,ny,nz,nor,na,ngt,jgs,ixcol
4991       real a(-nor+1:nx+nor,-nor+1:ny+nor,-nor+1:nz+nor,na)  ! sedimented N and q
4992       real t0(-nor+1:nx+nor,-nor+1:ny+nor,-nor+1:nz+nor)    ! sedimented reflectivity
4993       real t1(-nor+1:nx+nor,-nor+1:ny+nor,-nor+1:nz+nor)    ! sedimented N (by Vm)
4994 !      real gt(-nor+1:nx+nor,-nor+1:ny+nor,-nor+1:nz+nor,ngt)
4995       real z0(-nor+1:nx+nor,-nor+1:nz+nor,lr:lhab)   ! initial reflectivity
4997       real db(nx,nz+1)  ! air density
4998       
4999       integer ixe,kze
5000       real    alpha
5001       real    qmin
5002       real    xvmn,xvmx
5003       integer ipconc
5004       integer l   ! index for q
5005       integer ln  ! index for N
5006       integer lvol ! index for volume
5007       real    rho_qx
5008       integer infall
5009       
5010       
5011       integer ix,jy,kz
5012       double precision vr,qr,nrx,rd,g1,zx,chw,z,znew,zt,zxt
5013       real xv,xdn
5014       integer :: ndbz, nmwgt, nnwgt, nwlessthanz
5015       
5016       ndbz = 0
5017       nmwgt = 0
5018       nnwgt = 0
5019       nwlessthanz = 0
5020       
5022       
5023       jy = jgs
5024       ix = ixcol
5025       
5026       IF ( l .eq. lh .or. l .eq. lhl .or. ( l == lr .and. imurain == 1 ) ) THEN
5027       
5028              g1 = (6.0 + alpha)*(5.0 + alpha)*(4.0 + alpha)/  &
5029      &            ((3.0 + alpha)*(2.0 + alpha)*(1.0 + alpha))
5030       
5031       DO kz = 1,kze
5033          
5034           IF (   t0(ix,jy,kz) .gt. 0. ) THEN ! {
5035             
5036             IF ( lvol .gt. 1 ) THEN
5037                IF ( a(ix,jy,kz,lvol) .gt. 0.0 ) THEN
5038                  xdn = db(ix,kz)*a(ix,jy,kz,l)/a(ix,jy,kz,lvol)
5039                  xdn = Min( 900., Max( hdnmn, xdn ) )
5040                ELSE 
5041                  xdn = rho_qx
5042                ENDIF
5043             ELSE
5044                xdn = rho_qx
5045             ENDIF
5046             
5047             IF ( l == lr ) xdn = 1000.
5048           
5049             qr = a(ix,jy,kz,l)
5050             xv = db(ix,kz)*a(ix,jy,kz,l)/(xdn*a(ix,jy,kz,ln))
5051             chw = a(ix,jy,kz,ln)
5053              IF ( xv .lt. xvmn .or. xv .gt. xvmx ) THEN
5054               xv = Min( xvmx, Max( xvmn,xv ) )
5055               chw = db(ix,kz)*a(ix,jy,kz,l)/(xv*xdn)
5056              ENDIF
5058              zx = g1*db(ix,kz)**2*( a(ix,jy,kz,l))*a(ix,jy,kz,l)/chw
5059              z  = zx*(6./(pi*1000.))**2
5061             
5062            IF ( (z .gt. t0(ix,jy,kz) .and. z .gt. 0.0 .and.  &
5063      &           t0(ix,jy,kz) .gt. z0(ix,kz,l) )) THEN !{
5064            
5065             zx = t0(ix,jy,kz)/((6./(pi*1000.))**2)
5066             
5067             nrx =  g1*db(ix,kz)**2*( a(ix,jy,kz,l))*a(ix,jy,kz,l)/zx
5068             IF ( infall .eq. 3 ) THEN
5069               IF ( nrx .gt. a(ix,jy,kz,ln) ) THEN
5070                 ndbz = ndbz + 1
5071                 IF ( t1(ix,jy,kz) .lt. ndbz ) nwlessthanz = nwlessthanz + 1
5072               ELSE
5073                 nnwgt = nnwgt + 1
5074               ENDIF
5075               a(ix,jy,kz,ln) = Max( real(nrx), a(ix,jy,kz,ln) )
5076             ELSE
5077              IF (  nrx .gt. a(ix,jy,kz,ln) .and. t1(ix,jy,kz) .gt. a(ix,jy,kz,ln) ) THEN
5078               IF ( nrx .lt. t1(ix,jy,kz)  ) THEN
5079                 ndbz = ndbz + 1
5080               ELSE
5081                 nmwgt = nmwgt + 1
5082                 IF ( t1(ix,jy,kz) .lt. ndbz ) nwlessthanz = nwlessthanz + 1
5083               ENDIF
5084              ELSE
5085               nnwgt = nnwgt + 1
5086              ENDIF
5087               
5088               a(ix,jy,kz,ln) = Max(Min( real(nrx), t1(ix,jy,kz) ), a(ix,jy,kz,ln) )
5089             ENDIF
5091            ELSE ! } {
5092              IF ( t1(ix,jy,kz) .gt. 0 .and. a(ix,jy,kz,ln) .gt. 0 ) THEN
5093               IF ( t1(ix,jy,kz) .gt. a(ix,jy,kz,ln) ) THEN
5094                 nmwgt = nmwgt + 1
5095               ELSE
5096                 nnwgt = nnwgt + 1
5097               ENDIF
5098             ENDIF
5099             a(ix,jy,kz,ln) = Max(t1(ix,jy,kz), a(ix,jy,kz,ln) )
5100             nrx = a(ix,jy,kz,ln)
5104            ENDIF ! }
5106            ! }
5107           ELSE ! {
5108             IF ( t1(ix,jy,kz) .gt. 0 .and. a(ix,jy,kz,ln) .gt. 0 ) THEN
5109               IF ( t1(ix,jy,kz) .gt. a(ix,jy,kz,ln) ) THEN
5110                 nmwgt = nmwgt + 1
5111               ELSE
5112                 nnwgt = nnwgt + 1
5113               ENDIF
5114             ENDIF
5115           ENDIF! }
5116           
5117       ENDDO
5118       
5119       
5120       ELSEIF ( l .eq. lr .and. imurain == 3) THEN
5122       xdn = 1000.
5123       
5124       DO kz = 1,kze
5125           IF (  t0(ix,jy,kz) .gt. 0. ) THEN
5127             vr = db(ix,kz)*a(ix,jy,kz,l)/(xdn*a(ix,jy,kz,ln))
5128             z = 3.6*(rnu+2.0)*a(ix,jy,kz,ln)*vr**2/(rnu+1.0)
5129           
5130              IF ( z .gt. t0(ix,jy,kz) .and. z .gt. 0.0 .and.  &
5131      &          t0(ix,jy,kz) .gt. 0.0                         &
5132      &          .and. t0(ix,jy,kz) .gt. z0(ix,kz,l) ) THEN
5134             vr = db(ix,kz)*a(ix,jy,kz,l)/(xdn)
5135              chw =  a(ix,jy,kz,ln)
5136             nrx =   3.6*(rnu+2.0)*vr**2/((rnu+1.0)*t0(ix,jy,kz))
5137              IF ( infall .eq. 3 ) THEN
5138               a(ix,jy,kz,ln) = Max( real(nrx), a(ix,jy,kz,ln) )
5139             ELSEIF ( infall .eq. 4 ) THEN
5140               a(ix,jy,kz,ln) = Max( Min( real(nrx), t1(ix,jy,kz)), a(ix,jy,kz,ln) )
5141             ENDIF
5143            ELSE
5145             a(ix,jy,kz,ln) = Max(t1(ix,jy,kz), a(ix,jy,kz,ln) )
5147            ENDIF
5149           ELSE
5151             a(ix,jy,kz,ln) = Max(t1(ix,jy,kz), a(ix,jy,kz,ln) )
5153           ENDIF
5156       ENDDO
5158       ENDIF
5160       RETURN
5162       END subroutine calcnfromz1d
5165 ! ##############################################################################
5166 ! ##############################################################################
5168 !  Subroutine to calculate number concentrations from initial state that has only mixing ratio.
5169 !  Output N will be in #/m^3 in 'an' array, since sedimentation is done next.
5170 !  Output ccw,cci etc. will be in #/kg
5173 ! 10.27.2015: Added hail calculation
5175       subroutine calcnfromq(nx,ny,nz,an,na,nor,norz,dn, &
5176      &  qcw,qci,qsw,qrw,qhw,qhl, &
5177      &  ccw,cci,csw,crw,chw,chl, &
5178      &  cccn,cccna, vhw,vhl,qv,spechum, invertccn_flag, cwmasin )
5179       
5181       
5182       implicit none
5184       integer nx,ny,nz,nor,norz,na,ngt,jgs,ixcol
5186       real an(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz,na)  ! scalars (q, N, Z)
5188       real dn(nx,nz+1)  ! air density
5190       real, optional, dimension(nx,nz), intent(inout) :: qcw,qci,qsw,qrw,qhw,qhl, &
5191                                           ccw,cci,csw,crw,chw,chl, &
5192                                           cccn,cccna,vhw,vhl,qv, spechum
5193       logical, optional, intent(in) :: invertccn_flag
5194       real, optional :: cwmasin
5195       
5196       integer ixe,kze
5197       real    alpha
5198       real    qmin
5199       real    xvmn,xvmx
5200       integer ipconc
5201       integer lvol ! index for volume
5202       integer infall
5203       
5204       
5205       integer ix,jy,kz
5206       double precision vr,q,nrx,nrx2,rd,g1h,g1hl,g1r,g1s,zx,z,znew,zt,zxt,n1,laminv1
5207       double precision :: zr, zs, zh, dninv
5208       real, parameter :: xn0s = 3.0e6, xn0r = 8.0e6, xn0h = 2.0e5, xn0hl = 4.0e4
5209       real, parameter :: xdnr = 1000., xdns = 100. ,xdnh = 700.0, xdnhl = 900.0
5210       real, parameter :: zhlfac = 1./(pi*xdnhl*xn0hl)
5211       real, parameter :: zhfac = 1./(pi*xdnh*xn0h)
5212       real, parameter :: zrfac = 1./(pi*xdnr*xn0r)
5213       real, parameter :: zsfac = 1./(pi*xdns*xn0s)
5214       real, parameter :: g0 = (6.0)*(5.0)*(4.0)/((3.0)*(2.0)*(1.0))
5215       real, parameter :: xims=900.*0.523599*(2.*50.e-6)**3    ! mks   (100 micron diam solid sphere approx)
5216       real, parameter :: xgms=xdnh*0.523599*(300.e-6)**3    ! mks   (300 micron diam  sphere approx)
5217       real, parameter :: cwmas09 = 1000.*0.523599*(2.*9.e-6)**3 ! mass of 9-micron radius droplet
5219       real xv,xdn,cwmasinv
5220       integer :: ndbz, nmwgt, nnwgt, nwlessthanz
5221       double precision :: mixconv, mixconvqv, qsmax,qsmax2,qsmax3,qsmax4
5222       logical :: invertccn_local
5224 ! ------------------------------------------------------------------
5225       
5226       IF ( present( invertccn_flag ) ) THEN
5227         invertccn_local = invertccn_flag
5228       ELSE
5229         invertccn_local = .false.
5230       ENDIF
5231       
5232       IF ( present( cwmasin ) ) THEN
5233         cwmasinv = 1.0/cwmasin
5234       ELSE
5235         cwmasinv = 1.0/cwmas09
5236       ENDIF
5237       
5238       jy = 1
5239       
5240       
5241          g1h = (6.0 + alphah)*(5.0 + alphah)*(4.0 + alphah)/  &
5242      &        ((3.0 + alphah)*(2.0 + alphah)*(1.0 + alphah))
5244          g1hl = (6.0 + alphahl)*(5.0 + alphahl)*(4.0 + alphahl)/  &
5245      &        ((3.0 + alphahl)*(2.0 + alphahl)*(1.0 + alphahl))
5246      
5247          IF ( imurain == 3 ) THEN
5248          g1r = (rnu+2.0)/(rnu+1.0)
5249          ELSE ! imurain == 1
5250          g1r = (6.0 + alphar)*(5.0 + alphar)*(4.0 + alphar)/  &
5251      &        ((3.0 + alphar)*(2.0 + alphar)*(1.0 + alphar))
5252          ENDIF
5254          g1s = (snu+2.0)/(snu+1.0)
5255       qsmax = 0
5256       qsmax2 = 0
5257       qsmax3 = 0
5258       qsmax4 = 0
5259 !      IF ( .not. present( qcw ) ) THEN
5260       DO kz = 1,nz
5261        DO ix = 1,nx ! ixcol
5263 !         qv_mp = spechum/(1.0_kind_phys-spechum)
5264 !         IF ( convertdry ) THEN
5265 !         qc_mp = qc/(1.0_kind_phys-spechum)
5266         mixconv = 1
5267         IF ( present( spechum ) ) THEN ! convert to "dry" mixing ratios
5268           an(ix,jy,kz,lv)  = spechum(ix,kz)/(1.0d0 - spechum(ix,kz))
5269           mixconv = 1.0d0/(1.0d0 - spechum(ix,kz))
5270         ELSE
5271           mixconv = 1.0d0
5272         ENDIF
5273         IF ( present( qv ) ) an(ix,jy,kz,lv) = qv(ix,kz) ! assume qv is "dry" mixing ratio if passed in
5274         IF ( present( qcw ) ) an(ix,jy,kz,lc) = qcw(ix,kz)*mixconv
5275         IF ( present( qrw ) ) an(ix,jy,kz,lr) = qrw(ix,kz)*mixconv
5276         IF ( present( qci ) ) an(ix,jy,kz,li) = qci(ix,kz)*mixconv
5277         IF ( present( qsw ) ) THEN
5278           an(ix,jy,kz,ls) = qsw(ix,kz)*mixconv
5279 !          qsmax = Max( qsmax, qsw(ix,kz) )
5280 !          qsmax2 = Max( qsmax2, an(ix,jy,kz,ls) )
5281         ENDIF
5282         IF ( present( qhw ) ) an(ix,jy,kz,lh) = qhw(ix,kz)*mixconv
5283         IF ( lhl > 1 .and. present( qhl ) ) an(ix,jy,kz,lhl) = qhl(ix,kz)*mixconv
5284         IF ( present( ccw ) ) an(ix,jy,kz,lnc) = ccw(ix,kz)*mixconv*dn(ix,kz)
5285         IF ( present( crw ) ) an(ix,jy,kz,lnr) = crw(ix,kz)*mixconv*dn(ix,kz)
5286         IF ( present( cci ) ) an(ix,jy,kz,lni) = cci(ix,kz)*mixconv*dn(ix,kz)
5287         IF ( present( csw ) ) an(ix,jy,kz,lns) = csw(ix,kz)*mixconv*dn(ix,kz)
5288         IF ( present( chw ) ) an(ix,jy,kz,lnh) = chw(ix,kz)*mixconv*dn(ix,kz)
5289         IF ( lhl > 1 .and. present( chl ) ) an(ix,jy,kz,lnhl) = chl(ix,kz)*mixconv*dn(ix,kz)
5290         IF ( lvh > 1 .and. present( vhw ) ) an(ix,jy,kz,lvh) = vhw(ix,kz)*mixconv
5291         IF ( lvhl > 1 .and. present( vhl ) ) an(ix,jy,kz,lvhl) = vhl(ix,kz)*mixconv
5292         IF ( lccn > 1 .and. present( cccn ) ) an(ix,jy,kz,lccn) = cccn(ix,kz)*mixconv*dn(ix,kz)
5293         IF ( lccna > 1 .and. present( cccna ) ) an(ix,jy,kz,lccna) = cccna(ix,kz)*mixconv
5295          dninv = 1./dn(ix,kz)
5296          
5297 !        IF ( .not. present( qcw ) ) THEN
5298    !  Cloud droplets
5299          
5300          IF ( lnc > 1 ) THEN
5301            IF ( an(ix,jy,kz,lnc) <= cxmin .and. an(ix,jy,kz,lc) > qxmin_init(lc) ) THEN
5302              
5303              an(ix,jy,kz,lnc) = Min(qccn, an(ix,jy,kz,lc)*cwmasinv )*dn(ix,kz)
5304              
5305              IF ( invertccn_local ) THEN
5306                an(ix,jy,kz,lccn) = an(ix,jy,kz,lccn) + an(ix,jy,kz,lnc)
5307              ELSE
5308              
5309              IF ( lccn > 1 .and. lccna < 1 ) THEN
5310                 an(ix,jy,kz,lccn) = an(ix,jy,kz,lccn) - an(ix,jy,kz,lnc)
5311              ENDIF
5312              IF ( lccna > 1 ) THEN
5313                 an(ix,jy,kz,lccna) = an(ix,jy,kz,lccna) + an(ix,jy,kz,lnc)
5314              ENDIF
5315              ENDIF
5317            ELSEIF ( an(ix,jy,kz,lc) <= qxmin(lc) .or.  &
5318                     ( an(ix,jy,kz,lnc) <= cxmin .and. an(ix,jy,kz,lc) <= qxmin_init(lc)) ) THEN
5319              
5320              an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,lc)
5321              an(ix,jy,kz,lnc) = 0.0
5322              an(ix,jy,kz,lc) = 0.0
5323            
5324            ENDIF
5325          ENDIF
5327    !  Cloud ice
5328          
5329          IF ( lni > 1 ) THEN
5330            IF ( an(ix,jy,kz,lni) <= cxmin .and. an(ix,jy,kz,li) > qxmin_init(li) ) THEN
5331              an(ix,jy,kz,lni) = dn(ix,kz)*an(ix,jy,kz,li)/xims
5332            
5333            ELSEIF ( an(ix,jy,kz,li) <= qxmin(li) .or. &
5334                     ( an(ix,jy,kz,lni) <= cxmin .and. an(ix,jy,kz,li) <= qxmin_init(li)) ) THEN
5335              an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,li)
5336              an(ix,jy,kz,lni) = 0.0
5337              an(ix,jy,kz,li) = 0.0
5338            ENDIF
5339          ENDIF
5341    !  rain
5342          
5343          IF ( lnr > 1 ) THEN
5344            IF ( an(ix,jy,kz,lnr) <= 0.1*cxmin .and. an(ix,jy,kz,lr) > qxmin_init(lr) ) THEN
5346              q = an(ix,jy,kz,lr)
5347              
5348              laminv1 = (dn(ix,kz) * q * zrfac)**(0.25)  ! inverse of slope
5349              
5350              n1 = laminv1*xn0r  ! number concentration for inv. exponential single moment input
5351              
5352              nrx =  n1*g1r/g0   ! number concentration for different shape parameter
5354              an(ix,jy,kz,lnr) = nrx ! *dninv ! convert to number mixing ratio
5355              
5356            ELSEIF ( an(ix,jy,kz,lr) <= qxmin(lr) .or. &
5357                     ( an(ix,jy,kz,lnr) <= cxmin .and. an(ix,jy,kz,lr) <= qxmin_init(lr)) ) THEN
5358              an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,lr)
5359              an(ix,jy,kz,lnr) = 0.0
5360              an(ix,jy,kz,lr) = 0.0
5361            ENDIF
5362          ENDIF
5364              IF ( lzr > 1 ) THEN ! set reflectivity moment
5365                IF ( an(ix,jy,kz,lr) > qxmin_init(lr) .and. an(ix,jy,kz,lzr) < zxmin .and. &
5366                     an(ix,jy,kz,lnr) > cxmin ) THEN
5367                   q = an(ix,jy,kz,lr)
5368                   nrx = an(ix,jy,kz,lnr)
5369                   an(ix,jy,kz,lzr) = 36.*g1r*dn(ix,kz)**2*q**2/(pi**2*xdnr**2*nrx) ! *dninv
5370                ENDIF
5371              ENDIF
5373   ! snow
5374          IF ( lns > 1 ) THEN
5375            IF ( an(ix,jy,kz,lns) <= 0.1*cxmin .and. an(ix,jy,kz,ls) > qxmin_init(ls) ) THEN
5377              q = an(ix,jy,kz,ls)
5378              
5379              laminv1 = (dn(ix,kz) * q * zsfac)**(0.25)  ! inverse of slope
5380              
5381              n1 = laminv1*xn0s  ! number concentration for inv. exponential single moment input
5382              
5383              nrx =  n1*g1s/g0   ! number concentration for different shape parameter
5385              an(ix,jy,kz,lns) = nrx ! *dninv ! convert to number mixing ratio
5387            ELSEIF ( an(ix,jy,kz,ls) <= qxmin(ls) .or. &
5388                     ( an(ix,jy,kz,lns) <= cxmin .and. an(ix,jy,kz,ls) <= qxmin_init(ls)) ) THEN
5389              an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,ls)
5390              an(ix,jy,kz,lns) = 0.0
5391              an(ix,jy,kz,ls) = 0.0
5392              
5393            ENDIF
5394          ENDIF
5395          
5396     ! graupel
5398          IF ( lnh > 1 ) THEN
5399            IF ( an(ix,jy,kz,lnh) <= 0.1*cxmin .and. an(ix,jy,kz,lh) > qxmin_init(lh) ) THEN
5400              IF ( lvh > 1 ) THEN
5401                IF ( an(ix,jy,kz,lvh) <= 0.0 ) THEN
5402                  an(ix,jy,kz,lvh) = an(ix,jy,kz,lh)/xdnh
5403                ENDIF
5404              ENDIF
5406              q = an(ix,jy,kz,lh)
5407              
5408              laminv1 = (dn(ix,kz) * q * zhfac)**(0.25)  ! inverse of slope
5409              
5410              n1 = laminv1*xn0h  ! number concentration for inv. exponential single moment input
5411              
5412              nrx =  n1*g1h/g0   ! number concentration for different shape parameter
5414              nrx2 = dn(ix,kz) * q / xgms
5415              
5416              nrx = Min( nrx, nrx2 )
5418              IF ( nrx > cxmin ) THEN
5419                an(ix,jy,kz,lnh) = nrx ! *dninv ! convert to number mixing ratio
5420              ELSE
5421                an(ix,jy,kz,lh) = 0.0
5422                an(ix,jy,kz,lnh) = 0.0
5423                an(ix,jy,kz,lvh) = 0.0
5424              ENDIF
5426            ELSEIF ( an(ix,jy,kz,lh) <= qxmin(lh) .or. &
5427                     ( an(ix,jy,kz,lnh) <= cxmin .and. an(ix,jy,kz,lh) <= qxmin_init(lh)) ) THEN
5428            
5429               an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,lh)
5430               an(ix,jy,kz,lh) = 0.0
5431            
5432            ENDIF
5433          ENDIF
5435              IF ( lzh > 1 ) THEN ! set reflectivity moment
5436                IF ( an(ix,jy,kz,lh) > qxmin_init(lh) .and. an(ix,jy,kz,lzh) < zxmin .and. &
5437                     an(ix,jy,kz,lnh) > cxmin ) THEN
5438                   q = an(ix,jy,kz,lh)
5439                   nrx = an(ix,jy,kz,lnh)
5440                   an(ix,jy,kz,lzh) = 36.*g1h*dn(ix,kz)**2*q**2/(pi**2*xdnh**2*nrx) ! *dninv
5441                ENDIF
5442              ENDIF
5444     ! hail
5446          IF ( lnhl > 1 .and. lhl > 1 ) THEN
5447            IF ( an(ix,jy,kz,lnhl) <= 0.1*cxmin .and. an(ix,jy,kz,lhl) > qxmin_init(lhl) ) THEN
5448              IF ( lvhl > 1 ) THEN
5449                IF ( an(ix,jy,kz,lvhl) <= 0.0 ) THEN
5450                  an(ix,jy,kz,lvhl) = an(ix,jy,kz,lhl)/xdnhl
5451                ENDIF
5452              ENDIF
5454              q = an(ix,jy,kz,lhl)
5455              
5456              laminv1 = (dn(ix,kz) * q * zhlfac)**(0.25)  ! inverse of slope
5457              
5458              n1 = laminv1*xn0hl  ! number concentration for inv. exponential single moment input
5459              
5460              nrx =  n1*g1hl/g0   ! number concentration for different shape parameter
5462              an(ix,jy,kz,lnhl) = nrx ! *dninv ! convert to number mixing ratio
5464            ELSEIF ( an(ix,jy,kz,lhl) <= qxmin(lhl) .or.  &
5465                    ( an(ix,jy,kz,lnhl) <= cxmin .and. an(ix,jy,kz,lhl) <= qxmin_init(lhl)) ) THEN
5466            
5467               an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,lhl)
5468               an(ix,jy,kz,lhl) = 0.0
5469            
5470            ENDIF
5471          ENDIF
5473              IF ( lzhl > 1 ) THEN ! set reflectivity moment
5474                IF ( an(ix,jy,kz,lhl) > qxmin_init(lhl) .and. an(ix,jy,kz,lzhl) < zxmin .and. &
5475                     an(ix,jy,kz,lnhl) > cxmin ) THEN
5476                   q = an(ix,jy,kz,lhl)
5477                   nrx = an(ix,jy,kz,lnhl)
5478                   an(ix,jy,kz,lzhl) = 36.*g1hl*dn(ix,kz)**2*q**2/(pi**2*xdnhl**2*nrx) ! *dninv
5479                ENDIF
5480              ENDIF
5481          
5482          
5483 !         ENDIF
5485 !         spechum = qv_mp/(1.0_kind_phys+qv_mp)
5486 !         IF ( convertdry ) THEN
5487 !         qc      = qc_mp/(1.0_kind_phys+qv_mp)
5488         mixconvqv = 1
5489         IF ( present( spechum ) ) THEN ! convert back to "dry+vapor" mixing ratios
5490           !an(ix,jy,kz,lv)  = spechum(ix,kz)/(1.0d0 - spechum(ix,kz))
5491           mixconvqv = 1.0d0/(1.0d0 + an(ix,jy,kz,lv))
5492           spechum(ix,kz) = an(ix,jy,kz,lv)*mixconvqv
5493         ELSE
5494           mixconvqv = 1.0d0
5495         ENDIF
5497         IF ( present( qv ) )  qv(ix,kz)  = an(ix,jy,kz,lv)
5498         IF ( present( qcw ) ) qcw(ix,kz) = an(ix,jy,kz,lc)*mixconvqv
5499         IF ( present( qrw ) ) qrw(ix,kz) = an(ix,jy,kz,lr)*mixconvqv
5500         IF ( present( qci ) ) qci(ix,kz) = an(ix,jy,kz,li)*mixconvqv
5501         IF ( present( qsw ) ) THEN
5502           qsw(ix,kz) = an(ix,jy,kz,ls)*mixconvqv
5503 !          qsmax3 = Max( qsmax3, qsw(ix,kz) )
5504 !          qsmax4 = Max( qsmax4, an(ix,jy,kz,ls) )
5505         ENDIF
5506         IF ( present( qhw ) ) qhw(ix,kz) = an(ix,jy,kz,lh)*mixconvqv
5507         IF ( lhl > 1 .and. present( qhl ) ) qhl(ix,kz) = an(ix,jy,kz,lhl)*mixconvqv
5508         IF ( present( ccw ) ) ccw(ix,kz) = an(ix,jy,kz,lnc)*mixconvqv*dninv
5509         IF ( present( crw ) ) crw(ix,kz) = an(ix,jy,kz,lnr)*mixconvqv*dninv
5510         IF ( present( cci ) ) cci(ix,kz) = an(ix,jy,kz,lni)*mixconvqv*dninv
5511         IF ( present( csw ) ) csw(ix,kz) = an(ix,jy,kz,lns)*mixconvqv*dninv
5512         IF ( present( chw ) ) chw(ix,kz) = an(ix,jy,kz,lnh)*mixconvqv*dninv
5513         IF ( lhl > 1 .and. present( chl ) ) chl(ix,kz) = an(ix,jy,kz,lnhl)*mixconvqv*dninv
5514         IF ( lvh > 1 .and. present( vhw ) ) vhw(ix,kz) = an(ix,jy,kz,lvh)*mixconvqv
5515         IF ( lvhl > 1 .and. present( vhl ) ) vhl(ix,kz) = an(ix,jy,kz,lvhl)*mixconvqv
5516         IF ( lccn > 1 .and. present( cccn ) ) cccn(ix,kz) = an(ix,jy,kz,lccn)*mixconvqv*dninv
5517         IF ( lccna > 1 .and. present( cccna ) ) cccna(ix,kz) = an(ix,jy,kz,lccna)*mixconvqv
5520       ENDDO ! ix
5521       ENDDO ! kz
5522 !      ELSE
5523 !        write(0,*) 'calcnfromq: lv = ',lv,lc,lr,li,ls,lh,lvh,lhl,lccn,lccna
5524 !        write(0,*) 'calcnfromq: nx,ny,nz,na = ',nx,ny,nz,na
5525 !      
5526 !      ENDIF
5527       
5528 !      IF ( present( qsw ) ) THEN
5529 !      write(0,*) 'calcnfromq: qsmax = ',qsmax,qsmax2,qsmax3,qsmax4
5530 !      ENDIF
5531       
5532       RETURN
5533       
5534       END subroutine calcnfromq
5536 ! ##############################################################################
5537 ! ##############################################################################
5539 !  Subroutine to calculate number concentrations from convection parameterization rates that have only mixing ratio.
5540 !  N will be in #/kg, NOT #/m^3, since sedimentation is done next.
5544 ! 10.27.2015: Added hail calculation
5546       subroutine calcnfromcuten(nx,ny,nz,an,anold,na,nor,norz,dn)
5548       
5549       implicit none
5551       integer nx,ny,nz,nor,norz,na,ngt,jgs,ixcol
5553       real an(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz,na)  ! scalars (q, N, Z) from CUTEN arrays
5554       real anold(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz,na)  ! scalars (q, N, Z)
5556       real dn(nx,nz+1)  ! air density
5557       
5558       integer ixe,kze
5559       real    alpha
5560       real    qmin
5561       real    xvmn,xvmx
5562       integer ipconc
5563       integer lvol ! index for volume
5564       integer infall
5565       
5566       
5567       integer ix,jy,kz
5568       double precision vr,q,nrx,rd,g1h,g1hl,g1r,g1s,zx,chw,z,znew,zt,zxt,n1,laminv1
5569       double precision :: zr, zs, zh, dninv
5570       real, parameter :: xn0s = 3.0e6, xn0r = 8.0e6, xn0h = 4.0e4, xn0hl = 4.0e4
5571       real, parameter :: xdnr = 1000., xdns = 100. ,xdnh = 700.0, xdnhl = 900.0
5572       real, parameter :: zhlfac = 1./(pi*xdnhl*xn0hl)
5573       real, parameter :: zhfac = 1./(pi*xdnh*xn0h)
5574       real, parameter :: zrfac = 1./(pi*xdnr*xn0r)
5575       real, parameter :: zsfac = 1./(pi*xdns*xn0s)
5576       real, parameter :: g0 = (6.0)*(5.0)*(4.0)/((3.0)*(2.0)*(1.0))
5577       real, parameter :: xims=900.*0.523599*(2.*50.e-6)**3    ! mks   (100 micron diam solid sphere approx)
5578       real, parameter :: xcms=1000.*0.523599*(2.*7.5e-6)**3    ! mks   (100 micron diam solid sphere approx)
5580       real :: xmass,xv,xdn
5581       integer :: ndbz, nmwgt, nnwgt, nwlessthanz
5583 ! ------------------------------------------------------------------
5584       
5585       
5586       jy = 1
5587       
5588       
5589          g1h = (6.0 + alphah)*(5.0 + alphah)*(4.0 + alphah)/  &
5590      &        ((3.0 + alphah)*(2.0 + alphah)*(1.0 + alphah))
5592          g1hl = (6.0 + alphahl)*(5.0 + alphahl)*(4.0 + alphahl)/  &
5593      &        ((3.0 + alphahl)*(2.0 + alphahl)*(1.0 + alphahl))
5594      
5595          IF ( imurain == 3 ) THEN
5596          g1r = (rnu+2.0)/(rnu+1.0)
5597          ELSE ! imurain == 1
5598          g1r = (6.0 + alphar)*(5.0 + alphar)*(4.0 + alphar)/  &
5599      &        ((3.0 + alphar)*(2.0 + alphar)*(1.0 + alphar))
5600          ENDIF
5602          g1s = (snu+2.0)/(snu+1.0)
5603       
5604       DO kz = 1,nz
5605        DO ix = 1,nx ! ixcol
5607          dninv = 1./dn(ix,kz)
5608          
5609    !  Cloud droplets
5610          
5611          IF ( lnc > 1 ) THEN
5612 !           IF ( an(ix,jy,kz,lnc) <= 0.1*cxmin .and. an(ix,jy,kz,lc) > qxmin(lc) ) THEN
5613            IF ( an(ix,jy,kz,lnc) > qxmin(lc) ) THEN
5614              anold(ix,jy,kz,lnc) = anold(ix,jy,kz,lnc) + an(ix,jy,kz,lc)/xcms
5615            ENDIF
5616          ENDIF
5618    !  Cloud ice
5619          
5620          IF ( lni > 1 ) THEN
5621            IF ( an(ix,jy,kz,lni) > qxmin(li) ) THEN
5622              anold(ix,jy,kz,lni) = anold(ix,jy,kz,lni) + an(ix,jy,kz,li)/xims
5623            ENDIF
5624          ENDIF
5626    !  rain
5627          
5628          IF ( lnr > 1 ) THEN
5629            IF ( an(ix,jy,kz,lr) > qxmin(lr) ) THEN ! adding rain mass from CU scheme
5631             IF ( .true. .or. (anold(ix,jy,kz,lr) - an(ix,jy,kz,lr)) < qxmin(lr) .or. anold(ix,jy,kz,lnr) < cxmin ) THEN 
5633              q = an(ix,jy,kz,lr)
5634              
5635              laminv1 = (dn(ix,kz) * q * zrfac)**(0.25)  ! inverse of slope
5636              
5637              n1 = laminv1*xn0r  ! number concentration for inv. exponential single moment input
5638              
5639              nrx =  n1*g1r/g0   ! number concentration for different shape parameter
5641              anold(ix,jy,kz,lnr) = anold(ix,jy,kz,lnr) + nrx ! *dninv ! convert to number mixing ratio
5643             ELSE
5644              ! assume mean particle mass of pre-existing snow
5645                 xmass = anold(ix,jy,kz,lr)/anold(ix,jy,kz,lnr)
5646                 anold(ix,jy,kz,lnr) = anold(ix,jy,kz,lnr) + an(ix,jy,kz,lr)/xmass
5647             ENDIF
5648              
5649              IF ( lzr > 1 ) THEN ! set reflectivity moment
5650                an(ix,jy,kz,lzr) = 36.*g1r*dn(ix,kz)**2*q**2/(pi**2*xdnr**2*nrx) ! *dninv
5651              ENDIF
5652            ENDIF
5653          ENDIF
5655   ! snow
5656          IF ( lns > 1 ) THEN
5657            IF ( an(ix,jy,kz,ls) > qxmin(ls) ) THEN ! adding snow mass from CU scheme
5659              IF ( .true. .or. (anold(ix,jy,kz,ls) - an(ix,jy,kz,ls)) < qxmin(ls) .or. anold(ix,jy,kz,lns) < cxmin ) THEN 
5660              
5661              ! assume that there was no snow before this
5662              
5663              q = an(ix,jy,kz,ls)
5664              
5665              laminv1 = (dn(ix,kz) * q * zsfac)**(0.25)  ! inverse of slope
5666              
5667              n1 = laminv1*xn0s  ! number concentration for inv. exponential single moment input
5668              
5669              nrx =  n1*g1s/g0   ! number concentration for different shape parameter
5671              anold(ix,jy,kz,lns) = anold(ix,jy,kz,lns) + nrx ! *dninv ! convert to number mixing ratio
5672              
5673              ELSE
5674              ! assume mean particle mass of pre-existing snow
5675                 xmass = anold(ix,jy,kz,ls)/anold(ix,jy,kz,lns)
5676                 anold(ix,jy,kz,lns) = anold(ix,jy,kz,lns) + an(ix,jy,kz,ls)/xmass
5677              ENDIF
5678              
5679            ENDIF
5680          ENDIF
5681          
5682     ! graupel
5684 !         IF ( lnh > 1 ) THEN
5685 !           IF ( an(ix,jy,kz,lnh) <= 0.1*cxmin .and. an(ix,jy,kz,lh) > qxmin(lh) ) THEN
5686 !             IF ( lvh > 1 ) THEN
5687 !               IF ( an(ix,jy,kz,lvh) <= 0.0 ) THEN
5688 !                 an(ix,jy,kz,lvh) = an(ix,jy,kz,lh)/xdnh
5689 !               ENDIF
5690 !             ENDIF
5692 !             q = an(ix,jy,kz,lh)
5693 !             
5694 !             laminv1 = (dn(ix,kz) * q * zhfac)**(0.25)  ! inverse of slope
5695 !             
5696 !             n1 = laminv1*xn0h  ! number concentration for inv. exponential single moment input
5697 !             
5698 !             nrx =  n1*g1h/g0   ! number concentration for different shape parameter
5700 !             an(ix,jy,kz,lnh) = nrx ! *dninv ! convert to number mixing ratio
5702 !             IF ( lzh > 1 ) THEN ! set reflectivity moment
5703 !               an(ix,jy,kz,lzh) = 36.*g1h*dn(ix,kz)**2*q**2/(pi**2*xdnh**2*nrx) ! *dninv
5704 !             ENDIF
5705 !           ENDIF
5706 !         ENDIF
5708 !    ! hail
5710 !         IF ( lnhl > 1 .and. lhl > 1 ) THEN
5711 !           IF ( an(ix,jy,kz,lnhl) <= 0.1*cxmin .and. an(ix,jy,kz,lhl) > qxmin(lhl) ) THEN
5712 !             IF ( lvhl > 1 ) THEN
5713 !               IF ( an(ix,jy,kz,lvhl) <= 0.0 ) THEN
5714 !                 an(ix,jy,kz,lvhl) = an(ix,jy,kz,lhl)/xdnhl
5715 !               ENDIF
5716 !             ENDIF
5718 !             q = an(ix,jy,kz,lhl)
5719 !             
5720 !             laminv1 = (dn(ix,kz) * q * zhlfac)**(0.25)  ! inverse of slope
5721 !             
5722 !             n1 = laminv1*xn0hl  ! number concentration for inv. exponential single moment input
5723 !             
5724 !             nrx =  n1*g1hl/g0   ! number concentration for different shape parameter
5726 !             an(ix,jy,kz,lnhl) = nrx ! *dninv ! convert to number mixing ratio
5728 !             IF ( lzhl > 1 ) THEN ! set reflectivity moment
5729 !               an(ix,jy,kz,lzhl) = 36.*g1hl*dn(ix,kz)**2*q**2/(pi**2*xdnhl**2*nrx) ! *dninv
5730 !             ENDIF
5731 !           ENDIF
5732 !         ENDIF
5734       ENDDO ! ix
5735       ENDDO ! kz
5736       
5737       RETURN
5738       
5739       END subroutine calcnfromcuten
5741 ! #####################################################################
5742 ! #####################################################################
5744    SUBROUTINE calc_eff_radius    &
5745      &  (nx,ny,nz,na,jyslab & 
5746      &  ,nor,norz & 
5747      &  ,t1,t2,t3,t4,t5,t6, f_t4, f_t5,f_t6  & 
5748      &  ,qcw,qci,qsw,qrw &
5749      &  ,ccw,cci,csw,crw &
5750      &  ,an,dn )
5752    implicit none
5754       integer, parameter :: ng1 = 1
5755       integer :: nx,ny,nz,na
5756       integer :: ng
5757       integer :: nor,norz, jyslab ! ,nht,ngt,igsr
5758       real    :: dtp  ! time step
5762 ! external temporary arrays
5765       real,optional :: t1(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
5766       real,optional :: t2(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
5767       real,optional :: t3(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
5768       real,optional :: t4(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
5769       real,optional :: t5(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
5770       real,optional :: t6(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
5771       logical, optional :: f_t4, f_t5, f_t6 ! flags to fill t4/t5/t6 for rain/graupel/hail
5773       real, optional :: an(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz,na)
5774       real dn(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
5775       real, optional, dimension(nx,nz) :: qcw,qci,qsw,qrw,ccw,cci,csw,crw 
5778     ! local
5779     
5780       real pb(-norz+ng1:nz+norz)
5781       real pinit(-norz+ng1:nz+norz)
5784 !  declarations microphysics and for gather/scatter
5786       integer nxmpb,nzmpb,nxz
5787       integer mgs,ngs,numgs,inumgs
5788       parameter (ngs=1)
5789       integer ngscnt,igs(ngs),kgs(ngs)
5790       real rho0(ngs)
5792       integer ix,kz,i,n, kp1
5793       integer :: jy, jgs
5794       integer ixb,ixe,jyb,jye,kzb,kze
5795     
5796       integer itile,jtile,ktile
5797       integer ixend,jyend,kzend,kzbeg
5798       integer nxend,nyend,nzend,nzbeg
5800       real :: qx(ngs,lv:lhab)
5801       real :: cx(ngs,lc:lhab)
5802       real :: xv(ngs,lc:lhab)
5803       real :: xmas(ngs,lc:lhab)
5804       real :: xdn(ngs,lc:lhab)
5805       real :: xdia(ngs,lc:lhab,3)
5806       real :: alpha(ngs,lc:lhab)
5807       
5808       real :: gamc1,gamc2,gami1,gami2,gams1,gams2, factor_c, factor_i, factor_s
5809       real :: lam_c, lam_i, lam_s, lam_r, lam_h, lam_hl
5810       real :: gamr1,gamr2,gamh1,gamh2,factor_r,factor_h,factor_hl
5811       integer :: il
5812       real :: hwdn,hldn
5813       double precision :: numh, numhl,denomh,denomhl
5814       
5815       logical :: flag_t4, flag_t5, flag_t6
5818 ! -------------------------------------------------------------------------------
5819       itile = nx
5820       jtile = ny
5821       ktile = nz
5822       ixend = nx
5823       jyend = ny
5824       kzend = nz
5825       nxend = nx + 1
5826       nyend = ny + 1
5827       nzend = nz
5828       kzbeg = 1
5829       nzbeg = 1
5830       
5831       flag_t4 = .false.
5832       flag_t5 = .false.
5833       flag_t6 = .false.
5835       IF ( present(f_t4) ) THEN
5836         IF ( present(f_t4) ) THEN
5837         flag_t4 = f_t4
5838         ENDIF
5839       ENDIF
5841       IF ( present(f_t5) ) THEN
5842         IF ( present(f_t5) ) THEN
5843         flag_t5 = f_t5
5844         ENDIF
5845       ENDIF
5847       IF ( present(f_t6) ) THEN
5848         IF ( present(f_t6) ) THEN
5849         flag_t6 = f_t6
5850         ENDIF
5851       ENDIF
5853        jy = 1
5854        pb(:) = 0.0
5855        pinit(:) = 0.0
5857      gamc1 = Gamma_sp(2. + cnu)
5858      gamc2 = 1. ! Gamma[1 + alphac]
5859      gami1 = Gamma_sp(2. + cinu)
5860      gami2 = 1. ! Gamma[1 + alphac]
5861      gams1 = Gamma_sp(2. + snu)
5862      gams2 = Gamma_sp(1. + snu)
5863      gamr1 = Gamma_sp(2. + rnu)
5864      gamr2 = Gamma_sp(1. + rnu)
5866      factor_c = (1. + cnu)*Gamma_sp(1. + cnu)/Gamma_sp(5./3. + cnu)
5867      factor_i = (1. + cinu)*Gamma_sp(1. + cinu)/Gamma_sp(5./3. + cinu)
5868      factor_s = (1. + snu)*Gamma_sp(1. + snu)/Gamma_sp(5./3. + snu)
5870      IF ( present(t4) ) THEN
5871      IF ( imurain == 3 ) THEN
5872        factor_r = (1. + rnu)*Gamma_sp(1. + rnu)/Gamma_sp(5./3. + rnu)
5873      ELSE
5874        factor_r = ((Pi*(alphar+3.)*(alphar+1.)*(alphar+1.))/6.)**(1./3.)
5875      ENDIF
5876      ENDIF
5878       factor_h = ((Pi*(alphah+3.)*(alphah+1.)*(alphah+1.))/6.)**(1./3.)
5879       factor_hl = ((Pi*(alphahl+3.)*(alphahl+1.)*(alphahl+1.))/6.)**(1./3.)
5882 !     jy = 1 ! working on a 2d slab
5883 !!  VERY IMPORTANT:  SET jgs = jy
5885       jgs = jy
5887       mgs = 1
5888       DO kz = 1,nz
5889        DO ix = 1,nx ! ixcol
5891          rho0(mgs) = dn(ix,jy,kz)
5892          IF ( present( an ) ) THEN
5893          DO il = lc,lhab
5894           qx(mgs,il) = max(an(ix,jy,kz,il), 0.0) 
5895           cx(mgs,il) = max(an(ix,jy,kz,ln(il)), 0.0) 
5896          ENDDO
5897          ELSE
5898           qx(mgs,:) = 0.0
5899           cx(mgs,:) = 0.0
5900           IF ( present(qcw) ) qx(mgs,lc) = qcw(ix,kz)
5901           IF ( present(qci) ) qx(mgs,li) = qci(ix,kz)
5902           IF ( present(qsw) ) qx(mgs,ls) = qsw(ix,kz)
5903           IF ( present(qrw) ) qx(mgs,lr) = qrw(ix,kz)
5904           IF ( present(ccw) ) cx(mgs,lc) = ccw(ix,kz)*rho0(mgs)
5905           IF ( present(cci) ) cx(mgs,li) = cci(ix,kz)*rho0(mgs)
5906           IF ( present(csw) ) cx(mgs,ls) = csw(ix,kz)*rho0(mgs)
5907           IF ( present(crw) ) cx(mgs,lr) = crw(ix,kz)*rho0(mgs)
5908          
5909          ENDIF
5910          
5911          IF ( present( t1 ) .and. qx(mgs,lc) > qxmin(lc) .and. cx(mgs,lc) > cxmin ) THEN
5912 ! Lambda for cloud droplets 
5913          lam_c = ((cx(mgs,lc)*(Pi/6.)*xdn0(lc)*Gamc1)/(qx(mgs,lc)*rho0(mgs)*Gamc2))**(1./3.)
5914           t1(ix,jy,kz) = 0.5*factor_c/lam_c
5915          ENDIF
5917          IF ( present( t2 ) .and. qx(mgs,li) > qxmin(li) .and. cx(mgs,li) > cxmin ) THEN
5918 ! Lambda for cloud ice 
5919          lam_i = ((cx(mgs,li)*(Pi/6.)*xdn0(li)*Gami1)/(qx(mgs,li)*rho0(mgs)*Gami2))**(1./3.)
5920           t2(ix,jy,kz) = 0.5*factor_i/lam_i
5921          ENDIF
5923          IF ( present( t3 ) .and. qx(mgs,ls) > qxmin(ls) .and. cx(mgs,ls) > cxmin  ) THEN
5924 ! Lambda for snow
5925          lam_s = ((cx(mgs,ls)*(Pi/6.)*xdn0(ls)*Gams1)/(qx(mgs,ls)*rho0(mgs)*Gams2))**(1./3.)
5926           t3(ix,jy,kz) = 0.5*factor_s/lam_s
5927          ENDIF
5929          IF ( present( t4 ) .and.( ( present(qrw) .and. present(crw) ) .or. flag_t4 ) ) THEN
5930          IF ( qx(mgs,lr) > Max(1.e-8,qxmin(lr))  .and. cx(mgs,lr) > cxmin ) THEN
5931            IF ( imurain == 1 ) THEN ! gamma-diameter
5932 ! Lambda for rain
5933              lam_r = factor_r *((xdn0(lr)*cx(mgs,lr))/(qx(mgs,lr)*rho0(mgs)))**(1./3.)
5934              t4(ix,jy,kz) = 0.5*(alphar+3.)/lam_r
5935            ELSE ! gamma-volume
5936 ! Lambda for rain
5937              lam_r = ((cx(mgs,lr)*(Pi/6.)*xdn0(lr)*Gamr1)/(qx(mgs,lr)*rho0(mgs)*Gamr2))**(1./3.)
5938              t4(ix,jy,kz) = 0.5*factor_r/lam_r
5939            ENDIF
5940          ENDIF
5941          ENDIF
5943          IF ( present(t5) .and. flag_t5 ) THEN
5944          
5945          ! first: case when hail is off
5946           
5947          IF (  lhl < 1 .or. flag_t6 ) THEN
5948          ! graupel only 
5949            IF ( qx(mgs,lh) > Max(1.e-8,qxmin(lh)) ) THEN
5950             ! Lambda for graupel
5951             hwdn = xdn0(lh)
5952             IF ( lvh > 1 ) THEN ! variable density
5953               IF ( an(ix,jy,kz,lvh) > 1.e-30 ) THEN
5954                 hwdn = rho0(mgs)*qx(mgs,lh)/an(ix,jy,kz,lvh)
5955               ENDIF
5956             ENDIF
5957             
5958               lam_h = factor_h *((hwdn*cx(mgs,lh))/(qx(mgs,lh)*rho0(mgs)))**(1./3.)
5959                t5(ix,jy,kz) = 0.5*(alphah+3.)/lam_h
5960            ENDIF
5961            
5962          ELSE ! have hail, too, but do not have t6 array
5963          
5964            IF ( qx(mgs,lh) > Max(1.e-8,qxmin(lh)) .and.  qx(mgs,lhl) < Max(1.e-8,qxmin(lhl)) ) THEN
5965 ! Lambda for graupel
5966             hwdn = xdn0(lh)
5967             IF ( lvh > 1 ) THEN ! variable density
5968               IF ( an(ix,jy,kz,lvh) > 1.e-30 ) THEN
5969                 hwdn = rho0(mgs)*qx(mgs,lh)/an(ix,jy,kz,lvh)
5970               ENDIF
5971             ENDIF
5973             lam_h = factor_h *((hwdn*cx(mgs,lh))/(qx(mgs,lh)*rho0(mgs)))**(1./3.)
5974             t5(ix,jy,kz) = 0.5*(alphah+3.)/lam_h
5975              
5976            ELSEIF ( qx(mgs,lh) < Max(1.e-8,qxmin(lh)) .and.  qx(mgs,lhl) > Max(1.e-8,qxmin(lhl)) ) THEN
5977 ! Lambda for hail
5978             hldn = xdn0(lhl)
5979             IF ( lvhl > 1 ) THEN ! variable density
5980               IF ( an(ix,jy,kz,lvhl) > 1.e-30 ) THEN
5981                 hldn = rho0(mgs)*qx(mgs,lhl)/an(ix,jy,kz,lvhl)
5982               ENDIF
5983             ENDIF
5985             lam_hl = factor_hl *((hldn*cx(mgs,lhl))/(qx(mgs,lhl)*rho0(mgs)))**(1./3.)
5986             t5(ix,jy,kz) = 0.5*(alphahl+3.)/lam_hl
5988            ELSEIF ( qx(mgs,lh) > Max(1.e-8,qxmin(lh)) .and.  qx(mgs,lhl) > Max(1.e-8,qxmin(lhl)) ) THEN
5989 !  r_eff graupel and hail combined
5990           
5991             hldn = xdn0(lhl)
5992             IF ( lvhl > 1 ) THEN ! variable density
5993               IF ( an(ix,jy,kz,lvhl) > 1.e-30 ) THEN
5994                 hldn = rho0(mgs)*qx(mgs,lhl)/an(ix,jy,kz,lvhl)
5995               ENDIF
5996             ENDIF
5998             hwdn = xdn0(lh)
5999             IF ( lvh > 1 ) THEN ! variable density
6000               IF ( an(ix,jy,kz,lvh) > 1.e-30 ) THEN
6001                 hwdn = rho0(mgs)*qx(mgs,lh)/an(ix,jy,kz,lvh)
6002               ENDIF
6003             ENDIF
6004             
6005             lam_h = factor_h *((hwdn*cx(mgs,lh))/(qx(mgs,lh)*rho0(mgs)))**(1./3.)
6006             lam_hl = factor_hl *((hldn*cx(mgs,lhl))/(qx(mgs,lhl)*rho0(mgs)))**(1./3.)
6007             
6008             numh = cx(mgs,lh)*(alphah+3.)*(alphah+2.)*(alphah+1.)/lam_h**3
6009             numhl = cx(mgs,lhl)*(alphahl+3.)*(alphahl+2.)*(alphahl+1.)/lam_hl**3
6010             
6011             denomh = cx(mgs,lh)*(alphah+2.)*(alphah+1.)/lam_h**2
6012             denomhl = cx(mgs,lhl)*(alphahl+2.)*(alphahl+1.)/lam_hl**2
6013             
6014             t5(ix,jy,kz) = 0.5*(numh + numhl)/(denomh + denomhl)
6017            ENDIF ! no t6 array
6018          
6019           ENDIF ! lhl
6020          
6021          ENDIF ! flag_t5
6022          
6023          IF ( present(t6) .and. flag_t6 .and. lhl > 1 ) THEN
6024          
6025            IF ( qx(mgs,lhl) > Max(1.e-8,qxmin(lhl)) ) THEN
6026 ! Lambda for hail
6027             hldn = xdn0(lhl)
6028             IF ( lvhl > 1 ) THEN ! variable density
6029               IF ( an(ix,jy,kz,lvhl) > 1.e-30 ) THEN
6030                 hldn = rho0(mgs)*qx(mgs,lhl)/an(ix,jy,kz,lvhl)
6031               ENDIF
6032             ENDIF
6033             
6034             lam_hl = factor_hl *((hldn*cx(mgs,lhl))/(qx(mgs,lhl)*rho0(mgs)))**(1./3.)
6035             t6(ix,jy,kz) = 0.5*(alphahl+3.)/lam_hl
6036          
6037            ENDIF
6038          
6039          ENDIF ! t6
6041       
6042        ENDDO ! ix
6043       ENDDO ! kz
6045    RETURN
6046    END SUBROUTINE calc_eff_radius
6049 ! #####################################################################
6050 ! #####################################################################
6052       SUBROUTINE QVEXCESS(ngs,mgs,qwvp0,qv0,qcw1,pres,thetap0,theta0, &
6053      &    qvex,pi0,tabqvs,nqsat,fqsat,cbw,fcqv1,felvcp,ss1,pk,ngscnt)
6054       
6055 !#####################################################################
6056 !  Purpose: find the amount of vapor that can be condensed to liquid
6057 !#####################################################################
6059       implicit none
6061       integer ngs,mgs,ngscnt
6062       
6063       real theta2temp
6064       
6065       real qvex
6066       
6067       integer nqsat
6068       real fqsat, cbw
6069       
6070       real ss1  ! 'target' supersaturation
6072 !  input arrays
6074       real qv0(ngs), qcw1(ngscnt), pres(ngs), qwvp0(mgs)
6075       real thetap0(ngs), theta0(ngs)
6076       real fcqv1(ngs), felvcp(ngs), pi0(ngs)
6077       real pk(ngs)
6078       
6079       real tabqvs(nqsat)
6081 ! Local stuff
6083       
6084       integer itertd
6085       integer ltemq
6086       real gamss
6087       real theta(ngs), qvap(ngs), pqs(ngs), qcw(ngs), qwv(ngs)
6088       real qcwtmp(ngs), qss(ngs), qvs(ngs), qwvp(ngs)
6089       real dqcw(ngs), dqwv(ngs), dqvcnd(ngs)
6090       real temg(ngs), temcg(ngs), thetap(ngs)
6091       
6092       real tfr
6093       parameter ( tfr = 273.15 )
6094             
6095 !      real poo,cap
6096 !      parameter ( cap = rd/cp, poo = 1.0e+05 )
6099 !  Modified Straka adjustment (nearly identical to Tao et al. 1989 MWR)
6103 !  set up temperature and vapor arrays
6105       pqs(mgs) = (380.0)/(pres(mgs))
6106       thetap(mgs) = thetap0(mgs)
6107       theta(mgs) = thetap(mgs) + theta0(mgs)
6108       qwvp(mgs) = qwvp0(mgs)
6109       qvap(mgs) = max( (qwvp0(mgs) + qv0(mgs)), 0.0 )
6110       temg(mgs) = theta(mgs)*pk(mgs) ! ( pres(mgs) / poo ) ** cap
6111 !      temg(mgs) = theta2temp( theta(mgs), pres(mgs) )
6115 !  reset temporaries for cloud particles and vapor
6117       
6118       qwv(mgs) = max( 0.0, qvap(mgs) )
6119       qcw(mgs) = max( 0.0, qcw1(mgs) )
6122       qcwtmp(mgs) = qcw(mgs)
6123       temcg(mgs) = temg(mgs) - tfr
6124       ltemq = (temg(mgs)-163.15)/fqsat+1.5
6125       ltemq = Min( nqsat, Max(1,ltemq) )
6127       qvs(mgs) = pqs(mgs)*tabqvs(ltemq)
6128       qss(mgs) = (0.01*ss1 + 1.0)*qvs(mgs)
6130 !  iterate  adjustment
6132       do itertd = 1,2
6135 !  calculate super-saturation
6137       dqcw(mgs) = 0.0
6138       dqwv(mgs) = ( qwv(mgs) - qss(mgs) )
6140 !  evaporation and sublimation adjustment
6142       if( dqwv(mgs) .lt. 0. ) then           !  subsaturated
6143         if( qcw(mgs) .gt. -dqwv(mgs) ) then  ! check if qc can make up all of the deficit
6144           dqcw(mgs) = dqwv(mgs)
6145           dqwv(mgs) = 0.
6146         else                                 !  otherwise make all qc available for evap
6147           dqcw(mgs) = -qcw(mgs)
6148           dqwv(mgs) = dqwv(mgs) + qcw(mgs)
6149         end if
6151         qwvp(mgs) = qwvp(mgs) - ( dqcw(mgs)  )  ! add to perturbation vapor
6153         qcw(mgs) = qcw(mgs) + dqcw(mgs)
6155         thetap(mgs) = thetap(mgs) +  &
6156      &                1./pi0(mgs)*  &
6157      &                (felvcp(mgs)*dqcw(mgs) )
6159       end if  ! dqwv(mgs) .lt. 0. (end of evap/sublim)
6161 ! condensation/deposition
6163       IF ( dqwv(mgs) .ge. 0. ) THEN
6165       dqvcnd(mgs) = dqwv(mgs)/(1. + fcqv1(mgs)*qss(mgs)/  &
6166      &  ((temg(mgs)-cbw)**2))
6169       dqcw(mgs) = dqvcnd(mgs)
6171       thetap(mgs) = thetap(mgs) +  &
6172      &   (felvcp(mgs)*dqcw(mgs) )    &
6173      & / (pi0(mgs))
6174       qwvp(mgs) = qwvp(mgs) - ( dqvcnd(mgs) )
6175       qcw(mgs) = qcw(mgs) + dqcw(mgs)
6177       END IF !  dqwv(mgs) .ge. 0.
6179       theta(mgs) = thetap(mgs) + theta0(mgs)
6180       temg(mgs) = theta(mgs)*pk(mgs) ! ( pres(mgs) / poo ) ** cap
6181 !      temg(mgs) = theta2temp( theta(mgs), pres(mgs) )
6182       qvap(mgs) = Max((qwvp(mgs) + qv0(mgs)), 0.0)
6183       temcg(mgs) = temg(mgs) - tfr
6184 !      tqvcon = temg(mgs)-cbw
6185       ltemq = (temg(mgs)-163.15)/fqsat+1.5
6186       ltemq = Min( nqsat, Max(1,ltemq) )
6187       qvs(mgs) = pqs(mgs)*tabqvs(ltemq)
6188       qcw(mgs) = max( 0.0, qcw(mgs) )
6189       qwv(mgs) = max( 0.0, qvap(mgs))
6190       qss(mgs) = (0.01*ss1 + 1.0)*qvs(mgs)
6191       end do
6193 !  end the saturation adjustment iteration loop
6196       qvex = Max(0.0, qcw(mgs) - qcw1(mgs) )
6198       RETURN
6199       END SUBROUTINE QVEXCESS
6201 ! #####################################################################
6202 ! #####################################################################
6209 ! ##############################################################################
6211       SUBROUTINE setvtz(ngscnt,qx,qxmin,qxw,cx,rho0,rhovt,xdia,cno,cnostmp, &
6212      &                 xmas,vtxbar,xdn,xvmn0,xvmx0,xv,cdx,cdxgs,            &
6213      &                 ipconc1,ndebug1,ngs,nz,kgs,fadvisc,   &
6214      &                 cwmasn,cwmasx,cwradn,cnina,cimna,cimxa,      &
6215      &                 itype1a,itype2a,temcg,infdo,alpha,ildo,axx,bxx)
6216 !     &                 itype1a,itype2a,temcg,infdo,alpha,ildo,axh,bxh,axhl,bxhl)
6219       implicit none
6220       
6221       integer ngscnt,ngs0,ngs,nz
6222 !      integer infall    ! whether to calculate number-weighted fall speeds
6223       
6224       real xv(ngs,lc:lhab)
6225       real qx(ngs,lv:lhab)
6226       real qxw(ngs,ls:lhab)
6227       real cx(ngs,lc:lhab)
6228       real vtxbar(ngs,lc:lhab,3)
6229       real xmas(ngs,lc:lhab)
6230       real xdn(ngs,lc:lhab)
6231       real cdxgs(ngs,lc:lhab)
6232       real xdia(ngs,lc:lhab,3)
6233       real xvmn0(lc:lhab), xvmx0(lc:lhab)
6234       real qxmin(lc:lhab)
6235       real cdx(lc:lhab)
6236       real alpha(ngs,lc:lhab)
6237       
6238       real rho0(ngs),rhovt(ngs),temcg(ngs)
6239       real cno(lc:lhab)
6240       real cnostmp(ngs)
6241       
6242       real cwc1, cimna, cimxa
6243       real cnina(ngs)
6244       integer kgs(ngs)
6245       real fadvisc(ngs)
6246       real fsw
6247       
6248       integer ipconc1
6249       integer ndebug1
6250       
6251       integer, intent (in) :: itype1a,itype2a,infdo
6252       integer, intent (in) :: ildo ! which species to do, or all if ildo=0
6254       real :: axx(ngs,lh:lhab),bxx(ngs,lh:lhab)
6255 !!      real :: axh(ngs),bxh(ngs)
6256 !      real :: axhl(ngs),bxhl(ngs)
6257       
6258 ! Local vars
6260       
6261       
6262       real swmasmx, dtmp
6263       real cd
6264       real cwc0 ! ,cwc1
6265       real :: cwch(ngscnt), cwchl(ngscnt)
6266       real :: cwchtmp,cwchltmp,xnutmp
6267       real pii
6268       real cimasx,cimasn
6269       real cwmasn,cwmasx,cwradn
6270       real cwrad
6271       real vr,rnux
6272       real alp
6273       
6274       real ccimx
6276       integer mgs
6277       
6278       real arx,frx,vtrain,fw
6279       real fwlo,fwhi,rfwdiff
6280       real ar,br,cs,ds
6281 !      real gf4p5, gf4ds, gf4br, ifirst, gf1ds
6282 !      real gfcinu1, gfcinu1p47, gfcinu2p47
6283       real gr
6284       real rwrad,rwdia
6285       real mwfac
6286       integer il
6288 !      save gf4p5, gf4ds, gf4br, ifirst, gf1ds
6289 !      save gfcinu1, gfcinu1p47, gfcinu2p47
6290 !      data ifirst /0/
6291       
6292       real bta1,cnit
6293       parameter ( bta1 = 0.6, cnit = 1.0e-02 )
6294       real x,y,tmp,del
6295       real aax,bbx,delrho
6296       integer :: indxr
6297       real mwt, nwt, zwt
6298       real, parameter :: rho00 = 1.225
6299       integer i
6300       real xvbarmax
6302       integer l1, l2
6306 ! set values
6308 !      cwmasn = 5.23e-13  ! radius of 5.0e-6
6309 !      cwradn = 5.0e-6
6310 !      cwmasx = 5.25e-10  ! radius of 50.0e-6
6312       fwlo = 0.2                ! water fraction to start weighting toward rain fall speed
6313       fwhi = 0.4                ! water fraction at which rain fall speed only is used
6314       rfwdiff = 1./(fwhi - fwlo)
6315       
6316 !      pi = 4.0*atan(1.0)
6317       pii = piinv ! 1.0/pi
6319       arx = 10.
6320       frx = 516.575 ! raind fit parameters for arx*(1 - Exp(-fx*d)), where d is rain diameter in meters.
6322       ar = 841.99666  
6323       br = 0.8
6324       gr = 9.8
6325 !  new values for  cs and ds
6326       cs = 12.42
6327       ds = 0.42
6329       IF ( ildo == 0 ) THEN
6330         l1 = lc
6331         l2 = lhab
6332       ELSE
6333         l1 = ildo
6334         l2 = ildo
6335       ENDIF
6337 !      IF ( ifirst .eq. 0 ) THEN
6338 !        ifirst = 1
6339 !        gf4br = gamma(4.0+br)
6340 !        gf4ds = gamma(4.0+ds)
6341 !!        gf1ds = gamma(1.0+ds)
6342 !        gf4p5 = gamma(4.0+0.5)
6343 !        gfcinu1 = gamma(cinu + 1.0)
6344 !        gfcinu1p47 = gamma(cinu + 1.47167)
6345 !        gfcinu2p47 = gamma(cinu + 2.47167)
6346         
6347         IF ( lh  .gt. 1 ) THEN
6348           IF ( dmuh == 1.0 ) THEN
6349             cwchtmp = ((3. + dnu(lh))*(2. + dnu(lh))*(1.0 + dnu(lh)))**(-1./3.)
6350           ELSE
6351             cwchtmp = 6.0*pii*gamma_sp( (xnu(lh) + 1.)/xmu(lh) )/gamma_sp( (xnu(lh) + 2.)/xmu(lh) )
6352           ENDIF
6353         ENDIF
6354         IF ( lhl .gt. 1 ) THEN
6355           IF ( dmuhl == 1.0 ) THEN
6356             cwchltmp = ((3. + dnu(lhl))*(2. + dnu(lhl))*(1.0 + dnu(lhl)))**(-1./3.)
6357           ELSE
6358             cwchltmp = 6.0*pii*gamma_sp( (xnu(lhl) + 1)/xmu(lhl) )/gamma_sp( (xnu(lhl) + 2)/xmu(lhl) )
6359           ENDIF
6360         ENDIF
6362         IF ( ipconc .le. 5 ) THEN
6363           IF ( lh  .gt. 1 ) cwch(:) =  cwchtmp 
6364           IF ( lhl .gt. 1 ) cwchl(:) = cwchltmp
6365         ELSE
6366           DO mgs = 1,ngscnt
6367           
6368           IF ( lh  .gt. 1 .and. ( ildo == 0 .or. ildo == lh ) ) THEN
6369            IF ( qx(mgs,lh) .gt. qxmin(lh) ) THEN
6370             IF ( dmuh == 1.0 ) THEN
6371               cwch(mgs) = ((3. + alpha(mgs,lh))*(2. + alpha(mgs,lh))*(1.0 + alpha(mgs,lh)))**(-1./3.)
6372              ELSE
6373              xnutmp = (alpha(mgs,lh) - 2.0)/3.0
6374              cwch(mgs) =  6.0*pii*gamma_sp( (xnutmp + 1.)/xmu(lh) )/gamma_sp( (xnutmp + 2.)/xmu(lh) )
6375             ENDIF
6376            ELSE
6377              cwch(mgs) = cwchtmp
6378            ENDIF
6379           ENDIF
6380           IF ( lhl .gt. 1 .and. ( ildo == 0 .or. ildo == lhl ) ) THEN
6381            IF ( qx(mgs,lhl) .gt. qxmin(lhl) ) THEN
6382             IF ( dmuhl == 1.0 ) THEN
6383               cwchl(mgs) = ((3. + alpha(mgs,lhl))*(2. + alpha(mgs,lhl))*(1.0 + alpha(mgs,lhl)))**(-1./3.)
6384              ELSE
6385              xnutmp = (alpha(mgs,lhl) - 2.0)/3.0
6386              cwchl(mgs) = 6.0*pii*gamma_sp( (xnutmp + 1)/xmu(lhl) )/gamma_sp( (xnutmp + 2)/xmu(lhl) )
6387             ENDIF
6388            ELSE
6389              cwchl(mgs) = cwchltmp
6390            ENDIF
6391           ENDIF
6392           
6393           ENDDO
6394         
6395         ENDIF
6396        
6398       cimasn = Min( cimas0, 6.88e-13)
6399       cimasx = 1.0e-8
6400       ccimx = 5000.0e3   ! max of 5000 per liter
6402       cwc1 = 6.0/(pi*1000.)
6403       cwc0 = pii ! 6.0*pii
6404       mwfac = 6.0**(1./3.)
6406       
6407       if (ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set scale diameter'
6412 !  cloud water variables
6413 ! ################################################################
6415 !  DROPLETS
6418       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set cloud water variables'
6419       
6420       IF ( ildo == 0 .or. ildo == lc ) THEN
6421       
6422       do mgs = 1,ngscnt
6423       xv(mgs,lc) = 0.0
6424       
6425       IF ( qx(mgs,lc) .gt. qxmin(lc) ) THEN !{
6426       
6427       IF ( ipconc .ge. 2 ) THEN
6428         IF ( cx(mgs,lc) .gt. cxmin) THEN !{
6429         xmas(mgs,lc) =  &
6430      &    min( max(qx(mgs,lc)*rho0(mgs)/cx(mgs,lc),cwmasn),cwmasx )
6431         xv(mgs,lc) = xmas(mgs,lc)/xdn(mgs,lc)
6432         ELSE
6433          cx(mgs,lc) = Max( cxmin, rho0(mgs)*qx(mgs,lc)/cwmasx )
6434          xmas(mgs,lc) = Min( max(qx(mgs,lc)*rho0(mgs)/cx(mgs,lc),cwmasn),cwmasx )
6435          xv(mgs,lc) = xmas(mgs,lc)/xdn(mgs,lc)
6436         
6437         ENDIF
6438       ELSE
6439        IF ( ipconc .lt. 2 ) THEN
6440          cx(mgs,lc) = rho0(mgs)*ccn/rho00 ! scales to local density, relative to standard air density
6441        ENDIF
6442        IF ( qx(mgs,lc) .gt. qxmin(lc) .and. cx(mgs,lc) .gt. 0.01 ) THEN !{
6443         xmas(mgs,lc) =  &
6444      &     min( max(qx(mgs,lc)*rho0(mgs)/cx(mgs,lc),xdn(mgs,lc)*xvmn(lc)), &
6445      &      xdn(mgs,lc)*xvmx(lc) )
6446         
6447         xv(mgs,lc) = xmas(mgs,lc)/xdn(mgs,lc)
6448         cx(mgs,lc) = qx(mgs,lc)*rho0(mgs)/xmas(mgs,lc)
6449         
6450        ELSEIF ( qx(mgs,lc) .gt. qxmin(lc) .and. cx(mgs,lc) .le. 1.0e-9 ) THEN
6451         cx(mgs,lc) = Max( cxmin, rho0(mgs)*qx(mgs,lc)/cwmasx )
6452         xmas(mgs,lc) =  &
6453      &    min( max(qx(mgs,lc)*rho0(mgs)/cx(mgs,lc),cwmasn),cwmasx )
6454         xv(mgs,lc) = xmas(mgs,lc)/xdn(mgs,lc)
6456        ELSEIF ( qx(mgs,lc) .gt. qxmin(lc) .and. cx(mgs,lc) .le. 0.01 ) THEN
6457         xmas(mgs,lc) = xdn(mgs,lc)*4.*pi/3.*(5.0e-6)**3
6458         cx(mgs,lc) = rho0(mgs)*qx(mgs,lc)/xmas(mgs,lc)
6459         xv(mgs,lc) = xmas(mgs,lc)/xdn(mgs,lc)
6460         
6461        ELSE
6462         xmas(mgs,lc) = cwmasn
6463         xv(mgs,lc) = xmas(mgs,lc)/1000.
6464 ! do not define ccw here! it can feed back to ccn!!!    cx(mgs,lc) = 0.0 ! cwnc(mgs)
6465        ENDIF !}
6466       ENDIF !}
6467 !      IF ( ipconc .lt. 2 ) THEN
6468 !        xmas(mgs,lc) = &
6469 !     &    min( max(qx(mgs,lc)*rho0(mgs)/cwnc(mgs),cwmasn),cwmasx )
6470 !        cx(mgs,lc) = Max(1.0,qx(mgs,lc)*rho0(mgs)/xmas(mgs,lc))
6471 !      ELSE
6472 !        cwnc(mgs) = an(igs(mgs),jgs,kgs(mgs),lnc)
6473 !        cx(mgs,lc) = cwnc(mgs)
6474 !      ENDIF
6475       xdia(mgs,lc,1) = (xmas(mgs,lc)*cwc1)**(1./3.)
6476       xdia(mgs,lc,2) = xdia(mgs,lc,1)**2
6477       xdia(mgs,lc,3) = xdia(mgs,lc,1)
6478       cwrad = 0.5*xdia(mgs,lc,1)
6479       IF ( fadvisc(mgs) > 0.0 ) THEN
6480       vtxbar(mgs,lc,1) =  &
6481      &   (2.0*gr*xdn(mgs,lc) *(cwrad**2)) &
6482      &  /(9.0*fadvisc(mgs))
6483       ELSE
6484        vtxbar(mgs,lc,1) = 0.0
6485       ENDIF
6487       
6488       ELSE
6489        xmas(mgs,lc) = cwmasn
6490        xv(mgs,lc) = xmas(mgs,lc)/xdn(mgs,lc)
6491        IF ( qx(mgs,lc) <= 0.0 ) cx(mgs,lc) = 0.0
6492        IF ( ipconc .le. 1 ) cx(mgs,lc) = 0.01
6493        xdia(mgs,lc,1) = 2.*cwradn
6494        xdia(mgs,lc,2) = 4.*cwradn**2
6495        xdia(mgs,lc,3) = xdia(mgs,lc,1)
6496        vtxbar(mgs,lc,1) = 0.0
6497        
6498       ENDIF !} qcw .gt. qxmin(lc)
6499       
6500       end do
6501       
6502       ENDIF
6507 ! cloud ice variables
6508 ! columns
6510 ! ################################################################
6512 !  CLOUD ICE
6514       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set cip'
6515       
6516       IF ( li .gt. 1 .and. ( ildo == 0 .or. ildo == li ) ) THEN
6517       do mgs = 1,ngscnt
6518        xdn(mgs,li)  = 900.0
6519       IF ( ipconc .eq. 0 ) THEN
6520 !       cx(mgs,li) = min(cnit*exp(-temcg(mgs)*bta1),1.e+09)
6521         cx(mgs,li) = cnina(mgs)
6522        IF ( cimna .gt. 1.0 ) THEN
6523          cx(mgs,li) = Max(cimna,cx(mgs,li))
6524        ENDIF
6525        IF ( cimxa .gt. 1.0 ) THEN
6526          cx(mgs,li) = Min(cimxa,cx(mgs,li))
6527        ENDIF
6528 ! erm 3/28/2002
6529        IF ( itype1a .ge. 1 .or. itype2a .ge. 1 ) THEN
6530         cx(mgs,li) = Max(cx(mgs,li),qx(mgs,li)*rho0(mgs)/cimasx)
6531         cx(mgs,li) = Min(cx(mgs,li),qx(mgs,li)*rho0(mgs)/cimasn)
6532        ENDIF
6534        cx(mgs,li) = max(1.0e-20,cx(mgs,li))
6535 !       cx(mgs,li) = Min(ccimx, cx(mgs,li))
6537       
6538       ELSEIF ( ipconc .ge. 1 ) THEN
6539         IF ( qx(mgs,li) .gt. qxmin(li) ) THEN
6540          cx(mgs,li) = Max(cx(mgs,li),qx(mgs,li)*rho0(mgs)/cimasx)
6541          cx(mgs,li) = Min(cx(mgs,li),qx(mgs,li)*rho0(mgs)/cimasn)
6542 !         cx(mgs,li) = Max(1.0,cx(mgs,li))
6543         ENDIF
6544       ENDIF
6545       
6546       IF ( qx(mgs,li) .gt. qxmin(li) ) THEN
6547       xmas(mgs,li) = &
6548      &     max( qx(mgs,li)*rho0(mgs)/cx(mgs,li), cimasn )
6549 !     &  min( max(qx(mgs,li)*rho0(mgs)/cx(mgs,li),cimasn),cimasx )
6550       
6551 !      if ( temcg(mgs) .gt. 0.0 ) then
6552 !      xdia(mgs,li,1) = 0.0
6553 !      else
6554       if ( xmas(mgs,li) .gt. 0.0 ) THEN ! cimasn ) then
6555 !c      xdia(mgs,li,1) = 0.4892*(xmas(mgs,li)**(0.4554))
6556 !       xdia(mgs,li,1) = 0.1871*(xmas(mgs,li)**(0.3429))
6558 !       xdia(mgs,li,1) = (132.694*5.40662/xmas(mgs,li))**(-1./2.9163)  ! for inverse exponential distribution
6559        IF ( ixtaltype == 1 ) THEN ! column
6560        xdia(mgs,li,1) = 0.1871*(xmas(mgs,li)**(0.3429))
6561        xdia(mgs,li,3) = 0.1871*(xmas(mgs,li)**(0.3429))
6562        ELSEIF  ( ixtaltype == 2 ) THEN ! disk
6563         xdia(mgs,li,1) = 0.277823*xmas(mgs,li)**0.359971
6564         xdia(mgs,li,3) = 0.277823*xmas(mgs,li)**0.359971
6565        ENDIF
6566       end if
6567 !      end if
6568 !      xdia(mgs,li,1) = max(xdia(mgs,li,1), 5.e-6)
6569 !      xdia(mgs,li,1) = min(xdia(mgs,li,1), 1000.e-6)
6571        IF ( ipconc .ge. 0 ) THEN
6572 !      vtxbar(mgs,li,1) = rhovt(mgs)*49420.*40.0005/5.40662*xdia(mgs,li,1)**(1.415) ! mass-weighted
6573 !      vtxbar(mgs,li,1) = (4.942e4)*(xdia(mgs,li,1)**(1.4150))
6574         xv(mgs,li) = xmas(mgs,li)/xdn(mgs,li)
6575         IF ( icefallopt == 1 ) THEN ! default ice fall
6576           IF ( ixtaltype == 1 ) THEN ! column
6577           tmp = (67056.6300748612*rhovt(mgs))/  &
6578      &     (((1.0 + cinu)/xv(mgs,li))**0.4716666666666667*gfcinu1)
6579           vtxbar(mgs,li,2) = tmp*gfcinu1p47
6580           vtxbar(mgs,li,1) = tmp*gfcinu2p47/(1. + cinu)
6581           vtxbar(mgs,li,3) = vtxbar(mgs,li,1) 
6582         ELSEIF  ( ixtaltype == 2 ) THEN ! disk -- but just use Ferrier (1994) snow fall speeds for now
6583             vtxbar(mgs,li,1) = 11.9495*rhovt(mgs)*(xv(mgs,li))**(0.14)
6584             vtxbar(mgs,li,2) = 7.02909*rhovt(mgs)*(xv(mgs,li))**(0.14)
6585            vtxbar(mgs,li,3) = vtxbar(mgs,li,1) 
6586         
6587           ENDIF
6588           
6589        ELSEIF ( icefallopt == 2 ) THEN !   ! Ferrier ice fall speed
6590           tmp = (82.3166*rhovt(mgs))/  &
6591      &     (((1.0 + cinu)/xv(mgs,li))**0.22117*gfcinu1)
6592           vtxbar(mgs,li,2) = tmp*gfcinu1p22
6593           vtxbar(mgs,li,1) = tmp*gfcinu2p22/(1. + cinu)
6594           vtxbar(mgs,li,3) = vtxbar(mgs,li,1) 
6596        ELSEIF ( icefallopt == 3 ) THEN !   ! Adjusted Ferrier (smaller exponent of 0.55 instead of 0.6635)
6597        
6598           tmp = (47.6273*rhovt(mgs))/  &
6599      &     (((1.0 + cinu)/xv(mgs,li))**0.18333*gfcinu1)
6600           vtxbar(mgs,li,2) = tmp*gfcinu1p18
6601           vtxbar(mgs,li,1) = tmp*gfcinu2p18/(1. + cinu)
6602           vtxbar(mgs,li,3) = vtxbar(mgs,li,1) 
6603        
6604        ENDIF
6605 !      vtxbar(mgs,li,1) = vtxbar(mgs,li,2)*(1.+cinu)/(1. + cinu)
6606 !      xdn(mgs,li)   = min(max(769.8*xdia(mgs,li,1)**(-0.0140),300.0),900.0)
6607 !      xdn(mgs,li) = 900.0
6608         xdia(mgs,li,2) = xdia(mgs,li,1)**2
6609 !      vtxbar(mgs,li,1) = vtxbar(mgs,li,1)*rhovt(mgs)
6610        ELSE
6611          xdia(mgs,li,1) = max(xdia(mgs,li,1), 10.e-6)
6612          xdia(mgs,li,1) = min(xdia(mgs,li,1), 1000.e-6)
6613          vtxbar(mgs,li,1) = (4.942e4)*(xdia(mgs,li,1)**(1.4150))
6614 !      xdn(mgs,li)   = min(max(769.8*xdia(mgs,li,1)**(-0.0140),300.0),900.0)
6615          xdn(mgs,li) = 900.0
6616          xdia(mgs,li,2) = xdia(mgs,li,1)**2
6617          vtxbar(mgs,li,1) = vtxbar(mgs,li,1)*rhovt(mgs)
6618          xv(mgs,li) = xmas(mgs,li)/xdn(mgs,li)
6619        ENDIF ! ipconc gt 3
6620       ELSE
6621        xmas(mgs,li) = 1.e-13
6622        IF ( qx(mgs,li) <= 0.0 ) cx(mgs,li) = 0.0
6623        xdn(mgs,li)  = 900.0
6624        xdia(mgs,li,1) = 1.e-7
6625        xdia(mgs,li,2) = (1.e-14)
6626        xdia(mgs,li,3) = 1.e-7
6627        vtxbar(mgs,li,1) = 0.0
6628 !       cicap(mgs) = 0.0
6629 !       ciat(mgs) = 0.0
6630       ENDIF
6631       
6632       IF ( icefallfac /= 1.0 ) THEN
6633         vtxbar(mgs,li,1) = icefallfac*vtxbar(mgs,li,1)
6634         vtxbar(mgs,li,2) = icefallfac*vtxbar(mgs,li,2)
6635         vtxbar(mgs,li,3) = icefallfac*vtxbar(mgs,li,3)
6636       ENDIF
6638       
6639       
6640       end do
6641       
6642       ENDIF ! li .gt. 1
6645 ! ################################################################
6647 !  RAIN
6649       
6651       IF ( ildo == 0 .or. ildo == lr ) THEN
6652       do mgs = 1,ngscnt
6653       if ( qx(mgs,lr) .gt. qxmin(lr) ) then
6654       
6655 !      IF ( qx(mgs,lr) .gt. 10.0e-3 ) &
6656 !     &  write(0,*)  'RAIN1: ',igs(mgs),kgs(mgs),qx(mgs,lr)
6657       
6658       if ( ipconc .ge. 3 ) then
6659         xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*Max(1.0e-11,cx(mgs,lr)))
6660         xvbarmax = xvmx(lr)
6661         IF ( imaxdiaopt == 1 ) THEN
6662           xvbarmax = xvmx(lr)
6663         ELSEIF ( imaxdiaopt == 2 ) THEN ! test against maximum mass diameter
6664          IF ( imurain == 1 ) THEN
6665            xvbarmax = xvmx(lr)/((3. + alpha(mgs,lr))**3/((3. + alpha(mgs,lr))*(2. + alpha(mgs,lr))*(1. + alpha(mgs,lr))))
6666          ELSEIF ( imurain == 3 ) THEN
6667            
6668          ENDIF
6669         ELSEIF ( imaxdiaopt == 3 ) THEN ! test against mass-weighted diameter
6670          IF ( imurain == 1 ) THEN
6671            xvbarmax = xvmx(lr)/((4. + alpha(mgs,lr))**3/((3. + alpha(mgs,lr))*(2. + alpha(mgs,lr))*(1. + alpha(mgs,lr))))
6672          ELSEIF ( imurain == 3 ) THEN
6673            
6674          ENDIF
6675         ENDIF
6676        
6677         IF ( xv(mgs,lr) .gt. xvbarmax ) THEN
6678           xv(mgs,lr) = xvbarmax
6679           cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvbarmax*xdn(mgs,lr))
6680         ELSEIF ( xv(mgs,lr) .lt. xvmn(lr) ) THEN
6681           xv(mgs,lr) = xvmn(lr)
6682           cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmn(lr)*xdn(mgs,lr))
6683         ENDIF
6686         xmas(mgs,lr) = xv(mgs,lr)*xdn(mgs,lr)
6687         xdia(mgs,lr,3) = (xmas(mgs,lr)*cwc1)**(1./3.) ! xdia(mgs,lr,1)
6688         IF ( imurain == 3 ) THEN
6689 !          xdia(mgs,lr,1) = (6.*pii*xv(mgs,lr)/(alpha(mgs,lr)+1.))**(1./3.)
6690           xdia(mgs,lr,1) = xdia(mgs,lr,3) ! formulae for Ziegler (1985) use mean volume diameter, not lambda**(-1)
6691         ELSE ! imurain == 1, Characteristic diameter (1/lambda)
6692           xdia(mgs,lr,1) = (6.*pii*xv(mgs,lr)/((alpha(mgs,lr)+3.)*(alpha(mgs,lr)+2.)*(alpha(mgs,lr)+1.)))**(1./3.)
6693         ENDIF
6694 !        rwrad(mgs) = 0.5*xdia(mgs,lr,1)
6696 ! Inverse exponential version:
6697 !        xdia(mgs,lr,1) =
6698 !     &  (qx(mgs,lr)*rho0(mgs)
6699 !     & /(pi*xdn(mgs,lr)*cx(mgs,lr)))**(0.333333)
6700       ELSE
6701         xdia(mgs,lr,1) = &
6702      &  (qx(mgs,lr)*rho0(mgs)/(pi*xdn(mgs,lr)*cno(lr)))**(0.25) 
6703         xmas(mgs,lr) = xdn(mgs,lr)*(pi/6.)*xdia(mgs,lr,1)**3
6704         xdia(mgs,lr,3) = (xmas(mgs,lr)*cwc1)**(1./3.)
6705         cx(mgs,lr) = cno(lr)*xdia(mgs,lr,1)
6706         xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*cx(mgs,lr))
6707       end if
6708       else
6709         xdia(mgs,lr,1) = 1.e-9
6710         xdia(mgs,lr,3) = 1.e-9
6711         xmas(mgs,lr) = xdn(mgs,lr)*(pi/6.)*xdia(mgs,lr,1)**3
6712 !        rwrad(mgs) = 0.5*xdia(mgs,lr,1)
6713       end if
6714       xdia(mgs,lr,2) = xdia(mgs,lr,1)**2
6715 !      xmas(mgs,lr) = xdn(mgs,lr)*(pi/6.)*xdia(mgs,lr,1)**3
6716       end do
6717       
6718       ENDIF
6719 ! ################################################################
6721 !  SNOW
6724       IF ( ls .gt. 1 .and. ( ildo == 0 .or. ildo == ls ) ) THEN
6725       
6726       do mgs = 1,ngscnt 
6727       if ( qx(mgs,ls) .gt. qxmin(ls) ) then
6728       if ( ipconc .ge. 4 ) then ! 
6730         xmas(mgs,ls) =  rho0(mgs)*qx(mgs,ls)/(Max(1.0e-9,cx(mgs,ls)))
6731         swmasmx = 13.7e-6
6732 !       IF ( xmas(mgs,ls) > swmasmx ) THEN
6733 !          xmas(mgs,ls) = swmasmx
6734 !          cx(mgs,ls) = rho0(mgs)*qx(mgs,ls)/(xmas(mgs,ls))
6735 !        ENDIF
6737         IF ( isnowdens == 2 ) THEN ! Set values according to Cox relationship
6738         
6739           xdn(mgs,ls) = 0.0346159*Sqrt(cx(mgs,ls)/(qx(mgs,ls)*rho0(mgs)) )
6740           xdn(mgs,ls) = Max( 100.0, xdn(mgs,ls) )  ! limit snow to 100. to keep other equations in line
6741           
6742           IF ( xdn(mgs,ls) <= 900. ) THEN
6743              dtmp = Sqrt( xmas(mgs,ls)/0.069 ) ! diameter (meters) of mean mass particle using Cox 1998 relation (m = p d^2)
6744              xv(mgs,ls) = 28.8887*xmas(mgs,ls)**(3./2.)
6745           ELSE ! at small sizes, assume ice spheres
6746              xdn(mgs,ls) = 900.
6747              xv(mgs,ls) = rho0(mgs)*qx(mgs,ls)/(xdn(mgs,ls)*Max(1.0e-9,cx(mgs,ls)))
6748              dtmp = (xv(mgs,ls)*cwc0*6.0)**(1./3.)
6749           ENDIF
6750           
6751         ELSE ! leave xdn(ls) at default value
6752              xv(mgs,ls) = rho0(mgs)*qx(mgs,ls)/(xdn(mgs,ls)*Max(1.0e-9,cx(mgs,ls)))
6753              dtmp = (xv(mgs,ls)*cwc0*6.0)**(1./3.)
6754         ENDIF
6756         xdia(mgs,ls,1) = dtmp ! (xv(mgs,ls)*cwc0*6.0)**(1./3.)
6758         IF ( xv(mgs,ls) .lt. xvmn(ls) .and. isnowdens == 1) THEN
6759           xv(mgs,ls) = Max( xvmn(ls),xv(mgs,ls) )
6760           xmas(mgs,ls) = xv(mgs,ls)*xdn(mgs,ls)
6761           cx(mgs,ls) = rho0(mgs)*qx(mgs,ls)/(xmas(mgs,ls))
6762           xdia(mgs,ls,1) = (xv(mgs,ls)*cwc0*6.0)**(1./3.)
6763         ENDIF
6765         IF ( xv(mgs,ls) .gt. xvmx(ls)*Max(1.,100./Min(100.,xdn(mgs,ls))) ) THEN
6766           xv(mgs,ls) = Min( xvmx(ls), Max( xvmn(ls),xv(mgs,ls) ) )
6767           xmas(mgs,ls) = 0.106214*xv(mgs,ls)**(2./3.)
6768           cx(mgs,ls) = rho0(mgs)*qx(mgs,ls)/(xmas(mgs,ls))
6769           xdn(mgs,ls) = 0.0346159*Sqrt(cx(mgs,ls)/(qx(mgs,ls)*rho0(mgs)) )
6770           xdia(mgs,ls,1) = Sqrt( xmas(mgs,ls)/0.069 ) 
6771         ENDIF
6773         xdia(mgs,ls,3) = xdia(mgs,ls,1)
6775       ELSE
6776         xdia(mgs,ls,1) =  &
6777      &    (qx(mgs,ls)*rho0(mgs)/(pi*xdn(mgs,ls)*cnostmp(mgs)))**(0.25) 
6778         cx(mgs,ls) = cnostmp(mgs)*xdia(mgs,ls,1)
6779         xv(mgs,ls) = rho0(mgs)*qx(mgs,ls)/(xdn(mgs,ls)*cx(mgs,ls))
6780         xdia(mgs,ls,3) = (xv(mgs,ls)*cwc0*6.0)**(1./3.)
6781       end if
6782       else
6783       xdia(mgs,ls,1) = 1.e-9
6784       xdia(mgs,ls,3) = 1.e-9
6785       cx(mgs,ls) = 0.0
6786       
6787        IF ( isnowdens == 2 ) THEN ! Set values according to Cox relationship
6788          xdn(mgs,ls) = 90.
6789        ENDIF
6791       end if
6792       xdia(mgs,ls,2) = xdia(mgs,ls,1)**2
6793 !      swdia3(mgs) = xdia(mgs,ls,2)*xdia(mgs,ls,1)
6794 !      xmas(mgs,ls) = xdn(mgs,ls)*(pi/6.)*swdia3(mgs)
6795       end do
6796       
6797       ENDIF ! ls .gt 1
6800 ! ################################################################
6802 !  GRAUPEL
6805       IF ( lh .gt. 1 .and. ( ildo == 0 .or. ildo == lh ) ) THEN
6806       
6807       do mgs = 1,ngscnt 
6808       if ( qx(mgs,lh) .gt. qxmin(lh) ) then
6809       if ( ipconc .ge. 5 ) then
6811         xv(mgs,lh) = rho0(mgs)*qx(mgs,lh)/(xdn(mgs,lh)*Max(1.0e-9,cx(mgs,lh)))
6812         xmas(mgs,lh) = xv(mgs,lh)*xdn(mgs,lh)
6814         IF ( xv(mgs,lh) .lt. xvmn(lh) .or. xv(mgs,lh) .gt. xvmx(lh) ) THEN
6815           xv(mgs,lh) = Min( xvmx(lh), Max( xvmn(lh),xv(mgs,lh) ) )
6816           xmas(mgs,lh) = xv(mgs,lh)*xdn(mgs,lh)
6817           cx(mgs,lh) = rho0(mgs)*qx(mgs,lh)/(xmas(mgs,lh))
6818         ENDIF
6820          xdia(mgs,lh,3) = (xv(mgs,lh)*6.*pii)**(1./3.) ! mwfac*xdia(mgs,lh,1) ! (xv(mgs,lh)*cwc0*6.0)**(1./3.)
6821          IF ( dmuh == 1.0 ) THEN
6822            xdia(mgs,lh,1) = cwch(mgs)*xdia(mgs,lh,3)
6823          ELSE
6824            xdia(mgs,lh,1) = (xv(mgs,lh)*cwch(mgs))**(1./3.)
6825          ENDIF
6827       ELSE
6828       xdia(mgs,lh,1) =  &
6829      &  (qx(mgs,lh)*rho0(mgs)/(pi*xdn(mgs,lh)*cno(lh)))**(0.25) 
6830       cx(mgs,lh) = cno(lh)*xdia(mgs,lh,1)
6831       xv(mgs,lh) = Max(xvmn(lh), rho0(mgs)*qx(mgs,lh)/(xdn(mgs,lh)*cx(mgs,lh)) )
6832       xdia(mgs,lh,3) = (xv(mgs,lh)*6./pi)**(1./3.) 
6833       end if
6834       else
6835       xdia(mgs,lh,1) = 1.e-9
6836       xdia(mgs,lh,3) = 1.e-9
6837       end if
6838       xdia(mgs,lh,2) = xdia(mgs,lh,1)**2
6839 !      hwdia3(mgs) = xdia(mgs,lh,2)*xdia(mgs,lh,1)
6840 !      xmas(mgs,lh) = xdn(mgs,lh)*(pi/6.)*hwdia3(mgs)
6841       end do
6842       
6843       ENDIF
6846 ! ################################################################
6848 !  HAIL
6851       IF ( lhl .gt. 1 .and. ( ildo == 0 .or. ildo == lhl ) ) THEN
6852       
6853       do mgs = 1,ngscnt 
6854       if ( qx(mgs,lhl) .gt. qxmin(lhl) ) then
6855       if ( ipconc .ge. 5 ) then
6857         xv(mgs,lhl) = rho0(mgs)*qx(mgs,lhl)/(xdn(mgs,lhl)*Max(1.0e-9,cx(mgs,lhl)))
6858         xmas(mgs,lhl) = xv(mgs,lhl)*xdn(mgs,lhl)
6859 !        write(0,*) 'setvt: xv = ',xv(mgs,lhl),xdn(mgs,lhl),cx(mgs,lhl),xmas(mgs,lhl),qx(mgs,lhl)
6861         IF ( xv(mgs,lhl) .lt. xvmn(lhl) .or. xv(mgs,lhl) .gt. xvmx(lhl) ) THEN
6862           xv(mgs,lhl) = Min( xvmx(lhl), Max( xvmn(lhl),xv(mgs,lhl) ) )
6863           xmas(mgs,lhl) = xv(mgs,lhl)*xdn(mgs,lhl)
6864           cx(mgs,lhl) = rho0(mgs)*qx(mgs,lhl)/(xmas(mgs,lhl))
6865         ENDIF
6867         xdia(mgs,lhl,3) = (xv(mgs,lhl)*6./pi)**(1./3.) ! mwfac*xdia(mgs,lh,1) ! (xv(mgs,lh)*cwc0*6.0)**(1./3.)
6868          IF ( dmuhl == 1.0 ) THEN
6869            xdia(mgs,lhl,1) = cwchl(mgs)*xdia(mgs,lhl,3)
6870          ELSE
6871            xdia(mgs,lhl,1) = (xv(mgs,lhl)*cwchl(mgs))**(1./3.)
6872          ENDIF
6873         
6874 !        write(0,*) 'setvt: xv = ',xv(mgs,lhl),xdn(mgs,lhl),cx(mgs,lhl),xdia(mgs,lhl,3)
6875       ELSE
6876       xdia(mgs,lhl,1) = &
6877      &  (qx(mgs,lhl)*rho0(mgs)/(pi*xdn(mgs,lhl)*cno(lhl)))**(0.25) 
6878       cx(mgs,lhl) = cno(lhl)*xdia(mgs,lhl,1)
6879       xv(mgs,lhl) = Max(xvmn(lhl), rho0(mgs)*qx(mgs,lhl)/(xdn(mgs,lhl)*cx(mgs,lhl)) )
6880       xdia(mgs,lhl,3) = (xv(mgs,lhl)*6./pi)**(1./3.) 
6881       end if
6882       else
6883       xdia(mgs,lhl,1) = 1.e-9
6884       xdia(mgs,lhl,3) = 1.e-9
6885       end if
6886       xdia(mgs,lhl,2) = xdia(mgs,lhl,1)**2
6887 !      hwdia3(mgs) = xdia(mgs,lh,2)*xdia(mgs,lh,1)
6888 !      xmas(mgs,lh) = xdn(mgs,lh)*(pi/6.)*hwdia3(mgs)
6889       end do
6890       
6891       ENDIF
6892 !      
6895 !  Set terminal velocities...
6896 !    also set drag coefficients (moved to start of subroutine)
6898 !      cdx(lr) = 0.60
6899 !      cdx(lh) = 0.45
6900 !      cdx(lhl) = 0.45
6901 !      cdx(lf) = 0.45
6902 !      cdx(lgh) = 0.60
6903 !      cdx(lgm) = 0.80
6904 !      cdx(lgl) = 0.80
6905 !      cdx(lir) = 2.00
6907       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set terminal velocities'
6910 ! ################################################################
6912 !  RAIN
6914       IF ( ildo == 0 .or. ildo == lr ) THEN
6915       do mgs = 1,ngscnt
6916       if ( qx(mgs,lr) .gt. qxmin(lr) ) then
6917       IF ( ipconc .lt. 3 ) THEN
6918         vtxbar(mgs,lr,1) = rainfallfac*(ar*gf4br/6.0)*(xdia(mgs,lr,1)**br)*rhovt(mgs)
6919 !        write(91,*) 'vtxbar: ',vtxbar(mgs,lr,1),mgs,gf4br,xdia(mgs,lr,1),rhovt(mgs)
6920       ELSE
6921         
6922         IF ( imurain == 1 ) THEN ! DSD of Diameter
6923         
6924         ! using functional form of  arx*(1 - Exp(-frx*diameter) ), with arx =       arx = 10.
6925         !  and frx = 516.575 ! raind fit parameters for arx*(1 - Exp(-fx*d)), where d is rain diameter in meters.
6926         ! Similar form as in Atlas et al. (1973), who had 9.65 - 10.3*Exp[-600 * d]
6928         
6929           alp = alpha(mgs,lr)
6930           
6931           vtxbar(mgs,lr,1) = rhovt(mgs)*arx*(1.0 - (1.0 + frx*xdia(mgs,lr,1))**(-alp - 4.0) ) ! mass weighted
6932           
6933           IF ( infdo .ge. 1 .and. rssflg == 1 ) THEN
6934             vtxbar(mgs,lr,2) = rhovt(mgs)*arx*(1.0 - (1.0 + frx*xdia(mgs,lr,1))**(-alp - 1.0) ) ! number weighted
6935           ELSE
6936             vtxbar(mgs,lr,2) = vtxbar(mgs,lr,1)
6937           ENDIF
6938           
6939           IF ( infdo .ge. 2 .and. rssflg == 1 ) THEN
6940             vtxbar(mgs,lr,3) = rhovt(mgs)*arx*(1.0 - (1.0 + frx*xdia(mgs,lr,1))**(-alp - 7.0) ) ! z-weighted
6941           ELSE
6942             vtxbar(mgs,lr,3) = vtxbar(mgs,lr,1)
6943           ENDIF
6944           
6945 !          write(91,*) 'setvt: alp,vn,vm,vz = ',alp,vtxbar(mgs,lr,2), vtxbar(mgs,lr,1), vtxbar(mgs,lr,3),alpha(mgs,lr)
6947         ELSEIF ( imurain == 3 ) THEN ! DSD of Volume
6948         
6949         IF ( lzr < 1 ) THEN ! not 3-moment rain
6950         rwdia = Min( xdia(mgs,lr,1), 8.0e-3 )
6951         
6952          vtxbar(mgs,lr,1) = rhovt(mgs)*6.0*pii*( 0.04771 + 3788.0*rwdia -  &
6953      &        1.105e6*rwdia**2 + 1.412e8*rwdia**3 - 6.527e9*rwdia**4)
6954         
6955         IF ( infdo .ge. 1 ) THEN
6956           IF (  rssflg >= 1 ) THEN
6957          vtxbar(mgs,lr,2) = (0.09112 + 2714.0*rwdia - 4.872e5*rwdia**2 +  &
6958      &            4.495e7*rwdia**3 - 1.626e9*rwdia**4)*rhovt(mgs)
6959           ELSE
6960             vtxbar(mgs,lr,2) = vtxbar(mgs,lr,1)
6961           ENDIF
6962         ENDIF
6963         
6964         IF ( infdo .ge. 2 ) THEN ! Z-weighted fall speed
6965         vtxbar(mgs,lr,3)  = rhovt(mgs)*(  &
6966      &       0.0911229 +                  &
6967      &  9246.494*(rwdia) -               &
6968      &  3.2839926e6*(rwdia**2) +          &
6969      &  4.944093e8*(rwdia**3) -          &
6970      &  2.631718e10*(rwdia**4) )
6971         ENDIF
6972         
6973         ELSE ! 3-moment rain, gamma-volume
6975         vr = xv(mgs,lr)
6976         rnux = alpha(mgs,lr)
6977         
6978         IF ( infdo .ge. 1 .and. rssflg == 1) THEN ! number-weighted; DTD: added size-sorting flag
6979         vtxbar(mgs,lr,2) = rhovt(mgs)*                             &
6980      &     (((1. + rnux)/vr)**(-1.333333)*                         &
6981      &    (0.0911229*((1. + rnux)/vr)**1.333333*Gamma_sp(1. + rnux) + &
6982      &      (5430.3131*(1. + rnux)*Gamma_sp(4./3. + rnux))/           &
6983      &       vr - 1.0732802e6*((1. + rnux)/vr)**0.6666667*         &
6984      &       Gamma_sp(1.666667 + rnux) +                              &
6985      &      8.584110982429507e7*((1. + rnux)/vr)**(1./3.)*         &
6986      &       Gamma_sp(2. + rnux) -                                    &
6987      &      2.3303765697228556e9*Gamma_sp(7./3. + rnux)))/            &
6988      &  Gamma_sp(1. + rnux)
6989         ENDIF
6991 !  mass-weighted
6992        vtxbar(mgs,lr,1)  = rhovt(mgs)*                                                 &
6993      &   (0.0911229*(1 + rnux)**1.3333333333333333*Gamma_sp(2. + rnux) +                  &
6994      &    5430.313059683277*(1 + rnux)*vr**0.3333333333333333*                         &
6995      &     Gamma_sp(2.333333333333333 + rnux) -                                           &
6996      &    1.0732802065650471e6*(1 + rnux)**0.6666666666666666*vr**0.6666666666666666*  &
6997      &     Gamma_sp(2.6666666666666667 + rnux) +                                          &
6998      &    8.584110982429507e7*(1 + rnux)**0.3333333333333333*vr*Gamma_sp(3 + rnux) -      &
6999      &    2.3303765697228556e9*vr**1.3333333333333333*                                 &
7000      &     Gamma_sp(3.333333333333333 + rnux))/                                           &
7001      &  ((1 + rnux)**2.333333333333333*Gamma_sp(1 + rnux)) 
7002      
7003         IF(infdo .ge. 1 .and. rssflg == 0) THEN ! No size-sorting, set N-weighted fall speed to mass-weighted
7004           vtxbar(mgs,lr,2) = vtxbar(mgs,lr,1)
7005         ENDIF     
7006       
7007         IF ( infdo .ge. 2 .and. rssflg == 1) THEN ! Z-weighted fall speed
7008         vtxbar(mgs,lr,3)  =   rhovt(mgs)*                                          &
7009      &  ((1. + rnux)*(0.0911229*(1 + rnux)**1.3333333333333333*Gamma_sp(3. + rnux) +  &
7010      &      5430.313059683277*(1 + rnux)*vr**0.3333333333333333*                   &
7011      &       Gamma_sp(3.3333333333333335 + rnux) -                                    &
7012      &      1.0732802065650471e6*(1 + rnux)**0.6666666666666666*                   &
7013      &       vr**0.6666666666666666*Gamma_sp(3.6666666666666665 + rnux) +             &
7014      &      8.5841109824295e7*(1 + rnux)**0.3333333333333333*vr*Gamma_sp(4. + rnux) - &
7015      &      2.3303765697228556e9*vr**1.3333333333333333*                           &
7016      &       Gamma_sp(4.333333333333333 + rnux)))/                                    &
7017      &  ((1 + rnux)**3.3333333333333335*(2 + rnux)*Gamma_sp(1 + rnux))
7018         
7019 !         write(0,*) 'setvt: mgs,lzr,infdo = ',mgs,lzr,infdo
7020 !         write(0,*) 'vt1,2,3 = ',vtxbar(mgs,lr,1),vtxbar(mgs,lr,2),vtxbar(mgs,lr,3)
7021         
7022         ELSEIF (infdo .ge. 2) THEN ! No size-sorting, set Z-weighted fall speed to mass-weighted
7023           vtxbar(mgs,lr,3) = vtxbar(mgs,lr,1)
7024         ENDIF
7025         
7026         
7027         ENDIF
7028        ENDIF ! imurain
7030 !        IF ( rwrad*mwfac .gt. 6.0e-4  ) THEN
7031 !          vtxbar(mgs,lr,1) = 20.1*Sqrt(100.*rwrad*mwfac)*rhovt(mgs)
7032 !        ELSE
7033 !          vtxbar(mgs,lr,1) = 80.0e2*rwrad*rhovt(mgs)*mwfac
7034 !        ENDIF
7035 !        IF ( rwrad .gt. 6.0e-4  ) THEN
7036 !          vtxbar(mgs,lr,2) = 20.1*Sqrt(100.*rwrad)*rhovt(mgs)
7037 !        ELSE
7038 !          vtxbar(mgs,lr,2) = 80.0e2*rwrad*rhovt(mgs)
7039 !        ENDIF
7040       ENDIF ! ipconc
7041       else  ! qr < qrmin
7042       vtxbar(mgs,lr,1) = 0.0
7043       vtxbar(mgs,lr,2) = 0.0
7044       end if
7045       end do
7046       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set rain vt'
7047       
7048       ENDIF
7050 ! ################################################################
7052 !  SNOW !Zrnic et al. (1993)
7054       IF ( ls .gt. 1 .and. ( ildo == 0 .or. ildo == ls ) ) THEN
7055       do mgs = 1,ngscnt
7056       if ( qx(mgs,ls) .gt. qxmin(ls) ) then
7057         IF ( ipconc .ge. 4 ) THEN
7058          if ( mixedphase .and. qsvtmod ) then
7059          else
7060           IF ( isnowfall == 1 ) THEN
7061            ! original (Zrnic et al. 1993)
7062            vtxbar(mgs,ls,1) = 5.72462*rhovt(mgs)*(xv(mgs,ls))**(1./12.)
7063           ELSEIF ( isnowfall == 2 ) THEN
7064           ! Ferrier:
7065             IF ( isnowdens == 1 ) THEN
7066               vtxbar(mgs,ls,1) = 11.9495*rhovt(mgs)*(xv(mgs,ls))**(0.14)
7067             ELSE
7068               vtxbar(mgs,ls,1) = 11.9495*rhovt(mgs)*(xv(mgs,ls)*xdn(mgs,ls)/100.)**(0.14) 
7069             ENDIF
7070           ELSEIF ( isnowfall == 3 ) THEN
7071           ! Cox, mass distrib:
7072             vtxbar(mgs,ls,1) = 50.092*rhovt(mgs)*(xmas(mgs,ls))**(0.2635)
7073           ENDIF
7074           
7075           IF(Abs(sssflg) >= 1) THEN
7076             IF ( isnowfall == 1 ) THEN
7077               vtxbar(mgs,ls,2) = 4.04091*rhovt(mgs)*(xv(mgs,ls))**(1./12.)
7078             ELSEIF ( isnowfall == 2 ) THEN
7079             ! Ferrier:
7080               IF ( isnowdens == 1 ) THEN
7081                 vtxbar(mgs,ls,2) = 7.02909*rhovt(mgs)*(xv(mgs,ls))**(0.14)  ! bug fix 11/15/2015: was rewriting to mass fall speed vtxbar(mgs,ls,1)
7082               ELSE
7083                 vtxbar(mgs,ls,2) = 7.02909*rhovt(mgs)*(xv(mgs,ls)*xdn(mgs,ls)/100.)**(0.14)  ! bug fix 11/15/2015: was rewriting to mass fall speed vtxbar(mgs,ls,1)
7084               ENDIF
7085             ELSEIF ( isnowfall == 3 ) THEN
7086             ! Cox, mass distrib:
7087               vtxbar(mgs,ls,2) = 21.6147*rhovt(mgs)*(xmas(mgs,ls))**(0.2635)
7088             ENDIF
7089           ELSE
7090             vtxbar(mgs,ls,2) = vtxbar(mgs,ls,1)
7091           ENDIF
7092            IF ( infdo  >= 2 ) THEN
7093             IF ( isnowfall == 1 ) THEN
7094              vtxbar(mgs,ls,3) = 6.12217*rhovt(mgs)*(xv(mgs,ls))**(1./12.) ! Zrnic et al 93
7095             ELSEIF ( isnowfall == 2 ) THEN
7096              vtxbar(mgs,ls,3) = 13.3436*rhovt(mgs)*(xv(mgs,ls))**(0.14)   ! Ferrier 94
7097             ELSEIF ( isnowfall == 3 ) THEN
7098             ! Cox, mass distrib:
7099               vtxbar(mgs,ls,3) = 61.0914*rhovt(mgs)*(xmas(mgs,ls))**(0.2635)
7100             ENDIF
7101            ENDIF
7102          
7103          IF ( sssflg < 0 .and. temcg(mgs) > Abs(sssflg) ) THEN ! above a given temperature, effectively turn off size sorting
7104             vtxbar(mgs,ls,2) = vtxbar(mgs,ls,1)
7105             vtxbar(mgs,ls,3) = vtxbar(mgs,ls,1)
7106          ENDIF
7107          
7108          endif
7109         ELSE ! single-moment:
7110          vtxbar(mgs,ls,1) = (cs*gf4ds/6.0)*(xdia(mgs,ls,1)**ds)*rhovt(mgs)
7111          vtxbar(mgs,ls,2) = vtxbar(mgs,ls,1)
7112         ENDIF
7113       else
7114       vtxbar(mgs,ls,1) = 0.0
7115       end if
7117       IF ( snowfallfac /= 1.0 ) THEN
7118         vtxbar(mgs,ls,1) = snowfallfac*vtxbar(mgs,ls,1)
7119         vtxbar(mgs,ls,2) = snowfallfac*vtxbar(mgs,ls,2)
7120         vtxbar(mgs,ls,3) = snowfallfac*vtxbar(mgs,ls,3)
7121       ENDIF
7124       end do
7125       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set snow vt'
7126       
7127       ENDIF ! ls .gt. 1
7130 ! ################################################################
7132 !  GRAUPEL !Wisner et al. (1972)
7134       IF ( lh .gt. 1 .and. ( ildo == 0 .or. ildo == lh ) ) THEN
7135       
7136       do mgs = 1,ngscnt
7137       vtxbar(mgs,lh,1) = 0.0
7138       if ( qx(mgs,lh) .gt. qxmin(lh) ) then
7139          cd = cdx(lh)
7140         IF ( icdx .eq. 1 ) THEN
7141          cd = cdx(lh)
7142        ELSEIF ( icdx .eq. 2 ) THEN
7143 !         cd = Max(0.6, Min(1.0, 0.6 + 0.4*(xdnmx(lh) - xdn(mgs,lh))/(xdnmx(lh)-xdnmn(lh)) ) )
7144 !         cd = Max(0.6, Min(1.0, 0.6 + 0.4*(900.0 - xdn(mgs,lh))/(900. - 300.) ) )
7145          cd = Max(0.45, Min(1.0, 0.45 + 0.35*(800.0 - Max( 500., Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 500.) ) )
7146 !         cd = Max(0.55, Min(1.0, 0.55 + 0.25*(800.0 - Max( 500., Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 500.) ) )
7147        ELSEIF ( icdx .eq. 3 ) THEN
7148 !         cd = Max(0.45, Min(1.0, 0.45 + 0.55*(800.0 - Max( 300., Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 300.) ) )
7149          cd = Max(0.45, Min(1.2, 0.45 + 0.55*(800.0 - Max( hdnmn, Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 170.0) ) )
7150        ELSEIF ( icdx .eq. 4 ) THEN
7151          cd = Max(cdhmin, Min(cdhmax, cdhmin + (cdhmax-cdhmin)* &
7152      &        (cdhdnmax - Max( cdhdnmin, Min( cdhdnmax, xdn(mgs,lh) ) ) )/(cdhdnmax - cdhdnmin) ) )
7153        ELSEIF ( icdx .eq. 5 ) THEN
7154          cd = cdx(lh)*(xdn(mgs,lh)/rho_qh)**(2./3.)
7155        ELSEIF ( icdx .eq. 6 ) THEN ! Milbrandt and Morrison (2013)
7156          indxr = Int( (xdn(mgs,lh)-50.)/100. ) + 1
7157          indxr = Min( ngdnmm, Max(1,indxr) )
7158          
7159          
7160          delrho = Max( 0.0, 0.01*(xdn(mgs,lh) - mmgraupvt(indxr,1)) )
7161          IF ( indxr < ngdnmm ) THEN
7162           
7163           axx(mgs,lh) = mmgraupvt(indxr,2) + delrho*(mmgraupvt(indxr+1,2) - mmgraupvt(indxr,2) )
7164           bxx(mgs,lh) = mmgraupvt(indxr,3) + delrho*(mmgraupvt(indxr+1,3) - mmgraupvt(indxr,3) )
7166           
7167          ELSE
7168           axx(mgs,lh) = mmgraupvt(indxr,2)
7169           bxx(mgs,lh) = mmgraupvt(indxr,3)
7170          ENDIF
7171          
7172          aax = axx(mgs,lh)
7173          bbx = bxx(mgs,lh)
7175          cd = Max(0.45, Min(1.2, 0.45 + 0.55*(800.0 - Max( hdnmn, Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 170.0) ) )
7176          
7177        ELSEIF ( icdx <= 0 ) THEN ! 
7178          aax = ax(lh)
7179          bbx = bx(lh)
7180           cd = Max(0.45, Min(1.2, 0.45 + 0.55*(800.0 - Max( hdnmn, Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 170.0) ) )
7181        ELSE
7182          cd = Max(0.45, Min(1.2, 0.45 + 0.55*(800.0 - Max( hdnmn, Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 170.0) ) )
7183        ENDIF
7184        
7185        cdxgs(mgs,lh) = cd
7186       IF ( alpha(mgs,lh) .eq. 0.0 .and. icdx > 0 .and. icdx /= 6 ) THEN
7187 !      axx(mgs,lh) =  (gf4p5/6.0)*  &
7188 !     &  Sqrt( (xdn(mgs,lh)*4.0*gr) /  &
7189 !     &    (3.0*cd*rho0(mgs)) )
7190       axx(mgs,lh) = Sqrt(4.0*xdn(mgs,lh)*gr/(3.0*cd*rho00))
7191       bxx(mgs,lh) = 0.5
7192       vtxbar(mgs,lh,1) = (gf4p5/6.0)* rhovt(mgs)*axx(mgs,lh) * Sqrt(xdia(mgs,lh,1)) 
7193 !      vtxbar(mgs,lh,1) = (gf4p5/6.0)*  &
7194 !     &  Sqrt( (xdn(mgs,lh)*xdia(mgs,lh,1)*4.0*gr) /  &
7195 !     &    (3.0*cd*rho0(mgs)) )
7196       ELSE
7197         IF ( icdx /= 6 ) bbx = bx(lh)
7198         tmp = 4. + alpha(mgs,lh) + bbx
7199         i = Int(dgami*(tmp))
7200         del = tmp - dgam*i
7201         x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
7203         tmp = 4. + alpha(mgs,lh)
7204         i = Int(dgami*(tmp))
7205         del = tmp - dgam*i
7206         y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
7207         
7208 !        aax = Max( 1.0, Min(2.0, (xdn(mgs,lh)/400.) ) )
7209 !        vtxbar(mgs,lh,1) =  rhovt(mgs)*aax*ax(lh)*(xdia(mgs,lh,1)**bx(lh)*x)/y
7210         
7211         IF ( icdx > 0 .and. icdx /= 6) THEN
7212           aax = Sqrt(4.0*xdn(mgs,lh)*gr/(3.0*cd*rho00))
7213           vtxbar(mgs,lh,1) =  rhovt(mgs)*aax* Sqrt(xdia(mgs,lh,1)) * x/y
7214           axx(mgs,lh) = aax
7215           bxx(mgs,lh) = bbx
7216         ELSEIF (icdx == 6 ) THEN
7217           vtxbar(mgs,lh,1) =  rhovt(mgs)*aax* xdia(mgs,lh,1)**bbx * x/y
7218         ELSE ! icdx < 0
7219           axx(mgs,lh) = ax(lh)
7220           bxx(mgs,lh) = bx(lh)
7221           vtxbar(mgs,lh,1) =  rhovt(mgs)*ax(lh)*(xdia(mgs,lh,1)**bx(lh)*x)/y          
7222         ENDIF
7224 !     &    Gamma_sp(4.0 + dnu(lh) + 0.6))/Gamma_sp(4. + dnu(lh))
7225       ENDIF
7227       IF ( lwsm6 .and. ipconc == 0 ) THEN
7228 !         vtxbar(mgs,lh,1) = (330.*gf4ds/6.0)*(xdia(mgs,ls,1)**ds)*rhovt(mgs)
7229          vtxbar(mgs,lh,1) = (330.*gf4br/6.0)*(xdia(mgs,lh,1)**br)*rhovt(mgs)
7230       ENDIF
7231       
7232       end if
7233       end do
7234       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set hail vt'
7235       
7236       ENDIF ! lh .gt. 1
7239 ! ################################################################
7241 !  HAIL
7243       IF ( lhl .gt. 1 .and. ( ildo == 0 .or. ildo == lhl ) ) THEN
7244       
7245       do mgs = 1,ngscnt
7246       vtxbar(mgs,lhl,1) = 0.0
7247       if ( qx(mgs,lhl) .gt. qxmin(lhl) ) then
7249        IF ( icdxhl .eq. 1 ) THEN
7250          cd = cdx(lhl)
7251        ELSEIF ( icdxhl .eq. 3 ) THEN
7252 !         cd = Max(0.45, Min(1.0, 0.45 + 0.55*(800.0 - Max( 300., Min( 800.0, xdn(mgs,lhl) ) ) )/(800. - 300.) ) )
7253          cd = Max(0.45, Min(1.2, 0.45 + 0.55*(800.0 - Max( hldnmn, Min( 800.0, xdn(mgs,lhl) ) ) )/(800. - 170.0) ) )
7254        ELSEIF ( icdxhl .eq. 4 ) THEN
7255          cd = Max(cdhlmin, Min(cdhlmax, cdhlmin + (cdhlmax-cdhlmin)*  &
7256      &       (cdhldnmax - Max( cdhldnmin, Min( cdhldnmax, xdn(mgs,lhl) ) ) )/(cdhldnmax - cdhldnmin) ) )
7257        ELSEIF ( icdxhl .eq. 5 ) THEN
7258          cd = cdx(lh)*(xdn(mgs,lhl)/rho_qh)**(2./3.)
7259        ELSEIF ( icdxhl .eq. 6 ) THEN ! Milbrandt and Morrison (2013)
7260          indxr = Int( (xdn(mgs,lhl)-50.)/100. ) + 1
7261          indxr = Min( ngdnmm, Max(1,indxr) )
7262          
7263          
7264          delrho = Max( 0.0, 0.01*(xdn(mgs,lhl) - mmgraupvt(indxr,1)) )
7265          IF ( indxr < ngdnmm ) THEN
7266           
7267           axx(mgs,lhl) = mmgraupvt(indxr,2) + delrho*(mmgraupvt(indxr+1,2) - mmgraupvt(indxr,2) )
7268           bxx(mgs,lhl) = mmgraupvt(indxr,3) + delrho*(mmgraupvt(indxr+1,3) - mmgraupvt(indxr,3) )
7270           
7271          ELSE
7272           axx(mgs,lhl) = mmgraupvt(indxr,2)
7273           bxx(mgs,lhl) = mmgraupvt(indxr,3)
7274          ENDIF
7275          
7276          aax = axx(mgs,lhl)
7277          bbx = bxx(mgs,lhl)
7279          cd = Max(0.45, Min(1.2, 0.45 + 0.55*(800.0 - Max( hldnmn, Min( 800.0, xdn(mgs,lhl) ) ) )/(800. - 170.0) ) )
7280          
7281        ELSE
7282 !         cd = Max(0.6, Min(1.0, 0.6 + 0.4*(900.0 - xdn(mgs,lhl))/(900. - 300.) ) )
7283 !        cd = Max(0.5, Min(0.8, 0.5 + 0.3*(xdnmx(lhl) - xdn(mgs,lhl))/(xdnmx(lhl)-xdnmn(lhl)) ) )
7284 !         cd = Max(0.45, Min(0.6, 0.45 + 0.15*(800.0 - Max( 500., Min( 800.0, xdn(mgs,lhl) ) ) )/(800. - 500.) ) )
7285          cd = Max(0.45, Min(1.2, 0.45 + 0.55*(800.0 - Max( hldnmn, Min( 800.0, xdn(mgs,lhl) ) ) )/(800. - 170.0) ) )
7286        ENDIF
7288        cdxgs(mgs,lhl) = cd
7290       IF ( alpha(mgs,lhl) .eq. 0.0 .and. icdxhl > 0 .and. icdxhl /= 6) THEN
7291 !      axx(mgs,lhl) =  (gf4p5/6.0)*  &
7292 !     &  Sqrt( (xdn(mgs,lhl)*4.0*gr) /  &
7293 !     &    (3.0*cd*rho0(mgs)) )
7294       axx(mgs,lhl) = Sqrt(4.0*xdn(mgs,lhl)*gr/(3.0*cd*rho00))
7295       bxx(mgs,lhl) = 0.5
7296       vtxbar(mgs,lhl,1) = (gf4p5/6.0)* rhovt(mgs)*axx(mgs,lhl) * Sqrt(xdia(mgs,lhl,1)) 
7297       ELSE
7298         IF ( icdxhl /= 6 ) bbx = bx(lhl)
7299         tmp = 4. + alpha(mgs,lhl) + bbx
7300         i = Int(dgami*(tmp))
7301         del = tmp - dgam*i
7302         x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
7304         tmp = 4. + alpha(mgs,lhl)
7305         i = Int(dgami*(tmp))
7306         del = tmp - dgam*i
7307         y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
7309         IF ( icdxhl > 0 .and. icdxhl /= 6) THEN
7310           aax = Sqrt(4.0*xdn(mgs,lhl)*gr/(3.0*cd*rho00))
7311           vtxbar(mgs,lhl,1) =  rhovt(mgs)*aax* Sqrt(xdia(mgs,lhl,1)) * x/y
7312           axx(mgs,lhl) = aax
7313           bxx(mgs,lhl) = bbx
7314         ELSEIF ( icdxhl == 6 ) THEN
7315           vtxbar(mgs,lhl,1) =  rhovt(mgs)*aax* (xdia(mgs,lhl,1))**bbx * x/y
7316         ELSE
7317           axx(mgs,lhl) = ax(lhl)
7318           bxx(mgs,lhl) = bx(lhl)
7319          vtxbar(mgs,lhl,1) =  rhovt(mgs)*(ax(lhl)*xdia(mgs,lhl,1)**bx(lhl)*x)/y
7320         ENDIF
7321         
7322 !     &    Gamma_sp(4.0 + dnu(lh) + 0.6))/Gamma_sp(4. + dnu(lh))
7323       ENDIF
7326       end if
7327       end do
7328       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set hail vt'
7329       
7330       ENDIF ! lhl .gt. 1
7333       IF ( infdo .ge. 1 ) THEN
7335 !      DO il = lc,lhab
7336 !      IF ( il .ne. lr ) THEN
7337         DO mgs = 1,ngscnt
7338           IF ( ildo == 0 .or. ildo == lc ) THEN
7339             vtxbar(mgs,lc,2) = vtxbar(mgs,lc,1)
7340           ENDIF
7341         IF ( li .gt. 1 ) THEN
7342 !          vtxbar(mgs,li,2) = rhovt(mgs)*49420.*1.25447*xdia(mgs,li,1)**(1.415) ! n-wgt (Ferrier 94)
7343 !          vtxbar(mgs,li,2) = vtxbar(mgs,li,1)
7345 ! test print stuff...
7346 !          IF ( xdia(mgs,li,1) .gt. 200.e-6 ) THEN
7347 !            tmp = (xv(mgs,li)*cwc0)**(1./3.)
7348 !            x = rhovt(mgs)*49420.*40.0005/5.40662*tmp**(1.415)
7349 !            y = rhovt(mgs)*49420.*1.25447*tmp**(1.415)
7350 !            write(6,*) 'Ice fall: ',vtxbar(mgs,li,1),x,y,tmp,xdia(mgs,li,1)
7351 !          ENDIF
7352         ENDIF
7353 !          vtxbar(mgs,ls,2) = vtxbar(mgs,ls,1)
7354         ENDDO
7356         IF ( lg .gt. lr ) THEN
7358         DO il = lg,lhab
7359          IF ( ildo == 0 .or. ildo == il ) THEN
7361             DO mgs = 1,ngscnt
7362              IF ( qx(mgs,il) .gt. qxmin(il) ) THEN
7363               IF ( (il .eq. lh .and. hssflg == 1) .or. ( lhl .gt. 1 .and. il .eq. lhl .and. hlssflg == 1) ) THEN ! DTD: added flag for size-sorting
7364               
7365               ! DTD: allow for setting of number-weighted and z-weighted fall speeds to the mass-weighted value,
7366               ! effectively turning off size-sorting
7368               IF ( il .eq. lh ) THEN ! {
7369              
7370                IF ( icdx .eq. 1 ) THEN
7371                  cd = cdx(lh)
7372                ELSEIF ( icdx .eq. 2 ) THEN
7373 !                 cd = Max(0.6, Min(1.0, 0.6 + 0.4*(xdnmx(lh) - xdn(mgs,lh))/(xdnmx(lh)-xdnmn(lh)) ) )
7374 !                 cd = Max(0.6, Min(1.0, 0.6 + 0.4*(900.0 - xdn(mgs,lh))/(900. - 300.) ) )
7375                  cd = Max(0.45, Min(1.0, 0.45 + 0.35*(800.0 - Max( 500., Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 500.) ) )
7376 !                 cd = Max(0.55, Min(1.0, 0.55 + 0.25*(800.0 - Max( 500., Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 500.) ) )
7377                ELSEIF ( icdx .eq. 3 ) THEN
7378 !                 cd = Max(0.45, Min(1.0, 0.45 + 0.55*(800.0 - Max( 170.0, Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 170.0) ) )
7379                  cd = Max(0.45, Min(1.2, 0.45 + 0.55*(800.0 - Max( hdnmn, Min( 800.0, xdn(mgs,lh) ) ) )/(800. - 170.0) ) )
7380                ELSEIF ( icdx .eq. 4 ) THEN
7381                  cd = Max(cdhmin, Min(cdhmax, cdhmin + (cdhmax-cdhmin)* &
7382      &            (cdhdnmax - Max( cdhdnmin, Min( cdhdnmax, xdn(mgs,lh) ) ) )/(cdhdnmax - cdhdnmin) ) )
7383                ELSEIF ( icdx .eq. 5 ) THEN
7384                  cd = cdx(lh)*(xdn(mgs,lh)/rho_qh)**(2./3.)
7385                ELSEIF ( icdx .eq. 6 ) THEN ! Milbrandt and Morrison (2013)
7386                   aax = axx(mgs,lh)
7387                   bbx = bxx(mgs,lh)
7388                ELSEIF ( icdx <= 0 ) THEN ! 
7389                   aax = ax(lh)
7390                   bbx = bx(lh)
7391                ENDIF
7392                
7393               ELSEIF ( lhl .gt. 1 .and. il .eq. lhl ) THEN
7394              
7395                IF ( icdxhl .eq. 1 ) THEN
7396                  cd = cdx(lhl)
7397                ELSEIF ( icdxhl .eq. 3 ) THEN
7398 !               cd = Max(0.45, Min(1.0, 0.45 + 0.55*(800.0 - Max( 300., Min( 800.0, xdn(mgs,lhl) ) ) )/(800. - 300.) ) )
7399                 cd = Max(0.45, Min(1.2, 0.45 + 0.55*(800.0 - Max( hldnmn, Min( 800.0, xdn(mgs,lhl) ) ) )/(800. - 170.0) ) )
7400                ELSEIF ( icdxhl .eq. 4 ) THEN
7401                 cd = Max(cdhlmin, Min(cdhlmax, cdhlmin + (cdhlmax-cdhlmin)*  &
7402      &               (cdhldnmax - Max( cdhldnmin, Min( cdhldnmax, xdn(mgs,lhl) ) ) )/(cdhldnmax - cdhldnmin) ) )
7403                ELSEIF ( icdxhl == 5 ) THEN
7404 !                cd = Max(0.6, Min(1.0, 0.6 + 0.4*(900.0 - xdn(mgs,lhl))/(900. - 300.) ) )
7405 !                cd = Max(0.5, Min(0.8, 0.5 + 0.3*(xdnmx(lhl) - xdn(mgs,lhl))/(xdnmx(lhl)-xdnmn(lhl)) ) )
7406                  cd = Max(0.45, Min(0.6, 0.45 + 0.15*(800.0 - Max( 500., Min( 800.0, xdn(mgs,lhl) ) ) )/(800. - 500.) ) )
7407                ELSEIF ( icdxhl .eq. 6 ) THEN ! Milbrandt and Morrison (2013)
7408                   aax = axx(mgs,lhl)
7409                   bbx = bxx(mgs,lhl)
7410                ELSEIF ( icdxhl <= 0 ) THEN ! 
7411                   aax = ax(lhl)
7412                   bbx = bx(lhl)
7413                ENDIF
7414                
7415               ENDIF ! }
7417                IF ( alpha(mgs,il) .eq. 0. .and. infdo .lt. 2 .and.   &
7418                ( ( il==lh .and. icdx > 0 .and. icdx /= 6) .or. ( il==lhl .and. icdxhl > 0 .and. icdxhl /= 6 ) ) ) THEN ! {
7419                  vtxbar(mgs,il,2) =   &
7420      &              Sqrt( (xdn(mgs,il)*xdia(mgs,il,1)*pi*gr) / &
7421      &                (3.0*cd*Max(0.05,rho0(mgs))) )
7423                ELSE
7424                IF ( il == lh  .and. icdx   /= 6 ) bbx = bx(il)
7425                IF ( il == lhl .and. icdxhl /= 6 ) bbx = bx(il)
7426                tmp = 1. + alpha(mgs,il) + bbx
7427                i = Int(dgami*(tmp))
7428                del = tmp - dgam*i
7429                x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
7430   
7431                tmp = 1. + alpha(mgs,il)
7432                i = Int(dgami*(tmp))
7433                del = tmp - dgam*i
7434                y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
7436                  IF ( il .eq. lh  .or. il .eq. lhl) THEN ! {
7437                    IF ( ( il==lh .and. icdx > 0 ) ) THEN
7438                      IF ( icdx /= 6 ) THEN
7439                       aax = Sqrt(4.0*xdn(mgs,il)*gr/(3.0*cd*rho00))
7440                       vtxbar(mgs,il,2) =  rhovt(mgs)*aax* xdia(mgs,il,1)**bx(il) * x/y
7441                      ELSE !  (icdx == 6 ) THEN
7442                        vtxbar(mgs,il,2) =  rhovt(mgs)*aax* xdia(mgs,il,1)**bbx * x/y
7443                      ENDIF
7445                    ELSEIF ( ( il==lhl .and. icdxhl > 0 ) ) THEN
7446                      IF ( icdxhl /= 6 ) THEN
7447                        aax = Sqrt(4.0*xdn(mgs,il)*gr/(3.0*cd*rho00))
7448                        vtxbar(mgs,il,2) =  rhovt(mgs)*aax* xdia(mgs,il,1)**bx(il) * x/y
7449                      ELSE ! ( icdxhl == 6 )
7450                        vtxbar(mgs,il,2) =  rhovt(mgs)*aax* xdia(mgs,il,1)**bbx * x/y
7451                      ENDIF
7452                    ELSE ! get here if il==lh and icdx < 0 -- or -- il==lhl and icdxhl < 0
7453                      aax = ax(il)
7454                      vtxbar(mgs,il,2) =  rhovt(mgs)*ax(il)*(xdia(mgs,il,1)**bx(il)*x)/y
7455                    ENDIF
7456 !                  vtxbar(mgs,il,2) =  &
7457 !     &               rhovt(mgs)*(xdn(mgs,il)/400.)*(75.715*xdia(mgs,il,1)**0.6* &
7458 !     &               x)/y
7459 !                  vtxbar(mgs,il,2) =  &
7460 !     &               rhovt(mgs)*(xdn(mgs,il)/400.)*(ax(il)*xdia(mgs,il,1)**bx(il)* &
7461 !     &               x)/y
7462                   IF ( infdo .ge. 2 ) THEN ! Z-weighted
7464                tmp = 7. + alpha(mgs,il) + bbx
7465                i = Int(dgami*(tmp))
7466                del = tmp - dgam*i
7467                x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
7468   
7469                tmp = 7. + alpha(mgs,il)
7470                i = Int(dgami*(tmp))
7471                del = tmp - dgam*i
7472                y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
7474                    vtxbar(mgs,il,3) = rhovt(mgs)*                 &
7475      &                (aax*(xdia(mgs,il,1) )**bbx *  &
7476      &                 x)/y
7477 !     &                 Gamma(7.0 + alpha(mgs,il) + bbx)/Gamma(7. + alpha(mgs,il))
7478           IF ( .not. (vtxbar(mgs,il,1) > -1. .and. vtxbar(mgs,il,1) < 200. ) .or. &
7479                .not. (vtxbar(mgs,il,3) > -1. .and. vtxbar(mgs,il,3) < 200. ) ) THEN
7480            write(0,*) 'Setvtz: problem with vtxbar1/3: ',il,vtxbar(mgs,il,1),vtxbar(mgs,il,3),aax,bbx,x,y
7481            write(0,*) 'q, number, diam1,3(mm) = ', qx(mgs,il),cx(mgs,il),1000.*xdia(mgs,il,1),1000.*xdia(mgs,il,3)
7482            ! call commasmpi_abort()
7483           ENDIF
7484 !     &                (aax*(1.0/xdia(mgs,il,1) )**(- bx(il))*  &
7485 !     &                 Gamma_sp(7.0 + alpha(mgs,il) + bx(il)))/Gamma_sp(7. + alpha(mgs,il))
7486                   ENDIF
7488       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set hail vt3'
7490                  ELSE ! hail
7491                   vtxbar(mgs,il,2) =  &
7492      &               rhovt(mgs)*(ax(il)*xdia(mgs,il,1)**bx(il)* &
7493      &               x)/y
7495                  IF ( infdo .ge. 2 ) THEN ! Z-weighted
7496                   vtxbar(mgs,il,3) = rhovt(mgs)*                 &
7497      &              (aax*(1.0/xdia(mgs,il,1) )**(- bbx)*  &
7498      &               Gamma_sp(7.0 + alpha(mgs,il) + bbx))/Gamma_sp(7. + alpha(mgs,il))
7499 !     &              (ax(il)*(1.0/xdia(mgs,il,1) )**(- bx(il))*  &
7500 !     &               Gamma_sp(7.0 + alpha(mgs,il) + bx(il)))/Gamma_sp(7. + alpha(mgs,il))
7501                   ENDIF
7503       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set hail vt4'
7505                  ENDIF ! }
7506 !     &             Gamma_sp(1.0 + dnu(il) + 0.6)/Gamma_sp(1. + dnu(il))
7507                ENDIF ! }
7509 !              IF ( infdo .ge. 2 ) THEN ! Z-weighted
7510 !               vtxbar(mgs,il,3) = rhovt(mgs)*                 &
7511 !     &            (ax(il)*(1.0/xdia(mgs,il,1) )**(- bx(il))*  &
7512 !     &             Gamma_sp(7.0 + alpha(mgs,il) + bx(il)))/Gamma_sp(7. + alpha(mgs,il))
7513 !              ENDIF
7515 !               IF ( lhl .gt. 1 .and. il .eq. lhl ) THEN
7516 !                write(0,*) 'setvt: ',qx(mgs,il),xdia(mgs,il,1),xdia(mgs,il,3),dnu(il),ax(il),bx(il)
7517 !               ENDIF
7518              ELSEIF ( (il .eq. lh .and. hssflg == 0) .or. ( lhl .gt. 1 .and. il .eq. lhl .and. hlssflg == 0) ) THEN ! no size-sorting for graupel or hail
7519               vtxbar(mgs,il,2) = vtxbar(mgs,il,1)
7520               vtxbar(mgs,il,3) = vtxbar(mgs,il,1)
7521              ELSE ! not lh or lhl
7522               vtxbar(mgs,il,2) = &
7523      &            Sqrt( (xdn(mgs,il)*xdia(mgs,il,1)*pi*gr) /  &
7524      &              (3.0*cdx(il)*Max(0.05,rho0(mgs))) )
7525               vtxbar(mgs,il,3) = vtxbar(mgs,il,1)
7527       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set graupel vt5'
7530               ENDIF
7531              ELSE ! qx < qxmin
7532               vtxbar(mgs,il,2) = 0.0
7534       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set graupel vt6'
7536              ENDIF
7537            ENDDO ! mgs
7539       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set graupel vt7'
7541         ENDIF
7542         ENDDO ! il
7544       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set graupel vt8'
7546         ENDIF ! lg .gt. 1 
7547         
7548 !      ENDIF
7549 !      ENDDO
7551       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: Set graupel vt9'
7553 !       DO mgs = 1,ngscnt
7554 !        IF ( qx(mgs,lr) > qxmin(lr) ) THEN
7555 !         write(0,*) 'setvt2: mgs,lzr,infdo = ',mgs,lzr,infdo
7556 !         write(0,*) 'vt1,2,3 = ',vtxbar(mgs,lr,1),vtxbar(mgs,lr,2),vtxbar(mgs,lr,3)
7557 !        ENDIF
7558 !       ENDDO
7560       ENDIF ! infdo .ge. 1 
7562         IF (  lh > 0 .and. graupelfallfac /= 1.0 ) THEN
7563           DO mgs = 1,ngscnt
7564             vtxbar(mgs,lh,1) = graupelfallfac*vtxbar(mgs,lh,1)
7565             vtxbar(mgs,lh,2) = graupelfallfac*vtxbar(mgs,lh,2)
7566             vtxbar(mgs,lh,3) = graupelfallfac*vtxbar(mgs,lh,3)
7567             axx(mgs,lh) = graupelfallfac*axx(mgs,lh)
7568           ENDDO
7569         ENDIF
7571         IF ( lhl > 0 .and. hailfallfac /= 1.0 ) THEN
7572           DO mgs = 1,ngscnt
7573             vtxbar(mgs,lhl,1) = hailfallfac*vtxbar(mgs,lhl,1)
7574             vtxbar(mgs,lhl,2) = hailfallfac*vtxbar(mgs,lhl,2)
7575             vtxbar(mgs,lhl,3) = hailfallfac*vtxbar(mgs,lhl,3)
7576             axx(mgs,lhl) = hailfallfac*axx(mgs,lhl)
7577           ENDDO
7578         ENDIF
7579       
7580       if ( ndebug1 .gt. 0 ) write(0,*) 'SETVTZ: END OF ROUTINE'
7582 !############ SETVTZ ############################
7584       RETURN
7585       END SUBROUTINE setvtz
7586 !--------------------------------------------------------------------------
7589 ! ##############################################################################
7592 !  subroutine to calculate fall speeds of hydrometeors
7595       subroutine ziegfall1d(nx,ny,nz,nor,norz,na,dtp,jgs,ixcol, &
7596      &  xvt, rhovtzx,                                           &
7597      &  an,dn,ipconc0,t0,t7,cwmasn,cwmasx,       &
7598      &  cwradn,                                   &
7599      &  qxmin,xdnmx,xdnmn,cdx,cno,xdn0,xvmn,xvmx,  &
7600      &  ngs,qx,qxw,cx,xv,vtxbar,xmas,xdn,xdia,vx,alpha,zx,igs,kgs, &
7601      &  rho0,temcg,temg,rhovt,cwnc,cinc,fadvisc,cwdia,cipmas,cnina,cimas, &
7602      &  cnostmp,                     &
7603      &  infdo,ildo,timesetvt)
7605 ! 12.16.2005: .F version use in transitional SWM model
7607 ! 10.10.2003: Added cimn and cimx to setting for cci and cip.
7609 ! TO DO LIST:
7611 ! need to set up values for:
7612 !     :  cipdia,cidia,cwdia,cwmas,vtwbar,
7613 !     :  rho0,temcg,cip,cci
7615 ! and need to put fallspeed values in cwvt etc.
7617       
7618       implicit none
7619       integer ng1
7620       parameter(ng1 = 1)
7621       
7622       integer, intent(in) :: ixcol ! which column to return
7623       integer, intent(in) :: ildo
7624       
7625       integer nx,ny,nz,nor,norz,ngt,jgs,na
7626       real an(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor,na)
7627       real dn(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor)
7628       real t0(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor)
7629       real t7(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor)
7630       real dtp,dtz1
7631       
7632       real :: rhovtzx(nz,nx)
7633       
7634       integer ndebugzf
7635       parameter (ndebugzf = 0)
7637       integer ix,jy,kz,i,j,k,il
7638       integer infdo
7641       real xvt(nz+1,nx,3,lc:lhab) ! 1=mass-weighted, 2=number-weighted
7643       real qxmin(lc:lhab)
7644       real xdn0(lc:lhab)
7645       real xvmn(lc:lhab), xvmx(lc:lhab)
7646       double precision,optional :: timesetvt
7648       integer :: ngs
7649       integer :: ngscnt,mgs,ipconc0
7650 !      parameter ( ngs=200 )
7651       
7652       real ::  qx(ngs,lv:lhab) 
7653       real ::  qxw(ngs,ls:lhab) 
7654       real ::  cx(ngs,lc:lhab) 
7655       real ::  xv(ngs,lc:lhab) 
7656       real ::  vtxbar(ngs,lc:lhab,3) 
7657       real ::  xmas(ngs,lc:lhab) 
7658       real ::  xdn(ngs,lc:lhab) 
7659       real ::  cdxgs(ngs,lc:lhab) 
7660       real ::  xdia(ngs,lc:lhab,3) 
7661       real ::  vx(ngs,li:lhab) 
7662       real ::  alpha(ngs,lc:lhab) 
7663       real ::  zx(ngs,lr:lhab) 
7665       real xdnmx(lc:lhab), xdnmn(lc:lhab)
7666       real :: axx(ngs,lh:lhab), bxx(ngs,lh:lhab)
7667 !      real axh(ngs),bxh(ngs),axhl(ngs),bxhl(ngs)
7670 !   drag coefficients
7672       real cdx(lc:lhab)
7674 ! Fixed intercept values for single moment scheme
7676       real cno(lc:lhab)
7677       
7678       real cwccn0,cwmasn,cwmasx,cwradn
7679 !      real cwc0
7681       integer nxmpb,nzmpb,nxz,numgs,inumgs
7682       integer kstag
7683       parameter (kstag=1)
7685       integer igs(ngs),kgs(ngs)
7686       
7687       real rho0(ngs),temcg(ngs)
7689       real temg(ngs)
7690       
7691       real rhovt(ngs)
7692       
7693       real cwnc(ngs),cinc(ngs)
7694       real fadvisc(ngs),cwdia(ngs),cipmas(ngs)
7695       
7696 !      real cimasn,cimasx,
7697       real :: cnina(ngs),cimas(ngs)
7698       
7699       real :: cnostmp(ngs)
7701 !      real pii
7704 !  general constants for microphysics
7708 ! Miscellaneous
7710       
7711       logical flag
7712       logical ldoliq
7713       
7714     
7715       real chw, qr, z, rd, alp, z1, g1, vr, nrx, tmp
7716       
7717       real vtmax
7718       real xvbarmax
7720       real, parameter ::  c1r=19.0, c2r=0.6, c3r=1.8, c4r=17.0   ! rain
7721       real, parameter ::  c1h=5.5, c2h=0.7, c3h=4.5, c4h=8.5   ! Graupel
7722       real, parameter ::  c1hl=3.7, c2hl=0.3, c3hl=9.0, c4hl=6.5, c5hl=1.0, c6hl=6.5 ! Hail
7724       integer l1, l2
7725       
7726       double precision :: dpt1, dpt2
7729 !-----------------------------------------------------------------------------
7730 ! MPI LOCAL VARIABLES 
7732       integer :: ixb, jyb, kzb
7733       integer :: ixe, jye, kze
7735       logical :: debug_mpi = .false.
7738       if (ndebugzf .gt. 0 ) write(0,*) "ZIEGFALL: ENTERED SUBROUTINE"
7740 ! #####################################################################
7741 ! BEGIN EXECUTABLE
7742 ! #####################################################################
7745 !  constants
7748       ldoliq = .false.
7749       IF ( ls .gt. 1 ) THEN
7750       DO il = ls,lhab
7751         ldoliq = ldoliq .or. ( lliq(il) .gt. 1 )
7752       ENDDO
7753       ENDIF
7754       
7755 !      poo = 1.0e+05
7756 !      cp608 = 0.608
7757 !      cp = 1004.0
7758 !      cv = 717.0
7759 !      dnz00 = 1.225
7760 !      rho00 = 1.225
7761 !      cs = 4.83607122
7762 !      ds = 0.25
7763 !  new values for  cs and ds
7764 !      cs = 12.42
7765 !      ds = 0.42
7766 !      pi = 4.0*atan(1.0)
7767 !      pii = piinv ! 1./pi
7768 !      pid4 = pi/4.0 
7769 !      qccrit = 2.0e-03
7770 !      qscrit = 6.0e-04
7771 !      cwc0 = pii
7772       
7775 !  general constants for microphysics
7777       
7779 !  ci constants in mks units
7781 !      cimasn = 6.88e-13 
7782 !      cimasx = 1.0e-8
7784 !  Set terminal velocities...
7785 !    also set drag coefficients
7787       jy = jgs
7788       nxmpb = ixcol
7789       nzmpb = 1
7790       nxz = 1*nz
7791 !      ngs = nz
7792       numgs = 1
7794       IF ( ildo == 0 ) THEN
7795         l1 = lc
7796         l2 = lhab
7797       ELSE
7798         l1 = ildo
7799         l2 = ildo
7800       ENDIF
7803       do inumgs = 1,numgs
7804        ngscnt = 0
7807        do kz = nzmpb,nz
7808         do ix = ixcol,ixcol
7809         flag = .false.
7811         
7812         DO il = l1,l2
7813           flag =  flag .or. ( an(ix,jy,kz,il)  .gt. qxmin(il) ) 
7814         ENDDO
7816         if ( flag ) then
7817 ! load temp quantities
7819         ngscnt = ngscnt + 1
7820         igs(ngscnt) = ix
7821         kgs(ngscnt) = kz
7822         if ( ngscnt .eq. ngs ) goto 1100
7823         end if
7824         end do !!ix
7825         nxmpb = 1
7826        end do !! kz
7828 !      if ( jy .eq. (ny-jstag) ) iend = 1
7830  1100 continue
7832       if ( ngscnt .eq. 0 ) go to 9998
7834 !  set temporaries for microphysics variables
7839 !  Reconstruct various quantities 
7841       do mgs = 1,ngscnt
7843        rho0(mgs) = dn(igs(mgs),jy,kgs(mgs))
7844        rhovt(mgs) = rhovtzx(kgs(mgs),ixcol) !  Sqrt(rho00/rho0(mgs))
7845        temg(mgs) = t0(igs(mgs),jy,kgs(mgs))
7846        temcg(mgs) = temg(mgs) - tfr
7848         
7850       end do
7852 ! only need fadvisc for 
7853       IF ( lc .gt. 1 .and. (ildo == 0 .or. ildo == lc ) ) then
7854         do mgs = 1,ngscnt
7855          fadvisc(mgs) = advisc0*(416.16/(temg(mgs)+120.0))* &
7856      &   (temg(mgs)/296.0)**(1.5)
7857         end do
7858       ENDIF
7860       IF ( ipconc .eq. 0 ) THEN
7861       do mgs = 1,ngscnt
7862       cnina(mgs) = t7(igs(mgs),jgs,kgs(mgs))
7863       end do
7864       ENDIF
7867       IF ( ildo > 0 ) THEN
7868         vtxbar(:,ildo,:) = 0.0
7869       ELSE
7870         vtxbar(:,:,:) = 0.0
7871       ENDIF
7872       
7873 !      do mgs = 1,ngscnt
7874 !        qx(mgs,lv) = max(an(igs(mgs),jy,kgs(mgs),lv), 0.0) 
7875 !      ENDDO
7876       DO il = l1,l2
7877       do mgs = 1,ngscnt
7878         qx(mgs,il) = max(an(igs(mgs),jy,kgs(mgs),il), 0.0) 
7879       ENDDO
7880       end do
7881       
7882       cnostmp(:) = cno(ls)
7883       IF ( ipconc < 1 .and. lwsm6 .and. (ildo == 0 .or. ildo == ls )) THEN
7884         DO mgs = 1,ngscnt
7885           tmp = Min( 0.0, temcg(mgs) )
7886           cnostmp(mgs) = Min( 2.e8, 2.e6*exp(0.12*tmp) )
7887         ENDDO
7888       ENDIF
7892 !  set concentrations
7894       cx(:,:) = 0.0
7895       
7896       if ( ipconc .ge. 1 .and. li .gt. 1 .and. (ildo == 0 .or. ildo == li ) ) then
7897        do mgs = 1,ngscnt
7898         cx(mgs,li) = Max(an(igs(mgs),jy,kgs(mgs),lni), 0.0)
7899        end do
7900       end if
7901       if ( ipconc .ge. 2 .and. lc .gt. 1 .and. (ildo == 0 .or. ildo == lc ) ) then
7902        do mgs = 1,ngscnt
7903         cx(mgs,lc) = Max(an(igs(mgs),jy,kgs(mgs),lnc), 0.0)
7904 !        cx(mgs,lc) = Min( ccwmx, cx(mgs,lc) )
7905        end do
7906       end if
7907       if ( ipconc .ge. 3 .and. lr .gt. 1 .and. (ildo == 0 .or. ildo == lr ) ) then
7908        do mgs = 1,ngscnt
7909         cx(mgs,lr) = Max(an(igs(mgs),jy,kgs(mgs),lnr), 0.0)
7910 !        IF ( qx(mgs,lr) .le. qxmin(lr) ) THEN
7911 !        ELSE
7912 !          cx(mgs,lr) = Max( 0.0, cx(mgs,lr) )
7913 !        ENDIF
7914        end do
7915       end if
7916       if ( ipconc .ge. 4  .and. ls .gt. 1 .and. (ildo == 0 .or. ildo == ls ) ) then
7917        do mgs = 1,ngscnt
7918         cx(mgs,ls) = Max(an(igs(mgs),jy,kgs(mgs),lns), 0.0)
7919 !        IF ( qx(mgs,ls) .le. qxmin(ls) ) THEN
7920 !        ELSE
7921 !          cx(mgs,ls) = Max( 0.0, cx(mgs,ls) )
7922 !        ENDIF
7923        end do
7924       end if
7926       if ( ipconc .ge. 5  .and. lh .gt. 1 .and. (ildo == 0 .or. ildo == lh ) ) then
7927        do mgs = 1,ngscnt
7929         cx(mgs,lh) = Max(an(igs(mgs),jy,kgs(mgs),lnh), 0.0)
7930 !        IF ( qx(mgs,lh) .le. qxmin(lh) ) THEN
7931 !        ELSE
7932 !          cx(mgs,lh) = Max( 0.0, cx(mgs,lh) )
7933 !        ENDIF
7935        end do
7936       ENDIF
7938       if ( ipconc .ge. 5  .and. lhl .gt. 1 .and. (ildo == 0 .or. ildo == lhl ) ) then
7939        do mgs = 1,ngscnt
7941         cx(mgs,lhl) = Max(an(igs(mgs),jy,kgs(mgs),lnhl), 0.0)
7942 !        IF ( qx(mgs,lhl) .le. qxmin(lhl) ) THEN
7943 !          cx(mgs,lhl) = 0.0
7944 !        ELSEIF ( cx(mgs,lhl) .eq. 0.0 .and. qx(mgs,lhl) .lt. 3.0*qxmin(lhl) ) THEN
7945 !          qx(mgs,lhl) = 0.0
7946 !        ELSE
7947 !          cx(mgs,lhl) = Max( 0.0, cx(mgs,lhl) )
7948 !        ENDIF
7950        end do
7951       end if
7952        
7953       do mgs = 1,ngscnt
7954         xdn(mgs,lc) = xdn0(lc)
7955         xdn(mgs,lr) = xdn0(lr)
7956 !        IF ( ls .gt. 1 .and. lvs .eq. 0 ) xdn(mgs,ls) = xdn0(ls)
7957 !        IF ( lh .gt. 1 .and. lvh .eq. 0 ) xdn(mgs,lh) = xdn0(lh)
7958         IF ( li .gt. 1 )  xdn(mgs,li) = xdn0(li)
7959         IF ( ls .gt. 1 )  xdn(mgs,ls) = xdn0(ls)
7960         IF ( lh .gt. 1 )  xdn(mgs,lh) = xdn0(lh)
7961         IF ( lhl .gt. 1 ) xdn(mgs,lhl) = xdn0(lhl)
7962       end do
7965 ! Set mean particle volume
7967       IF ( ldovol .and. (ildo == 0 .or. ildo >= li ) ) THEN
7968       
7969       vx(:,:) = 0.0
7970       
7971        DO il = l1,l2
7972         
7973         IF ( lvol(il) .ge. 1 ) THEN
7974         
7975           DO mgs = 1,ngscnt
7976             vx(mgs,il) = Max(an(igs(mgs),jy,kgs(mgs),lvol(il)), 0.0)
7977             IF ( vx(mgs,il) .gt. rho0(mgs)*qxmin(il)*1.e-3 .and. qx(mgs,il) .gt. qxmin(il) ) THEN
7978               xdn(mgs,il) = Min( xdnmx(il), Max( xdnmn(il), rho0(mgs)*qx(mgs,il)/vx(mgs,il) ) )
7979             ENDIF
7980           ENDDO
7981           
7982         ENDIF
7983       
7984        ENDDO
7985       
7986       ENDIF
7988       DO il = lg,lhab
7989       DO mgs = 1,ngscnt
7990         alpha(mgs,il) = dnu(il)
7991       ENDDO
7992       ENDDO
7993       
7994       IF ( imurain == 1 ) THEN
7995         alpha(:,lr) = alphar
7996       ELSEIF ( imurain == 3 ) THEN
7997         alpha(:,lr) = xnu(lr)
7998       ENDIF
8001       IF ( ipconc == 5 .and. imydiagalpha > 0 ) THEN
8002         DO mgs = 1,ngscnt
8003           IF ( qx(mgs,lr) .gt. qxmin(lr) .and. cx(mgs,lr) > cxmin ) THEN
8004              xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*cx(mgs,lr))            ! 
8005              xdia(mgs,lr,3) = (xv(mgs,lr)*6.0*cwc1)**(1./3.) 
8006              alpha(mgs,lr) = Min(alphamax, c1r*tanh(c2r*(xdia(mgs,lr,3)*1000. - c3r)) + c4r)
8007           ENDIF
8008           IF ( qx(mgs,lh) .gt. qxmin(lh) .and. cx(mgs,lh) > cxmin ) THEN
8009              xv(mgs,lh) = rho0(mgs)*qx(mgs,lh)/(xdn(mgs,lh)*cx(mgs,lh))            ! 
8010              xdia(mgs,lh,3) = (xv(mgs,lh)*6.*piinv)**(1./3.) ! mwfac*xdia(mgs,lh,1) ! (xv(mgs,lh)*cwc0*6.0)**(1./3.)
8011              alpha(mgs,lh) = Min(alphamax, c1h*tanh(c2h*(xdia(mgs,lh,3)*1000. - c3h)) + c4h)
8012           ENDIF
8013 !        alpha(:,lr) = 0. ! 10.
8014 !        alpha(:,lh) = 0. ! 10.
8015           IF ( lhl > 0 ) THEN
8016           IF ( qx(mgs,lhl) .gt. qxmin(lhl) .and. cx(mgs,lhl) > cxmin ) THEN
8017              xv(mgs,lhl) = rho0(mgs)*qx(mgs,lhl)/(xdn(mgs,lhl)*cx(mgs,lhl))            ! 
8018              xdia(mgs,lhl,3) = (xv(mgs,lhl)*6.*piinv)**(1./3.)
8019              IF ( xdia(mgs,lhl,3) < 0.008 ) THEN
8020                alpha(mgs,lhl) = Min(alphamax, c1hl*tanh(c2hl*(xdia(mgs,lhl,3)*1000. - c3hl)) + c4hl)
8021              ELSE
8022                alpha(mgs,lhl) = Min(alphamax, c5hl*xdia(mgs,lhl,3)*1000. + c6hl)
8023              ENDIF
8024           ENDIF
8025           ENDIF
8026         ENDDO
8027       ENDIF
8031 ! Set 6th moments
8033       IF ( ipconc .ge. 6 .or. lzr > 1) THEN
8034       
8035       zx(:,:) = 0.0
8036       
8037 !      DO il = lr,lhab
8038        DO il = l1,l2
8039         
8040         IF ( lz(il) .ge. 1 ) THEN
8041         
8042           DO mgs = 1,ngscnt
8043             zx(mgs,il) = Max(an(igs(mgs),jy,kgs(mgs),lz(il)), 0.0)
8044           ENDDO
8045           
8046         
8047         ENDIF
8048       
8049        ENDDO
8050       
8051       ENDIF
8052        
8056        
8057 !  Find shape parameter rain
8060      IF ( lz(lr) > 1 .and. (ildo == 0 .or. ildo == lr ) .and. imurain == 3  ) THEN ! { RAIN SHAPE PARAM
8061           il = lr
8062           DO mgs = 1,ngscnt
8063          
8064          IF ( iresetmoments == 1 .or. iresetmoments == il  ) THEN
8065 !         IF (  .false. .and. zx(mgs,lr) <= zxmin ) THEN
8066          IF ( zx(mgs,lr) <= zxmin ) THEN
8067            qx(mgs,lr) = 0.0
8068            cx(mgs,lr) = 0.0
8069            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),lr)
8070            an(igs(mgs),jgs,kgs(mgs),lr) = qx(mgs,lr)
8071            an(igs(mgs),jgs,kgs(mgs),ln(lr)) = cx(mgs,lr)
8072 !         ELSEIF ( zx(mgs,lr) <= 0.0 .and. cx(mgs,lr) > 0.0 .and. qx(mgs,il) .gt. qxmin(il)) THEN
8073 !           write(91,*) 'ZF: overdepletion of Zr: z,c,q = ',zx(mgs,il),cx(mgs,il),qx(mgs,il)
8074          ELSEIF ( cx(mgs,lr) <= cxmin ) THEN
8075            zx(mgs,lr) = 0.0
8076            qx(mgs,lr) = 0.0
8077            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),lr)
8078            an(igs(mgs),jgs,kgs(mgs),lr) = qx(mgs,lr)
8079            an(igs(mgs),jgs,kgs(mgs),lz(lr)) = zx(mgs,lr)
8080          ENDIF
8081          ENDIF
8082          
8083           
8084          
8085          IF ( qx(mgs,lr) .gt. qxmin(lr) ) THEN
8087         xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*Max(1.0e-11,cx(mgs,lr)))
8088         IF ( xv(mgs,lr) .gt. xvmx(lr) ) THEN
8089 !          tmp = cx(mgs,lr)
8090 !          xv(mgs,lr) = xvmx(lr)
8091 !          cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmx(lr)*xdn(mgs,lr))
8092 !          an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
8093 !          IF ( tmp < cx(mgs,il) ) THEN ! breakup
8094 !             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
8095 !!             zx(mgs,lr) = zx(mgs,lr) + g1*(rho0(mgs)/(1000.))**2*( (qx(mgs,il)/tmp)**2 * (tmp-cx(mgs,il)) )
8096 !!             an(igs(mgs),jgs,kgs(mgs),lz(lr)) = zx(mgs,lr)
8097 !          ENDIF
8098         ELSEIF ( xv(mgs,lr) .lt. xvmn(lr) ) THEN
8099           xv(mgs,lr) = xvmn(lr)
8100           cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmn(lr)*xdn(mgs,lr))
8101           an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
8102         ENDIF
8104           IF ( zx(mgs,il) > 0.0 .and. cx(mgs,il) <= 0.0 ) THEN
8105 !  have mass and reflectivity but no concentration, so set concentration, using default alpha
8106             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
8107             z   = zx(mgs,il)
8108             qr  = qx(mgs,il)
8110             cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(z*1000.*1000)
8111             an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
8113            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) > cxmin ) THEN
8114 !  have mass and concentration but no reflectivity, so set reflectivity, using default alpha
8115             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
8116             chw = cx(mgs,il)
8117             qr  = qx(mgs,il)
8119 !            xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(1000.*Max(1.0e-9,cx(mgs,lr)))
8120 !            vr = xv(mgs,lr)
8122 !             z  = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/((alpha(mgs,lr)+1.0)*pi**2)
8123 !             zx(mgs,il) = z
8124 !             an(igs(mgs),jy,kgs(mgs),lz(il)) = z
8126             zx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(xdn(mgs,lr)**2*chw)
8127             an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8129            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) <= 0.0 ) THEN
8130 !   How did this happen?
8131          ! set values according to dBZ of -10, or Z = 0.1
8132 !              write(91,*) 'alpha = ',alpha(mgs,il)
8133              IF ( qx(mgs,il) < 1.e-8 ) THEN
8134              qx(mgs,il) = 0.0
8135              an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
8136              an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
8137              ELSE
8138 !              0.1 = 1.e18*0.224*an(ix,jy,kz,lzh)*(hwdn/rwdn)**2
8139                zx(mgs,il) = 1.e-19/0.224*(xdn0(lr)/xdn0(il))**2
8140                an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8141                
8142                g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
8143                z   = zx(mgs,il)
8144                qr  = qx(mgs,il)
8145                cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(z*1000.*1000)
8146                an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
8147              ENDIF
8148           ENDIF
8149           
8150           IF ( zx(mgs,lr) > 0.0 ) THEN
8151             xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(1000.*Max(1.0e-9,cx(mgs,lr)))
8152             vr = xv(mgs,lr)
8153 !            z = 36.*(alpha(kz)+2.0)*a(ix,jy,kz,lnr)*vr**2/((alpha(kz)+1.0)*pi**2)
8154            qr = qx(mgs,lr)
8155            nrx = cx(mgs,lr)
8156            z = zx(mgs,lr)
8158 !           xv = (db(1,kz)*a(1,1,kz,lr))**2/(a(1,1,kz,lnr))
8159 !           rd = z*(pi/6.*1000.)**2/xv
8161 ! determine shape parameter alpha by iteration
8162            IF ( z .gt. 0.0 ) THEN
8163 !           alpha(mgs,lr) = 3.
8164            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
8165            DO i = 1,20
8166 !            IF ( 100.*Abs(alp - alpha(mgs,lr))/Abs(alpha(mgs,lr)) .lt. 1. ) EXIT
8167             IF ( Abs(alp - alpha(mgs,lr)) .lt. 0.01 ) EXIT
8168              alpha(mgs,lr) = Max( rnumin, Min( rnumax, alp ) )
8169            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
8170 !           write(0,*) 'i,alp = ',i,alp
8171              alp = Max( rnumin, Min( rnumax, alp ) )
8172            ENDDO
8173 !           write(0,*) 'kz, alp, alpha(kz) = ',kz,alp,alpha(mgs,lr),qr*1000,z*1.e18,vr,nrx
8176 ! check for artificial breakup (rain larger than allowed max size)
8177         IF (  xv(mgs,il) .gt. xvmx(il) ) THEN
8178           tmp = cx(mgs,il)
8179           xv(mgs,il) = Min( xvmx(il), Max( xvmn(il),xv(mgs,il) ) )
8180           xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
8181           cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
8182           IF ( tmp < cx(mgs,il) ) THEN ! breakup
8184             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
8185             zx(mgs,il) = zx(mgs,il) + g1*(rho0(mgs)/xdn(mgs,il))**2*( (qx(mgs,il)/tmp)**2 * (tmp-cx(mgs,il)) )
8186             an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8188            vr = xv(mgs,lr)
8189            qr = qx(mgs,lr)
8190            nrx = cx(mgs,lr)
8191            z = zx(mgs,lr)
8194 ! determine shape parameter alpha by iteration
8195            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
8196            DO i = 1,20
8197             IF ( Abs(alp - alpha(mgs,lr)) .lt. 0.01 ) EXIT
8198              alpha(mgs,lr) = Max( rnumin, Min( rnumax, alp ) )
8199            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
8200              alp = Max( rnumin, Min( rnumax, alp ) )
8201            ENDDO
8203             
8204           ENDIF
8205         ENDIF
8208 ! Check whether the shape parameter is at or less than the minimum, and if it is, reset the 
8209 ! concentration or reflectivity to match (prevents reflectivity from being out of balance with Q and N)
8211 !           IF ( alpha(mgs,il) <= rnumin .or. alp == rnumin .or. alp == rnumax ) THEN
8212            IF ( .true. .and. (alpha(mgs,il) <= rnumin .or. alp == rnumin .or. alp == rnumax) ) THEN
8214             IF ( rescale_high_alpha .and. alp >= rnumax - 0.01  ) THEN  ! reset c at high alpha to prevent growth in Z
8215               g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
8216               cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z*(1./(xdn(mgs,il)))**2
8217               an(igs(mgs),jy,kgs(mgs),ln(il)) = cx(mgs,il)
8218             
8219             ELSEIF ( rescale_low_alphar .and. alp <= rnumin ) THEN
8221              z  = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/((alpha(mgs,lr)+1.0)*pi**2)
8222              zx(mgs,il) = z
8223              an(igs(mgs),jy,kgs(mgs),lz(il)) = z
8224              
8225              ENDIF
8226            ENDIF
8228            ENDIF
8229           ENDIF
8230            
8231           ELSE
8232           
8233            zx(mgs,lr) = 0.0
8234            cx(mgs,lr) = 0.0
8235            an(igs(mgs),jgs,kgs(mgs),ln(lr)) = cx(mgs,lr)
8236            an(igs(mgs),jgs,kgs(mgs),lz(lr)) = zx(mgs,lr)
8237           
8238           ENDIF
8239           
8240           ENDDO
8241         ENDIF ! }
8242         
8244       IF ( ipconc .ge. 6 ) THEN
8246 !  Find shape parameters for graupel,hail
8248         DO il = lr,lhab
8249         
8250         IF ( lz(il) .gt. 1 .and. (ildo == 0 .or. ildo == il ) .and. ( .not. ( il == lr .and. imurain == 3 )) ) THEN
8251         
8252         DO mgs = 1,ngscnt
8254          IF ( iresetmoments == 1 .or. iresetmoments == il  .or. iresetmoments == -1 ) THEN
8255          IF ( zx(mgs,il) <= zxmin ) THEN !  .and. qx(mgs,il) > 0.05e-3 ) THEN
8256            qx(mgs,il) = 0.0
8257            cx(mgs,il) = 0.0
8258            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
8259            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
8260            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
8261          ELSEIF ( iresetmoments == -1 .and. qx(mgs,il) < qxmin(il) ) THEN
8262            zx(mgs,il) = 0.0
8263            cx(mgs,il) = 0.0
8264            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
8266            qx(mgs,il) = 0.0
8267            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
8268            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
8269            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8270          
8271          ELSEIF ( cx(mgs,il) <= cxmin .and. iresetmoments /= -1 ) THEN !  .and. qx(mgs,il) > 0.05e-3  ) THEN
8272 !!            write(91,*) 'cx=0; qx,zx = ',1000.*qx(mgs,il),1.e18*zx(mgs,il)
8273            zx(mgs,il) = 0.0
8274            qx(mgs,il) = 0.0
8275            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
8276            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
8277            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8278          ENDIF
8279          ENDIF
8281          IF (  zx(mgs,il) <= zxmin .and. cx(mgs,il) <= cxmin ) THEN
8282            zx(mgs,il) = 0.0
8283            cx(mgs,il) = 0.0
8284            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
8285            qx(mgs,il) = 0.0
8286            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
8287            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
8288            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8289          ENDIF
8291          IF ( qx(mgs,il) .gt. qxmin(il) ) THEN
8293         xv(mgs,il) = rho0(mgs)*qx(mgs,il)/(xdn(mgs,il)*Max(1.0e-9,cx(mgs,il)))
8294         xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
8296         IF ( xv(mgs,il) .lt. xvmn(il)  ) THEN
8297 !          tmp = cx(mgs,il)
8298           xv(mgs,il) = Min( xvmx(il), Max( xvmn(il),xv(mgs,il) ) )
8299           xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
8300           cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
8301 !          IF ( tmp < cx(mgs,il) ) THEN ! breakup
8302 !            g1 = 36.*(6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
8303 !     &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il))*pi**2)
8304 !             zx(mgs,il) = zx(mgs,il) + g1*(rho0(mgs)/xdn(mgs,il))**2*( (qx(mgs,il)/tmp)**2 * (tmp-cx(mgs,il)) )
8305 !             an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8306 !            
8307 !          ENDIF
8308         ENDIF
8310           IF ( zx(mgs,il) > 0.0 .and. cx(mgs,il) <= 0.0 ) THEN
8311 !  have mass and reflectivity but no concentration, so set concentration, using default alpha
8312             g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
8313      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
8314             z   = zx(mgs,il)
8315             qr  = qx(mgs,il)
8316             cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(6*qr)**2/(z*(pi*xdn(mgs,il))**2)
8317             an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
8319            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) > cxmin ) THEN
8320 !  have mass and concentration but no reflectivity, so set reflectivity, using default alpha
8321             g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
8322      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
8323             chw = cx(mgs,il)
8324             qr  = qx(mgs,il)
8325 !            zx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/chw
8326             zx(mgs,il) = Min(zxmin*1.1, g1*dn(igs(mgs),jy,kgs(mgs))**2*(6*qr)**2/(chw*(pi*xdn(mgs,il))**2) )
8327             an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8328            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) <= 0.0 ) THEN
8329 !   How did this happen?
8330 !              write(91,*) 'ziegfall: something screwy with moments: il = ',il
8331 !              write(91,*) 'q,n,z = ', 1.e3*qx(mgs,il),cx(mgs,il),zx(mgs,il)
8332 !              write(91,*) 'alpha = ',alpha(mgs,il)
8334              IF ( qx(mgs,il) < 1.e-8 ) THEN
8335              qx(mgs,il) = 0.0
8336              an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
8337              an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
8338              ELSE
8339 !              write(0,*) 'alpha = ',alpha(mgs,il)
8340          ! set values according to dBZ of -10
8341 !              0.1 = 1.e18*0.224*an(ix,jy,kz,lzh)*(hwdn/rwdn)**2
8342                zx(mgs,il) = 1.e-19/0.224*(xdn0(lr)/xdn0(il))**2
8343                an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8344                
8345                g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
8346      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
8347                z   = zx(mgs,il)
8348                qr  = qx(mgs,il)
8349                cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(6*qr)**2/(z*(pi*xdn(mgs,il))**2)
8350                an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
8351             ENDIF
8352           ENDIF
8353          ENDIF
8355         IF ( qx(mgs,il) .gt. qxmin(il) .and. cx(mgs,il) .gt. cxmin ) THEN
8356           chw = cx(mgs,il)
8357           qr  = qx(mgs,il)
8358           z   = zx(mgs,il)
8360           IF ( zx(mgs,il) .gt. 0. ) THEN
8361            
8362 !            rd = z*(pi/6.*1000.)**2*chw/(0.224*(dn(igs(mgs),jy,kgs(mgs))*qr)**2)
8363             rd = z*(pi/6.*xdn(mgs,il))**2*chw/((dn(igs(mgs),jy,kgs(mgs))*qr)**2)
8365            alp = (6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/ &
8366      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rd) - 1.0
8367            DO i = 1,10
8368             IF ( Abs(alp - alpha(mgs,il)) .lt. 0.01 ) EXIT
8369              alpha(mgs,il) = Max( alphamin, Min( alphamax, alp ) )
8370              alp = (6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/ &
8371      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rd) - 1.0
8372 !           write(0,*) 'i,alp = ',i,alp
8373              alp = Max( alphamin, Min( alphamax, alp ) )
8374            ENDDO
8378 ! check for artificial breakup (graupel/hail larger than allowed max size)
8379         
8380         IF ( imaxdiaopt == 1 ) THEN
8381           xvbarmax = xvmx(il) 
8382         ELSEIF ( imaxdiaopt == 2 ) THEN ! test against maximum mass diameter
8383           xvbarmax = xvmx(il) /((3. + alpha(mgs,il))**3/((3. + alpha(mgs,il))*(2. + alpha(mgs,il))*(1. + alpha(mgs,il))))
8384         ELSEIF ( imaxdiaopt == 3 ) THEN ! test against mass-weighted diameter
8385           xvbarmax = xvmx(il) /((4. + alpha(mgs,il))**3/((3. + alpha(mgs,il))*(2. + alpha(mgs,il))*(1. + alpha(mgs,il))))
8386         ENDIF
8387         
8388         IF (  xv(mgs,il) .gt. xvbarmax ) THEN
8389           tmp = cx(mgs,il)
8390           xv(mgs,il) = Min( xvbarmax, Max( xvmn(il),xv(mgs,il) ) )
8391           xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
8392           cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
8393           IF ( tmp < cx(mgs,il) ) THEN ! breakup
8394             g1 = 36.*(6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
8395      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il))*pi**2)
8396              zx(mgs,il) = zx(mgs,il) + g1*(rho0(mgs)/xdn(mgs,il))**2*( (qx(mgs,il)/tmp)**2 * (tmp-cx(mgs,il)) )
8397              an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
8399           chw = cx(mgs,il)
8400           qr  = qx(mgs,il)
8401           z   = zx(mgs,il)
8403             rd = z*(pi/6.*xdn(mgs,il))**2*chw/((rho0(mgs)*qr)**2)
8404             alp = (6.0+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
8405      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rd) - 1.0
8406            DO i = 1,10
8407              IF ( Abs(alp - alpha(mgs,il)) .lt. 0.01 ) EXIT
8408              alpha(mgs,il) = Max( alphamin, Min( alphamax, alp ) )
8409              alp = (6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
8410      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rd) - 1.0
8411              alp = Max( alphamin, Min( alphamax, alp ) )
8412            ENDDO
8414             
8415           ENDIF
8416         ENDIF
8417            
8419 ! Check whether the shape parameter is at or less than the minimum, and if it is, reset the 
8420 ! concentration or reflectivity to match (prevents reflectivity from being out of balance with Q and N)
8422            IF ( (rescale_low_alpha .or. rescale_high_alpha ) .and.  &
8423      &        ( alpha(mgs,il) <= alphamin .or. alp == alphamin .or. alp == alphamax ) ) THEN
8425              g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
8426      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
8428             IF ( rescale_high_alpha .and. alp >= alphamax - 0.01  ) THEN  ! reset c at high alpha to prevent growth in Z
8429               cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z*(6./(pi*xdn(mgs,il)))**2
8430               an(igs(mgs),jy,kgs(mgs),ln(il)) = cx(mgs,il)
8431             
8432             ELSEIF ( rescale_low_alpha .and. alp <= alphamin .and. .not. (il == lh .and. icvhl2h > 0 ) ) THEN
8434 !!             z1 = g1*dn(igs(mgs),jy,kgs(mgs))**2*( 0.224*qr)*qr/chw
8435              z1 = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/chw
8436              z  = z1*(6./(pi*xdn(mgs,il)))**2
8437              zx(mgs,il) = z
8438              an(igs(mgs),jy,kgs(mgs),lz(il)) = z
8439             ENDIF
8440            ENDIF
8441           ELSE
8442           ENDIF
8443         ENDIF
8444         ENDDO ! mgs
8445         
8446         ENDIF ! lz(il) .gt. 1
8447         
8448         ENDDO ! il
8450 !      CALL cld_cpu('Z-MOMENT-ZFAll')  
8451           
8452       ENDIF
8454       IF ( lzhl > 1 ) THEN
8455         IF ( lhl .gt. 1 ) THEN
8456         
8457         ENDIF
8458       ENDIF
8463 !  Set density
8465       if (ndebugzf .gt. 0 ) write(0,*)  'ZIEGFALL: call setvtz'
8467       
8468       call setvtz(ngscnt,qx,qxmin,qxw,cx,rho0,rhovt,xdia,cno,cnostmp,   &
8469      &                 xmas,vtxbar,xdn,xvmn,xvmx,xv,cdx,cdxgs,        &
8470      &                 ipconc,ndebugzf,ngs,nz,kgs,fadvisc, &
8471      &                 cwmasn,cwmasx,cwradn,cnina,cimn,cimx,    &
8472      &                 itype1,itype2,temcg,infdo,alpha,ildo,axx,bxx)
8473 !     &                 itype1,itype2,temcg,infdo,alpha,ildo,axh,bxh,axhl,bxhl)
8478 ! put fall speeds into the x-z arrays
8480       DO il = l1,l2
8481       do mgs = 1,ngscnt
8482        
8483        vtmax = 150.0
8485        
8486        IF ( vtxbar(mgs,il,2) .gt. vtxbar(mgs,il,1)  .or. &
8487      &      ( vtxbar(mgs,il,1) .gt. vtxbar(mgs,il,3) .and. vtxbar(mgs,il,3) > 0.0) ) THEN
8488           
8489           
8490 !          IF ( qx(mgs,il) > 1.e-4 .and.  &
8491 !     &        .not. ( il == lr .and. 1.e3*xdia(mgs,il,3) > 5.0 ) ) THEN
8492 !          write(0,*) 'infdo,mgs = ',infdo,lzr,mgs
8493 !          write(0,*) 'Moment problem with vtxbar for il at i,j,k = ',il,igs(mgs),jy,kgs(mgs)
8494 !          write(0,*) 'nx,ny,nz,ng = ',nx,ny,nz,nor
8495 !          write(0,*) 'cwmasn,cwmasx = ',cwmasn,cwmasx
8496 !          write(0,*) 'vt1,2,3 = ',vtxbar(mgs,il,1),vtxbar(mgs,il,2),vtxbar(mgs,il,3)
8497 !          write(0,*) 'q,n,d = ', 1.e3*qx(mgs,il),cx(mgs,il),1.e3*xdia(mgs,il,3)
8498 !          IF ( il .ge. lr  .and. lz(il) > 1 ) write(0,*) 'z = ', zx(mgs,il)
8499 !          IF ( il .ge. lg .or. il == lr ) THEN
8500 !            write(0,*) 'alpha = ',alpha(mgs,il)
8501 !          ENDIF
8502 !          ENDIF
8503           
8504           vtxbar(mgs,il,1) = Max( vtxbar(mgs,il,1), vtxbar(mgs,il,2) )
8505           vtxbar(mgs,il,3) = Max( vtxbar(mgs,il,3), vtxbar(mgs,il,1) )
8506           
8507        ENDIF
8509        
8510        IF ( vtxbar(mgs,il,1) .gt. vtmax .or. vtxbar(mgs,il,2) .gt. vtmax .or. &
8511      &      vtxbar(mgs,il,3) .gt. vtmax ) THEN
8512        
8513 !        IF ( ndebugzf >= 0 .and.  1.e3*qx(mgs,il) > 0.1 ) THEN
8514 !          write(0,*) 'infdo = ',infdo
8515 !          write(0,*) 'Problem with vtxbar for il at i,j,k = ',il,igs(mgs),jy,kgs(mgs)
8516 !          write(0,*) 'nx,ny,nz,ng = ',nx,ny,nz,nor
8517 !          write(0,*) 'cwmasn,cwmasx = ',cwmasn,cwmasx
8518 !          write(0,*) 'vt1,2,3 = ',vtxbar(mgs,il,1),vtxbar(mgs,il,2),vtxbar(mgs,il,3)
8519 !          write(0,*) 'q,n,d = ', 1.e3*qx(mgs,il),cx(mgs,il),1.e3*xdia(mgs,il,3)
8520 !          IF ( il .ge. lr  .and. lz(il) > 1 ) write(0,*) 'z = ', zx(mgs,il)
8521 !          IF ( il .ge. lg ) THEN
8522 !            write(0,*) 'alpha = ',alpha(mgs,il)
8523 !          ENDIF
8524 !        ENDIF
8525         vtxbar(mgs,il,1) = Min(vtmax,vtxbar(mgs,il,1) )
8526         vtxbar(mgs,il,2) = Min(vtmax,vtxbar(mgs,il,2) )
8527         vtxbar(mgs,il,3) = Min(vtmax,vtxbar(mgs,il,3) )
8528         
8529 !        call commasmpi_abort()
8530        ENDIF
8533        xvt(kgs(mgs),igs(mgs),1,il) = vtxbar(mgs,il,1)
8534        xvt(kgs(mgs),igs(mgs),2,il) = vtxbar(mgs,il,2)
8535        IF ( infdo .ge. 2 ) THEN
8536        xvt(kgs(mgs),igs(mgs),3,il) = vtxbar(mgs,il,3)
8537        ELSE
8538        xvt(kgs(mgs),igs(mgs),3,il) = 0.0
8539        ENDIF
8541 !       xvt(kgs(mgs),igs(mgs),2,il) = xvt(kgs(mgs),igs(mgs),1,il)
8543       enddo
8544       ENDDO
8547       if (ndebugzf .gt. 0 ) write(0,*)  'ZIEGFALL: COPIED FALL SPEEDS'
8551  9998 continue
8553       if (ndebugzf .gt. 0 ) write(0,*)  'ZIEGFALL: DONE WITH LOOP'
8555       if ( kz .gt. nz-1 ) then
8556         go to 1200
8557       else
8558         nzmpb = kz 
8559       end if
8561       if (ndebugzf .gt. 0 ) write(0,*) 'ZIEGFALL: SET NZMPB'
8563       end do !! inumgs
8565       if (ndebugzf .gt. 0 ) write(0,*) 'ZIEGFALL: SET NXMPB'
8567  1200 continue
8570 !       ENDDO ! ix
8571 !      ENDDO ! kz
8574       if (ndebugzf .gt. 0 ) write(0,*) "ZIEGFALL: EXITING SUBROUTINE"
8577       RETURN
8578       END subroutine ziegfall1d
8580 ! #####################################################################
8581 ! #####################################################################
8584 ! #####################################################################
8585 ! #####################################################################
8587 ! ##############################################################################
8588       subroutine radardd02(nx,ny,nz,nor,na,an,temk,         &
8589      &    dbz,db,nzdbz,cnoh0t,hwdn1t,ipconc,ke_diag, iunit)
8591 ! 11.13.2005: Changed values of indices for reordering of lip
8593 ! 07.13.2005: Fixed an error where cnoh was being used for graupel and frozen drops
8595 ! 01.24.2005: add ice crystal reflectivity using parameterization of
8596 !             Heymsfield (JAS, 1977).  Could also try Ferrier for this, too.
8598 !  09.28.2002 Test alterations for dry ice following Ferrier (1994)
8599 !      for equivalent melted diameter reflectivity.
8600 !      Converted to Fortran by ERM.
8601 !      
8602 !Date: Tue, 21 Nov 2000 10:13:36 -0600 (CST)
8603 !From: Matthew Gilmore <gilmore@hesston.met.tamu.edu>
8605 !PRO RF_SPEC ; Computes Radar Reflectivity
8606 !COMMON MAINB, data, x1d, y1d, z1d, iconst, rconst, labels, nx, ny, nz, dshft
8608 !;MODIFICATION HISTORY
8609 !; 5/99  -Svelta Veleva introduces variable dielf (const_ki_x) as a (weak)
8610 !;   function of density.  This leads to slight modification of dielf such
8611 !;   that the snow reflectivity is slightly increased - not a big effect.
8612 !;   This is believed to be more accurate than assuming the dielectric
8613 !;   constant for snow is the same as for hail in previous versions.
8615 !;On 6/13/99 I added the VIL computation (k=0 in vil array)
8616 !;On 6/15/99 I removed the number concentration dependencies as a function
8617 !;           of temperature (only use for ferrier!)
8618 !;On 6/15/99 I added the Composite reflectivity (k=1 in VIL array)
8619 !;On 6/15/99 I added the Severe Hail Index computation (k=2 in vil array)
8621 !; 6/99 - Veleva and Seo argue that since graupel is more similar to
8622 !;   snow (in number conc and size density) than it is to hail, we
8623 !;   should not weight wetted graupel with the .95 exponent correction
8624 !;   factor as in the case of hail.  An if-statement checks the size
8625 !;   density for wet hail/graupel and treats them appropriately.
8627 !; 6/22/99 - Added function to compute height of max rf and 40 dbz echo top
8628 !;           Also added vilqr which is the model vertical integrated liquid only
8629 !;           using qr.  Will need to check...does not seem consistent with vilZ
8633       implicit none
8634       
8635       character(LEN=15), parameter :: microp = 'ZVD'
8636       integer nx,ny,nz,nor,na,ngt
8637       integer nzdbz    !  how many levels actually to process
8638       
8639       integer ng1,n10
8640       integer iunit
8641       integer, parameter :: printyn = 0
8643       parameter( ng1 = 1 )
8644       
8645       real cnoh0t,hwdn1t
8646       integer ke_diag
8647       integer ipconc
8648       real vr
8651       integer imapz,mzdist
8652       
8653       integer vzflag
8654       integer, parameter :: norz = 3
8655       real an(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor,na)
8656       real db(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor)  ! air density
8657 !      real gt(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor,ngt)
8658       real temk(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor)  ! air temperature (kelvin)
8659       real dbz(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-nor+ng1:nz+nor)   ! reflectivity
8660       real gz(-nor+1:nz+nor) ! ,z1d(-nor+1:nz+nor,4)
8661       
8662 !      real g,rgas,eta,inveta
8663       real cr1, cr2 ,  hwdnsq,swdnsq
8664       real rwdnsq, dhmin, qrmin, qsmin, qhmin, qhlmin, tfr, tfrh, zrc
8665       real reflectmin,  kw_sq
8666       real const_ki_sn, const_ki_h, ki_sq_sn
8667       real ki_sq_h, dielf_sn, dielf_h
8668       real pi
8669       logical ltest
8671 !  Other data arrays
8672        real gtmp     (nx,nz)
8673        real dtmp     (nx,nz)
8674        real tmp
8676        real*8 dtmps, dtmpr, dtmph, dtmphl, g1, zx, ze, x
8678        integer i,j,k,ix,jy,kz,ihcnt
8680         real*8 xcnoh, xcnos, dadh, dads, zhdryc, zsdryc, zhwetc,zswetc
8681         real*8 dadr
8682         real dbzmax,dbzmin
8683         parameter ( dbzmin = 0 )
8685       real cnow,cnoi,cnoip,cnoir,cnor,cnos
8686       real cnogl,cnogm,cnogh,cnof,cnoh,cnohl
8688       real swdn, rwdn ,hwdn,gldn,gmdn,ghdn,fwdn,hldn
8689       real swdn0
8691       real rwdnmx,cwdnmx,cidnmx,xidnmx,swdnmx,gldnmx,gmdnmx
8692       real ghdnmx,fwdnmx,hwdnmx,hldnmx
8693       real rwdnmn,cwdnmn,cidnmn,xidnmn,swdnmn,gldnmn,gmdnmn
8694       real ghdnmn,fwdnmn,hwdnmn,hldnmn
8696       real gldnsq,gmdnsq,ghdnsq,fwdnsq,hldnsq
8698       real dadgl,dadgm,dadgh,dadhl,dadf
8699       real zgldryc,zglwetc,zgmdryc, zgmwetc,zghdryc,zghwetc
8700       real zhldryc,zhlwetc,zfdryc,zfwetc
8702       real dielf_gl,dielf_gm,dielf_gh,dielf_hl,dielf_fw
8703       
8704       integer imx,jmx,kmx
8705       
8706       real swdia,gldia,gmdia,ghdia,fwdia,hwdia,hldia
8707       
8708       real csw,cgl,cgm,cgh,cfw,chw,chl
8709       real xvs,xvgl,xvgm,xvgh,xvf,xvh,xvhl
8710       
8711       real cwc0
8712       integer izieg
8713       integer ice10
8714       real rhos
8715       parameter ( rhos = 0.1 )
8716       
8717       real qxw,qxw1    ! temp value for liquid water on ice mixing ratio
8718       real :: dnsnow
8719       real qh
8721       real, parameter :: cwmasn = 5.23e-13   ! minimum mass, defined by radius of 5.0e-6
8722       real, parameter :: cwmasx = 5.25e-10   ! maximum mass, defined by radius of 50.0e-6
8723       real, parameter :: cwradn = 5.0e-6     ! minimum radius
8725       real cwnccn(nz)
8726       
8727       real :: vzsnow, vzrain, vzgraupel, vzhail
8728       real :: ksq
8729       real :: dtp
8732 ! #########################################################################      
8734       vzflag = 0
8735       
8736       izieg = 0
8737       ice10 = 0
8738 !      g=9.806                 ! g: gravity constant
8739 !      rgas=287.04             ! rgas: gas constant for dry air
8740 !      rcp=rgas/cp             ! rcp: gamma constant
8741 !      eta=0.622
8742 !      inveta = 1./eta
8743 !      rcpinv = 1./rcp
8744 !      cpr=cp/rgas
8745 !      cvr=cv/rgas
8746       pi = 4.0*ATan(1.)
8747       cwc0 = piinv ! 1./pi ! 6.0/pi
8748       
8749       cnoh = cnoh0t
8750       hwdn = hwdn1t
8752       rwdn = 1000.0
8753       swdn = 100.0
8755       qrmin = 1.0e-05
8756       qsmin = 1.0e-06
8757       qhmin = 1.0e-05
8760 !  default slope intercepts
8762       cnow  = 1.0e+08
8763       cnoi  = 1.0e+08
8764       cnoip = 1.0e+08 
8765       cnoir = 1.0e+08 
8766       cnor  = 8.0e+06 
8767       cnos  = 8.0e+06 
8768       cnogl = 4.0e+05 
8769       cnogm = 4.0e+05 
8770       cnogh = 4.0e+05 
8771       cnof  = 4.0e+05
8772       cnohl = 1.0e+03
8775       imx = 1
8776       jmx = 1
8777       kmx = 1
8778       i = 1
8781        IF ( microp(1:4) .eq. 'ZIEG' ) THEN !  na .ge. 14 .and. ipconc .ge. 3 ) THEN 
8783 !        write(0,*)  'Set reflectivity for ZIEG'
8784          izieg = 1
8786          hwdn = hwdn1t ! 500.
8789          cnor  = cno(lr)
8790          cnos  = cno(ls)
8791          cnoh  = cno(lh)
8792          qrmin = qxmin(lr)
8793          qsmin = qxmin(ls)
8794          qhmin = qxmin(lh)
8795          IF ( lhl .gt. 1 ) THEN
8796             cnohl  = cno(lhl)
8797             qhlmin = qxmin(lhl)
8798          ENDIF
8800        ELSEIF ( microp(1:3) .eq. 'ZVD' ) THEN !  na .ge. 14 .and. ipconc .ge. 3 ) THEN 
8802          izieg = 1
8803          
8804          swdn0 = swdn
8806          cnor  = cno(lr)
8807          cnos  = cno(ls)
8808          cnoh  = cno(lh)
8809          
8810          qrmin = qxmin(lr)
8811          qsmin = qxmin(ls)
8812          qhmin = qxmin(lh)
8813          IF ( lhl .gt. 1 ) THEN
8814             cnohl  = cno(lhl)
8815             qhlmin = qxmin(lhl)
8816          ENDIF
8817 !         write(*,*) 'radardbz: ',db(1,1,1),temk(1,1,1),an(1,1,1,lr),an(1,1,1,ls),an(1,1,1,lh)
8820         ENDIF
8823 !      cdx(lr) = 0.60
8824 !      
8825 !      IF ( lh > 1 ) THEN
8826 !      cdx(lh) = 0.8 ! 1.0 ! 0.45
8827 !      cdx(ls) = 2.00
8828 !      ENDIF
8830 !      IF ( lhl .gt. 1 ) cdx(lhl) = 0.45
8832 !      xvmn(lc) = xvcmn
8833 !      xvmn(lr) = xvrmn
8835 !      xvmx(lc) = xvcmx
8836 !      xvmx(lr) = xvrmx
8838 !      IF ( lh > 1 ) THEN
8839 !      xvmn(ls) = xvsmn
8840 !      xvmn(lh) = xvhmn
8841 !      xvmx(ls) = xvsmx
8842 !      xvmx(lh) = xvhmx
8843 !      ENDIF
8845 !      IF ( lhl .gt. 1 ) THEN
8846 !      xvmn(lhl) = xvhlmn
8847 !      xvmx(lhl) = xvhlmx
8848 !      ENDIF
8850 !      xdnmx(lr) = 1000.0
8851 !      xdnmx(lc) = 1000.0
8852 !      IF ( lh > 1 ) THEN
8853 !      xdnmx(li) =  917.0
8854 !      xdnmx(ls) =  300.0
8855 !      xdnmx(lh) =  900.0
8856 !      ENDIF
8857 !      IF ( lhl .gt. 1 ) xdnmx(lhl) = 900.0
8859 !      xdnmn(:) = 900.0
8860 !      
8861 !      xdnmn(lr) = 1000.0
8862 !      xdnmn(lc) = 1000.0
8863 !      IF ( lh > 1 ) THEN
8864 !      xdnmn(li) =  100.0
8865 !      xdnmn(ls) =  100.0
8866 !      xdnmn(lh) =  hdnmn
8867 !      ENDIF
8868 !      IF ( lhl .gt. 1 ) xdnmn(lhl) = 500.0
8870 !      xdn0(:) = 900.0
8871 !      
8872 !      xdn0(lc) = 1000.0
8873 !      xdn0(lr) = 1000.0
8874 !      IF ( lh > 1 ) THEN
8875 !      xdn0(li) = 900.0
8876 !      xdn0(ls) = 100.0 ! 100.0
8877 !      xdn0(lh) = hwdn1t ! (0.5)*(xdnmn(lh)+xdnmx(lh))
8878 !      ENDIF
8879 !      IF ( lhl .gt. 1 ) xdn0(lhl) = 800.0
8882 !  slope intercepts
8884 !      cnow  = 1.0e+08
8885 !      cnoi  = 1.0e+08
8886 !      cnoip = 1.0e+08 
8887 !      cnoir = 1.0e+08 
8888 !      cnor  = 8.0e+06 
8889 !      cnos  = 8.0e+06 
8890 !      cnogl = 4.0e+05 
8891 !      cnogm = 4.0e+05 
8892 !      cnogh = 4.0e+05 
8893 !      cnof  = 4.0e+05
8894 !c      cnoh  = 4.0e+04
8895 !      cnohl = 1.0e+03
8898 !  density maximums and minimums
8900       rwdnmx = 1000.0
8901       cwdnmx = 1000.0
8902       cidnmx =  917.0
8903       xidnmx =  917.0
8904       swdnmx =  200.0
8905       gldnmx =  400.0
8906       gmdnmx =  600.0
8907       ghdnmx =  800.0
8908       fwdnmx =  900.0
8909       hwdnmx =  900.0
8910       hldnmx =  900.0
8912       rwdnmn = 1000.0
8913       cwdnmn = 1000.0
8914       xidnmn =  001.0
8915       cidnmn =  001.0
8916       swdnmn =  001.0
8917       gldnmn =  200.0
8918       gmdnmn =  400.0
8919       ghdnmn =  600.0
8920       fwdnmn =  700.0
8921       hwdnmn =  700.0
8922       hldnmn =  900.0
8924       
8925       gldn = (0.5)*(gldnmn+gldnmx)  ! 300.
8926       gmdn = (0.5)*(gmdnmn+gmdnmx)  ! 500.
8927       ghdn = (0.5)*(ghdnmn+ghdnmx)  ! 700.
8928       fwdn = (0.5)*(fwdnmn+fwdnmx)  ! 800.
8929       hldn = (0.5)*(hldnmn+hldnmx)  ! 900.
8932       cr1  = 7.2e+20
8933       cr2  = 7.295e+19
8934       hwdnsq = hwdn**2
8935       swdnsq = swdn**2
8936       rwdnsq = rwdn**2
8938       gldnsq = gldn**2
8939       gmdnsq = gmdn**2
8940       ghdnsq = ghdn**2
8941       fwdnsq = fwdn**2
8942       hldnsq = hldn**2
8943       
8944       dhmin = 0.005
8945       tfr   = 273.16
8946       tfrh  = tfr - 8.0
8947       zrc   = cr1*cnor
8948       reflectmin = 0.0
8949       kw_sq = 0.93
8950       dbzmax = dbzmin
8951       
8952       ihcnt=0
8954             
8955 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8956 !  Dielectric Factor  - Formulas implemented by Svetla Veleva
8957 !                       following Battan, "Radar Meteorology" - p. 40
8958 !  The result of these calculations is that the dielf numerator (ki_sq) without
8959 !  the density ratio is  .2116 for hail if using 917 density and .25 for
8960 !  snow if using 220 density.
8961 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8962       const_ki_sn = 0.5 - (0.5-0.46)/(917.-220.)*(swdn-220.)
8963       const_ki_h  = 0.5 - (0.5-0.46)/(917.-220.)*(hwdn-220.)
8964       ki_sq_sn = (swdnsq/rwdnsq) * const_ki_sn**2
8965       ki_sq_h  = (hwdnsq/rwdnsq) * const_ki_h**2
8966       dielf_sn = ki_sq_sn / kw_sq
8967       dielf_h  = ki_sq_h  / kw_sq
8968             
8969 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8970 !  Use the next line if you want to hardwire dielf for dry hail for both dry
8971 !  snow and dry hail.
8972 !  This would be equivalent to what Straka had originally. (i.e, .21/.93)
8973 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8974       dielf_sn = (swdnsq/rwdnsq)*.21/ kw_sq
8975       dielf_h  = (hwdnsq/rwdnsq)*.21/ kw_sq
8977       dielf_gl  = (gldnsq/rwdnsq)*.21/ kw_sq
8978       dielf_gm  = (gmdnsq/rwdnsq)*.21/ kw_sq
8979       dielf_gh  = (ghdnsq/rwdnsq)*.21/ kw_sq
8980       dielf_hl  = (hldnsq/rwdnsq)*.21/ kw_sq
8981       dielf_fw  = (fwdnsq/rwdnsq)*.21/ kw_sq
8983 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8984 !  Notes on dielectric factors  - from Eun-Kyoung Seo
8985 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8986 ! constants for both snow and hail would be (x=s,h).....
8987 !       xwdnsq/rwdnsq *0.21/kw_sq   ! Straka/Smith - the original
8988 !       xwdnsq/rwdnsq *0.224        ! Ferrier - for particle sizes in equiv. drop diam
8989 !       xwdnsq/rwdnsq *0.176/kw_sq  ! =0.189 in Smith - for particle sizes in equiv 
8990 !                       ice spheres
8991 !       xwdnsq/rwdnsq *0.208/kw_sq  ! Smith 1984 - for particle sizes in equiv melted drop diameter
8992 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8995 ! VIL algorithm constants
8996 !      Ztop = 10.**(56./10)           !56 dbz is the max rf used by WATADS in cell vil
8999 ! Hail detection algorithm constants
9000 !      ZL = 40.
9001 !      ZU = 50.
9002 !      Ho = 3400.  !WATADS Defaults
9003 !      Hm20 = 6200.      !WATADS Defaults
9005 !      DO kz = 1,Min(nzdbz,nz-1)
9007       DO jy=1,1
9009         DO kz = 1,ke_diag ! nz
9010          
9011           DO ix=1,nx
9012             dbz(ix,jy,kz) = 0.0
9013                       
9014           vzsnow = 0.0
9015           vzrain = 0.0
9016           vzgraupel = 0.0
9017           vzhail = 0.0
9018           
9019           dtmph = 0.0
9020           dtmps = 0.0
9021           dtmphl = 0.0
9022           dtmpr = 0.0
9023            dadr = (db(ix,jy,kz)/(pi*rwdn*cnor))**(0.25)
9024 !-----------------------------------------------------------------------
9025 ! Compute Rain Radar Reflectivity
9026 !-----------------------------------------------------------------------
9027            
9028            dtmp(ix,kz) = 0.0
9029            gtmp(ix,kz) = 0.0
9030            IF ( an(ix,jy,kz,lr) .ge. qrmin ) THEN
9031              IF ( ipconc .le. 2 ) THEN
9032                gtmp(ix,kz) = dadr*an(ix,jy,kz,lr)**(0.25)
9033                dtmp(ix,kz) = zrc*gtmp(ix,kz)**7
9034              ELSEIF ( lzr .gt. 1 ) THEN
9035                dtmp(ix,kz) = 1e18*an(ix,jy,kz,lzr)
9036              ELSEIF ( an(ix,jy,kz,lnr) .gt. 1.e-3 ) THEN
9037                IF ( imurain == 3 ) THEN
9038                  vr = db(ix,jy,kz)*an(ix,jy,kz,lr)/(1000.*an(ix,jy,kz,lnr))
9039                  dtmp(ix,kz) = 3.6e18*(rnu+2.)*an(ix,jy,kz,lnr)*vr**2/(rnu+1.)
9040                ELSE ! imurain == 1
9041                 g1 = (6.0 + alphar)*(5.0 + alphar)*(4.0 + alphar)/((3.0 + alphar)*(2.0 + alphar)*(1.0 + alphar))
9042                 zx = g1*(db(ix,jy,kz)*an(ix,jy,kz,lr))**2/an(ix,jy,kz,lnr)
9043                 ze =1.e18*zx*(6./(pi*1000.))**2 ! note: using 1000. here for water density
9044                 dtmp(ix,kz) = ze
9045                ENDIF
9046              ENDIF
9047              dtmpr = dtmp(ix,kz)
9048            ENDIF
9049            
9050 !-----------------------------------------------------------------------
9051 ! Compute snow and graupel reflectivity
9053 ! Lou modified to look at parcel temperature rather than base state
9054 !-----------------------------------------------------------------------
9056           IF( lhab .gt. lr ) THEN
9058 !    qs2d   = reform(data[*,*,k,10],[nx*ny])
9059 !    qh2d   = reform(data[*,*,k,11],[nx*ny])
9061 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9062 ! Only use the following lines if running Straka GEMS microphysics
9063 !  (Sam 1-d version modified by L Wicker does not use this)
9064 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9065 !    ;xcnoh    = cnoh*exp(-0.025*(temp-tfr))
9066 !    ;xcnos    = cnos*exp(-0.038*(temp-tfr))
9067 !    ;good = where(temp GT tfr, n_elements)
9068 !    ;IF n_elements NE 0 THEN xcnoh(good) = cnoh*exp(-0.075*(temp(good)-tfr))
9069 !    ;IF n_elements NE 0 THEN xcnos(good) = cnos*exp(-0.088*(temp(good)-tfr))
9071 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9072 ! Only use the following lines if running Ferrier micro with No=No(T)
9073 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9074 !    ;  NOSE = -.15
9075 !    ;  NOGE =  .0
9076 !    ;  xcnoh = cnoh*(1.>exp(NOGE*(temp-tfr)) )
9077 !    ;  xcnos = cnos*(1.>exp(NOSE*(temp-tfr)) )
9079 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9080 ! Use the following lines if Nos and Noh are constant
9081 !  (As in Svetla version of Ferrier, GCE Tao, and SAM 1-d)
9082 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9083         xcnoh    = cnoh
9084         xcnos    = cnos
9087 ! Temporary fix for predicted number concentration -- need a 
9088 ! more appropriate reflectivity equation!
9090 !        IF ( an(ix,jy,kz,lns) .lt. 0.1 ) THEN
9091 !         swdia = (xvrmn*cwc0)**(1./3.)
9092 !         xcnos = an(ix,jy,kz,ls)*db(ix,jy,kz)/(xvrmn*swdn*swdia)
9093 !        ELSE
9094 !      ! changed back to diameter of mean volume!!!
9095 !         swdia =
9096 !     >  (an(ix,jy,kz,ls)*db(ix,jy,kz)
9097 !     > /(pi*swdn*an(ix,jy,kz,lns)))**(1./3.)
9099 !        xcnos = an(ix,jy,kz,lns)/swdia
9100 !        ENDIF
9102         IF ( ls .gt. 1 ) THEN ! {
9103         
9104         IF ( lvs .gt. 1 ) THEN
9105           IF ( an(ix,jy,kz,lvs) .gt. 0.0 ) THEN
9106             swdn = db(ix,jy,kz)*an(ix,jy,kz,ls)/an(ix,jy,kz,lvs)
9107             swdn = Min( 300., Max( 100., swdn ) )
9108           ELSE 
9109             swdn = swdn0
9110           ENDIF
9111         
9112         ENDIF 
9113         
9114         IF ( ipconc .ge. 5 ) THEN ! {
9116         xvs = db(ix,jy,kz)*an(ix,jy,kz,ls)/  &
9117      &      (swdn*Max(1.0e-3,an(ix,jy,kz,lns)))
9118         IF ( xvs .lt. xvsmn .or. xvs .gt. xvsmx ) THEN
9119           xvs = Min( xvsmx, Max( xvsmn,xvs ) )
9120           csw = db(ix,jy,kz)*an(ix,jy,kz,ls)/(xvs*swdn)
9121         ENDIF
9123          swdia = (xvs*cwc0)**(1./3.)
9124          xcnos = an(ix,jy,kz,ls)*db(ix,jy,kz)/(xvs*swdn*swdia)
9125          
9126          ENDIF ! }
9127          ENDIF  ! }
9129 !        IF ( an(ix,jy,kz,lnh) .lt. 0.1 ) THEN
9130 !         hwdia = (xvrmn*cwc0)**(1./3.)
9131 !         xcnoh = an(ix,jy,kz,lh)*db(ix,jy,kz)/(xvrmn*hwdn*hwdia)
9132 !        ELSE
9133 !      ! changed back to diameter of mean volume!!!
9134 !         hwdia =
9135 !     >  (an(ix,jy,kz,lh)*db(ix,jy,kz)
9136 !     > /(pi*hwdn*an(ix,jy,kz,lnh)))**(1./3.)
9137 !        
9138 !         xcnoh = an(ix,jy,kz,lnh)/hwdia
9139 !        ENDIF
9141         IF ( lh .gt. 1 ) THEN ! {
9143         IF ( lvh .gt. 1 ) THEN
9144           IF ( an(ix,jy,kz,lvh) .gt. 0.0 ) THEN
9145             hwdn = db(ix,jy,kz)*an(ix,jy,kz,lh)/an(ix,jy,kz,lvh)
9146             hwdn = Min( 900., Max( hdnmn, hwdn ) )
9147           ELSE 
9148             hwdn = 500. ! hwdn1t
9149           ENDIF
9150         ELSE
9151           hwdn = hwdn1t
9152         ENDIF 
9153         
9154         IF ( ipconc .ge. 5 ) THEN ! {
9156         xvh = db(ix,jy,kz)*an(ix,jy,kz,lh)/       &
9157      &      (hwdn*Max(1.0e-3,an(ix,jy,kz,lnh)))
9158         IF ( xvh .lt. xvhmn .or. xvh .gt. xvhmx ) THEN
9159           xvh = Min( xvhmx, Max( xvhmn,xvh ) )
9160           chw = db(ix,jy,kz)*an(ix,jy,kz,lh)/(xvh*hwdn)
9161         ENDIF
9163          hwdia = (xvh*cwc0)**(1./3.)
9164          xcnoh = an(ix,jy,kz,lh)*db(ix,jy,kz)/(xvh*hwdn*hwdia)
9165          
9166         ENDIF ! } ipconc .ge. 5
9168         ENDIF ! }
9170         dadh = 0.0
9171         dadhl = 0.0
9172         dads = 0.0
9173         IF ( xcnoh .gt. 0.0 ) THEN 
9174           dadh = ( db(ix,jy,kz) /(pi*hwdn*xcnoh) )**(.25)
9175           zhdryc = 0.224*cr2*(db(ix,jy,kz)/rwdn)**2/xcnoh ! dielf_h*cr1*xcnoh          ! SV - equiv formula as before but
9176                                         ! ratio of densities included in
9177                                         ! dielf_h rather than here following
9178                                         ! Battan.
9179         ELSE
9180           dadh = 0.0
9181           zhdryc = 0.0
9182         ENDIF
9183         
9184         IF ( xcnos .gt. 0.0 ) THEN
9185           dads = ( db(ix,jy,kz) /(pi*swdn*xcnos) )**(.25)
9186           zsdryc = 0.224*cr2*(db(ix,jy,kz)/rwdn)**2/xcnos ! dielf_sn*cr1*xcnos         ! SV - similar change as above
9187         ELSE
9188           dads = 0.0
9189           zsdryc = 0.0
9190         ENDIF
9191         zhwetc = zhdryc ! cr1*xcnoh      !Hail/graupel version with .95 power bug removed
9192         zswetc = zsdryc ! cr1*xcnos
9193 !           
9194 ! snow contribution
9196           IF ( ls .gt. 1 ) THEN
9197           
9198           gtmp(ix,kz) = 0.0 
9199           qxw = 0.0 
9200           qxw1 = 0.0
9201           dtmps = 0.0
9202            IF ( an(ix,jy,kz,ls) .ge. qsmin ) THEN !{
9203             IF ( ipconc .ge. 4 ) THEN  ! (Ferrier 94) !{
9205              if (lsw .gt. 1) THEN 
9206                qxw = an(ix,jy,kz,lsw)
9207                qxw1 = 0.0
9208              ELSEIF ( ( iusewetsnow == 1 .or. iusewetsnow == 3) .and. temk(ix,jy,kz) .gt. tfr+1. & 
9209      &                  .and. an(ix,jy,kz,ls) > an(ix,jy,kz,lr) .and. an(ix,jy,kz,lr) > qsmin) THEN
9210                qxw = Min(0.5*an(ix,jy,kz,ls), an(ix,jy,kz,lr))
9211                qxw1 = qxw
9212              ENDIF
9214              vr = xvs ! db(ix,jy,kz)*an(ix,jy,kz,lr)/(1000.*an(ix,jy,kz,lnr))
9215 !             gtmp(ix,kz) = 3.6e18*(0.243*rhos**2/0.93)*(snu+2.)*an(ix,jy,kz,lns)*vr**2/(snu+1.)
9216              
9217              ksq = 0.189 ! Smith (1984, JAMC) for equiv. ice sphere
9218              IF ( an(ix,jy,kz,lns) .gt. 1.e-7 ) THEN
9219      !          IF ( .true. ) THEN
9220                IF ( qxw > qsmin .or. iusewetsnow >= 2 ) THEN ! old version
9221 !                gtmp(ix,kz) = 3.6e18*(snu+2.)*( 0.224*an(ix,jy,kz,ls) + 0.776*qxw)*an(ix,jy,kz,ls)/ &
9222 !     &              (an(ix,jy,kz,lns)*(snu+1.)*rwdn**2)*db(ix,jy,kz)**2
9223                 gtmp(ix,kz) = 3.6e18*(snu+2.)*( 0.224*(an(ix,jy,kz,ls)+qxw1) + 0.776*qxw)*(an(ix,jy,kz,ls)+qxw1)/ &
9224      &              (an(ix,jy,kz,lns)*(snu+1.)*rwdn**2)*db(ix,jy,kz)**2
9226                ELSE ! new form using a mass relationship m = p d^2 (instead of d^3 -- Cox 1988 QJRMS) so that density depends on size
9227                     ! p = 0.106214 for m = p v^(2/3)
9228                  dnsnow = 0.0346159*sqrt(an(ix,jy,kz,lns)/(an(ix,jy,kz,ls)*db(ix,jy,kz)) )
9229                  IF ( .true. .or. dnsnow < 900. ) THEN
9230                   gtmp(ix,kz) = 1.e18*323.3226* 0.106214**2*(ksq*an(ix,jy,kz,ls) + &
9231      &             (1.-ksq)*qxw)*an(ix,jy,kz,ls)*db(ix,jy,kz)**2*gsnow73/         &
9232      &                   (an(ix,jy,kz,lns)*(917.)**2* gsnow1*(1.0+snu)**(4./3.))
9233                  ELSE ! otherwise small enough to assume ice spheres?
9234                   gtmp(ix,kz) = (36./pi**2) * 1.e18*(snu+2.)*( 0.224*(an(ix,jy,kz,ls)+qxw1) + 0.776*qxw)*(an(ix,jy,kz,ls)+qxw1)/ &
9235      &              (an(ix,jy,kz,lns)*(snu+1.)*rwdn**2)*db(ix,jy,kz)**2
9236                  ENDIF
9238                ENDIF
9239              
9240              ENDIF
9241              
9242 !             tmp = Min(1.0,1.e3*(an(ix,jy,kz,ls))*db(ix,jy,kz))
9243 !             gtmp(ix,kz) = Max( 1.0*gtmp(ix,kz), 750.0*(tmp)**1.98)
9244              dtmps = gtmp(ix,kz)
9245              dtmp(ix,kz) = dtmp(ix,kz) + gtmp(ix,kz)
9246             ELSE ! }{ single-moment snow:
9247              gtmp(ix,kz) = dads*an(ix,jy,kz,ls)**(0.25)
9248              
9249              IF ( gtmp(ix,kz) .gt. 0.0 ) THEN !{
9250              dtmps = zsdryc*an(ix,jy,kz,ls)**2/gtmp(ix,kz)
9251              IF ( temk(ix,jy,kz) .lt. tfr ) THEN
9252                dtmp(ix,kz) = dtmp(ix,kz) +          &
9253      &                   zsdryc*an(ix,jy,kz,ls)**2/gtmp(ix,kz)
9254              ELSE
9255                dtmp(ix,kz) = dtmp(ix,kz) +          &
9256      &                  zswetc*an(ix,jy,kz,ls)**2/gtmp(ix,kz)
9257              ENDIF
9258              ENDIF !}
9259             ENDIF !}
9260            
9261            ENDIF !}
9262            
9263            ENDIF
9267 ! ice crystal contribution (Heymsfield, 1977, JAS)
9269          IF ( li .gt. 1 .and. idbzci .ne. 0 ) THEN
9270           
9271            IF ( idbzci == 1 .and. lni > 0 ) THEN
9272           ! assume spherical ice with density of 900 for dbz calc
9273             IF ( an(ix,jy,kz,li) > qxmin(li) .and. an(ix,jy,kz,lni) > 1.0 ) THEN
9274                  vr = db(ix,jy,kz)*an(ix,jy,kz,li)/(900.*an(ix,jy,kz,lni))
9275                  dtmp(ix,kz) = dtmp(ix,kz) +  &
9276      &                 0.224*3.6e18*(cinu+2.)*an(ix,jy,kz,lni)*vr**2/(cinu+1.)*(900./1000.)**2
9277             ENDIF
9279           ELSEIF ( idbzci == 2 ) THEN
9281 ! ice crystal contribution (Heymsfield, 1977, JAS)
9283          gtmp(ix,kz) = 0.0 
9284            IF ( an(ix,jy,kz,li) .ge. 0.1e-3 ) THEN
9285              gtmp(ix,kz) = Min(1.0,1.e3*(an(ix,jy,kz,li))*db(ix,jy,kz))
9286              dtmp(ix,kz) = dtmp(ix,kz) + 750.0*(gtmp(ix,kz))**1.98
9287            ENDIF
9288            
9289           ENDIF
9290         
9291         ENDIF
9292           
9293 !           
9294 ! graupel/hail contribution
9296          IF ( lh .gt. 1 ) THEN ! {
9297            gtmp(ix,kz) = 0.0 
9298            dtmph = 0.0
9299            qxw = 0.0
9301           IF ( izieg .ge. 1 .and. ipconc .ge. 5 ) THEN
9303            ltest = .false.
9304            IF ( lzh > 1 ) THEN
9305              IF ( an(ix,jy,kz,lzh) > 0.0 .and. an(ix,jy,kz,lh) > qhmin .and. &
9306                   an(ix,jy,kz,lnh) >= cxmin ) ltest = .true.
9307            ENDIF
9308            
9309            IF ( ltest .or. (an(ix,jy,kz,lh) .ge. qhmin .and. an(ix,jy,kz,lnh) .ge. cxmin )) THEN
9310             
9311             IF ( lvh .gt. 1 ) THEN
9312              
9313              IF ( an(ix,jy,kz,lvh) .gt. 0.0 ) THEN
9314                hwdn = db(ix,jy,kz)*an(ix,jy,kz,lh)/an(ix,jy,kz,lvh)
9315                hwdn = Min( 900., Max( 100., hwdn ) )
9316               ELSE 
9317                hwdn = 500. ! hwdn1t
9318               ENDIF
9320              ENDIF
9322              chw = an(ix,jy,kz,lnh)
9323             IF ( chw .gt. 0.0 ) THEN                                         ! (Ferrier 94)
9324              xvh = db(ix,jy,kz)*an(ix,jy,kz,lh)/(hwdn*Max(1.0e-3,chw))
9325              IF ( xvh .lt. xvhmn .or. xvh .gt. xvhmx ) THEN
9326               xvh = Min( xvhmx, Max( xvhmn,xvh ) )
9327               chw = db(ix,jy,kz)*an(ix,jy,kz,lh)/(xvh*hwdn)
9328              ENDIF
9329              
9330              qh = an(ix,jy,kz,lh)
9331              
9332              IF ( lhw .gt. 1 ) THEN
9333                IF ( iusewetgraupel .eq. 1 ) THEN
9334                   qxw = an(ix,jy,kz,lhw)
9335                ELSEIF ( iusewetgraupel .eq. 2 ) THEN
9336                   IF ( hwdn .lt. 300. ) THEN
9337                     qxw = an(ix,jy,kz,lhw)
9338                   ENDIF
9339                ENDIF
9340              ELSEIF ( iusewetgraupel .eq. 3 ) THEN
9341                   IF ( hwdn .lt. 300. .and. temk(ix,jy,kz) > tfr .and. an(ix,jy,kz,lr) > qhmin ) THEN
9342                     qxw = Min( an(ix,jy,kz,lh), an(ix,jy,kz,lr))
9343                     qh = qh + qxw
9344                   ENDIF
9345              ELSEIF ( iusewetgraupel == 4 .and. temk(ix,jy,kz) .gt. tfr+0.25 .and. an(ix,jy,kz,lh) > an(ix,jy,kz,lr) &
9346      &              .and. an(ix,jy,kz,lr) > qhmin) THEN
9347                qxw = Min(0.5*an(ix,jy,kz,lh), an(ix,jy,kz,lr))
9348                qh = qh + qxw
9350              ENDIF
9351              
9352              IF ( lzh .gt. 1 ) THEN
9353               x = (0.224*qh +  0.776*qxw)/an(ix,jy,kz,lh)  ! weighted average of dielectric const
9354               dtmph = 1.e18*x*an(ix,jy,kz,lzh)*(hwdn/rwdn)**2
9355               dtmp(ix,kz) = dtmp(ix,kz) + dtmph
9356              ELSE
9357              g1 = (6.0 + alphah)*(5.0 + alphah)*(4.0 + alphah)/((3.0 + alphah)*(2.0 + alphah)*(1.0 + alphah))
9358 !             zx = g1*(db(ix,jy,kz)*an(ix,jy,kz,lh))**2/chw
9359 !             ze = 0.224*1.e18*zx*(6./(pi*1000.))**2
9360              zx = g1*db(ix,jy,kz)**2*( 0.224*qh + 0.776*qxw)*qh/chw
9361              ze =1.e18*zx*(6./(pi*1000.))**2
9362              dtmp(ix,kz) = dtmp(ix,kz) + ze
9363              dtmph = ze
9364              ENDIF
9365              
9366             ENDIF
9367              
9368         !     IF ( an(ix,jy,kz,lh) .gt. 1.0e-3 ) write(0,*)  'Graupel Z : ',dtmph,ze
9369            ENDIF
9370           
9371           ELSE
9372           
9373           dtmph = 0.0
9374           
9375            IF ( an(ix,jy,kz,lh) .ge. qhmin ) THEN
9376              gtmp(ix,kz) = dadh*an(ix,jy,kz,lh)**(0.25)
9377              IF ( gtmp(ix,kz) .gt. 0.0 ) THEN
9378              dtmph =  zhdryc*an(ix,jy,kz,lh)**2/gtmp(ix,kz)
9379              IF ( temk(ix,jy,kz) .lt. tfr ) THEN
9380                dtmp(ix,kz) = dtmp(ix,kz) +                   &
9381      &                  zhdryc*an(ix,jy,kz,lh)**2/gtmp(ix,kz)
9382              ELSE
9383 !               IF ( hwdn .gt. 700.0 ) THEN
9384                  dtmp(ix,kz) = dtmp(ix,kz) +                   &
9385      &                  zhdryc*an(ix,jy,kz,lh)**2/gtmp(ix,kz)
9387 !     &                               (zhwetc*gtmp(ix,kz)**7)**0.95
9388 !               ELSE
9389 !                 dtmp(ix,kz) = dtmp(ix,kz) + zhwetc*gtmp(ix,kz)**7
9390 !               ENDIF
9391              ENDIF
9392              ENDIF
9393            ENDIF
9394           
9395          
9396           
9397           ENDIF
9400           ENDIF ! }
9401           
9402           ENDIF ! na .gt. 5
9404         
9405         IF ( izieg .ge. 1 .and. lhl .gt. 1 ) THEN
9407         hldn = 900.0
9408         gtmp(ix,kz) = 0.0
9409         dtmphl = 0.0
9410         qxw = 0.0
9411         
9413         IF ( lvhl .gt. 1 ) THEN
9414           IF ( an(ix,jy,kz,lvhl) .gt. 0.0 ) THEN
9415             hldn = db(ix,jy,kz)*an(ix,jy,kz,lhl)/an(ix,jy,kz,lvhl)
9416             hldn = Min( 900., Max( 300., hldn ) )
9417           ELSE 
9418             hldn = 900. 
9419           ENDIF
9420         ELSE
9421           hldn = rho_qhl
9422         ENDIF 
9425         IF ( ipconc .ge. 5 ) THEN
9427            ltest = .false.
9428            IF ( lzhl > 1 ) THEN
9429              IF ( an(ix,jy,kz,lzhl) > 0.0 .and. an(ix,jy,kz,lhl) > qhlmin .and. &
9430                   an(ix,jy,kz,lnhl) > 0.0 ) ltest = .true.
9431            ENDIF
9433           IF ( ltest .or. ( an(ix,jy,kz,lhl) .ge. qhlmin .and. an(ix,jy,kz,lnhl) .gt. 0.) ) THEN !{
9434             chl = an(ix,jy,kz,lnhl)
9435             IF ( chl .gt. 0.0 ) THEN !{
9436              xvhl = db(ix,jy,kz)*an(ix,jy,kz,lhl)/         &
9437      &        (hldn*Max(1.0e-9,an(ix,jy,kz,lnhl)))
9438             IF ( xvhl .lt. xvhlmn .or. xvhl .gt. xvhlmx ) THEN ! {
9439               xvhl = Min( xvhlmx, Max( xvhlmn,xvhl ) )
9440               chl = db(ix,jy,kz)*an(ix,jy,kz,lhl)/(xvhl*hldn)
9441               ! do not update state in dbz calc. ! an(ix,jy,kz,lnhl) = chl
9442             ENDIF ! }
9444              IF ( lhlw .gt. 1 ) THEN
9445                IF ( iusewethail .eq. 1 ) THEN
9446                   qxw = an(ix,jy,kz,lhlw)
9447                ELSEIF ( iusewethail .eq. 2 ) THEN
9448                   IF ( hldn .lt. 300. ) THEN
9449                     qxw = an(ix,jy,kz,lhlw)
9450                   ENDIF
9451                ENDIF
9452              ENDIF
9453             
9454              IF ( lzhl .gt. 1 ) THEN !{
9455               x = (0.224*an(ix,jy,kz,lhl) +  0.776*qxw)/an(ix,jy,kz,lhl)  ! weighted average of dielectric const
9456               dtmphl = 1.e18*x*an(ix,jy,kz,lzhl)*(hldn/rwdn)**2
9457               dtmp(ix,kz) = dtmp(ix,kz) + dtmphl
9458              ELSE !}
9460              g1 = (6.0 + alphahl)*(5.0 + alphahl)*(4.0 + alphahl)/((3.0 + alphahl)*(2.0 + alphahl)*(1.0 + alphahl))
9461              zx = g1*db(ix,jy,kz)**2*( 0.224*an(ix,jy,kz,lhl) + 0.776*qxw)*an(ix,jy,kz,lhl)/chl
9462 !             zx = g1*(db(ix,jy,kz)*an(ix,jy,kz,lhl))**2/chl
9463              ze = 1.e18*zx*(6./(pi*1000.))**2 ! 3/28/2016 removed extra factor of 0.224
9464              dtmp(ix,kz) = dtmp(ix,kz) + ze
9465              dtmphl = ze
9466              
9467              ENDIF !}
9468             ENDIF!}
9469         !     IF ( an(ix,jy,kz,lh) .gt. 1.0e-3 ) write(0,*)  'Graupel Z : ',dtmph,ze
9470            ENDIF
9472           
9473           ELSE
9474           
9475           
9476            IF ( an(ix,jy,kz,lhl) .ge. qhlmin ) THEN ! {
9477             dadhl = ( db(ix,jy,kz) /(pi*hldn*cnohl) )**(.25)
9478              gtmp(ix,kz) = dadhl*an(ix,jy,kz,lhl)**(0.25)
9479              IF ( gtmp(ix,kz) .gt. 0.0 ) THEN ! {
9481               zhldryc = 0.224*cr2*( db(ix,jy,kz)/rwdn)**2/cnohl 
9483              dtmphl =  zhldryc*an(ix,jy,kz,lhl)**2/gtmp(ix,kz)
9485              IF ( temk(ix,jy,kz) .lt. tfr ) THEN
9486                dtmp(ix,kz) = dtmp(ix,kz) +                   &
9487      &                  zhldryc*an(ix,jy,kz,lhl)**2/gtmp(ix,kz)
9488              ELSE
9489 !               IF ( hwdn .gt. 700.0 ) THEN
9490                  dtmp(ix,kz) = dtmp(ix,kz) +                   &
9491      &                  zhldryc*an(ix,jy,kz,lhl)**2/gtmp(ix,kz)
9493 !     :                               (zhwetc*gtmp(ix,kz)**7)**0.95
9494 !               ELSE
9495 !                 dtmp(ix,kz) = dtmp(ix,kz) + zhwetc*gtmp(ix,kz)**7
9496 !               ENDIF
9497              ENDIF
9498              ENDIF ! }
9499            
9500            ENDIF ! }
9501           
9502          ENDIF ! ipconc .ge. 5
9505         ENDIF ! izieg .ge. 1 .and. lhl .gt. 1 
9507           
9508            
9509           IF ( dtmp(ix,kz) .gt. 0.0 ) THEN
9510             dbz(ix,jy,kz) = Max(dbzmin, 10.0*Log10(dtmp(ix,kz)) )
9511             
9512             IF ( dbz(ix,jy,kz) .gt. dbzmax ) THEN
9513               dbzmax = Max(dbzmax,dbz(ix,jy,kz))
9514               imx = ix
9515               jmx = jy
9516               kmx = kz
9517             ENDIF
9518           ELSE 
9519              dbz(ix,jy,kz) = dbzmin
9520              IF ( lh > 1 .and. lhl > 1) THEN
9521                IF ( an(ix,jy,kz,lh) > 1.0e-3 ) THEN
9522                  write(0,*) 'radardbz: qr,qh,qhl = ',an(ix,jy,kz,lr), an(ix,jy,kz,lh),an(ix,jy,kz,lhl)
9523                  write(0,*) 'radardbz: dtmps,dtmph,dadh,dadhl,dtmphl = ',dtmps,dtmph,dadh,dadhl,dtmphl
9524                  
9525                  IF ( lzh>1 .and. lzhl>1 ) write(0,*) 'radardbz: zh, zhl = ',an(ix,jy,kz,lzh),an(ix,jy,kz,lzhl)
9526                ENDIF
9527              ENDIF
9528           ENDIF
9530 !         IF ( an(ix,jy,kz,lh) .gt. 1.e-4 .and. 
9531 !     &        dbz(ix,jy,kz) .le. 0.0 ) THEN
9532 !          write(0,*) 'dbz = ',dbz(ix,jy,kz)
9533 !          write(0,*) 'Hail intercept: ',xcnoh,ix,kz
9534 !          write(0,*) 'Hail,snow q: ',an(ix,jy,kz,lh),an(ix,jy,kz,ls)
9535 !          write(0,*) 'Hail,snow c: ',an(ix,jy,kz,lnh),an(ix,jy,kz,lns)
9536 !          write(0,*) 'dtmps,dtmph = ',dtmps,dtmph
9537 !         ENDIF
9538         IF ( .not. dtmp(ix,kz) .lt. 1.e30 .or. dbz(ix,jy,kz) > 190.0 ) THEN
9539 !        IF ( ix == 31 .and. kz == 20 .and. jy == 23 ) THEN
9540 !          write(0,*) 'my_rank = ',my_rank
9541           write(0,*) 'ix,jy,kz = ',ix,jy,kz
9542           write(0,*) 'dbz = ',dbz(ix,jy,kz)
9543           write(0,*) 'db, zhdryc = ',db(ix,jy,kz),zhdryc
9544           write(0,*) 'Hail intercept: ',xcnoh,ix,kz
9545           write(0,*) 'Hail,snow q: ',an(ix,jy,kz,lh),an(ix,jy,kz,ls)
9546           write(0,*) 'graupel density hwdn = ',hwdn
9547           write(0,*) 'rain q: ',an(ix,jy,kz,lr)
9548           write(0,*) 'ice q: ',an(ix,jy,kz,li)
9549           IF ( lhl .gt. 1 ) write(0,*) 'Hail (lhl): ',an(ix,jy,kz,lhl)
9550           IF (ipconc .ge. 3 ) write(0,*) 'rain c: ',an(ix,jy,kz,lnr)
9551           IF ( lzr > 1 ) write(0,*) 'rain Z: ',an(ix,jy,kz,lzr)
9552           IF ( ipconc .ge. 5 ) THEN
9553           write(0,*) 'Hail,snow c: ',an(ix,jy,kz,lnh),an(ix,jy,kz,lns)
9554           IF ( lhl .gt. 1 ) write(0,*) 'Hail (lnhl): ',an(ix,jy,kz,lnhl)
9555           IF ( lzhl .gt. 1 ) THEN 
9556             write(0,*) 'Hail (lzhl): ',an(ix,jy,kz,lzhl)
9557             write(0,*) 'chl,xvhl,dhl = ',chl,xvhl,(xvhl*6./3.14159)**(1./3.)
9558             write(0,*) 'xvhlmn,xvhlmx = ',xvhlmn,xvhlmx
9559           ENDIF
9560           ENDIF
9561           write(0,*) 'chw,xvh = ', chw,xvh
9562           write(0,*) 'dtmps,dtmph,dadh,dadhl,dtmphl = ',dtmps,dtmph,dadh,dadhl,dtmphl
9563           write(0,*) 'dtmpr = ',dtmpr
9564           write(0,*) 'gtmp = ',gtmp(ix,kz),dtmp(ix,kz)
9565           IF ( .not. (dbz(ix,jy,kz) .gt. -100 .and. dbz(ix,jy,kz) .lt. 200 ) ) THEN
9566             write(0,*) 'dbz out of bounds!'
9567 !           STOP
9568           ENDIF
9569          ENDIF
9571            
9572           ENDDO ! ix
9573          ENDDO ! kz
9574       ENDDO ! jy
9575             
9576       
9577       
9578       
9579 !      write(0,*)  'na,lr = ',na,lr
9580       IF ( printyn .eq. 1 ) THEN
9581 !      IF ( dbzmax .gt. dbzmin ) THEN
9582         write(iunit,*) 'maxdbz,ijk = ',dbzmax,imx,jmx,kmx
9583         write(iunit,*) 'qrw = ',an(imx,jmx,kmx,lr)
9584         
9585         IF ( lh .gt. 1 ) THEN
9586           write(iunit,*) 'qi  = ',an(imx,jmx,kmx,li)
9587           write(iunit,*) 'qsw = ',an(imx,jmx,kmx,ls)
9588           write(iunit,*) 'qhw = ',an(imx,jmx,kmx,lh)
9589           IF ( lhl .gt. 1 ) write(iunit,*) 'qhl = ',an(imx,jmx,kmx,lhl)
9590         ENDIF
9592       
9593       ENDIF
9594       
9595       
9596       RETURN
9597       END subroutine radardd02
9598       
9600 ! ##############################################################################
9601 ! ##############################################################################
9604 ! #####################################################################
9605 ! #####################################################################
9607 ! Subroutine for explicit cloud condensation and droplet nucleation
9609 ! 11/30/2022: Fixed droplet evaporation heating term for CM1 eqtset=2 (was only doing eqtset=1)
9611    SUBROUTINE NUCOND    &
9612      &  (nx,ny,nz,na,jyslab & 
9613      &  ,nor,norz,dtp,nxi & 
9614      &  ,dz3d & 
9615      &  ,t0,t9 & 
9616      &  ,an,dn,p2 & 
9617      &  ,pn,w & 
9618      &  ,ngs   &
9619      &  ,axtra,io_flag &
9620      &  ,ssfilt,t00,t77,flag_qndrop  &
9621      & )
9624    implicit none
9626 !      real :: cwmasn = 1000.*0.523599*(2.*2.e-6)**3 
9627       integer :: nx,ny,nz,na,nxi
9628       integer :: nor,norz, jyslab ! ,nht,ngt,igsr
9629       real    :: dtp  ! time step
9630       logical :: flag_qndrop
9632       integer, parameter :: ng1 = 1
9636 ! external temporary arrays
9638       real t00(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9639       real t77(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9641       real t0(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9642 !      real t1(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9643 !      real t2(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9644 !      real t3(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9645 !      real t4(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9646 !      real t5(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9647 !      real t6(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9648 !      real t7(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9649 !      real t8(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9650       real t9(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9651       
9653       real p2(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)  ! perturbation Pi
9654       real pn(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9655       real an(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz,na)
9656       real dn(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9658       real w(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9659 !      real qv(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9661       real ssfilt(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9662       
9664       real pb(-norz+ng1:nz+norz)
9665       real pinit(-norz+ng1:nz+norz)
9667       real dz3d(-nor+1:nx+nor,-nor+1:ny+nor,-norz+1:nz+norz)
9669       
9670     ! local
9673       real axtra(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz,nxtra)
9674       logical :: io_flag
9675       
9676       real :: dv
9677       real :: ccnefactwo, sstmp, cn1, cnuctmp
9680 !  declarations microphysics and for gather/scatter
9682       real, parameter :: cwmas30 = 1000.*0.523599*(2.*30.e-6)**3 ! mass of 30-micron radius droplet, for sat. adj.
9683       real, parameter :: cwmas20 = 1000.*0.523599*(2.*20.e-6)**3 ! mass of 20-micron radius droplet, for sat. adj.
9684       integer nxmpb,nzmpb,nxz
9685       integer mgs,ngs,numgs,inumgs
9686       integer ngscnt,igs(ngs),kgs(ngs)
9687       integer kgsp(ngs),kgsm(ngs)
9688       integer nsvcnt
9689       
9690       integer ix,kz,i,n, kp1, km1
9691       integer :: jy, jgs
9692       integer ixb,ixe,jyb,jye,kzb,kze
9693     
9694       integer itile,jtile,ktile
9695       integer ixend,jyend,kzend,kzbeg
9696       integer nxend,nyend,nzend,nzbeg
9699 ! Variables for Ziegler warm rain microphysics
9700 !      
9703       real ccnc(ngs), ccna(ngs), cnuc(ngs), cwnccn(ngs)
9704       real :: ccnc_nu(ngs), ccnc_ac(ngs), ccnc_co(ngs)
9705       real ccncuf(ngs)
9706       real sscb  ! 'cloud base' SS threshold
9707       parameter ( sscb = 2.0 )
9708       integer idecss  ! flag to turn on (=1) decay of ssmax when no cloud or ice crystals
9709       parameter ( idecss = 1 )
9710       integer iba ! flag to do condensation/nucleation in 1st or 2nd loop
9711                   ! =0 to use ad to calculate SS
9712                   ! =1 to use an at end of main jy loop to calculate SS
9713       parameter (iba = 1)
9714       integer ifilt   ! =1 to filter ssat, =0 to set ssfilt=ssat
9715       parameter ( ifilt = 0 ) 
9716       real temp1,temp2 ! ,ssold
9717       real :: ssmax(ngs)      ! maximum SS experienced by a parcel
9718       real ssmx
9719       real dnnet,dqnet
9720 !      real cnu,rnu,snu,cinu
9721 !      parameter ( cnu = 0.0, rnu = -0.8, snu = -0.8, cinu = 0.0 )
9722       real ventrx(ngs)
9723       real ventrxn(ngs)
9724       real volb, t2s
9725       real, parameter :: aa1 = 9.44e15, aa2 = 5.78e3  ! a1 in Ziegler
9727       real ec0, ex1, ft, rhoinv(ngs)
9728       
9729       real chw, g1, rd1
9731       real ac1,bc, taus, c1,d1,e1,f1,p380,tmp,tmp2 ! , sstdy, super
9732       real tmpmx, fw, qctmp
9733       real x,y,del,r,alpr
9734       double precision :: vent1,vent2
9735       real g1palp
9736       real bs
9737       real v1, v2
9738       real d1r, d1i, d1s, e1i
9739       integer nc ! condensation step
9740       real dtcon,dtcon1,dtcon2 ! condensation time step (dtcon*nc = dtp)
9741       real delta
9742       integer ltemq1,ltemq1m ! ,ltemq1m2
9743       real dqv,qv1,ss1,ss2,qvs1,dqvs,dtemp,dt1   ! temporaries for condensation
9745       real ssi1, ssi2, dqvi, dqvis, dqvii,qis1
9746       real dqvr, dqc, dqr, dqi, dqs
9747       real qv1m,qvs1m,ss1m,ssi1m,qis1m
9748       real cwmastmp 
9749       real  dcloud,dcloud2 ! ,as, bs
9750       real dcrit
9751       real cn(ngs), cnuf(ngs)
9752       real :: ccwmax
9754       integer ltemq
9755       
9756       integer il
9758       real  es(ngs) ! ss(ngs),
9759 !      real  eis(ngs)
9760       real ssf(ngs),ssfkp1(ngs),ssfkm1(ngs),ssat0(ngs)
9761       real, parameter :: ssfcut = 4.0
9762       real ssfjp1(ngs),ssfjm1(ngs)
9763       real ssfip1(ngs),ssfim1(ngs)
9765       real supcb, supmx
9766       parameter (supcb=0.5,supmx=238.0)
9767       real r2dxm, r2dym, r2dzm
9768       real dssdz, dssdy, dssdx
9769 !      real tqvcon
9770       real epsi,d
9771       parameter (epsi = 0.622, d = 0.266)
9772       real r1,qevap ! ,slv
9773       
9774       real vr,nrx,qr,z1,z2,rdi,alp,xnutmp,xnuc
9775       real ctmp, ccwtmp
9776       real f5, qvs0  ! Kessler condensation factor
9777       real    :: t0p1, t0p3
9778       real qvex
9779       
9780 !      real, dimension(ngs) :: temp, tempc, elv, elf, els, pqs, theta, temg, temcg
9781       real dqvcnd(ngs),dqwv(ngs),dqcw(ngs),dqci(ngs)
9782       real temp(ngs),tempc(ngs)
9783       real temg(ngs),temcg(ngs),theta(ngs),qvap(ngs) ! ,tembzg(ngs)
9784       real temgx(ngs),temcgx(ngs)
9785       real qvs(ngs),qis(ngs),qss(ngs),pqs(ngs)
9786       real felv(ngs),felf(ngs),fels(ngs)
9787       real felvcp(ngs),felvpi(ngs)
9788       real gamw(ngs),gams(ngs)   !   qciavl(ngs),
9789       real tsqr(ngs),ssi(ngs),ssw(ngs)
9790       real cc3(ngs),cqv1(ngs),cqv2(ngs)
9791       real qcwtmp(ngs),qtmp
9793       real fvent(ngs) !,fraci(ngs),fracl(ngs)
9794       real fwvdf(ngs),ftka(ngs),fthdf(ngs)
9795       real fadvisc(ngs),fakvisc(ngs)
9796       real fci(ngs),fcw(ngs)
9797       real fschm(ngs),fpndl(ngs)
9799       real pres(ngs),pipert(ngs)
9800       real pk(ngs)
9801       real rho0(ngs),pi0(ngs)
9802       real rhovt(ngs)
9803       real thetap(ngs),theta0(ngs),qwvp(ngs),qv0(ngs)
9804       real thsave(ngs)
9805       real qss0(ngs)
9806       real fcqv1(ngs)
9807       real wvel(ngs),wvelkm1(ngs)
9809       real wvdf(ngs),tka(ngs)
9810       real advisc(ngs)
9812       real rwvent(ngs)
9813       
9815       real :: qx(ngs,lv:lhab)
9816       real :: cx(ngs,lc:lhab)
9817       real :: xv(ngs,lc:lhab)
9818       real :: xmas(ngs,lc:lhab)
9819       real :: xdn(ngs,lc:lhab)
9820       real :: xdia(ngs,lc:lhab,3)
9821       real :: alpha(ngs,lc:lhab)
9822       real :: zx(ngs,lr:lhab)
9825       logical zerocx(lc:lqmx)
9826       
9827       logical :: lprint
9829       integer, parameter :: iunit = 0
9830       
9831       real :: frac, hwdn, tmpg
9832       
9833       real :: cvm,cpm,rmm
9835       real, parameter ::      cpv = 1885.0       ! specific heat of water vapor at constant pressure
9836       
9837       integer :: kstag
9838       
9839       integer :: count
9840       
9841 ! -------------------------------------------------------------------------------
9842       itile = nxi
9843       jtile = ny
9844       ktile = nz
9845       ixend = nxi
9846       jyend = ny
9847       kzend = nz
9848       nxend = nxi + 1
9849       nyend = ny + 1
9850       nzend = nz
9851       kzbeg = 1
9852       nzbeg = 1
9854       IF ( ac_opt > 0 )  ccnefactwo =  (1.63e-3/(cck * beta(3./2., cck/2.)))**(1.0/(cck + 2.0))
9855       f5 = 237.3 * 17.27 * 2.5e6 / cp ! combined constants for rain condensation (Soong and Ogura 73)
9857        jy = 1
9858        kstag = 0
9859        pb(:) = 0.0
9860        pinit(:) = 0.0
9861       
9862       IF ( ipconc <= 1 .or. isedonly == 2 ) GOTO 2200
9865 !  Ziegler nucleation 
9868 !      ssfilt(:,:,:) = 0.0
9869       ssmx = 0
9870       count = 0
9872       do kz = 1,nz-kstag
9873         do ix = 1,nxi
9875          temp1 = an(ix,jy,kz,lt)*t77(ix,jy,kz)
9876           t0(ix,jy,kz) = temp1
9877           ltemq = Int( (temp1-163.15)/fqsat+1.5 )
9878          ltemq = Min( nqsat, Max(1,ltemq) )
9880           c1 = t00(ix,jy,kz)*tabqvs(ltemq)
9882           IF ( c1 > 0. ) THEN
9883             ssfilt(ix,jy,kz) = 100.*(an(ix,jy,kz,lv)/c1 - 1.0)  ! from "new" values
9884           ENDIF
9886         ENDDO
9887       ENDDO
9891 !     jy = 1 ! working on a 2d slab
9892 !!  VERY IMPORTANT:  SET jgs = jy
9894       jgs = jy
9897 !..Gather microphysics
9899       if ( ndebug .gt. 0 ) write(0,*) 'ICEZVD_DR: Gather stage'
9901       nxmpb = 1
9902       nzmpb = 1
9903       nxz = nxi*nz
9904       numgs = nxz/ngs + 1
9907       do 2000 inumgs = 1,numgs
9909       ngscnt = 0
9912       kzb = nzmpb
9913       kze = nz-kstag
9914  !     if (kzbeg .le. nzmpb .and. kzend .gt. nzmpb) kzb = nzmpb
9916       ixb = nxmpb
9917       ixe = itile
9919       do kz = kzb,kze
9920       do ix = nxmpb,nxi
9922       pqs(1) = 380.0/(pn(ix,jy,kz) + pb(kz))
9923       theta(1) = an(ix,jy,kz,lt)
9924       temg(1) = t0(ix,jy,kz)
9926       temcg(1) = temg(1) - tfr
9927       ltemq = (temg(1)-163.15)/fqsat+1.5
9928       ltemq = Min( nqsat, Max(1,ltemq) )
9929       qvs(1) = pqs(1)*tabqvs(ltemq)
9930       qis(1) = pqs(1)*tabqis(ltemq)
9932       qss(1) = qvs(1)
9935       if ( temg(1) .lt. tfr ) then
9936       end if
9938       if ( (temg(1) .gt. tfrh .or. an(ix,jy,kz,lv)/qvs(1) > maxlowtempss ) .and.  &
9939      &   ( an(ix,jy,kz,lv)  .gt. qss(1) .or. &
9940      &     an(ix,jy,kz,lc)  .gt. qxmin(lc)   .or.  &
9941      &     ( an(ix,jy,kz,lr)  .gt. qxmin(lr) .and. rcond == 2 )  &
9942      &     )) then
9943       ngscnt = ngscnt + 1
9944       igs(ngscnt) = ix
9945       kgs(ngscnt) = kz
9946       if ( ngscnt .eq. ngs ) goto 2100
9947       end if
9949       end do  !ix
9951       nxmpb = 1
9952       end do  !kz
9953 !      if ( jy .eq. (ny-jstag) ) iend = 1
9954  2100 continue
9956       if ( ngscnt .eq. 0 ) go to 29998
9958       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_DR: dbg = 8'
9959       
9960 !      write(0,*) 'NUCOND: dbg = 8, ngscnt,ssmx = ',ngscnt,ssmx
9962       
9963       qx(:,:) = 0.0
9964       cx(:,:) = 0.0
9965       zx(:,:) = 0.0
9967       xv(:,:) = 0.0
9968       xmas(:,:) = 0.0
9970       IF ( imurain == 1 ) THEN
9971         alpha(:,lr) = alphar
9972       ELSEIF ( imurain == 3 ) THEN
9973         alpha(:,lr) = xnu(lr)
9974       ENDIF
9977 !  define temporaries for state variables to be used in calculations
9979       DO mgs = 1,ngscnt
9980       qx(mgs,lv) = an(igs(mgs),jy,kgs(mgs),lv)
9981        DO il = lc,lhab
9982         qx(mgs,il) = max(an(igs(mgs),jy,kgs(mgs),il), 0.0)
9983        ENDDO
9985        qcwtmp(mgs) = qx(mgs,lc)
9988       theta0(mgs) = an(igs(mgs),jy,kgs(mgs),lt) !
9989       thetap(mgs) = 0.0
9990       theta(mgs) = an(igs(mgs),jy,kgs(mgs),lt)
9991       qv0(mgs) =  qx(mgs,lv)
9992       qwvp(mgs) = qx(mgs,lv) - qv0(mgs)
9994        pres(mgs) = pn(igs(mgs),jy,kgs(mgs)) + pb(kgs(mgs))
9995        pipert(mgs) = p2(igs(mgs),jy,kgs(mgs))
9996        rho0(mgs) = dn(igs(mgs),jy,kgs(mgs))
9997        rhoinv(mgs) = 1.0/rho0(mgs)
9998        rhovt(mgs) = Sqrt(rho00/rho0(mgs))
9999        pi0(mgs) = p2(igs(mgs),jy,kgs(mgs)) + pinit(kgs(mgs))
10000        temg(mgs) = t0(igs(mgs),jy,kgs(mgs))
10001 !       pk(mgs) = t77(igs(mgs),jy,kgs(mgs)) ! ( pres(mgs) / poo ) ** cap
10002        pk(mgs)   = p2(igs(mgs),jy,kgs(mgs)) + pinit(kgs(mgs)) ! t77(igs(mgs),jy,kgs(mgs))
10003        temcg(mgs) = temg(mgs) - tfr
10004        qss0(mgs) = (380.0)/(pres(mgs))
10005        pqs(mgs) = (380.0)/(pres(mgs))
10006        ltemq = (temg(mgs)-163.15)/fqsat+1.5
10007        ltemq = Min( nqsat, Max(1,ltemq) )
10008        qvs(mgs) = pqs(mgs)*tabqvs(ltemq)
10009        qis(mgs) = pqs(mgs)*tabqis(ltemq)
10011         qvap(mgs) = max( (qwvp(mgs) + qv0(mgs)), 0.0 )
10012         es(mgs) = 6.1078e2*tabqvs(ltemq)
10013         qss(mgs) = qvs(mgs)
10016         temgx(mgs) = min(temg(mgs),313.15)
10017         temgx(mgs) = max(temgx(mgs),233.15)
10018         felv(mgs) = 2500837.367 * (273.15/temgx(mgs))**((0.167)+(3.67e-4)*temgx(mgs))
10020         IF ( eqtset <= 1 ) THEN
10021           felvcp(mgs) = felv(mgs)*cpi
10022         ELSE ! equation set 2 in cm1
10023           tmp = qx(mgs,li)+qx(mgs,ls)+qx(mgs,lh)
10024           IF ( lhl > 1 ) tmp = tmp + qx(mgs,lhl)
10025           IF ( lf > 1 ) tmp = tmp + qx(mgs,lf)
10026           cvm = cv+cvv*qx(mgs,lv)+cpl*(qx(mgs,lc)+qx(mgs,lr))   &
10027                                   +cpigb*(tmp)
10028           cpm = cp+cpv*qx(mgs,lv)+cpl*(qx(mgs,lc)+qx(mgs,lr))   &
10029                                   +cpigb*(tmp)
10030           rmm=rd+rw*qx(mgs,lv)
10031           
10032           IF ( eqtset == 2 ) THEN
10034            felvcp(mgs) = (felv(mgs)-rw*temg(mgs))/cvm
10036           ELSE
10037             felvcp(mgs) = (felv(mgs)*cv/(cp) - rw*temg(mgs)*(1.0-rovcp*cpm/rmm))/cvm
10038             felvpi(mgs) = pi0(mgs)*rovcp*(felv(mgs)/(temg(mgs)) - rw*cpm/rmm)/cvm
10039           ENDIF
10041         ENDIF
10043         temcgx(mgs) = min(temg(mgs),273.15)
10044         temcgx(mgs) = max(temcgx(mgs),223.15)
10045         temcgx(mgs) = temcgx(mgs)-273.15
10046         felf(mgs) = 333690.6098 + (2030.61425)*temcgx(mgs) - (10.46708312)*temcgx(mgs)**2
10048         fels(mgs) = felv(mgs) + felf(mgs)
10049         fcqv1(mgs) = 4098.0258*felv(mgs)*cpi
10051       wvdf(mgs) = (2.11e-05)*((temg(mgs)/tfr)**1.94)* &
10052      &  (101325.0/(pb(kgs(mgs)) + pn(igs(mgs),jgs,kgs(mgs))))                            ! diffusivity of water vapor, Hall and Pruppacher (76)
10053       advisc(mgs) = advisc0*(416.16/(temg(mgs)+120.0))* &
10054      &  (temg(mgs)/296.0)**(1.5)                         ! dynamic viscosity (SMT; see Beard & Pruppacher 71)
10055       tka(mgs) = tka0*advisc(mgs)/advisc1                 ! thermal conductivity
10058       ENDDO
10063 ! load concentrations
10065       if ( ipconc .ge. 1 ) then
10066        do mgs = 1,ngscnt
10067         cx(mgs,li) = Max(an(igs(mgs),jy,kgs(mgs),lni), 0.0)
10068        end do
10069       end if
10070       if ( ipconc .ge. 2 ) then
10071        do mgs = 1,ngscnt
10072         cx(mgs,lc) = Max(an(igs(mgs),jy,kgs(mgs),lnc), 0.0)
10073         cwnccn(mgs) = cwccn*rho0(mgs)/rho00 ! background ccn count
10074         cn(mgs) = 0.0
10075         IF ( lss > 1 ) THEN 
10076           ssmax(mgs) = an(igs(mgs),jy,kgs(mgs),lss)
10077         ELSE
10078           ssmax(mgs) = 0.0
10079         ENDIF
10080         IF ( lccn .gt. 1 .and. ac_opt == 0 ) THEN
10081           IF ( lccnuf .gt. 1 .and. i_uf_or_ccn > 0 ) THEN
10082              ccnc(mgs) = an(igs(mgs),jy,kgs(mgs),lccn) + an(igs(mgs),jy,kgs(mgs),lccnuf)
10083           ELSE
10084              ccnc(mgs) = an(igs(mgs),jy,kgs(mgs),lccn)
10085           ENDIF
10086         ELSE
10087           ccnc(mgs) = cwnccn(mgs)
10088         ENDIF
10089         IF ( lccnuf .gt. 1 .and. i_uf_or_ccn == 0 ) THEN
10090           ccncuf(mgs) = an(igs(mgs),jy,kgs(mgs),lccnuf)
10091         ELSE
10092           ccncuf(mgs) = 0.0
10093         ENDIF
10094         cnuf(mgs) = 0.0
10095         IF ( lccna > 1 ) THEN
10096           ccna(mgs) = an(igs(mgs),jy,kgs(mgs),lccna) ! predicted count of activated ccn
10097         ELSE
10098           IF ( lccn > 1 ) THEN
10099             ccna(mgs) = cwnccn(mgs) - ccnc(mgs) ! diagnose activated ccn as background value - remaining unactivated ccn
10100           ELSE
10101             ccna(mgs) = cx(mgs,lc) ! approximation of number of activated ccn
10102           ENDIF
10103         ENDIF
10104        end do
10105       end if
10106       if ( ipconc .ge. 3 ) then
10107        do mgs = 1,ngscnt
10108         cx(mgs,lr) = Max(an(igs(mgs),jy,kgs(mgs),lnr), 0.0)
10109        end do
10110       end if
10112 !        cnuc(1:ngscnt) = cwccn*rho0(mgs)/rho00*(1. - renucfrac) + ccnc(1:ngscnt)*renucfrac
10113        DO mgs = 1,ngscnt
10114        ! default value of renucfrac is 0.0
10115         IF ( irenuc /= 6 ) THEN
10116         cnuc(mgs) = Max(ccnc(mgs),cwnccn(mgs))*(1. - renucfrac) + ccnc(mgs)*renucfrac
10117         ELSE
10118         cnuc(mgs) = Max(ccnc(mgs),cwnccn(mgs))*(1. - renucfrac) + Max(0.0,ccnc(mgs) - ccna(mgs))*renucfrac
10119         ENDIF
10120         IF ( renucfrac >= 0.999 ) THEN
10121           IF ( temg(mgs) < 265. ) THEN
10122             IF ( qx(mgs,lc) > 10.*qxmin(lc) .and. w(igs(mgs),jgs,kgs(mgs)) > 2.0 ) THEN
10123              cnuc(mgs) = 0.0 !  Min(cnuc(mgs), 0.5*cx(mgs,lc) ) ! Hack to reduce nucleation at low temp in updraft when ccn are not predicted
10124             ELSE
10125              cnuc(mgs) = 0.1*cnuc(mgs)
10126             ENDIF
10127           ENDIF
10128         ENDIF
10129        ENDDO
10131 !  Set density
10133       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_DR: Set density'
10135       do mgs = 1,ngscnt
10136         xdn(mgs,lc) = xdn0(lc)
10137         xdn(mgs,lr) = xdn0(lr)
10138       end do
10140       ventrx(:) = ventr
10141       ventrxn(:) = ventrn
10142       
10144 !  Find shape parameter rain
10146       IF ( lzr > 1 .and. rcond == 2 ) THEN ! { RAIN SHAPE PARAM
10147       DO mgs = 1,ngscnt
10148          zx(mgs,lr) = Max(an(igs(mgs),jy,kgs(mgs),lzr), 0.0)
10149       ENDDO
10151 !      CALL cld_cpu('Z-MOMENT-1r2')
10152           il = lr
10153           DO mgs = 1,ngscnt
10155          IF ( zx(mgs,il) <= zxmin ) THEN
10156            qx(mgs,lv) = qx(mgs,lv) + qx(mgs,il)
10157            qx(mgs,il) = 0.0
10158            cx(mgs,il) = 0.0
10159            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
10160            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
10161            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
10162          ELSEIF ( cx(mgs,il) <= 0.0 ) THEN
10163            qx(mgs,lv) = qx(mgs,lv) + qx(mgs,il)
10164            zx(mgs,il) = 0.0
10165            qx(mgs,il) = 0.0
10166            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
10167            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
10168            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
10169          ENDIF
10171          IF ( qx(mgs,lr) .gt. qxmin(lr) ) THEN
10173           xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*Max(1.0e-11,cx(mgs,lr)))
10174           IF ( xv(mgs,lr) .gt. xvmx(lr) ) THEN
10175             xv(mgs,lr) = xvmx(lr)
10176             cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmx(lr)*xdn(mgs,lr))
10177           ELSEIF ( xv(mgs,lr) .lt. xvmn(lr) ) THEN
10178             xv(mgs,lr) = xvmn(lr)
10179             cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmn(lr)*xdn(mgs,lr))
10180           ENDIF
10182           IF ( zx(mgs,il) > 0.0 .and. cx(mgs,il) <= 0.0 ) THEN
10183 !  have mass and reflectivity but no concentration, so set concentration, using default alpha
10184             IF ( imurain == 3 ) THEN
10185             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
10186             z1   = zx(mgs,il)
10187             qr  = qx(mgs,il)
10188             cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(z1*1000.*1000)
10189             ELSE
10190             g1 = 36.*(6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
10191      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il))*pi**2)
10192             z1   = zx(mgs,il)
10193             qr  = qx(mgs,il)
10194             cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(z1*1000.*1000)
10195             
10196             ENDIF
10197 !            an(igs(mgs),jgs,kgs(mgs),ln(il)) = zx(mgs,il)
10198            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) > 0.0 ) THEN
10199 !  have mass and concentration but no reflectivity, so set reflectivity, using default alpha
10200             IF ( imurain == 3 ) THEN
10201             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
10202             chw = cx(mgs,il)
10203             qr  = qx(mgs,il)
10204             zx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(chw*1000.*1000)
10205             ELSE
10206             g1 = 36.*(6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
10207      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il))*pi**2)
10208             chw = cx(mgs,il)
10209             qr  = qx(mgs,il)
10210             zx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(chw*1000.*1000)
10211             
10212             ENDIF
10214            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) <= 0.0 ) THEN
10215 !   How did this happen?
10216          ! set values according to dBZ of -10, or Z = 0.1
10217 !              0.1 = 1.e18*0.224*an(ix,jy,kz,lzh)*(hwdn/rwdn)**2
10218                zx(mgs,il) = 1.e-19/0.224*(xdn0(lr)/xdn0(il))**2
10219                an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
10220                
10221               IF ( imurain == 3 ) THEN
10222                g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
10223                z1   = zx(mgs,il)
10224                qr  = qx(mgs,il)
10225                cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(z1*1000.*1000)
10226                an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
10227               ELSEIF ( imurain == 1 ) THEN
10228                g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
10229      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
10230                z1   = zx(mgs,il)
10231                qr  = qx(mgs,il)
10232                cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(6*qr)**2/(z1*(pi*xdn(mgs,il))**2)
10233                an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
10234               
10235               ENDIF
10236           ENDIF
10237         
10238           IF ( zx(mgs,lr) > 0.0 ) THEN
10239             vr = rho0(mgs)*qx(mgs,lr)/(1000.*cx(mgs,lr))
10240 !            z1 = 36.*(alpha(kz)+2.0)*a(ix,jy,kz,lnr)*vr**2/((alpha(kz)+1.0)*pi**2)
10241            qr = qx(mgs,lr)
10242            nrx = cx(mgs,lr)
10243            z1 = zx(mgs,lr)
10245 !           xv = (db(1,kz)*a(1,1,kz,lr))**2/(a(1,1,kz,lnr))
10246 !           rd = z1*(pi/6.*1000.)**2/xv
10249 ! determine shape parameter alpha by iteration
10250         IF ( z1 .gt. 0.0 ) THEN
10252           IF ( imurain == 3 ) THEN
10253            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z1*pi**2) - 1.
10254 !           write(0,*) 'kz, alp, alpha(kz) = ',kz,alp,alpha(kz),rd,z1,xv
10255            DO i = 1,20
10256             IF ( Abs(alp - alpha(mgs,lr)) .lt. 0.01 ) EXIT
10257              alpha(mgs,lr) = Max( rnumin, Min( rnumax, alp ) )
10258            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z1*pi**2) - 1.
10259 !           write(0,*) 'i,alp = ',i,alp
10260              alp = Max( rnumin, Min( rnumax, alp ) )
10261            ENDDO
10263          ELSE ! imurain == 1
10264             g1 = 36.*(6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
10265      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il))*pi**2)
10267             rd1 = z1*(pi/6.*xdn(mgs,il))**2*nrx/(rho0(mgs)*qr)**2
10269            alp = (6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/ &
10270      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rd1) - 1.0
10272            DO i = 1,10
10273             IF ( Abs(alp - alpha(mgs,il)) .lt. 0.01 ) EXIT
10274              alpha(mgs,il) = Max( alphamin, Min( alphamax, alp ) )
10276              alp = (6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/ &
10277      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rd1) - 1.0
10279              alp = Max( alphamin, Min( alphamax, alp ) )
10280            ENDDO
10282          
10283          ENDIF
10284 !         ENDIF
10287 ! Check whether the shape parameter is at or less than the minimum, and if it is, reset the 
10288 ! concentration or reflectivity to match (prevents reflectivity from being out of balance with Q and N)
10290           IF ( imurain == 3 ) THEN
10291            IF ( .true. .and. (alpha(mgs,il) <= rnumin .or. alp == rnumin .or. alp == rnumax) ) THEN
10293              IF ( rescale_high_alpha .and. alp >= rnumax - 0.01  ) THEN  ! reset c at high alpha to prevent growth in Z
10294                g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
10295                cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z1*(1./(xdn(mgs,il)))**2
10296                an(igs(mgs),jy,kgs(mgs),ln(il)) = cx(mgs,il)
10297             
10298              ELSEIF ( rescale_low_alphar .and. alp <= rnumin ) THEN
10300               z1  = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/((alpha(mgs,lr)+1.0)*pi**2)
10301               zx(mgs,il) = z1
10302              ENDIF
10303            ENDIF
10304            
10305           ELSEIF ( imurain == 1 ) THEN
10306           
10307              g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
10308      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
10310            IF ( (rescale_low_alpha .or. rescale_high_alpha ) .and.  &
10311      &          ( alpha(mgs,il) <= alphamin .or. alp == alphamin .or. alp == alphamax ) ) THEN
10315             IF ( rescale_high_alpha .and. alp >= alphamax - 0.01  ) THEN  ! reset c at high alpha to prevent growth in Z
10316               cx(mgs,il) = g1*rho0(mgs)**2*(qr)*qr/zx(mgs,lr)*(6./(pi*xdn(mgs,il)))**2
10317               an(igs(mgs),jy,kgs(mgs),ln(il)) = cx(mgs,il)
10318             
10319             ELSEIF ( rescale_low_alpha .and. alp <= alphamin ) THEN ! alpha = alphamin, so reset Z to prevent growth in C
10320              z1 = g1*rho0(mgs)**2*(qr)*qr/nrx
10321              z2  = z1*(6./(pi*xdn(mgs,il)))**2
10322              zx(mgs,il) = z2
10323              an(igs(mgs),jy,kgs(mgs),lz(il)) = z2
10324             ENDIF
10325           ENDIF ! imurain
10327           ENDIF ! z > 0
10329            tmp = alpha(mgs,lr) + 4./3.
10330            i = Int(dgami*(tmp))
10331            del = tmp - dgam*i
10332            x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
10334            tmp = alpha(mgs,lr) + 1.
10335            i = Int(dgami*(tmp))
10336            del = tmp - dgam*i
10337            y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
10339 !           ventrx(mgs) = Gamma(alpha(mgs,lr) + 4./3.)/(alpha(mgs,lr) + 1.)**(1./3.)/Gamma(alpha(mgs,lr) + 1.)
10340            ventrx(mgs) = x/(y*(alpha(mgs,lr) + 1.)**(1./3.))
10342            IF ( imurain == 3 .and. izwisventr == 2 ) THEN
10344            tmp = alpha(mgs,lr) + 1.5 + br/6.
10345            i = Int(dgami*(tmp))
10346            del = tmp - dgam*i
10347            x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
10349 !           ventrx(mgs) = Gamma(alpha(mgs,lr) + 1.5 + br/6.)/Gamma(alpha(mgs,lr) + 1.)
10350            ventrxn(mgs) = x/(y*(alpha(mgs,lr) + 1.)**((1.+br)/6. + 1./3.))
10351            
10352            ELSEIF ( imurain == 1 .and.  iferwisventr == 2 ) THEN
10354            tmp = alpha(mgs,lr) + 2.5 + br/2.
10355            i = Int(dgami*(tmp))
10356            del = tmp - dgam*i
10357            x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
10359 !           ventrx(mgs) = Gamma(alpha(mgs,lr) + 1.5 + br/6.)/Gamma(alpha(mgs,lr) + 1.)
10360            ventrxn(mgs) = x/y
10361            
10362            
10363            ENDIF
10365            
10366            ENDIF
10367           ENDIF
10368           
10369           ENDIF
10370           
10371           ENDDO
10372 !        CALL cld_cpu('Z-MOMENT-1r2')  
10373         ENDIF ! }
10376 !       write(0,*) 'NUCOND: Set ssf variables, ssmxinit =',ssmxinit
10377       ssmx = 0.0
10378       DO mgs = 1,ngscnt
10379       
10380       kp1 = Min(nz, kgs(mgs)+1 )
10381       wvel(mgs) = (0.5)*(w(igs(mgs),jgs,kp1) & 
10382      &                  +w(igs(mgs),jgs,kgs(mgs)))
10383       wvelkm1(mgs) = (0.5)*(w(igs(mgs),jgs,kgs(mgs)) & 
10384      &                  +w(igs(mgs),jgs,Max(1,kgs(mgs)-1)))
10386       ssat0(mgs)  = ssfilt(igs(mgs),jgs,kgs(mgs))
10387       ssf(mgs)    = ssfilt(igs(mgs),jgs,kgs(mgs))
10388 !      ssmx = Max( ssmx, ssf(mgs) )
10390       
10391       ssfkp1(mgs) = ssfilt(igs(mgs),jgs,Min(nz-1,kgs(mgs)+1))
10392       ssfkm1(mgs) = ssfilt(igs(mgs),jgs,Max(1,kgs(mgs)-1))
10394 !        IF ( wvel(mgs) /= 0.0 ) write(0,*) 'mgs,wvel1,ssf = ',mgs,wvel(mgs),ssf(mgs)
10397       ENDDO
10402 !  cloud water variables
10405       if ( ndebug .gt. 0 ) write(0,*) 'ICEZVD_DR: Set cloud water variables'
10407       do mgs = 1,ngscnt
10408       xv(mgs,lc) = 0.0
10409       IF ( ipconc .ge. 2 .and. cx(mgs,lc) .gt. 1.0e6 ) THEN
10410         xmas(mgs,lc) = &
10411      &    min( max(qx(mgs,lc)*rho0(mgs)/cx(mgs,lc),cwmasn),cwmasx )
10412         xv(mgs,lc) = xmas(mgs,lc)/xdn(mgs,lc)
10413       ELSE
10414        IF ( qx(mgs,lc) .gt. qxmin(lc) .and. cx(mgs,lc) .gt. cxmin ) THEN
10415         xmas(mgs,lc) = &
10416      &     min( max(qx(mgs,lc)*rho0(mgs)/cx(mgs,lc),xdn(mgs,lc)*xvmn(lc)), &
10417      &      xdn(mgs,lc)*xvmx(lc) )
10419         cx(mgs,lc) = qx(mgs,lc)*rho0(mgs)/xmas(mgs,lc)
10421        ELSEIF ( qx(mgs,lc) .gt. qxmin(lc) .and. cx(mgs,lc) .le. cxmin ) THEN
10422 !        xmas(mgs,lc) = xdn(mgs,lc)*4.*pi/3.*(5.0e-6)**3
10423 !        cx(mgs,lc) = rho0(mgs)*qx(mgs,lc)/xmas(mgs,lc)
10424         cx(mgs,lc) = Max( cxmin, rho0(mgs)*qx(mgs,lc)/cwmasx )
10425         xmas(mgs,lc) =  &
10426      &    min( max(qx(mgs,lc)*rho0(mgs)/cx(mgs,lc),cwmasn),cwmasx )
10427         xv(mgs,lc) = xmas(mgs,lc)/xdn(mgs,lc)
10429        ELSE
10430         xmas(mgs,lc) = cwmasn
10431        ENDIF
10432       ENDIF
10433       xdia(mgs,lc,1) = (xmas(mgs,lc)*cwc1)**c1f3
10436       end do
10438 ! rain
10440       do mgs = 1,ngscnt
10441       if ( qx(mgs,lr) .gt. qxmin(lr) ) then
10443       if ( ipconc .ge. 3 ) then
10444         xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*Max(1.0e-9,cx(mgs,lr)))
10445 !      parameter( xvmn(lr)=2.8866e-13, xvmx(lr)=4.1887e-9 )  ! mks
10446         IF ( xv(mgs,lr) .gt. xvmx(lr) ) THEN
10447           xv(mgs,lr) = xvmx(lr)
10448           cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmx(lr)*xdn(mgs,lr))
10449         ELSEIF ( xv(mgs,lr) .lt. xvmn(lr) ) THEN
10450           xv(mgs,lr) = xvmn(lr)
10451           cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmn(lr)*xdn(mgs,lr))
10452         ENDIF
10454         xmas(mgs,lr) = xv(mgs,lr)*xdn(mgs,lr)
10455         xdia(mgs,lr,3) = (xmas(mgs,lr)*cwc1)**(1./3.) ! xdia(mgs,lr,1)
10456         IF ( imurain == 3 ) THEN
10457 !          xdia(mgs,lr,1) = (6.*pii*xv(mgs,lr)/(alpha(mgs,lr)+1.))**(1./3.)
10458           xdia(mgs,lr,1) = xdia(mgs,lr,3) ! formulae for Ziegler (1985) use mean volume diameter, not lambda**(-1)
10459         ELSE ! imurain == 1, Characteristic diameter (1/lambda)
10460           xdia(mgs,lr,1) = (6.*piinv*xv(mgs,lr)/((alpha(mgs,lr)+3.)*(alpha(mgs,lr)+2.)*(alpha(mgs,lr)+1.)))**(1./3.)
10461         ENDIF
10462 !        rwrad(mgs) = 0.5*xdia(mgs,lr,1)
10464 ! Inverse exponential version:
10465 !        xdia(mgs,lr,1) =
10466 !     >  (qx(mgs,lr)*rho0(mgs)
10467 !     > /(pi*xdn(mgs,lr)*cx(mgs,lr)))**(0.333333)
10468       ELSE
10469         xdia(mgs,lr,1) = &
10470      &  (qx(mgs,lr)*rho0(mgs)/(pi*xdn(mgs,lr)*cno(lr)))**(0.25)
10471       end if
10472       else
10473         xdia(mgs,lr,1) = 1.e-9
10474 !        rwrad(mgs) = 0.5*xdia(mgs,lr,1)
10475       end if
10477       end do
10481 !  Ventilation coefficients
10483       do mgs = 1,ngscnt
10486       fadvisc(mgs) = advisc0*(416.16/(temg(mgs)+120.0))* & 
10487      &  (temg(mgs)/296.0)**(1.5)
10489       fakvisc(mgs) = fadvisc(mgs)*rhoinv(mgs)
10491       fwvdf(mgs) = (2.11e-05)*((temg(mgs)/tfr)**1.94)* & 
10492      &  (101325.0/(pres(mgs)))
10493       
10494       fschm(mgs) = (fakvisc(mgs)/fwvdf(mgs))
10496       fvent(mgs) = (fschm(mgs)**(1./3.)) * (fakvisc(mgs)**(-0.5))
10498       end do
10501 !  Ziegler nucleation 
10504 ! cloud evaporation, condensation, and nucleation
10505 !  sqsat -> qss(mgs)
10507       DO mgs=1,ngscnt
10508         dcloud = 0.0
10509         ! Skip points at low temperature if SS stays less than 1.08, 
10510         ! otherwise allow nucleation at low temp (will freeze at next time step)
10511         IF ( temg(mgs) .le. tfrh .and. qx(mgs,lv)/qvs(mgs) < maxlowtempss ) THEN 
10512          CYCLE
10513         ENDIF
10515       IF( ssat0(mgs) .GT. 0. .OR. ssf(mgs) .GT. 0. ) GO TO 620
10516 !6/4      IF( qvap(mgs) .EQ. qss(mgs) ) GO TO 631
10518 !.... EVAPORATION. QV IS LESS THAN qss(mgs).
10519 !.... EVAPORATE CLOUD FIRST
10521       IF ( qx(mgs,lc) .LE. 0. ) GO TO 631
10522 !.... CLOUD EVAPORATION.
10523 ! convert input 'cp' to cgs
10524       R1=1./(1. + caw*(273.15 - cbw)*qss(mgs)*felv(mgs)/ &
10525      &            (cp*(temg(mgs) - cbw)**2))
10526       QEVAP= Min( qx(mgs,lc), R1*(qss(mgs)-qvap(mgs)) )
10529       IF ( qx(mgs,lc) <= QEVAP ) THEN ! GO TO 63
10530         qwvp(mgs) = qwvp(mgs) + qx(mgs,lc)
10531         thetap(mgs) = thetap(mgs) - felvcp(mgs)*qx(mgs,lc)/(pi0(mgs))
10532         IF ( io_flag .and. nxtra > 1 ) THEN
10533            axtra(igs(mgs),jy,kgs(mgs),1) = -qx(mgs,lc)/dtp
10534         ENDIF
10535         qx(mgs,lc) = 0.
10536         IF ( restoreccn ) THEN
10537            IF ( lccna > 1 ) THEN
10538               ccna(mgs) = ccna(mgs) - restoreccnfrac*cx(mgs,lc)
10539            ELSEIF ( irenuc <= 2 ) THEN
10540               IF ( .not. invertccn ) THEN
10541                ccnc(mgs) = Max( ccnc(mgs), Min( qccn*rho0(mgs), ccnc(mgs) + restoreccnfrac*cx(mgs,lc) ) )
10542               ELSE
10543                ccnc(mgs) = ccnc(mgs) + restoreccnfrac*cx(mgs,lc)
10544               ENDIF
10545           ENDIF
10546         ENDIF
10547         cx(mgs,lc) = 0.
10548       ELSE
10549         qctmp = qx(mgs,lc)
10550         qwvp(mgs) = qwvp(mgs) + QEVAP
10551         qx(mgs,lc) = qx(mgs,lc) - QEVAP
10552         IF ( qx(mgs,lc) .le. 0. ) THEN
10553           IF ( restoreccn ) THEN
10554             IF ( lccna > 1 ) THEN
10555               ccna(mgs) = ccna(mgs) - restoreccnfrac*cx(mgs,lc)
10556             ELSEIF ( irenuc <= 2 ) THEN
10557 !              ccnc(mgs) = Max( ccnc(mgs), Min( qccn*rho0(mgs), ccnc(mgs) + cx(mgs,lc) ) )
10558 !              ccnc(mgs) = ccnc(mgs) + cx(mgs,lc)
10559               IF ( .not. invertccn ) THEN
10560                ccnc(mgs) = Max( ccnc(mgs), Min( qccn*rho0(mgs), ccnc(mgs) + restoreccnfrac*cx(mgs,lc) ) )
10561               ELSE
10562                ccnc(mgs) = ccnc(mgs) + restoreccnfrac*cx(mgs,lc)
10563               ENDIF
10564             ENDIF
10565           ENDIF
10566           cx(mgs,lc) = 0.
10567         ELSE
10568           tmp = 0.9*QEVAP*cx(mgs,lc)/qctmp ! let droplets get smaller but also remove some. A factor of 1.0 would maintain same size
10569           IF ( restoreccn ) THEN
10570             IF ( lccna > 1 ) THEN
10571               ccna(mgs) = ccna(mgs) - restoreccnfrac*tmp
10572             ELSEIF ( irenuc <= 2 ) THEN
10573  !             ccnc(mgs) = Max( ccnc(mgs), Min( qccn*rho0(mgs), ccnc(mgs) + tmp ) )
10574 !              ccnc(mgs) = ccnc(mgs) + tmp
10575               IF ( .not. invertccn ) THEN
10576                ccnc(mgs) = Max( ccnc(mgs), Min( qccn*rho0(mgs), ccnc(mgs) + restoreccnfrac*tmp ) )
10577               ELSE
10578                ccnc(mgs) = ccnc(mgs) + restoreccnfrac*tmp
10579               ENDIF
10580             ENDIF
10581           ENDIF
10582           cx(mgs,lc) = cx(mgs,lc) - tmp
10583         ENDIF
10584         thetap(mgs) = thetap(mgs) - felvcp(mgs)*QEVAP/(pi0(mgs))
10585         IF ( io_flag .and. nxtra > 1 ) THEN
10586            axtra(igs(mgs),jy,kgs(mgs),1) = -QEVAP/dtp
10587         ENDIF
10589       ENDIF
10591       GO TO 631
10594   620 CONTINUE
10596 !.... CLOUD CONDENSATION
10598         IF ( qx(mgs,lc) .GT. qxmin(lc) .and. cx(mgs,lc) .ge. 1. ) THEN
10602 !       ac1 =  xdn(mgs,lc)*elv(kgs(mgs))**2*epsi/
10603 !     :        (tka(kgs(mgs))*rw*temg(mgs)**2)
10604 ! took out xdn factor because it cancels later...
10605        ac1 =  felv(mgs)**2/(tka(mgs)*rw*temg(mgs)**2)
10608 !       bc = xdn(mgs,lc)*rw*temg(mgs)/
10609 !     :       (epsi*wvdf(kgs(mgs))*es(mgs))
10610 ! took out xdn factor because it cancels later...
10611        bc =   rw*temg(mgs)/(wvdf(mgs)*es(mgs))
10613 !       bs = rho0(mgs)*((rd*temg(mgs)/(epsi*es(mgs)))+
10614 !     :             (epsi*elv(kgs(mgs))**2/(pres(mgs)*temg(mgs)*cp)))
10616 !       taus = Min(dtp, xdn(mgs,lc)*rho0(mgs)*(ac1+bc)/
10617 !     :        (4*pi*0.89298*BS*0.5*xdia(mgs,lc,1)*cx(mgs,lc)*xdn(mgs,lc)))
10620       IF ( ssf(mgs) .gt. 0.0 .or. ssat0(mgs) .gt. 0.0 ) THEN
10621        IF ( ny .le. 2 ) THEN
10622 !        write(0,*)  'undershoot: ',ssf(mgs),
10623 !     :   ( (qx(mgs,lv) - dcloud)/c1 - 1.0)*100.
10624        ENDIF
10628        IF ( qx(mgs,lc) .gt. qxmin(lc) ) THEN
10630          IF ( xdia(mgs,lc,1) .le. 0.0 ) THEN
10631           xmas(mgs,lc) = cwmasn
10632           xdia(mgs,lc,1) = (xmas(mgs,lc)*cwc1)**c1f3
10633          ENDIF
10634         d1 = (1./(ac1 + bc))*4.0*pi*ventc &
10635      &        *0.5*xdia(mgs,lc,1)*cx(mgs,lc)*rhoinv(mgs)
10637        ELSE
10638          d1 = 0.0
10639        ENDIF
10641        IF ( rcond .eq. 2 .and. qx(mgs,lr) .gt. qxmin(lr) .and. cx(mgs,lr) > 1.e-9 ) THEN
10642           IF ( imurain == 3 ) THEN
10643            IF ( izwisventr == 1 ) THEN
10644             rwvent(mgs) = ventrx(mgs)*(1.6 + 124.9*(1.e-3*rho0(mgs)*qx(mgs,lr))**.2046)
10645            ELSE ! izwisventr = 2
10646 !  Following Wisner et al. (1972) but using gamma of volume. Note that Ferrier rain fall speed does not integrate with gamma of volume, so using Vr = ar*d^br
10647           rwvent(mgs) =   &
10648      &  (0.78*ventrx(mgs) + 0.308*ventrxn(mgs)*fvent(mgs)   &
10649      &   *Sqrt((ar*rhovt(mgs)))   &
10650      &    *(xdia(mgs,lr,1)**((1.0+br)/2.0)) )
10651            ENDIF
10653           ELSE ! imurain == 1
10655            IF ( iferwisventr == 1 ) THEN
10656              alpr = Min(alpharmax,alpha(mgs,lr) )
10657 !             alpr = alpha(mgs,lr)
10658              x =  1. + alpr
10660               tmp = 1 + alpr
10661               i = Int(dgami*(tmp))
10662               del = tmp - dgam*i
10663               g1palp = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
10665               tmp = 2.5 + alpr + 0.5*bx(lr)
10666               i = Int(dgami*(tmp))
10667               del = tmp - dgam*i
10668               y = (gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami)/g1palp ! ratio of gamma functions
10670 !         vent1 = dble(xdia(mgs,lr,1))**(-2. - alpr) ! Actually OK
10671 !         vent2 = dble(1./xdia(mgs,lr,1) + 0.5*fx(lr))**dble(2.5+alpr+0.5*bx(lr))  ! Actually OK
10672          vent1 = dble(xdia(mgs,lr,1))**(0.5 + 0.5*bx(lr)) ! 2016.2.26 Changed for consistency with derivation (recast formula)
10673          vent2 = dble(1. + 0.5*fx(lr)*xdia(mgs,lr,1))**dble(2.5+alpr+0.5*bx(lr))
10674         
10675         
10676         rwvent(mgs) =    &
10677      &    0.78*x +    &
10678      &    0.308*fvent(mgs)*y*   &
10679      &            Sqrt(ax(lr)*rhovt(mgs))*(vent1/vent2)
10681            ELSEIF ( iferwisventr == 2 ) THEN
10682           
10683 !  Following Wisner et al. (1972) but using gamma of volume. Note that Ferrier rain fall speed does not integrate with gamma of volume, so using Vr = ar*d^br
10684             x =  1. + alpha(mgs,lr)
10686             rwvent(mgs) =   &
10687      &        (0.78*x + 0.308*ventrxn(mgs)*fvent(mgs)   &
10688      &         *Sqrt((ar*rhovt(mgs)))   &
10689      &         *(xdia(mgs,lr,1)**((1.0+br)/2.0)) )
10691           
10692           ENDIF ! iferwisventr
10693           
10694        ENDIF ! imurain
10696        d1r = (1./(ac1 + bc))*4.0*pi*rwvent(mgs) & 
10697      &        *0.5*xdia(mgs,lr,1)*cx(mgs,lr)*rhoinv(mgs)
10698        ELSE
10699        d1r = 0.0
10700        ENDIF
10701        
10702        
10703        e1  = felvcp(mgs)/(pi0(mgs))
10704        f1 = pk(mgs) ! (pres(mgs)/poo)**cap
10707 !  fifth trial to see what happens:
10709        ltemq = (temg(mgs)-163.15)/fqsat+1.5
10710        ltemq = Min( nqsat, Max(1,ltemq) )
10711        ltemq1 = ltemq
10712        temp1 = temg(mgs)
10713        p380 = 380.0/pres(mgs)
10715 !       taus = Max( 0.05*dtp, Min(taus, 0.25*dtp ) )
10716 !       nc = NInt(dtp/Min(1.0,0.5*taus))
10717 !       dtcon = dtp/float(nc)
10718        ss1 = qx(mgs,lv)/qvs(mgs)
10719        ss2 = ss1
10720        temp2 = temp1
10721        qv1 = qx(mgs,lv)
10722        qvs1 = qvs(mgs)
10723        qis1 = qis(mgs)
10724        dt1 = 0.0
10727 !          dtcon = Max(dtcon,0.2)
10728 !          nc = Nint(dtp/dtcon)
10730        ltemq1 = ltemq
10731 ! want to start out with a small time step to handle the steep slope
10732 ! and fast changes, then can switch to a larger step (dtcon2) for the
10733 ! rest of the big time step.
10734 ! base the initial time step (dtcon1) on the slope (delta)
10735        IF ( Abs(ss1 - 1.0) .gt. 1.e-5 ) THEN
10736          delta = 0.5*(qv1-qvs1)/(d1*(ss1 - 1.0))
10737        ELSE
10738          delta = 0.1*dtp
10739        ENDIF
10740 ! delta is the extrapolated time to get halfway from qv1 to qvs1
10741 ! want at least 5 time steps to the halfway point, so multiply by 0.2
10742 ! for the initial time step
10743        dtcon1 = Min(0.05,0.2*delta)
10744        nc = Max(5,2*NInt( (dtp-4.0*dtcon1)/delta))
10745        dtcon2 = (dtp-4.0*dtcon1)/nc
10747        n = 1
10748        dt1 = 0.0
10749        nc = 0
10750        dqc = 0.0
10751        dqr = 0.0
10752        dqi = 0.0
10753        dqs = 0.0
10754        dqvii = 0.0
10755        dqvis = 0.0
10757        RK2c: DO WHILE ( dt1 .lt. dtp )
10758           nc = 0
10759           IF ( n .le. 4 ) THEN
10760             dtcon = dtcon1
10761           ELSE
10762             dtcon = dtcon2
10763           ENDIF
10764  609       dqv  = -(ss1 - 1.)*d1*dtcon
10765            dqvr = -(ss1 - 1.)*d1r*dtcon
10766             dtemp = -0.5*e1*f1*(dqv + dqvr)
10767 !          write(0,*) 'RK2c dqv1 = ',dqv
10768 ! calculate midpoint values:
10769      !      ltemq1m = ltemq1 + Nint(dtemp*fqsat + 0.5)
10771          ! 7.6.2016: Test full calc of ltemq
10772            ltemq1m = (temp1+dtemp-163.15)*fqsati+1.5
10773            ltemq1m = Min( nqsat, Max(1,ltemq1m) )
10775            IF ( ltemq1m .lt. 1 .or. ltemq1m .gt. nqsat ) THEN
10776              write(0,*) 'STOP in nucond line 1192 '
10777              write(0,*) ' ltemq1m,icond = ',ltemq1m,icond
10778              write(0,*) ' dtemp,e1,f1,dqv,dqvr = ', dtemp,e1,f1,dqv,dqvr
10779              write(0,*) ' d1,d1r,dtcon,ss1 = ',d1,d1r,dtcon,ss1
10780              write(0,*) ' dqc, dqr = ',dqc,dqr
10781              write(0,*) ' qv,qc,qr = ',qx(mgs,lv)*1000.,qx(mgs,lc)*1000.,qx(mgs,lr)*1000.
10782              write(0,*) ' i, j, k = ',igs(mgs),jy,kgs(mgs)
10783              write(0,*) ' dtcon1,dtcon2,delta = ',dtcon1,dtcon2,delta
10784              write(0,*) ' nc,dtp = ',nc,dtp
10785              write(0,*) ' rwvent,xdia,crw,ccw = ', rwvent(mgs),xdia(mgs,lr,1),cx(mgs,lr),cx(mgs,lc)
10786              write(0,*) ' fvent,alphar = ',fvent(mgs),alpha(mgs,lr)
10787              write(0,*) ' xvr,xmasr,xdnr,cwc1 = ',xv(mgs,lr),xmas(mgs,lr),xdn(mgs,lr),cwc1
10788            ENDIF
10789             dqvs = dtemp*p380*dtabqvs(ltemq1m)
10790             qv1m = qv1 + dqv + dqvr
10791 !          qv1mr = qv1r + dqvr
10793             qvs1m = qvs1 + dqvs
10794             ss1m = qv1m/qvs1m
10796     ! check for undersaturation when no ice is present, if so, then reduce time step
10797           IF ( ss1m .lt. 1.  .and. (dqvii + dqvis) .eq. 0.0 ) THEN
10798             dtcon = (0.5*dtcon)
10799             IF ( dtcon .ge. dtcon1 ) THEN
10800              GOTO 609
10801             ELSE
10802              EXIT
10803             ENDIF
10804           ENDIF
10805 ! calculate full step:
10806           dqv  = -(ss1m - 1.)*d1*dtcon
10807           dqvr = -(ss1m - 1.)*d1r*dtcon
10810 !          write(0,*) 'RK2a dqv1m = ',dqv
10811           dtemp = -e1*f1*(dqv + dqvr)
10812           
10813          ! ltemq1 = ltemq1 + Nint(dtemp*fqsat + 0.5)
10815          ! 7.6.2016: Test full calc of ltemq
10816            ltemq1 = (temp1+dtemp-163.15)*fqsati+1.5
10817            ltemq1 = Min( nqsat, Max(1,ltemq1) )
10819            IF ( ltemq1 .lt. 1 .or. ltemq1 .gt. nqsat ) THEN
10820              write(0,*) 'STOP in nucond line 1230 '
10821              write(0,*) ' ltemq1m,icond = ',ltemq1m,icond
10822              write(0,*) ' dtemp,e1,dqv,dqvr = ', dtemp,e1,dqv,dqvr
10823            ENDIF
10824           dqvs = dtemp*p380*dtabqvs(ltemq1)
10826           qv1 = qv1 + dqv + dqvr
10828           dqc = dqc - dqv
10829           dqr = dqr - dqvr
10831           qvs1 = qvs1 + dqvs
10832           ss1 = qv1/qvs1
10833           temp1 = temp1 + dtemp
10834           IF ( temp2 .eq. temp1 .or. ss2 .eq. ss1 .or.  &
10835      &           ss1 .eq. 1.00 .or.  &
10836      &      ( n .gt. 10 .and. ss1 .lt. 1.0005 ) ) THEN
10837 !           write(0,*) 'RK2c break'
10838            EXIT
10839           ELSE
10840            ss2 = ss1
10841            temp2 = temp1
10842            dt1 = dt1 + dtcon
10843            n = n + 1
10844           ENDIF
10845        ENDDO RK2c
10848         dcloud = dqc ! qx(mgs,lv) - qv1
10849         thetap(mgs) = thetap(mgs) + e1*(DCLOUD + dqr)
10852         IF ( eqtset > 2 ) THEN
10853            pipert(mgs) = pipert(mgs) + felvpi(mgs)*(DCLOUD + dqr)
10854         ENDIF
10855         IF ( io_flag .and. nxtra > 1 ) THEN
10856            axtra(igs(mgs),jy,kgs(mgs),1) = DCLOUD/dtp
10857            axtra(igs(mgs),jy,kgs(mgs),2) = axtra(igs(mgs),jy,kgs(mgs),2) + dqr/dtp
10858         ENDIF
10859         qwvp(mgs) = qwvp(mgs) - (DCLOUD + dqr)
10860         qx(mgs,lc) = qx(mgs,lc) + DCLOUD
10861         qx(mgs,lr) = qx(mgs,lr) + dqr
10862 !        t9(igs(mgs),jy,kgs(mgs)) = t9(igs(mgs),jy,kgs(mgs)) + (DCLOUD + dqr)/dtp*felv(mgs)/(cp*pi0(mgs)) !* &
10863 !!     &                 dx*dy*dz3d(igs(mgs),jy,kgs(mgs))
10866         IF ( lzr > 1 .and. rcond == 2 .and. qx(mgs,lr) .gt. qxmin(lr)   &
10867      &       .and. cx(mgs,lr) .gt. 1.e-9 ) THEN
10868           tmp = qx(mgs,lr)/cx(mgs,lr)
10869           IF ( imurain == 3 ) THEN
10870           g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
10871           ELSE
10872             g1 = 36.*(6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
10873      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il))*pi**2)
10874           
10875           ENDIF
10876           zx(mgs,lr) = zx(mgs,lr) + g1*(rho0(mgs)/(xdn(mgs,lr)))**2*( 2.*( tmp ) * dqr )
10877         ENDIF
10879         theta(mgs) = thetap(mgs) + theta0(mgs)
10880         temg(mgs) = theta(mgs)*f1
10881         ltemq = (temg(mgs)-163.15)/fqsat+1.5
10882         ltemq = Min( nqsat, Max(1,ltemq) )
10883         qvs(mgs) = pqs(mgs)*tabqvs(ltemq)
10884 !        es(mgs) = 6.1078e2*tabqvs(ltemq)
10888       ENDIF  ! dcloud .gt. 0.
10891       ELSE  ! qc .le. qxmin(lc)
10893 !        IF ( ssf(mgs) .gt. 0.0 .and. .not. flag_qndrop ) THEN ! flag_qndrop turns off primary nucleation when using wrf-chem with progn=1
10894         IF ( ssf(mgs) .gt. 0.0 ) THEN ! .and.  ssmax(mgs) .lt. sscb ) THEN ! except that wrf-chem does not seem to initialize qc for activated aerosols, so keep this, after all
10896           IF ( iqcinit == 1 ) THEN
10898          qvs0   = 380.*exp(17.27*(temg(mgs)-273.)/(temg(mgs)- 36.))/pk(mgs)
10900          dcloud = Max(0.0, (qx(mgs,lv)-qvs0) / (1.+qvs0*f5/(temg(mgs)-36.)**2) )
10902           ELSEIF ( iqcinit == 3 ) THEN
10903               R1=1./(1. + caw*(273.15 - cbw)*qss(mgs)*felvcp(mgs)/ & 
10904      &             ((temg(mgs) - cbw)**2))
10905             DCLOUD=R1*(qvap(mgs) - qvs(mgs))  ! KW model adjustment; 
10906                               ! this will put mass into qc if qv > sqsat exists
10907           
10908           ELSEIF ( iqcinit == 2 ) THEN
10909 !              R1=1./(1. + caw*(273.15 - cbw)*qss(mgs)*felv(mgs)/
10910 !     :             (cp*(temg(mgs) - cbw)**2))
10911 !            DCLOUD=R1*(qvap(mgs) - qvs(mgs))  ! KW model adjustment; 
10912                               ! this will put mass into qc if qv > sqsat exists
10913          ssmx = ssmxinit
10915 !          IF ( ssf(mgs) > ssmx  .and. ssmax(mgs) < 3.0 ) THEN
10916 !          IF ( ssf(mgs) > ssmx  .and. ccnc(mgs) > 1.0 ) THEN
10917 !          IF ( ssf(mgs) > ssmx  .and. ssf(mgs) < 5.0 .and. ccnc(mgs) > 0.1*cwnccn(mgs) ) THEN ! this one works
10918 !          IF ( ssf(mgs) > ssmx  .and. ssf(mgs) < 20.0 ) THEN ! test -- fails
10919 !          IF ( ssf(mgs) > ssmx  .and. ssf(mgs) < 20.0 .and. ccnc(mgs) > 0.1*cwnccn(mgs)) THEN ! test -- is OK
10920           IF ( ssf(mgs) > ssmx  .and. ssf(mgs) < 20.0 .and.  &
10921              ( ccnc(mgs) > 0.05*cwnccn(mgs) .or. ( ac_opt > 0 .and. ccnc_ac(mgs) - cx(mgs,lc) > 0.0 ) ) ) THEN ! test
10922 !          IF ( ssf(mgs) > ssmx ) THEN ! original condition
10923            CALL QVEXCESS(ngs,mgs,qwvp,qv0,qx(1,lc),pres,thetap,theta0,dcloud, & 
10924      &      pi0,tabqvs,nqsat,fqsat,cbw,fcqv1,felvcp,ssmx,pk,ngscnt)
10925           ELSE
10926             dcloud = 0.0
10927           ENDIF
10928          ENDIF
10929         ELSE
10930             dcloud = 0.0
10931         ENDIF
10932         
10933         thetap(mgs) = thetap(mgs) + felvcp(mgs)*DCLOUD/(pi0(mgs))
10934         qwvp(mgs) = qwvp(mgs) - DCLOUD
10935         qx(mgs,lc) = qx(mgs,lc) + DCLOUD
10936         IF ( io_flag .and. nxtra > 1 ) THEN
10937            axtra(igs(mgs),jy,kgs(mgs),1) = DCLOUD/dtp
10938         ENDIF
10939         theta(mgs) = thetap(mgs) + theta0(mgs)
10940         temg(mgs) = theta(mgs)*pk(mgs) !( pres(mgs) / poo ) ** cap
10941 !        temg(mgs) = theta2temp( theta(mgs), pres(mgs) )
10942         ltemq = (temg(mgs)-163.15)/fqsat+1.5
10943         ltemq = Min( nqsat, Max(1,ltemq) )
10944         qvs(mgs) = pqs(mgs)*tabqvs(ltemq)
10945 !        es(mgs) = 6.1078e2*tabqvs(ltemq)
10947 !.... S. TWOMEY (1959)
10948 ! Note: get here if there is no previous cloud water and w > 0.
10949       cn(mgs) = 0.0
10950       
10951       IF ( ncdebug .ge. 1 ) THEN
10952         write(iunit,*) 'at 613: ',qx(mgs,lc),cx(mgs,lc),wvel(mgs),ssmax(mgs),kgs(mgs)
10953       ENDIF
10954       
10955       IF (  .not. flag_qndrop ) THEN ! { do not calculate number of droplets if using wrf-chem
10957       IF ( ac_opt == 0 ) THEN
10958         cnuctmp = cnuc(mgs)
10959       ELSE
10960         cnuctmp = ccnc_ac(mgs)
10961       ENDIF
10962       
10963 !      IF ( ssmax(mgs) .lt. sscb .and. qx(mgs,lc) .gt. qxmin(lc)) THEN
10964       IF ( dcloud .gt. qxmin(lc) .and. wvel(mgs) > 0.0) THEN
10965 !       CN(mgs) =   CCNE*wvel(mgs)**cnexp ! *Min(1.0,1./dtp) ! 0.3465
10966        CN(mgs) =   CCNE0*cnuctmp**(2./(2.+cck))*wvel(mgs)**cnexp ! *Min(1.0,1./dtp) ! 0.3465
10967         IF ( ny .le. 2 .and. cn(mgs) .gt. 0.0    &
10968      &                    .and. ncdebug .ge. 1 ) THEN 
10969           write(iunit,*) 'CN: ',cn(mgs)*1.e-6, cx(mgs,lc)*1.e-6, qx(mgs,lc)*1.e3,   &
10970      &       wvel(mgs), dcloud*1.e3
10971           IF ( cn(mgs) .gt. 1.0 ) write(iunit,*) 'cwrad = ',   &
10972      &       1.e6*(rho0(mgs)*qx(mgs,lc)/cn(mgs)*cwc1)**c1f3,   &
10973      &   igs(mgs),kgs(mgs),temcg(mgs),    &
10974      &   1.e3*an(igs(mgs),jgs,kgs(mgs)-1,lc)
10975         ENDIF
10976         IF ( iccwflg .eq. 1 ) THEN
10977           cn(mgs) = Min(cwccn*rho0(mgs)/rho00, Max(cn(mgs),   &
10978      &       rho0(mgs)*qx(mgs,lc)/(xdn(mgs,lc)*(4.*pi/3.)*(4.e-6)**3)))
10979         ENDIF
10980       ELSE
10981        cn(mgs) = 0.0
10982        dcloud = 0.0
10983 !          cn(mgs) = Min(cwccn,    &
10984 !     &       rho0(mgs)*dcloud/(xdn(mgs,lc)*(4.*pi/3.)*(4.e-6)**3) )
10985       ENDIF
10987       IF ( cn(mgs) .gt. 0.0 ) THEN
10988        IF ( ac_opt == 0 ) THEN
10989          IF ( cn(mgs) .gt. ccnc(mgs) ) THEN
10990            cn(mgs) = ccnc(mgs)
10991 !          ccnc(mgs) = 0.0
10992          ENDIF
10993        ELSE 
10994          cn(mgs) = Min( cn(mgs), ccnc_ac(mgs) )
10995        ENDIF
10996 !      cx(mgs,lc) = cx(mgs,lc) + cn(mgs)
10997       IF ( irenuc <= 2 .and. lccna < 1  ) ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs))
10998       ccna(mgs) = ccna(mgs) + cn(mgs)
10999       ENDIF
11001 !       write(91,*) 'nuc1: cn, ix, kz = ',cn(mgs),igs(mgs),kgs(mgs),wvel(mgs),cnexp,ccnc(mgs)
11003       IF( CN(mgs) .GT. cx(mgs,lc) ) cx(mgs,lc) = CN(mgs)
11004       IF( cx(mgs,lc) .GT. 0. .AND. qx(mgs,lc) .le. qxmin(lc) ) THEN
11005         cx(mgs,lc) = 0.
11006       ELSE
11007         cx(mgs,lc) = Min(cx(mgs,lc),rho0(mgs)*Max(0.0,qx(mgs,lc))/cwmasn)
11008       ENDIF
11009       
11010       ENDIF ! }.not. flag_qndrop
11012         GOTO 613
11013         
11014         END IF ! qc .gt. 0.
11016 !        ES=EES(PIB(K)*PT)
11017 !        SQSAT=EPSI*ES/(PB(K)*1000.-ES)
11019 !.... CLOUD NUCLEATION
11020 !      T=PIB(K)*PT
11021 !      ES=1.E3*PB(K)*QV/EPSI
11023       IF ( wvel(mgs) .le. 0. ) GO TO 616
11024       IF ( cx(mgs,lc) .le. 0. )  GO TO 613                             !TWOMEY (1959) Nucleation
11025       IF ( kzbeg-1+kgs(mgs) .GT. 1 .and. qx(mgs,lc) .le. qxmin(lc)) GO TO 613  !TWOMEY (1959) Nucleation
11026       IF ( kzbeg-1+kgs(mgs) .eq. 1 .and. wvel(mgs) .gt. 0. ) GO TO 613         !TWOMEY (1959) Nucleation
11027 !.... ATTEMPT ZIEGLER CLOUD NUCLEATION IN CLOUD INTERIOR UNLESS...
11028   616 IF ( ssf(mgs) .LE. SUPCB .AND. wvel(mgs) .GT. 0. ) GO TO 631 !... weakly saturated updraft
11029       IF ( kzbeg-1+kgs(mgs) .GT. 1 .AND. kzbeg-1+kgs(mgs) .LT. nzend-1 .AND.  &
11030      &    (ssfkp1(mgs) .GE. SUPMX .OR. &
11031      &     ssf(mgs)    .GE. SUPMX .OR. &
11032      &     ssfkm1(mgs) .GE. SUPMX)) GO TO 631                      !... too much vapour
11033       IF (ssf(mgs) .LT. 1.E-10 .OR. ssf(mgs) .GE. SUPMX) GO TO 631 !... at the extremes for ss
11036 ! get here if ( qc > 0 and ss > supcb) or (w < 0)
11039       if (ndebug .gt. 0) write(0,*) "ICEZVD_DR: Entered Ziegler Cloud Nucleation" !mpidebug
11041       DSSDZ=0.
11042       r2dzm=0.50/dz3d(igs(mgs),jy,kgs(mgs))
11044       IF ( irenuc >= 0 .and. ac_opt == 0 .and. .not. flag_qndrop ) THEN ! turn off nucleation when flag_qndrop (using WRF-CHEM for activation)
11046       IF ( irenuc < 2 ) THEN !{
11048         IF ( kzend == nzend ) THEN
11049           t0p3 = t0(igs(mgs),jgs,Min(kze,kgs(mgs)+3))
11050           t0p1 = t0(igs(mgs),jgs,Min(kze,kgs(mgs)+1))
11051         ELSE
11052           t0p3 = t0(igs(mgs),jgs,kgs(mgs)+3)
11053           t0p1 = t0(igs(mgs),jgs,kgs(mgs)+1)
11054         ENDIF
11056       IF ( ( ssf(mgs) .gt. ssmax(mgs) .or.  irenuc .eq. 1 ) &
11057      &   .and.  ( ( lccn .lt. 1 .and.  &
11058      &            cx(mgs,lc) .lt. cwccn*(Min(1.0,rho0(mgs)))) .or. &
11059      &    ( lccn .gt. 1 .and. ccnc(mgs) .gt. 0. )   ) &
11060      &    ) THEN
11061       IF( kzbeg-1+kgs(mgs) .GT. 1 .AND. kzbeg-1+kgs(mgs) .LT. nzend-1 &
11062      &  .and. ssf(mgs) .gt. 0.0 &
11063      &  .and. ssfkp1(mgs) .LT. SUPMX .and. ssfkp1(mgs) .ge. 0.0  &
11064      &  .AND. ssfkm1(mgs) .LT. SUPMX .AND. ssfkm1(mgs) .ge. 0.0  &
11065      &  .AND. ssfkp1(mgs) .gt. ssfkm1(mgs)  &
11066      &  .and. t0p3 .gt. 233.2) THEN
11067           DSSDZ = (ssfkp1(mgs) - ssfkm1(mgs))*R2DZM
11069 ! otherwise check for cloud base condition with updraft:
11071         ELSEIF( kzbeg-1+kgs(mgs) .GT. 1 .AND. kzbeg-1+kgs(mgs) .LT. nzend-1 &
11072 !        IF( kgs(mgs) .GT. 1 .AND. kgs(mgs) .LT. NZ-1 & !)
11073      &  .and. ssf(mgs) .gt. 0.0  .and. wvel(mgs) .gt. 0.0 &
11074      &  .and. ssfkp1(mgs) .gt. 0.0   &
11075      &  .AND. ssfkm1(mgs) .le. 0.0 .and. wvelkm1(mgs) .gt. 0.0 &
11076      &  .AND. ssf(mgs) .gt. ssfkm1(mgs)  &
11077      &  .and. t0p1 .gt. 233.2) THEN
11078          DSSDZ = 2.*(ssf(mgs) - ssfkm1(mgs))*R2DZM  ! 1-sided difference
11079         ENDIF
11081        ENDIF
11083 !CLZ  IF(wijk.LE.0.) CN=CCN*ssfilt(ix,jy,kz)**CCK
11084 ! note: CCN -> cwccn, DELT -> dtp
11085       c1 = Max(0.0, rho0(mgs)*(qx(mgs,lv) - qss(mgs))/ &
11086      &        (xdn(mgs,lc)*(4.*pi/3.)*(4.e-6)**3))
11087       IF ( lccn .lt. 1 ) THEN
11088        CN(mgs) = cwccn*rho0(mgs)/rho00*CCK*ssf(mgs)**CCKM*dtp*   &
11089      & Max(0.0,    &
11090      &         (wvel(mgs)*DSSDZ) )      ! probably the vertical gradient dominates
11091       ELSE
11092       CN(mgs) =  &
11093      &    Min(ccnc(mgs), cnuc(mgs)*CCK*ssf(mgs)**CCKM*dtp*   &
11094      & Max(0.0,    &
11095      &         ( wvel(mgs)*DSSDZ) )  )
11096 !      IF ( cn(mgs) .gt. 0 ) ccnc(mgs) = ccnc(mgs) - cn(mgs)
11097       ENDIF
11099       IF ( cn(mgs) .gt. 0.0 ) THEN
11100        IF ( ccnc(mgs) .lt. 5.e7 .and. cn(mgs) .ge. 5.e7 ) THEN
11101           cn(mgs) = 5.e7
11102           ccnc(mgs) = 0.0
11103        ELSEIF ( cn(mgs) .gt. ccnc(mgs) ) THEN
11104          cn(mgs) = ccnc(mgs)
11105          ccnc(mgs) = 0.0
11106        ENDIF
11107       cx(mgs,lc) = cx(mgs,lc) + cn(mgs)
11108       ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs))
11109       ENDIF
11111       ELSEIF ( irenuc == 2 ) THEN !} { 
11112       ! simple Twomey scheme
11113 !      if (ndebug .gt. 0) write(0,*) 'ICEZVD_DR:  Cloud reNucleation, wvel = ',wvel(mgs)
11114        CN(mgs) =   CCNE0*cnuc(mgs)**(2./(2.+cck))*Max(0.0,wvel(mgs))**cnexp ! *Min(1.0,1./dtp) ! 0.3465
11115 !      ccne = ccnefac*1.e6*(1.e-6*Abs(cwccn))**(2./(2.+cck))
11116 !!!       CN(mgs) = Max( 0.0, CN(mgs) - ccna(mgs) ) ! this was from
11117                ! Philips, Donner et al. 2007, but results in too much limitation of
11118                ! nucleation
11119        CN(mgs) = Min(cn(mgs), ccnc(mgs))
11120        cn(mgs) = Min(cn(mgs), 0.5*dqc/cwmasn) ! limit the nucleation mass to half of the condensation mass
11121        CN(mgs) = Min( CN(mgs), Max(0.0, (cnuc(mgs) - ccna(mgs) )) )
11122        
11123         IF ( .false. .and. ny <= 2 ) THEN
11124           write(0,*) 'i,k, cwmasn = ',igs(mgs),kgs(mgs),cwmasn
11125           write(0,*) 'wvel, cnuc, cn = ',wvel(mgs),cnuc(mgs),cn(mgs)
11126           write(0,*) 'ccne0,cnexp,cck = ',ccne0,cnexp,cck
11127           write(0,*) 'part1, part2 = ',CCNE0*cnuc(mgs)**(2./(2.+cck)), Max(0.0,wvel(mgs))**cnexp
11128           write(0,*) 'ccnc, dqc, dqc/cwmasn = ',ccnc(mgs), dqc, 0.5*dqc/cwmasn
11129         ENDIF
11130        
11131        IF ( icnuclimit > 0 ) THEN 
11132          tmp = ccnc(mgs) + cx(mgs,lc)
11133          IF ( tmp < 330.34e6 ) THEN
11134            ccwmax = 1.1173e6 * (1.e-6*tmp)**0.9504
11135          ELSE
11136            ccwmax = 21.57e6 * (1.e-6*tmp)**0.44
11137          ENDIF
11138          
11139 !         IF ( cn(mgs) > 0. ) THEN
11140 !          write(0,*) 'cn,tmp,ccwmax,cx,c-cx = ',cn(mgs),tmp,ccwmax,cx(mgs,lc),ccwmax - cx(mgs,lc) 
11141 !         ENDIF
11142          
11143         cn(mgs) = Max( 0.0, Min( cn(mgs), ccwmax - cx(mgs,lc) ) )
11144        
11145        ENDIF
11146        
11147        cx(mgs,lc) = cx(mgs,lc) + cn(mgs)
11148        
11149        IF ( lccna < 1 ) ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs))
11151       ELSEIF ( irenuc == 3 ) THEN !} { 
11152       ! Phillips Donner Garner 2007
11153 !      if (ndebug .gt. 0) write(0,*) 'ICEZVD_DR:  Cloud reNucleation, wvel = ',wvel(mgs)
11154 !       CN(mgs) =   cwccn*Min(ssf(mgs),ssfcut)**cck 
11156 ! Need to calculate new ssf since condensation has happened:
11157          temp1 = (theta0(mgs)+thetap(mgs))*pk(mgs) ! t77(ix,jy,kz)
11158           ltemq = Int( (temp1-163.15)/fqsat+1.5 )
11159          ltemq = Min( nqsat, Max(1,ltemq) )
11161           c1= pqs(mgs)*tabqvs(ltemq)
11163           ssf(mgs) = 0.0
11164           IF ( c1 > 0. ) THEN
11165             ssf(mgs) = 100.*(qx(mgs,lv)/c1 - 1.0)  ! from "new" values
11166           ENDIF
11167        CN(mgs) =   cnuc(mgs)*Min(1.0, (ssf(mgs))**cck ) ! 
11169        CN(mgs) = Max( 0.0, CN(mgs) - ccna(mgs) ) ! this was from
11170                ! Philips, Donner et al. 2007, but results in too much limitation of
11171                ! nucleation
11172        CN(mgs) = Min(cn(mgs), ccnc(mgs))
11173        cn(mgs) = Min(cn(mgs), 0.5*dqc/cwmasn) ! limit the nucleation mass to half of the condensation mass
11174        
11175        cx(mgs,lc) = cx(mgs,lc) + cn(mgs)
11176        
11177        ! 6/13/2016: Phillips et al. appears not to decrement CCN, but only increments CCNa.
11178        ! This would allow an initially non-homogeneous (vertically, e.g.) initial value of CCN/rho_air
11179         ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs)) 
11180        
11181       ELSEIF ( irenuc == 4 ) THEN !} { 
11182       ! modification of Phillips Donner Garner 2007
11183 !      if (ndebug .gt. 0) write(0,*) 'ICEZVD_DR:  Cloud reNucleation, wvel = ',wvel(mgs)
11184 !       CN(mgs) =   CCNE0*cnuc(mgs)**(2./(2.+cck))*Max(0.0,wvel(mgs))**cnexp
11185 !       cn(mgs) = Min( cn(mgs), cnuc(mgs) )
11186 ! Need to calculate new ssf since condensation has happened:
11187          temp1 = (theta0(mgs)+thetap(mgs))*pk(mgs) ! t77(ix,jy,kz)
11188           ltemq = Int( (temp1-163.15)/fqsat+1.5 )
11189          ltemq = Min( nqsat, Max(1,ltemq) )
11191           c1= pqs(mgs)*tabqvs(ltemq)
11192           IF ( c1 > 0. ) THEN
11193             ssf(mgs) = Max(0.0, 100.*((qv0(mgs) + qwvp(mgs))/c1 - 1.0) )  ! from "new" values
11194           ELSE
11195             ssf(mgs) = 0.0
11196           ENDIF
11197        CN(mgs) =   cnuc(mgs)*Min(ssf2kmax, ssf(mgs)**cck) ! this allows cn(mgs) > cnuc(mgs)
11199        CN(mgs) = Max( 0.0, CN(mgs) - ccna(mgs) ) ! this was from
11200                ! Philips, Donner et al. 2007, but results in too much limitation of
11201                ! nucleation
11202 !       CN(mgs) = Min(cn(mgs), ccnc(mgs))
11203        cn(mgs) = Min(cn(mgs), 0.5*dqc/cwmasn) ! limit the nucleation mass to half of the condensation mass
11204        
11205        IF ( cn(mgs) > 0.0 ) THEN
11206        cx(mgs,lc) = cx(mgs,lc) + cn(mgs)
11207        ! ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs)) 
11208        
11209        dcrit = 2.0*2.5e-7
11210        
11211        dcloud = 1000.*dcrit**3*Pi/6.*cn(mgs)
11212         qx(mgs,lc) = qx(mgs,lc) + DCLOUD
11213         thetap(mgs) = thetap(mgs) + felvcp(mgs)*DCLOUD/(pi0(mgs))
11214         qwvp(mgs) = qwvp(mgs) - DCLOUD
11215         ENDIF
11216        ! 6/13/2016: Phillips et al. appears not to decrement CCN, but only increments CCNa.
11217        ! This would allow an initially non-homogeneous (vertically, e.g.) initial value of CCN/rho_air
11218 !        ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs))
11219        
11222       ELSEIF ( irenuc == 6 ) THEN !} { 
11224       ! simple Twomey scheme but limit activation to try to do most activation near cloud base, but keep some CCN available for renuclation
11225 !      if (ndebug .gt. 0) write(0,*) 'ICEZVD_DR:  Cloud reNucleation, wvel = ',wvel(mgs)
11226        cn(mgs) = 0.0
11227 !       IF ( ccna(mgs) < 0.7*cnuc(mgs) .and. ccnc(mgs) > 0.69*cnuc(mgs) - ccna(mgs)) THEN ! here, assume we are near cloud base and use Twomey formulation
11228        IF ( ccna(mgs) < 0.7*cnuc(mgs) ) THEN ! here, assume we are near cloud base and use Twomey formulation
11229          CN(mgs) =  Min( 0.9*cnuc(mgs), CCNE0*cnuc(mgs)**(2./(2.+cck))*Max(0.0,wvel(mgs))**cnexp )! *Min(1.0,1./dtp) ! 0.3465
11230 !         IF ( cn(mgs) + ccna(mgs) > 0.71*cnuc ) THEN
11231          ! prevent this branch from activating more than 70% of CCN
11232            CN(mgs) = Min( CN(mgs), Max(0.0, (0.7*cnuc(mgs) - ccna(mgs) )) )
11233 !           CN(mgs) = Min( CN(mgs), Max(0.0, 0.71*ccnc(mgs) - ccna(mgs) ) )
11234            
11235        ELSE
11236         ! if a large fraction of CCN have been activated, then assume we are in the cloud interior and use local SSw as in Phillips et al. 2007.
11238          temp1 = (theta0(mgs)+thetap(mgs))*pk(mgs) ! t77(ix,jy,kz)
11239 !          t0(ix,jy,kz) = temp1
11240           ltemq = Int( (temp1-163.15)/fqsat+1.5 )
11241          ltemq = Min( nqsat, Max(1,ltemq) )
11243 !          c1 = t00(igs(mgs),jy,kgs(mgs))*tabqvs(ltemq)
11244           c1= pqs(mgs)*tabqvs(ltemq)
11245           IF ( c1 > 0. ) THEN
11246             ssf(mgs) = Max(0.0, 100.*((qv0(mgs) + qwvp(mgs))/c1 - 1.0) )  ! from "new" values
11247           ELSE
11248             ssf(mgs) = 0.0
11249           ENDIF
11251 !        CN(mgs) = cnuc(mgs)*Min(0.99, Min(ssf(mgs),ssfcut)**cck ) ! 
11252          CN(mgs) =   cnuc(mgs)*Min(2.0, Max(0.0,ssf(mgs))**cck ) ! 
11253 !         CN(mgs) =   cnuc(mgs)*Min(ssf(mgs),ssfcut)**cck ! 
11256         CN(mgs) = Min(0.01*cnuc(mgs), Max( 0.0, CN(mgs) - ccna(mgs) ) ) ! this was from
11257 !        cn(mgs) = 0.0
11258        ENDIF
11259 !      ccne = ccnefac*1.e6*(1.e-6*Abs(cwccn))**(2./(2.+cck))
11260 !!!       CN(mgs) = Max( 0.0, CN(mgs) - ccna(mgs) ) ! this was from
11261                ! Philips, Donner et al. 2007, but results in too much limitation of
11262                ! nucleation
11263 !       CN(mgs) = Min(cn(mgs), ccnc(mgs))
11264 !       cn(mgs) = Min(cn(mgs), 0.5*dqc/cwmasn) ! limit the nucleation mass to half of the condensation mass
11265        
11266        IF ( cn(mgs) > 0.0 ) THEN
11267        cx(mgs,lc) = cx(mgs,lc) + cn(mgs)
11268        
11269        ! create some small droplets at minimum size (CP 2000), although it adds very little liquid
11270        
11271        dcrit = 2.0*2.5e-7
11272        
11273        dcloud = 1000.*dcrit**3*Pi/6.*cn(mgs)
11274         qx(mgs,lc) = qx(mgs,lc) + DCLOUD
11275         thetap(mgs) = thetap(mgs) + felvcp(mgs)*DCLOUD/(pi0(mgs))
11276         qwvp(mgs) = qwvp(mgs) - DCLOUD
11277   !      ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs))
11278         ENDIF
11279       ELSEIF ( irenuc == 5 ) THEN !} { 
11281       ! modification of Phillips Donner Garner 2007
11282 !      if (ndebug .gt. 0) write(0,*) 'ICEZVD_DR:  Cloud reNucleation, wvel = ',wvel(mgs)
11283 !      CN(mgs) =  Min( 0.91*cnuc(mgs), CCNE0*cnuc(mgs)**(2./(2.+cck))*Max(0.0,wvel(mgs))**cnexp )! *Min(1.0,1./dtp) ! 0.3465
11284        CN(mgs) =  Min( cnuc(mgs),  CCNE0*cnuc(mgs)**(2./(2.+cck))*Max(0.0,wvel(mgs))**cnexp )
11286          
11287         IF ( ccna(mgs) >= cnuc(mgs) ) THEN ! apply limit after all "base" CCN have been depleted
11288         temp1 = (theta0(mgs)+thetap(mgs))*pk(mgs) ! t77(ix,jy,kz)
11289           ltemq = Int( (temp1-163.15)/fqsat+1.5 )
11290          ltemq = Min( nqsat, Max(1,ltemq) )
11292           c1= pqs(mgs)*tabqvs(ltemq)
11293           IF ( c1 > 0. ) THEN
11294             ssf(mgs) = Max(0.0, 100.*((qv0(mgs) + qwvp(mgs))/c1 - 1.0) )  ! from "new" values
11295           ELSE
11296             ssf(mgs) = 0.0
11297           ENDIF
11298           
11300        CN(mgs) =   Max( cn(mgs), cnuc(mgs)*Min(ssf2kmax, ssf(mgs)**cck) ) ! this allows cn(mgs) > cnuc(mgs)
11302    !    cn(mgs) = Min( cn(mgs), cnuc(mgs) )
11304 !       IF ( ccna(mgs) >= cnuc(mgs) ) THEN ! apply limit after all "base" CCN have been depleted
11305        CN(mgs) = Max( 0.0, CN(mgs) - ccna(mgs) ) ! this was from
11306        
11307        ELSE
11308          CN(mgs) =  Min( cn(mgs), cnuc(mgs) - ccna(mgs) ) ! no more than remaining "base" CCN
11309        ENDIF
11310                ! Philips, Donner et al. 2007, but results in too much limitation of
11311                ! nucleation
11312 !       CN(mgs) = Min(cn(mgs), ccnc(mgs))
11313 !       cn(mgs) = Min(cn(mgs), 0.5*dqc/cwmasn) ! limit the nucleation mass to half of the condensation mass
11314        dcrit = 2.0*2.0e-6
11315        dcloud = 1000.*dcrit**3*Pi/6.
11316  !      cn(mgs) = Min(cn(mgs), 0.5*dqc/dcloud) ! limit the nucleation mass to half of the condensation mass
11317        ! check new droplet size:
11318          ! tmp is number of droplets at diameter dcrit
11319          tmp = Max(0.0,  rho0(mgs)*qx(mgs,lc)/dcloud - cx(mgs,lc)) ! (cx(mgs,lc) + cn(mgs))
11320          cn(mgs) = Min(tmp, cn(mgs) )
11322       
11323        IF ( cn(mgs) > 0.0 ) THEN
11324        cx(mgs,lc) = cx(mgs,lc) + cn(mgs)
11325        
11326        dcrit = 2.5e-7
11327        
11328        dcloud = 1000.*dcrit**3*Pi/6.*cn(mgs)
11329         qx(mgs,lc) = qx(mgs,lc) + DCLOUD
11330         thetap(mgs) = thetap(mgs) + felvcp(mgs)*DCLOUD/(pi0(mgs))
11331         qwvp(mgs) = qwvp(mgs) - DCLOUD
11332         ENDIF
11333        ! 6/13/2016: Phillips et al. appears not to decrement CCN, but only increments CCNa.
11334        ! This would allow an initially non-homogeneous (vertically, e.g.) initial value of CCN/rho_air
11335        ! ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs))
11336       ELSEIF ( irenuc == 7 .or. irenuc == 17 ) THEN !} { 
11338       ! simple Twomey scheme but limit activation to try to do most activation near cloud base, but keep some CCN available for renuclation
11339 !      if (ndebug .gt. 0) write(0,*) 'ICEZVD_DR:  Cloud reNucleation, wvel = ',wvel(mgs)
11340        cn(mgs) = 0.0
11341        IF ( irenuc == 7 ) THEN
11342          frac = 0.9
11343        ELSE
11344          frac = 0.98
11345        ENDIF
11346 !       IF ( ccna(mgs) < 0.7*cnuc(mgs) .and. ccnc(mgs) > 0.69*cnuc(mgs) - ccna(mgs)) THEN ! here, assume we are near cloud base and use Twomey formulation
11347        IF ( ccna(mgs) < frac*cnuc(mgs) ) THEN ! { here, assume we are near cloud base and use Twomey formulation
11348          CN(mgs) =  Min( (frac+0.01)*cnuc(mgs), CCNE0*cnuc(mgs)**(2./(2.+cck))*Max(0.0,wvel(mgs))**cnexp )! *Min(1.0,1./dtp) ! 0.3465
11349 !         IF ( cn(mgs) + ccna(mgs) > 0.71*cnuc ) THEN
11350          ! prevent this branch from activating more than 70% of CCN
11351            CN(mgs) = Min( CN(mgs), Max(0.0, (frac*cnuc(mgs) - ccna(mgs) )) )
11352 !           CN(mgs) = Min( CN(mgs), Max(0.0, 0.71*ccnc(mgs) - ccna(mgs) ) )
11353          !  write(0,*) '1: k,cn = ',kgs(mgs),cn(mgs),ssf(mgs)
11354 !!           IF ( ccncuf(mgs) > 0.0 .and. cn(mgs) < 1.e-3 .and. ssmax(mgs) > 1.0 ) THEN
11355 !           IF ( ccncuf(mgs) > 0.0 .and. ssf(mgs) > ssmxuf .and. ssmax(mgs) > ssmxuf ) THEN
11356 !            CNuf(mgs) =  Min( ccncuf(mgs), CCNE0*ccncuf(mgs)**(2./(2.+cck))*Max(0.0,wvel(mgs))**cnexp )! *Min(1.0,1./dtp) ! 0.3465
11357           !  IF ( cnuf(mgs) >= 0.0 ) write(0,*) '1: cnuf, k = ',cnuf(mgs),ccncuf(mgs),kgs(mgs)
11358 !           ENDIF
11360            
11361        ELSE ! }{
11362         ! if a large fraction of CCN have been activated, then assume we are in the cloud interior and use local SSw as in Phillips et al. 2007.
11364          temp1 = (theta0(mgs)+thetap(mgs))*pk(mgs) ! t77(ix,jy,kz)
11365 !          t0(ix,jy,kz) = temp1
11366           ltemq = Int( (temp1-163.15)/fqsat+1.5 )
11367          ltemq = Min( nqsat, Max(1,ltemq) )
11369         !  c1 = t00(igs(mgs),jy,kgs(mgs))*tabqvs(ltemq)
11370           c1= pqs(mgs)*tabqvs(ltemq)
11372           ssf(mgs) = 0.0
11373           IF ( c1 > 0. ) THEN
11374             ssf(mgs) = 100.*(qx(mgs,lv)/c1 - 1.0)  ! from "new" values
11375           ENDIF
11377 !          IF ( ssf(mgs) <= 1.0 .or. cnuc(mgs) > ccna(mgs) ) THEN
11378           IF ( ssf(mgs) <= 1.0 ) THEN
11379           CN(mgs) =   cnuc(mgs)*Min(1.0, Max(0.0,ssf(mgs))**cck ) ! 
11380           ELSE
11381           CN(mgs) =   cnuc(mgs)*Min(2.0, Max(0.0,0.03*(ssf(mgs)-1.0)+1.)**cck ) !           
11382 !          write(0,*) 'iren7: ssf,ssmx = ',ssf(mgs),ssmax(mgs),cn(mgs),ccna(mgs),cnuc(mgs)
11383 !          write(0,*) 'c1,qv = ',c1,qx(mgs,lv),temp1,ltemq
11384           ENDIF
11386          !  write(0,*) 'k,cn = ',kgs(mgs),cn(mgs),ssf(mgs)
11387          !  write(0,*) 'ccn-ccna = ',cnuc(mgs) - ccna(mgs),ccnc(mgs) - ccna(mgs)
11388 !           IF ( ccncuf(mgs) > 0.0 .and. cn(mgs) < 1.e-3 .and. ssmax(mgs) > 1.0 ) THEN
11389            IF ( ccncuf(mgs) > 0.0 .and. ssf(mgs) > ssmxuf .and. ( ssmax(mgs) > ssmxuf .or. lss < 1 ) ) THEN
11390             CNuf(mgs) =  Min( ccncuf(mgs), CCNE0*ccncuf(mgs)**(2./(2.+cck))*Max(0.0,wvel(mgs))**cnexp )! *Min(1.0,1./dtp) ! 0.3465
11391           !  IF ( cnuf(mgs) >= 0.0 ) write(0,*) 'cnuf, k = ',cnuf(mgs),ccncuf(mgs),kgs(mgs)
11392            ENDIF
11393           
11395 !        CN(mgs) = Min( Min(0.1,ssf(mgs)-1.)*cnuc(mgs), Max( 0.0, CN(mgs) - ccna(mgs) ) ) ! this was from
11396 !        CN(mgs) = Min( Min(0.5*cx(mgs,lc), Min(0.1,ssf(mgs)/100.)*cnuc(mgs)), Max( 0.0, CN(mgs) - ccna(mgs) ) ) ! this was from
11397         
11398         CN(mgs) = Min(0.01*cnuc(mgs), Max( 0.0, CN(mgs) - ccna(mgs) ) ) ! this was from
11400        ENDIF ! }
11401 !      ccne = ccnefac*1.e6*(1.e-6*Abs(cwccn))**(2./(2.+cck))
11402 !!!       CN(mgs) = Max( 0.0, CN(mgs) - ccna(mgs) ) ! this was from
11403                ! Philips, Donner et al. 2007, but results in too much limitation of
11404                ! nucleation
11405 !       CN(mgs) = Min(cn(mgs), ccnc(mgs))
11406 !       cn(mgs) = Min(cn(mgs), 0.5*dqc/cwmasn) ! limit the nucleation mass to half of the condensation mass
11407        
11409         IF ( icnuclimit > 0 ) THEN
11410 ! max droplet conc. based on Chandrakar et al. (2016) and Konwar et al. (2012)
11411            tmp = ccnc(mgs) - ccna(mgs) + cx(mgs,lc)
11412            IF ( tmp < 330.34e6 ) THEN
11413              ccwmax = 1.1173e6 * (1.e-6*tmp)**0.9504
11414            ELSE
11415              ccwmax = 21.57e6 * (1.e-6*tmp)**0.44
11416            ENDIF
11417           
11418            cn(mgs) = Max( 0.0, Min( cn(mgs), ccwmax - cx(mgs,lc) ) )
11419            
11420         ENDIF
11422        IF ( cn(mgs) + cnuf(mgs) > 0.0 ) THEN
11424        dcrit = 2.0*2.0e-6
11425        dcloud = 1000.*dcrit**3*Pi/6.
11426  !      cn(mgs) = Min(cn(mgs), 0.5*dqc/dcloud) ! limit the nucleation mass to half of the condensation mass
11427        ! check new droplet size:
11428          ! tmp is number of droplets at diameter dcrit
11429          tmp = Max(0.0,  rho0(mgs)*qx(mgs,lc)/dcloud - cx(mgs,lc)) ! (cx(mgs,lc) + cn(mgs))
11430          cn(mgs) = Min(tmp, cn(mgs) )
11432         cx(mgs,lc) = cx(mgs,lc) + cn(mgs) + cnuf(mgs)
11435        ! create some small droplets at minimum size (CP 2000), although it adds very little liquid
11436        
11437        
11438        dcrit = 2.0*2.5e-7
11439        dcloud = 1000.*dcrit**3*Pi/6.*(cn(mgs) + cnuf(mgs) )
11440         qx(mgs,lc) = qx(mgs,lc) + DCLOUD
11441         thetap(mgs) = thetap(mgs) + felvcp(mgs)*DCLOUD/(pi0(mgs))
11442         qwvp(mgs) = qwvp(mgs) - DCLOUD
11443   !      ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs))
11444          ccncuf(mgs) = Max(0.0, ccncuf(mgs) - cnuf(mgs))
11445         ENDIF
11447       ELSEIF ( irenuc == 8 ) THEN !} { 
11448       ! simple Twomey scheme
11449 !      if (ndebug .gt. 0) write(0,*) 'ICEZVD_DR:  Cloud reNucleation, wvel = ',wvel(mgs)
11450        
11451        cn(mgs) = 0.0
11452        
11453        IF ( ccnc(mgs) > 0. ) THEN
11454        CN(mgs) =   CCNE0*ccnc(mgs)**(2./(2.+cck))*Max(0.0,wvel(mgs))**cnexp ! *Min(1.0,1./dtp) ! 0.3465
11455 !      ccne = ccnefac*1.e6*(1.e-6*Abs(cwccn))**(2./(2.+cck))
11456 !!!       CN(mgs) = Max( 0.0, CN(mgs) - ccna(mgs) ) ! this was from
11457                ! Philips, Donner et al. 2007, but results in too much limitation of
11458                ! nucleation
11459        CN(mgs) = Min(cn(mgs), ccnc(mgs))
11460        
11461        ELSEIF ( cx(mgs,lc) < 0.01e9 ) THEN
11463         ! if a large fraction of CCN have been activated, then assume we are in the cloud interior and use local SSw as in Phillips et al. 2007.
11465          temp1 = (theta0(mgs)+thetap(mgs))*pk(mgs) ! t77(ix,jy,kz)
11466 !          t0(ix,jy,kz) = temp1
11467           ltemq = Int( (temp1-163.15)/fqsat+1.5 )
11468          ltemq = Min( nqsat, Max(1,ltemq) )
11470         !  c1 = t00(igs(mgs),jy,kgs(mgs))*tabqvs(ltemq)
11471           c1= pqs(mgs)*tabqvs(ltemq)
11473           ssf(mgs) = 0.0
11474           IF ( c1 > 0. ) THEN
11475             ssf(mgs) = 100.*(qx(mgs,lv)/c1 - 1.0)  ! from "new" values
11476           ENDIF
11478 !          IF ( ssf(mgs) <= 1.0 .or. cnuc(mgs) > ccna(mgs) ) THEN
11479           IF ( ssf(mgs) <= 1.0 ) THEN
11480           CN(mgs) = 0.0
11481           ELSE
11482 !           CN(mgs) = 0.01e9*rho0(mgs)/rho00*Min(2.0, Max(0.0,0.03*(ssf(mgs)-1.0)+1.)**cck ) - cx(mgs,lc) !           
11483            CN(mgs) = 0.01e9*Min(2.0, Max(0.0,0.03*(ssf(mgs)-1.0)+1.)**cck ) - cx(mgs,lc) !           
11484           ENDIF
11485        
11486        ENDIF
11488        IF ( cn(mgs) > 0.0 ) THEN
11489        cx(mgs,lc) = cx(mgs,lc) + cn(mgs)
11490        
11491        ! ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs))
11492        
11493        ! create some small droplets at minimum size (CP 2000), although it adds very little liquid
11494        
11495        dcrit = 2.0*2.5e-7
11496        
11497        dcloud = 1000.*dcrit**3*Pi/6.*cn(mgs)
11498         qx(mgs,lc) = qx(mgs,lc) + DCLOUD
11499         thetap(mgs) = thetap(mgs) + felvcp(mgs)*DCLOUD/(pi0(mgs))
11500         qwvp(mgs) = qwvp(mgs) - DCLOUD
11501   !      ccnc(mgs) = Max(0.0, ccnc(mgs) - cn(mgs))
11502         ENDIF
11503        
11506       ENDIF ! }
11508       ccna(mgs) = ccna(mgs) + cn(mgs)
11510       ENDIF ! irenuc >= 0 .and. .not. flag_qndrop
11512       IF( cx(mgs,lc) .GT. 0. .AND. qx(mgs,lc) .LE. qxmin(lc)) cx(mgs,lc)=0.
11513       GO TO 631
11514 !.... NUCLEATION ON CLOUD INFLOW BOUNDARY POINT
11516   613 CONTINUE
11518   631  CONTINUE
11521 ! Check for supersaturation greater than ssmx and adjust down
11523        ssmx = maxsupersat
11524        qv1 = qv0(mgs) + qwvp(mgs)
11525        qvs1 = qvs(mgs)
11526        
11527 !       IF ( flag_qndrop .and. do_satadj_for_wrfchem ) ssmx = 1.04 ! set lower threshold for progn=1 when using WRF-CHEM
11529        IF ( qv1 .gt. (ssmx*qvs1) ) THEN
11530 ! use line below to disable saturation adjustment when flag_qndrop is true
11531 !       IF ( qv1 .gt. (ssmx*qvs1) .and. .not. flag_qndrop ) THEN
11532         
11533          ss1 = qv1/qvs1
11535         ssmx = 100.*(ssmx - 1.0)
11536         
11537         qvex = 0.0
11539         CALL QVEXCESS(ngs,mgs,qwvp,qv0,qx(1,lc),pres,thetap,theta0,qvex,   &
11540      &    pi0,tabqvs,nqsat,fqsat,cbw,fcqv1,felvcp,ssmx,pk,ngscnt)
11544         IF ( qvex .gt. 0.0 ) THEN
11545         thetap(mgs) = thetap(mgs) + felvcp(mgs)*qvex/(pi0(mgs))
11546         IF ( io_flag .and. nxtra > 1 ) THEN
11547            axtra(igs(mgs),jy,kgs(mgs),1) = axtra(igs(mgs),jy,kgs(mgs),1) + qvex/dtp
11548         ENDIF
11549         qwvp(mgs) = qwvp(mgs) - qvex
11550         qx(mgs,lc) = qx(mgs,lc) + qvex
11551         IF ( .not. flag_qndrop) THEN
11552           IF ( imaxsupopt == 1 ) THEN
11553             cn(mgs) = Min( Max(ccnc(mgs),cwnccn(mgs)), rho0(mgs)*qvex/Max( cwmasn5, xmas(mgs,lc) )  )
11554           ELSEIF ( imaxsupopt == 2 ) THEN
11555             cn(mgs) = Min( Max(ccnc(mgs),cwnccn(mgs)), rho0(mgs)*qvex/Max( cwmasn5, Max(cwmas30,xmas(mgs,lc)) )  )
11556           ELSEIF ( imaxsupopt == 3 ) THEN
11557             cn(mgs) = Min( Max(ccnc(mgs),cwnccn(mgs)), rho0(mgs)*qvex/Max( cwmasn5, Max(cwmasx,xmas(mgs,lc)) )  )
11558 !            cn(mgs) = 1.5*cxmin
11559           ELSEIF ( imaxsupopt == 4 ) THEN
11560             cn(mgs) = Min( Max(ccnc(mgs),cwnccn(mgs)), rho0(mgs)*qvex/Max( cwmasn5, Max(cwmas20,xmas(mgs,lc)) )  )
11561           ENDIF
11562         IF ( lccna > 1 ) THEN
11563           ccna(mgs) = ccna(mgs) + cn(mgs)
11564         ELSE
11565           ccnc(mgs) = Max( 0.0, ccnc(mgs) - cn(mgs) )
11566         ENDIF
11567         cx(mgs,lc) = cx(mgs,lc) + cn(mgs)
11568         ENDIF
11569         
11570 !        write(iunit,*) 'theta = ',theta0(mgs) + thetap(mgs)
11572 !        temg(mgs) = theta(mgs)*( pres(mgs) / poo ) ** cap
11574         ENDIF
11576        
11577        ENDIF
11580 ! Calculate droplet volume and check if it is within bounds.
11581 !  Adjust if necessary
11582 !  
11583 !      if (ndebug .gt. 0) write(0,*) "ICEZVD_DR: check droplet volume" 
11586 !      cx(mgs,lc) = Min( cwnccn(mgs), cx(mgs,lc) )
11587       IF( cx(mgs,lc) > cxmin .AND. qx(mgs,lc) .GT. qxmin(lc)) THEN
11588 !        SVC(mgs) = rho0(mgs)*qx(mgs,lc)/(cx(mgs,lc)*xdn(mgs,lc))
11589         xmas(mgs,lc) = rho0(mgs)*qx(mgs,lc)/(cx(mgs,lc))
11590         
11591        IF (  xmas(mgs,lc) < cwmasn .or.  xmas(mgs,lc) > cwmasx ) THEN
11592         tmp = cx(mgs,lc)
11593         xmas(mgs,lc) = Min( xmas(mgs,lc), cwmasx )
11594         xmas(mgs,lc) = Max( xmas(mgs,lc), cwmasn )
11595         cx(mgs,lc) = rho0(mgs)*qx(mgs,lc)/xmas(mgs,lc)
11596 !        IF ( cx(mgs,lc) > tmp*1.1 ) THEN
11597 !          write(0,*) 'nucond: kgs, ccw1,2 = ',kgs(mgs),tmp,cx(mgs,lc)
11598 !        ENDIF
11599        ENDIF
11600       ENDIF
11603 !      IF( cx(mgs,lc) .GT. 10.e6 .AND. qx(mgs,lc) .GT. qxmin(lc) ) GO TO 681
11604 !        ccwtmp = cx(mgs,lc)
11605 !        cwmastmp = xmas(mgs,lc)
11606 !       xmas(mgs,lc) = Max(xmas(mgs,lc), cwmasn)
11607 !       IF (qx(mgs,lc) .GT. qxmin(lc) .AND. cx(mgs,lc) .le. 0.) THEN
11608 !          cx(mgs,lc) = Min(0.5*cwccn,rho0(mgs)*qx(mgs,lc)/xmas(mgs,lc))
11609 !          xmas(mgs,lc) = rho0(mgs)*qx(mgs,lc)/cx(mgs,lc)
11610 !       ENDIF
11611 !      IF (cx(mgs,lc) .GT. 0. .AND. qx(mgs,lc) .GT. qxmin(lc))    &
11612 !     &        xmas(mgs,lc) = rho0(mgs)*qx(mgs,lc)/cx(mgs,lc)
11613 !      IF (qx(mgs,lc) .GT. qxmin(lc) .AND. xmas(mgs,lc) .LT. cwmasn)    &
11614 !     &          xmas(mgs,lc) = cwmasn
11615 !      IF (qx(mgs,lc) .GT. qxmin(lc) .AND. xmas(mgs,lc) .GT. cwmasx)    &
11616 !     &    xmas(mgs,lc) = cwmasx
11617 !      IF ( qx(mgs,lc) .gt. qxmin(lc) ) THEN
11618 !        cx(mgs,lc) = rho0(mgs)*qx(mgs,lc)/Max(cwmasn,xmas(mgs,lc))
11619 !      ENDIF
11620 !        
11622 ! 681  CONTINUE
11624         
11625       IF ( ipconc .ge. 3 .and. rcond == 2 ) THEN
11627         
11628         IF (cx(mgs,lr) .GT. 0. .AND. qx(mgs,lr) .GT. qxmin(lr))    &
11629      &       xv(mgs,lr)=rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*cx(mgs,lr))
11630         IF (xv(mgs,lr) .GT. xvmx(lr)) xv(mgs,lr) = xvmx(lr)
11631         IF (xv(mgs,lr) .LT. xvmn(lr)) xv(mgs,lr) = xvmn(lr)
11633       ENDIF
11637       ENDDO ! mgs
11640 ! ################################################################
11641       DO mgs=1,ngscnt
11642       IF ( lss > 1 .and. ssf(mgs) .gt. ssmax(mgs)    &
11643      &  .and. ( idecss .eq. 0 .or. qx(mgs,lc) .gt. qxmin(lc)) ) THEN
11644         ssmax(mgs) = ssf(mgs)
11645       ENDIF
11646       ENDDO
11649       do mgs = 1,ngscnt
11650       an(igs(mgs),jy,kgs(mgs),lt) = theta0(mgs) + thetap(mgs)
11651       an(igs(mgs),jy,kgs(mgs),lv) =  qv0(mgs) + qwvp(mgs)
11652 !      tmp3d(igs(mgs),jy,kgs(mgs)) = tmp3d(igs(mgs),jy,kgs(mgs)) + t9(igs(mgs),jy,kgs(mgs)) !  pi0(mgs) ! wvdf(mgs) ! ssf(mgs) ! cn(mgs)
11654       IF ( eqtset > 2 ) THEN
11655         p2(igs(mgs),jy,kgs(mgs)) = pipert(mgs)
11656       ENDIF
11658        if ( ido(lc) .eq. 1 )  then
11659         an(igs(mgs),jy,kgs(mgs),lc) = qx(mgs,lc) +    &
11660      &    min( an(igs(mgs),jy,kgs(mgs),lc), 0.0 )
11661 !        qx(mgs,lc) = an(igs(mgs),jy,kgs(mgs),lc)
11662        end if
11665        if ( ido(lr) .eq. 1 .and. rcond == 2 )  then
11666         an(igs(mgs),jy,kgs(mgs),lr) = qx(mgs,lr) +    &
11667      &    min( an(igs(mgs),jy,kgs(mgs),lr), 0.0 )
11668 !        qx(mgs,lr) = an(igs(mgs),jy,kgs(mgs),lr)
11669        end if
11671         IF ( lzr > 1 .and. rcond == 2 ) THEN
11672         an(igs(mgs),jy,kgs(mgs),lzr) = zx(mgs,lr) +  &
11673      &    min( an(igs(mgs),jy,kgs(mgs),lzr), 0.0 )
11674         ENDIF
11677        IF (  ipconc .ge. 2 ) THEN
11678         an(igs(mgs),jy,kgs(mgs),lnc) = Max(cx(mgs,lc) , 0.0)
11679         IF ( lss > 1 ) an(igs(mgs),jy,kgs(mgs),lss) = Max( 0.0, ssmax(mgs) )
11680         IF ( ac_opt == 0 ) THEN
11681           IF ( lccn .gt. 1 .and. lccna .lt. 1  ) THEN
11682             an(igs(mgs),jy,kgs(mgs),lccn) = Max(0.0,  ccnc(mgs) )
11683           ENDIF
11684         ENDIF
11685         IF ( lccnuf .gt. 1 .and. .not. ( lccna .gt. 1 .and. i_uf_or_ccn > 0 ) ) THEN
11686           an(igs(mgs),jy,kgs(mgs),lccnuf) = Max(0.0,  ccncuf(mgs) )
11687         ENDIF
11688         IF ( lccna .gt. 1 ) THEN
11689           an(igs(mgs),jy,kgs(mgs),lccna) = Max(0.0, ccna(mgs) )
11690         ENDIF
11691        ENDIF
11692        IF (  ipconc .ge. 3 .and. rcond == 2 ) THEN
11693         an(igs(mgs),jy,kgs(mgs),lnr) = Max(cx(mgs,lr) , 0.0)
11694        ENDIF
11695       end do
11698 29998 continue
11701       if ( kz .gt. nz-1 .and. ix .ge. nxi) then
11702         if ( ix .ge. nxi ) then
11703          go to 2200 ! exit gather scatter
11704         else
11705          nzmpb = kz
11706         endif
11707       else
11708         nzmpb = kz
11709       end if
11711       if ( ix .ge. nxi ) then
11712         nxmpb = 1
11713         nzmpb = kz+1
11714       else
11715        nxmpb = ix+1
11716       end if
11718  2000 continue ! inumgs
11719  2200 continue
11721 !  end of gather scatter (for this jy slice)
11724 !#ifdef COMMAS
11725 !    GOTO 9999
11726 !#endif
11728 ! Redistribute inappreciable cloud particles and charge
11730 ! Redistribution everywhere in the domain...
11732     IF ( .true. ) THEN
11733       
11734       frac = 1.0 ! 0.25 ! 1.0 ! 0.2
11736 !  alternate test version for ipconc .ge. 3
11737 !  just vaporize stuff to prevent noise in the number concentrations
11740       do kz = 1,nz
11741 !      do jy = 1,1
11742       do ix = 1,nxi
11743       
11744       t0(ix,jy,kz) = an(ix,jy,kz,lt)*t77(ix,jy,kz)
11745       
11746       zerocx(:) = .false.
11747       DO il = lc,lhab
11748        IF ( iresetmoments == 1 .or. iresetmoments == il ) THEN
11749         IF ( ln(il) > 1 ) zerocx(il) = ( an(ix,jy,kz,ln(il)) < cxmin )
11750         IF ( lz(il) > 1 ) zerocx(il) = ( zerocx(il) .or. an(ix,jy,kz,lz(il)) < zxmin )
11751        ELSE
11752         IF ( il == lc ) THEN
11753           IF ( ln(il) > 1 ) zerocx(il) = ( an(ix,jy,kz,ln(il)) <= 0 ) .and. .not. flag_qndrop ! do not reset if progn=1 (WRF-CHEM)
11754         ELSE
11755          IF ( ln(il) > 1 ) zerocx(il) = ( an(ix,jy,kz,ln(il)) <= 0 )
11756         ENDIF
11757        ENDIF
11758       ENDDO
11760       IF ( lhl .gt. 1 ) THEN
11761       
11762       IF ( lzhl .gt. 1 ) THEN
11764         an(ix,jy,kz,lzhl) = Max(0.0, an(ix,jy,kz,lzhl) )
11765         
11766         IF ( an(ix,jy,kz,lhl) .ge. frac*qxmin(lhl) .and. rescale_low_alpha ) THEN ! check 6th moment
11767           
11768           IF ( an(ix,jy,kz,lnhl) .gt. 0.0 ) THEN
11770            IF ( lvhl .gt. 1 ) THEN
11771              IF ( an(ix,jy,kz,lvhl) .gt. 0.0 ) THEN
11772                hwdn = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/an(ix,jy,kz,lvhl)
11773              ELSE
11774                hwdn = xdn0(lhl)
11775              ENDIF
11776              hwdn = Max( xdnmn(lhl), hwdn )
11777            ELSE
11778              hwdn = xdn0(lhl)
11779            ENDIF
11781              chw = an(ix,jy,kz,lnhl)
11782              g1 = (6.0+alphamin)*(5.0+alphamin)*(4.0+alphamin)/   &
11783      &            ((3.0+alphamin)*(2.0+alphamin)*(1.0+alphamin))
11784              z1 = g1*dn(ix,jy,kz)**2*( an(ix,jy,kz,lhl) )*an(ix,jy,kz,lhl)/chw
11785              z1 = z1*(6./(pi*hwdn))**2
11786           ELSE
11787              z1 = 0.0
11788           ENDIF
11789           
11790           an(ix,jy,kz,lzhl) = Min( z1, an(ix,jy,kz,lzhl) )
11791           
11792           IF (  an(ix,jy,kz,lnhl) .lt. 1.e-5 ) THEN
11793 !            an(ix,jy,kz,lzhl) = 0.9*an(ix,jy,kz,lzhl)
11794           ENDIF
11795         ENDIF
11796         
11797       ENDIF !lzhl
11798       
11799       if ( an(ix,jy,kz,lhl) .lt. frac*qxmin(lhl) .or. zerocx(lhl) ) then
11801 !        IF ( an(ix,jy,kz,lhl) .gt. 0 ) THEN
11802           an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,lhl)
11803           an(ix,jy,kz,lhl) = 0.0
11804 !        ENDIF
11806         IF ( ipconc .ge. 5 ) THEN ! .and. an(ix,jy,kz,lnh) .gt. 0.0 ) THEN
11807           an(ix,jy,kz,lnhl) = 0.0
11808         ENDIF
11810         IF ( lvhl .gt. 1 ) THEN
11811            an(ix,jy,kz,lvhl) = 0.0
11812         ENDIF
11814         IF ( lhlw .gt. 1 ) THEN
11815            an(ix,jy,kz,lhlw) = 0.0
11816         ENDIF
11818         IF ( lnhlf .gt. 1 ) THEN
11819            an(ix,jy,kz,lnhlf) = 0.0
11820         ENDIF
11821       
11822         IF ( lzhl .gt. 1 ) THEN
11823            an(ix,jy,kz,lzhl) = 0.0
11824         ENDIF
11826       ELSE
11827        IF ( lvol(lhl) .gt. 1 ) THEN  ! check density
11828         IF ( an(ix,jy,kz,lvhl) .gt. 0.0 ) THEN
11829          tmp = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/an(ix,jy,kz,lvhl)
11830         ELSE ! in case volume is zero but mass is above threshold (should not happen, of course)
11831           tmp = rho_qhl
11832           an(ix,jy,kz,lvhl) = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/tmp
11833         ENDIF
11835         IF (  tmp .lt. xdnmn(lhl) ) THEN
11836           tmp = Max( xdnmn(lhl), tmp )
11837           an(ix,jy,kz,lvhl) = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/tmp
11838         ENDIF
11840         IF ( tmp .gt. xdnmx(lhl) .and. lhlw .le. 0 ) THEN ! no liquid allowed on hail
11841           tmp = Min( xdnmx(lhl), tmp )
11842           an(ix,jy,kz,lvhl) = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/tmp
11843         ELSEIF ( tmp .gt. xdnmx(lhl) .and. lhlw .gt. 1 ) THEN  ! allow for liquid on hail
11844           fw = an(ix,jy,kz,lhlw)/an(ix,jy,kz,lhl)
11845 !          tmpmx = xdnmx(lhl) + fw*(xdnmx(lr) - xdnmx(lhl)) ! maximum possible average density
11846                                                            ! it is not exactly linear, but approx. is close enough for this
11847 !          tmpmx = 1./( (1. - fw)/900. + fw/1000. ) is exact max, where 900 is xdnmx
11849           tmpmx = xdnmx(lhl)/( 1. - fw*(1. - xdnmx(lhl)/xdnmx(lr) )) 
11851           IF ( tmp .gt. tmpmx  ) THEN
11852             an(ix,jy,kz,lvhl) = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/tmpmx
11853           ENDIF
11855 !          IF ( tmp .gt. xdnmx(lhl) .and. an(ix,jy,kz,lhlw) .lt. qxmin(lhl) ) THEN
11856 !            tmp = Min( xdnmx(lhl), tmp )
11857 !            an(ix,jy,kz,lvhl) = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/tmp
11858 !          ELSEIF ( tmp .gt. xdnmx(lr) ) THEN
11859 !            tmp =  xdnmx(lr)
11860 !            an(ix,jy,kz,lvhl) = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/tmp
11861 !          ENDIF
11862         ENDIF
11864         IF ( lhlw .gt. 1 ) THEN ! check if basically pure water
11865           IF ( an(ix,jy,kz,lhlw) .gt. 0.98*an(ix,jy,kz,lhl) ) THEN
11866            tmp = xdnmx(lr)
11867            an(ix,jy,kz,lvhl) = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/tmp
11868           ENDIF
11869         ENDIF
11870         
11871        ENDIF
11872        
11873        
11874 !  CHECK INTERCEPT
11875        IF ( ipconc == 5 .and.  an(ix,jy,kz,lhl) .gt. qxmin(lhl) .and.  alphahl .le. 0.1 .and. lnhl .gt. 1 .and. lzhl == 0 ) THEN
11876        
11877          IF ( lvhl .gt. 1 ) THEN
11878            hwdn = dn(ix,jy,kz)*an(ix,jy,kz,lhl)/an(ix,jy,kz,lvhl)
11879          ELSE
11880            hwdn = xdn0(lhl)
11881          ENDIF
11882            tmp = (hwdn*an(ix,jy,kz,lnhl))/(dn(ix,jy,kz)*an(ix,jy,kz,lhl))
11883            tmpg = an(ix,jy,kz,lnhl)*(tmp*(3.14159))**(1./3.)
11884            IF ( tmpg .lt. cnohlmn ) THEN
11885              tmp = ( (hwdn)/(dn(ix,jy,kz)*an(ix,jy,kz,lhl))*(3.14159))**(1./3.)
11886               an(ix,jy,kz,lnhl) = (cnohlmn/tmp)**(3./4.)
11887            ENDIF
11888        
11889        ENDIF
11890 !      ELSE  ! check mean size here?
11892       end if
11894       ENDIF !lhl
11898       IF ( lzh .gt. 1 ) THEN
11900         an(ix,jy,kz,lzh) = Max(0.0, an(ix,jy,kz,lzh) )
11901         
11902         IF ( .false. .and. an(ix,jy,kz,lh) .ge. frac*qxmin(lh) .and. rescale_low_alpha ) THEN
11903           
11904           IF ( an(ix,jy,kz,lnh) .gt. 0.0 ) THEN
11906            IF ( lvh .gt. 1 ) THEN
11907              IF ( an(ix,jy,kz,lvh) .gt. 0.0 ) THEN
11908                hwdn = dn(ix,jy,kz)*an(ix,jy,kz,lh)/an(ix,jy,kz,lvh)
11909              ELSE
11910                hwdn = xdn0(lh)
11911              ENDIF
11912              hwdn = Max( xdnmn(lh), hwdn )
11913            ELSE
11914              hwdn = xdn0(lh)
11915            ENDIF
11917              chw = an(ix,jy,kz,lnh)
11918              g1 = (6.0+alphamin)*(5.0+alphamin)*(4.0+alphamin)/   &
11919      &            ((3.0+alphamin)*(2.0+alphamin)*(1.0+alphamin))
11920              z1 = g1*dn(ix,jy,kz)**2*( an(ix,jy,kz,lh) )*an(ix,jy,kz,lh)/chw
11921              z1  = z1*(6./(pi*hwdn))**2
11922           ELSE
11923              z1 = 0.0
11924           ENDIF
11925           
11926           an(ix,jy,kz,lzh) = Min( z1, an(ix,jy,kz,lzh) )
11927           
11928           IF (  an(ix,jy,kz,lnh) .lt. 1.e-5 ) THEN
11929 !            an(ix,jy,kz,lzh) = 0.9*an(ix,jy,kz,lzh)
11930           ENDIF
11931         ENDIF
11932         
11933       ENDIF
11935       if ( an(ix,jy,kz,lh) .lt. frac*qxmin(lh) .or. zerocx(lh) ) then
11937 !        IF ( an(ix,jy,kz,lh) .gt. 0 ) THEN
11938           an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,lh)
11939           an(ix,jy,kz,lh) = 0.0
11940 !        ENDIF
11942         IF ( ipconc .ge. 5 ) THEN ! .and. an(ix,jy,kz,lnh) .gt. 0.0 ) THEN
11943           an(ix,jy,kz,lnh) = 0.0
11944         ENDIF
11946         IF ( lvh .gt. 1 ) THEN
11947            an(ix,jy,kz,lvh) = 0.0
11948         ENDIF
11949       
11950         IF ( lhw .gt. 1 ) THEN
11951            an(ix,jy,kz,lhw) = 0.0
11952         ENDIF
11954         IF ( lnhf .gt. 1 ) THEN
11955            an(ix,jy,kz,lnhf) = 0.0
11956         ENDIF
11957       
11958         IF ( lzh .gt. 1 ) THEN
11959            an(ix,jy,kz,lzh) = 0.0
11960         ENDIF
11962       ELSE
11963        IF ( lvol(lh) .gt. 1 ) THEN  ! check density
11964         IF ( an(ix,jy,kz,lvh) .gt. 0.0 ) THEN
11965          tmp = dn(ix,jy,kz)*an(ix,jy,kz,lh)/an(ix,jy,kz,lvh)
11966         ELSE
11967          tmp = rho_qh
11968           an(ix,jy,kz,lvh) = dn(ix,jy,kz)*an(ix,jy,kz,lh)/tmp
11969         ENDIF
11971         IF (  tmp .lt. xdnmn(lh) ) THEN
11972           tmp = Max( xdnmn(lh), tmp )
11973           an(ix,jy,kz,lvh) = dn(ix,jy,kz)*an(ix,jy,kz,lh)/tmp
11974         ENDIF
11976         IF ( tmp .gt. xdnmx(lh) .and. lhw .le. 0 ) THEN ! no liquid allowed on graupel
11977           tmp = Min( xdnmx(lh), tmp )
11978           an(ix,jy,kz,lvh) = dn(ix,jy,kz)*an(ix,jy,kz,lh)/tmp
11979         ELSEIF ( tmp .gt. xdnmx(lh) .and. lhw .gt. 1 ) THEN  ! allow for liquid on graupel
11980           fw = an(ix,jy,kz,lhw)/an(ix,jy,kz,lh)
11981 !          tmpmx = xdnmx(lh) + fw*(xdnmx(lr) - xdnmx(lh)) ! maximum possible average density
11982                                                            ! it is not exactly linear, but approx. is close enough for this
11983 !          tmpmx = 1./( (1. - fw)/900. + fw/1000. ) is exact max, where 900 is xdnmx
11984           tmpmx = xdnmx(lh)/( 1. - fw*(1. - xdnmx(lh)/xdnmx(lr) )) 
11986           IF ( tmp .gt. tmpmx  ) THEN
11987             an(ix,jy,kz,lvh) = dn(ix,jy,kz)*an(ix,jy,kz,lh)/tmpmx
11988           ENDIF
11990 !          IF ( tmp .gt. xdnmx(lh) .and. an(ix,jy,kz,lhw) .lt. qxmin(lh) ) THEN
11991 !            tmp = Min( xdnmx(lh), tmp )
11992 !            an(ix,jy,kz,lvh) = dn(ix,jy,kz)*an(ix,jy,kz,lh)/tmp
11993 !          ELSEIF ( tmp .gt. xdnmx(lr) ) THEN
11994 !            tmp =  xdnmx(lr)
11995 !            an(ix,jy,kz,lvh) = dn(ix,jy,kz)*an(ix,jy,kz,lh)/tmp
11996 !          ENDIF
11998         ENDIF
12000         IF ( lhw .gt. 1 ) THEN ! check if basically pure water
12001           IF ( an(ix,jy,kz,lhw) .gt. 0.98*an(ix,jy,kz,lh) ) THEN
12002            tmp = xdnmx(lr)
12003            an(ix,jy,kz,lvh) = dn(ix,jy,kz)*an(ix,jy,kz,lh)/tmp
12004           ENDIF
12005         ENDIF
12006         
12007        ENDIF
12009 !  CHECK INTERCEPT
12010        IF ( ipconc == 5 .and.  an(ix,jy,kz,lh) .gt. qxmin(lh) .and.  alphah .le. 0.1 .and. lnh .gt. 1 .and. lzh == 0 ) THEN
12011        
12012          IF ( lvh .gt. 1 ) THEN
12013            IF ( an(ix,jy,kz,lvh) .gt. 0.0 ) THEN
12014              hwdn = dn(ix,jy,kz)*an(ix,jy,kz,lh)/an(ix,jy,kz,lvh)
12015            ELSE
12016              hwdn = xdn0(lh)
12017            ENDIF
12018            hwdn = Max( xdnmn(lh), hwdn )
12019          ELSE
12020            hwdn = xdn0(lh)
12021          ENDIF
12022            tmp = (hwdn*an(ix,jy,kz,lnh))/(dn(ix,jy,kz)*an(ix,jy,kz,lh))
12023            tmpg = an(ix,jy,kz,lnh)*(tmp*(3.14159))**(1./3.)
12024            IF ( tmpg .lt. cnohmn ) THEN
12025 !           tmpg = an(ix,jy,kz,lnh)*( (hwdn*an(ix,jy,kz,lnh))/(dn(ix,jy,kz)*an(ix,jy,kz,lh))*(3.14159))**(1./3.)
12026 !           tmpg = an(ix,jy,kz,lnh)**(4./3.)*( (hwdn)/(dn(ix,jy,kz)*an(ix,jy,kz,lh))*(3.14159))**(1./3.)
12027              tmp = ( (hwdn)/(dn(ix,jy,kz)*an(ix,jy,kz,lh))*(3.14159))**(1./3.)
12028               an(ix,jy,kz,lnh) = (cnohmn/tmp)**(3./4.)
12029            ENDIF
12030        
12031        ENDIF
12032         
12033       end if
12036       if ( an(ix,jy,kz,ls) .lt.  frac*qxmin(ls)  .or. zerocx(ls)  & ! .or.  an(ix,jy,kz,lns) .lt. 0.1 ! .and.
12037      &         ) then
12038       IF ( t0(ix,jy,kz) .lt. 273.15 ) THEN
12039 !        IF ( an(ix,jy,kz,ls) .gt. 0 ) THEN
12040           an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,ls)
12041           an(ix,jy,kz,ls) = 0.0
12042 !        ENDIF
12043       
12044         IF ( ipconc .ge. 4 ) THEN ! .and. an(ix,jy,kz,lns) .gt. 0.0  ) THEN ! 
12045 !          an(ix,jy,kz,lni) = an(ix,jy,kz,lni) + an(ix,jy,kz,lns)
12046           an(ix,jy,kz,lns) = 0.0
12047         ENDIF
12048         
12049         IF ( lvs .gt. 1 ) THEN
12050            an(ix,jy,kz,lvs) = 0.0
12051         ENDIF
12053         IF ( lsw .gt. 1 ) THEN
12054            an(ix,jy,kz,lsw) = 0.0
12055         ENDIF
12057       ELSE
12058 !        IF ( an(ix,jy,kz,ls) .gt. 0 ) THEN
12059           an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,ls)
12060           an(ix,jy,kz,ls) = 0.0
12061 !        ENDIF
12063         IF ( lvs .gt. 1 ) THEN
12064            an(ix,jy,kz,lvs) = 0.0
12065         ENDIF
12067         IF ( lsw .gt. 1 ) THEN
12068            an(ix,jy,kz,lsw) = 0.0
12069         ENDIF
12071         IF ( ipconc .ge. 4 ) THEN ! .and. an(ix,jy,kz,lns) .gt. 0.0  ) THEN ! 
12072 !          an(ix,jy,kz,lnr) = an(ix,jy,kz,lnr) + an(ix,jy,kz,lns)
12073           an(ix,jy,kz,lns) = 0.0
12074         ENDIF
12076       ENDIF
12077       
12079       ELSEIF ( lvol(ls) .gt. 1 ) THEN  ! check density
12080         IF ( an(ix,jy,kz,lvs) .gt. 0.0 ) THEN
12081           tmp = dn(ix,jy,kz)*an(ix,jy,kz,ls)/an(ix,jy,kz,lvs)
12082           IF ( tmp .gt. xdnmx(ls) .or. tmp .lt. xdnmn(ls) ) THEN
12083             tmp = Min( xdnmx(ls), Max( xdnmn(ls), tmp ) )
12084             an(ix,jy,kz,lvs) = dn(ix,jy,kz)*an(ix,jy,kz,ls)/tmp
12085           ENDIF
12086         ELSE
12087           tmp = rho_qs
12088           an(ix,jy,kz,lvs) = dn(ix,jy,kz)*an(ix,jy,kz,ls)/tmp
12089         ENDIF
12092       end if
12094         IF ( lzr > 1 ) THEN
12095           an(ix,jy,kz,lzr) = Max(0.0, an(ix,jy,kz,lzr) )
12096         ENDIF
12098       if ( an(ix,jy,kz,lr) .lt. frac*qxmin(lr)  .or. zerocx(lr)  &
12099      &  ) then
12100         an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,lr)
12101         an(ix,jy,kz,lr) = 0.0
12102         IF ( ipconc .ge. 3 ) THEN
12103 !          an(ix,jy,kz,lnc) = an(ix,jy,kz,lnc) + an(ix,jy,kz,lnr)
12104           an(ix,jy,kz,lnr) = 0.0
12105         ENDIF
12106         
12107         IF ( lzr > 1 ) THEN
12108           an(ix,jy,kz,lzr) = 0.0
12109         ENDIF
12111       end if
12114 !  for qci
12116       IF ( an(ix,jy,kz,li) .le. frac*qxmin(li) .or. zerocx(li)   & ! .or.  an(ix,jy,kz,lni) .lt. 0.1
12117      &    ) THEN
12118       an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,li)
12119       an(ix,jy,kz,li)= 0.0
12120        IF ( ipconc .ge. 1 ) THEN
12121          an(ix,jy,kz,lni) = 0.0
12122        ENDIF
12123       ENDIF
12126 !  for qis
12128       IF ( lis > 1 ) THEN ! {
12129       IF ( an(ix,jy,kz,lis) .le. frac*qxmin(lis) .or. zerocx(lis)   & ! .or.  an(ix,jy,kz,lni) .lt. 0.1
12130      &    ) THEN ! { {
12131       an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,lis)
12132       an(ix,jy,kz,lis)= 0.0
12133        IF ( ipconc .ge. 1 ) THEN
12134          an(ix,jy,kz,lnis) = 0.0
12135        ENDIF
12136       
12137       ELSEIF ( icespheres >= 2 ) THEN ! } {
12138        km1 = Max(1, kz-1)
12139        IF ( 0.5*( w(ix,jy,kz) + w(ix,jy,kz+1)) < -1.0 .or.    &
12140      &      (icespheres == 3 .and. ( t0(ix,jy,kz) < 232.15 .or. an(ix,jy,kz,lc) < qxmin(lc) ) ) .or. &
12141      &      (icespheres == 5 .and. ( t0(ix,jy,kz) < 232.15 .or. &
12142      &         ( an(ix,jy,kz,lc) < qxmin(lc) .and. an(ix,jy,km1,lc) < qxmin(lc)  )) ) .or. &
12143      &      (icespheres == 4 .and. ( t0(ix,jy,kz) < 235.15 )) ) THEN ! transfer to regular ice crystals in downdraft or at low temp
12144          an(ix,jy,kz,li) = an(ix,jy,kz,li) + an(ix,jy,kz,lis)
12145          an(ix,jy,kz,lni) = an(ix,jy,kz,lni) + an(ix,jy,kz,lnis)
12146          an(ix,jy,kz,lis)= 0.0
12147          an(ix,jy,kz,lnis)= 0.0
12148          
12149        ENDIF
12150        
12151       ENDIF ! } }
12152       ENDIF ! }
12155 !  for qcw
12158       IF ( an(ix,jy,kz,lc) .le. frac*qxmin(lc) .or. zerocx(lc)   &
12159      &       ) THEN
12160       an(ix,jy,kz,lv) = an(ix,jy,kz,lv) + an(ix,jy,kz,lc)
12161       an(ix,jy,kz,lc)= 0.0
12162        IF ( ipconc .ge. 2 ) THEN
12163         IF ( lccn .gt. 1 .or. ac_opt == 1 ) THEN
12164           IF ( irenuc < 5 .and. lccna <= 1 ) THEN
12165             IF ( ac_opt == 0 ) THEN
12166                an(ix,jy,kz,lccn) = an(ix,jy,kz,lccn) + Max(0.0,an(ix,jy,kz,lnc))
12167             ENDIF
12168           ELSEIF ( lccna > 1 ) THEN
12169             an(ix,jy,kz,lccna) = Max( 0.0, an(ix,jy,kz,lccna) - Max(0.0,an(ix,jy,kz,lnc)) )
12170           ENDIF
12171         ENDIF
12172          an(ix,jy,kz,lnc) = 0.0
12173          IF ( lccn > 1 ) an(ix,jy,kz,lccn) = Max( 0.0, an(ix,jy,kz,lccn) )
12174          
12175          IF ( lccna > 0 .and. ac_opt == 0  ) THEN ! apply exponential decay to activated CCN to restore to environmental value
12176            IF ( restoreccn ) THEN
12177            tmp = an(ix,jy,kz,li) + an(ix,jy,kz,ls)  
12178            
12179            IF ( an(ix,jy,kz,lccna) > 1. .and. tmp < qxmin(li) ) an(ix,jy,kz,lccna) = an(ix,jy,kz,lccna)*Exp(-dtp/ccntimeconst)
12180            ENDIF
12181          ELSEIF ( lccn > 1 .and. restoreccn .and. ac_opt == 0  ) THEN
12182            ! in this case, we are treating the ccn field as ccna
12183            tmp = an(ix,jy,kz,li) + an(ix,jy,kz,ls)  
12184 !           IF ( ny == 2 .and. ix == nx/2 ) THEN
12185 !             write(0,*) 'restore: k, qccn,exp = ',kz,qccn,dn(ix,jy,kz)*qccn,Exp(-dtp/ccntimeconst)
12186 !             write(0,*) 'ccn1,ccn2 = ',an(ix,jy,kz,lccn),dn(ix,jy,kz)*qccn - Max(0.0 , dn(ix,jy,kz)*qccn - an(ix,jy,kz,lccn))*Exp(-dtp/ccntimeconst)
12187 !           ENDIF
12188            IF ( an(ix,jy,kz,lccn) > 1. .and. tmp < qxmin(li) .and. ( an(ix,jy,kz,lccn) < dn(ix,jy,kz)*qccn .or. .not. invertccn ) ) THEN 
12189         !      an(ix,jy,kz,lccn) =  &
12190         !            an(ix,jy,kz,lccn) +  Max(0.0 , dn(ix,jy,kz)*qccn - an(ix,jy,kz,lccn))*(1.0 - Exp(-dtp/ccntimeconst))
12191         ! Equivalent form after expanding last term:
12192                an(ix,jy,kz,lccn) =  &
12193                     dn(ix,jy,kz)*qccn - Max(0.0 , dn(ix,jy,kz)*qccn - an(ix,jy,kz,lccn))*Exp(-dtp/ccntimeconst)
12194            ENDIF
12195          
12196          ENDIF
12198        ENDIF
12200       ENDIF
12202       end do
12203 !      end do
12204       end do
12205       
12206       ENDIF ! true/false
12207       
12208       IF ( ndebug .ge. 1 ) write(6,*) 'END OF ICEZVD_DR'
12211    
12212    
12213    9999 RETURN
12214    
12215    END SUBROUTINE NUCOND
12218 ! #####################################################################
12219 ! #####################################################################
12224 !c--------------------------------------------------------------------------
12227 !--------------------------------------------------------------------------
12230       subroutine nssl_2mom_gs   &
12231      &  (nx,ny,nz,na,jyslab  &
12232      &  ,nor,norz          &
12233      &  ,dtp,gz       &
12234      &  ,t0,t1,t2,t3,t4,t5,t6,t7,t8,t9      &
12235      &  ,an,dn,p2                  &
12236      &  ,pn,w,iunit                   &
12237      &  ,t00,t77,                             &
12238      &   ventr,ventc,c1sw,jgs,ido,    &
12239      &   xdnmx,xdnmn,               &
12240 !     &   ln,ipc,lvol,lz,lliq,   &
12241      &   cdx,                              &
12242      &   xdn0,tmp3d,tkediss  &
12243      &  ,thproc,numproc,dx1,dy1,ngs     &
12244      & ,timevtcalc,axtra,io_flag  &
12245      & , has_wetscav,rainprod2d, evapprod2d, alpha2d &
12246      & ,elec,its,ids,ide,jds,jde &
12247      & )
12251 !--------------------------------------------------------------------------
12252 !                                
12253 !     Ziegler 1985 parameterized microphysics (also Zrnic et al. 1993)
12254 !     1)  cloud water
12255 !     2)  rain
12256 !     3)  column ice 
12257 !     6)  snow
12258 !     11) graupel/hail
12260 !--------------------------------------------------------------------------
12262 ! Notes:
12264 !  4/27/2009: allows for liquid water to be advected on snow and graupel particles using flag "mixedphase"
12266 !  3/14/2007: (APS) added qproc temp to make microphysic process timeseries
12268 !  10/17/2006: added flag (iehw) to select how to calculate ehw
12270 !  10/5/2006: switched chacr to integrated version rather than assuming that average rain
12271 !             drop mass does not change.  This acts to reduce rain size somewhat via graupel
12272 !             collection.
12273 !             Use Mason data for ehw, with scaling toward ehw=1 as air density decreases.
12275 !  10/3/2006: Turned off Meyers nucleation for T > -5 (can turn on with imeyers5 flag)
12276 !             Turned off contact nucleation in updrafts
12278 !  7/24/2006:  Turned on Meyers nucleation for -5 < T < 0
12280 !  5/12/2006:  Converted qsacw/csacw and qsaci/csaci to Z93
12282 !  5/12/2006:  Put a threshold on Bigg rain freezing.  If the frozen drops
12283 !              have an average volume less than xvhmn, then the drops are put
12284 !              into snow instead of graupel/hail.
12286 !              Fixed bug when vapor deposition was limited.
12288 !  5/13/2006:  Note that qhacr has a large effect, but Z85 did not include it.
12289 !              Turned off qsacr (set to zero).
12291 !  9/14/2007: erm: recalculate vx(lh) after setting xdn(lh) in case xdn was out of allowed range.
12292 !             added parameter rimc3 for minimum rime density.  Default value set at 170. kg/m**3
12293 !             instead of previous use of 100.  (Farley, 1987)
12295 !--------------------------------------------------------------------------
12297 !  general declarations
12299 !--------------------------------------------------------------------------
12305       implicit none
12307 !      integer icond 
12308 !      parameter ( icond = 2 )
12310       integer, parameter :: ng1 = 1
12312       integer nx,ny,nz,na,nba,nv
12313       integer nor,norz,istag,jstag,kstag ! ,nht,ngt,igsr
12314       integer iwrite
12315       real dtp,dx,dy,dz
12317       logical, intent(in) :: io_flag
12319       integer itile,jtile,ktile
12320       integer ixbeg,jybeg
12321       integer ixend,jyend,kzend,kzbeg
12322       integer nxend,nyend,nzend,nzbeg
12323       integer :: my_rank = 0
12324       integer, parameter :: myprock = 1, nprock = 1
12325       logical, intent(in) :: has_wetscav
12326       integer, intent(in) :: numproc
12327       real, intent(inout) :: thproc(nz,numproc)
12328       real, intent(in) :: dx1,dy1
12329       real rainprod2d(-nor+1:nx+nor,-norz+ng1:nz+norz)
12330       real evapprod2d(-nor+1:nx+nor,-norz+ng1:nz+norz)
12332       real alpha2d(-nor+1:nx+nor,-norz+ng1:nz+norz,3)
12334       real, parameter :: tfrdry = 243.15
12336       logical lrescalelow(lc:lhab)
12337       real tkediss(-nor+1:nx+nor,-norz+ng1:nz+norz)
12338       real axtra(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz,nxtra)
12340       real :: galpharaut
12341       real :: xvbarmax
12342       
12343       integer jyslab,its,ids,ide,jds,jde ! domain boundaries
12344       integer, intent(in) :: iunit !,iunit0
12345       real qvex
12346       integer iraincv, icgxconv
12347       parameter ( iraincv = 1, icgxconv = 1)
12348       real ffrz
12349       real :: ffrzh = 1.0
12351       real qcitmp,cirdiatmp ! ,qiptmp,qirtmp
12352       real ccwtmp,ccitmp ! ,ciptmp,cirtmp
12353       real cpqc,cpci ! ,cpip,cpir
12354       real cpqc0,cpci0 ! ,cpip0,cpir0
12355       real scfac ! ,cpip1
12356       
12357       double precision dp1
12358       
12359       double precision frac, frach, xvfrz, xvbiggsnow
12360       
12361       double precision :: timevtcalc
12362       double precision :: dpt1,dpt2
12363             
12364       logical, parameter :: gammacheck = .false.
12365       integer :: luindex
12366       double precision :: tmpgam
12367       logical, parameter :: usegamxinfcnu = .false.
12368       logical, parameter :: usegamxinf = .false.
12369       logical, parameter :: usegamxinf2 = .false.
12370       logical, parameter :: usegamxinf3 = .false.
12371 !      real rar  ! rime accretion rate as calculated from qxacw
12373 ! a few vars for time-split fallout      
12374       real vtmax
12375       integer n,ndfall
12376       
12377       double precision chgneg,chgpos,sctot
12378       
12379       real temgtmp
12381       real pb(-norz+ng1:nz+norz)
12382       real pinit(-norz+ng1:nz+norz)
12384       real gz(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz) ! dz
12385       
12386       real qimax,xni0,roqi0
12389       real dv
12391       real dtptmp
12392       integer itest,nidx,id1,jd1,kd1
12393       parameter (itest=1)
12394       parameter (nidx=10)
12395       parameter (id1=1,jd1=1,kd1=1)
12396       integer ierr
12397       integer iend
12399       integer ix,kz, il, ic, ir, icp1, irp1, ip1,jp1,kp1
12400       integer :: jy
12401       integer i,j,k,i1
12402       integer kzb,kze
12403       real slope1, slope2
12404       real x1, x2, x3
12405       real eps,eps2
12406       parameter (eps=1.e-20,eps2=1.e-5)
12408 !  Other elec. vars
12410       real  temele
12411       real  trev
12412       
12413       logical ldovol, ishail, ltest, wtest
12414       logical , parameter :: alp0flag = .false.
12417 !  wind indicies
12419       integer mu,mv,mw
12420       parameter (mu=1,mv=2,mw=3)
12422 !  conversion parameters
12424       integer mqcw,mqxw,mtem,mrho,mtim
12425       parameter (mqcw=21,mqxw=21,mtem=21,mrho=5,mtim=6)
12427       real xftim,xftimi,yftim, xftem,yftem, xfqcw,yfqcw, xfqxw,yfqxw
12428       parameter (xftim=0.05,xftimi = 1./xftim,yftim=1.)
12429       parameter (xftem=0.5,yftem=1.)
12430       parameter (xfqcw=2000.,yfqcw=1.)
12431       parameter (xfqxw=2000.,yfqxw=1.)
12432       real dtfac
12433       parameter ( dtfac = 1.0 )
12434       integer ido(lc:lqmx)
12436 !      integer iexy(lc:lqmx,lc:lqmx)
12437 !      integer ieswi, ieswir, ieswip, ieswc, ieswr
12438 !      integer ieglsw, iegli, ieglir, ieglip, ieglc, ieglr
12439 !      integer iegmsw, iegmi, iegmir, iegmip, iegmc, iegmr
12440 !      integer ieghsw, ieghi, ieghir, ieghip, ieghc, ieghr
12441 !      integer iefwsw, iefwi, iefwir, iefwip, iefwc, iefwr
12442 !      integer iehwsw, iehwi, iehwir, iehwip, iehwc, iehwr
12443 !      integer iehlsw, iehli, iehlir, iehlip, iehlc, iehlr
12444 !      real delqnsa, delqxsa, delqnsb, delqxsb, delqnia, delqxia
12445 !      real delqnra, delqxra
12447        real delqnxa(lc:lqmx)
12448        real delqxxa(lc:lqmx)
12450 ! external temporary arrays
12452       real t00(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12453       real t77(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12455       real t0(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12456       real t1(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12457       real t2(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12458       real t3(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12459       real t4(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12460       real t5(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12461       real t6(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12462       real t7(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12463       real t8(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12464       real t9(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12466       real p2(-nor+1:nx+nor,-nor+1:ny+nor,-norz+ng1:nz+norz)  ! perturbation Pi
12467       real pn(-nor+1:nx+nor,-nor+1:ny+nor,-norz+ng1:nz+norz)
12468       real an(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz,na)
12469       real dn(-nor+1:nx+nor,-nor+1:ny+nor,-norz+ng1:nz+norz)
12470       real w(-nor+1:nx+nor,-nor+1:ny+nor,-norz+ng1:nz+norz)
12472       real tmp3d(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz)
12475 !  declarations microphyscs and for gather/scatter
12477       integer nxmpb,nzmpb,nxz
12478       integer jgs,mgs,ngs,numgs
12479       integer, parameter :: ngsz = 500
12480       integer ntt
12481       parameter (ntt=300)
12483       real dvmgs(ngs)
12484       
12485       integer ngscnt,igs(ngs),kgs(ngs)
12486       integer kgsp(ngs),kgsm(ngs),kgsm2(ngs)
12487       integer ncuse
12488       parameter (ncuse=0)
12489       integer il0(ngs),il5(ngs),il2(ngs),il3(ngs)
12490 !      integer il1m(ngs),il2m(ngs),il3m(ngs),il4m(ngs),il5m(ngs)
12492       real tdtol,temsav,tfrcbw,tfrcbi
12493       real, parameter :: thnuc = 235.15
12495 !  Ice Multiplication Arrays.
12497       real  fimt1(ngs),fimta(ngs),fimt2(ngs) !,qmul1(ngs),qmul2(ngs)
12498       real xcwmas
12501 ! Variables for Ziegler warm rain microphysics
12502 !      
12505       real ccnc(ngs),ccin(ngs),cina(ngs),ccna(ngs)
12506       real cwnccn(ngs)
12507       real sscb  ! 'cloud base' SS threshold
12508       parameter ( sscb = 2.0 )
12509       integer idecss  ! flag to turn on (=1) decay of ssmax when no cloud or ice crystals
12510       parameter ( idecss = 1 )
12511       integer iba ! flag to do condensation/nucleation in 1st or 2nd loop
12512                   ! =0 to use ad to calculate SS
12513                   ! =1 to use an at end of main jy loop to calculate SS
12514       parameter (iba = 1)
12515       integer ifilt   ! =1 to filter ssat, =0 to set ssfilt=ssat
12516       parameter ( ifilt = 0 ) 
12517       real temp1,temp2 ! ,ssold
12518       real :: mwat, mice, dice, mwshed, fwmax, fw, mwcrit, massfactor, tmpdiam
12519       real, parameter :: shedalp = 3.  ! set 3 for maximum mass diameter (same as area-weighted diameter), 4 for mass-weighted diameter
12520       real ssmax(ngs)       ! maximum SS experienced by a parcel
12521       real ssmx
12522       real dnnet,dqnet
12523 !      real cnu,rnu,snu,cinu
12524 !      parameter ( cnu = 0.0, rnu = -0.8, snu = -0.8, cinu = 0.0 )
12525       real bfnu, bfnu0, bfnu1
12526       parameter ( bfnu0 = (rnu + 2.0)/(rnu + 1.0)  )
12527       real ventr, ventc
12528       real volb
12529       double precision t2s, xdp
12530       double precision xl2p(ngs),rb(ngs)
12531       real, parameter :: aa1 = 9.44e15, aa2 = 5.78e3  ! a1 in Ziegler
12532 ! snow parameters:
12533       real, parameter :: cexs = 0.1, cecs = 0.5 
12534       real, parameter :: rvt = 0.104  ! ratio of collection kernels (Zrnic et al, 1993)
12535       real, parameter :: kfrag = 1.0e-6 ! rate coefficent for collisional splintering (Schuur & Rutledge 00b)
12536       real, parameter :: mfrag = 1.0e-10 ! assumed ice fragment mass for collisional splintering (Schuur & Rutledge 00b)
12537       double precision cautn(ngs), rh(ngs), nh(ngs)
12538       real ex1, ft, rhoinv(ngs)
12539       double precision ec0(ngs)
12540       
12541       real ac1,bc, taus, c1,d1,e1,f1,p380,tmp,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,temp3 ! , sstdy, super
12542       real :: flim
12543       real dw,dwr
12544       double precision :: tmpz, tmpzmlt
12545       real ratio, delx, dely
12546       real dbigg,volt
12547       real chgtmp,fac,mixedphasefac
12548       real x,y,y2,del,r,rtmp,alpr
12549       double precision :: vent1,vent2
12550       double precision :: g1palp,g4palp
12551       double precision :: g1palpinf,g4palpinf
12552       real fqt !charge separation as fn of temperature from Dong and Hallett 1992
12553       real bs
12554       real v1, v2
12555       real d1r, d1i, d1s, e1i
12556       real c1sw   ! integration factor for snow melting with snu = -0.8
12557       real, parameter :: vr1mm = 5.23599e-10 ! volume of 1mm diameter sphere (m**3)
12558       real, parameter :: vr3mm = 5.23599e-10*(3.0/1.)**3   ! volume of a 3 mm diameter sphere (m**3) (Rasmussen et al. 1984b, JAS)
12559       real, parameter :: vr4p5mm = 5.23599e-10*(4.5/1.)**3 ! volume of 4.5mm diameter sphere (m**3) (Rasmussen et al. 1984b, JAS)
12560       real vmlt,vshd, vshdgs(ngs,lh:lhab), maxmassfac(lc:lhab)
12561       real rhosm
12562       parameter ( rhosm = 500. )
12563       integer nc ! condensation step
12564       real dtcon,dtcon1,dtcon2 ! condensation time step (dtcon*nc = dtp)
12565       real delta
12566       integer ltemq1,ltemq1m ! ,ltemq1m2
12567       real dqv,qv1,ss1,ss2,qvs1,dqvs,dtemp,dt1   ! temporaries for condensation
12568       real ssi1, ssi2, dqvi, dqvis, dqvii,qis1
12569       real dqvr, dqc, dqr, dqi, dqs
12570       real qv1m,qvs1m,ss1m,ssi1m,qis1m
12571       real cwmastmp
12572       real  dcloud,dcloud2 ! ,as, bs
12573       real cn(ngs)
12574       double precision xvc, xvr
12575       real mwfac
12576 !      real  es(ngs) ! ss(ngs),
12577 !      real  eis(ngs)
12579       real rwmasn,rwmasx
12581       real vgra,vfrz
12582       parameter ( vgra = 0.523599*(1.0e-3)**3 )
12583      
12584 !      real, parameter :: epsi = 0.622
12585 !      real, parameter :: d = 0.266
12586       real :: d, dold, denom,denominv,vth
12587       double precision :: h1, h2, h3, h4,denomdp, denominvdp
12588       real r1,qevap ! ,slv
12589       
12590       real vr,nrx,chw,g1,qr,z,z1,rdi,alp,xnutmp,xnuc,g1r,rd1,rdia,rmas
12591       real :: snowmeltmass = 0
12592       
12593 !      real, parameter :: rhofrz = 900.   ! density of graupel from newly-frozen rain
12594       real, parameter :: rimedens = 500. ! default rime density
12596 !      real svc(ngs)  !  droplet volume
12598 !  contact freezing nucleation
12600       real raero,kaero !assumd aerosol radius, thermal conductivity
12601       parameter ( raero = 3.e-7, kaero = 5.39e-3 )
12602       real kb   ! Boltzman constant  J K-1
12603       parameter (kb = 1.3807e-23)
12604       
12605       real knud(ngs),knuda(ngs) !knudsen number and correction factor
12606       real gtp(ngs)  !G(T,p) = 1/(a' + b')  Cotton 72b
12607       real dfar(ngs) !aerosol diffusivity
12608       real fn1(ngs),fn2(ngs),fnft(ngs)
12609       
12610       real ccia(ngs)
12611       real ctfzbd(ngs),ctfzth(ngs),ctfzdi(ngs)
12613 !  misc
12615       real ni,nis,nr,d0
12616       real dqvcnd(ngs),dqwv(ngs),dqcw(ngs),dqci(ngs),dqcitmp(ngs),dqwvtmp(ngs)
12617       real tempc(ngs)
12618       real temg(ngs),temcg(ngs),theta(ngs),qvap(ngs) 
12619       real temgkm1(ngs), temgkm2(ngs)
12620       real temgx(ngs),temcgx(ngs)
12621       real qvs(ngs),qis(ngs),qss(ngs),pqs(ngs)
12622       real elv(ngs),elf(ngs),els(ngs)
12623       real tsqr(ngs),ssi(ngs),ssw(ngs),ssi0(ngs)
12624       real qcwtmp(ngs),qtmp,qtot(ngs) 
12625       real qcond(ngs)
12626       real ctmp, sctmp
12627       real cimasn,cimasx,ccimx
12628       real pid4
12629       real cs,ds,gf7,gf6,gf5,gf4,gf3,gf2,gf1
12630       real gcnup1,gcnup2
12631       real gf73rds, gf83rds
12632       real gamice73fac, gamsnow73fac
12633       real gf43rds, gf53rds
12634       real aradcw,bradcw,cradcw,dradcw,cwrad,rwrad,rwradmn
12635       parameter ( rwradmn = 50.e-6 )
12636       real dh0
12637       real dg0(ngs),df0(ngs)
12638       real dhwet(ngs),dhlwet(ngs),dfwet(ngs)
12639       
12640       real clionpmx,clionnmx
12641       parameter (clionpmx=1.e9,clionnmx=1.e9) ! Takahashi 84
12643 !  other arrays
12645       real fwet1(ngs),fwet2(ngs)   
12646       real fmlt1(ngs),fmlt2(ngs),fmlt1e(ngs)
12647       real fvds(ngs),fvce(ngs),fiinit(ngs) 
12648       real fvent(ngs),fraci(ngs),fracl(ngs)
12650       real fai(ngs),fav(ngs),fbi(ngs),fbv(ngs)
12651       real felv(ngs),fels(ngs),felf(ngs)
12652       real felvcp(ngs),felscp(ngs),felfcp(ngs)
12653       real felvpi(ngs),felspi(ngs),felfpi(ngs)
12654       real felvs(ngs),felss(ngs)      !   ,felfs(ngs)
12655       real fwvdf(ngs),ftka(ngs),fthdf(ngs)
12656       real fadvisc(ngs),fakvisc(ngs)
12657       real fci(ngs),fcw(ngs) ! heat capacities of ice and liquid
12658       real fschm(ngs),fpndl(ngs)
12659       real fgamw(ngs),fgams(ngs)
12660       real fcqv1(ngs),fcqv2(ngs),fcc3(ngs) 
12661       
12662       real cvm,cpm,rmm
12664       real, parameter ::      cpv = 1885.0       ! specific heat of water vapor at constant pressure
12666       real fcci(ngs), fcip(ngs)
12668       real :: sfm1(ngs),sfm2(ngs)
12669       real :: gfm1(ngs),gfm2(ngs)
12670       real :: ffm1(ngs),ffm2(ngs)
12671       real :: hfm1(ngs),hfm2(ngs)
12673       logical :: wetsfc(ngs),wetsfchl(ngs),wetsfcf(ngs)
12674       logical :: wetgrowth(ngs), wetgrowthhl(ngs), wetgrowthf(ngs)
12676       real qitmp(ngs),qistmp(ngs)
12677        
12678       real rzxh(ngs), rzxhl(ngs), rzxhlh(ngs), rzxhlf(ngs)
12679       real rzxs(ngs), rzxf(ngs)
12680 !      real axh(ngs),bxh(ngs),axhl(ngs),bxhl(ngs)
12681       real cdh(ngs),cdhl(ngs)
12682       real :: axx(ngs,lh:lhab),bxx(ngs,lh:lhab)
12683       real vt2ave(ngs)
12685       real :: qcwresv(ngs), ccwresv(ngs) ! "reserved" droplet mass and number that are too small for accretion
12686       
12687       real ::  lfsave(ngs,6)
12688       real ::  qx(ngs,lv:lhab)
12689       real ::  qxw(ngs,ls:lhab)
12690       real ::  qxwlg(ngs,lh:lhab)
12691       real ::  chxf(ngs,lh:lhab)
12692       real ::  cx(ngs,lc:lhab)
12693       real ::  cxmxd(ngs,lc:lhab)
12694       real ::  qxmxd(ngs,lv:lhab)
12695       real ::  scx(ngs,lc:lhab)
12696       real ::  xv(ngs,lc:lhab)
12697       real ::  vtxbar(ngs,lc:lhab,3)
12698       real ::  xmas(ngs,lc:lhab)
12699       real ::  xdn(ngs,lc:lhab)
12700       real ::  xdntmp(ngs,lc:lhab)
12701       real ::  cdxgs(ngs,lc:lhab)
12702       real ::  xdia(ngs,lc:lhab,3)
12703       real ::  vtwtdia(ngs,lr:lhab) ! sweep-out volume weighted diameter
12704       real ::  rarx(ngs,ls:lhab)
12705       real ::  vx(ngs,li:lhab)
12706       real ::  rimdn(ngs,li:lhab)
12707       real ::  raindn(ngs,li:lhab)
12708       real ::  alpha(ngs,lc:lhab)
12709       real ::  dab0lh(ngs,lc:lhab,lc:lhab)
12710       real ::  dab1lh(ngs,lc:lhab,lc:lhab)
12711       real ::  zx(ngs,lr:lhab)
12712       real ::  zxmxd(ngs,lr:lhab)
12713       real ::  g1x(ngs,lr:lhab)
12714       
12716       real :: qsimxdep(ngs) ! max sublimation of qi+qs+qis
12717       real :: qsimxsub(ngs) ! max depositionof qi+qs+qis
12718       logical,parameter :: DoSublimationFix = .true.
12719       real :: qrtmp(ngs),qvtmp(ngs),qctmp(ngs)
12720       real :: felvcptmp,felscptmp,qsstmp
12721       real :: thetatmp, thetaptmp, temcgtmp,qvaptmp
12722       real :: qvstmp, qisstmp, qvptmp, qitmp1, qctmp1
12723       
12724       real :: galphrout
12725       
12726       real ventrx(ngs)
12727       real ventrxn(ngs)
12728       real g1shr, alphashr
12729       real g1mlr, alphamlr
12730       real g1smlr, alphasmlr
12731       real massfacshr, massfacmlr
12732       
12733       real :: qhgt8mm ! ice mass greater than 8mm
12734       real :: qhwgt8mm ! ice + max water mass greater than 8mm
12735       real :: qhgt10mm ! mass greater than 10mm
12736       real :: qhgt20mm ! mass greater than 20mm
12737       real :: fwmhtmp
12738       real, parameter :: fwmhtmptem = -15. ! temperature at which fwmhtmp fully switches to liquid water only being on large particles
12739       real, parameter :: d1t = (6.0 * 0.268e-3/(917.* pi))**(1./3.) ! d1t is the diameter of the ice sphere with the mass (0.268e-3 kg) of an 8mm spherical drop
12740       real, parameter :: srasheym = 0.1389 ! slope fraction from Rasmussen and Heymsfield 
12742       real swvent(ngs),hwvent(ngs),rwvent(ngs),hlvent(ngs),hwventy(ngs),hlventy(ngs),rwventz(ngs)
12743       real hxventtmp
12744       real hlventinc(ngs),hwventinc(ngs)
12745       integer, parameter :: ndiam = 10
12746       integer :: numdiam
12747       real hwvent0(ndiam+4),hlvent0 ! 0 to d1
12748       real hwvent1,hlvent1 ! d1 to infinity
12749       real hwvent2,hlvent2 ! d2 to infinity
12750       real gama0,gamb0
12751       real gama1,gamb1
12752       real gama2,gamb2
12753 !      real, parameter :: mltdiam1 = 9.0e-3, mltdiam1p5 = 16.0e-3, mltdiam2 = 19.0e-3, mltdiam3 = 200.0e-3, mltdiam05 = 4.5e-3
12754       real :: mltdiam(ndiam+4)
12755       real mltmass0inv,mltmass1inv,mltmass2inv, mltmass1cgs, mltmass2cgs,mltmass3inv, mltmass3cgs
12756       real qhmlr0, qhmlr05, qhmlr1, qhmlr2,qhmlr3, qhmlr12, qhmlr23
12757       real qhlmlr0, qhlmlr05, qhlmlr1, qhlmlr2,qhlmlr3, qhlmlr12, qhlmlr23
12758       real qxd1, cxd1, zxd1 ! mass and number up to mltdiam1
12759       real qxd05, cxd05 ! mass and number up to mltdiam1/2
12760       
12761       real :: qxd(ndiam+4), cxd(ndiam+4), qhml(ndiam+4), qhml0(ndiam+4)
12762       real :: dqxd(ndiam+4), dcxd(ndiam+4), dqhml(ndiam+4)
12763       
12764       
12765       real civent(ngs)
12766       real isvent(ngs)
12768       real xmascw(ngs)
12769       real xdnmx(lc:lhab), xdnmn(lc:lhab)
12770       real dnmx
12771       real :: xdiamxmas(ngs,lc:lhab)
12773       real cilen(ngs) ! ,ciplen(ngs)
12776       real rwcap(ngs),swcap(ngs)
12777       real hwcap(ngs)
12778       real hlcap(ngs)
12779       real cicap(ngs)
12780       real iscap(ngs)
12782       real qvimxd(ngs)
12783       real qimxd(ngs),qismxd(ngs),qcmxd(ngs),qrmxd(ngs),qsmxd(ngs),qhmxd(ngs),qhlmxd(ngs)
12784       real cimxd(ngs),ccmxd(ngs),crmxd(ngs),csmxd(ngs),chmxd(ngs)
12785       real cionpmxd(ngs),cionnmxd(ngs)
12786       real clionpmxd(ngs),clionnmxd(ngs)
12789       real elec(-nor+ng1:nx+nor,-nor+ng1:ny+nor,-norz+ng1:nz+norz) ! Ez (elecsave)
12793       ! Hallett-Mossop arrays
12794       real chmul1(ngs),chlmul1(ngs),csmul1(ngs),csmul(ngs)
12795       real qhmul1(ngs),qhlmul1(ngs),qsmul1(ngs),qsmul(ngs)
12796       
12797       ! splinters from drop freezing
12798       real csplinter(ngs),qsplinter(ngs)
12799       real csplinter2(ngs),qsplinter2(ngs)
12802 !  concentration arrays...
12804       real :: chlcnh(ngs), vhlcnh(ngs), vhlcnhl(ngs)
12805       real :: chlcnhhl(ngs) ! number of new hail particles (may be different from number of lost graupel)
12806       real cracif(ngs), ciacrf(ngs)
12807       real cracr(ngs)
12810       real ciint(ngs), crfrz(ngs), crfrzf(ngs), crfrzs(ngs)
12811       real cicint(ngs)
12812       real cipint(ngs)
12813       real ciacw(ngs), cwacii(ngs) 
12814       real ciacr(ngs), craci(ngs)
12815       real csacw(ngs)
12816       real csacr(ngs)
12817       real csaci(ngs),   csacs(ngs)
12818       real cracw(ngs) 
12819       real chacw(ngs), chacr(ngs)
12820       real :: chlacw(ngs) 
12821       real chaci(ngs), chacs(ngs)
12823       real :: chlacr(ngs)
12824       real :: chlaci(ngs), chlacs(ngs)
12825       real crcnw(ngs) 
12826       real cidpv(ngs),cisbv(ngs)
12827       real cisdpv(ngs),cissbv(ngs)
12828       real cimlr(ngs),cismlr(ngs)
12830       real chlsbv(ngs), chldpv(ngs)
12831       real chlmlr(ngs), chlmlrr(ngs)
12832       real chlfmlr(ngs)
12833 !      real chlmlrsave(ngs),chlsave(ngs),qhlsave(ngs)
12834       real chlshr(ngs), chlshrr(ngs)
12837       real chdpv(ngs),chsbv(ngs)
12838       real chmlr(ngs),chcev(ngs)
12839       real chmlrr(ngs)
12840       real chshr(ngs), chshrr(ngs)
12842       real csdpv(ngs),cssbv(ngs)
12843       real csmlr(ngs),csmlrr(ngs),cscev(ngs)
12844       real csshr(ngs), csshrr(ngs)
12846       real crcev(ngs)
12847       real crshr(ngs)
12848       real cwshw(ngs), qwshw(ngs)
12851 ! arrays for w-ac-x ;  x-ac-w
12855       real qrcnw(ngs), qwcnr(ngs)
12856       real zrcnw(ngs),zracr(ngs),zracw(ngs),zrcev(ngs)
12858       real qracw(ngs) ! qwacr(ngs),
12859       real qiacw(ngs) !, qwaci(ngs)
12861       real qsacw(ngs) ! ,qwacs(ngs),
12862       real qhacw(ngs) ! qwach(ngs),
12863       real :: qhlacw(ngs), qxacwtmp, qxacrtmp, qxacitmp, qxacstmp !
12864       real vhacw(ngs), vsacw(ngs), vhlacw(ngs), vhlacr(ngs)
12866       real qfcev(ngs)
12867       real qfmul1(ngs),cfmul1(ngs)
12869       real qsacws(ngs)
12872 !  arrays for x-ac-r and r-ac-x; 
12874       real qsacr(ngs),qracs(ngs)
12875       real qhacr(ngs),qhacrmlr(ngs),qhacwmlr(ngs) ! ,qrach(ngs)
12876       real vhacr(ngs), zhacr(ngs), zhacrf(ngs), zrach(ngs), zrachl(ngs)
12877       real qiacr(ngs),qraci(ngs)
12878       
12879       real ziacr(ngs)
12881       real qracif(ngs),qiacrf(ngs),qiacrs(ngs),ciacrs(ngs)
12883       real :: qhlacr(ngs),qhlacrmlr(ngs), qhlacwmlr(ngs)
12884       real qsacrs(ngs) !,qracss(ngs)
12886 !  ice - ice interactions
12888       real qsaci(ngs)
12889       real qsacis(ngs)
12890       real qhaci(ngs)
12891       real qhacs(ngs)
12893       real :: qhacis(ngs) 
12894       real :: chacis(ngs) 
12895       real :: chacis0(ngs)
12897       real :: csaci0(ngs) ! collision rate only
12898       real :: chaci0(ngs) ! collision rate only
12899       real :: chacs0(ngs) ! collision rate only
12900       real :: chlaci0(ngs)
12901       real :: chlacis(ngs)
12902       real :: chlacis0(ngs)
12903       real :: chlacs0(ngs) 
12905       real :: qsaci0(ngs) ! collision rate only
12906       real :: qsacis0(ngs) ! collision rate only
12907       real :: qhaci0(ngs) ! collision rate only
12908       real :: qhacis0(ngs) ! collision rate only
12909       real :: qhacs0(ngs) ! collision rate only
12910       real :: qhlaci0(ngs)  
12911       real :: qhlacis0(ngs)
12912       real :: qhlacs0(ngs) 
12914       real :: qhlaci(ngs)  
12915       real :: qhlacis(ngs)
12916       real :: qhlacs(ngs)
12918 !  conversions
12920       real qrfrz(ngs) ! , qirirhr(ngs)
12921       real zrfrz(ngs), zrfrzf(ngs), zrfrzs(ngs)
12922       real ziacrf(ngs), zhcnsh(ngs), zhcnih(ngs)
12923       real zhacw(ngs), zhacs(ngs), zhaci(ngs)
12924       real zhmlr(ngs), zhdsv(ngs), zhsbv(ngs), zhlcnh(ngs), zhshr(ngs)
12925       real zfacw(ngs), zfacs(ngs), zfaci(ngs)
12926       real zfmlr(ngs), zfdsv(ngs), zfsbv(ngs), zhlcnf(ngs), zfshr(ngs), zfshrr(ngs)
12927       real zhmlrtmp,zhmlr0inf,zhlmlr0inf
12928       real zhmlrr(ngs),zhlmlrr(ngs),zhshrr(ngs),zhlshrr(ngs),zfmlrr(ngs)
12929 !      real zsmlr(ngs)
12930       real zsmlrr(ngs), zsshr(ngs), zsshrr(ngs)
12931       real zhcns(ngs), zhcni(ngs)
12932       real zhwdn(ngs), zfwdn(ngs) ! change in Z due to density changes
12933       real zhldn(ngs) ! change in Z due to density changes
12935       real zhlacw(ngs), zhlacs(ngs), zhlacr(ngs)
12936       real zhlmlr(ngs), zhldsv(ngs), zhlsbv(ngs), zhlshr(ngs)
12938       
12939       real vrfrzf(ngs), viacrf(ngs)
12940       real qrfrzs(ngs), qrfrzf(ngs)
12941       real qwfrz(ngs), qwctfz(ngs)
12942       real cwfrz(ngs), cwctfz(ngs)
12943       real qwfrzis(ngs), qwctfzis(ngs) ! droplet freezing to ice spheres
12944       real cwfrzis(ngs), cwctfzis(ngs)
12945       real qwfrzc(ngs), qwctfzc(ngs) ! droplet freezing to columns
12946       real cwfrzc(ngs), cwctfzc(ngs)
12947       real qwfrzp(ngs), qwctfzp(ngs) ! droplet freezing to plates
12948       real cwfrzp(ngs), cwctfzp(ngs)
12949       real xcolmn(ngs), xplate(ngs)
12950       real ciihr(ngs), qiihr(ngs)
12951       real cicichr(ngs), qicichr(ngs)
12952       real cipiphr(ngs), qipiphr(ngs)
12953       real qscni(ngs), cscni(ngs), cscnis(ngs)
12954       real qscnvi(ngs), cscnvi(ngs), cscnvis(ngs)
12955       real qhcns(ngs), chcns(ngs), chcnsh(ngs), vhcns(ngs)
12956       real qscnh(ngs), cscnh(ngs), vscnh(ngs)
12957       real qhcni(ngs), chcni(ngs), chcnih(ngs), vhcni(ngs)
12958       real qiint(ngs),qipipnt(ngs),qicicnt(ngs)
12959       real cninm(ngs),cnina(ngs),cninp(ngs),wvel(ngs),wvelkm1(ngs)
12960       real tke(ngs)
12961       real uvel(ngs),vvel(ngs)
12963       real qidpv(ngs),qisbv(ngs) ! qicnv(ngs),qievv(ngs),
12964       real qimlr(ngs),qidsv(ngs),qisdsv(ngs),qidsvp(ngs) ! ,qicev(ngs)
12965       real qismlr(ngs)
12969       real :: qhldpv(ngs), qhlsbv(ngs) ! qhlcnv(ngs),qhlevv(ngs),
12970       real :: qhlmlr(ngs), qhldsv(ngs), qhlmlrsave(ngs)
12971       real :: qhlwet(ngs), qhldry(ngs), qhlshr(ngs), qxwettmp
12973       real :: qrfz(ngs),qsfz(ngs),qhfz(ngs),qhlfz(ngs)
12974       real :: qffz(ngs)
12976       real qhdpv(ngs),qhsbv(ngs) ! qhcnv(ngs),qhevv(ngs),
12977       real qhmlr(ngs),qhdsv(ngs),qhcev(ngs),qhcndv(ngs),qhevv(ngs)
12978       real qhlcev(ngs), chlcev(ngs)
12979       real qhwet(ngs),qhdry(ngs),qhshr(ngs)
12980       real qhshrp(ngs)
12981       real qhshh(ngs) !accreted water that remains on graupel
12982       real qhmlh(ngs) !melt water that remains on graupel
12983       real qhfzh(ngs) !water that freezes on mixed-phase graupel
12984       real qffzf(ngs) !water that freezes on mixed-phase FD
12985       real qhlfzhl(ngs) !water that freezes on mixed-phase hail
12986       
12987       real qhmlrlg(ngs),qhlmlrlg(ngs) ! melting from the larger diameters
12988       real qhfzhlg(ngs) !water that freezes on mixed-phase graupel (large sizes)
12989       real qhlfzhllg(ngs) !water that freezes on mixed-phase hail (large sizes)
12990       real qhlcevlg(ngs), chlcevlg(ngs)
12991       real qhcevlg(ngs), chcevlg(ngs)
12993       real vhfzh(ngs), vffzf(ngs) ! change in volume from water that freezes on mixed-phase graupel, frozen drops
12994       real vhlfzhl(ngs) !  change in volume from water that freezes on mixed-phase hail
12996       real vhshdr(ngs) !accreted water that leaves on graupel (mixedphase)
12997       real vhlshdr(ngs) !accreted water that leaves on hail (mixedphase)
12998       real vhmlr(ngs) !melt water that leaves graupel (single phase)
12999       real vhlmlr(ngs) !melt water that leaves hail (single phase)
13000       real vhsoak(ngs) !  aquired water that seeps into graupel.
13001       real vhlsoak(ngs) !  aquired water that seeps into hail.
13002       
13004       real qsdpv(ngs),qssbv(ngs) ! qscnv(ngs),qsevv(ngs),
13005       real qsmlr(ngs),qsdsv(ngs),qscev(ngs),qscndv(ngs),qsevv(ngs)
13006       real qswet(ngs),qsdry(ngs),qsshr(ngs)
13007       real qsshrp(ngs)
13008       real qsfzs(ngs)
13011       real qipdpv(ngs),qipsbv(ngs)
13012       real qipmlr(ngs),qipdsv(ngs)
13014       real qirdpv(ngs),qirsbv(ngs)
13015       real qirmlr(ngs),qirdsv(ngs),qirmlw(ngs)
13017       real qgldpv(ngs),qglsbv(ngs)
13018       real qglmlr(ngs),qgldsv(ngs)
13019       real qglwet(ngs),qgldry(ngs),qglshr(ngs)
13020       real qglshrp(ngs)
13022       real qgmdpv(ngs),qgmsbv(ngs)
13023       real qgmmlr(ngs),qgmdsv(ngs)
13024       real qgmwet(ngs),qgmdry(ngs),qgmshr(ngs)
13025       real qgmshrp(ngs)
13026       real qghdpv(ngs),qghsbv(ngs)
13027       real qghmlr(ngs),qghdsv(ngs) 
13028       real qghwet(ngs),qghdry(ngs),qghshr(ngs)
13029       real qghshrp(ngs)
13031       real qrztot(ngs),qrzmax(ngs),qrzfac(ngs)
13032       real qrcev(ngs)
13033       real qrshr(ngs)
13034       real fsw(ngs),fhw(ngs),fhlw(ngs),ffw(ngs) !liquid water fractions
13035       real fswmax(ngs),fhwmax(ngs),fhlwmax(ngs) !liquid water fractions
13036       real ffwmax(ngs)
13037       real qhcnf(ngs) 
13038       real :: qhlcnh(ngs)
13039       real qhcngh(ngs),qhcngm(ngs),qhcngl(ngs)
13040       
13041       real :: qhcnhl(ngs), chcnhl(ngs), zhcnhl(ngs), vhcnhl(ngs) ! conversion of low-density hail back to graupel
13043       real eiw(ngs),eii(ngs),eiri(ngs),eipir(ngs),eisw(ngs)
13044       real erw(ngs),esw(ngs),eglw(ngs),eghw(ngs),efw(ngs)
13045       real ehxw(ngs),ehlw(ngs),egmw(ngs),ehw(ngs)
13046       real err(ngs),esr(ngs),eglr(ngs),eghr(ngs),efr(ngs)
13047       real ehxr(ngs),ehlr(ngs),egmr(ngs) 
13048       real eri(ngs),esi(ngs),egli(ngs),eghi(ngs),efi(ngs),efis(ngs)
13049       real ehxi(ngs),ehli(ngs),egmi(ngs),ehi(ngs),ehis(ngs),ehlis(ngs)
13050       real ers(ngs),ess(ngs),egls(ngs),eghs(ngs),efs(ngs),ehs(ngs),ehsfac(ngs)
13051       real ehscnv(ngs)
13052       real ehxs(ngs),ehls(ngs),egms(ngs),egmip(ngs) 
13054       real ehsclsn(ngs),ehiclsn(ngs),ehisclsn(ngs)
13055       real efsclsn(ngs),eficlsn(ngs),efisclsn(ngs)
13056       real ehlsclsn(ngs),ehliclsn(ngs),ehlisclsn(ngs)
13057       real esiclsn(ngs)
13059       real :: ehs_collsn = 0.5, ehi_collsn = 1.0
13060       real :: efs_collsn = 0.5, efi_collsn = 1.0
13061       real :: ehls_collsn = 1.0, ehli_collsn = 1.0
13062       real :: esi_collsn = 1.0
13063       
13064       real ew(8,6)
13065       real cwr(8,2)  ! radius and inverse of interval
13066       data cwr / 2.0, 3.0, 4.0, 6.0,  8.0,  10.0, 15.0,  20.0 , & ! radius
13067      &           1.0, 1.0, 0.5, 0.5,  0.5,   0.2,  0.2,  1.  /   ! inverse of interval
13068       integer icwr(ngs), igwr(ngs), irwr(ngs), ihlr(ngs), ifwr(ngs)
13069       real grad(6,2) ! graupel radius and inverse of interval
13070       data grad / 100., 200., 300., 400., 600., 1000.,   &
13071      &            1.e-2,1.e-2,1.e-2,5.e-3,2.5e-3, 1.    /
13072 !droplet radius: 2     3     4     6     8    10    15    20
13073       data ew /0.03, 0.07, 0.17, 0.41, 0.58, 0.69, 0.82, 0.88,  & ! 100
13074 !     :         0.07, 0.13, 0.27, 0.48, 0.65, 0.73, 0.84, 0.91,  ! 150
13075      &         0.10, 0.20, 0.34, 0.58, 0.70, 0.78, 0.88, 0.92,  & ! 200
13076      &         0.15, 0.31, 0.44, 0.65, 0.75, 0.83, 0.96, 0.91,  & ! 300
13077      &         0.17, 0.37, 0.50, 0.70, 0.81, 0.87, 0.93, 0.96,  & ! 400
13078      &         0.17, 0.40, 0.54, 0.71, 0.83, 0.88, 0.94, 0.98,  & ! 600
13079      &         0.15, 0.37, 0.52, 0.74, 0.82, 0.88, 0.94, 0.98 / ! 1000
13080 !     :         0.11, 0.34, 0.49, 0.71, 0.83, 0.88, 0.94, 0.95 / ! 1400
13083       real da0lr(ngs),da1lr(ngs)
13084       real da0lc(ngs),da1lc(ngs)
13085       real da0lh(ngs)
13086       real da0lhl(ngs)
13087       real da0lf(ngs)
13088       real :: da0lx(ngs,lr:lhab)
13089       
13090       real va0 (lc:lqmx)          ! collection coefficients from Seifert 2005
13091       real vab0(lc:lqmx,lc:lqmx)  ! collection coefficients from Seifert 2005
13092       real vab1(lc:lqmx,lc:lqmx)  ! collection coefficients from Seifert 2005
13093       real va1 (lc:lqmx)          ! collection coefficients from Seifert 2005
13094       real ehip(ngs),ehlip(ngs),ehlir(ngs)
13095       real erir(ngs),esir(ngs),eglir(ngs),egmir(ngs),eghir(ngs)
13096       real efir(ngs),ehir(ngs),eirw(ngs),eirir(ngs),ehr(ngs)
13097       real erip(ngs),esip(ngs),eglip(ngs),eghip(ngs)
13098       real efip(ngs),eipi(ngs),eipw(ngs),eipip(ngs)
13100 !  arrays for production terms
13102       real ptotal(ngs) ! , pqtot(ngs)
13104       real pqcwi(ngs),pqcii(ngs),pqrwi(ngs),pqisi(ngs)
13105       real pqswi(ngs),pqhwi(ngs),pqwvi(ngs)
13106       real pqgli(ngs),pqghi(ngs),pqfwi(ngs)
13107       real pqgmi(ngs),pqhli(ngs) ! ,pqhxi(ngs)
13108       real pqiri(ngs),pqipi(ngs) ! pqwai(ngs),
13109       real pqlwsi(ngs),pqlwhi(ngs),pqlwhli(ngs),pqlwfi(ngs)
13110       
13111       real pqlwlghi(ngs),pqlwlghli(ngs)
13112       real pqlwlghd(ngs),pqlwlghld(ngs)
13113       
13114       
13115       
13117       real pvhwi(ngs), pvhwd(ngs)
13118       real pvfwi(ngs), pvfwd(ngs)
13119       real pvhli(ngs), pvhld(ngs)
13120       real pvswi(ngs), pvswd(ngs)
13122       real pqcwd(ngs),pqcid(ngs),pqrwd(ngs),pqisd(ngs), pqcwdacc(ngs)
13123       real pqswd(ngs),pqhwd(ngs),pqwvd(ngs)
13124       real pqgld(ngs),pqghd(ngs),pqfwd(ngs)
13125       real pqgmd(ngs),pqhld(ngs) ! ,pqhxd(ngs)
13126       real pqird(ngs),pqipd(ngs) ! pqwad(ngs),
13127       real pqlwsd(ngs),pqlwhd(ngs),pqlwhld(ngs),pqlwfd(ngs)
13129 !      real pqxii(ngs,nhab),pqxid(ngs,nhab)
13131       real  pctot(ngs)
13132       real  pcipi(ngs), pcipd(ngs)
13133       real  pciri(ngs), pcird(ngs)
13134       real  pccwi(ngs), pccwd(ngs), pccwdacc(ngs)
13135       real  pccii(ngs), pccid(ngs)
13136       real  pcisi(ngs), pcisd(ngs)
13137       real  pccin(ngs)
13138       real  pcrwi(ngs), pcrwd(ngs)
13139       real  pcswi(ngs), pcswd(ngs)
13140       real  pchwi(ngs), pchwd(ngs)
13141       real  pchli(ngs), pchld(ngs)
13142       real  pcfwi(ngs), pcfwd(ngs)
13143       real  pcgli(ngs), pcgld(ngs)
13144       real  pcgmi(ngs), pcgmd(ngs)
13145       real  pcghi(ngs), pcghd(ngs)
13147       real  pzrwi(ngs), pzrwd(ngs)
13148       real  pzhwi(ngs), pzhwd(ngs)
13149       real  pzfwi(ngs), pzfwd(ngs)
13150       real  pzhli(ngs), pzhld(ngs)
13151       real  pzswi(ngs), pzswd(ngs)
13154 !  other arrays
13156       real dqisdt(ngs) !,advisc(ngs) !dqwsdt(ngs), ,schm(ngs),pndl(ngs)
13158       real qss0(ngs)
13160       real qsacip(ngs)
13161       real pres(ngs),pipert(ngs)
13162       real pk(ngs)
13163       real rho0(ngs),pi0(ngs)
13164       real rhovt(ngs),sqrtrhovt
13165       real thetap(ngs),theta0(ngs),qwvp(ngs),qv0(ngs)
13166       real thsave(ngs)
13167       real ptwfzi(ngs),ptimlw(ngs)
13168       real psub(ngs),pvap(ngs),pfrz(ngs),ptem(ngs),pmlt(ngs),pevap(ngs),pdep(ngs),ptem2(ngs)
13169       
13170       real cnostmp(ngs)   ! for diagnosed snow intercept
13172 !  iholef = 1 to do hole filling technique version 1
13173 !  which uses all hydrometerors to do hole filling of all hydrometeors
13174 !  iholef = 2 to do hole filling technique version 2
13175 !  which uses an individual hydrometeror species to do hole
13176 !  filling of a species of a hydrometeor
13178 !  iholen = interval that hole filling is done
13180       integer  iholef
13181       integer  iholen
13182       parameter (iholef = 1)
13183       parameter (iholen = 1)
13184       real  cqtotn,cqtotn1
13185       real  cctotn
13186       real  citotn
13187       real  crtotn
13188       real  cstotn
13189       real  cvtotn
13190       real  cftotn
13191       real  cgltotn
13192       real  cghtotn
13193       real  chtotn
13194       real  cqtotp,cqtotp1
13195       real  cctotp
13196       real  citotp
13197       real  ciptotp
13198       real  crtotp
13199       real  cstotp
13200       real  cvtotp
13201       real  cftotp
13202       real  chltotp
13203       real  cgltotp
13204       real  cgmtotp
13205       real  cghtotp
13206       real  chtotp
13207       real  cqfac
13208       real  ccfac
13209       real  cifac
13210       real  cipfac
13211       real  crfac
13212       real  csfac
13213       real  cvfac
13214       real  cffac
13215       real  cglfac
13216       real  cghfac
13217       real  chfac
13218       
13219       real ssifac, qvapor
13221 !   Miscellaneous variables
13223       real, parameter :: cwmas30 = 1000.*0.523599*(2.*30.e-6)**3 ! mass of 30-micron radius droplet, for sat. adj.
13224       real, parameter :: cwmas20 = 1000.*0.523599*(2.*20.e-6)**3 ! mass of 20-micron radius droplet, for sat. adj.
13225       integer ireadqf,lrho,lqsw,lqgl,lqgm ,lqgh 
13226       integer lqrw
13227       real vt
13228       real arg  ! gamma is a function
13229       real erbnd1, fdgt1, costhe1
13230       real qeps
13231       real dyi2,dzi2,bta1,cnit,dragh,dnz00,pii ! ,cp608
13232       real qccrit,gf4br,gf4ds,gf4p5, gf3ds, gf1ds
13233       real gf1palp(ngs) ! for storing Gamma[1.0 + alphar]
13235       
13236       real xdn0(lc:lhab)
13237       real xdn_new,drhodt
13238       
13239       integer l ,ltemq,inumgs, idelq
13241       real brz,arz,temq
13243       real ssival,tqvcon
13244       real cdx(lc:lhab)
13245       real cnox
13246       real cval,aval,eval,fval,gval ,qsign,ftelwc,qconkq,elecfac,altelecfac
13247       real qconm,qconn,cfce15,gf8,gf4i,gf3p5,gf1a,gf1p5,qdiff,argrcnw
13248       real c4,bradp,bl2,bt2,dthr,hrifac, hdia0,hdia1,civenta,civentb
13249       real civentc,civentd,civente,civentf,civentg,cireyn,xcivent
13250       real cipventa,cipventb,cipventc,cipventd,cipreyn,cirventa
13251       real cirventb
13252       integer igmrwa,igmrwb,igmswa, igmswb,igmfwa,igmfwb,igmhwa,igmhwb
13253       real rwventa ,rwventb,swventa,swventb,fwventa,fwventb,fwventc
13254       real hwventa,hwventb
13255       real    hwventc, hlventa, hlventb,  hlventc
13256       real  glventa, glventb, glventc
13257       real   gmventa, gmventb,  gmventc, ghventa, ghventb, ghventc
13258       real  dzfacp,  dzfacm,  cmassin,  cwdiar 
13259       real  rimmas, rhobar
13260       real   argtim, argqcw, argqxw, argtem
13261       real   frcswsw, frcswgl, frcswgm, frcswgh, frcswfw, frcswsw1
13262       real   frcglgl, frcglgm, frcglgh,  frcglfw, frcglgl1
13263       real   frcgmgl, frcgmgm, frcgmgh,  frcgmfw, frcgmgm1
13264       real   frcghgl, frcghgm, frcghgh,  frcghfw,  frcghgh1
13265       real   frcfwgl, frcfwgm, frcfwgh, frcfwfw,  frcfwfw1
13266       real   frcswrsw, frcswrgl,  frcswrgm,  frcswrgh, frcswrfw
13267       real   frcswrsw1
13268       real   frcrswsw, frcrswgl, frcrswgm, frcrswgh, frcrswfw
13269       real  frcrswsw1
13270       real  frcglrgl, frcglrgm, frcglrgh,  frcglrfw, frcglrgl1
13271       real  frcrglgl
13272       real  frcrglgm,  frcrglgh, frcrglfw, frcrglgl1
13273       real  frcgmrgl, frcgmrgm, frcgmrgh, frcgmrfw,  frcgmrgm1
13274       real  frcrgmgl, frcrgmgm,  frcrgmgh, frcrgmfw, frcrgmgm1
13275       real  total,  qweps,  gf2a, gf4a, dqldt, dqidt, dqdt
13276       real frcghrgl, frcghrgm, frcghrgh, frcghrfw, frcghrgh1, frcrghgl
13277       real frcrghgm, frcrghgh,  frcrghfw, frcrghgh1
13278       real    a1,a2,a3,a4,a5,a6
13279       real   gamss
13280       real cdw, cdi, denom1, denom2, delqci1, delqip1
13281       real cirtotn,  ciptotn, cgmtotn, chltotn,  cirtotp
13282       real  cgmfac, chlfac,  cirfac
13283       integer igmhla, igmhlb, igmgla, igmglb, igmgma,  igmgmb
13284       integer igmgha, igmghb
13285       integer idqis, item, itim0 
13286       integer  iqgl, iqgm, iqgh, iqrw, iqsw 
13287       integer  itertd, ia
13288       
13289       integer :: infdo
13290       
13291       real tau, ewtmp
13292       
13293       integer cntnic_noliq
13294       real     q_noliqmn, q_noliqmx
13295       real     scsacimn, scsacimx
13296       
13297       real :: dtpinv
13298       
13299 !   arrays for temporary bin space
13301       real :: xden,xmlt,cmlt,cmlttot,fventm,fventh,am,ah,felfinv,dmwdt
13303       real :: qhmlrtmp,qhmlrtmp2, chmlrtmp, chmlrtmpd1inf, chlmlrtmp, zhlmlrtmp, zhlmlrrtmp, qvs0,tmpcmlt
13305       real :: term1,term2,term3,term4
13306       real :: qaacw ! combined qsacw-qhacw for WSM6 variation
13307       real :: cwchtmp
13309       real, parameter ::  c1r=19.0, c2r=0.6, c3r=1.8, c4r=17.0   ! rain
13310       real, parameter ::  c1h=5.5, c2h=0.7, c3h=4.5, c4h=8.5   ! Graupel
13311       real, parameter ::  c1hl=3.7, c2hl=0.3, c3hl=9.0, c4hl=6.5, c5hl=1.0, c6hl=6.5 ! Hail
13314 ! inline functions for Newton method
13315        real :: galpha, dgalpha
13316        real :: a_in
13317        logical, parameter :: newton = .false.
13320       galpha(a_in) = ((4. + a_in)*(5. + a_in)*(6. + a_in))/((1. + a_in)*(2. + a_in)*(3. + a_in))
13321       dgalpha(a_in) = (876. + 1260.*a_in + 621.*a_in**2 + 126.*a_in**3 + 9.*a_in**4)/            &
13322      &  (36. + 132.*a_in + 193.*a_in**2 + 144.*a_in**3 + 58.*a_in**4 + 12.*a_in**5 + a_in**6)
13324 ! ####################################################################
13326 !  Start routine
13328 ! ####################################################################
13334        pb(:) = 0.0
13335        pinit(:) = 0.0
13336       itile = nx
13337       jtile = ny
13338       ktile = nz
13339       ixend = nx
13340       jyend = ny
13341       kzend = nz
13342       nxend = nx + 1
13343       nyend = ny + 1
13344       nzend = nz
13345       kzbeg = 1
13346       nzbeg = 1
13348       istag = 0
13349       jstag = 0
13350       kstag = 1
13352       lrescalelow(:) = rescale_low_alpha
13353       lrescalelow(lr) = rescale_low_alphar .and. rescale_low_alpha
13354       lrescalelow(lh) = rescale_low_alphah .and. rescale_low_alpha
13355       IF ( lf > 1 ) lrescalelow(lf) = rescale_low_alphah .and. rescale_low_alpha
13356       IF ( lhl > 1 ) lrescalelow(lhl) = rescale_low_alphahl .and. rescale_low_alpha
13360 !  slope intercepts
13363       IF ( ngs .lt. nz ) THEN
13364 !       write(0,*) 'Error in ICEZVD: Must have ngs .ge. nz!'
13365 !       STOP
13366       ENDIF
13368       cntnic_noliq = 0
13369       q_noliqmn = 0.0
13370       q_noliqmx = 0.0
13371       scsacimn = 0.0
13372       scsacimx = 0.0
13374       ldovol = .false.
13376       DO il = lc,lhab
13377         ldovol = ldovol .or. ( lvol(il) .gt. 1 )
13378       ENDDO
13381       ffrzh = 1
13382 !      DO il = lc,lhab
13383 !        write(iunit,*) 'delqnxa(',il,') = ',delqnxa(il)
13384 !      ENDDO
13385       
13387 !  density maximums and minimums
13391 !  Set terminal velocities...
13392 !    also set drag coefficients
13395       dtpinv = 1.d0/dtp
13400 !  electricity constants
13402 !  mixing ratio epsilon
13404       qeps  = 1.0e-20
13406 !  rebound efficiency (erbnd)
13410 !  constants
13413 !      cp608 = 0.608
13414       aradcw = -0.27544
13415       bradcw = 0.26249e+06
13416       cradcw = -1.8896e+10
13417       dradcw = 4.4626e+14
13418       bta1 = 0.6
13419       cnit = 1.0e-02
13420       dragh = 0.60
13421       dnz00 = 1.225
13422 !      cs = 4.83607122
13423 !      ds = 0.25
13424 !  new values for  cs and ds
13425       cs = 12.42
13426       ds = 0.42
13427       pii = piinv ! 1./pi
13428       pid4 = pi/4.0 
13429 !      qscrit = 6.0e-04
13430       gf1 = 1.0 ! gamma(1.0)
13431       gf1p5 = 0.8862269255  ! gamma(1.5)
13432       gf2 = 1.0 ! gamma(2.0)
13433       gf3 = 2.0 ! gamma(3.0)
13434       gf3p5 = 3.32335097 ! gamma(3.5)
13435       gf4 = 6.00 ! gamma(4.0)
13436       gf5 = 24.0 ! gamma(5.0)
13437       gf6 = 120.0 ! gamma(6.0)
13438       gf7 = 720.0 ! gamma(7.0)
13439       gf4br = 17.837861981813607 ! gamma(4.0+br)
13440       gf4ds = 10.41688578110938 ! gamma(4.0+ds)
13441       gf4p5 = 11.63172839656745 ! gamma(4.0+0.5)
13442       gf3ds = 3.0458730354120997 ! gamma(3.0+ds)
13443       gf1ds = 0.8863557896089221 ! gamma(1.0+ds)
13445       gf43rds = 0.8929795116 ! gamma(4./3.)
13446       gf53rds = 0.9027452930 ! gamma(5./3.)
13447       gf73rds = 1.190639349 ! gamma(7./3.)
13448       gf83rds = 1.504575488 ! gamma(8./3.)
13449       
13450       gamice73fac =  (Gamma_sp(7./3. + cinu))**3/ (Gamma_sp(1. + cinu)**3 * (1. + cinu)**4)
13451       gamsnow73fac =  (Gamma_sp(7./3. + snu))**3/ (Gamma_sp(1. + snu)**3 * (1. + snu)**4)
13452       
13453 !      gcnup1 = Gamma_sp(cnu + 1.)
13454 !      gcnup2 = Gamma_sp(cnu + 2.)
13456 !  constants
13459 !  general constants for microphysics
13461       brz = 100.0
13462       arz = 0.66
13463       
13464       bfnu1 = (4. + alphar)*(5. + alphar)*(6. + alphar)/ &
13465      &       ((1. + alphar)*(2. + alphar)*(3. + alphar))
13467        galpharaut = (6.+alpharaut)*(5.+alpharaut)*(4.+alpharaut)/ &
13468      &             ((3.+alpharaut)*(2.+alpharaut)*(1.+alpharaut))
13469       
13470       vfrz = 0.523599*(dfrz)**3 
13471       vmlt = Min(xvmx(lr), 0.523599*(dmlt)**3 )
13472       vshd = Min(xvmx(lr), 0.523599*(dshd)**3 )
13474       IF ( snowmeltdia > 0.0 ) THEN
13475         snowmeltmass = pi/6.0 * 1000. * snowmeltdia**3  ! maximum rain particle mass from melting snow (if snowmeltdia > 0)
13476       ENDIF
13478       tdtol = 1.0e-05
13479       tfrcbw = tfr - cbw
13480       tfrcbi = tfr - cbi
13481       
13482       IF ( mixedphase ) THEN
13483        ibinhmlr = 0
13484        ibinhlmlr = 0
13485       ENDIF
13488 ! #ifdef COMMAS
13489 !      print*,'ventr,ventc = ',ventr,ventc
13492 !  Set up look up tables for supersaturation w.r.t. liq and ice
13494 !VD$L SKIP
13495 !      do l = 1,nqsat
13496 !      temq = 163.15 + (l-1)*fqsat
13497 !      tabqvs(l) = exp(caw*(temq-273.15)/(temq-cbw))
13498 !      tabqis(l) = exp(cai*(temq-273.15)/(temq-cbi))
13499 !      end do
13501       mltmass0inv = 1.0/( 1000.0* xvmx(lr) ) ! for drops melting from ice with diameter > 1.9cm
13502       mltmass1inv = 1.0/( 1000.0*(4.0*pi/3.0)*((0.01*0.5*takshedsize1)**3) ) ! for drops melting from ice with diameter > 1.9cm; 0.01 converts cm to m, 0.5 conv. diam to radius
13503       mltmass2inv = 1.0/( 1000.0*(4.0*pi/3.0)*((0.01*0.5*takshedsize2)**3) ) ! for drops melting from ice with 0.9cm < d < 1.9cm (or 1.6cm to 1.9cm)
13504       mltmass3inv = 1.0/( 1000.0*(4.0*pi/3.0)*((0.01*0.5*takshedsize3)**3) ) ! for drops melting from ice with 0.9cm < d < 1.6cm
13505       mltmass1cgs =  1.0*(4.0*pi/3.0)*((0.5*takshedsize1)**3) 
13506       mltmass2cgs =  1.0*(4.0*pi/3.0)*((0.5*takshedsize2)**3) 
13507       mltmass3cgs =  1.0*(4.0*pi/3.0)*((0.5*takshedsize3)**3) 
13508       
13509 !      real, parameter :: mltdiam1 = 9.0e-3, mltdiam2 = 19.0e-3, mltdiam05 = 4.5e-3
13511       IF ( ibinnum == 1 ) THEN
13512         numdiam = 1 ! must have numdiam < ndiam because numdiam+1 holds values for the interval of mltdiam(numdiam) to mltdiam(ndiam+1)
13513         mltdiam(1) = 4.5e-3
13514       ELSEIF ( ibinnum == 2 ) THEN
13515         numdiam = 2 ! must have numdiam < ndiam because numdiam+1 holds values for the interval of mltdiam(numdiam) to mltdiam(ndiam+1)
13516         mltdiam(1) = mltdiam1/6. ! 1.5e-3
13517         mltdiam(2) = mltdiam1/2. ! 4.5e-3
13518       ELSEIF ( ibinnum > 2 ) THEN
13519         numdiam = Min(ibinnum, ndiam)
13520         DO k = 1,numdiam
13521           mltdiam(k) = (k - 0.5)*mltdiam1/float(numdiam)
13522         ENDDO
13523       
13524       ELSE
13525         numdiam = 5 ! must have numdiam < ndiam because numdiam+1 holds values for the interval of mltdiam(numdiam) to mltdiam(ndiam+1)
13526         mltdiam(1) = 0.5e-3
13527         mltdiam(2) = 1.0e-3
13528         mltdiam(3) = 2.0e-3
13529         mltdiam(4) = 4.0e-3
13530         mltdiam(5) = 6.0e-3
13531       ENDIF
13534       IF ( numshedregimes == 2 ) THEN
13535         mltdiam(ndiam+1) = mltdiam1 !  9.0e-3
13536         mltdiam(ndiam+2) = mltdiam3 ! 19.0e-3
13537         mltdiam(ndiam+3) = mltdiam4 !100.0e-3
13538       ELSEIF ( numshedregimes == 3 ) THEN
13539         mltdiam(ndiam+1) = mltdiam1 !  9.0e-3
13540         mltdiam(ndiam+2) = mltdiam2 ! 16.0e-3
13541         mltdiam(ndiam+3) = mltdiam3 ! 19.0e-3
13542         mltdiam(ndiam+4) = mltdiam4 !200.0e-3
13543       ENDIF
13545       kzb = 1
13546       kze = ktile
13547 !      if (kzend .eq. nzend) kze = kzend-kzbeg+1-kstag
13550 !  cw constants in mks units
13552 !      cwmasn = 4.25e-15  ! radius of 1.0e-6
13553       mwfac = 6.0**(1./3.)
13554       IF ( ipconc .ge. 2 ) THEN
13555 !        cwmasn = xvmn(lc)*1000.
13556 !        cwradn = 1.0e-6
13557 !        cwmasx = xvmx(lc)*1000.
13558       ENDIF
13559         rwmasn = xvmn(lr)*1000.
13560         rwmasx = xvmx(lr)*1000.
13562       IF ( biggsnowdiam > 0.0 ) THEN
13563         xvbiggsnow = (pi/6.0)*biggsnowdiam**3
13564       ELSE
13565         xvbiggsnow = xvmn(lh)
13566       ENDIF
13569 !  ci constants in mks units
13571       cimasn = Min(cimas0, cimas1) ! 12 microns for  0.1871*(xmas(mgs,li)**(0.3429))
13572       cimasx = 1.0e-8   ! 338 microns
13573       ccimx = 5000.0e3   ! max of 5000 per liter
13576 !  constants for paramerization
13579 !  set save counter (number of saves):  nsvcnt
13581 !      nsvcnt = 0
13582       iend = 0
13585 !      timetd1 = etime(tarray)
13586 !      timetd1 = tarray(1)
13589 !***********************************************************
13590 !  start jy loop
13591 !***********************************************************
13594 !      do 9999 jy = 1,ny-jstag
13596 !  VERY IMPORTANT:  SET jy = jgs
13598       jy = jgs
13599      
13600      
13601 !      t1(:,:,:) = 0
13602 !      t2(:,:,:) = 0
13603 !      t3(:,:,:) = 0
13604 !      t4(:,:,:) = 0
13605 !      t5(:,:,:) = 0
13606 !      t6(:,:,:) = 0
13607 !      t8(:,:,:) = 0
13608       
13609       IF ( ipconc < 2 ) THEN ! Make a copy of cloud droplet mixing ratio to use for homogeneous freezing
13610         DO kz = 1,kze
13611          DO ix = 1,itile
13612            t9(ix,jy,kz) = an(ix,jy,kz,lc)
13613          ENDDO
13614         ENDDO
13615       ENDIF
13616       
13618 !..Gather microphysics  
13620       if ( ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: ENTER GATHER STAGE'
13623       
13624       nxmpb = 1
13625       nzmpb = 1
13626       nxz = itile*nz
13627       numgs = nxz/ngs + 1
13628 !      write(0,*) 'ICEZVD_GS: ENTER GATHER STAGE: nx,nz,nxz,numgs,ngs = ',nx,nz,nxz,numgs,ngs
13630       do 1000 inumgs = 1,numgs
13631       ngscnt = 0
13632       
13633       do kz = nzmpb,kze
13634       do ix = nxmpb,itile
13636       pqs(1) = t00(ix,jy,kz)
13638       theta(1) = an(ix,jy,kz,lt)
13639       temg(1) = t0(ix,jy,kz)
13640       temcg(1) = temg(1) - tfr
13641       tqvcon = temg(1)-cbw
13642       ltemq = (temg(1)-163.15)/fqsat + 1.5
13643       ltemq = Min( nqsat, Max(1,ltemq) )
13644       qvs(1) = pqs(1)*tabqvs(ltemq)
13645       IF ( iqis0 == 1 .or. temg(1) <= tfr+0.5 ) THEN
13646         qis(1) = pqs(1)*tabqis(ltemq)
13647       ELSE
13648         ltemq = (tfr - 163.15)/fqsat + 1.5
13649         qis(1) = pqs(1)*tabqis(ltemq)
13650       ENDIF
13652       qss(1) = qvs(1)
13654       if ( temg(1) .lt. tfr ) then
13655         qss(1) = qis(1)
13656       end if
13658       ishail = .false.
13659       IF ( lhl > 1 ) THEN
13660         IF ( an(ix,jy,kz,lhl)  .gt. qxmin(lhl) ) ishail = .true.
13661       ENDIF
13664       
13665       if ( an(ix,jy,kz,lv)  .gt. qss(1) .or.   &
13666      &     an(ix,jy,kz,lc)  .gt. qxmin(lc)   .or.    &
13667      &     an(ix,jy,kz,li)  .gt. qxmin(li)   .or.   &
13668      &     an(ix,jy,kz,lr)  .gt. qxmin(lr)   .or.   &
13669      &     an(ix,jy,kz,ls)  .gt. qxmin(ls)   .or.   &
13670      &     an(ix,jy,kz,lh)  .gt. qxmin(lh)   .or.  ishail ) then
13671       ngscnt = ngscnt + 1
13672       igs(ngscnt) = ix
13673       kgs(ngscnt) = kz
13674       if ( ngscnt .eq. ngs ) goto 1100
13675       end if
13676       enddo !ix
13677       nxmpb = 1
13678       enddo !kz
13679  1100 continue
13681       if ( ngscnt .eq. 0 ) go to 9998
13683       if ( ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: dbg = 5, ngscnt = ',ngscnt
13684       
13685 !      write(0,*) 'allocating qc'
13687       
13688       xv(:,:) = 0.0
13689       xmas(:,:) = 0.0
13690       vtxbar(:,:,:) = 0.0
13691       xdia(:,:,:) = 0.0
13692       raindn(:,:) = 900.
13693       cx(:,:) = 0.0
13694       IF ( lnhf > 1 .or. lnhlf > 1 ) chxf(:,:) = 0.0
13695       alpha(:,:) = 0.0
13696       DO il = li,lhab
13697         DO mgs = 1,ngscnt
13698           rimdn(mgs,il)  = rimedens ! xdn0(il)
13699         ENDDO
13700       ENDDO
13702 !  define temporaries for state variables to be used in calculations
13704       if ( ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: dbg = def temps'
13705       do mgs = 1,ngscnt
13706       kgsm(mgs) = max(kgs(mgs)-1,1)
13707       kgsp(mgs) = min(kgs(mgs)+1,nz-1)
13708       kgsm2(mgs) = Max(kgs(mgs)-2,1)
13709       theta0(mgs) = an(igs(mgs),jy,kgs(mgs),lt)
13710       thetap(mgs) = an(igs(mgs),jy,kgs(mgs),lt) - theta0(mgs)
13711       theta(mgs) = an(igs(mgs),jy,kgs(mgs),lt)
13712       qv0(mgs) = an(igs(mgs),jy,kgs(mgs),lv)
13713       qwvp(mgs) = an(igs(mgs),jy,kgs(mgs),lv)  - qv0(mgs) ! qv0(mgs) is full qv, so qwvp starts as zero!
13715       pres(mgs) = pn(igs(mgs),jy,kgs(mgs)) + pb(kgs(mgs))
13716       pipert(mgs) = p2(igs(mgs),jy,kgs(mgs))
13717       rho0(mgs) = dn(igs(mgs),jy,kgs(mgs))
13718       rhoinv(mgs) = 1.0/rho0(mgs)
13719       rhovt(mgs) = Sqrt(rho00/Max(0.05,rho0(mgs))) ! prevent excessive rhovt
13720       pi0(mgs) = p2(igs(mgs),jy,kgs(mgs)) + pinit(kgs(mgs))
13721       temg(mgs) = t0(igs(mgs),jy,kgs(mgs))
13722       temgkm1(mgs) = t0(igs(mgs),jy,kgsm(mgs))
13723       temgkm2(mgs) = t0(igs(mgs),jy,kgsm2(mgs))
13724       pk(mgs)   = p2(igs(mgs),jy,kgs(mgs)) + pinit(kgs(mgs)) ! t77(igs(mgs),jy,kgs(mgs))
13725       temcg(mgs) = temg(mgs) - tfr
13726       qss0(mgs) = (380.0)/(pres(mgs))
13727       pqs(mgs) = (380.0)/(pres(mgs))
13728       ltemq = (temg(mgs)-163.15)/fqsat+1.5
13729       ltemq = Min( nqsat, Max(1,ltemq) )
13730       qvs(mgs) = pqs(mgs)*tabqvs(ltemq)
13731       IF ( iqis0 == 1 .or. temg(mgs) <= tfr+0.5 ) THEN
13732         qis(mgs) = pqs(mgs)*tabqis(ltemq)
13733       ELSE
13734         ltemq = (tfr - 163.15)/fqsat + 1.5
13735         qis(mgs) = pqs(mgs)*tabqis(ltemq)
13736       ENDIF
13737       qss(mgs) = qvs(mgs)
13738 !      es(mgs)  = 6.1078e2*tabqvs(ltemq)
13739 !      eis(mgs) = 6.1078e2*tabqis(ltemq)
13740       cnostmp(mgs) = cno(ls)
13743       il5(mgs) = 0
13744       if ( temg(mgs) .lt. tfr ) then
13745       il5(mgs) = 1
13746       end if
13747       enddo !mgs
13748       
13749       IF ( ipconc < 1 .and. lwsm6 ) THEN
13750         DO mgs = 1,ngscnt
13751           tmp = Min( 0.0, temcg(mgs) )
13752           cnostmp(mgs) = Min( 2.e8, 2.e6*exp(0.12*tmp) )
13753         ENDDO
13754       ENDIF
13758 ! zero arrays that are used but not otherwise set (tm)
13760       do mgs = 1,ngscnt
13761          qhshr(mgs) = 0.0 
13762        end do
13764 !  set temporaries for microphysics variables
13766       DO il = lv,lhab
13767       do mgs = 1,ngscnt
13768         qx(mgs,il) = max(an(igs(mgs),jy,kgs(mgs),il), 0.0) 
13769       ENDDO
13770       end do
13772       qxw(:,:) = 0.0
13773       qxwlg(:,:) = 0.0
13779 !  set concentrations
13781 !      ssmax = 0.0
13782       
13783       
13784       if ( ndebug .gt. 0 .and. my_rank>=0 ) write(0,*)  'ICEZVD_GS: dbg = 5b'
13785       
13786       if ( ipconc .ge. 1 ) then
13787        do mgs = 1,ngscnt
13788         cx(mgs,li) = Max(an(igs(mgs),jy,kgs(mgs),lni), 0.0)
13789           IF ( qx(mgs,li) .le. qxmin(li) ) THEN
13790             cx(mgs,li) = 0.0
13791           ENDIF
13793         IF ( lcina .gt. 1 ) THEN
13794          cina(mgs) = an(igs(mgs),jy,kgs(mgs),lcina)
13795         ELSE
13796          cina(mgs) = cx(mgs,li)
13797         ENDIF
13798         IF ( lcin > 1 ) THEN
13799          ccin(mgs) = an(igs(mgs),jy,kgs(mgs),lcin)
13800         ENDIF
13801        end do
13802       end if
13803       if ( ipconc .ge. 2 ) then
13804        do mgs = 1,ngscnt
13805         cx(mgs,lc) = Max(an(igs(mgs),jy,kgs(mgs),lnc), 0.0)
13806 !        cx(mgs,lc) = Min( ccwmx, cx(mgs,lc) )
13807         IF ( qx(mgs,lc) .le. qxmin(lc) ) THEN
13808           cx(mgs,lc) = 0.0
13809         ENDIF
13810         IF ( lss > 1 ) THEN
13811         ssmax(mgs) = an(igs(mgs),jy,kgs(mgs),lss)
13812         ENDIF
13813         IF ( lccn .gt. 1 ) THEN
13814          ccnc(mgs) = an(igs(mgs),jy,kgs(mgs),lccn)
13815         ELSE
13816          ccnc(mgs) = 0.0
13817         ENDIF
13818         IF ( lccna .gt. 1 ) THEN
13819          ccna(mgs) = an(igs(mgs),jy,kgs(mgs),lccna)
13820         ELSE
13821          ccna(mgs) = cx(mgs,lc)
13822         ENDIF
13823        end do
13824 !       ELSE
13825 !       cx(mgs,lc) = Abs(ccn)
13826       end if
13827       if ( ipconc .ge. 3 ) then
13828        do mgs = 1,ngscnt
13829         cx(mgs,lr) = Max(an(igs(mgs),jy,kgs(mgs),lnr), 0.0)
13830         IF ( qx(mgs,lr) .le. qxmin(lr) ) THEN
13831 !          cx(mgs,lr) = 0.0
13832         ELSEIF ( cx(mgs,lr) .eq. 0.0 .and. qx(mgs,lr) .lt. 3.0*qxmin(lr) ) THEN
13833           qx(mgs,lv) = qx(mgs,lv) + qx(mgs,lr)
13834           qx(mgs,lr) = 0.0
13835         ELSE
13836           cx(mgs,lr) = Max( 1.e-9, cx(mgs,lr) )
13837         ENDIF
13838        end do
13839       end if
13840       if ( ipconc .ge. 4 ) then
13841        do mgs = 1,ngscnt
13842         cx(mgs,ls) = Max(an(igs(mgs),jy,kgs(mgs),lns), 0.0)
13843         IF ( qx(mgs,ls) .le. qxmin(ls) ) THEN
13844 !          cx(mgs,ls) = 0.0
13845         ELSEIF ( cx(mgs,ls) .eq. 0.0 .and. qx(mgs,ls) .lt. 3.0*qxmin(ls) ) THEN
13846           qx(mgs,lv) = qx(mgs,lv) + qx(mgs,ls)
13847           qx(mgs,ls) = 0.0
13848         ELSE
13849           cx(mgs,ls) = Max( 1.e-9, cx(mgs,ls) )
13851          IF ( ilimit .ge. ipc(ls) ) THEN
13852             tmp = (xdn0(ls)*cx(mgs,ls))/(rho0(mgs)*qx(mgs,ls))
13853             tmp2 = (tmp*(3.14159))**(1./3.)
13854             cnox = cx(mgs,ls)*(tmp2)
13855          IF ( cnox .gt. 3.0*cno(ls) ) THEN
13856            cx(mgs,ls) = 3.0*cno(ls)/tmp2
13857          ENDIF
13858          ENDIF
13859         ENDIF
13860        end do
13861       end if
13862       if ( ipconc .ge. 5 ) then
13863        do mgs = 1,ngscnt
13865         cx(mgs,lh) = Max(an(igs(mgs),jy,kgs(mgs),lnh), 0.0)
13866         IF ( qx(mgs,lh) .le. qxmin(lh) ) THEN
13867 !          cx(mgs,lh) = 0.0
13868         ELSEIF ( cx(mgs,lh) .eq. 0.0 .and. qx(mgs,lh) .lt. 3.0*qxmin(lh) ) THEN
13869           qx(mgs,lv) = qx(mgs,lv) + qx(mgs,lh) 
13870           qx(mgs,lh) = 0.0
13871         ELSE
13872           cx(mgs,lh) = Max( 1.e-9, cx(mgs,lh) )
13873          IF ( ilimit .ge. ipc(lh) ) THEN
13874             tmp = (xdn0(lh)*cx(mgs,lh))/(rho0(mgs)*qx(mgs,lh))
13875             tmp2 = (tmp*(3.14159))**(1./3.)
13876             cnox = cx(mgs,lh)*(tmp2)
13877          IF ( cnox .gt. 3.0*cno(lh) ) THEN
13878            cx(mgs,lh) = 3.0*cno(lh)/tmp2
13879          ENDIF
13880          ENDIF
13881         ENDIF
13884        end do
13887       end if
13889       if ( lhl .gt. 1 .and. ipconc .ge. 5 ) then
13890        do mgs = 1,ngscnt
13892         cx(mgs,lhl) = Max(an(igs(mgs),jy,kgs(mgs),lnhl), 0.0)
13893         IF ( qx(mgs,lhl) .le. qxmin(lhl) ) THEN
13894           cx(mgs,lhl) = 0.0
13895         ELSEIF ( cx(mgs,lhl) .eq. 0.0 .and. qx(mgs,lhl) .lt. 3.0*qxmin(lhl) ) THEN
13896           qx(mgs,lv) = qx(mgs,lv) + qx(mgs,lhl) 
13897           qx(mgs,lhl) = 0.0
13898         ELSE
13899           cx(mgs,lhl) = Max( 1.e-9, cx(mgs,lhl) )
13900          IF ( ilimit .ge. ipc(lhl) ) THEN
13901             tmp = (xdn0(lhl)*cx(mgs,lhl))/(rho0(mgs)*qx(mgs,lhl))
13902             tmp2 = (tmp*(3.14159))**(1./3.)
13903             cnox = cx(mgs,lhl)*(tmp2)
13904          IF ( cnox .gt. 3.0*cno(lhl) ) THEN
13905            cx(mgs,lhl) = 3.0*cno(lhl)/tmp2
13906          ENDIF
13907          ENDIF
13908         ENDIF
13911        end do
13912       end if
13915 ! Set mean particle volume
13917       IF ( ldovol ) THEN
13918       
13919       vx(:,:) = 0.0
13920       
13921        DO il = li,lhab
13922         
13923         IF ( lvol(il) .ge. 1 ) THEN
13924         
13925           DO mgs = 1,ngscnt
13926             vx(mgs,il) = Max(an(igs(mgs),jy,kgs(mgs),lvol(il)), 0.0)
13927           ENDDO
13929         ENDIF
13931        ENDDO
13933       ENDIF
13937 ! Set liquid water fraction
13939       fhw(:) = 0.0
13940       fsw(:) = 0.0
13941       fhlw(:) = 0.0
13946 !  6th moments
13949       IF ( ipconc .ge. 6 ) THEN
13950        zx(:,:) = 0.0
13951        DO il = lr,lhab
13952         IF ( lz(il) .gt. 1 ) THEN
13953          DO mgs = 1,ngscnt
13954           zx(mgs,il) = Max( an(igs(mgs),jy,kgs(mgs),lz(il)), 0.0 )
13955          ENDDO
13956         ENDIF
13957        ENDDO
13959       ENDIF
13961       IF ( ipconc .ge. 6 ) THEN
13963        IF ( lz(lr) .lt. 1 ) THEN
13964          g1x(:,lr) = (6.0 + alphar)*(5.0 + alphar)*(4.0 + alphar)/ &
13965      &            ((3.0 + alphar)*(2.0 + alphar)*(1.0 + alphar))
13967          
13968          DO mgs = 1,ngscnt
13969            IF ( cx(mgs,lr) .gt. 0.0 .and. qx(mgs,lr) .gt. qxmin(lr)  ) THEN
13970             
13971             vr = rho0(mgs)*qx(mgs,lr)/(1000.*cx(mgs,lr))
13972             IF ( lzr < 1 ) THEN
13973              IF ( imurain == 3 ) THEN
13974                zx(mgs,lr) = 3.6476*(rnu+2.0)*cx(mgs,lr)*vr**2/(rnu+1.0)
13975              ELSE ! imurain == 1
13976                zx(mgs,lr) = 3.6476*g1x(mgs,lr)*cx(mgs,lr)*vr**2
13977              ENDIF
13978             ENDIF
13979              
13980            ENDIF
13981          ENDDO
13982        ENDIF
13983       
13984       ENDIF
13987         scx(:,:) = 0.0
13989 !  set shape parameters
13991        if ( ndebug .gt. 0 .and. my_rank>=0 ) write(0,*) my_rank,  'ICEZVD_GS: dbg = set alpha'
13992       IF ( imurain == 1 ) THEN
13993         alpha(:,lr) = alphar
13994       ELSEIF ( imurain == 3 ) THEN
13995         alpha(:,lr) = xnu(lr)
13996       ENDIF
13997       
13998       alpha(:,li) = xnu(li)
13999       alpha(:,lc) = xnu(lc)
14001       IF ( imusnow == 1 ) THEN
14002         alpha(:,ls) = alphas
14003       ELSEIF ( imusnow == 3 ) THEN
14004         alpha(:,ls) = xnu(ls)
14005       ENDIF
14007        if ( ndebug .gt. 0 .and. my_rank>=0 ) write(0,*) my_rank,  'ICEZVD_GS: dbg = set dab'
14008       
14009       DO il = lr,lhab
14010       do mgs = 1,ngscnt
14011         IF ( il .ge. lg ) alpha(mgs,il) = dnu(il)
14014         DO ic = lc,lhab
14015         dab0lh(mgs,il,ic) =  dab0(il,ic) ! dab0(ic,il)
14016         dab1lh(mgs,il,ic) =  dab1(il,ic) ! dab1(ic,il)
14017         ENDDO
14018       end do
14019       ENDDO
14021       
14022 !      DO mgs = 1,ngscnt
14023         DO il = lr,lhab
14024           da0lx(:,il) = da0(il)
14025         ENDDO
14026         da0lh(:) = da0(lh)
14027         da0lr(:) = da0(lr)
14028         da1lr(:) = da1(lr)
14029         da0lc(:) = da0(lc)
14030         da1lc(:) = da1(lc)
14032        if ( ndebug .gt. 0 .and. my_rank>=0 ) write(0,*) my_rank,  'ICEZVD_GS: dbg = set rz'
14034         IF ( lzh < 1 .or. lzhl < 1 ) THEN
14035           rzxhlh(:) = rzhl/rz
14036         ELSEIF ( lzh > 1 .and. lzhl > 1 ) THEN
14037           rzxhlh(:) = 1.
14038         ENDIF
14039         IF ( lzr > 1 ) THEN
14040           rzxh(:) = 1.
14041           rzxhl(:) = 1.
14042         ELSE
14043           rzxh(:) = rz
14044           rzxhl(:) = rzhl
14045         ENDIF
14046         
14047         IF ( imurain == 1 .and. imusnow == 3 .and. lzr < 1 ) THEN
14048           rzxs(:) = rzs
14049         ELSEIF ( imurain == imusnow .or. lzr > 1 ) THEN
14050           rzxs(:) = 1.
14051         ENDIF
14052  !     ENDDO
14053       
14054       IF ( lhl .gt. 1 ) THEN
14055       DO mgs = 1,ngscnt
14056         da0lhl(mgs) = da0(lhl)
14057       ENDDO
14058       ENDIF
14059       
14060       ventrx(:) = ventr
14061       ventrxn(:) = ventrn
14062       gf1palp(:) = gamma_sp(1.0 + alphar)
14065 !  set factors
14067       do mgs = 1,ngscnt
14069       ssi(mgs) = qx(mgs,lv)/qis(mgs)
14070       ssw(mgs) = qx(mgs,lv)/qvs(mgs)
14072       tsqr(mgs) = temg(mgs)**2
14074       temgx(mgs) = min(temg(mgs),313.15)
14075       temgx(mgs) = max(temgx(mgs),233.15)
14076       felv(mgs) = 2500837.367 * (273.15/temgx(mgs))**((0.167)+(3.67e-4)*temgx(mgs))
14078       temcgx(mgs) = min(temg(mgs),273.15)
14079       temcgx(mgs) = max(temcgx(mgs),223.15)
14080       temcgx(mgs) = temcgx(mgs)-273.15
14082 ! felf = latent heat of fusion, fels = LH of sublimation, felv = LH of vaporization
14083       felf(mgs) = 333690.6098 + (2030.61425)*temcgx(mgs) - (10.46708312)*temcgx(mgs)**2
14085       fels(mgs) = felv(mgs) + felf(mgs)
14087       felvs(mgs) = felv(mgs)*felv(mgs)
14088       felss(mgs) = fels(mgs)*fels(mgs)
14089       
14090         IF ( eqtset <= 1 ) THEN
14091           felvcp(mgs) = felv(mgs)*cpi
14092           felscp(mgs) = fels(mgs)*cpi
14093           felfcp(mgs) = felf(mgs)*cpi
14094         ELSE
14095           
14096           ! equations from appendix in Bryan and Morrison (2012, MWR)
14097           ! note that rw is Rv in the paper, and rd is R.
14098           
14099           tmp = qx(mgs,li)+qx(mgs,ls)+qx(mgs,lh)
14100           IF ( lhl > 1 ) tmp = tmp + qx(mgs,lhl)
14101           IF ( lf > 1 ) tmp = tmp + qx(mgs,lf)
14102           cvm = cv+cvv*qx(mgs,lv)+cpl*(qx(mgs,lc)+qx(mgs,lr))   &
14103                                   +cpigb*(tmp)
14105           IF ( eqtset == 2 ) THEN ! compact form from treating dT/dt = theta*d(pi)/dt + pi*d(theta)dt and then applied to theta assuming constant pi
14106           felvcp(mgs) = (felv(mgs)-rw*temg(mgs))/cvm
14107           felscp(mgs) = (fels(mgs)-rw*temg(mgs))/cvm
14108           felfcp(mgs) = felf(mgs)/cvm
14109           
14110           ELSE
14111            ! equivalent version that applies separate updates of latent heating to theta and pi, when both are returned.
14113           cpm = cp+cpv*qx(mgs,lv)+cpl*(qx(mgs,lc)+qx(mgs,lr))   &
14114                                   +cpigb*(tmp)
14115           rmm=rd+rw*qx(mgs,lv)
14116           
14117           felvcp(mgs) = (felv(mgs)*cv/(cp) - rw*temg(mgs)*(1.0-rovcp*cpm/rmm))/cvm
14118           felscp(mgs) = (fels(mgs)*cv/(cp) - rw*temg(mgs)*(1.0-rovcp*cpm/rmm))/cvm
14119           felfcp(mgs) = felf(mgs)*cv/(cp*cvm)
14121           felvpi(mgs) = pi0(mgs)*rovcp*(felv(mgs)/(temg(mgs)) - rw*cpm/rmm)/cvm
14122           felspi(mgs) = pi0(mgs)*rovcp*(fels(mgs)/(temg(mgs)) - rw*cpm/rmm)/cvm 
14123           felfpi(mgs) = pi0(mgs)*rovcp*(felf(mgs)/(cvm*temg(mgs)))
14124           
14125           ENDIF
14127         ENDIF
14129       fgamw(mgs) = felvcp(mgs)/pi0(mgs)
14130       fgams(mgs) = felscp(mgs)/pi0(mgs)
14132       fcqv1(mgs) = 4098.0258*pi0(mgs)*fgamw(mgs)
14133       fcqv2(mgs) = 5807.6953*pi0(mgs)*fgams(mgs)
14134       fcc3(mgs) = felfcp(mgs)/pi0(mgs)
14136 !  fwvdf = water vapor diffusivity
14137       fwvdf(mgs) = (2.11e-05)*((temg(mgs)/tfr)**1.94)*(101325.0/(pres(mgs)))
14139 ! fadvisc = 'd' for dynamic viscosity
14140 ! fakvisc = 'k' for kinematic viscosity
14141       fadvisc(mgs) = advisc0*(416.16/(temg(mgs)+120.0))*(temg(mgs)/296.0)**(1.5) ! dynamic visc.
14143       fakvisc(mgs) = fadvisc(mgs)*rhoinv(mgs) ! divide by rho_air to get kinematic visc. (note the 'k' vs. 'd')
14145       temcgx(mgs) = min(temg(mgs),273.15)
14146       temcgx(mgs) = max(temcgx(mgs),233.15)
14147       temcgx(mgs) = temcgx(mgs)-273.15
14148       fci(mgs) = (2.118636 + 0.007371*(temcgx(mgs)))*(1.0e+03)
14150       if ( temg(mgs) .lt. 273.15 ) then
14151       temcgx(mgs) = min(temg(mgs),273.15)
14152       temcgx(mgs) = max(temcgx(mgs),233.15)
14153       temcgx(mgs) = temcgx(mgs)-273.15
14154       fcw(mgs) = 4203.1548  + (1.30572e-2)*((temcgx(mgs)-35.)**2)   &
14155      &                 + (1.60056e-5)*((temcgx(mgs)-35.)**4)
14156       end if
14157       if ( temg(mgs) .ge. 273.15 ) then
14158       temcgx(mgs) = min(temg(mgs),308.15)
14159       temcgx(mgs) = max(temcgx(mgs),273.15)
14160       temcgx(mgs) = temcgx(mgs)-273.15
14161       fcw(mgs) = 4243.1688  + (3.47104e-1)*(temcgx(mgs)**2)
14162       end if
14164       ftka(mgs) = tka0*fadvisc(mgs)/advisc1  ! thermal conductivity: proportional to dynamic viscosity
14165       fthdf(mgs) = ftka(mgs)*cpi*rhoinv(mgs)
14167       fschm(mgs) = (fakvisc(mgs)/fwvdf(mgs))  ! Schmidt number
14168       fpndl(mgs) = (fakvisc(mgs)/fthdf(mgs))  ! Prandl number (only used for bin melting)
14170       fai(mgs) = (fels(mgs)**2)/(ftka(mgs)*rw*temg(mgs)**2)
14171       fbi(mgs) = (1.0/(rho0(mgs)*fwvdf(mgs)*qis(mgs)))
14172       fav(mgs) = (felv(mgs)**2)/(ftka(mgs)*rw*temg(mgs)**2)
14173       fbv(mgs) = (1.0/(rho0(mgs)*fwvdf(mgs)*qvs(mgs)))
14175       kp1 = Min(nz, kgs(mgs)+1 )
14176       wvel(mgs) = (0.5)*(w(igs(mgs),jgs,kp1)   &
14177      &                  +w(igs(mgs),jgs,kgs(mgs)))
14180       end do
14183 !   ice habit fractions
14187 !  Set density
14189       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: Set density'
14192       do mgs = 1,ngscnt
14193         xdn(mgs,li) = xdn0(li)
14194         xdn(mgs,lc) = xdn0(lc)
14195         xdn(mgs,lr) = xdn0(lr)
14196         xdn(mgs,ls) = xdn0(ls)
14197         xdn(mgs,lh) = xdn0(lh)
14198         IF ( lvol(ls) .gt. 1 ) THEN
14199          IF ( vx(mgs,ls) .gt. 0.0 .and. qx(mgs,ls) .gt. qxmin(ls) ) THEN
14200            xdn(mgs,ls) = Min( xdnmx(ls), Max( xdnmn(ls), rho0(mgs)*qx(mgs,ls)/vx(mgs,ls) ) )
14201          ENDIF
14202         ENDIF
14204         IF ( lvol(lh) .gt. 1 ) THEN
14205          IF ( vx(mgs,lh) .gt. 0.0 .and. qx(mgs,lh) .gt. qxmin(lh) ) THEN
14206            IF ( mixedphase ) THEN
14207            ELSE
14208              dnmx = xdnmx(lh)
14209            ENDIF
14210            xdn(mgs,lh) = Min( dnmx, Max( xdnmn(lh), rho0(mgs)*qx(mgs,lh)/vx(mgs,lh) ) )
14211            vx(mgs,lh) = rho0(mgs)*qx(mgs,lh)/xdn(mgs,lh)
14212          
14213          ELSEIF ( vx(mgs,lh) == 0.0 .and. qx(mgs,lh) .gt. qxmin(lh) ) THEN ! if volume is zero, need to initialize the default value
14215            vx(mgs,lh) = rho0(mgs)*qx(mgs,lh)/xdn(mgs,lh)
14216          
14217          ENDIF
14218         ENDIF
14221         IF ( lhl .gt. 1 ) THEN
14223           xdn(mgs,lhl) = xdn0(lhl)
14224           xdntmp(mgs,lhl) = xdn0(lhl)
14226           IF ( lvol(lhl) .gt. 1 ) THEN
14227            IF ( vx(mgs,lhl) .gt. 0.0 .and. qx(mgs,lhl) .gt. qxmin(lhl) ) THEN
14229            IF ( mixedphase .and. lhlw > 1 ) THEN
14230            ELSE
14231              dnmx = xdnmx(lhl)
14232            ENDIF
14234              xdn(mgs,lhl) = Min( dnmx, Max( xdnmn(lhl), rho0(mgs)*qx(mgs,lhl)/vx(mgs,lhl) ) )
14235              vx(mgs,lhl) = rho0(mgs)*qx(mgs,lhl)/xdn(mgs,lhl)
14236              xdntmp(mgs,lhl) = xdn(mgs,lhl)
14237          
14238            ELSEIF ( vx(mgs,lhl) == 0.0 .and. qx(mgs,lhl) .gt. qxmin(lhl) ) THEN ! if volume is zero, need to initialize the default value
14240              vx(mgs,lhl) = rho0(mgs)*qx(mgs,lhl)/xdn(mgs,lhl)
14241          
14242            ENDIF
14243           ENDIF
14245         ENDIF
14248       end do
14250       IF ( ipconc == 5 .and. imydiagalpha == 2 ) THEN
14252         cwchtmp = ((3. + dnu(lh))*(2. + dnu(lh))*(1.0 + dnu(lh)))**(-1./3.)
14253         
14254         DO mgs = 1,ngscnt
14255           !IF ( igs(mgs) == 19 ) write(0,*) 'k,qr,qh,cr,ch = ',kgs(mgs),qx(mgs,lr),cx(mgs,lr),qx(mgs,lh),cx(mgs,lh)
14256           IF ( qx(mgs,lr) .gt. qxmin(lr) .and. cx(mgs,lr) > cxmin ) THEN
14257              xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*cx(mgs,lr))            ! 
14258              xdia(mgs,lr,3) = (xv(mgs,lr)*6.0*cwc1)**(1./3.) 
14259            !  alpha(mgs,lr) = Min(alphamax, c1r*tanh(c2r*(xdia(mgs,lr,3)*1000. - c3r)) + c4r)
14260            ! IF ( igs(mgs) == 19 ) write(0,*) 'imy: i,k,alpr,xdia = ',igs(mgs),kgs(mgs),alpha(mgs,lr),xdia(mgs,lr,3)*1000.
14262             ! M&M-C 2010:
14263              tmp = 4. + alphar
14264              i = Int(dgami*(tmp))
14265              del = tmp - dgam*i
14266              x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14268              tmp = 1. + alphar
14269              i = Int(dgami*(tmp))
14270              del = tmp - dgam*i
14271              y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14273              tmp = (x/y)**(1./3.)*xdia(mgs,lr,3)*cwchtmp
14275              alpha(mgs,lr) = Min(15., 11.8*(1000.*tmp - 0.7)**2 + 2.)
14276           ENDIF
14277           IF ( qx(mgs,lh) .gt. qxmin(lh) .and. cx(mgs,lh) > cxmin ) THEN
14278 !      MY 2005:
14279              xv(mgs,lh) = rho0(mgs)*qx(mgs,lh)/(xdn(mgs,lh)*cx(mgs,lh))            ! 
14280              xdia(mgs,lh,3) = (xv(mgs,lh)*6.*piinv)**(1./3.) ! mwfac*xdia(mgs,lh,1) ! (xv(mgs,lh)*cwc0*6.0)**(1./3.)
14281 !             alpha(mgs,lh) = Min(alphamax, c1h*tanh(c2h*(xdia(mgs,lh,3)*1000. - c3h)) + c4h)
14283             ! M&M-C 2010:
14284              tmp = 4. + dnu(lh)
14285              i = Int(dgami*(tmp))
14286              del = tmp - dgam*i
14287              x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14289              tmp = 1. + dnu(lh)
14290              i = Int(dgami*(tmp))
14291              del = tmp - dgam*i
14292              y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14294              tmp = (x/y)**(1./3.)*xdia(mgs,lh,3)*cwchtmp
14296              alpha(mgs,lh) = Min(15., 11.8*(1000.*tmp - 0.7)**2 + 2.)
14297             ! alphan(mgs,lh) = alpha(mgs,lh)
14298             
14299            ! IF ( igs(mgs) == 19 ) write(0,*) 'imy: i,k,alph,xdia = ',igs(mgs),kgs(mgs),alpha(mgs,lh),xdia(mgs,lh,3)*1000.
14300             il = lh
14301             DO ic = lc,lh-1 ! lhab
14302                i = Nint( alpha(mgs,il)*dqiacralphainv )
14303                IF ( ic == lc .or. ic == li .or. ic == ls .or. (ic == lr .and. imurain == 3) ) THEN
14304                  alp = (3.*alpha(mgs,ic) + 2.)
14305                  j = Nint( (3.*alpha(mgs,ic) + 2.)*dqiacralphainv )
14306                ELSE ! IF ( ic == lr .and. imurain == 1 ) ! rain
14307                  alp = alpha(mgs,ic)
14308                  j = Nint( alpha(mgs,ic)*dqiacralphainv )
14309                ENDIF
14310              
14311                dab0lh(mgs,ic,il) = dab0lu(j,i,ic,il)
14312                dab1lh(mgs,ic,il) = dab1lu(j,i,ic,il)
14313                dab0lh(mgs,il,ic) = dab0lu(i,j,il,ic)
14314                dab1lh(mgs,il,ic) = dab1lu(i,j,il,ic)
14315              ENDDO
14316           ENDIF
14317 !        alpha(:,lr) = 0. ! 10.
14318 !        alpha(:,lh) = 0. ! 10.
14319           IF ( lhl > 0 ) THEN
14320           IF ( qx(mgs,lhl) .gt. qxmin(lhl) .and. cx(mgs,lhl) > cxmin ) THEN
14321              xv(mgs,lhl) = rho0(mgs)*qx(mgs,lhl)/(xdn(mgs,lhl)*cx(mgs,lhl))            ! 
14322              xdia(mgs,lhl,3) = (xv(mgs,lhl)*6.*piinv)**(1./3.)
14323              IF ( xdia(mgs,lhl,3) < 0.008 ) THEN
14324                alpha(mgs,lhl) = Min(alphamax, c1hl*tanh(c2hl*(xdia(mgs,lhl,3)*1000. - c3hl)) + c4hl)
14325              ELSE
14326                alpha(mgs,lhl) = Min(alphamax, c5hl*xdia(mgs,lhl,3)*1000. + c6hl)
14327              ENDIF
14329             il = lhl
14330             DO ic = lc,lh-1 ! lhab
14331                i = Nint( alpha(mgs,il)*dqiacralphainv )
14332                IF ( ic == lc .or. ic == li .or. ic == ls .or. (ic == lr .and. imurain == 3) ) THEN
14333                  alp = (3.*alpha(mgs,ic) + 2.)
14334                  j = Nint( (3.*alpha(mgs,ic) + 2.)*dqiacralphainv )
14335                ELSE ! IF ( ic == lr .and. imurain == 1 ) ! rain
14336                  alp = alpha(mgs,ic)
14337                  j = Nint( alpha(mgs,ic)*dqiacralphainv )
14338                ENDIF
14339              
14340                dab0lh(mgs,ic,il) = dab0lu(j,i,ic,il)
14341                dab1lh(mgs,ic,il) = dab1lu(j,i,ic,il)
14342                dab0lh(mgs,il,ic) = dab0lu(i,j,il,ic)
14343                dab1lh(mgs,il,ic) = dab1lu(i,j,il,ic)
14344              ENDDO
14346           ENDIF
14347           ENDIF
14351         ENDDO
14352       ENDIF
14353       
14355        IF ( imurain == 3 ) THEN
14356          IF ( lzr > 1 ) THEN
14357            alphashr = 0.0
14358            alphamlr = -2.0/3.0
14359            alphasmlr = -2.0/3.0
14360          ELSE
14361            alphashr = xnu(lr)
14362            alphamlr = xnu(lr)
14363            alphasmlr = xnu(lr)
14364          ENDIF
14365 !         massfacshr = ( (2. + 3.*(1. +alphashr) )/( 3.*(1. + alphashr) ) )**(1./3.) ! this is the diameter factor
14366 !         massfacmlr = ( (2. + 3.*(1. +alphamlr) )/( 3.*(1. + alphamlr) ) )**(1./3.)
14367          massfacshr = ( (2. + 3.*(1. +alphashr) )**3/( 3.*(1. + alphashr) ) )  ! this is the mass or volume factor
14368          massfacmlr = ( (2. + 3.*(1. +alphamlr) )**3/( 3.*(1. + alphamlr) ) )
14369        ELSEIF ( imurain == 1 ) THEN
14370          IF ( lzr > 1 ) THEN
14371            alphashr = 4.0
14372            alphamlr = 4.0
14373            alphasmlr = alphasmlr0
14374          ELSE
14375            alphashr = alphar
14376            alphamlr = alphar
14377            alphasmlr = alphar
14378          ENDIF
14379 !         massfacshr = (3.0 + alphashr)*((3.+alphashr)*(2.+alphashr)*(1. + alphashr) )**(-1./3.) ! this is the diameter factor
14380 !         massfacmlr = (3.0 + alphamlr)*((3.+alphamlr)*(2.+alphamlr)*(1. + alphamlr) )**(-1./3.)
14381          massfacshr = (3.0 + alphashr)**3/((3.+alphashr)*(2.+alphashr)*(1. + alphashr) ) ! this is the mass or volume factor
14382          massfacmlr = (3.0 + alphamlr)**3/((3.+alphamlr)*(2.+alphamlr)*(1. + alphamlr) )
14383        ENDIF
14384        
14385 !  Find shape parameter rain
14387       g1shr = 1.0
14388       g1mlr = 1.0
14389       g1smlr = 1.0
14391 !      CALL cld_cpu('Z-MOMENT-1')  
14392       
14393       IF ( ipconc >= 6 ) THEN
14394       
14395       ! set base g1x in case rain is not 3-moment
14396        IF ( ipconc >= 6 .and. imurain == 3 ) THEN
14397          il = lr
14398          DO mgs = 1,ngscnt
14399 !           g1x(mgs,il) = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
14400            g1x(mgs,il) = (alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0))
14401          ENDDO
14402        ENDIF
14404       IF (lzr > 1 ) THEN
14405        IF ( imurain == 3 ) THEN
14406          g1shr = (alphashr+2.0)/((alphashr+1.0))
14407          g1mlr = (alphamlr+2.0)/((alphamlr+1.0))
14408          g1smlr = (alphasmlr+2.0)/((alphasmlr+1.0))
14409        ELSEIF ( imurain == 1 ) THEN
14410 !         g1shr = 36.*(6.0 + alphashr)*(5.0 + alphashr)*(4.0 + alphashr)/ &
14411 !     &            (pi**2*(3.0 + alphashr)*(2.0 + alphashr)*(1.0 + alphashr))
14412          g1shr = (6.0 + alphashr)*(5.0 + alphashr)*(4.0 + alphashr)/ &
14413      &            ((3.0 + alphashr)*(2.0 + alphashr)*(1.0 + alphashr))
14414 !         g1mlr = 36.*(6.0 + alphamlr)*(5.0 + alphamlr)*(4.0 + alphamlr)/ &
14415 !     &            (pi**2*(3.0 + alphamlr)*(2.0 + alphamlr)*(1.0 + alphamlr))
14416          g1mlr = (6.0 + alphamlr)*(5.0 + alphamlr)*(4.0 + alphamlr)/ &
14417      &            ((3.0 + alphamlr)*(2.0 + alphamlr)*(1.0 + alphamlr))
14418          g1smlr = (6.0 + alphasmlr)*(5.0 + alphasmlr)*(4.0 + alphasmlr)/ &
14419      &            ((3.0 + alphasmlr)*(2.0 + alphasmlr)*(1.0 + alphasmlr))
14420        ENDIF
14421       ENDIF
14423       IF ( lzr > 1 .and. imurain == 3 ) THEN ! { RAIN SHAPE PARAM
14424       
14425       
14426 !      CALL cld_cpu('Z-MOMENT-1r')  
14427           il = lr
14428           DO mgs = 1,ngscnt
14429           
14431          IF ( iresetmoments == 1 .or. iresetmoments == il .or. iresetmoments == -1  ) THEN ! .or. qx(mgs,il) <= qxmin(il)  THEN
14432          IF ( zx(mgs,il) <= zxmin ) THEN !  .and. qx(mgs,il) > 0.05e-3  THEN
14433 !!            write(91,*) 'zx=0; qx,cx = ',1000.*qx(mgs,il),cx(mgs,il)
14434            qx(mgs,il) = 0.0
14435            cx(mgs,il) = 0.0
14436            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
14437            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
14438            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
14439          ELSEIF ( iresetmoments == -1 .and. qx(mgs,il) < qxmin(il) ) THEN
14440            zx(mgs,il) = 0.0
14441            cx(mgs,il) = 0.0
14442            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
14444            qx(mgs,il) = 0.0
14445            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
14446            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
14447            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14448          
14449          ELSEIF ( cx(mgs,il) <= cxmin .and. iresetmoments /= -1 ) THEN !  .and. qx(mgs,il) > 0.05e-3   THEN
14450          
14451            qx(mgs,lv) = qx(mgs,lv) + qx(mgs,il)
14452            zx(mgs,lr) = 0.0
14453            qx(mgs,lr) = 0.0
14454            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),lr)
14455            an(igs(mgs),jgs,kgs(mgs),lr) = qx(mgs,lr)
14456            an(igs(mgs),jgs,kgs(mgs),lz(lr)) = zx(mgs,lr)
14457          ENDIF
14458          ENDIF
14460          IF ( .false. .and. zx(mgs,il) <= zxmin .and. cx(mgs,il) <= cxmin ) THEN
14461            zx(mgs,il) = 0.0
14462            cx(mgs,il) = 0.0
14463            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
14465            qx(mgs,il) = 0.0
14466            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
14467            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
14468            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14469          ENDIF
14470          
14471          IF ( qx(mgs,lr) .gt. qxmin(lr) ) THEN
14473         xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*Max(1.0e-11,cx(mgs,lr)))
14474         IF ( xv(mgs,lr) .gt. xvmx(lr) ) THEN
14475 !          xv(mgs,lr) = xvmx(lr)
14476 !          cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmx(lr)*xdn(mgs,lr))
14477         ELSEIF ( xv(mgs,lr) .lt. xvmn(lr) ) THEN
14478           xv(mgs,lr) = xvmn(lr)
14479           cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmn(lr)*xdn(mgs,lr))
14480         ENDIF
14482           IF ( zx(mgs,il) > 0.0 .and. cx(mgs,il) <= 0.0 ) THEN
14483 !  have mass and reflectivity but no concentration, so set concentration, using default alpha
14484             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
14485             z   = zx(mgs,il)
14486             qr  = qx(mgs,il)
14487             cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(z*xdn(mgs,lr)**2)
14488 !            an(igs(mgs),jgs,kgs(mgs),ln(il)) = zx(mgs,il)
14489            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) > 0.0 ) THEN
14490 !  have mass and concentration but no reflectivity, so set reflectivity, using default alpha
14491             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
14492             chw = cx(mgs,il)
14493             qr  = qx(mgs,il)
14494             zx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(xdn(mgs,lr)**2*chw)
14495             an(igs(mgs),jgs,kgs(mgs),lz(lr)) = zx(mgs,lr)
14497            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) <= 0.0 ) THEN
14498 !   How did this happen?
14499          ! set values according to dBZ of -10, or Z = 0.1
14500 !              0.1 = 1.e18*0.224*an(ix,jy,kz,lzh)*(hwdn/rwdn)**2
14501                zx(mgs,il) = 1.e-19/0.224*(xdn0(lr)/xdn0(il))**2
14502                an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14503                
14504             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
14505                z   = zx(mgs,il)
14506                qr  = qx(mgs,il)
14507                cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(z*1000.*1000)
14508                an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
14509           ENDIF
14510         
14511           IF ( zx(mgs,lr) > 0.0 ) THEN
14512             xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(1000.*cx(mgs,lr))
14513             vr = xv(mgs,lr)
14514            qr = qx(mgs,lr)
14515            nrx = cx(mgs,lr)
14516            z = zx(mgs,lr)
14518 !           xv = (db(1,kz)*a(1,1,kz,lr))**2/(a(1,1,kz,lnr))
14519 !           rd = z*(pi/6.*1000.)**2/xv
14521 ! determine shape parameter alpha by iteration
14522            IF ( z .gt. 0.0 ) THEN
14523 !           alpha(mgs,lr) = 3.
14524            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
14525            DO i = 1,20
14526             IF ( Abs(alp - alpha(mgs,lr)) .lt. 0.01 ) EXIT
14527              alpha(mgs,lr) = Max( rnumin, Min( rnumax, alp ) )
14528            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
14529              alp = Max( rnumin, Min( rnumax, alp ) )
14530            ENDDO
14532 ! check for artificial breakup (rain larger than allowed max size)
14533         IF (  (xv(mgs,il) .gt. xvmx(il) .or. (ioldlimiter >= 2 .and. xv(mgs,il) .gt. xvmx(il)/8.) )) THEN
14534           tmp = cx(mgs,il)
14535           IF ( ioldlimiter >= 2 ) THEN ! MY-style active breakup
14536             x = (6.*rho0(mgs)*qx(mgs,il)/(pi*xdn(mgs,il)*cx(mgs,il)))**(1./3.)
14537             x1 = Max(0.0e-3, x - 3.0e-3)
14538             x2 = Max(0.5, x/6.0e-3)
14539             x3 = x2**3
14540             cx(mgs,il) = cx(mgs,il)*Max((1.+2.222e3*x1**2), x3)
14541             xv(mgs,il) = xv(mgs,il)/Max((1.+2.222e3*x1**2), x3)
14542           ELSE ! simple cutoff 
14543             xv(mgs,il) = Min( xvmx(il), Max( xvmn(il),xv(mgs,il) ) )
14544             xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
14545             cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
14546           ENDIF
14547             !xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
14548             !cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
14550           IF ( tmp < cx(mgs,il) ) THEN ! breakup
14552             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
14553             zx(mgs,il) = zx(mgs,il) + g1*(rho0(mgs)/xdn(mgs,il))**2*( (qx(mgs,il)/tmp)**2 * (tmp-cx(mgs,il)) )
14554             an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14556            vr = xv(mgs,lr)
14557            qr = qx(mgs,lr)
14558            nrx = cx(mgs,lr)
14559            z = zx(mgs,lr)
14562 ! determine shape parameter alpha by iteration
14563            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
14564            DO i = 1,20
14565             IF ( Abs(alp - alpha(mgs,lr)) .lt. 0.01 ) EXIT
14566              alpha(mgs,lr) = Max( rnumin, Min( rnumax, alp ) )
14567            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
14568              alp = Max( rnumin, Min( rnumax, alp ) )
14569            ENDDO
14571             
14572           ENDIF
14573         ENDIF
14576 ! Check whether the shape parameter is at or less than the minimum, and if it is, reset the 
14577 ! concentration or reflectivity to match (prevents reflectivity from being out of balance with Q and N)
14579               g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
14580            IF ( .true. .and. (alpha(mgs,il) <= rnumin .or. alp == rnumin .or. alp == rnumax) ) THEN
14582             IF ( rescale_high_alpha .and. alp >= rnumax - 0.01  ) THEN  ! reset c at high alpha to prevent growth in Z
14583               cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z*(1./(xdn(mgs,il)))**2
14584               an(igs(mgs),jy,kgs(mgs),ln(il)) = cx(mgs,il)
14585             
14586             ELSEIF ( rescale_low_alphar .and. alp <= rnumin ) THEN
14587              z  = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/((alpha(mgs,lr)+1.0)*pi**2)
14588              zx(mgs,il) = z
14589              an(igs(mgs),jy,kgs(mgs),lz(il)) = zx(mgs,il)
14590             ENDIF
14591            ENDIF
14592            
14593          ! set g1x to use as G factor later. If alpha is in the range ( rnumin < alpha < rnumax ), then 
14594          ! this will be the same as computing G from alpha.  If alpha = rnumax, however, it probably means that
14595          ! the moments are not matched correctly, so we compute G from the moments instead so that the dZ/dt rates
14596          ! stay consistent with dN/dt and dq/dt.
14597            IF ( alp >= rnumax - 0.01 ) THEN
14598 !             g1x(mgs,il) = 6**2*zx(mgs,il)/(cx(mgs,il)*(pi*xv(mgs,lr))**2)
14599 !             g1x(mgs,il) = xdn(mgs,il)*zx(mgs,il)*cx(mgs,il)/((rho0(mgs)*qx(mgs,lr))**2)
14600              g1x(mgs,il) = (pi*xdn(mgs,il))**2*zx(mgs,il)*cx(mgs,il)/((6.*rho0(mgs)*qx(mgs,il))**2)
14601            ELSE
14602              g1x(mgs,il) = g1
14603            ENDIF
14604            
14605            tmp = alpha(mgs,lr) + 4./3.
14606            i = Int(dgami*(tmp))
14607            del = tmp - dgam*i
14608            x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14610            tmp = alpha(mgs,lr) + 1.
14611            i = Int(dgami*(tmp))
14612            del = tmp - dgam*i
14613            y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14614            
14615            gf1palp(mgs) = y
14617 !           ventrx(mgs) = Gamma_sp(alpha(mgs,lr) + 4./3.)/(alpha(mgs,lr) + 1.)**(1./3.)/Gamma_sp(alpha(mgs,lr) + 1.)
14618            ventrx(mgs) = x/(y*(alpha(mgs,lr) + 1.)**(1./3.))
14620            IF ( imurain == 3 .and. izwisventr == 2 ) THEN
14622            tmp = alpha(mgs,lr) + 1.5 + br/6.
14623            i = Int(dgami*(tmp))
14624            del = tmp - dgam*i
14625            x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14627 !           ventrx(mgs) = Gamma_sp(alpha(mgs,lr) + 1.5 + br/6.)/Gamma_sp(alpha(mgs,lr) + 1.)
14628            ventrxn(mgs) = x/(y*(alpha(mgs,lr) + 1.)**((1.+br)/6. + 1./3.))
14629            
14630 ! This whole section is imurain == 3, so this branch never runs
14631 !           ELSEIF ( imurain == 1 .and.  iferwisventr == 2 ) THEN
14633 !           tmp = alpha(mgs,lr) + 2.5 + br/2.
14634 !           i = Int(dgami*(tmp))
14635 !           del = tmp - dgam*i
14636 !           x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14638 !!           ventrx(mgs) = Gamma_sp(alpha(mgs,lr) + 1.5 + br/6.)/Gamma_sp(alpha(mgs,lr) + 1.)
14639 !           ventrxn(mgs) = x/y
14640            
14641            
14642            ENDIF
14643            
14644            ENDIF
14645           ENDIF
14646           
14647           ENDIF
14648           
14649           ENDDO
14650 !        CALL cld_cpu('Z-MOMENT-1r')  
14651         ENDIF ! }
14652         
14653       ENDIF ! ipconc >= 6
14655 !  Find shape parameters for graupel and hail
14656       IF ( ipconc .ge. 6 ) THEN
14657             
14658         DO il = lr,lhab
14659           
14660         ! set base values of g1x
14661           IF ( (.not. ( il == lr .and. imurain == 3 )) .and. ( il == lr .or. il == lh .or. il == lhl .or. il == lf ) ) THEN
14662           DO mgs = 1,ngscnt
14663             g1x(mgs,il) = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
14664      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
14665           ENDDO
14666           ENDIF
14667         
14668         IF ( lz(il) .gt. 1   .and. ( .not. ( il == lr .and. imurain == 3 )) ) THEN
14669         
14670         DO mgs = 1,ngscnt
14673          IF ( iresetmoments == 1 .or. iresetmoments == il .or. iresetmoments == -1  ) THEN ! .or. qx(mgs,il) <= qxmin(il) ) THEN
14674          IF ( zx(mgs,il) <= zxmin ) THEN !  .and. qx(mgs,il) > 0.05e-3 ) THEN
14675 !!            write(91,*) 'zx=0; qx,cx = ',1000.*qx(mgs,il),cx(mgs,il)
14676            qx(mgs,il) = 0.0
14677            cx(mgs,il) = 0.0
14678            zx(mgs,il) = 0.0
14679            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
14680            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
14681            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
14682            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14683          ELSEIF ( iresetmoments == -1 .and. qx(mgs,il) < qxmin(il) ) THEN
14684            zx(mgs,il) = 0.0
14685            cx(mgs,il) = 0.0
14686            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
14688            qx(mgs,il) = 0.0
14689            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
14690            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
14691            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14692          
14693          ELSEIF ( cx(mgs,il) <= cxmin .and. iresetmoments /= -1 ) THEN !  .and. qx(mgs,il) > 0.05e-3  ) THEN
14694            qx(mgs,lv) = qx(mgs,lv) + qx(mgs,il)
14695            zx(mgs,il) = 0.0
14696            cx(mgs,il) = 0.0
14697            qx(mgs,il) = 0.0
14698            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
14699            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
14700            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14701            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
14702          ENDIF
14703          ENDIF
14705          IF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) <= cxmin ) THEN
14706            zx(mgs,il) = 0.0
14707            cx(mgs,il) = 0.0
14708            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
14710            qx(mgs,il) = 0.0
14711            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
14712            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
14713            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14714          ENDIF
14715         
14716         IF ( qx(mgs,il) .gt. qxmin(il) ) THEN
14718         xv(mgs,il) = rho0(mgs)*qx(mgs,il)/(xdn(mgs,il)*Max(1.0e-9,cx(mgs,il)))
14719         xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
14721         IF ( xv(mgs,il) .lt. xvmn(il) ) THEN
14722           xv(mgs,il) = Min( xvmx(il), Max( xvmn(il),xv(mgs,il) ) )
14723           xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
14724           cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
14725         ENDIF
14727           IF ( zx(mgs,il) > 0.0 .and. cx(mgs,il) <= 0.0 ) THEN
14728 !  have mass and reflectivity but no concentration, so set concentration, using default alpha
14729             g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
14730      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
14731             z   = zx(mgs,il)
14732             qr  = qx(mgs,il)
14733 !            cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z
14734             cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(6.*qr)**2/(z*(pi*xdn(mgs,il))**2)
14736            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) > cxmin ) THEN
14737 !  have mass and concentration but no reflectivity, so set reflectivity, using default alpha
14738 !            g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
14739 !     &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
14740             chw = cx(mgs,il)
14741             qr  = qx(mgs,il)
14742 !            zx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/chw
14743 !            zx(mgs,il) = Min(zxmin*1.1, g1*dn(igs(mgs),jy,kgs(mgs))**2*(6.*qr)**2/(chw*(pi*xdn(mgs,il))**2) )
14744             g1 = (6.0 + alphamax)*(5.0 + alphamax)*(4.0 + alphamax)/ &
14745      &            ((3.0 + alphamax)*(2.0 + alphamax)*(1.0 + alphamax))
14746             zx(mgs,il) = Max(zxmin*1.1, g1*dn(igs(mgs),jy,kgs(mgs))**2*(6*qr)**2/(chw*(pi*xdn(mgs,il))**2) )
14747             an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14749            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) <= 0.0 ) THEN
14750 !   How did this happen?
14751          ! set values according to dBZ of -10, or Z = 0.1
14752 !              0.1 = 1.e18*0.224*an(ix,jy,kz,lzh)*(hwdn/rwdn)**2
14753                zx(mgs,il) = 1.e-19/0.224*(xdn0(lr)/xdn0(il))**2
14754                an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14755                
14756                g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
14757      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
14758                z   = zx(mgs,il)
14759                qr  = qx(mgs,il)
14760 !               cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z
14761                cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(6.*qr)**2/(z*(pi*xdn(mgs,il))**2)
14762                an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
14763            ELSE
14764           
14765           chw = cx(mgs,il)
14766           qr  = qx(mgs,il)
14767           z   = zx(mgs,il)
14769           IF ( zx(mgs,il) .gt. 0. ) THEN
14770            
14771 !            rdi = z*(pi/6.*1000.)**2*chw/((rho0(mgs)*qr)**2)
14772             rdi = z*(pi/6.*xdn(mgs,il))**2*chw/((rho0(mgs)*qr)**2)
14774 !           alp = 1.e18*(6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/
14775 !     :            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
14776            alp = (6.0+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
14777      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
14778 !           print*,'kz, alp, alpha(mgs,il) = ',kz,alp,alpha(mgs,il),rdi,z,xv
14779            alp = Max( alphamin, Min( alphamax, alp ) )
14780            
14781          IF ( newton ) THEN
14782            DO i = 1,10
14783              IF ( Abs(alp - alpha(mgs,il)) .lt. 0.01 ) EXIT
14784              alpha(mgs,il) = Max( alphamin, Min( alphamax, alp ) )
14785              alp = alp + ( galpha(alp) - rdi )/dgalpha(alp)
14786              alp = Max( alphamin, Min( alphamax, alp ) )
14787            ENDDO
14788            
14789          ELSE
14790            DO i = 1,10
14791 !            IF ( 100.*Abs(alp - alpha(mgs,il))/(Abs(alpha(mgs,il))+1.e-5) .lt. 1. ) EXIT
14792              IF ( Abs(alp - alpha(mgs,il)) .lt. 0.01 ) EXIT
14793              alpha(mgs,il) = Max( alphamin, Min( alphamax, alp ) )
14794 !             alp = 1.e18*(6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/
14795 !     :            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
14796              alp = (6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
14797      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
14798 !           print*,'i,alp = ',i,alp
14799              alp = Max( alphamin, Min( alphamax, alp ) )
14800            ENDDO
14801           ENDIF
14804 ! check for artificial breakup (graupel/hail larger than allowed max size)
14805         IF ( imaxdiaopt == 1 ) THEN
14806           xvbarmax = xvmx(il) 
14807         ELSEIF ( imaxdiaopt == 2 ) THEN ! test against maximum mass diameter
14808           xvbarmax = xvmx(il) /((3. + alpha(mgs,il))**3/((3. + alpha(mgs,il))*(2. + alpha(mgs,il))*(1. + alpha(mgs,il))))
14809         ELSEIF ( imaxdiaopt == 3 ) THEN ! test against mass-weighted diameter
14810           xvbarmax = xvmx(il) /((4. + alpha(mgs,il))**3/((3. + alpha(mgs,il))*(2. + alpha(mgs,il))*(1. + alpha(mgs,il))))
14811         ELSE
14812           xvbarmax = xvmx(il) 
14813         ENDIF
14815         IF (  xv(mgs,il) .gt. xvbarmax .or. (il == lr .and. ioldlimiter >= 2 .and. xv(mgs,il) .gt. xvmx(il)/8.)) THEN
14816           tmp = cx(mgs,il)
14817           IF( ioldlimiter >= 2 .and. il == lr) THEN ! MY-style drop limiter for rain
14818             x = (6.*rho0(mgs)*qx(mgs,il)/(pi*xdn(mgs,il)*cx(mgs,il)))**(1./3.)
14819             x1 = Max(0.0e-3, x - 3.0e-3)
14820             x2 = Max(0.5, x/6.0e-3)
14821             x3 = x2**3
14822             cx(mgs,il) = cx(mgs,il)*Max((1.+2.222e3*x1**2), x3)
14823             xv(mgs,il) = xv(mgs,il)/Max((1.+2.222e3*x1**2), x3)
14824           ELSE
14825             xv(mgs,il) = Min( xvbarmax, Max( xvmn(il),xv(mgs,il) ) )
14826             xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
14827             cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
14828           ENDIF
14829           IF ( tmp < cx(mgs,il) ) THEN ! artificial breakup has happened, so need to adjust reflectivity and find new shape parameter
14830             g1 = 36.*(6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
14831      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il))*pi**2)
14832              zx(mgs,il) = zx(mgs,il) + g1*(rho0(mgs)/xdn(mgs,il))**2*( (qx(mgs,il)/tmp)**2 * (tmp-cx(mgs,il)) )
14833              an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
14835           chw = cx(mgs,il)
14836           qr  = qx(mgs,il)
14837           z   = zx(mgs,il)
14839             rdi = z*(pi/6.*xdn(mgs,il))**2*chw/((rho0(mgs)*qr)**2)
14840             alp = (6.0+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
14841      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
14842            DO i = 1,10
14843              IF ( Abs(alp - alpha(mgs,il)) .lt. 0.01 ) EXIT
14844              alpha(mgs,il) = Max( alphamin, Min( alphamax, alp ) )
14845              alp = (6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
14846      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
14847              alp = Max( alphamin, Min( alphamax, alp ) )
14848            ENDDO
14850             
14851           ENDIF
14852         ENDIF
14855 ! Check whether the shape parameter is at or less than the minimum, and if it is, reset the 
14856 ! concentration or reflectivity to match (prevents reflectivity from being out of balance with Q and N)
14858              g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
14859      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
14861            IF ( ( lrescalelow(il) .or. rescale_high_alpha ) .and.  &
14862      &          ( alpha(mgs,il) <= alphamin .or. alp == alphamin .or. alp == alphamax ) ) THEN
14866             IF ( rescale_high_alpha .and. alp >= alphamax - 0.01  ) THEN  ! reset c at high alpha to prevent growth in Z
14867               cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z*(6./(pi*xdn(mgs,il)))**2
14868               an(igs(mgs),jy,kgs(mgs),ln(il)) = cx(mgs,il)
14869             
14870             ELSEIF ( lrescalelow(il) .and. alp <= alphamin .and. .not. (il == lh .and. icvhl2h > 0 ) .and. &
14871                      .not. ( il == lr .and. .not. rescale_low_alphar ) ) THEN ! alpha = alphamin, so reset Z to prevent growth in C
14872              wtest = .false.
14873              IF ( irescalerainopt == 0 ) THEN
14874                wtest = .false.
14875              ELSEIF ( irescalerainopt == 1 ) THEN
14876                wtest = qx(mgs,lc) > qxmin(lc) 
14877              ELSEIF ( irescalerainopt == 2 ) THEN
14878                wtest = qx(mgs,lc) > qxmin(lc) .and. wvel(mgs) < rescale_wthresh
14879              ELSEIF ( irescalerainopt == 3 ) THEN
14880                wtest = temcg(mgs) > rescale_tempthresh .and. qx(mgs,lc) > qxmin(lc) .and. wvel(mgs) < rescale_wthresh
14881              ENDIF
14882              
14883              IF ( il == lr .and. ( wtest ) ) THEN
14884 !             IF ( temcg(mgs) > 0.0 .and. il == lr .and. qx(mgs,lc) > qxmin(lc) ) THEN
14885              ! certain situations where rain number is adjusted instead of Z. Helps avoid rain being 'zapped' by autoconverted 
14886              ! drops (i.e., favor preserving Z when alpha tries to go negative)
14887              chw = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z*(6./(pi*xdn(mgs,il)))**2 ! g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z1
14888              cx(mgs,il) = chw
14889              an(igs(mgs),jy,kgs(mgs),ln(il)) = chw
14890              ELSE
14891              
14892              ! Usual resetting of reflectivity moment to force consisntency between Q, N, Z, and alpha when alpha = alphamin
14893              z1 = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/chw
14894              z  = z1*(6./(pi*xdn(mgs,il)))**2
14895              zx(mgs,il) = z
14896              an(igs(mgs),jy,kgs(mgs),lz(il)) = z
14897              ENDIF
14898             ENDIF
14899            ENDIF
14900           
14901           
14902          ! set g1x to use as G factor later. If alpha is in the range ( rnumin < alpha < rnumax ), then 
14903          ! this will be the same as computing G from alpha.  If alpha = rnumax, however, it probably means that
14904          ! the moments are not matched correctly, so we compute G from the moments instead so that the dZ/dt rates
14905          ! stay consistent with dN/dt and dq/dt.
14906 !          g1x(mgs,il) = zx(mgs,il)*chw*(pi*xdn(mgs,il))**2/(6.*qr*dn(igs(mgs),jy,kgs(mgs)))**2
14907 !          g1x(mgs,il) = g1 ! zx(mgs,il)*cx(mgs,il)/(qr)**2
14908            IF ( alp >= alphamax - 0.5 ) THEN
14909 !             g1x(mgs,il) = 6**2*zx(mgs,il)/(cx(mgs,il)*(pi*xv(mgs,lr))**2)
14910 !             g1x(mgs,il) = (xdn(mgs,il))**2*zx(mgs,il)*cx(mgs,il)/((rho0(mgs)*qx(mgs,il))**2)
14911              g1x(mgs,il) = (pi*xdn(mgs,il))**2*zx(mgs,il)*cx(mgs,il)/((6.*rho0(mgs)*qx(mgs,il))**2)
14912            ELSE
14913              g1x(mgs,il) = g1
14914            ENDIF
14915           
14916            ENDIF
14917           
14918 !          IF ( ny .eq. 2 ) THEN
14919 !          IF ( qr .gt. 1.e-3 ) THEN
14920 !           write(0,*) 'alphah at nstep,i,k = ',dtp*(nstep-1),igs(mgs),kgs(mgs),alpha(mgs,il),qr*1000.
14921 !          ENDIF
14922 !          ENDIF
14923           
14924            
14925            ENDIF ! .true.
14927           IF ( il == lr ) THEN
14928            
14929 !           tmp = alpha(mgs,lr) + 4./3.
14930 !           i = Int(dgami*(tmp))
14931 !           del = tmp - dgam*i
14932 !           x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14934 !           tmp = alpha(mgs,lr) + 1.
14935 !           i = Int(dgami*(tmp))
14936 !           del = tmp - dgam*i
14937 !           y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14939 !!           ventrx(mgs) = Gamma_sp(alpha(mgs,lr) + 4./3.)/(alpha(mgs,lr) + 1.)**(1./3.)/Gamma_sp(alpha(mgs,lr) + 1.)
14940 !           ventrx(mgs) = x/(y*(alpha(mgs,lr) + 1.)**(1./3.))
14943            tmp = alpha(mgs,lr) + 1.
14944            i = Int(dgami*(tmp))
14945            del = tmp - dgam*i
14946            y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14948            gf1palp(mgs) = y
14950            IF (   iferwisventr == 2 ) THEN
14951            tmp = alpha(mgs,lr) + 2.5 + br/2.
14952            i = Int(dgami*(tmp))
14953            del = tmp - dgam*i
14954            x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
14956 !           ventrx(mgs) = Gamma_sp(alpha(mgs,lr) + 1.5 + br/6.)/Gamma_sp(alpha(mgs,lr) + 1.)
14958            ventrxn(mgs) = x/y
14959            
14960            ENDIF
14961            
14962           ENDIF ! il==lr
14964           
14965           ELSE ! below mass threshold
14966 !             g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/
14967 !     &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
14968 !             z1 = g1*rho0(mgs)**2*(qr)*qr/chw
14969 !             z  = 1.e18*z1*(6./(pi*1000.))**2
14970 !             z  = z1*(6./(pi*1000.))**2
14971 !             zx(mgs,il) = z
14972 !             an(igs(mgs),jy,kgs(mgs),lz(il)) = z
14973           ENDIF ! ( qx(mgs,il) .gt. qxmin(il) )
14974         
14975         
14976         
14977 !        ENDIF
14978         ENDDO ! mgs
14980 !         CALL cld_cpu('Z-DELABK')  
14981         
14982 !        IF ( il == lr ) THEN
14983 !          xnutmp = (alpha(mgs,il) - 2.)/3.
14984 !           da0lr(mgs) = delbk(bb(il), xnutmp, xmu(il), 0)
14985 !        ENDIF
14986         
14987         IF ( .not. ( il == lr .and. imurain == 3 ) ) THEN
14988 !          CALL cld_cpu('Z-DELABK')  
14989         DO mgs = 1,ngscnt
14990           IF ( qx(mgs,il) > qxmin(il) ) THEN
14991           xnutmp = (alpha(mgs,il) - 2.)/3.
14992           
14993 !          IF ( .true. ) THEN
14994           DO ic = lc,lh-1 ! lhab
14995            IF ( il .ne. ic .and.  qx(mgs,ic) .gt. qxmin(ic)) THEN
14996              xnuc = xnu(ic)
14997              IF ( ic == lc .and. idiagnosecnu > 0 ) xnuc = alpha(mgs,lc) ! alpha for droplets is actually nu
14998              IF ( il /= lr .and. ic == lr .and. lzr > 1 ) THEN
14999                IF ( imurain == 3 ) THEN
15000                  xnuc = alpha(mgs,lr) ! alpha is nu already
15001                ELSE
15002                  xnuc = ( alpha(mgs,lr) - 2. )/3. ! convert alpha to nu
15003                ENDIF
15004              ENDIF
15005                                  ! delabk(ba,bb,nua,nub,mua,mub,k), where a (il)  is collector and b (ic) is collected
15006              IF ( .false. ) THEN
15007              dab0lh(mgs,ic,il) =  delabk(bb(ic), bb(il), xnuc, xnutmp, xmu(ic), xmu(il), 0) !dab0(il,ic)
15008              dab1lh(mgs,ic,il) =  delabk(bb(ic), bb(il), xnuc, xnutmp, xmu(ic), xmu(il), 1) !dab1(il,ic)
15009              dab0lh(mgs,il,ic) =  delabk(bb(il), bb(ic), xnutmp, xnuc, xmu(il), xmu(ic), 0) !dab0(il,ic)
15010              dab1lh(mgs,il,ic) =  delabk(bb(il), bb(ic), xnutmp, xnuc, xmu(il), xmu(ic), 1) !dab1(il,ic)
15011              ELSE ! use lookup table -- not interpolating yet because table resolution of 0.05 is good enough
15012                i = Nint( alpha(mgs,il)*dqiacralphainv )
15013                IF ( ic == lc .or. ic == li .or. ic == ls .or. (ic == lr .and. imurain == 3) ) THEN
15014                  alp = (3.*alpha(mgs,ic) + 2.)
15015                  j = Nint( (3.*alpha(mgs,ic) + 2.)*dqiacralphainv )
15016                ELSE ! IF ( ic == lr .and. imurain == 1 ) ! rain
15017                  alp = alpha(mgs,ic)
15018                  j = Nint( alpha(mgs,ic)*dqiacralphainv )
15019                ENDIF
15020              
15021                dab0lh(mgs,ic,il) = dab0lu(j,i,ic,il)
15022                dab1lh(mgs,ic,il) = dab1lu(j,i,ic,il)
15023                dab0lh(mgs,il,ic) = dab0lu(i,j,il,ic)
15024                dab1lh(mgs,il,ic) = dab1lu(i,j,il,ic)
15026 !               tmp1 = dab0lu(j,i,ic,il)
15027 !               tmp2 = dab1lu(j,i,ic,il)
15028 !               tmp3 = dab0lu(i,j,il,ic)
15029 !               tmp4 = dab1lu(i,j,il,ic)
15030 !               tmp5 =  delabk(bb(il), bb(ic), xnutmp, xnuc, xmu(ic), xmu(il), 0) !dab0(il,ic)
15031 !               tmp6 =  delabk(bb(il), bb(ic), xnutmp, xnuc, xmu(ic), xmu(il), 1) !dab1(il,ic)
15032 !               tmp5 =  delabk(bb(il), bb(ic), xnutmp, xnuc, xmu(il), xmu(ic), 0) !dab0(il,ic)
15033 !               tmp6 =  delabk(bb(il), bb(ic), xnutmp, xnuc, xmu(il), xmu(ic), 1) !dab1(il,ic)
15034                
15035                IF ( .false. .and. ny <= 2 ) THEN
15036                  write(0,*)
15037                  write(0,*) 'bb: ', bb(il), bb(ic), xnutmp, xnuc, xmu(il), xmu(ic)
15038                  write(0,*) 'il,ic = ',il,ic,alpha(mgs,il),i,xnuc,alp,j
15039                  write(0,*) 'dab0lh,tmp1 = ',dab0lh(mgs,ic,il),tmp1
15040                  write(0,*) 'dab1lh,tmp2 = ',dab1lh(mgs,ic,il),tmp2
15041                  write(0,*) 'dab0lh,tmp3 = ',dab0lh(mgs,il,ic),tmp3,tmp5
15042                  write(0,*) 'dab1lh,tmp4 = ',dab1lh(mgs,il,ic),tmp4,tmp6
15043                
15044                ENDIF
15045              
15046              ENDIF
15047              
15048            ENDIF
15049           ENDDO
15051 !          ENDIF
15052            
15053              da0lx(mgs,il) = delbk(bb(il), xnutmp, xmu(il), 0)
15054            IF ( il .eq. lh ) THEN
15055              da0lh(mgs) = delbk(bb(il), xnutmp, xmu(il), 0)
15056             IF ( lzr > 1 ) THEN
15057              rzxh(mgs) = 1.
15058             ELSE
15059              rzxh(mgs) = ((4. + alpha(mgs,il))*(5. + alpha(mgs,il))*(6. + alpha(mgs,il))*(1. + xnu(lr)))/   &
15060      &  ((1. + alpha(mgs,il))*(2. + alpha(mgs,il))*(3. + alpha(mgs,il))*(2. + xnu(lr)))
15061             ENDIF
15062             
15063             IF ( lzhl < 1 ) THEN
15064               rzxhlh(mgs) = rzxhl(mgs)/(((4. + alpha(mgs,il))*(5. + alpha(mgs,il))*(6. + alpha(mgs,il))*(1. + xnu(lr)))/   &
15065      &  ((1. + alpha(mgs,il))*(2. + alpha(mgs,il))*(3. + alpha(mgs,il))*(2. + xnu(lr))))
15066             ENDIF
15067            ELSEIF ( il .eq. lhl ) THEN
15068              da0lhl(mgs) = delbk(bb(il), xnutmp, xmu(il), 0)
15069             IF ( lzr > 1 ) THEN
15070              rzxhl(mgs) = 1.
15071             ELSE
15072              rzxhl(mgs) = ((4.0 + alpha(mgs,il))*(5. + alpha(mgs,il))*(6. + alpha(mgs,il))*(1. + xnu(lr)))/   &
15073      &  ((1. + alpha(mgs,il))*(2. + alpha(mgs,il))*(3. + alpha(mgs,il))*(2. + xnu(lr)))
15074             ENDIF
15075            ELSEIF ( il == lr ) THEN
15076              xnutmp = (alpha(mgs,il) - 2.)/3.
15077              da0lr(mgs) = delbk(bb(il), xnutmp, xmu(il), 0)
15078              da1lr(mgs) = delbk(bb(il), xnutmp, xmu(il), 1)
15079            ENDIF
15080           
15081           ENDIF ! ( qx(mgs,il) > qxmin(il) )
15082         ENDDO ! mgs
15083 !          CALL cld_cpu('Z-DELABK')  
15084         ENDIF ! il /= lr
15086 !         CALL cld_cpu('Z-DELABK')  
15087         
15088         ENDIF ! lz(il) .gt. 1
15089         
15090         ENDDO ! il
15091           
15092       ENDIF ! ipconc .ge. 6
15094 !      CALL cld_cpu('Z-MOMENT-1')  
15097 !  set some values for ice nucleation
15099       do mgs = 1,ngscnt
15100       kp1 = Min(nz, kgs(mgs)+1 )
15101 !      wvel(mgs) = (0.5)*(w(igs(mgs),jgs,kp1)   &
15102 !     &                  +w(igs(mgs),jgs,kgs(mgs)))
15104       
15105         wvelkm1(mgs) = (0.5)*(w(igs(mgs),jgs,kgs(mgs))   &
15106      &                    +w(igs(mgs),jgs,kgsm(mgs)))
15107       cninm(mgs) = t7(igs(mgs),jgs,kgsm(mgs))
15108       cnina(mgs) = t7(igs(mgs),jgs,kgs(mgs))
15109       cninp(mgs) = t7(igs(mgs),jgs,kgsp(mgs))
15110       end do
15113 !  Set a couple of cloud variables...
15116 !      SUBROUTINE setvt(ngscnt,qx,qxmin,cx,rho0,rhovt,xdia,cno,
15117 !     :                 xmas,xdn,xvmn,xvmx,xv,cdx,
15118 !     :                 ipconc,ndebug)
15119 !      SUBROUTINE setvtz(ngscnt,qx,qxmin,qxw,cx,rho0,rhovt,xdia,cno, &
15120 !     &                 xmas,vtxbar,xdn,xvmn,xvmx,xv,cdx,            &
15121 !     &                 ipconc1,ndebug1,ngs,nz,kgs,cwnccn,fadvisc,   &
15122 !     &                 cwmasn,cwmasx,cwradn,cnina,cimna,cimxa,      &
15123 !     &                 itype1a,itype2a,temcg,infdo,alpha)
15126       infdo = 1
15127       IF ( rimdenvwgt > 0 ) infdo = 1
15129       call setvtz(ngscnt,qx,qxmin,qxw,cx,rho0,rhovt,xdia,cno,cnostmp,   &
15130      &                 xmas,vtxbar,xdn,xvmn,xvmx,xv,cdx,cdxgs,   &
15131      &                 ipconc,ndebug,ngs,nz,kgs,fadvisc,   &
15132      &                 cwmasn,cwmasx,cwradn,cnina,cimn,cimx,   &
15133      &                 itype1,itype2,temcg,infdo,alpha,0,axx,bxx) ! ,cdh,cdhl)
15134 !     &                 itype1,itype2,temcg,infdo,alpha,0,axh,bxh,axhl,bxhl) ! ,cdh,cdhl)
15137        IF ( lwsm6 .and. ipconc == 0 ) THEN
15138          tmp = Max(qxmin(lh), qxmin(ls))
15139          DO mgs = 1,ngscnt
15140            total = qx(mgs,lh) + qx(mgs,ls)
15141            IF ( total > tmp ) THEN
15142              vt2ave(mgs) = (qx(mgs,lh)*vtxbar(mgs,lh,1) + qx(mgs,ls)*vtxbar(mgs,ls,1))/total
15143            ELSE
15144              vt2ave(mgs) = 0.0
15145            ENDIF
15146          ENDDO
15147        ENDIF
15151 !  Set number concentrations (need xdia from setvt)
15153       if ( ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: Set concentration'
15154       IF ( ipconc .lt. 1 ) THEN
15155          cina(1:ngscnt) = cx(1:ngscnt,li)
15156       ENDIF
15157       if ( ipconc .lt. 5 ) then
15158       do mgs = 1,ngscnt
15161       IF ( ipconc .lt. 3 ) THEN
15162 !      cx(mgs,lr) = 0.0
15163       if ( qx(mgs,lr) .gt. qxmin(lh) )  then
15164 !      cx(mgs,lr) = cno(lr)*xdia(mgs,lr,1)
15165 !      xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*cx(mgs,lr))
15166       end if
15167       ENDIF
15169       IF ( ipconc .lt. 4 ) THEN
15170 !      tmp = cx(mgs,ls)
15171 !      cx(mgs,ls) = 0.0
15172       if ( qx(mgs,ls) .gt. qxmin(ls) )  then
15173 !      cx(mgs,ls) = cno(ls)*xdia(mgs,ls,1)
15174 !      xv(mgs,ls) = rho0(mgs)*qx(mgs,ls)/(xdn(mgs,ls)*cx(mgs,ls))
15175       end if
15176       ENDIF ! ( ipconc .lt. 4 )
15178       IF ( ipconc .lt. 5 ) THEN
15181 !      cx(mgs,lh) = 0.0
15182       if ( qx(mgs,lh) .gt. qxmin(lh) )  then
15183 !      cx(mgs,lh) = cno(lh)*xdia(mgs,lh,1)
15184 !      xv(mgs,lh) = Max(xvmn(lh), rho0(mgs)*qx(mgs,lh)/(xdn(mgs,lh)*cx(mgs,lh)) )
15185 !      xdia(mgs,lh,3) = (xv(mgs,lh)*6./pi)**(1./3.) 
15186       end if
15188       ENDIF ! ( ipconc .lt. 5 )
15190       end do
15191       end if
15192       
15193       IF ( ipconc .ge. 2 ) THEN
15194       DO mgs = 1,ngscnt
15195         
15196         rb(mgs) = 0.5*xdia(mgs,lc,1)*(1./(1.+alpha(mgs,lc)))**(1./6.)
15197         xl2p(mgs) = Max(0.0d0, 2.7e-2*xdn(mgs,lc)*cx(mgs,lc)*xv(mgs,lc)*   &
15198      &           ((0.5e20*rb(mgs)**3*xdia(mgs,lc,1))-0.4) )
15199         IF ( rb(mgs) .gt. 3.51e-6 ) THEN
15200 !          rh(mgs) = Max( 0.5d0*xdia(mgs,lc,1), 6.3d-4/(1.d6*(rb(mgs) - 3.5d-6)) )
15201           rh(mgs) = Max( 41.d-6, 6.3d-4/(1.d6*(rb(mgs) - 3.5d-6)) )
15202         ELSE
15203           rh(mgs) = 41.d-6
15204         ENDIF
15205         IF ( xl2p(mgs) .gt. 0.0 ) THEN
15206           nh(mgs) = 4.2d9*xl2p(mgs)
15207         ELSE
15208           nh(mgs) = 1.e30
15209         ENDIF
15210       ENDDO
15211       ENDIF
15212       
15215 !              
15217 !  maximum depletion tendency by any one source
15220       if( ndebug .ge. 0 ) THEN
15221 !mpi!        write(0,*) 'Set depletion max/min1'
15222       endif
15223       do mgs = 1,ngscnt
15224       qvimxd(mgs) = 0.70*(qx(mgs,lv)-qis(mgs))*dtpinv ! depletion by all vap. dep to ice.
15225       
15226       IF ( qx(mgs,lc) < qxmin(lc) ) qvimxd(mgs) = 0.99*(qx(mgs,lv)-qis(mgs))*dtpinv ! this makes virtually no difference whatsoever, but what the heck
15227       
15228       qvimxd(mgs) = max(qvimxd(mgs), 0.0)
15230       frac = 0.1d0
15231       qimxd(mgs)  = frac*qx(mgs,li)*dtpinv
15232       qcmxd(mgs)  = frac*qx(mgs,lc)*dtpinv
15233       qrmxd(mgs)  = frac*qx(mgs,lr)*dtpinv
15234       qsmxd(mgs)  = frac*qx(mgs,ls)*dtpinv
15235       qhmxd(mgs)  = frac*qx(mgs,lh)*dtpinv
15236       IF ( lhl > 1 ) qhlmxd(mgs)  = frac*qx(mgs,lhl)*dtpinv
15237       end do
15239       if( ndebug .ge. 0 ) THEN
15240 !mpi!        write(0,*) 'Set depletion max/min2'
15241       endif
15243       do mgs = 1,ngscnt
15245       if ( qx(mgs,lc) .le. qxmin(lc) ) then
15246       ccmxd(mgs)  = 0.20*cx(mgs,lc)*dtpinv
15247       else
15248       IF ( ipconc .ge. 2 ) THEN
15249         ccmxd(mgs)  = frac*cx(mgs,lc)*dtpinv
15250       ELSE
15251         ccmxd(mgs)  = frac*qx(mgs,lc)/(xmas(mgs,lc)*rho0(mgs)*dtp)
15252       ENDIF
15253       end if
15255       if ( qx(mgs,li) .le. qxmin(li) ) then
15256       cimxd(mgs)  = frac*cx(mgs,li)*dtpinv
15257       else
15258       IF ( ipconc .ge. 1 ) THEN
15259         cimxd(mgs)  = frac*cx(mgs,li)*dtpinv
15260       ELSE
15261         cimxd(mgs)  = frac*qx(mgs,li)/(xmas(mgs,li)*rho0(mgs)*dtp)
15262       ENDIF
15263       end if
15266       crmxd(mgs)  = 0.10*cx(mgs,lr)*dtpinv
15267       csmxd(mgs)  = frac*cx(mgs,ls)*dtpinv
15268       chmxd(mgs)  = frac*cx(mgs,lh)*dtpinv
15270       ccmxd(mgs)  = frac*cx(mgs,lc)*dtpinv
15271       cimxd(mgs)  = frac*cx(mgs,li)*dtpinv
15272       crmxd(mgs)  = frac*cx(mgs,lr)*dtpinv
15273       csmxd(mgs)  = frac*cx(mgs,ls)*dtpinv
15274       chmxd(mgs)  = frac*cx(mgs,lh)*dtpinv
15276       qxmxd(mgs,lv) = Max(0.0, 0.1*(qx(mgs,lv) - qvs(mgs))*dtpinv)
15278       DO il = lc,lhab
15279        qxmxd(mgs,il) = frac*qx(mgs,il)*dtpinv
15280        cxmxd(mgs,il) = frac*cx(mgs,il)*dtpinv
15281       ENDDO
15283       end do
15288       IF ( ipconc >= 6 ) THEN
15289       frac = 0.4d0
15290       zxmxd(:,:) = 0.0
15291       DO il = lr,lhab
15292        IF ( lz(il) > 0 .or. ( il == lr ) ) THEN
15293          DO mgs = 1,ngscnt
15294            zxmxd(mgs,il) = frac*zx(mgs,il)*dtpinv
15295          ENDDO
15296        ENDIF
15297       ENDDO
15298       ENDIF
15303     ! default factors between mean volume and maximum mass volume
15304       maxmassfac(lc) = ( (2. + 3.*(1. + xnu(lc)) )**3/( 3.*(1. + xnu(lc)) ) )
15305       maxmassfac(li) = ( (2. + 3.*(1. + xnu(li)) )**3/( 3.*(1. + xnu(li)) ) )
15307       IF ( imurain == 3 ) THEN
15308         maxmassfac(lr) = ( (2. + 3.*(1. + xnu(lr)) )**3/( 3.*(1. + xnu(lr)) ) )
15309       ELSE
15310         maxmassfac(lr) =  (3.0 + alphar)**3/    &
15311      &                  ((3.+alphar)*(2.+alphar)*(1. + alphar) )
15312       ENDIF
15314       IF ( imusnow == 3 ) THEN
15315         maxmassfac(ls) = ( (2. + 3.*(1. + alphas) )**3/( 3.*(1. + alphas) ) )
15316       ELSE
15317         maxmassfac(ls) =  (3.0 + alphas)**3/    &
15318      &                  ((3.+alphas)*(2.+alphas)*(1. + alphas) )
15319       ENDIF
15320       
15321         maxmassfac(lh) =  (3.0 + alphah)**3/    &
15322      &                  ((3.+alphah)*(2.+alphah)*(1. + alphah) )
15324        IF ( lhl > 1 ) THEN
15325         maxmassfac(lhl) =  (3.0 + alphahl)**3/    &
15326      &                  ((3.+alphahl)*(2.+alphahl)*(1. + alphahl) )
15327        ENDIF
15328       
15331        DO mgs = 1,ngscnt
15332           DO il = lh,lhab ! graupel and hail only (and frozen drops)
15333             
15334             vshdgs(mgs,il) = vshd ! base value
15335             
15336             IF ( qx(mgs,il) > qxmin(il) .and. ivshdgs > 0 ) THEN
15337               
15338               ! tmpdiam is weighted diameter of d^(shedalp-1), so for shedalp=3, this is the area-weighted diameter or maximum mass diameter.
15339               tmpdiam = (shedalp+alpha(mgs,il))*xdia(mgs,il,1) ! *( xdn(mgs,il)/917. )**(1./3.) ! erm added density factor for equiv. solid ice sphere 10.12.2015
15340               
15341               IF ( tmpdiam > sheddiam0 ) THEN
15342                 vshdgs(mgs,il) = 0.523599*(1.5e-3)**3/massfacshr ! 1.5mm drops from very large ice
15343               ELSEIF ( tmpdiam > sheddiam ) THEN ! intermediate size
15344                 vshdgs(mgs,il) = 0.523599*(3.0e-3)**3/massfacshr ! 3.0mm drops from medium-large ice
15345               ELSE
15346 !                vshdgs(mgs,il) = Min( xvmx(lr), xv(mgs,il)*xdn(mgs,il)*0.001 ) ! size of drop from melted mean ice particle
15347                 vshdgs(mgs,il) = Min( xvmx(lr), 6./pi*xdn(mgs,il)*0.001*tmpdiam**3 )/massfacshr ! size of drop from melted mean ice particle; 0.001 is 1/rhow
15348               ENDIF
15349             ENDIF
15350           ENDDO
15351        ENDDO
15355 !  microphysics source terms (1/s) for mixing ratios 
15359 !  Collection efficiencies:
15361       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: Set collection efficiencies'
15363       do mgs = 1,ngscnt
15367       qcwresv(mgs) = 0.0
15368       ccwresv(mgs) = 0.0
15369       
15370       erw(mgs) = 0.0
15371       esw(mgs) = 0.0
15372       ehw(mgs) = 0.0
15373       efw(mgs) = 0.0
15374       ehlw(mgs) = 0.0
15375 !      ehxw(mgs) = 0.0
15377       err(mgs) = 0.0
15378       esr(mgs) = 0.0
15379       il2(mgs) = 0
15380       il3(mgs) = 0
15381       ehr(mgs) = 0.0
15382       ehlr(mgs) = 0.0
15383 !      ehxr(mgs) = 0.0
15385       eri(mgs) = 0.0
15386       esi(mgs) = 0.0
15387       ehi(mgs) = 0.0 ! used as sticking efficiency, so collection efficiency is ehi*ehiclsn
15388       ehis(mgs) = 0.0 ! used as sticking efficiency, so collection efficiency is ehi*ehiclsn
15389       ehli(mgs) = 0.0 ! used as sticking efficiency, so collection efficiency is ehli*ehliclsn
15390       ehlis(mgs) = 0.0 ! used as sticking efficiency, so collection efficiency is ehli*ehliclsn
15391 !      ehxi(mgs) = 0.0
15393       ers(mgs) = 0.0
15394       ess(mgs) = 0.0
15395       ehs(mgs) = 0.0 ! used as sticking efficiency, so collection efficiency is ehs*ehsclsn
15396       ehsfac(mgs) = 1.0 ! factor based on ice saturation
15397       ehls(mgs) = 0.0 ! used as sticking efficiency, so collection efficiency is ehls*ehlsclsn
15398       ehscnv(mgs) = 0.0
15399 !      ehxs(mgs) = 0.0
15401       eiw(mgs) = 0.0
15402       eii(mgs) = 0.0
15403       ehsclsn(mgs) = 0.0
15404       ehiclsn(mgs) = 0.0
15405       ehlsclsn(mgs) = 0.0
15406       ehliclsn(mgs) = 0.0
15407       esiclsn(mgs) = 0.0
15410 ! reserve droplets
15411          IF ( exwmindiam > 0 .and. qx(mgs,lc) > qxmin(lc) ) THEN
15412            tmp = cx(mgs,lc)*Exp(- (exwmindiam/xdia(mgs,lc,1))**3 )
15413            ccwresv(mgs) =  Min( cx(mgs,lc), Max( 2.e6,  cx(mgs,lc) -  tmp ) )
15414            
15415            tmp = cx(mgs,lc) - ccwresv(mgs)
15417            volt = pi/6.*(exwmindiam)**3
15418            qcwresv(mgs) = qx(mgs,lc) - tmp*xdn0(lc)*rhoinv(mgs)*(volt + xv(mgs,lc))
15419            
15420            
15421            IF ( .false. .and. qx(mgs,lc) > 0.1e-3 ) THEN
15422            
15423              write(0,*) 'cx,qx,crsv,qrsv = ',cx(mgs,lc),qx(mgs,lc),ccwresv(mgs),qcwresv(mgs)
15424            
15425            ENDIF
15427          ENDIF
15430       icwr(mgs) = 1
15431       IF ( qx(mgs,lc) .gt. qxmin(lc) ) THEN
15432        cwrad = 0.5*xdia(mgs,lc,1)
15433       DO il = 1,8
15434          IF ( cwrad .ge. 1.e-6*cwr(il,1) ) icwr(mgs) = il
15435       ENDDO
15436       ENDIF
15439       irwr(mgs) = 1
15440       IF ( qx(mgs,lr) .gt. qxmin(lr) ) THEN
15441          rwrad = 0.5*xdia(mgs,lr,3)  ! changed to mean volume diameter (10/6/06)
15442       DO il = 1,6
15443          IF ( rwrad .ge. 1.e-6*grad(il,1) ) irwr(mgs) = il
15444       ENDDO
15445       ENDIF
15448       igwr(mgs) = 1
15449 !      IF ( qx(mgs,lr) .gt. qxmin(lr) ) THEN
15450 !         rwrad = 0.5*xdia(mgs,lr,1)
15451 ! setting erw = 1 always, so now use igwr for graupel
15452       IF ( qx(mgs,lh) .gt. qxmin(lh) ) THEN
15453          rwrad = 0.5*xdia(mgs,lh,3)  ! changed to mean volume diameter (10/6/06)
15454       DO il = 1,6
15455          IF ( rwrad .ge. 1.e-6*grad(il,1) ) igwr(mgs) = il
15456       ENDDO
15457       ENDIF
15460       IF ( lhl .gt. 1 ) THEN ! hail is turned on
15461       ihlr(mgs) = 1
15462       IF ( qx(mgs,lhl) .gt. qxmin(lhl) ) THEN
15463          rwrad = 0.5*xdia(mgs,lhl,3)  ! changed to mean volume diameter (10/6/06)
15464       DO il = 1,6
15465          IF ( rwrad .ge. 1.e-6*grad(il,1) ) ihlr(mgs) = il
15466       ENDDO
15467       ENDIF
15468       ENDIF
15472 !  Ice-Ice: Collection (cxc) efficiencies
15475       if ( qx(mgs,li) .gt. qxmin(li) ) then
15476 !      IF ( ipconc .ge. 14 ) THEN
15477 !       eii(mgs)=0.1*exp(0.1*temcg(mgs))
15478 !       if ( temg(mgs) .lt. 243.15 .and. qx(mgs,lc) .gt. 1.e-6 ) then
15479 !        eii(mgs)=0.1
15480 !       end if
15481 !      
15482 !      ELSE
15483         eii(mgs) = exp(0.025*Min(temcg(mgs),0.0))  ! alpha1 from LFO83 (21)
15484 !      ENDIF
15485       if ( temg(mgs) .gt. 273.15 ) eii(mgs) = 1.0
15486       end if
15490 !  Ice-cloud water: Collection (cxc) efficiencies
15493       eiw(mgs) = 0.0
15494       if ( qx(mgs,li).gt.qxmin(li) .and. qx(mgs,lc).gt.qxmin(lc) ) then
15495       
15496       
15497       if (xdia(mgs,lc,1).gt.ewi_dcmin .and. xdia(mgs,li,1).gt.ewi_dimin) then
15498 ! erm 5/10/2007 test following change:
15499 !      if (xdia(mgs,lc,1).gt.12.0e-06 .and. xdia(mgs,li,1).gt.50.0e-06) then
15500       eiw(mgs) = 0.5
15501       end if
15502       if ( temg(mgs) .ge. 273.15 ) eiw(mgs) = 0.0
15503       end if
15508 !  Rain: Collection (cxc) efficiencies
15511       if ( qx(mgs,lr).gt.qxmin(lr) .and. qx(mgs,lc).gt.qxmin(lc) ) then
15513        IF ( lnr .gt. 1 ) THEN
15514        erw(mgs) = 1.0
15516        ELSE
15518 !      cwrad = 0.5*xdia(mgs,lc,1)
15519 !      erw(mgs) =
15520 !     >  min((aradcw + cwrad*(bradcw + cwrad*
15521 !     <  (cradcw + cwrad*(dradcw)))), 1.0)
15522 !       IF ( xdia(mgs,lc,1) .lt. 2.4e-06 .or. xdia(mgs,lr,1) .le. 50.0e-6 ) THEN
15523 !          erw(mgs)=0.0
15524 !       ENDIF
15525 !       erw(mgs) = ew(icwr(mgs),igwr(mgs))
15526 ! interpolate along droplet radius
15527        ic = icwr(mgs)
15528        icp1 = Min( 8, ic+1 )
15529        ir = irwr(mgs)
15530        irp1 = Min( 6, ir+1 )
15531        cwrad = 0.5*xdia(mgs,lc,3)
15532        rwrad = 0.5*xdia(mgs,lr,3)
15533        
15534        slope1 = (ew(icp1, ir  ) - ew(ic,ir  ))*cwr(ic,2)
15535        slope2 = (ew(icp1, irp1) - ew(ic,irp1))*cwr(ic,2)
15537 !       write(iunit,*) 'slop1: ',slope1,slope2,ew(ic,ir),cwr(ic,2)
15539        x1 = ew(ic,  ir) + slope1*Max(0.0, (cwrad - cwr(ic,1)) )
15540        x2 = ew(icp1,ir) + slope2*Max(0.0, (cwrad - cwr(ic,1)) )
15542        slope1 = (x2 - x1)*grad(ir,2)
15544        erw(mgs) = Max(0.0, x1 + slope1*Max(0.0, (rwrad - grad(ir,1)) ))
15546 !       write(iunit,*) 'erw: ',erw(mgs),1.e6*cwrad,1.e6*rwrad,ic,ir,x1,x2
15547 !       write(iunit,*)
15549        erw(mgs) = Max(0.0, erw(mgs) )
15550        IF ( rwrad .lt. 50.e-6 ) THEN
15551          erw(mgs) = 0.0
15552        ELSEIF (  rwrad .lt. 100.e-6 ) THEN  ! linear change from zero at 50 to erw at 100 microns
15553          erw(mgs) = erw(mgs)*(rwrad - 50.e-6)/50.e-6
15554        ENDIF
15556        ENDIF
15557       end if
15558       IF ( cx(mgs,lc) .le. 0.0 ) erw(mgs) = 0.0
15560       if ( qx(mgs,lr).gt.qxmin(lr) .and. qx(mgs,lr).gt.qxmin(lr) ) then
15561       err(mgs)=1.0
15562       end if
15564       if ( qx(mgs,lr).gt.qxmin(lr) .and. qx(mgs,ls).gt.qxmin(ls) ) then
15565       ers(mgs)=1.0
15566       end if
15568       if ( qx(mgs,lr).gt.qxmin(lr) .and. qx(mgs,li).gt.qxmin(li) ) then
15569 !        IF ( vtxbar(mgs,lr,1) .gt. vtxbar(mgs,li,1) .and.
15570 !     :       xdia(mgs,lr,3) .gt. 200.e-6 .and. xdia(mgs,li,3) .gt. 100.e-6 ) THEN
15571          eri(mgs) = eri0
15572 !      cwrad = 0.5*xdia(mgs,li,3)
15573 !      eri(mgs) =
15574 !     >  1.0*min((aradcw + cwrad*(bradcw + cwrad*
15575 !     <  (cradcw + cwrad*(dradcw)))), 1.0)
15576 !         ENDIF
15577 !       if ( xdia(mgs,li,1) .lt. 10.e-6 ) eri(mgs)=0.0
15578        if ( xdia(mgs,li,3) .lt. eri_cimin ) eri(mgs)=0.0
15579       end if
15582 !  Snow aggregates: Collection (cxc) efficiencies
15584 ! Modified by ERM with a linear function for small droplets and large
15585 ! snow agg. based numerical data from Wang and Ji (1992) in P&K 1997 (Fig. 14-13), which
15586 ! allows collection of very small droplets, albeit at low efficiency.  But slow
15587 ! fall speeds of snow make up for the efficiency.
15589       esw(mgs) = 0.0
15590       if ( qx(mgs,ls).gt.qxmin(ls) .and. qx(mgs,lc).gt.qxmin(lc) ) then
15591         esw(mgs) = 0.5
15592         if ( xdia(mgs,lc,1) .gt. 15.e-6 .and. xdia(mgs,ls,1) .gt. 100.e-6) then
15593           esw(mgs) = 0.5
15594         ELSEIF ( xdia(mgs,ls,1) .ge. 500.e-6 ) THEN
15595           esw(mgs) = Min(0.5, 0.05 + (0.8-0.05)/(40.e-6)*xdia(mgs,lc,1) )
15596         ENDIF
15597       end if
15599       if ( qx(mgs,ls).gt.qxmin(ls) .and. qx(mgs,lr).gt.qxmin(lr)  &
15600      &     .and. temg(mgs) .lt. tfr - 1.   &
15601      &                               ) then
15602       esr(mgs)=Exp(-(40.e-6)**3/xv(mgs,lr))*Exp(-40.e-6/xdia(mgs,ls,1))
15603       IF ( qx(mgs,ls) < 1.e-4 .and. qx(mgs,lr) < 1.e-4 ) il2(mgs) = 1
15604       end if
15605       
15606       IF ( ipconc < 3 .and. temg(mgs) < tfr .and. qx(mgs,lr).gt.qxmin(lr) .and. qx(mgs,lr) < 1.e-4 ) THEN
15607         il3(mgs) = 1
15608       ENDIF
15610 !      if ( qx(mgs,ls).gt.qxmin(ls) ) then
15611       if ( temcg(mgs) < 0.0 ) then
15612             
15613       IF ( ipconc .lt. 4 .or. temcg(mgs) < esstem1 ) THEN
15614         ess(mgs) = 0.0
15615 !        ess(mgs)=0.1*exp(0.1*min(temcg(mgs),0.0))
15616 !        ess(mgs)=min(0.1,ess(mgs))
15617       
15618       ELSE
15619       
15620         fac = Abs(ess0)
15621         IF ( iessopt == 2 ) THEN ! experimental code
15622 !         IF ( wvel(mgs) > 2.0 .or. wvel(mgs) < -0.5 .or. ssi(mgs) < 1.0 ) THEN
15623          IF ( wvel(mgs) > 2.0 ) THEN
15624           ! assume convective cell or downdraft
15625            fac = 0.0
15626          ELSEIF ( wvel(mgs) > 1.0 ) THEN ! transition to stratiform range of values
15627            fac = Max(0.0, 2.0 - wvel(mgs))*fac
15628          ENDIF
15629         ELSEIF ( iessopt == 3 ) THEN ! factor based on ice supersat
15630            IF ( ssi(mgs) <= 1.0 ) THEN
15631              fac = 0.0
15632              ehsfac(mgs) = 0.0
15633            ELSEIF ( ssi(mgs) <= 1.02 ) THEN
15634              fac = fac*(ssi(mgs) - 1.0)/0.02
15635              ehsfac(mgs) = (ssi(mgs) - 1.0)/0.02
15636            ENDIF
15637         ELSEIF ( iessopt == 4 ) THEN ! factor based on ice supersat; very roughly based on Hosler et al. 1957 (J. Met.)
15638            IF ( ssi(mgs) <= 1.0 ) THEN
15639              fac = 0.1
15640              ehsfac(mgs) = 0.1
15641            ELSEIF ( ssi(mgs) <= 1.005 ) THEN
15642              fac = Max(0.1, fac*(ssi(mgs) - 1.0)/0.005)
15643              ehsfac(mgs) = Max(0.1, (ssi(mgs) - 1.0)/0.005)
15644            ENDIF
15645         ENDIF
15646         
15647         IF ( temcg(mgs) > esstem1 .and. temcg(mgs) < esstem2 ) THEN  ! only nonzero for T > esstem1
15648           ess(mgs) = fac*Exp(ess1*(esstem2) )*(temcg(mgs) - esstem1)/(esstem2 - esstem1) ! linear ramp up from zero at esstem1 to value at esstem2
15649         ELSEIF ( temcg(mgs) >= esstem2 ) THEN
15650           ess(mgs) = fac*Exp(ess1*Min( temcg(mgs), 0.0 ) )
15651         ENDIF
15652         
15653       ENDIF
15654       end if
15656       if ( qx(mgs,ls).gt.qxmin(ls) .and. qx(mgs,li).gt.qxmin(li) ) then
15657        esiclsn(mgs) = esi_collsn
15658 !      IF ( ipconc .lt. 4 ) THEN
15659       IF ( ipconc < 1 .and. lwsm6 ) THEN
15660         esi(mgs) = exp(0.7*min(temcg(mgs),0.0))
15661       ELSE
15662         esi(mgs) = esi0*exp(0.1*min(temcg(mgs),0.0))
15663         esi(mgs) = Min(0.1,esi(mgs))
15664       ENDIF
15665       IF ( ipconc .le. 3 ) THEN
15666        esi(mgs) =  exp(0.025*min(temcg(mgs),0.0)) ! LFO
15667 !       esi(mgs) =  Min(0.5, exp(0.025*min(temcg(mgs),0.0)) ) ! LFO
15668 !       esi(mgs)=0.5*exp(0.1*min(temcg(mgs),0.0))  ! 10ice
15669       ENDIF
15670 !      ELSE ! zrnic/ziegler 1993
15671 !      esi(mgs)= 0.1 ! 0.5*exp(0.1*min(temcg(mgs),0.0))
15672 !      ENDIF
15673       if ( temg(mgs) .gt. 273.15 ) esi(mgs) = 0.0
15674       end if
15679 !  Graupel: Collection (cxc) efficiencies
15682        xmascw(mgs) = xmas(mgs,lc)
15683       if ( qx(mgs,lh).gt.qxmin(lh) .and. qx(mgs,lc).gt.qxmin(lc) ) then !{
15684        ehw(mgs) = 1.0
15685        IF ( iehw .eq. 0 ) THEN
15686        ehw(mgs) = ehw0  ! default value is 1.0
15687        ELSEIF ( iehw .eq. 1 .or. iehw .eq. 10 ) THEN
15688       cwrad = 0.5*xdia(mgs,lc,1)
15689       ehw(mgs) = Min( ehw0,    &
15690      &  ewfac*min((aradcw + cwrad*(bradcw + cwrad*   &
15691      &  (cradcw + cwrad*(dradcw)))), 1.0) )
15692       
15693        ELSEIF ( iehw .eq. 2 .or. iehw .eq. 10 ) THEN
15694        ic = icwr(mgs)
15695        icp1 = Min( 8, ic+1 )
15696        ir = igwr(mgs)
15697        irp1 = Min( 6, ir+1 )
15698        cwrad = 0.5*xdia(mgs,lc,1)
15699        rwrad = 0.5*xdia(mgs,lh,3)  ! changed to mean volume diameter
15700        
15701        slope1 = (ew(icp1, ir  ) - ew(ic,ir  ))*cwr(ic,2)
15702        slope2 = (ew(icp1, irp1) - ew(ic,irp1))*cwr(ic,2)
15704 !        write(iunit,*) 'slop1: ',slope1,slope2,ew(ic,ir),cwr(ic,2)
15706        x1 = ew(ic,  ir) + slope1*Max(0.0, (cwrad - cwr(ic,1)) )
15707        x2 = ew(icp1,ir) + slope2*Max(0.0, (cwrad - cwr(ic,1)) )
15708        
15709        slope1 = (x2 - x1)*grad(ir,2)
15710        
15711        tmp = Max( 0.0, Min( 1.0, x1 + slope1*Max(0.0, (rwrad - grad(ir,1)) ) ) )
15712        ehw(mgs) = Min( ehw(mgs), tmp )
15714 !       write(iunit,*) 'ehw: ',ehw(mgs),1.e6*cwrad,1.e6*rwrad,ic,ir,x1,x2
15715 !       write(iunit,*)
15717 !       ehw(mgs) = Max( 0.2, ehw(mgs) )
15718 !  assume that ehw = 1 for zero air resistance (rho0 = 0.0) and extrapolate toward that
15719 !      ehw(mgs) = ehw(mgs) + (ehw(mgs) - 1.0)*(rho0(mgs) - rho00)/rho00
15720 !      ehw(mgs) = ehw(mgs) + (1.0 - ehw(mgs))*((Max(0.0,rho00 - rho0(mgs)))/rho00)**2
15722        ELSEIF ( iehw .eq. 3 .or. iehw .eq. 10 ) THEN ! use fraction of droplets greater than dmincw diameter
15723          tmp = Exp(- (dmincw/xdia(mgs,lc,1))**3)
15724          xmascw(mgs) = xmas(mgs,lc) + xdn0(lc)*(pi*dmincw**3/6.0) ! this is the average mass of the droplets with d > dmincw
15725          ehw(mgs) = Min( ehw(mgs), tmp )
15726        ELSEIF ( iehw .eq. 4 .or. iehw .eq. 10 ) THEN ! Cober and List 1993, eq. 19-20
15727          tmp =  &
15728      &   2.0*xdn(mgs,lc)*vtxbar(mgs,lh,1)*(0.5*xdia(mgs,lc,1))**2 &
15729      &  /(9.0*fadvisc(mgs)*0.5*xdia(mgs,lh,3))
15730          tmp = Max( 1.5, Min(10.0, tmp) )
15731          ehw(mgs) = Min( ehw(mgs), 0.55*Log10(2.51*tmp) )
15732        ENDIF
15733       if ( xdia(mgs,lc,1) .lt. 2.4e-06 ) ehw(mgs)=0.0
15735        ehw(mgs) = Min( ehw0, ehw(mgs) )
15736        
15737        IF ( ibfc == -1 .and. temcg(mgs) < -41.0 ) THEN
15738         ehw(mgs) = 0.0
15739        ENDIF 
15741       end if !}
15743       if ( qx(mgs,lh).gt.qxmin(lh) .and. qx(mgs,lr).gt.qxmin(lr)    &
15744 !     &     .and. temg(mgs) .lt. tfr    &
15745      &                               ) then
15746 !      ehr(mgs) = Exp(-(40.e-6)**3/xv(mgs,lr))*Exp(-40.e-6/xdia(mgs,lh,1))
15747 !      ehr(mgs) = 1.0
15748        ehr(mgs) = Exp(-(40.e-6)/xdia(mgs,lr,3))*Exp(-40.e-6/xdia(mgs,lh,3))
15749        ehr(mgs) = Min( ehr0, ehr(mgs) )
15750       end if
15752       IF ( qx(mgs,ls).gt.qxmin(ls) ) THEN
15753         IF ( ipconc .ge. 4 ) THEN
15754         ehscnv(mgs) = ehs0*exp(ehs1*min(temcg(mgs),0.0)) ! for 2-moment, used as default for ehs and ehls. Otherwise not used for snow->graupel conversion
15755         ELSE
15756         ehscnv(mgs) = exp(0.09*min(temcg(mgs),0.0))
15757         ENDIF
15758         
15759         IF ( qx(mgs,lh).gt.qxmin(lh) .and. qx(mgs,lc) >= qxmin(lc)  ) THEN
15760 !          ehsclsn(mgs) = ehs_collsn
15761 !          ehs(mgs) = ehscnv(mgs)*ehsfac(mgs)*Min(1.0, Max(0.0,xdn(mgs,lh) - 300.)/300.  )
15762 !        ELSEIF ( qx(mgs,lh).gt.qxmin(lh) .and. qx(mgs,lc) >= qxmin(lc)  ) then
15763           ehsclsn(mgs) = ehs_collsn
15764           IF ( xdia(mgs,ls,3) < 40.e-6 ) THEN
15765             ehsclsn(mgs) = 0.0
15766           ELSEIF ( xdia(mgs,ls,3) < 150.e-6 ) THEN
15767             ehsclsn(mgs) =  ehs_collsn*(xdia(mgs,ls,3) - 40.e-6)/(150.e-6 - 40.e-6)
15768           ELSE
15769             ehsclsn(mgs) = ehs_collsn
15770           ENDIF
15771 !          ehs(mgs) = ehscnv(mgs)*Min(1.0, Max(0., xdn(mgs,lh) - xdnmn(lh)*1.2)/xdnmn(lh)  ) ! shut off qhacs as graupel goes to lowest density
15772           ehs(mgs) = ehscnv(mgs)*Min(1.0, Max(0.0,xdn(mgs,lh) - 300.)/300.  ) ! shut off qhacs as graupel goes to low density; limits scavenging of snow in bright band
15773 !          ehs(mgs) = ehscnv(mgs) ! *Min(1.0, Max(0.0,xdn(mgs,lh) - 300.)/300.  ) ! shut off qhacs as graupel goes to low density
15774           ehs(mgs) = Min(ehs(mgs),ehsmax)
15775         end if
15776       ENDIF
15778       if ( qx(mgs,lh).gt.qxmin(lh) .and. qx(mgs,li).gt.qxmin(li) ) then
15779       ehiclsn(mgs) = ehi_collsn
15780       ehi(mgs)=eii0*exp(eii1*min(temcg(mgs),0.0))
15781       ehi(mgs) = Min( ehimax, Max( ehi(mgs), ehimin ) )
15782 !      if ( temg(mgs) .gt. 273.15 .or. ( qx(mgs,lc) < qxmin(lc)) ) ehi(mgs) = 0.0
15783       end if
15785       IF ( lis > 1 ) THEN
15786       if ( qx(mgs,lh).gt.qxmin(lh) .and. qx(mgs,lis).gt.qxmin(lis) ) then
15787       ehisclsn(mgs) = ehi_collsn
15788       ehis(mgs)=eii0*exp(eii1*min(temcg(mgs),0.0))
15789       ehis(mgs) = Min( ehimax, Max( ehis(mgs), ehimin ) )
15790 !      if ( temg(mgs) .gt. 273.15 .or. ( qx(mgs,lc) < qxmin(lc)) ) ehis(mgs) = 0.0
15791       end if
15792       ENDIF
15797 !  Hail: Collection (cxc) efficiencies
15800       IF ( lhl .gt. 1 ) THEN
15802       if ( qx(mgs,lhl).gt.qxmin(lhl) .and. qx(mgs,lc).gt.qxmin(lc) ) then
15803        IF ( iehw == 3 ) iehlw = 3
15804        IF ( iehw == 4 ) iehlw = 4
15805        ehlw(mgs) = ehlw0
15806        IF ( iehlw .eq. 0 ) THEN
15807        ehlw(mgs) = ehlw0  ! default value is 1.0
15808        ELSEIF ( iehlw .eq. 1 .or. iehlw .eq. 10 ) THEN
15809       cwrad = 0.5*xdia(mgs,lc,1)
15810       ehlw(mgs) = Min( ehlw0,    &
15811      &  ewfac*min((aradcw + cwrad*(bradcw + cwrad*   &
15812      &  (cradcw + cwrad*(dradcw)))), 1.0) )
15813       
15814        ELSEIF ( iehlw .eq. 2 .or. iehlw .eq. 10 ) THEN
15815        ic = icwr(mgs)
15816        icp1 = Min( 8, ic+1 )
15817        ir = ihlr(mgs)
15818        irp1 = Min( 6, ir+1 )
15819        cwrad = 0.5*xdia(mgs,lc,1)
15820        rwrad = 0.5*xdia(mgs,lhl,3)  ! changed to mean volume diameter
15821        
15822        slope1 = (ew(icp1, ir  ) - ew(ic,ir  ))*cwr(ic,2)
15823        slope2 = (ew(icp1, irp1) - ew(ic,irp1))*cwr(ic,2)
15824        
15825        x1 = ew(ic,  ir) + slope1*(cwrad - cwr(ic,1))
15826        x2 = ew(icp1,ir) + slope2*(cwrad - cwr(ic,1))
15827        
15828        slope1 = (x2 - x1)*grad(ir,2)
15829        
15830        tmp = Max( 0.0, Min( 1.0, x1 + slope1*(rwrad - grad(ir,1)) ) )
15831          ehlw(mgs) = Min( ehlw(mgs), tmp )
15832        ehlw(mgs) = Min( ehlw0, ehlw(mgs) )
15833 !       ehw(mgs) = Max( 0.2, ehw(mgs) )
15834 !  assume that ehw = 1 for zero air resistance (rho0 = 0.0) and extrapolate toward that
15835 !      ehw(mgs) = ehw(mgs) + (ehw(mgs) - 1.0)*(rho0(mgs) - rho00)/rho00
15836 !      ehlw(mgs) = ehlw(mgs) + (1.0 - ehlw(mgs))*((Max(0.0,rho00 - rho0(mgs)))/rho00)**2
15838        ELSEIF ( iehlw .eq. 3 .or. iehlw .eq. 10 ) THEN ! use fraction of droplets greater than 15 micron diameter
15839          tmp = Exp(- (dmincw/xdia(mgs,lc,1))**3)
15840          ehlw(mgs) = Min( ehlw(mgs), tmp )
15841        ELSEIF ( iehlw .eq. 4 .or. iehlw .eq. 10 ) THEN ! Cober and List 1993
15842          tmp =  &
15843      &   2.0*xdn(mgs,lc)*vtxbar(mgs,lhl,1)*(0.5*xdia(mgs,lc,1))**2 &
15844      &  /(9.0*fadvisc(mgs)*0.5*xdia(mgs,lhl,3))
15845          tmp = Max( 1.5, Min(10.0, tmp) )
15846          ehlw(mgs) = Min( ehlw(mgs), 0.55*Log10(2.51*tmp) )
15847        ENDIF
15848       if ( xdia(mgs,lc,1) .lt. 2.4e-06 ) ehlw(mgs)=0.0
15849        ehlw(mgs) = Min( ehlw0, ehlw(mgs) )
15851        IF ( ibfc == -1 .and. temcg(mgs) < -41.0 ) THEN 
15852         ehlw(mgs) = 0.0
15853        ENDIF 
15855       end if
15857       if ( qx(mgs,lhl).gt.qxmin(lhl) .and. qx(mgs,lr).gt.qxmin(lr)    &
15858 !     &     .and. temg(mgs) .lt. tfr    &
15859      &                               ) then
15860         ehlr(mgs) = 1.0
15861        ehlr(mgs) = Min( ehlr0, ehlr(mgs) )
15862       end if
15864       IF ( qx(mgs,ls).gt.qxmin(ls) ) THEN
15865         if ( qx(mgs,lhl).gt.qxmin(lhl)  ) then
15866           ehlsclsn(mgs) = ehls_collsn
15867           ehls(mgs) = ehscnv(mgs)
15868           ehls(mgs) = Min(ehls(mgs),ehsmax)
15869         end if
15870       ENDIF
15872       if ( qx(mgs,lhl).gt.qxmin(lhl) .and. qx(mgs,li).gt.qxmin(li) ) then
15873       ehliclsn(mgs) = ehli_collsn
15874       ehli(mgs)=eii0hl*exp(eii1hl*min(temcg(mgs),0.0))
15875       ehli(mgs) = Min( ehimax, Max( ehli(mgs), ehimin ) )
15876       if ( temg(mgs) .gt. 273.15 .or. ( qx(mgs,lc) < qxmin(lc)) ) ehli(mgs) = 0.0
15877       end if
15879       IF ( lis > 1 ) THEN
15880       if ( qx(mgs,lhl).gt.qxmin(lhl) .and. qx(mgs,lis).gt.qxmin(lis) ) then
15881       ehlisclsn(mgs) = ehli_collsn
15882       ehlis(mgs)=eii0*exp(eii1*min(temcg(mgs),0.0))
15883       ehlis(mgs) = Min( ehimax, Max( ehlis(mgs), ehimin ) )
15884       if ( temg(mgs) .gt. 273.15 .or. ( qx(mgs,lc) < qxmin(lc)) ) ehlis(mgs) = 0.0
15885       end if
15886       ENDIF
15889       ENDIF ! lhl .gt. 1
15891       ENDDO  ! mgs loop for collection efficiencies
15896 !  Set flags for plates vs. columns
15899       do mgs = 1,ngscnt
15901       xplate(mgs) = 0.0
15902       xcolmn(mgs) = 1.0
15904 !      if ( temcg(mgs) .lt. 0. .and. temcg(mgs) .ge. -4. ) then
15905 !      xplate(mgs) = 1.0
15906 !      xcolmn(mgs) = 0.0
15907 !      end if
15909 !      if ( temcg(mgs) .lt. -4. .and. temcg(mgs) .ge. -9. ) then
15910 !      xplate(mgs) = 0.0
15911 !      xcolmn(mgs) = 1.0
15912 !      end if
15914 !      if ( temcg(mgs) .lt. -9. .and. temcg(mgs) .ge. -22.5 ) then
15915 !      xplate(mgs) = 1.0
15916 !      xcolmn(mgs) = 0.0
15917 !      end if
15919 !      if ( temcg(mgs) .lt. -22.5 .and. temcg(mgs) .ge. -90. ) then
15920 !      xplate(mgs) = 0.0
15921 !      xcolmn(mgs) = 1.0
15922 !      end if
15924       end do
15925       
15926       
15931 !  Collection growth equations....
15934       if (ndebug .gt. 0 ) write(0,*) 'Collection: rain collects xxxxx'
15936       do mgs = 1,ngscnt
15937       qracw(mgs) =  0.0
15938       IF ( qx(mgs,lr) .gt. qxmin(lr) .and. erw(mgs) .gt. 0.0 ) THEN
15939       IF ( ipconc .lt. 3 ) THEN
15940        IF ( erw(mgs) .gt. 0.0 .and. qx(mgs,lr) .gt. 1.e-7 ) THEN
15941        vt = (ar*(xdia(mgs,lc,1)**br))*rhovt(mgs)
15942        qracw(mgs) =    &
15943      &   (0.25)*pi*erw(mgs)*(qx(mgs,lc)-qcwresv(mgs))*cx(mgs,lr) &
15944 !     >  *abs(vtxbar(mgs,lr,1)-vtxbar(mgs,lc,1))   &
15945      &  *Max(0.0, vtxbar(mgs,lr,1)-vt)   &
15946      &  *(  gf3*xdia(mgs,lr,2)    &
15947      &    + 2.0*gf2*xdia(mgs,lr,1)*xdia(mgs,lc,1)    &
15948      &    + gf1*xdia(mgs,lc,2) )
15949 !       qracw(mgs) = 0.0
15950 !      write(iunit,*) 'qracw,cx =',qracw(mgs),1.e6*xdia(mgs,lr,1),erw(mgs)
15951 !      write(iunit,*) 'qracw,cx =',qracw(mgs),cx(mgs,lc),kgs(mgs),cx(mgs,lr),1.e6*xdia(mgs,lr,1),vtxbar(mgs,lr,1),vt
15952 !      write(iunit,*) 'vtr: ',vtxbar(mgs,lr,1), ar*gf4br/6.0*xdia(mgs,lr,1)**br, rhovt(mgs),
15953 !     :         ar*gf4br/6.0*xdia(mgs,lr,1)**br * rhovt(mgs)
15954        ENDIF
15955       ELSE
15957       IF ( dmrauto <= 0 .or.  rho0(mgs)*qx(mgs,lr) > 1.2*xl2p(mgs) ) THEN 
15958        rwrad = 0.5*xdia(mgs,lr,3)
15959         IF ( rwrad .gt. rh(mgs) ) THEN ! .or. cx(mgs,lr) .gt. nh(mgs) ) THEN
15960          IF ( rwrad .gt. rwradmn ) THEN
15961 !      DM1CCC=A2*XNC*XNR*XVC*(((CNU+2.)/(CNU+1.))*XVC+XVR)       ! (A12)
15962 !     NOTE: Result is independent of imurain, assumes mucloud = 3
15963            qracw(mgs) = erw(mgs)*aa2*cx(mgs,lr)*cx(mgs,lc)*xmas(mgs,lc)*   &
15964      &        ((alpha(mgs,lc) + 2.)*xv(mgs,lc)/(alpha(mgs,lc) + 1.) + xv(mgs,lr))/rho0(mgs) !*rhoinv(mgs)
15965          ELSE
15967           IF ( imurain == 3 ) THEN
15969 !      DM1CCC=A1*XNC*XNR*(((CNU+3.)*(CNU+2.)/(CNU+1.)**2)*XVC**3+ ! (A14)
15970 !     1 ((RNU+2.)/(RNU+1.))*XVC*XVR**2)
15972 !           qracw(mgs) = aa1*cx(mgs,lr)*cx(mgs,lc)*xdn(mgs,lc)*   &
15973 !     &        ((cnu + 3.)*(cnu + 2.)*xv(mgs,lc)**3/(cnu + 1.)**2 +    &
15974 !     &         (alpha(mgs,lr) + 2.)*xv(mgs,lc)*xv(mgs,lr)**2/(alpha(mgs,lr) + 1.))/rho0(mgs) !*rhoinv(mgs)
15975 ! save multiplies by converting cx*xdn*xv/rho0 to qx
15976            qracw(mgs) = aa1*cx(mgs,lr)*(qx(mgs,lc)-qcwresv(mgs))*   &
15977      &        ((alpha(mgs,lc) + 3.)*(alpha(mgs,lc) + 2.)*xv(mgs,lc)**2/(alpha(mgs,lc) + 1.)**2 +    &
15978      &         (alpha(mgs,lr) + 2.)*xv(mgs,lr)**2/(alpha(mgs,lr) + 1.)) 
15979            
15980            ELSE ! imurain == 1
15982            qracw(mgs) = aa1*cx(mgs,lr)*(qx(mgs,lc)-qcwresv(mgs))*   &
15983      &        ((alpha(mgs,lc) + 3.)*(alpha(mgs,lc) + 2.)*xv(mgs,lc)**2/(alpha(mgs,lc) + 1.)**2 +    &
15984      &         (alpha(mgs,lr) + 6.)*(alpha(mgs,lr) + 5.)*(alpha(mgs,lr) + 4.)*xv(mgs,lr)**2/ &
15985      &          ((alpha(mgs,lr) + 3.)*(alpha(mgs,lr) + 2.)*(alpha(mgs,lr) + 1.))) 
15986            
15987            ENDIF
15988            
15989          ENDIF
15990         ENDIF
15991         ENDIF
15992        ENDIF
15993 !       qracw(mgs) = Min(qracw(mgs), qx(mgs,lc))
15994        qracw(mgs) = Min(qracw(mgs), qcmxd(mgs))
15995        ENDIF
15996       end do
15998       do mgs = 1,ngscnt
15999       qraci(mgs) = 0.0
16000       craci(mgs) = 0.0
16001       qracs(mgs) = 0.0
16002       IF ( eri(mgs) .gt. 0.0 .and. iacr .ge. 1 .and. xdia(mgs,lr,3) .gt. 2.*rwradmn ) THEN
16003         IF ( ipconc .ge. 3 ) THEN
16005            tmp = eri(mgs)*aa2*cx(mgs,lr)*cx(mgs,li)*   &
16006      &        ((cinu + 2.)*xv(mgs,li)/(cinu + 1.) + xv(mgs,lr))
16008         qraci(mgs) = Min( qxmxd(mgs,li), tmp*xmas(mgs,li)*rhoinv(mgs) )
16009         craci(mgs) = Min( cxmxd(mgs,li), tmp )
16011 !       vt = Sqrt((vtxbar(mgs,lr,1)-vtxbar(mgs,li,1))**2 +
16012 !     :            0.04*vtxbar(mgs,lr,1)*vtxbar(mgs,li,1) )
16014 !          qraci(mgs) = 0.25*pi*eri(mgs)*cx(mgs,lr)*qx(mgs,li)*vt*
16015 !     :         (  da0(lr)*xdia(mgs,lr,3)**2 +
16016 !     :            dab1(lr,li)*xdia(mgs,lr,3)*xdia(mgs,li,3) +
16017 !     :            da1(li)*xdia(mgs,li,3)**2 )
16020 !       vt = Sqrt((vtxbar(mgs,lr,1)-vtxbar(mgs,li,1))**2 +
16021 !     :            0.04*vtxbar(mgs,lr,1)*vtxbar(mgs,li,1) )
16023 !          craci(mgs) = 0.25*pi*eri(mgs)*cx(mgs,lr)*cx(mgs,li)*vt*
16024 !     :         (  da0(lr)*xdia(mgs,lr,3)**2 +
16025 !     :            dab0(lr,li)*xdia(mgs,lr,3)*xdia(mgs,li,3) +
16026 !     :            da0(li)*xdia(mgs,li,3)**2 )
16028 !          qraci(mgs) = Min( qraci(mgs), qxmxd(mgs,li) )
16029 !          craci(mgs) = Min( craci(mgs), cxmxd(mgs,li) )
16031         ELSE
16032           qraci(mgs) =    &
16033      &     min(   &
16034      &     (0.25)*pi*eri(mgs)*qx(mgs,li)*cx(mgs,lr)   &
16035      &    *abs(vtxbar(mgs,lr,1)-vtxbar(mgs,li,1))   &
16036      &    *(  gf3*xdia(mgs,lr,2)    &
16037      &      + 2.0*gf2*xdia(mgs,lr,1)*xdia(mgs,li,1)    &
16038      &      + gf1*xdia(mgs,li,2) )     &
16039      &    , qimxd(mgs))
16040         ENDIF
16041       if ( temg(mgs) .gt. 268.15 ) then
16042       qraci(mgs) = 0.0
16043       end if
16044       ENDIF
16045       end do
16047       IF ( ipconc < 3 ) THEN
16048       do mgs = 1,ngscnt
16049       qracs(mgs) = 0.0
16050       IF ( ers(mgs) .gt. 0.0 .and. ipconc < 3 ) THEN
16051        IF ( lwsm6 .and. ipconc == 0 ) THEN
16052          vt = vt2ave(mgs)
16053        ELSE
16054          vt = vtxbar(mgs,ls,1)
16055        ENDIF
16056       qracs(mgs) =      &
16057      &   min(     &
16058      &   ((0.25)*pi/gf4)*ers(mgs)*qx(mgs,ls)*cx(mgs,lr)     &
16059      &  *abs(vtxbar(mgs,lr,1)-vt)     &
16060      &  *(  gf6*gf1*xdia(mgs,ls,2)     &
16061      &    + 2.0*gf5*gf2*xdia(mgs,ls,1)*xdia(mgs,lr,1)      &
16062      &    + gf4*gf3*xdia(mgs,lr,2) )      &
16063      &  , qsmxd(mgs))
16064       ENDIF
16065       end do
16066       ENDIF
16070       if (ndebug .gt. 0 ) write(0,*) 'Collection: snow collects xxxxx'
16072       do mgs = 1,ngscnt
16073       qsacw(mgs) =  0.0
16074       csacw(mgs) =  0.0
16075       vsacw(mgs) =  0.0
16076       IF ( esw(mgs) .gt. 0.0 ) THEN
16078        IF ( ipconc .ge. 4 ) THEN
16079 !      QSACC=CECS*RVT*A2*XNC*XNS*XVC*ROS*
16080 !     *    (((CNU+2.)/(CNU+1.))*XVC+XVS)/RO
16082 !        tmp = esw(mgs)*rvt*aa2*cx(mgs,ls)*cx(mgs,lc)*
16083 !     :        ((cnu + 2.)*xv(mgs,lc)/(cnu + 1.) + xv(mgs,ls))
16084         tmp = 1.0*rvt*aa2*cx(mgs,ls)*cx(mgs,lc)*   &
16085      &        ((alpha(mgs,lc) + 2.)*xv(mgs,lc)/(alpha(mgs,lc) + 1.) + xv(mgs,ls))
16087         qsacw(mgs) = Min( qxmxd(mgs,lc), tmp*xmas(mgs,lc)*rhoinv(mgs) )
16088         csacw(mgs) = Min( cxmxd(mgs,lc), tmp )
16090           IF ( lvol(ls) .gt. 1 ) THEN
16091              IF ( temg(mgs) .lt. 273.15) THEN
16092              rimdn(mgs,ls) = rimc1*(-((0.5)*(1.e+06)*xdia(mgs,lc,1))   &
16093      &                *((0.60)*vtxbar(mgs,ls,1))   &
16094      &                /(temg(mgs)-273.15))**(rimc2)
16095              rimdn(mgs,ls) = Min( Max( rimc3, rimdn(mgs,ls) ), rimc4 )
16096              ELSE
16097              rimdn(mgs,ls) = 1000.
16098              ENDIF
16100            vsacw(mgs) = rho0(mgs)*qsacw(mgs)/rimdn(mgs,ls)
16102           ENDIF
16105 !        qsacw(mgs) = cecs*aa2*cx(mgs,ls)*cx(mgs,lc)*xmas(mgs,lc)*
16106 !     :        ((alpha(mgs,lc) + 2.)*xv(mgs,lc)/(alpha(mgs,lc) + 1.) + xv(mgs,ls))*rhoinv(mgs)
16107        ELSE
16108 !      qsacw(mgs) =
16109 !     >   min(
16110 !     >   ((0.25)*pi)*esw(mgs)*qx(mgs,lc)*cx(mgs,ls)
16111 !     >  *abs(vtxbar(mgs,ls,1)-vtxbar(mgs,lc,1))
16112 !     >  *(  gf3*xdia(mgs,ls,2)
16113 !     >    + 2.0*gf2*xdia(mgs,ls,1)*xdia(mgs,lc,1)
16114 !     >    + gf1*xdia(mgs,lc,2) )
16115 !     <  , qcmxd(mgs))
16117             vt = abs(vtxbar(mgs,ls,1)-vtxbar(mgs,lc,1))
16119           qsacw(mgs) = 0.25*pi*esw(mgs)*cx(mgs,ls)*qx(mgs,lc)*vt*   &
16120      &         (  da0(ls)*xdia(mgs,ls,3)**2 +     &
16121      &            dab1(ls,lc)*xdia(mgs,ls,3)*xdia(mgs,lc,3) +    &
16122      &            da1lc(mgs)*xdia(mgs,lc,3)**2 )
16123         qsacw(mgs) = Min( qsacw(mgs), qxmxd(mgs,ls) )
16124         csacw(mgs) = rho0(mgs)*qsacw(mgs)/xmas(mgs,lc)
16125        ENDIF
16126       ENDIF
16127       end do
16130       do mgs = 1,ngscnt
16131       qsaci(mgs) = 0.0
16132       csaci(mgs) = 0.0
16133       csaci0(mgs) = 0.0
16134       IF ( ipconc .ge. 4 ) THEN
16135       IF ( esi(mgs) .gt. 0.0 .or. ( ipelec > 0 .and. esiclsn(mgs) > 0.0 )) THEN
16136 !      QSCOI=CEXS*RVT*A2*XNCI*XNS*XVCI*ROS*
16137 !     *  (((CINU+2.)/(CINU+1.))*VCIP+XVS)/RO
16139         tmp = esiclsn(mgs)*rvt*aa2*cx(mgs,ls)*cx(mgs,li)*   &
16140      &        ((cinu + 2.)*xv(mgs,li)/(cinu + 1.) + xv(mgs,ls))
16142         qsaci(mgs) = Min( qxmxd(mgs,li), esi(mgs)*tmp*xmas(mgs,li)*rhoinv(mgs) )
16143         csaci0(mgs) = tmp
16144         csaci(mgs) = Min(cxmxd(mgs,li), esi(mgs)*tmp )
16146 !      qsaci(mgs) =
16147 !     >   min(
16148 !     >   ((0.25)*pi)*esi(mgs)*qx(mgs,li)*cx(mgs,ls)
16149 !     >  *abs(vtxbar(mgs,ls,1)-vtxbar(mgs,li,1))
16150 !     >  *(  gf3*xdia(mgs,ls,2)
16151 !     >    + 2.0*gf2*xdia(mgs,ls,1)*xdia(mgs,li,1)
16152 !     >    + gf1*xdia(mgs,li,2) )
16153 !     <  , qimxd(mgs))
16154       ENDIF
16155       ELSE ! 
16156       IF ( esi(mgs) .gt. 0.0 ) THEN
16157          qsaci(mgs) =    &
16158      &   min(   &
16159      &   ((0.25)*pi)*esi(mgs)*qx(mgs,li)*cx(mgs,ls)   &
16160      &  *abs(vtxbar(mgs,ls,1)-vtxbar(mgs,li,1))   &
16161      &  *(  gf3*xdia(mgs,ls,2)    &
16162      &    + 2.0*gf2*xdia(mgs,ls,1)*xdia(mgs,li,1)    &
16163      &    + gf1*xdia(mgs,li,2) )     &
16164      &  , qimxd(mgs))
16165       ENDIF
16166       ENDIF
16167       end do
16171       do mgs = 1,ngscnt
16172       qsacr(mgs) = 0.0
16173       qsacrs(mgs) = 0.0
16174       csacr(mgs) = 0.0
16175       IF ( esr(mgs) .gt. 0.0 ) THEN
16176       IF ( ipconc .ge. 3 ) THEN
16177 !       vt = Sqrt((vtxbar(mgs,ls,1)-vtxbar(mgs,lr,1))**2 + 
16178 !     :            0.04*vtxbar(mgs,ls,1)*vtxbar(mgs,lr,1) )
16179 !       qsacr(mgs) = esr(mgs)*cx(mgs,ls)*vt*
16180 !     :     qx(mgs,lr)*0.25*pi*
16181 !     :      (3.02787*xdia(mgs,lr,2) + 
16182 !     :       3.30669*xdia(mgs,ls,1)*xdia(mgs,lr,1) + 
16183 !     :       2.*xdia(mgs,ls,2))
16184 !        qsacr(mgs) = Min( qsacr(mgs), qrmxd(mgs) )
16185 !        csacr(mgs) = qsacr(mgs)*cx(mgs,lr)/qx(mgs,lr)
16186 !        csacr(mgs) = min(csacr(mgs),crmxd(mgs))
16187       ELSE
16188        IF ( lwsm6 .and. ipconc == 0 ) THEN
16189          vt = vt2ave(mgs)
16190        ELSE
16191          vt = vtxbar(mgs,ls,1)
16192        ENDIF
16193        
16194        qsacr(mgs) =   &
16195      &   min(   &
16196      &   ((0.25)*pi/gf4)*esr(mgs)*qx(mgs,lr)*cx(mgs,ls)   &
16197      &  *abs(vtxbar(mgs,lr,1)-vt)   &
16198      &  *(  gf6*gf1*xdia(mgs,lr,2)   &
16199      &    + 2.0*gf5*gf2*xdia(mgs,lr,1)*xdia(mgs,ls,1)    &
16200      &    + gf4*gf3*xdia(mgs,ls,2) )    &
16201      &  , qrmxd(mgs))
16202       ENDIF
16203       ENDIF
16204       end do
16209       if (ndebug .gt. 0 ) write(0,*) 'Collection: graupel collects xxxxx'
16211       do mgs = 1,ngscnt
16212       qhacw(mgs) = 0.0
16213       qhacwmlr(mgs) = 0.0
16214       rarx(mgs,lh) = 0.0
16215       vhacw(mgs) = 0.0
16216       vhsoak(mgs) = 0.0
16217       zhacw(mgs) = 0.0
16218       
16219       IF ( .false. ) THEN
16220         vtmax = (gz(igs(mgs),jgs,kgs(mgs))*dtpinv)
16221         vtxbar(mgs,lh,1) = Min( vtmax, vtxbar(mgs,lh,1))
16222         vtxbar(mgs,lh,2) = Min( vtmax, vtxbar(mgs,lh,2))
16223         vtxbar(mgs,lh,3) = Min( vtmax, vtxbar(mgs,lh,3))
16224       ENDIF
16225       IF ( ehw(mgs) .gt. 0.0 ) THEN
16227         IF ( ipconc .ge. 2 ) THEN
16229         IF ( .false. ) THEN  
16230         qhacw(mgs) = (ehw(mgs)*(qx(mgs,lc)-qcwresv(mgs))*cx(mgs,lh)*pi*   &
16231      &    abs(vtxbar(mgs,lh,1)-vtxbar(mgs,lc,1))*   &
16232      &    (2.0*xdia(mgs,lh,1)*(xdia(mgs,lh,1) +    &
16233      &         xdia(mgs,lc,1)*gf73rds) +    &
16234      &      xdia(mgs,lc,2)*gf83rds))/4.     
16235      
16236          ELSE  ! using Seifert coefficients
16237             vt = abs(vtxbar(mgs,lh,1)-vtxbar(mgs,lc,1)) 
16239           qhacw(mgs) = 0.25*pi*ehw(mgs)*cx(mgs,lh)*(qx(mgs,lc)-qcwresv(mgs))*vt*   &
16240      &         (  da0lh(mgs)*xdia(mgs,lh,3)**2 +     &
16241      &            dab1lh(mgs,lh,lc)*xdia(mgs,lh,3)*xdia(mgs,lc,3) +    &
16242      &            da1lc(mgs)*xdia(mgs,lc,3)**2 ) 
16243          
16244          ENDIF
16245           qhacw(mgs) = Min( qhacw(mgs), 0.5*qx(mgs,lc)*dtpinv )
16246         
16247          IF ( lzh .gt. 1 ) THEN
16248           tmp = qx(mgs,lh)/cx(mgs,lh)
16249           
16250 !!          g1 = (6.0 + alpha(mgs,lh))*(5.0 + alpha(mgs,lh))*(4.0 + alpha(mgs,lh))/
16251 !!     :         ((3.0 + alpha(mgs,lh))*(2.0 + alpha(mgs,lh))*(1.0 + alpha(mgs,lh)))
16252 !          alp = Max( 1.0, alpha(mgs,lh)+1. )
16253 !          g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/
16254 !     :         ((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
16255 !          zhacw(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( qx(mgs,lh)/cx(mgs,lh)) * qhacw(mgs) )
16256          ENDIF
16257         
16258         ELSE
16259          qhacw(mgs) =    &
16260      &   min(   &
16261      &   ((0.25)*pi)*ehw(mgs)*(qx(mgs,lc)-qcwresv(mgs))*cx(mgs,lh)   &
16262      &  *abs(vtxbar(mgs,lh,1)-vtxbar(mgs,lc,1))   &
16263      &  *(  gf3*xdia(mgs,lh,2)    &
16264      &    + 2.0*gf2*xdia(mgs,lh,1)*xdia(mgs,lc,1)    &
16265      &    + gf1*xdia(mgs,lc,2) )     &
16266      &    , 0.5*(qx(mgs,lc)-qcwresv(mgs))*dtpinv)
16267 !     <  , qxmxd(mgs,lc))
16268 !     <  , qcmxd(mgs))
16269        
16270        
16271          IF ( lwsm6 .and. qsacw(mgs) > 0.0 .and.  qhacw(mgs) > 0.0) THEN
16272            qaacw = ( qx(mgs,ls)*qsacw(mgs) + qx(mgs,lh)*qhacw(mgs) )/(qx(mgs,ls) + qx(mgs,lh))
16273 !           qaacw = Min( qaacw, 0.5*(qsacw(mgs) + qhacw(mgs) ) )
16274            qsacw(mgs) = qaacw
16275            qhacw(mgs) = qaacw
16276          ENDIF
16277          
16278        ENDIF
16280           qhacwmlr(mgs) = qhacw(mgs)
16281           IF ( temg(mgs) > tfr .and. iqhacwshr == 0 ) THEN
16282             qhacw(mgs) = 0.0
16283           ENDIF
16284           
16285           IF ( lvol(lh) .gt. 1 .or. lhl .gt. 1 ) THEN ! calculate rime density for graupel volume and/or for graupel conversion to hail
16286              
16287              IF ( temg(mgs) .lt. 273.15) THEN
16288                IF ( irimdenopt == 1 ) THEN ! Heymsfield and Pflaum (1985)
16289                vt = ( (1.0-rimdenvwgt)*vtxbar(mgs,lh,1) + rimdenvwgt*vtxbar(mgs,lh,2) )
16290                
16291              rimdn(mgs,lh) = rimc1*(-((0.5)*(1.e+06)*xdia(mgs,lc,1))   &
16292      &                *((0.60)*vt )   &
16293      &                /(temg(mgs)-273.15))**(rimc2)
16294 !             rimdn(mgs,lh) = Min( Max( hdnmn, rimc3, rimdn(mgs,lh) ), rimc4 )
16295              rimdn(mgs,lh) = Min( Max( rimc3, rimdn(mgs,lh) ), rimc4 )
16297 !               IF ( igs(mgs) == 30 ) THEN
16298 !                 write(0,*) 'k,vt: ',kgs(mgs),vt, vtxbar(mgs,lh,1),vtxbar(mgs,lh,2), rhovt(mgs)*axx(mgs,lh)*( (alpha(mgs,lh)+3.)*xdia(mgs,lh,1) )**bxx(mgs,lh)
16299 !                 write(0,*) 'diam: char, mean, maxmass = ',xdia(mgs,lh,1),xdia(mgs,lh,3),(alpha(mgs,lh)+3.)*xdia(mgs,lh,1)
16300 !                 write(0,*) 'ax,bx,cd,xdn = ',axx(mgs,lh),bxx(mgs,lh),cdxgs(mgs,lh),xdn(mgs,lh)
16301 !                 write(0,*) 'vt_char,vt_mean = ',rhovt(mgs)*axx(mgs,lh)*( xdia(mgs,lh,1) )**bxx(mgs,lh),rhovt(mgs)*axx(mgs,lh)*( xdia(mgs,lh,3) )**bxx(mgs,lh)
16302 !                 write(0,*) 'rimdn,alpha = ',rimdn(mgs,lh),alpha(mgs,lh)
16303 !               ENDIF
16305                ELSEIF ( irimdenopt == 2 ) THEN ! Cober and List (1993)
16307                 tmp = (-((0.5)*(1.e+06)*xdia(mgs,lc,1))   &
16308      &                *( (1.0-rimdenvwgt)*vtxbar(mgs,lh,1) + rimdenvwgt*vtxbar(mgs,lh,2) )   &
16309      &                /(temg(mgs)-273.15))
16310                 tmp = Min( 5.5/0.6, Max( 0.3/0.6, tmp ) ) ! have to limit range of "R" because quadratic function starts to decrease (unphysically) at higher values
16311                 
16312                 rimdn(mgs,lh) = 1000.*(0.051 + 0.114*tmp - 0.0055*tmp**2)
16314                ELSEIF ( irimdenopt == 3 .or. irimdenopt == 4) THEN ! Macklin (3) or Saunders and Hosseini 2001
16316                 tmp = (-((0.5)*(1.e+06)*xdia(mgs,lc,1))   &
16317      &                *( (1.0-rimdenvwgt)*vtxbar(mgs,lh,1) + rimdenvwgt*vtxbar(mgs,lh,2) )   &
16318      &                /(temg(mgs)-273.15))
16319               !  tmp = Min( 5.5/0.6, Max( 0.3/0.6, tmp ) )
16320                 
16321                 IF ( irimdenopt == 3 ) THEN
16322                   rimdn(mgs,lh) =  Min(900., Max( 170., 110.*tmp**0.76 ) )
16323                 ELSEIF ( irimdenopt == 4 ) THEN ! Saunders and Hosseini
16324                   rimdn(mgs,lh) =  Min(917., Max( 10.,  900.0*(1.0 - 0.905**tmp ) ) )
16325                 ENDIF
16326                
16327                ENDIF
16328              ELSE
16329              rimdn(mgs,lh) = 1000.
16330              ENDIF
16331              
16332              IF ( lvol(lh) > 1 ) vhacw(mgs) = rho0(mgs)*qhacw(mgs)/rimdn(mgs,lh)
16334           ENDIF
16335       
16336         IF ( qx(mgs,lh) .gt. qxmin(lh) .and. ipelec .ge. 1 ) THEN
16337          rarx(mgs,lh) =     &
16338      &    qhacw(mgs)*1.0e3*rho0(mgs)/((pi/2.0)*xdia(mgs,lh,2)*cx(mgs,lh))
16339         ENDIF
16340       
16341       ENDIF  
16342       end do   
16345       do mgs = 1,ngscnt
16346       qhaci(mgs) = 0.0
16347       qhaci0(mgs) = 0.0
16348       IF ( ehi(mgs) .gt. 0.0 ) THEN
16349        IF (  ipconc .ge. 5 ) THEN
16351        vt = Sqrt((vtxbar(mgs,lh,1)-vtxbar(mgs,li,1))**2 +    &
16352      &            0.04*vtxbar(mgs,lh,1)*vtxbar(mgs,li,1) )
16354           qhaci0(mgs) = 0.25*pi*ehiclsn(mgs)*cx(mgs,lh)*qx(mgs,li)*vt*   &
16355      &         (  da0lh(mgs)*xdia(mgs,lh,3)**2 +     &
16356      &            dab1lh(mgs,lh,li)*xdia(mgs,lh,3)*xdia(mgs,li,3) +    &
16357      &            da1(li)*xdia(mgs,li,3)**2 ) 
16358           qhaci(mgs) = Min( ehi(mgs)*qhaci0(mgs), qimxd(mgs) )
16359        ELSE
16360         qhaci(mgs) =    &
16361      &  min(   &
16362      &  ((0.25)*pi)*ehi(mgs)*ehiclsn(mgs)*qx(mgs,li)*cx(mgs,lh)   &
16363      &  *abs(vtxbar(mgs,lh,1)-vtxbar(mgs,li,1))   &
16364      &  *(  gf3*xdia(mgs,lh,2)    &
16365      &    + 2.0*gf2*xdia(mgs,lh,1)*xdia(mgs,li,1)    &
16366      &    + gf1*xdia(mgs,li,2) )     &
16367      &  , qimxd(mgs))
16368        ENDIF
16369       ENDIF
16370       end do   
16373       IF ( lis > 1 .and. ipconc >= 5 ) THEN
16374       do mgs = 1,ngscnt
16375       qhacis(mgs) = 0.0
16376       qhacis0(mgs) = 0.0
16377       IF ( ehis(mgs) .gt. 0.0 ) THEN
16379        vt = Sqrt((vtxbar(mgs,lh,1)-vtxbar(mgs,lis,1))**2 +    &
16380      &            0.04*vtxbar(mgs,lh,1)*vtxbar(mgs,lis,1) )
16382           qhacis0(mgs) = 0.25*pi*ehisclsn(mgs)*cx(mgs,lh)*qx(mgs,lis)*vt*   &
16383      &         (  da0lh(mgs)*xdia(mgs,lh,3)**2 +     &
16384      &            dab1lh(mgs,lh,lis)*xdia(mgs,lh,3)*xdia(mgs,lis,3) +    &
16385      &            da1(li)*xdia(mgs,lis,3)**2 ) 
16386           qhacis(mgs) = Min( ehis(mgs)*qhacis0(mgs), qxmxd(mgs,lis) )
16387       ENDIF
16388       end do
16389       ENDIF
16393       do mgs = 1,ngscnt
16394       qhacs(mgs) = 0.0
16395       qhacs0(mgs) = 0.0
16396       IF ( ehs(mgs) .gt. 0.0 ) THEN
16397        IF ( ipconc .ge. 5 ) THEN
16399        vt = Sqrt((vtxbar(mgs,lh,1)-vtxbar(mgs,ls,1))**2 +    &
16400      &            0.04*vtxbar(mgs,lh,1)*vtxbar(mgs,ls,1) )
16402           qhacs0(mgs) = 0.25*pi*ehsclsn(mgs)*cx(mgs,lh)*qx(mgs,ls)*vt*   &
16403      &         (  da0lh(mgs)*xdia(mgs,lh,3)**2 +     &
16404      &            dab1lh(mgs,lh,ls)*xdia(mgs,lh,3)*xdia(mgs,ls,3) +    &
16405      &            da1(ls)*xdia(mgs,ls,3)**2 ) 
16406       
16407           qhacs(mgs) = Min( ehs(mgs)*qhacs0(mgs), qsmxd(mgs) )
16409        ELSE
16410          qhacs(mgs) =   &
16411      &   min(   &
16412      &   ((0.25)*pi/gf4)*ehs(mgs)*ehsclsn(mgs)*qx(mgs,ls)*cx(mgs,lh)   &
16413      &  *abs(vtxbar(mgs,lh,1)-vtxbar(mgs,ls,1))   &
16414      &  *(  gf6*gf1*xdia(mgs,ls,2)   &
16415      &    + 2.0*gf5*gf2*xdia(mgs,ls,1)*xdia(mgs,lh,1)   &
16416      &    + gf4*gf3*xdia(mgs,lh,2) )   &
16417      &  , qsmxd(mgs))
16418         ENDIF
16419       ENDIF
16420       end do   
16422       do mgs = 1,ngscnt
16423       qhacr(mgs) = 0.0
16424       qhacrmlr(mgs) = 0.0
16425       vhacr(mgs) = 0.0
16426       chacr(mgs) = 0.0
16427       zhacr(mgs) = 0.0
16428       IF ( temg(mgs) .gt. tfr ) raindn(mgs,lh) = 1000.0
16430       IF ( ehr(mgs) .gt. 0.0 ) THEN
16431       IF ( ipconc .ge. 3 ) THEN
16432        vt = Sqrt((vtxbar(mgs,lh,1)-vtxbar(mgs,lr,1))**2 +    &
16433      &            0.04*vtxbar(mgs,lh,1)*vtxbar(mgs,lr,1) )
16434 !       qhacr(mgs) = ehr(mgs)*cx(mgs,lh)*vt*
16435 !     :     qx(mgs,lr)*0.25*pi*
16436 !     :      (3.02787*xdia(mgs,lr,2) + 
16437 !     :       3.30669*xdia(mgs,lh,1)*xdia(mgs,lr,1) + 
16438 !     :       2.*xdia(mgs,lh,2))
16439      
16440        qhacr(mgs) = 0.25*pi*ehr(mgs)*cx(mgs,lh)*qx(mgs,lr)*vt*   &
16441      &         (  da0lh(mgs)*xdia(mgs,lh,3)**2 +     &
16442      &            dab1lh(mgs,lh,lr)*xdia(mgs,lh,3)*xdia(mgs,lr,3) +    &
16443      &            da1lr(mgs)*xdia(mgs,lr,3)**2 )
16444 !     &            da1(lr)*xdia(mgs,lr,3)**2 )
16445 !       IF ( qhacr(mgs) .gt. 0. .or. tmp .gt. 0.0 ) write(0,*) 'qhacr= ',qhacr(mgs),tmp
16446 !!        qhacr(mgs) = Min( qhacr(mgs), qrmxd(mgs) )
16447 !!        chacr(mgs) = qhacr(mgs)*cx(mgs,lr)/qx(mgs,lr)
16448 !!        chacr(mgs) = min(chacr(mgs),crmxd(mgs))
16450         qhacr(mgs) = Min( qhacr(mgs), qxmxd(mgs,lr) )
16452             qhacrmlr(mgs) = qhacr(mgs)
16453         
16454         IF ( temg(mgs) > tfr .and. iehr0c == 0 ) THEN
16455           qhacr(mgs) = 0.0
16457           IF ( iqhacrmlr == 0 ) THEN
16458               qhacrmlr(mgs) = -qhacw(mgs)
16459           ENDIF
16461         ELSE
16462 !        chacr(mgs) = Min( qhacr(mgs)*rho0(mgs)/xmas(mgs,lr), cxmxd(mgs,lr) )
16464 !       chacr(mgs) = ehr(mgs)*cx(mgs,lh)*vt*
16465 !     :     cx(mgs,lr)*0.25*pi*
16466 !     :      (0.69874*xdia(mgs,lr,2) +
16467 !     :       1.24001*xdia(mgs,lh,1)*xdia(mgs,lr,1) +
16468 !     :       2.*xdia(mgs,lh,2))
16470         chacr(mgs) = 0.25*pi*ehr(mgs)*cx(mgs,lh)*cx(mgs,lr)*vt*      &
16471      &         (  da0lh(mgs)*xdia(mgs,lh,3)**2 +                     &
16472      &            dab0lh(mgs,lh,lr)*xdia(mgs,lh,3)*xdia(mgs,lr,3) +  &
16473      &            da0lr(mgs)*xdia(mgs,lr,3)**2 )
16475 !       IF ( qhacr(mgs) .gt. 0. .or. tmp .gt. 0.0 ) write(0,*) 'chacr= ',chacr(mgs),tmp
16477 !        chacr(mgs) = qhacr(mgs)*cx(mgs,lr)/qx(mgs,lr)
16478         chacr(mgs) = min(chacr(mgs),crmxd(mgs))
16480       IF ( lzh .gt. 1 ) THEN
16481           tmp = qx(mgs,lh)/cx(mgs,lh)
16483 !          g1 = (6.0 + alpha(mgs,lh))*(5.0 + alpha(mgs,lh))*(4.0 + alpha(mgs,lh))/
16484 !     :         ((3.0 + alpha(mgs,lh))*(2.0 + alpha(mgs,lh))*(1.0 + alpha(mgs,lh)))
16485 !          alp = Max( 1.0, alpha(mgs,lh)+1. )
16486 !          g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/
16487 !     :         ((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
16488 !        zhacr(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( tmp ) * qhacr(mgs) - tmp**2 * chacr(mgs) )
16489 !        zhacr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*( tmp ) * qhacr(mgs) )
16490       ENDIF
16491       ENDIF ! temg > tfr
16492       
16493       ELSE
16494        IF ( lwsm6 .and. ipconc == 0 ) THEN
16495          vt = vt2ave(mgs)
16496        ELSE
16497          vt = vtxbar(mgs,lh,1)
16498        ENDIF
16500       qhacr(mgs) =   &
16501      &   min(   &
16502      &   ((0.25)*pi/gf4)*ehr(mgs)*qx(mgs,lr)*cx(mgs,lh)   &
16503      &  *abs(vt-vtxbar(mgs,lr,1))   &
16504      &  *(  gf6*gf1*xdia(mgs,lr,2)   &
16505      &    + 2.0*gf5*gf2*xdia(mgs,lr,1)*xdia(mgs,lh,1)   &
16506      &    + gf4*gf3*xdia(mgs,lh,2) )   &
16507      &  , qrmxd(mgs))
16508       
16509         IF ( temg(mgs) > tfr ) THEN
16510           IF ( iqhacrmlr >= 1 ) qhacrmlr(mgs) = qhacr(mgs)
16511           qhacr(mgs) = 0.0
16512         ENDIF
16513       
16514       ENDIF
16515           IF ( lvol(lh) .gt. 1 .or. lhl .gt. 1 ) THEN ! calculate rime density for graupel volume and/or for graupel conversion to hail
16516              
16517              IF ( temg(mgs) .lt. 273.15) THEN
16518              raindn(mgs,lh) = rimc1*(-((0.5)*(1.e+06)*xdia(mgs,lr,3))   &
16519      &                *((0.60)*vt)   &
16520      &                /(temg(mgs)-273.15))**(rimc2)
16522              raindn(mgs,lh) = Min( Max( rimc3, rimdn(mgs,lh) ), rimc4 )
16523              ELSE
16524              raindn(mgs,lh) = 1000.
16525              ENDIF
16526              
16527              IF ( lvol(lh) > 1 )  vhacr(mgs) = rho0(mgs)*qhacr(mgs)/raindn(mgs,lh)
16528         ENDIF
16529       ENDIF
16530       end do
16534       if (ndebug .gt. 0 ) write(0,*) 'Collection: hail collects xxxxx'
16537       do mgs = 1,ngscnt
16538       qhlacw(mgs) = 0.0
16539       qhlacwmlr(mgs) = 0.0
16540       vhlacw(mgs) = 0.0
16541       vhlsoak(mgs) = 0.0
16542       IF ( lhl > 1 .and. .true.) THEN
16543         vtmax = (gz(igs(mgs),jgs,kgs(mgs))*dtpinv)
16544         vtxbar(mgs,lhl,1) = Min( vtmax, vtxbar(mgs,lhl,1))
16545         vtxbar(mgs,lhl,2) = Min( vtmax, vtxbar(mgs,lhl,2))
16546         vtxbar(mgs,lhl,3) = Min( vtmax, vtxbar(mgs,lhl,3))
16547       ENDIF
16549       IF ( lhl > 0 ) THEN
16550       rarx(mgs,lhl) = 0.0
16551       ENDIF
16553       IF ( lhl .gt. 1 .and. ehlw(mgs) .gt. 0.0 ) THEN
16556 !        IF ( ipconc .ge. 2 ) THEN
16558             vt = abs(vtxbar(mgs,lhl,1)-vtxbar(mgs,lc,1))
16560           qhlacw(mgs) = 0.25*pi*ehlw(mgs)*cx(mgs,lhl)*(qx(mgs,lc)-qcwresv(mgs))*vt*   &
16561      &         (  da0lhl(mgs)*xdia(mgs,lhl,3)**2 +     &
16562      &            dab1lh(mgs,lhl,lc)*xdia(mgs,lhl,3)*xdia(mgs,lc,3) +    &
16563      &            da1lc(mgs)*xdia(mgs,lc,3)**2 )
16566           qhlacw(mgs) = Min( qhlacw(mgs), 0.5*qx(mgs,lc)*dtpinv )
16568           qhlacwmlr(mgs) = qhlacw(mgs)
16569           IF ( temg(mgs) > tfr .and. iqhlacwshr == 0 ) THEN
16570             qhlacw(mgs) = 0.0
16571           ENDIF
16573           IF ( lvol(lhl) .gt. 1 ) THEN
16575              IF ( temg(mgs) .lt. 273.15) THEN
16576                IF ( irimdenopt == 1 ) THEN ! Heymsfeld and Pflaum (1985)
16577              rimdn(mgs,lhl) = rimc1*(-((0.5)*(1.e+06)*xdia(mgs,lc,1))   &
16578      &                *((0.60)*( (1.0-rimdenvwgt)*vtxbar(mgs,lhl,1) + rimdenvwgt*vtxbar(mgs,lhl,2) ))   &
16579      &                /(temg(mgs)-273.15))**(rimc2)
16580              rimdn(mgs,lhl) = Min( Max( hldnmn, rimc3, rimdn(mgs,lhl) ), rimc4 )
16581                
16582                ELSEIF ( irimdenopt == 2 ) THEN ! Cober and List (1993)
16583                 tmp = -0.5*(1.e+06)*xdia(mgs,lc,1)   &
16584      &                *( (1.0-rimdenvwgt)*vtxbar(mgs,lhl,1) + rimdenvwgt*vtxbar(mgs,lhl,2) )   &
16585      &                /(temg(mgs)-273.15)
16586                 tmp = Min( 5.5/0.6, Max( 0.3/0.6, tmp ) )
16587                 
16588                 rimdn(mgs,lhl) = 1000.*(0.051 + 0.114*tmp - 0.005*tmp**2)
16589                
16590                ELSEIF ( irimdenopt == 3 .or. irimdenopt == 4) THEN ! Macklin (3) or Saunders and Hosseini 2001
16591                 tmp = -0.5*(1.e+06)*xdia(mgs,lc,1)   &
16592      &                *( (1.0-rimdenvwgt)*vtxbar(mgs,lhl,1) + rimdenvwgt*vtxbar(mgs,lhl,2) )  &
16593      &                /(temg(mgs)-273.15)
16594               !  tmp = Min( 5.5/0.6, Max( 0.3/0.6, tmp ) )
16595                 
16596                 IF ( irimdenopt == 3 ) THEN
16597                   rimdn(mgs,lhl) =  Min(900., Max( 170., 110.*tmp**0.76 ) )
16598                 ELSEIF ( irimdenopt == 4 ) THEN ! Saunders and Hosseini
16599                   rimdn(mgs,lhl) =  Min(917., Max( 10.,  900.0*(1.0 - 0.905**tmp ) ) )
16600                 ENDIF
16601                
16602                ENDIF
16603              ELSE
16604              rimdn(mgs,lhl) = 1000.
16605              ENDIF
16607              vhlacw(mgs) = rho0(mgs)*qhlacw(mgs)/rimdn(mgs,lhl)
16609           ENDIF
16612         IF ( qx(mgs,lhl) .gt. qxmin(lhl) .and. ipelec .ge. 1 ) THEN
16613          rarx(mgs,lhl) =     &
16614      &    qhlacw(mgs)*1.0e3*rho0(mgs)/((pi/2.0)*xdia(mgs,lhl,2)*cx(mgs,lhl))
16615         ENDIF
16617       ENDIF
16618       end do
16620       qhlaci(:) = 0.0
16621       qhlaci0(:) = 0.0
16622       IF ( lhl .gt. 1  ) THEN
16623       do mgs = 1,ngscnt
16624       IF ( ehli(mgs) .gt. 0.0 ) THEN
16625        IF (  ipconc .ge. 5 ) THEN
16627        vt = Sqrt((vtxbar(mgs,lhl,1)-vtxbar(mgs,li,1))**2 +    &
16628      &            0.04*vtxbar(mgs,lhl,1)*vtxbar(mgs,li,1) )
16630           qhlaci0(mgs) = 0.25*pi*ehliclsn(mgs)*cx(mgs,lhl)*qx(mgs,li)*vt*   &
16631      &         (  da0lhl(mgs)*xdia(mgs,lhl,3)**2 +     &
16632      &            dab1lh(mgs,lhl,li)*xdia(mgs,lhl,3)*xdia(mgs,li,3) +    &
16633      &            da1(li)*xdia(mgs,li,3)**2 )
16634         ! qhlaci(mgs) = Min( qhlaci(mgs), qimxd(mgs) )
16635           qhlaci(mgs) = Min( ehli(mgs)*qhlaci0(mgs), qimxd(mgs) )
16636        ENDIF
16637       ENDIF
16638       end do
16639       ENDIF
16641       qhlacs(:) = 0.0
16642       qhlacs0(:) = 0.0
16643       IF ( lhl .gt. 1 ) THEN
16644       do mgs = 1,ngscnt
16645       IF ( ehls(mgs) .gt. 0.0) THEN
16646        IF ( ipconc .ge. 5 ) THEN
16648        vt = Sqrt((vtxbar(mgs,lhl,1)-vtxbar(mgs,ls,1))**2 +    &
16649      &            0.04*vtxbar(mgs,lhl,1)*vtxbar(mgs,ls,1) )
16651           qhlacs0(mgs) = 0.25*pi*ehlsclsn(mgs)*cx(mgs,lhl)*qx(mgs,ls)*vt*   &
16652      &         (  da0lhl(mgs)*xdia(mgs,lhl,3)**2 +     &
16653      &            dab1lh(mgs,lhl,ls)*xdia(mgs,lhl,3)*xdia(mgs,ls,3) +    &
16654      &            da1(ls)*xdia(mgs,ls,3)**2 )
16656           qhlacs(mgs) = Min( ehls(mgs)*qhlacs0(mgs), qsmxd(mgs) )
16657         ENDIF
16658       ENDIF
16659       end do
16660       ENDIF
16663       do mgs = 1,ngscnt
16664       qhlacr(mgs) = 0.0
16665       qhlacrmlr(mgs) = 0.0
16666       chlacr(mgs) = 0.0
16667       vhlacr(mgs) = 0.0
16668       IF ( lhl .gt. 1 .and. temg(mgs) .gt. tfr ) raindn(mgs,lhl) = 1000.0
16670       IF ( lhl .gt. 1 .and. ehlr(mgs) .gt. 0.0 ) THEN
16671       IF ( ipconc .ge. 3 ) THEN
16672        vt = Sqrt((vtxbar(mgs,lhl,1)-vtxbar(mgs,lr,1))**2 +    &
16673      &            0.04*vtxbar(mgs,lhl,1)*vtxbar(mgs,lr,1) )
16675        qhlacr(mgs) = 0.25*pi*ehlr(mgs)*cx(mgs,lhl)*qx(mgs,lr)*vt*   &
16676      &         (  da0lhl(mgs)*xdia(mgs,lhl,3)**2 +     &
16677      &            dab1lh(mgs,lhl,lr)*xdia(mgs,lhl,3)*xdia(mgs,lr,3) +    &
16678      &            da1lr(mgs)*xdia(mgs,lr,3)**2 )
16679 !     &            da1(lr)*xdia(mgs,lr,3)**2 )
16680 !       IF ( qhacr(mgs) .gt. 0. .or. tmp .gt. 0.0 ) write(0,*) 'qhacr= ',qhacr(mgs),tmp
16681 !!        qhacr(mgs) = Min( qhacr(mgs), qrmxd(mgs) )
16682 !!        chacr(mgs) = qhacr(mgs)*cx(mgs,lr)/qx(mgs,lr)
16683 !!        chacr(mgs) = min(chacr(mgs),crmxd(mgs))
16685         qhlacr(mgs) = Min( qhlacr(mgs), qxmxd(mgs,lr) )
16687      
16688         IF ( iqhlacrmlr >= 1 ) qhlacrmlr(mgs) = qhlacr(mgs)
16689         
16690         IF ( temg(mgs) > tfr .and. iehlr0c == 0) THEN
16691           qhlacr(mgs) = 0.0
16692           IF ( iqhlacrmlr == 0 ) THEN
16693               qhlacrmlr(mgs) = -qhlacw(mgs)
16694           ENDIF
16695         ELSE
16696         chlacr(mgs) = 0.25*pi*ehlr(mgs)*cx(mgs,lhl)*cx(mgs,lr)*vt*   &
16697      &         (  da0lhl(mgs)*xdia(mgs,lhl,3)**2 +     &
16698      &            dab0lh(mgs,lhl,lr)*xdia(mgs,lhl,3)*xdia(mgs,lr,3) +    &
16699      &            da0lr(mgs)*xdia(mgs,lr,3)**2 )
16701         chlacr(mgs) = min(chlacr(mgs),crmxd(mgs))
16703         IF ( lvol(lhl) .gt. 1 ) THEN
16704          vhlacr(mgs) = rho0(mgs)*qhlacr(mgs)/raindn(mgs,lhl)
16705         ENDIF
16706         ENDIF
16707       ENDIF
16708       ENDIF
16709       end do
16717 !      if (ndebug .gt. 0 ) write(0,*) 'Collection: Cloud collects xxxxx'
16719       if (ndebug .gt. 0 ) write(0,*) 'Collection: cloud ice collects xxxx2'
16721       do mgs = 1,ngscnt
16722       qiacw(mgs) = 0.0
16723       IF ( eiw(mgs) .gt. 0.0 ) THEN
16725        vt = Sqrt((vtxbar(mgs,li,1)-vtxbar(mgs,lc,1))**2 +    &
16726      &            0.04*vtxbar(mgs,li,1)*vtxbar(mgs,lc,1) )
16728           qiacw(mgs) = 0.25*pi*eiw(mgs)*cx(mgs,li)*qx(mgs,lc)*vt*   &
16729      &         (  da0(li)*xdia(mgs,li,3)**2 +     &
16730      &            dab1(li,lc)*xdia(mgs,li,3)*xdia(mgs,lc,3) +    &
16731      &            da1lc(mgs)*xdia(mgs,lc,3)**2 )
16733        qiacw(mgs) = Min( qiacw(mgs), qxmxd(mgs,lc) )
16734       ENDIF
16735       end do
16740       if (ndebug .gt. 0 ) write(0,*) 'Collection: cloud ice collects xxxx8'
16742       do mgs = 1,ngscnt
16743       qiacr(mgs) = 0.0
16744       qiacrf(mgs) = 0.0
16745       qiacrs(mgs) = 0.0
16746       ciacrs(mgs) = 0.0
16747       ciacr(mgs) = 0.0
16748       ciacrf(mgs) = 0.0
16749       viacrf(mgs) = 0.0
16750       csplinter(mgs) = 0.0
16751       qsplinter(mgs) = 0.0
16752       csplinter2(mgs) = 0.0
16753       qsplinter2(mgs) = 0.0
16754       IF ( iacr .ge. 1 .and. eri(mgs) .gt. 0.0    &
16755      &     .and. temg(mgs) .le. 270.15 ) THEN
16756       IF ( ipconc .ge. 3 ) THEN
16757        ni = 0.0
16758          IF ( xdia(mgs,li,1) .ge. 10.e-6 ) THEN
16759           ni = ni + cx(mgs,li)*Exp(- (40.e-6/xdia(mgs,li,1))**3 )
16760          ENDIF
16761        IF ( imurain == 1 ) THEN ! gamma of diameter
16762            IF ( iacrsize /= 4 ) THEN
16763            IF ( iacrsize .eq. 1 ) THEN
16764              ratio = 500.e-6/xdia(mgs,lr,1)
16765            ELSEIF ( iacrsize .eq. 2 ) THEN
16766              ratio = 300.e-6/xdia(mgs,lr,1)
16767            ELSEIF ( iacrsize .eq. 3 ) THEN
16768              ratio = 40.e-6/xdia(mgs,lr,1)
16769            ELSEIF ( iacrsize .eq. 5 ) THEN
16770              ratio = 150.e-6/xdia(mgs,lr,1)
16771            ENDIF
16772            i = Min(nqiacrratio,Int(ratio*dqiacrratioinv))
16773            j = Int(Max(0.0,Min(15.,alpha(mgs,lr)))*dqiacralphainv)
16774 !           j = Int(Max(minalphalu,Min(maxalphalu,alpha(mgs,lr)))*dqiacralphainv)
16775            delx = ratio - float(i)*dqiacrratio
16776            dely = alpha(mgs,lr) - float(j)*dqiacralpha
16777            ip1 = Min( i+1, nqiacrratio )
16778            jp1 = Min( j+1, nqiacralpha )
16780            ! interpolate along x, i.e., ratio
16781            tmp1 = ciacrratio(i,j) + delx*dqiacrratioinv*(ciacrratio(ip1,j) - ciacrratio(i,j))
16782            tmp2 = ciacrratio(i,jp1) + delx*dqiacrratioinv*(ciacrratio(ip1,jp1) - ciacrratio(i,jp1))
16783            
16784            ! interpolate along alpha
16785            
16786            nr = (tmp1 + dely*dqiacralphainv*(tmp2 - tmp1))*cx(mgs,lr)
16787            
16788            ! interpolate along x, i.e., ratio; 
16789            tmp1 = qiacrratio(i,j) + delx*dqiacrratioinv*(qiacrratio(ip1,j) - qiacrratio(i,j))
16790            tmp2 = qiacrratio(i,jp1) + delx*dqiacrratioinv*(qiacrratio(ip1,jp1) - qiacrratio(i,jp1))
16791            
16792            ! interpolate along alpha; 
16793            
16794            qr = (tmp1 + dely*dqiacralphainv*(tmp2 - tmp1))*qx(mgs,lr)
16795            
16796            ELSE ! iacrsize == 4 : use all
16797              nr = cx(mgs,lr)
16798              qr = qx(mgs,lr)
16799            ENDIF
16801           vt = Sqrt((vtxbar(mgs,lr,1)-vtxbar(mgs,li,1))**2 +     &
16802      &            0.04*vtxbar(mgs,lr,1)*vtxbar(mgs,li,1) )
16804           qiacr(mgs) = 0.25*pi*eri(mgs)*ni*qr*vt*   &
16805      &         (  da0(li)*xdia(mgs,li,3)**2 +     &
16806      &            dab1lh(mgs,li,lr)*xdia(mgs,lh,3)*xdia(mgs,li,3) +    &
16807      &            da1(lr)*xdia(mgs,lr,3)**2 ) 
16808           
16809           qiacr(mgs) = Min( qrmxd(mgs), qiacr(mgs) )
16810           
16812           ciacr(mgs) = 0.25*pi*eri(mgs)*ni*nr*vt*   &
16813      &         (  da0(li)*xdia(mgs,li,3)**2 +     &
16814      &            dab0lh(mgs,li,lr)*xdia(mgs,lr,3)*xdia(mgs,li,3) +    &
16815      &            da0(lr)*xdia(mgs,lr,3)**2 ) 
16817           ciacr(mgs) = Min( crmxd(mgs), ciacr(mgs) )
16818           
16819 !          write(iunit,*) 'qiacr: ',cx(mgs,lr),nr,qx(mgs,lr),qr,qiacr(mgs),ciacr(mgs)
16820 !          write(iunit,*) 'xdia r li = ',xdia(mgs,lr,3),xdia(mgs,li,3),xdia(mgs,lr,1),xdia(mgs,li,1)
16821 !          write(iunit,*) 'i,j,ratio = ',i,j,ciacrratio(i,j),qiacrratio(i,j)
16822 !          write(iunit,*) 'ni,ci = ',ni,cx(mgs,li),qx(mgs,li)
16824        ELSEIF ( imurain == 3 ) THEN ! gamma of volume
16825 !   Set nr to the number of drops greater than 40 microns.
16826          arg = 1000.*xdia(mgs,lr,3)
16827 !         nr = cx(mgs,lr)*gaml02( arg )
16828 !        IF ( iacr .eq. 1 ) THEN
16829          IF ( ipconc .ge. 3 ) THEN
16830            IF ( iacrsize .eq. 1 ) THEN
16831             nr = cx(mgs,lr)*gaml02d500( arg )  ! number greater than 500 microns in diameter
16832            ELSEIF ( iacrsize .eq. 2 .or. iacrsize .eq. 5 ) THEN
16833             nr = cx(mgs,lr)*gaml02d300( arg )  ! number greater than 300 microns in diameter
16834            ELSEIF ( iacrsize .eq. 3 ) THEN
16835             nr = cx(mgs,lr)*gaml02( arg ) ! number greater than 40 microns in diameter
16836            ELSEIF ( iacrsize .eq. 4 ) THEN
16837             nr = cx(mgs,lr) ! all raindrops
16838            ENDIF
16839          ELSE
16840          nr = cx(mgs,lr)*gaml02( arg )
16841          ENDIF
16842 !        ELSEIF ( iacr .eq. 2 ) THEN
16843 !         nr = cx(mgs,lr)*gaml02d300( arg )  ! number greater than 300 microns in diameter
16844 !        ENDIF
16845        IF ( ni .gt. 0.0 .and. nr .gt. 0.0 ) THEN
16846        d0 = xdia(mgs,lr,3)
16847        qiacr(mgs) = xdn(mgs,lr)*rhoinv(mgs)*   &
16848      &     (0.217239*(0.522295*(d0**5) +    &
16849      &      49711.81*(d0**6) -    &
16850      &      1.673016e7*(d0**7)+    &
16851      &      2.404471e9*(d0**8) -    &
16852      &      1.22872e11*(d0**9))*ni*nr)
16853       qiacr(mgs) = Min( qrmxd(mgs), qiacr(mgs) )
16854       ciacr(mgs) =   &
16855      &   (0.217239*(0.2301947*(d0**2) +    &
16856      &      15823.76*(d0**3) -    &
16857      &      4.167685e6*(d0**4) +    &
16858      &      4.920215e8*(d0**5) -    &
16859      &      2.133344e10*(d0**6))*ni*nr)
16860       ciacr(mgs) = Min( crmxd(mgs), ciacr(mgs) )
16861 !      ciacr(mgs) = qiacr(mgs)*cx(mgs,lr)/qx(mgs,lr)
16862       ENDIF
16863       ENDIF
16864        IF ( iacr .eq. 1 .or. iacr .eq. 3 ) THEN
16865          ciacrf(mgs) = Min(ciacr(mgs), qiacr(mgs)/(1.0*vr1mm*1000.0)*rho0(mgs) ) ! *rzxh(mgs)
16866        ELSEIF ( iacr .eq. 2 ) THEN
16867          ciacrf(mgs) = ciacr(mgs) ! *rzxh(mgs)
16868        ELSEIF ( iacr .eq. 4 ) THEN
16869          ciacrf(mgs) = Min(ciacr(mgs), qiacr(mgs)/(1.0*vfrz*1000.0)*rho0(mgs) ) ! *rzxh(mgs)
16870        ELSEIF ( iacr .eq. 5 ) THEN
16871          ciacrf(mgs) = ciacr(mgs)*rzxh(mgs)
16872        ENDIF 
16873 !      crfrzf(mgs) = Min(crfrz(mgs), qrfrz(mgs)/(bfnu*27.0*vr1mm*1000.0)*rho0(mgs) ) ! rzxh(mgs)*crfrz(mgs)
16874        ENDIF
16875       
16876       
16877       ELSE ! single-moment rain
16878       qiacr(mgs) =    &
16879      &  min(        &
16880      &   ((0.25/gf4)*pi)*eri(mgs)*cx(mgs,li)*qx(mgs,lr)   &
16881      &  *abs(vtxbar(mgs,lr,1)-vtxbar(mgs,li,1))   &
16882      &  *(  gf6*gf1*xdia(mgs,lr,2)    &
16883      &    + 2.0*gf5*gf2*xdia(mgs,lr,1)*xdia(mgs,li,1)    &
16884      &    + gf4*gf3*xdia(mgs,li,2) )     &
16885      &  , qrmxd(mgs))
16886       ENDIF
16887 !      if ( temg(mgs) .gt. 268.15 ) then
16888 !      qiacr(mgs) = 0.0
16889 !      ciacr(mgs) = 0.0
16890 !      end if
16892       IF ( ipconc .ge. 1 ) THEN
16893         IF ( nsplinter .ge. 1000 ) THEN
16894         ! Lawson et al. 2015 JAS
16895          ! ave. diam of freezing drops in microns
16896            IF ( qiacr(mgs)*dtp > qxmin(lh) .and. ciacr(mgs) > 1.e-3 ) THEN
16897              tmpdiam = 1.e6*( 6.*qiacr(mgs)/(1000.*pi*ciacr(mgs) ) )**(1./3.) ! avg. diameter of newly frozen drops in microns
16898              csplinter(mgs) = lawson_splinter_fac*tmpdiam**4*ciacr(mgs)
16899            ENDIF
16900         ELSEIF ( nsplinter .ge. 0 ) THEN
16901           csplinter(mgs) = nsplinter*ciacr(mgs)
16902         ELSE
16903           csplinter(mgs) = -nsplinter*ciacrf(mgs)
16904         ENDIF
16905         qsplinter(mgs) = Min(0.1*qiacr(mgs), csplinter(mgs)*splintermass/rho0(mgs) ) ! makes splinters smaller if too much mass is taken from graupel
16906       ENDIF
16907       
16908       frach = 1.0
16909            IF ( ibiggsnow == 2 .or. ibiggsnow == 3 ) THEN
16910            IF ( ciacr(mgs) > qxmin(lh) ) THEN
16911            xvfrz = rho0(mgs)*qiacr(mgs)/(ciacr(mgs)*900.) ! mean volume of frozen drops; 900. for frozen drop density
16912            frach = 0.5 *(1. +  Tanh(0.2e12 *( xvfrz - 1.15*xvbiggsnow)))
16914              qiacrs(mgs) = (1.-frach)*qiacr(mgs)
16915              ciacrs(mgs) = (1.-frach)*ciacrf(mgs) ! *rzxh(mgs)
16916            
16917            ENDIF
16918            ENDIF
16920       qiacrf(mgs) = frach*qiacr(mgs)
16921       ciacrf(mgs) = frach*ciacrf(mgs)
16923       IF ( lvol(lh) > 1 ) THEN
16924          viacrf(mgs) = rho0(mgs)*qiacrf(mgs)/rhofrz
16925       ENDIF
16926       
16927       end do
16933 ! snow aggregation here
16934       if ( ipconc .ge. 4 ) then !
16935       do mgs = 1,ngscnt
16936       csacs(mgs) = 0.0
16937       IF ( qx(mgs,ls) > qxmin(ls) .and. ess(mgs) .gt. 0.0 ) THEN ! .and. xv(mgs,ls) < 0.25*xvmx(ls)*Max(1.,100./Min(100.,xdn(mgs,ls)))  ) THEN
16939         IF ( iessec0flag == 0 ) THEN
16940           ec0(mgs) = 1.0
16941         ELSE
16942           tmp = xv(mgs,ls)/(xvmx(ls)*Max(1.,100./Min(100.,xdn(mgs,ls)))) ! fraction of max snow mass
16943           IF ( tmp .lt. essfrac1 ) THEN
16944             ec0(mgs) = 1.0
16945           ELSEIF ( tmp .ge. essfrac2 ) THEN
16946             ec0(mgs) = 0.0
16947           ELSE
16948             ec0(mgs) = (essfrac2 - tmp)/(essfrac2 - essfrac1)
16949           ENDIF
16950         ENDIF
16952       csacs(mgs) = ec0(mgs)*rvt*aa2*ess(mgs)*cx(mgs,ls)**2*Min( xv(mgs,ls), 4.*pii/3.*essrmax**3 ) ! *Min(1.,xdn(mgs,ls)/100. ) ! Min func tries to recalibrate for low diagnosed density 
16953 !      csacs(mgs) = rvt*aa2*ess(mgs)*cx(mgs,ls)**2*Min( xv(mgs,ls), 4.*pii/3.*0.02**3 ) ! *Min(1.,xdn(mgs,ls)/100. ) ! Min func tries to recalibrate for low diagnosed density 
16954       csacs(mgs) = Min(csacs(mgs),csmxd(mgs))
16955       ENDIF
16956       end do
16957       end if
16960       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: conc 11'
16961       if ( ipconc .ge. 2 .or. ipelec .ge. 9 ) then
16962       do mgs = 1,ngscnt
16963       ciacw(mgs) = 0.0
16964       IF ( eiw(mgs) .gt. 0.0 ) THEN
16965         ciacw(mgs) = qiacw(mgs)*rho0(mgs)/xmas(mgs,lc)
16966         ciacw(mgs) = min(ciacw(mgs),ccmxd(mgs))
16967       ENDIF
16968       end do
16970       end if
16972       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: conc 18'
16973       if ( ipconc .ge. 2 .or. ipelec .ge. 1 ) then
16974       do mgs = 1,ngscnt
16975        cracw(mgs) = 0.0
16976        cracr(mgs) = 0.0
16977        ec0(mgs) = 1.e9
16978       IF ( qx(mgs,lc) .gt. qxmin(lc) .and. qx(mgs,lr) .gt. qxmin(lr)    &
16979      &      .and. qracw(mgs) .gt. 0.0 ) THEN
16981        IF ( ipconc .lt. 3 ) THEN
16982         IF ( erw(mgs) .gt. 0.0 ) THEN
16983         cracw(mgs) =   &
16984      &   ((0.25)*pi)*erw(mgs)*(cx(mgs,lc) - ccwresv(mgs))*cx(mgs,lr)   &
16985      &  *abs(vtxbar(mgs,lr,1)-vtxbar(mgs,lc,1))   &
16986      &  *(  gf1*xdia(mgs,lc,2)   &
16987      &    + 2.0*gf2*xdia(mgs,lc,1)*xdia(mgs,lr,1)   &
16988      &    + gf3*xdia(mgs,lr,2) )
16989         ENDIF
16990        ELSE ! IF ( ipconc .ge. 3 .and. 
16991         IF ( dmrauto <= 0 .or.  rho0(mgs)*qx(mgs,lr) > 1.2*xl2p(mgs) ) THEN  !{
16992         IF ( 0.5*xdia(mgs,lr,3) .gt. rh(mgs) ) THEN ! { .or. cx(mgs,lr) .gt. nh(mgs) 
16993 !        IF ( qx(mgs,lc) .gt. qxmin(lc) .and. qx(mgs,lr) .gt. qxmin(lr) ) THEN
16994           IF ( 0.5*xdia(mgs,lr,3) .gt. rwradmn ) THEN ! r > 50.e-6 
16995 !          DM0CCC=A2*XNC*XNR*(XVC+XVR)                               ! (A11)
16996 !         NOTE: murain drops out, so same result for imurain = 1 and 3
16997             cracw(mgs) = aa2*cx(mgs,lr)*(cx(mgs,lc) - ccwresv(mgs))*(xv(mgs,lc) + xv(mgs,lr))
16998           ELSE
16999             IF ( imurain == 3 ) THEN
17000 !          DM0CCC=A1*XNC*XNR*(((CNU+2.)/(CNU+1.))*XVC**2+((RNU+2.)/(RNU+1.))*XVR**2) ! (A13)
17001             cracw(mgs) = aa1*cx(mgs,lr)*(cx(mgs,lc) - ccwresv(mgs))*   &
17002      &          ((alpha(mgs,lc) + 2.)*xv(mgs,lc)**2/(alpha(mgs,lc) + 1.) +    &
17003      &          (alpha(mgs,lr) + 2.)*xv(mgs,lr)**2/(alpha(mgs,lr) + 1.))
17004             ELSE ! imurain == 1 USE CP00 for rain DSD in diameter
17005             cracw(mgs) = aa1*cx(mgs,lr)*(cx(mgs,lc) - ccwresv(mgs))*   &
17006      &          ((alpha(mgs,lc) + 2.)*xv(mgs,lc)**2/(alpha(mgs,lc) + 1.) +    &
17007      &          (alpha(mgs,lr) + 6.)*(alpha(mgs,lr) + 5.)*(alpha(mgs,lr) + 4.)*xv(mgs,lr)**2/  &
17008      &             ((alpha(mgs,lr) + 3.)*(alpha(mgs,lr) + 2.)*(alpha(mgs,lr) + 1.)) )
17009             ENDIF ! imurain
17010           ENDIF
17011         ENDIF ! } rh
17012         ENDIF ! } dmrauto
17013        ENDIF ! ipconc
17014       ENDIF ! qc > qcmin & qr > qrmin
17015         
17016 ! Rain self collection (cracr) and break-up (factor of ec0)
17018 !       
17019         ec0(mgs) = 2.e9
17020         IF ( qx(mgs,lr) .gt. qxmin(lr) ) THEN
17021         rwrad = 0.5*xdia(mgs,lr,3)
17022         
17023         
17024         ! check median volume diameter
17025         IF ( icracrthresh > 1 ) THEN
17026          IF ( imurain == 1 ) THEN
17027            tmp =  (3.67+alpha(mgs,lr))*xdia(mgs,lr,1) ! median volume diameter; units of mm (Ulbrich 1983, JCAM)
17028          ELSE ! imurain == 3, 
17029            tmp =  (1.678+alpha(mgs,lr))**(1./3.)*xdia(mgs,lr,1) ! units of mm (using method of Ulbrich 1983. See ventillation_stuff.nb)
17030          ENDIF
17031         ELSE
17032           tmp = xdia(mgs,lr,3) - 0.1e-3
17033         ENDIF
17034          
17035 !        IF ( xdia(mgs,lr,3) .gt. 2.0e-3 .or. icracr <= 0 ) THEN
17036         IF ( tmp .gt. 1.9e-3 .or. icracr <= 0 ) THEN
17037           ec0(mgs) = 0.0
17038           cracr(mgs) = 0.0
17039         ELSE
17040          IF ( dmrauto <= 0 .or.  rho0(mgs)*qx(mgs,lr) > 1.2*xl2p(mgs) ) THEN 
17041           IF ( xdia(mgs,lr,3) .lt. 6.1e-4 ) THEN
17042             ec0(mgs) = 1.0
17043           ELSE
17044             ec0(mgs) = Exp(-50.0*(50.0*(xdia(mgs,lr,3) - 6.0e-4)))
17045           ENDIF
17046           
17048           IF ( rwrad .ge. 50.e-6 ) THEN
17049               cracr(mgs) = ec0(mgs)*aa2*cx(mgs,lr)**2*xv(mgs,lr)
17050           ELSE
17051             IF ( imurain == 3 ) THEN
17052              cracr(mgs) = ec0(mgs)*aa1*(cx(mgs,lr)*xv(mgs,lr))**2*   &
17053      &                   (alpha(mgs,lr) + 2.)/(alpha(mgs,lr) + 1.)
17054             ELSE ! imurain == 1
17055              cracr(mgs) = ec0(mgs)*aa1*(cx(mgs,lr)*xv(mgs,lr))**2*   &
17056      &                   (alpha(mgs,lr) + 6.)*(alpha(mgs,lr) + 5.)*(alpha(mgs,lr) + 4.)/ &
17057      &                  ((alpha(mgs,lr) + 3.)*(alpha(mgs,lr) + 2.)*(alpha(mgs,lr) + 1.))
17058               
17059             ENDIF
17060           ENDIF
17061 !          cracr(mgs) = Min(cracr(mgs),crmxd(mgs))
17062          ENDIF
17063         ENDIF
17064         ENDIF
17066 !      cracw(mgs) = min(cracw(mgs),cxmxd(mgs,lc)) 
17067       end do
17068       end if
17073 !  Graupel
17075       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: conc 22ii'
17076       chacw(:) = 0.0
17077       if ( ipconc .ge. 1 .or. ipelec .ge. 1 ) then
17078       do mgs = 1,ngscnt
17080       IF ( ipconc .ge. 5 ) THEN
17081        IF ( qhacw(mgs) .gt. 0.0 .and. xmas(mgs,lc) .gt. 0.0 ) THEN
17083 !  This is the explict version of chacw, which turns out to be very close to the
17084 !  approximation that the droplet size does not change, to within a few percent.
17085 !  This may _not_ be the case for cnu other than zero!
17086 !          chacw(mgs) = (ehw(mgs)*cx(mgs,lc)*cx(mgs,lh)*(pi/4.)*
17087 !     :    abs(vtxbar(mgs,lh,1)-vtxbar(mgs,lc,1))*
17088 !     :    (2.0*xdia(mgs,lh,1)*(xdia(mgs,lh,1) +
17089 !     :         xdia(mgs,lc,1)*gf43rds) +
17090 !     :      xdia(mgs,lc,2)*gf53rds))
17092 !          chacw(mgs) = Min( chacw(mgs), 0.6*cx(mgs,lc)*dtpinv )
17094 !        chacw(mgs) = qhacw(mgs)*rho0(mgs)/xmas(mgs,lc)
17095         chacw(mgs) = qhacw(mgs)*rho0(mgs)/xmascw(mgs)
17096 !        chacw(mgs) = min(chacw(mgs),cxmxd(mgs,lc))
17097         chacw(mgs) = Min( chacw(mgs), 0.5*(cx(mgs,lc) - ccwresv(mgs))*dtpinv )
17098        ELSE
17099         qhacw(mgs) = 0.0
17100        ENDIF
17101       ELSE
17102       ! single-moment
17103       chacw(mgs) =   &
17104      &   ((0.25)*pi)*ehw(mgs)*cx(mgs,lc)*cx(mgs,lh)   &
17105      &  *abs(vtxbar(mgs,lh,1)-vtxbar(mgs,lc,1))   &
17106      &  *(  gf1*xdia(mgs,lc,2)   &
17107      &    + 2.0*gf2*xdia(mgs,lc,1)*xdia(mgs,lh,1)   &
17108      &    + gf3*xdia(mgs,lh,2) )
17109       chacw(mgs) = min(chacw(mgs),0.5*cx(mgs,lc)*dtpinv)
17110 !      chacw(mgs) = min(chacw(mgs),cxmxd(mgs,lc))
17111 !      chacw(mgs) = min(chacw(mgs),ccmxd(mgs))
17112       ENDIF
17113       end do
17114       end if
17116       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: conc 22kk'
17117       chaci(:) = 0.0
17118       chaci0(:) = 0.0
17119       if ( ipconc .ge. 1 .or. ipelec .ge. 1 ) then
17120       do mgs = 1,ngscnt
17121       IF ( ehi(mgs) .gt. 0.0 .or. ( ehiclsn(mgs) > 0.0 .and. ipelec > 0 )) THEN
17122        IF ( ipconc .ge. 5 ) THEN
17124        vt = Sqrt((vtxbar(mgs,lh,1)-vtxbar(mgs,li,1))**2 +    &
17125      &            0.04*vtxbar(mgs,lh,1)*vtxbar(mgs,li,1) )
17127           chaci0(mgs) = 0.25*pi*ehiclsn(mgs)*cx(mgs,lh)*cx(mgs,li)*vt*   &
17128      &         (  da0lh(mgs)*xdia(mgs,lh,3)**2 +     &
17129      &            dab0lh(mgs,lh,li)*xdia(mgs,lh,3)*xdia(mgs,li,3) +    &
17130      &            da0(li)*xdia(mgs,li,3)**2 )
17132        ELSE
17133         chaci0(mgs) =   &
17134      &   ((0.25)*pi)*ehiclsn(mgs)*cx(mgs,li)*cx(mgs,lh)   &
17135      &  *abs(vtxbar(mgs,lh,1)-vtxbar(mgs,li,1))   &
17136      &  *(  gf1*xdia(mgs,li,2)   &
17137      &    + 2.0*gf2*xdia(mgs,li,1)*xdia(mgs,lh,1)   &
17138      &    + gf3*xdia(mgs,lh,2) )
17139         ENDIF
17141         chaci(mgs) = min(ehi(mgs)*chaci0(mgs),cimxd(mgs))
17142        ENDIF
17143       end do
17144       end if
17147       chacis(:) = 0.0
17148       if ( lis > 1 .and. ipconc .ge. 5 .or. ipelec .ge. 1 ) then
17149       do mgs = 1,ngscnt
17150       IF ( ehis(mgs) .gt. 0.0 .or. ( ehisclsn(mgs) > 0.0 .and. ipelec > 0 )) THEN
17152        vt = Sqrt((vtxbar(mgs,lh,1)-vtxbar(mgs,lis,1))**2 +    &
17153      &            0.04*vtxbar(mgs,lh,1)*vtxbar(mgs,lis,1) )
17155           chacis0(mgs) = 0.25*pi*ehisclsn(mgs)*cx(mgs,lh)*cx(mgs,lis)*vt*   &
17156      &         (  da0lh(mgs)*xdia(mgs,lh,3)**2 +     &
17157      &            dab0lh(mgs,lh,lis)*xdia(mgs,lh,3)*xdia(mgs,lis,3) +    &
17158      &            da0(lis)*xdia(mgs,lis,3)**2 )
17161         chacis(mgs) = min(ehis(mgs)*chacis0(mgs),cxmxd(mgs,lis))
17162        ENDIF
17163       end do
17164       end if
17167       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: conc 22nn'
17168       chacs(:) = 0.0
17169       chacs0(:) = 0.0
17170       if ( ipconc .ge. 1 .or. ipelec .ge. 1 ) then
17171       do mgs = 1,ngscnt
17172       IF ( ehs(mgs) .gt. 0 ) THEN
17173        IF ( ipconc .ge. 5 .or. ( ehsclsn(mgs) > 0.0 .and. ipelec > 0 ) ) THEN
17175        vt = Sqrt((vtxbar(mgs,lh,1)-vtxbar(mgs,ls,1))**2 +    &
17176      &            0.04*vtxbar(mgs,lh,1)*vtxbar(mgs,ls,1) )
17178           chacs0(mgs) = 0.25*pi*ehsclsn(mgs)*cx(mgs,lh)*cx(mgs,ls)*vt*   &
17179      &         (  da0lh(mgs)*xdia(mgs,lh,3)**2 +     &
17180      &            dab0lh(mgs,lh,ls)*xdia(mgs,lh,3)*xdia(mgs,ls,3) +    &
17181      &            da0(ls)*xdia(mgs,ls,3)**2 )
17183        ELSE
17184       chacs0(mgs) =   &
17185      &   ((0.25)*pi)*ehsclsn(mgs)*cx(mgs,ls)*cx(mgs,lh)   &
17186      &  *abs(vtxbar(mgs,lh,1)-vtxbar(mgs,ls,1))   &
17187      &  *(  gf3*gf1*xdia(mgs,ls,2)   &
17188      &    + 2.0*gf2*gf2*xdia(mgs,ls,1)*xdia(mgs,lh,1)   &
17189      &    + gf1*gf3*xdia(mgs,lh,2) )
17190       ENDIF
17191       chacs(mgs) = min(ehs(mgs)*chacs0(mgs),csmxd(mgs))
17192       ENDIF
17193       end do
17194       end if
17199 !  Hail
17201       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: conc 22ii'
17202       chlacw(:) = 0.0
17203       if ( ipconc .ge. 1 .or. ipelec .ge. 1 ) then
17204       do mgs = 1,ngscnt
17206       IF ( lhl .gt. 1 .and. ipconc .ge. 5 ) THEN
17207        IF ( qhlacw(mgs) .gt. 0.0 .and. xmas(mgs,lc) .gt. 0.0 ) THEN
17209 !  This is the explict version of chacw, which turns out to be very close to the
17210 !  approximation that the droplet size does not change, to within a few percent.
17211 !  This may _not_ be the case for cnu other than zero!
17212 !          chlacw(mgs) = (ehlw(mgs)*cx(mgs,lc)*cx(mgs,lhl)*(pi/4.)*
17213 !     :    abs(vtxbar(mgs,lhl,1)-vtxbar(mgs,lc,1))*
17214 !     :    (2.0*xdia(mgs,lhl,1)*(xdia(mgs,lhl,1) +
17215 !     :         xdia(mgs,lc,1)*gf43rds) +
17216 !     :      xdia(mgs,lc,2)*gf53rds))
17218 !          chlacw(mgs) = Min( chlacw(mgs), 0.6*cx(mgs,lc)*dtpinv )
17220 !        chlacw(mgs) = qhlacw(mgs)*rho0(mgs)/xmas(mgs,lc)
17221         chlacw(mgs) = qhlacw(mgs)*rho0(mgs)/xmascw(mgs)
17222 !        chlacw(mgs) = min(chlacw(mgs),cxmxd(mgs,lc))
17223         chlacw(mgs) = Min( chlacw(mgs), 0.5*cx(mgs,lc)*dtpinv )
17224        ELSE
17225         qhlacw(mgs) = 0.0
17226        ENDIF
17227 !      ELSE
17228 !      chlacw(mgs) =
17229 !     >   ((0.25)*pi)*ehlw(mgs)*cx(mgs,lc)*cx(mgs,lhl)
17230 !     >  *abs(vtxbar(mgs,lhl,1)-vtxbar(mgs,lc,1))
17231 !     >  *(  gf1*xdia(mgs,lc,2)
17232 !     >    + 2.0*gf2*xdia(mgs,lc,1)*xdia(mgs,lhl,1)
17233 !     >    + gf3*xdia(mgs,lhl,2) )
17234 !      chlacw(mgs) = min(chlacw(mgs),0.5*cx(mgs,lc)*dtpinv)
17235 !      chlacw(mgs) = min(chlacw(mgs),cxmxd(mgs,lc))
17236 !      chlacw(mgs) = min(chlacw(mgs),ccmxd(mgs))
17237       ENDIF
17238       end do
17239       end if
17241       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: conc 22kk'
17242       chlaci(:) = 0.0
17243       chlaci0(:) = 0.0
17244       if ( ipconc .ge. 1 .or. ipelec .ge. 1 ) then
17245       do mgs = 1,ngscnt
17246       IF ( lhl .gt. 1 .and. ( ehli(mgs) .gt. 0.0 .or. (ipelec > 0 .and. ehliclsn(mgs) > 0.0) )  ) THEN
17247        IF ( ipconc .ge. 5 ) THEN
17249        vt = Sqrt((vtxbar(mgs,lhl,1)-vtxbar(mgs,li,1))**2 +    &
17250      &            0.04*vtxbar(mgs,lhl,1)*vtxbar(mgs,li,1) )
17252           chlaci0(mgs) = 0.25*pi*ehliclsn(mgs)*cx(mgs,lhl)*cx(mgs,li)*vt*   &
17253      &         (  da0lhl(mgs)*xdia(mgs,lhl,3)**2 +     &
17254      &            dab0(lhl,li)*xdia(mgs,lhl,3)*xdia(mgs,li,3) +    &
17255      &            da0(li)*xdia(mgs,li,3)**2 )
17257 !       ELSE
17258 !        chlaci(mgs) =
17259 !     >   ((0.25)*pi)*ehli(mgs)*cx(mgs,li)*cx(mgs,lhl)
17260 !     >  *abs(vtxbar(mgs,lhl,1)-vtxbar(mgs,li,1))
17261 !     >  *(  gf1*xdia(mgs,li,2)
17262 !     >    + 2.0*gf2*xdia(mgs,li,1)*xdia(mgs,lhl,1)
17263 !     >    + gf3*xdia(mgs,lhl,2) )
17264         ENDIF
17266         chlaci(mgs) = min(ehli(mgs)*chlaci0(mgs),cimxd(mgs))
17267        ENDIF
17268       end do
17269       end if
17272       IF ( lis > 1 .and. ipconc .ge. 5) THEN
17273       
17274       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: conc 22kk'
17275       chlacis(:) = 0.0
17276       chlacis0(:) = 0.0
17277        do mgs = 1,ngscnt
17278       IF ( lhl .gt. 1 .and. ( ehlis(mgs) .gt. 0.0 .or. (ipelec > 0 .and. ehlisclsn(mgs) > 0.0) )  ) THEN
17280        vt = Sqrt((vtxbar(mgs,lhl,1)-vtxbar(mgs,lis,1))**2 +    &
17281      &            0.04*vtxbar(mgs,lhl,1)*vtxbar(mgs,lis,1) )
17283           chlacis0(mgs) = 0.25*pi*ehlisclsn(mgs)*cx(mgs,lhl)*cx(mgs,lis)*vt*   &
17284      &         (  da0lhl(mgs)*xdia(mgs,lhl,3)**2 +     &
17285      &            dab0(lhl,lis)*xdia(mgs,lhl,3)*xdia(mgs,lis,3) +    &
17286      &            da0(lis)*xdia(mgs,lis,3)**2 )
17289         chlacis(mgs) = min(ehlis(mgs)*chlacis0(mgs),cxmxd(mgs,lis))
17290        ENDIF
17291       end do
17292       ENDIF
17296       if (ndebug .gt. 0 ) write(0,*) 'ICEZVD_GS: conc 22jj'
17297       chlacs(:) = 0.0
17298       chlacs0(:) = 0.0
17299       if ( ipconc .ge. 1 .or. ipelec .ge. 1 ) then
17300       do mgs = 1,ngscnt
17301       IF ( lhl .gt. 1 .and. ( ehls(mgs) .gt. 0.0 .or. (ipelec > 0 .and. ehlsclsn(mgs) > 0.0) ) ) THEN
17302        IF ( ipconc .ge. 5 ) THEN
17304        vt = Sqrt((vtxbar(mgs,lhl,1)-vtxbar(mgs,ls,1))**2 +    &
17305      &            0.04*vtxbar(mgs,lhl,1)*vtxbar(mgs,ls,1) )
17307           chlacs0(mgs) = 0.25*pi*ehlsclsn(mgs)*cx(mgs,lhl)*cx(mgs,ls)*vt*   &
17308      &         (  da0lhl(mgs)*xdia(mgs,lhl,3)**2 +     &
17309      &            dab0(lhl,ls)*xdia(mgs,lhl,3)*xdia(mgs,ls,3) +    &
17310      &            da0(ls)*xdia(mgs,ls,3)**2 )
17312 !       ELSE
17313 !      chlacs(mgs) =
17314 !     >   ((0.25)*pi)*ehls(mgs)*cx(mgs,ls)*cx(mgs,lhl)
17315 !     >  *abs(vtxbar(mgs,lhl,1)-vtxbar(mgs,ls,1))
17316 !     >  *(  gf3*gf1*xdia(mgs,ls,2)
17317 !     >    + 2.0*gf2*gf2*xdia(mgs,ls,1)*xdia(mgs,lhl,1)
17318 !     >    + gf1*gf3*xdia(mgs,lhl,2) )
17319       ENDIF
17320       chlacs(mgs) = min(ehls(mgs)*chlacs0(mgs),csmxd(mgs))
17321       ENDIF
17322       end do
17323       end if
17326 ! Ziegler (1985) autoconversion
17329       IF ( ipconc .ge. 2 ) THEN
17330       if (ndebug .gt. 0 ) write(0,*) 'conc 26a'
17331       
17332       DO mgs = 1,ngscnt
17333         zrcnw(mgs) = 0.0
17334         qrcnw(mgs) = 0.0
17335         crcnw(mgs) = 0.0
17336         cautn(mgs) = 0.0
17337       ENDDO
17338       
17339       IF ( dmrauto >= -1 ) THEN !{
17340       DO mgs = 1,ngscnt
17341 !      qracw(mgs) = 0.0
17342 !      cracw(mgs) = 0.0
17343        IF ( qx(mgs,lc) .gt. qxmin(lc) .and. cx(mgs,lc) .gt. 1000. .and. temg(mgs) .gt. tfrh+4.) THEN
17344        !( .and. w(igs(mgs),jgs,kgs(mgs)) > 5.0) THEN ! DTD: added w threshold for testing                                                                                                            
17345          volb = xv(mgs,lc)*(1./(1.+alpha(mgs,lc)))**(1./2.)
17346          cautn(mgs) = Min(ccmxd(mgs),   &
17347      &      ((alpha(mgs,lc)+2.)/(alpha(mgs,lc)+1.))*aa1*cx(mgs,lc)**2*xv(mgs,lc)**2)
17348          cautn(mgs) = Max( 0.0d0, cautn(mgs) )
17349          IF ( rb(mgs) .le. 7.51d-6 .or. dmrauto == -1) THEN
17350            t2s = 1.d30
17351 !           cautn(mgs) = 0.0
17352          ELSE
17353 !         XL2P=2.7E-2*XNC*XVC*((1.E12*RB**3*RC)-0.4)
17354          
17355 !        T2S=3.72E-3/(((1.E4*RB)-7.5)*XNC*XVC) 
17356 !           t2s = 3.72E-3/(((1.e6*rb)-7.5)*cx(mgs,lc)*xv(mgs,lc))
17357 !           t2s = 3.72/(((1.e6*rb(mgs))-7.5)*rho0(mgs)*qx(mgs,lc))
17358            t2s = 3.72/(1.e6*(rb(mgs)-7.500d-6)*rho0(mgs)*qx(mgs,lc))
17360            qrcnw(mgs) = Max( 0.0d0, xl2p(mgs)/(t2s*rho0(mgs)) )
17361            crcnw(mgs) = Max( 0.0d0, Min(3.5e9*xl2p(mgs)/t2s,0.5*cautn(mgs)) )
17362            
17363            IF ( dmrauto == 0 ) THEN
17364              IF ( qx(mgs,lr)*rho0(mgs) > 1.2*xl2p(mgs) .and. cx(mgs,lr) > cxmin ) THEN ! Cohard and Pinty (2000a) switch over from (18) to (19)
17365                crcnw(mgs) = cx(mgs,lr)/qx(mgs,lr)*qrcnw(mgs)
17366              ELSEIF ( ( dmropt == 1 .or. dmropt == 3 ) .and. qx(mgs,lr) > qxmin(lr) ) THEN
17367                tmp = qrcnw(mgs)*cx(mgs,lr)/qx(mgs,lr)
17368                crcnw(mgs) = Min(tmp,crcnw(mgs) )
17369              ELSEIF ( ( dmropt == 4 ) .and. qx(mgs,lr) > qxmin(lr) ) THEN
17370                tmp = crcnw(mgs)
17371                tmp2 = qrcnw(mgs)*cx(mgs,lr)/qx(mgs,lr)
17372                ! try mass-weighted average of old and new Dmr using converted qc mass
17373                crcnw(mgs) = (tmp*qrcnw(mgs)+tmp2*qx(mgs,lr))/(qrcnw(mgs)+qx(mgs,lr))
17374              ELSEIF ( ( dmropt == 5 ) .and. qx(mgs,lr) > qxmin(lr) ) THEN
17375                tmp = crcnw(mgs)
17376                tmp2 = qrcnw(mgs)*cx(mgs,lr)/qx(mgs,lr)
17377                ! try mass-weighted average of old and new Dmr using full qc mass
17378                crcnw(mgs) = (tmp*qx(mgs,lc)+tmp2*qx(mgs,lr))/(qx(mgs,lc)+qx(mgs,lr))
17379              ELSEIF ( ( dmropt == 6 ) .and. qx(mgs,lr) > qxmin(lr) ) THEN
17380                tmp = crcnw(mgs)
17381                tmp2 = qrcnw(mgs)*cx(mgs,lr)/qx(mgs,lr)
17382                ! try mass*diameter-weighted average of old and new Dmr (using full qc mass)
17383                crcnw(mgs) = (tmp*xdia(mgs,lc,3)*qx(mgs,lc)+tmp2*xdia(mgs,lr,3)*qx(mgs,lr))/(xdia(mgs,lc,3)*qx(mgs,lc)+xdia(mgs,lr,3)*qx(mgs,lr))
17384              ELSEIF ( ( dmropt == 7 ) .and. qx(mgs,lr) > qxmin(lr) ) THEN
17385                tmp = crcnw(mgs)
17386                tmp2 = qrcnw(mgs)*cx(mgs,lr)/qx(mgs,lr)
17387                ! try diameter-weighted average of old and new Dmr
17388                crcnw(mgs) = (tmp*xdia(mgs,lc,3)+tmp2*xdia(mgs,lr,3))/(xdia(mgs,lc,3)+xdia(mgs,lr,3))
17389              ELSEIF ( ( dmropt == 8 ) .and. qx(mgs,lr) > qxmin(lr) ) THEN
17390                tmp = crcnw(mgs)
17391                tmp2 = qrcnw(mgs)*cx(mgs,lr)/qx(mgs,lr)
17392                ! try sqrt(diameter)-weighted average of old and new Dmr
17393                crcnw(mgs) = (tmp*sqrt(xdia(mgs,lc,3))+tmp2*sqrt(xdia(mgs,lr,3)))/(sqrt(xdia(mgs,lc,3))+sqrt(xdia(mgs,lr,3)))
17394              ENDIF
17395            ELSEIF ( dmrauto == 1  .and. cx(mgs,lr) > cxmin) THEN
17396              IF ( qx(mgs,lr) > qxmin(lr) ) THEN
17397                tmp = qrcnw(mgs)*cx(mgs,lr)/qx(mgs,lr)
17398                crcnw(mgs) = Min(tmp,crcnw(mgs) )
17399              ENDIF
17400            ELSEIF ( dmrauto == 2  .and. cx(mgs,lr) > cxmin) THEN
17401                tmp = crcnw(mgs)
17402                tmp2 = qrcnw(mgs)*cx(mgs,lr)/qx(mgs,lr)
17403                ! try mass-weighted average of old and new Dmr
17404                crcnw(mgs) = (tmp*qrcnw(mgs)+tmp2*qx(mgs,lr))/(qrcnw(mgs)+qx(mgs,lr))
17405            ELSEIF ( dmrauto == 3  .and. cx(mgs,lr) > cxmin) THEN ! adapted from MY/CP code
17406               tmp = Max( 2.d0*rh(mgs), dble( xdia(mgs,lr,3) ) )
17407               crcnw(mgs) = rho0(mgs)*qrcnw(mgs)/(pi/6.*1000.*tmp**3)
17408            ENDIF
17409            
17410            IF ( crcnw(mgs) < 1.e-30 ) qrcnw(mgs) = 0.0
17412            IF ( ipconc >= 6 ) THEN
17413            IF ( lzr > 1 .and. qrcnw(mgs) > 0.0 ) THEN
17414 !            vr = rho0(mgs)*qrcnw(mgs)/(1000.*crcnw(mgs))
17415 !            zrcnw(mgs) = 36.*(xnu(lr)+2.0)*crcnw(mgs)*vr**2/((xnu(lr)+1.0)*pi**2)
17416              ! DTD: If rain exists at a grid point already either use the alpha-preserving Z-rate eqn. (dmrauto == 1)
17417              ! or a mass-weighted average of the alpha-preserving Z-rate eqn. and the init. rate eqn. (dmrauto == 2)
17418              ! or the original initiation rate equation (dmrauto == 0).  Not sure if this is the correct way to go but seems to work ok.
17419              IF (qx(mgs,lr) .gt. qxmin(lr) .and. ( dmrauto == 1 .or. dmrauto ==2 ) ) THEN
17420               tmp3 = qx(mgs,lr)/cx(mgs,lr)
17421               tmp4 =  g1x(mgs,lr)*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2* &
17422      &                 ( 2.*tmp3 * qrcnw(mgs) - tmp3**2 * crcnw(mgs)  )
17423               if (imurain == 3) then
17424                 vr = rho0(mgs)*qrcnw(mgs)/(1000.)
17425                 tmp3 = 36.*(xnu(lc)+2.0)*vr**2/(crcnw(mgs)*(xnu(lc)+1.0)*pi**2)
17426               else
17427                 tmp3 = galpharaut*(6.*rho0(mgs)*qrcnw(mgs)/(pi*xdn0(lr)))**2/crcnw(mgs)
17428               endif
17429               IF ( dmrauto == 1 ) THEN ! Preserve alpha
17430                 zrcnw(mgs) = tmp4
17431               ELSEIF ( dmrauto == 2 ) THEN ! Mass-weighted average
17432                 zrcnw(mgs) = (tmp3*qrcnw(mgs)+tmp4*qx(mgs,lr))/(qrcnw(mgs)+qx(mgs,lr))
17433               ENDIF
17434              else ! original formulation
17435               IF ( imurain == 3 ) THEN
17436                 vr = rho0(mgs)*qrcnw(mgs)/(1000.) ! crcnw(mgs) not divided here but is in next line, cancels one factor in the numerator
17437                 zrcnw(mgs) = 36.*(xnu(lc)+2.0)*vr**2/(crcnw(mgs)*(xnu(lc)+1.0)*pi**2)
17438               ELSE ! rain in gamma of diameter
17439                 IF ( dmropt <= 1 .or. dmropt >= 4 .or. ( qx(mgs,lr) < qxmin(lr) .and. cx(mgs,lr) < cxmin ) ) THEN
17440                   zrcnw(mgs) = galpharaut*(6.*rho0(mgs)*qrcnw(mgs)/(pi*xdn0(lr)))**2/crcnw(mgs)
17441                 ELSE
17442                   tmp3 = qx(mgs,lr)/cx(mgs,lr)
17443                   zrcnw(mgs) =  g1x(mgs,lr)*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2* &
17444      &                 ( 2.*tmp3 * qrcnw(mgs) - tmp3**2 * crcnw(mgs)  )
17445                 ENDIF
17446 !             vr = rho0(mgs)*qrcnw(mgs)/(1000.) ! crcnw(mgs) not divided here but is in next line, cancels one factor in the numerator
17447 !             zrcnw(mgs) = 36.*(xnu(lc)+2.0)*vr**2/(crcnw(mgs)*(xnu(lc)+1.0)*pi**2)
17448               ENDIF
17449              endif
17450 !             z  = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/((alpha(mgs,lr)+1.0)*pi**2)
17451            ENDIF 
17452            ENDIF ! ipconc >= 6
17453 !           IF (  crcnw(mgs) .gt. cautn(mgs) .and. crcnw(mgs) .gt. 1.0 )
17454 !     :          THEN
17455 !             write(0,*)  'crcnw,cautn ',crcnw(mgs)/cautn(mgs),
17456 !     :          crcnw(mgs),cautn(mgs),igs(mgs),kgs(mgs),t2s,qx(mgs,lr)
17457 !             write(0,*)  '            ',qx(mgs,lc),cx(mgs,lc),0.5e6*xdia(mgs,lc,1)
17458 !             write(0,*)  '            ',rho0(mgs)*qrcnw(mgs)/crcnw(mgs),
17459 !     :         1.e6*(( 3/(4.*pi))*rho0(mgs)*qrcnw(mgs)/
17460 !     :       (crcnw(mgs)*xdn(mgs,lr)))**(1./3.),rh(mgs)*1.e6,rwrad(mgs)
17461 !           ELSEIF ( crcnw(mgs) .gt. 1.0 .and. cautn(mgs) .gt. 0.) THEN
17462 !             write(0,*)  'crcnw,cautn ',crcnw(mgs)/cautn(mgs),
17463 !     :          crcnw(mgs),cautn(mgs),igs(mgs),kgs(mgs),t2s
17464 !             write(0,*)  '            ',rho0(mgs)*qrcnw(mgs)/crcnw(mgs),
17465 !     :  1.e6*(( 3*pi/4.)*rho0(mgs)*qrcnw(mgs)/
17466 !     :   (crcnw(mgs)*xdn(mgs,lr)))**(1./3.)
17467 !           ENDIF
17468 !           crcnw(mgs) = Min(cautn(mgs),3.5e9*xl2p(mgs)/t2s)
17470 !           IF ( qrcnw(mgs) .gt. 0.3e-2 ) THEN
17471 !            write(0,*)  'QRCNW'
17472 !            write(0,*)  qrcnw(mgs),crcnw(mgs),cautn(mgs)
17473 !            write(0,*)  xl2p,t2s,rho0(mgs),xv(mgs,lc),cx(mgs,lc),qx(mgs,lc)
17474 !            write(0,*)  rb,0.5*xdia(mgs,lc,1),mgs,igs(mgs),kgs(mgs)
17475 !           ENDIF
17476 !           qrcnw(mgs) = Min(qrcnw(mgs),qcmxd(mgs))
17477          ENDIF
17480        ENDIF
17481       ENDDO
17482       
17483       ENDIF !} dmrauto >= 0
17487       ELSE
17490 !  Berry 1968 auto conversion for rain (Orville & Kopp 1977)
17493       if ( ircnw .eq. 4 ) then
17494       do mgs = 1,ngscnt
17495 !      sconvmix(lcw,mgs) = 0.0
17496       qrcnw(mgs) =  0.0
17497       qdiff = max((qx(mgs,lc)-qminrncw),0.0)
17498       if ( qdiff .gt. 0.0 .and. xdia(mgs,lc,1) .gt. 20.0e-6 ) then
17499       argrcnw =   &
17500      &  ((1.2e-4)+(1.596e-12)*(cx(mgs,lc)*1.0e-6)   &
17501      &  /(cwdisp*qdiff*1.0e-3*rho0(mgs)))
17502       qrcnw(mgs) = (rho0(mgs)*1e-3)*(qdiff**2)/argrcnw
17503 !      sconvmix(lcw,mgs) = max(sconvmix(lcw,mgs),0.0)
17504       qrcnw(mgs) = (max(qrcnw(mgs),0.0))
17505       end if
17506       end do
17508       ENDIF
17512 !  Berry 1968 auto conversion for rain (Ferrier 1994)
17515       if ( ircnw .eq. 5 ) then
17516       do mgs = 1,ngscnt
17517       qrcnw(mgs) = 0.0
17518       qrcnw(mgs) =  0.0
17519       qccrit = (pi/6.)*(cx(mgs,lc)*cwdiap**3)*xdn(mgs,lc)/rho0(mgs)
17520       qdiff = max((qx(mgs,lc)-qccrit),0.)
17521       if ( qdiff .gt. 0.0 .and. cx(mgs,lc) .gt. 1.0 ) then
17522       argrcnw = &
17523 !     >  ((1.2e-4)+(1.596e-12)*cx(mgs,lc)/(cwdisp*rho0(mgs)*qdiff))   &
17524      &  ((1.2e-4)+(1.596e-12)*cx(mgs,lc)*1.0e-3/(cwdisp*rho0(mgs)*qdiff))
17525       qrcnw(mgs) = &
17526 !     >  timflg(mgs)*rho0(mgs)*(qdiff**2)/argrcnw   &
17527      &  1.0e-3*rho0(mgs)*(qdiff**2)/argrcnw
17528       qrcnw(mgs) = Min(qxmxd(mgs,lc), (max(qrcnw(mgs),0.0)) )
17530 !      write(iunit,*) 'qrcnw,cx =',qrcnw(mgs),cx(mgs,lc),mgs,1.e3*qx(mgs,lc),cno(lr)
17531       end if
17532       end do
17533       end if
17537 !  kessler auto conversion for rain.
17539       if ( ircnw .eq. 2 ) then
17540       do mgs = 1,ngscnt
17541       qrcnw(mgs) = 0.0
17542       qrcnw(mgs) = (0.001)*max((qx(mgs,lc)-qminrncw),0.0)
17543       end do
17544       end if
17546 !  c4 = pi/6
17547 !  c1 = 0.12-0.32 for colorado storms...typically 0.3-0.4
17548 !  berry reinhart type conversion (proctor 1988)
17550       if ( ircnw .eq. 1 ) then
17551       do mgs = 1,ngscnt
17552       qrcnw(mgs) = 0.0
17553       c1 = 0.2
17554       c4 = pi/(6.0)
17555       bradp =    &
17556      & (1.e+06) * ((c1/(0.38))**(1./3.)) * (xdia(mgs,lc,1)*(0.5))
17557       bl2 =   &
17558      & (0.027) * ((100.0)*(bradp**3)*(xdia(mgs,lc,1)*(0.5)) - (0.4))
17559       bt2 = (bradp -7.5) / (3.72)
17560       qrcnw(mgs) = 0.0
17561       if ( bl2 .gt. 0.0 .and. bt2 .gt. 0.0 ) then
17562       qrcnw(mgs) = bl2 * bt2 * rho0(mgs)   &
17563      &  * qx(mgs,lc) * qx(mgs,lc)
17564       end if
17565       end do
17566       end if
17570       ENDIF  !  ( ipconc .ge. 2 )
17575 !  Bigg Freezing of Rain
17577       if (ndebug .gt. 0 ) write(0,*) 'conc 27a'
17578       qrfrz(:) = 0.0
17579       qrfrzs(:) = 0.0
17580       qrfrzf(:) = 0.0
17581       vrfrzf(:) = 0.0
17582       crfrz(:) = 0.0
17583       crfrzs(:) = 0.0
17584       crfrzf(:) = 0.0
17585       zrfrz(:)  = 0.0
17586       zrfrzs(:)  = 0.0
17587       zrfrzf(:)  = 0.0
17588       qwcnr(:) = 0.0
17589       
17590       IF ( .not. ( ipconc == 0 .and. lwsm6 ) ) THEN
17591       
17592       do mgs = 1,ngscnt 
17593       if ( qx(mgs,lr) .gt. qxmin(lr) .and. temcg(mgs) .lt. -5. .and. ibiggopt > 0 ) then
17594 !      brz = 100.0
17595 !      arz = 0.66
17596        IF ( ipconc .lt. 3 ) THEN
17597        qrfrz(mgs) =    &
17598      &  min(   &
17599      &  (20.0)*(pi**2)*brz*(xdn(mgs,lr)/rho0(mgs))   &
17600      &   *cx(mgs,lr)*(xdia(mgs,lr,1)**6)   &
17601      &   *(exp(max(-arz*temcg(mgs), 0.0))-1.0)   &
17602      &  , qrmxd(mgs))
17603         qrfrzf(mgs) = qrfrz(mgs)
17605 !       ELSEIF ( ipconc .ge. 3 .and. xv(mgs,lr) .gt. 1.1*xvmn(lr) ) THEN
17606        ELSEIF ( ipconc .ge. 3 ) THEN
17607 !         tmp = brz*cx(mgs,lr)*(Exp(Max( -arz*temcg(mgs), 0.0 )) - 1.0)
17608 !         crfrz(mgs) = xv(mgs,lr)*tmp
17610          frach = 1.0d0
17611          
17612 !         IF ( ibiggopt == 2 .and. imurain == 1 .and. lzr < 1 ) THEN ! lzr check because results are weird for 3-moment
17613          IF ( ibiggopt == 2 .and. imurain == 1 ) THEN !
17614          ! integrate from Bigg diameter (for given supercooling Ts) to infinity
17615            
17616            volt = exp( 16.2 + 1.0*temcg(mgs) )* 1.0e-6 !  Ts == -temcg ; volt comes from the fit in Fig. 1 in Bigg 1953 (Proc. Phys. Soc. London) 
17617                                                ! for mean temperature for freezing: -ln (V) = a*Ts - b, where a = 6.9/6.8, or approx a = 1.0, and b = 16.2
17618                                                ! volt is given in cm**3, so convert to m**3
17619            dbigg = (6./pi* volt )**(1./3.) 
17620            
17621            ! perhaps should also test that W > V_t_dbigg, i.e., that drops the size of dbigg are being lifted and cooled. 
17622            IF ( dbigg < 8.e-3 ) THEN !{ only bother if freezing diameter is reasonable
17623            
17624              ratio = Min(maxratiolu, dbigg/xdia(mgs,lr,1) )
17625            
17626            i = Min(nqiacrratio,Int(ratio*dqiacrratioinv))
17627            IF ( alp0flag ) THEN
17628            j = Int(Max(0.0,Min(15.,alpha(mgs,lr)))*dqiacralphainv)
17629            ELSE
17630            j = Int(Max(minalphalu,Min(maxalphalu,alpha(mgs,lr)))*dqiacralphainv)
17631            ENDIF
17632            delx = ratio - float(i)*dqiacrratio
17633            dely = alpha(mgs,lr) - float(j)*dqiacralpha
17634            ip1 = Min( i+1, nqiacrratio )
17635            jp1 = Min( j+1, nqiacralpha )
17637            ! interpolate along x, i.e., ratio; 
17638            tmp1 = ciacrratio(i,j) + delx*dqiacrratioinv*(ciacrratio(ip1,j) - ciacrratio(i,j))
17639            tmp2 = ciacrratio(i,jp1) + delx*dqiacrratioinv*(ciacrratio(ip1,jp1) - ciacrratio(i,jp1))
17640            
17641            ! interpolate along alpha; 
17642            
17643            crfrz(mgs) = (tmp1 + dely*dqiacralphainv*(tmp2 - tmp1))*cx(mgs,lr)*dtpinv
17644            crfrzf(mgs) = crfrz(mgs)
17645            ! interpolate along x, i.e., ratio; 
17646            tmp1 = qiacrratio(i,j) + delx*dqiacrratioinv*(qiacrratio(ip1,j) - qiacrratio(i,j))
17647            tmp2 = qiacrratio(i,jp1) + delx*dqiacrratioinv*(qiacrratio(ip1,jp1) - qiacrratio(i,jp1))
17648            
17649            ! interpolate along alpha; 
17650            
17651            qrfrz(mgs) = (tmp1 + dely*dqiacralphainv*(tmp2 - tmp1))*qx(mgs,lr)*dtpinv
17652            qrfrzf(mgs) = qrfrz(mgs)
17654            IF ( qrfrz(mgs)*dtp < qxmin(lh) .or. crfrz(mgs)*dtp < cxmin ) THEN
17655            
17656              crfrz(mgs) = 0.0
17657              qrfrz(mgs) = 0.0
17658              qrfrzf(mgs) = 0.0
17659             
17660            ELSE !{
17662             
17663            IF ( ipconc >= 6 .and. lzr > 1 ) THEN
17664            ! interpolate along x, i.e., ratio; 
17665             tmp1 = ziacrratio(i,j) + delx*dqiacrratioinv*(ziacrratio(ip1,j) - ziacrratio(i,j))
17666             tmp2 = ziacrratio(i,jp1) + delx*dqiacrratioinv*(ziacrratio(ip1,jp1) - ziacrratio(i,jp1))
17667            
17668            ! interpolate along alpha; 
17669            
17670             zrfrz(mgs) = (tmp1 + dely*dqiacralphainv*(tmp2 - tmp1))*zx(mgs,lr)*dtpinv
17671            ENDIF
17672            
17673             IF ( ibiggsmallrain > 0 .and. xv(mgs,lr) < 2.*xvmn(lr) .and. ( ibiggsnow == 1 .or. ibiggsnow == 3 ) ) THEN
17674 !            IF ( ibiggsmallrain > 0 .and. xv(mgs,lr) < xvbiggsnow .and. ( ibiggsnow == 1 .or. ibiggsnow == 3 ) ) THEN
17675              ! rain drops are so small that they cannot be pushed smaller, so put into snow (or cloud ice, depending on ifrzs)
17676               crfrzf(mgs) = 0.0
17677               qrfrzf(mgs) = 0.0
17678               crfrzs(mgs) = crfrz(mgs)
17679               qrfrzs(mgs) = qrfrz(mgs)
17681               IF ( ipconc >= 6 .and. lzr > 1 ) THEN
17682                 zrfrzs(mgs) = zrfrz(mgs)
17683                 zrfrzf(mgs) = 0.
17684               ENDIF
17685            ELSEIF ( dbigg < Max( biggsnowdiam, Max(dfrz,dhmn)) .and. ( ibiggsnow == 1 .or. ibiggsnow == 3 ) ) THEN ! { convert some to snow or ice crystals
17686             ! temporarily store qrfrz and crfrz in snow terms and caclulate new crfrzf, qrfrzf, and zrfrzf. Leave crfrz etc. alone!
17687             
17688             crfrzs(mgs) = crfrz(mgs)
17689             qrfrzs(mgs) = qrfrz(mgs)
17690             
17691             IF ( ibiggsmallrain > 0 .and. xv(mgs,lr) < 1.2*xvmn(lr) ) THEN
17692              ! rain drops are so small that they cannot be pushed smaller, so put into snow (or cloud ice, depending on ifrzs)
17693             crfrzf(mgs) = 0.0
17694             qrfrzf(mgs) = 0.0
17696              IF (ipconc >= 6 .and. lzr > 1 ) THEN
17697                zrfrzs(mgs) = zrfrz(mgs)
17698                zrfrzf(mgs) = 0.
17699              ENDIF
17700             ELSE !{
17701             
17702            ! recalculate using dhmn for ratio
17703            ratio = Min( maxratiolu, Max(dfrz,dhmn)/xdia(mgs,lr,1) )
17704            
17705            i = Min(nqiacrratio,Int(ratio*dqiacrratioinv))
17706 !           j = Int(Max(0.0,Min(15.,alpha(mgs,lr)))*dqiacralphainv)
17707 !           j = Int(Max(alphamin,Min(alphamax,alpha(mgs,lr)))*dqiacralphainv)
17708            IF ( alp0flag ) THEN
17709            j = Int(Max(0.0,Min(15.,alpha(mgs,lr)))*dqiacralphainv)
17710            ELSE
17711            j = Int(Max(minalphalu,Min(maxalphalu,alpha(mgs,lr)))*dqiacralphainv)
17712            ENDIF
17713            delx = ratio - float(i)*dqiacrratio
17714            dely = alpha(mgs,lr) - float(j)*dqiacralpha
17715            ip1 = Min( i+1, nqiacrratio )
17716            jp1 = Min( j+1, nqiacralpha )
17718            ! interpolate along x, i.e., ratio; 
17719            tmp1 = ciacrratio(i,j) + delx*dqiacrratioinv*(ciacrratio(ip1,j) - ciacrratio(i,j))
17720            tmp2 = ciacrratio(i,jp1) + delx*dqiacrratioinv*(ciacrratio(ip1,jp1) - ciacrratio(i,jp1))
17723            ! interpolate along alpha; 
17724            
17725            crfrzf(mgs) = (tmp1 + dely*dqiacralphainv*(tmp2 - tmp1))*cx(mgs,lr)*dtpinv
17726            
17727            ! interpolate along x, i.e., ratio; 
17728            tmp1 = qiacrratio(i,j) + delx*dqiacrratioinv*(qiacrratio(ip1,j) - qiacrratio(i,j))
17729            tmp2 = qiacrratio(i,jp1) + delx*dqiacrratioinv*(qiacrratio(ip1,jp1) - qiacrratio(i,jp1))
17730            
17731            ! interpolate along alpha; 
17732            
17733            qrfrzf(mgs) = (tmp1 + dely*dqiacralphainv*(tmp2 - tmp1))*qx(mgs,lr)*dtpinv
17735            ! now subtract off the difference
17736             crfrzs(mgs) = crfrzs(mgs) - crfrzf(mgs)
17737             qrfrzs(mgs) = qrfrzs(mgs) - qrfrzf(mgs)
17739            IF ( ipconc >= 6 .and. lzr > 1 ) THEN
17740             zrfrzs(mgs) = zrfrz(mgs)
17741            ! interpolate along x, i.e., ratio; 
17742             tmp1 = ziacrratio(i,j) + delx*dqiacrratioinv*(ziacrratio(ip1,j) - ziacrratio(i,j))
17743             tmp2 = ziacrratio(i,jp1) + delx*dqiacrratioinv*(ziacrratio(ip1,jp1) - ziacrratio(i,jp1))
17744            
17745            ! interpolate along alpha; 
17746            
17747             zrfrzf(mgs) = (tmp1 + dely*dqiacralphainv*(tmp2 - tmp1))*zx(mgs,lr)*dtpinv
17748             zrfrzs(mgs) = zrfrzs(mgs) - zrfrzf(mgs)
17749             zrfrzf(mgs) = (1000./900.)**2*zrfrzf(mgs)
17750            ENDIF
17751             ENDIF ! }
17752            ELSE
17753             crfrzs(mgs) = 0.0
17754             qrfrzs(mgs) = 0.0
17755             zrfrzs(mgs) = 0.0
17756            ENDIF ! }
17757            
17758            ENDIF !}
17759            
17760            IF ( (qrfrz(mgs))*dtp > qx(mgs,lr) ) THEN
17761              fac = ( qrfrz(mgs) )*dtp/qx(mgs,lr)
17762              qrfrz(mgs) = fac*qrfrz(mgs)
17763              qrfrzs(mgs) = fac*qrfrzs(mgs)
17764              qrfrzf(mgs) = fac*qrfrzf(mgs)
17765              crfrz(mgs) = fac*crfrz(mgs)
17766              crfrzs(mgs) = fac*crfrzs(mgs)
17767              crfrzf(mgs) = fac*crfrzf(mgs)
17768              IF ( ipconc >= 6 .and. lzr > 1 ) THEN
17769                zrfrz(mgs) = fac*zrfrz(mgs)
17770                zrfrzf(mgs) = fac*zrfrzf(mgs)
17771              ENDIF
17772            ENDIF
17773            
17774             ENDIF !}
17776 !           IF ( (crfrzs(mgs) + crfrz(mgs))*dtp > cx(mgs,lr) ) THEN
17777 !             fac = ( crfrzs(mgs) + crfrz(mgs) )*dtp/cx(mgs,lr)
17778 !             crfrz(mgs) = fac*crfrz(mgs)
17779 !             crfrzs(mgs) = fac*crfrzs(mgs)
17780 !           ENDIF
17781            
17782 !           qrfrzf(mgs) = qrfrz(mgs)
17783 !           crfrzf(mgs) = crfrz(mgs)
17784            
17785    !        qrfrz(mgs) = qrfrzf(mgs) + qrfrzs(mgs)
17786    !        crfrz(mgs) = crfrzf(mgs) + crfrzs(mgs)
17788            
17789          ELSEIF ( ibiggopt == 1 ) THEN
17790          ! Z85, eq. A34
17791          tmp = xv(mgs,lr)*brz*cx(mgs,lr)*(Exp(Max( -arz*temcg(mgs), 0.0 )) - 1.0)
17792          IF ( .false. .and. tmp .gt. cxmxd(mgs,lr) ) THEN ! {
17793 !           write(iunit,*) 'Bigg Freezing problem!',mgs,igs(mgs),kgs(mgs)
17794 !           write(iunit,*)  'tmp, cx(lr), xv = ',tmp, cx(mgs,lr), xv(mgs,lr), (Exp(Max( -arz*temcg(mgs), 0.0 )) - 1.0)
17795 !           write(iunit,*)  'qr,temcg = ',qx(mgs,lr)*1000.,temcg(mgs)
17796            crfrz(mgs) = cxmxd(mgs,lr) ! cx(mgs,lr)*dtpinv
17797            qrfrz(mgs) = qxmxd(mgs,lr) ! qx(mgs,lr)*dtpinv
17798 !           STOP
17799          ELSE ! } {
17800          crfrz(mgs) = tmp
17801  !        crfrzfmx = cx(mgs,lr)*Exp(-4./3.*pi*(40.e-6)**3/xv(mgs,lr))
17802  !        IF ( crfrz(mgs) .gt. crfrzmx ) THEN
17803  !          crfrz(mgs) = crfrzmx
17804  !          qrfrz(mgs) = bfnu*xmas(mgs,lr)*rhoinv(mgs)*crfrzmx
17805  !          qwcnr(mgs) = cx(mgs,lr) - crfrzmx
17806  !        ELSE
17807          IF ( lzr < 1 ) THEN
17808            IF ( imurain == 3 ) THEN
17809              bfnu = bfnu0
17810            ELSE !imurain == 1
17811              bfnu = bfnu1
17812            ENDIF
17813          ELSE
17814  !         bfnu = 1.0 ! (alpha(mgs,lr)+2.0)/(alpha(mgs,lr)+1.)
17815            IF ( imurain == 3 ) THEN
17816              bfnu = (alpha(mgs,lr)+2.0)/(alpha(mgs,lr)+1.)
17817            ELSE !imurain == 1
17818 !             bfnu = bfnu1
17819             bfnu = (4. + alpha(mgs,lr))*(5. + alpha(mgs,lr))*(6. + alpha(mgs,lr))/  &
17820      &            ((1. + alpha(mgs,lr))*(2. + alpha(mgs,lr))*(3. + alpha(mgs,lr)))
17821 !            bfnu = 1.
17822            ENDIF
17823          ENDIF 
17824          qrfrz(mgs) = bfnu*xmas(mgs,lr)*rhoinv(mgs)*crfrz(mgs)
17826          qrfrz(mgs) = Min( qrfrz(mgs), 1.*qx(mgs,lr)*dtpinv ) ! qxmxd(mgs,lr) 
17827          crfrz(mgs) = Min( crfrz(mgs), 1.*cx(mgs,lr)*dtpinv ) !cxmxd(mgs,lr) 
17828          qrfrz(mgs) = Min( qrfrz(mgs), qx(mgs,lr) )
17829          qrfrzf(mgs) = qrfrz(mgs)
17830          ENDIF !}
17832          
17833          
17834          
17835          IF ( crfrz(mgs) .gt. qxmin(lh) ) THEN !{ Yes, it compares cx and qxmin, but this is just to be sure that 
17836                                                   ! crfrz is greater than zero in the division
17837 !          IF ( xdia(mgs,lr,1) .lt. 200.e-6 ) THEN
17838 !           IF ( xv(mgs,lr) .lt. xvmn(lh) ) THEN
17839            
17840            IF ( (ibiggsnow == 1 .or. ibiggsnow == 3 ) .and. ibiggopt /= 2 ) THEN
17841            xvfrz = rho0(mgs)*qrfrz(mgs)/(crfrz(mgs)*900.) ! mean volume of frozen drops; 900. for frozen drop density
17842            frach = 0.5 *(1. +  Tanh(0.2e12 *( xvfrz - 1.15*xvmn(lh))))
17844              qrfrzs(mgs) = (1.-frach)*qrfrz(mgs)
17845              crfrzs(mgs) = (1.-frach)*crfrz(mgs) ! *rzxh(mgs)
17846 !             qrfrzf(mgs) = frach*qrfrz(mgs)
17847            
17848            ENDIF
17849            
17850            IF ( ipconc .ge. 14 .and. 1.e-3*rho0(mgs)*qrfrz(mgs)/crfrz(mgs) .lt. xvmn(lh) ) THEN
17851              qrfrzs(mgs) = qrfrz(mgs)
17852              crfrzs(mgs) = crfrz(mgs) ! *rzxh(mgs)
17853            ELSE
17854 !           crfrz(mgs) = Min( crfrz(mgs), 0.1*cx(mgs,lr)*dtpinv ) ! cxmxd(mgs,lr) 
17855 !           qrfrz(mgs) = Min( qrfrz(mgs), 0.1*qx(mgs,lr)*dtpinv ) ! qxmxd(mgs,lr) 
17856              qrfrzf(mgs) = frach*qrfrz(mgs)
17857 !             crfrzf(mgs) = Min( qrfrz(mgs)*rho0(mgs)/(xdn(mgs,lh)*vgra), crfrz(mgs) )
17858             IF ( ibfr .le. 1 ) THEN
17859              crfrzf(mgs) = frach*Min(crfrz(mgs), qrfrz(mgs)/(bfnu*1.0*vr1mm*1000.0)*rho0(mgs) ) ! rzxh(mgs)*crfrz(mgs)
17860             ELSEIF ( ibfr .eq. 5 ) THEN
17861              crfrzf(mgs) = frach*Min(crfrz(mgs), qrfrz(mgs)/(bfnu*vfrz*1000.0)*rho0(mgs) )*rzxh(mgs)  !*crfrz(mgs)
17862             ELSEIF ( ibfr .eq. 2 ) THEN
17863              crfrzf(mgs) = frach*Min(crfrz(mgs), qrfrz(mgs)/(bfnu*vfrz*1000.0)*rho0(mgs) ) ! rzxh(mgs)*crfrz(mgs)
17864             ELSEIF ( ibfr .eq. 6 ) THEN
17865              crfrzf(mgs) = frach*Max(crfrz(mgs), qrfrz(mgs)/(bfnu*9.*xv(mgs,lr)*1000.0)*rho0(mgs) ) ! rzxh(mgs)*crfrz(mgs)
17866             ELSE
17867              crfrzf(mgs) = frach*crfrz(mgs)
17868             ENDIF 
17869 !             crfrzf(mgs) = Min(crfrz(mgs), qrfrz(mgs)/(bfnu*xvmn(lh)*1000.0)*rho0(mgs) ) ! rzxh(mgs)*crfrz(mgs)
17870 !            IF ( lz(lr) > 1 .and. lz(lh) > 1 ) THEN
17871 !              crfrzf(mgs) = crfrz(mgs)
17872 !            ENDIF
17873             
17874            ENDIF
17875 !         crfrz(mgs) = Min( cxmxd(mgs,lr), rho0(mgs)*qrfrz(mgs)/xmas(mgs,lr) )
17876          ELSE
17877           crfrz(mgs) = 0.0
17878           qrfrz(mgs) = 0.0
17879          ENDIF !}
17881          ENDIF ! ibiggopt
17883           IF ( lvol(lh) .gt. 1 ) THEN
17884            vrfrzf(mgs) = rho0(mgs)*qrfrzf(mgs)/rhofrz
17885           ENDIF
17887         
17888         IF ( nsplinter .ne. 0 ) THEN
17889           IF ( nsplinter .ge. 1000 ) THEN
17890            ! Lawson et al. 2015 JAS
17891            ! ave. diam of freezing drops in microns
17892             tmp = 0
17893             IF ( qrfrz(mgs)*dtp > qxmin(lh) .and. crfrz(mgs) > 1.e-3 ) THEN
17894               tmpdiam = 1.e6*( 6.*qrfrz(mgs)/(1000.*pi*crfrz(mgs) ))**(1./3.)  ! avg. diameter of newly frozen drops in microns
17895               tmp = lawson_splinter_fac*tmpdiam**4*crfrz(mgs)
17896             ENDIF
17897           ELSEIF ( nsplinter .gt. 0 ) THEN
17898             tmp = nsplinter*crfrz(mgs)
17899           ELSE
17900             tmp = -nsplinter*crfrzf(mgs)
17901           ENDIF
17902           csplinter2(mgs) = tmp
17903           qsplinter2(mgs) = Min(0.1*qrfrz(mgs), tmp*splintermass/rho0(mgs) ) ! makes splinters smaller if too much mass is taken from graupel
17905 !          csplinter(mgs) = csplinter(mgs) + tmp
17906 !          qsplinter(mgs) = qsplinter(mgs) + Min(0.1*qrfrz(mgs), tmp*splintermass/rho0(mgs) ) ! makes splinters smaller if too much mass is taken from graupel
17907         ENDIF
17908 !         IF ( temcg(mgs) .lt. -31.0 ) THEN
17909 !           qrfrz(mgs) = qx(mgs,lr)*dtpinv + qrcnw(mgs)
17910 !           qrfrzf(mgs) = qrfrz(mgs)
17911 !           crfrz(mgs) = cx(mgs,lr)*dtpinv + crcnw(mgs)
17912 !           crfrzf(mgs) = Min(crfrz(mgs), qrfrz(mgs)/(bfnu*1.0*vr1mm*1000.0)*rho0(mgs) ) ! rzxh(mgs)*crfrz(mgs)
17913 !         ENDIF
17914 !         qrfrz(mgs) = 6.0*xdn(mgs,lr)*xv(mgs,lr)**2*tmp*rhoinv(mgs)
17915 !         qrfrz(mgs) = Min( qrfrz(mgs), ffrz*qrmxd(mgs) )
17916 !         crfrz(mgs) = Min( crmxd(mgs), ffrz*crfrz(mgs))
17917 !         crfrz(mgs) = Min(crmxd(mgs),qrfrz(mgs)*rho0(mgs)/xmas(mgs,lr))
17918        ENDIF
17919 !      if ( temg(mgs) .gt. 268.15 ) then
17920       else
17921 !      end if
17922       end if
17923       end do
17924       
17925       ENDIF
17927 !  Homogeneous freezing of cloud drops to ice crystals
17928 !  following Bigg (1953) and Ferrier (1994).
17930       if (ndebug .gt. 0 ) write(0,*) 'conc 25b'
17931       do mgs = 1,ngscnt
17932       qwfrz(mgs) = 0.0
17933       cwfrz(mgs) = 0.0
17934       qwfrzc(mgs) = 0.0
17935       cwfrzc(mgs) = 0.0
17936       qwfrzp(mgs) = 0.0
17937       cwfrzp(mgs) = 0.0
17938       IF ( ibfc .ge. 1 .and. ibfc /= 3 .and. temg(mgs) < 268.15 ) THEN
17939 !      if ( qx(mgs,lc) .gt. qxmin(lc) .and. cx(mgs,lc) .gt. 1.  .and.   &
17940 !     &     .not. (ipconc .ge. 2 .and. xdia(mgs,lc,1) .lt. 10.e-6) ) then
17941       if ( qx(mgs,lc) .gt. qxmin(lc) .and. cx(mgs,lc) .gt. cxmin ) THEN
17942       IF ( ipconc < 2 ) THEN
17943       qwfrz(mgs) = ((2.0)*(brz)/(xdn(mgs,lc)*cx(mgs,lc)))   &
17944      &  *(exp(max(-arz*temcg(mgs), 0.0))-1.0)   &
17945      &  *rho0(mgs)*(qx(mgs,lc)**2)
17946       qwfrz(mgs) = max(qwfrz(mgs), 0.0)
17947       qwfrz(mgs) = min(qwfrz(mgs),qcmxd(mgs))
17948          cwfrz(mgs) = qwfrz(mgs)*rho0(mgs)/xmas(mgs,li)
17949        ELSEIF ( ipconc .ge. 2 ) THEN
17950          IF ( xdia(mgs,lc,3) > 0.e-6 ) THEN
17951           volt = exp( 16.2 + 1.0*temcg(mgs) )* 1.0e-6 !  Ts == -temcg ; volt comes from the fit in Fig. 1 in Bigg 1953 
17952                                                ! for mean temperature for freezing: -ln (V) = a*Ts - b
17953                                                ! volt is given in cm**3, so factor of 1.e-6 to convert to m**3
17954 !           dbigg = (6./pi* volt )**(1./3.) 
17956          IF (  alpha(mgs,lc) == 0.0 ) THEN
17957          cwfrz(mgs) = cx(mgs,lc)*Exp(-volt/xv(mgs,lc))*dtpinv ! number of droplets with volume greater than volt
17958 !turn off limit so that all can freeze at low temp
17959 !!!       cwfrz(mgs) = Min(cwfrz(mgs),ccmxd(mgs))
17961          qwfrz(mgs) = cwfrz(mgs)*xdn0(lc)*rhoinv(mgs)*(volt + xv(mgs,lc))
17962           ELSE
17963             ratio = (1. + alpha(mgs,lc))*volt/xv(mgs,lc)
17964             
17965             IF ( .false. .and. usegamxinfcnu ) THEN
17966               i = Nint(dgami*(1. + alpha(mgs,lc)))
17967               gcnup1 = gmoi(i)
17968               i = Nint(dgami*(2. + alpha(mgs,lc)))
17969               gcnup2 = gmoi(i)
17971               cwfrz(mgs) = cx(mgs,lc)*Gamxinf(1.+alpha(mgs,lc), ratio)/(dtp*gcnup1) ! gamxinflu(i,j,1,1)
17973               qwfrz(mgs) = cx(mgs,lc)*xdn0(lc)*xv(mgs,lc)*rhoinv(mgs)*Gamxinf(2.+alpha(mgs,lc), ratio)/(dtp*gcnup2) !  gamxinflu(i,j,12,1)
17974             
17975             ELSE
17976             
17977               ratio = Min( maxratiolu, ratio )
17978 !              write(0,*) 'cwfrz: temp,ratio = ',temcg(mgs),ratio
17979 !              write(0,*) 'cwfrz: xv,volt,qx = ',xv(mgs,lc),volt,qx(mgs,lc)
17980 !              write(0,*) 'cwfrz: i,j,k = ',igs(mgs),jgs,kgs(mgs)
17981               tmp = gaminterp(ratio,alpha(mgs,lc),1,1)
17982 !              write(0,*) 'cwfrz: tmp1 = ',tmp
17983               cwfrz(mgs) = cx(mgs,lc)*tmp*dtpinv ! Gamxinf(1.+alpha(mgs,lc), ratio)/(dtp*gcnup1) ! gamxinflu(i,j,1,1)
17985               tmp = gaminterp(ratio,alpha(mgs,lc),12,1)
17986 !              write(0,*) 'cwfrz: tmp2 = ',tmp
17987               qwfrz(mgs) = cx(mgs,lc)*xdn0(lc)*xv(mgs,lc)*rhoinv(mgs)*dtpinv*tmp ! Gamxinf(2.+alpha(mgs,lc), ratio)/(dtp*gcnup2) !  gamxinflu(i,j,12,1)
17988             
17989             ENDIF
17990           
17991           ENDIF
17993          ENDIF
17994        ENDIF
17995       if ( temg(mgs) .gt. 268.15 ) then
17996       qwfrz(mgs) = 0.0
17997       cwfrz(mgs) = 0.0
17998       end if
17999       end if
18000       ENDIF
18002         if ( xplate(mgs) .eq. 1 ) then
18003           qwfrzp(mgs) = qwfrz(mgs)
18004           cwfrzp(mgs) = cwfrz(mgs)
18005         end if
18006 !  
18007         if ( xcolmn(mgs) .eq. 1 ) then
18008           qwfrzc(mgs) = qwfrz(mgs)
18009           cwfrzc(mgs) = cwfrz(mgs)
18010         end if
18011       
18013 !     qwfrzp(mgs) = 0.0
18014 !     qwfrzc(mgs) = qwfrz(mgs)
18016       end do
18019 !  Contact freezing nucleation:  factor is to convert from L-1
18020 !  T < -2C:  via Meyers et al. JAM July, 1992 (31, 708-721)
18022       if (ndebug .gt. 0 ) write(0,*) 'conc 25a'
18023       do mgs = 1,ngscnt
18025        ccia(mgs) = 0.0
18027        cwctfz(mgs) = 0.0
18028        qwctfz(mgs) = 0.0
18029        ctfzbd(mgs) = 0.0
18030        ctfzth(mgs) = 0.0
18031        ctfzdi(mgs) = 0.0
18033        cwctfzc(mgs) = 0.0
18034        qwctfzc(mgs) = 0.0
18035        cwctfzp(mgs) = 0.0
18036        qwctfzp(mgs) = 0.0
18037        IF ( icfn .ge. 1 ) THEN
18039        IF ( temg(mgs) .lt. 271.15  .and. qx(mgs,lc) .gt. qxmin(lc)) THEN
18041 !       find available # of ice nuclei & limit value to max depletion of cloud water
18043         IF ( icfn .ge. 2 ) THEN
18044          ccia(mgs) = exp( 4.11 - (0.262)*temcg(mgs) )  ! in m-3, see Walko et al. 1995; 1000*exp(-2.8 -b*t) = exp(6.91)*exp(-2.8 - b*t) = exp(4.11 -b*t)
18045          !ccia(mgs) = Min(cwctfz(mgs), ccmxd(mgs) )
18047 !       now find how many of these collect cloud water to form IN
18048 !       Cotton et al 1986
18050          knud(mgs) = 2.28e-5 * temg(mgs) / ( pres(mgs)*raero ) !Walko et al. 1995
18051          knuda(mgs) = 1.257 + 0.4*exp(-1.1/knud(mgs))          !Pruppacher & Klett 1997 eqn 11-16
18052          gtp(mgs) = 1. / ( fai(mgs) + fbi(mgs) )               !Byers 65 / Cotton 72b
18053          dfar(mgs) = kb*temg(mgs)*(1.+knuda(mgs)*knud(mgs))/(6.*pi*fadvisc(mgs)*raero) !P&K 1997 eqn 11-15
18054          fn1(mgs) = 2.*pi*xdia(mgs,lc,1)*cx(mgs,lc)*ccia(mgs)
18055          fn2(mgs) = -gtp(mgs)*(ssw(mgs)-1.)*felv(mgs)/pres(mgs)
18056          fnft(mgs) = 0.4*(1.+1.45*knud(mgs)+0.4*knud(mgs)*exp(-1./knud(mgs)))*(ftka(mgs)+2.5*knud(mgs)*kaero)      &
18057      &              / ( (1.+3.*knud(mgs))*(2*ftka(mgs)+5.*knud(mgs)*kaero+kaero) )
18060 !      Brownian diffusion
18061          ctfzbd(mgs) = fn1(mgs)*dfar(mgs)
18063 !      Thermophoretic contact nucleation
18064          ctfzth(mgs) = fn1(mgs)*fn2(mgs)*fnft(mgs)/rho0(mgs)
18066 !      Diffusiophoretic contact nucleation
18067          ctfzdi(mgs) = fn1(mgs)*fn2(mgs)*rw*temg(mgs)/(felv(mgs)*rho0(mgs))
18069          cwctfz(mgs) = max( ctfzbd(mgs) + ctfzth(mgs) + ctfzdi(mgs) , 0.)
18071 !      Sum of the contact nucleation processes
18072 !         IF ( cx(mgs,lc) .gt. 1.e6) write(0,*) 'ctfzbd,etc = ',cwctfz(mgs),ctfzbd(mgs),ctfzth(mgs),ctfzdi(mgs)
18073 !         IF ( wvel(mgs) .lt. -0.05 ) write(6,*) 'ctfzbd,etc = ',ctfzbd(mgs),ctfzth(mgs),ctfzdi(mgs),cx(mgs,lc)*1e-6,wvel(mgs)
18074 !         IF ( ssw(mgs) .lt. 1.0 .and. cx(mgs,lc) .gt. 1.e6 .and. cwctfz(mgs) .gt. 1. ) THEN
18075 !          write(6,*) 'ctfzbd,etc = ',ctfzbd(mgs),ctfzth(mgs),ctfzdi(mgs),cx(mgs,lc)*1e-6,wvel(mgs),fn1(mgs),fn2(mgs)
18076 !          write(6,*) 'more = ',nstep,ssw(mgs),dfar(mgs),gtp(mgs),felv(mgs),pres(mgs)
18077 !         ENDIF
18079         ELSEIF ( icfn .eq. 1 ) THEN
18080          IF ( wvel(mgs) .lt. -0.05 ) THEN ! older kludgy version
18081            cwctfz(mgs) = cfnfac*exp( (-2.80) - (0.262)*temcg(mgs) )
18082            cwctfz(mgs) = Min((1.0e3)*cwctfz(mgs), ccmxd(mgs) )  !convert to m-3
18083          ENDIF
18084         ENDIF   ! icfn
18086         IF ( ipconc .ge. 2 ) THEN
18087          cwctfz(mgs) = Min( cwctfz(mgs)*dtpinv, ccmxd(mgs) )
18088          qwctfz(mgs) = xmas(mgs,lc)*cwctfz(mgs)/rho0(mgs)
18089         ELSE
18090          qwctfz(mgs) = (cimasn)*cwctfz(mgs)/(dtp*rho0(mgs))
18091          qwctfz(mgs) = max(qwctfz(mgs), 0.0)
18092          qwctfz(mgs) = min(qwctfz(mgs),qcmxd(mgs))
18093         ENDIF
18096         if ( xplate(mgs) .eq. 1 ) then
18097          qwctfzp(mgs) = qwctfz(mgs)
18098          cwctfzp(mgs) = cwctfz(mgs)
18099         end if
18101         if ( xcolmn(mgs) .eq. 1 ) then
18102          qwctfzc(mgs) = qwctfz(mgs)
18103          cwctfzc(mgs) = cwctfz(mgs)
18104         end if
18105         
18106 !        IF ( cwctfz(mgs)*dtp > 0.5 .and. dtp*qwctfz(mgs) > qxmin(li) ) THEN
18107 !          write(91,*) 'cwctfz: ',cwctfz(mgs),qwctfz(mgs) ! ,cwctfzc(mgs),qwctfzc(mgs)
18108 !        ENDIF
18109        
18111 !     qwctfzc(mgs) = qwctfz(mgs)
18112 !     qwctfzp(mgs) = 0.0
18114        end if
18116        ENDIF ! icfn
18118       end do
18122 ! Hobbs-Rangno ice enhancement (Ferrier, 1994)
18124       if (ndebug .gt. 0 ) write(0,*) 'conc 23a'
18125       dthr = 300.0
18126       hrifac = (1.e-3)*((0.044)*(0.01**3))
18127       do mgs = 1,ngscnt
18128       ciihr(mgs) = 0.0
18129       qiihr(mgs) = 0.0
18130       cicichr(mgs) = 0.0
18131       qicichr(mgs) = 0.0
18132       cipiphr(mgs) = 0.0
18133       qipiphr(mgs) = 0.0
18134       IF ( ihrn .ge. 1 ) THEN
18135       if ( qx(mgs,lc) .gt. qxmin(lc) ) then
18136       if ( temg(mgs) .lt. 273.15 ) then
18137 !      write(iunit,'(3(1x,i3),3(1x,1pe12.5))')
18138 !     : igs(mgs),jgs,kgs(mgs),cx(mgs,lc),rho0(mgs),qx(mgs,lc)
18139 !      write(iunit,'(1pe15.6)')
18140 !     :  log(cx(mgs,lc)*(1.e-6)/(3.0)),
18141 !     :  ((1.e-3)*rho0(mgs)*qx(mgs,lc)),
18142 !     :  (cx(mgs,lc)*(1.e-6)),
18143 !     : ((1.e-3)*rho0(mgs)*qx(mgs,lc))/(cx(mgs,lc)*(1.e-6)),
18144 !     : (alog(cx(mgs,lc)*(1.e-6)/(3.0)) *
18145 !     >  ((1.e-3)*rho0(mgs)*qx(mgs,lc))/(cx(mgs,lc)*(1.e-6)))
18147       IF ( Log(cx(mgs,lc)*(1.e-6)/(3.0)) .gt. 0.0 ) THEN
18148       ciihr(mgs) = ((1.69e17)/dthr)   &
18149      & *(log(cx(mgs,lc)*(1.e-6)/(3.0)) *   &
18150      &  ((1.e-3)*rho0(mgs)*qx(mgs,lc))/(cx(mgs,lc)*(1.e-6)))**(7./3.)
18151       ciihr(mgs) = ciihr(mgs)*(1.0e6)
18152       qiihr(mgs) = hrifac*ciihr(mgs)/rho0(mgs)
18153       qiihr(mgs) = max(qiihr(mgs), 0.0)
18154       qiihr(mgs) = min(qiihr(mgs),qcmxd(mgs))
18155       ENDIF
18157       if ( xplate(mgs) .eq. 1 ) then
18158       qipiphr(mgs) = qiihr(mgs)
18159       cipiphr(mgs) = ciihr(mgs)
18160       end if
18162       if ( xcolmn(mgs) .eq. 1 ) then
18163       qicichr(mgs) = qiihr(mgs)
18164       cicichr(mgs) = ciihr(mgs)
18165       end if
18167 !     qipiphr(mgs) = 0.0
18168 !     qicichr(mgs) = qiihr(mgs)
18170       end if
18171       end if
18172       ENDIF ! ihrn
18173       end do
18177 !  simple frozen rain to hail conversion.  All of the
18178 !  frozen rain larger than 5.0e-3 m in diameter are converted
18179 !  to hail.  This is done by considering the equation for
18180 !  frozen rain mixing ratio:
18183 !  qfw = [ cno(lf) * pi * fwdn / (6 rhoair) ]
18185 !         /inf
18186 !      *  |     fwdia*3 exp(-dia/fwdia) d(dia)
18187 !         /Do
18189 !  The amount to be reclassified as hail is the integral above from
18190 !  Do to inf where Do is 5.0e-3 m.
18193 !  qfauh = [ cno(lf) * pi * fwdn / (6 rhoair) ]
18198       hdia0 = 300.0e-6
18199       do mgs = 1,ngscnt
18200       qscnvi(mgs) = 0.0
18201       cscnvi(mgs) = 0.0
18202       cscnvis(mgs) = 0.0
18203 !      IF ( .false. ) THEN
18204 !      IF ( temg(mgs) .lt. tfr .and. ssi(mgs) .gt. 1.01 .and. qx(mgs,li) .gt. qxmin(li) ) THEN
18205       IF ( temg(mgs) .lt. tfr .and. qx(mgs,li) .gt. qxmin(li) ) THEN
18206         IF ( ipconc .ge. 4 .and. .false. ) THEN
18207          if ( cx(mgs,li) .gt. 10. .and. xdia(mgs,li,1) .gt. 50.e-6 ) then !{
18208          cirdiatmp =   &
18209      &  (qx(mgs,li)*rho0(mgs)   &
18210      & /(pi*xdn(mgs,li)*cx(mgs,li)))**(1./3.)
18211           IF ( cirdiatmp .gt. 100.e-6 ) THEN !{
18212           qscnvi(mgs) =   &
18213      &  ((pi*xdn(mgs,li)*cx(mgs,li)) / (6.0*rho0(mgs)*dtp))   &
18214      & *exp(-hdia0/cirdiatmp)   &
18215      & *( (hdia0**3) + 3.0*(hdia0**2)*cirdiatmp   &
18216      &  + 6.0*(hdia0)*(cirdiatmp**2) + 6.0*(cirdiatmp**3) )
18217       qscnvi(mgs) =   &
18218      &  min(qscnvi(mgs),qimxd(mgs))
18219           IF ( ipconc .ge. 4 ) THEN
18220             cscnvi(mgs) = Min( cimxd(mgs), cx(mgs,li)*Exp(-hdia0/cirdiatmp))
18221           ENDIF
18222          ENDIF  ! }
18223         end if ! }
18225        ELSEIF ( ipconc .lt. 4 ) THEN
18227         qscnvi(mgs) = 0.001*eii(mgs)*max((qx(mgs,li)-1.e-3),0.0)
18228         qscnvi(mgs) = min(qscnvi(mgs),qxmxd(mgs,li))
18229         cscnvi(mgs) = qscnvi(mgs)*rho0(mgs)/xmas(mgs,li)
18230         cscnvis(mgs) = 0.5*cscnvi(mgs)
18232        ENDIF
18233       ENDIF
18234 !      ENDIF
18235       end do
18240 !  Ventilation coeficients
18242       do mgs = 1,ngscnt
18243       fvent(mgs) = (fschm(mgs)**(1./3.)) * (fakvisc(mgs)**(-0.5))
18244       end do
18247       if ( ndebug .gt. 0 ) write(0,*) 'civent'
18249       civenta = 1.258e4
18250       civentb = 2.331
18251       civentc = 5.662e4
18252       civentd = 2.373
18253       civente = 0.8241
18254       civentf = -0.042
18255       civentg = 1.70
18257       do mgs = 1,ngscnt
18258       IF ( icond .eq. 1 .or. temg(mgs) .le. tfrh    &
18259      &      .or. (qx(mgs,lr) .le. qxmin(lr) .and. qx(mgs,lc) .le. qxmin(lc)) ) THEN
18260       IF ( qx(mgs,li) .gt. qxmin(li) ) THEN
18261       cireyn =   &
18262      &  (civenta*xdia(mgs,li,1)**civentb   &
18263      &  +civentc*xdia(mgs,li,1)**civentd)   &
18264      &  /   &
18265      &  (civente*xdia(mgs,li,1)**civentf+civentg)
18266       xcivent = (fschm(mgs)**(1./3.))*((cireyn/fakvisc(mgs))**0.5)
18267       if ( xcivent .lt. 1.0 ) then
18268       civent(mgs) = 1.0 + 0.14*xcivent**2
18269       end if
18270       if ( xcivent .ge. 1.0 ) then
18271       civent(mgs) = 0.86 + 0.28*xcivent
18272       end if
18273       ELSE
18274        civent(mgs) = 0.0
18275       ENDIF
18278       ENDIF ! icond .eq. 1
18279       end do
18283       igmrwa = 100.0*2.0
18284       igmrwb = 100.*((5.0+br)/2.0)
18285       rwventa = (0.78)*gmoi(igmrwa)  ! 0.78
18286       rwventb = (0.308)*gmoi(igmrwb) ! 0.562825
18287       do mgs = 1,ngscnt
18288       IF ( qx(mgs,lr) .gt. qxmin(lr) ) THEN
18289         IF ( ipconc .ge. 3 ) THEN
18290           IF ( imurain == 3 ) THEN
18291            IF ( izwisventr == 1 ) THEN
18292             rwvent(mgs) = ventrx(mgs)*(1.6 + 124.9*(1.e-3*rho0(mgs)*qx(mgs,lr))**.2046)
18293            ELSE ! izwisventr = 2
18294 !  Following Wisner et al. (1972) but using gamma of volume. Note that Ferrier rain fall speed does not integrate with gamma of volume, so using Vr = ar*d^br
18295           rwvent(mgs) =   &
18296      &  (0.78*ventrx(mgs) + 0.308*ventrxn(mgs)*fvent(mgs)   &
18297      &   *Sqrt((ar*rhovt(mgs)))   &
18298      &    *(xdia(mgs,lr,1)**((1.0+br)/2.0)) )
18299            ENDIF
18301           ELSE ! imurain == 1
18302        ! linear interpolation of complete gamma function
18303 !        tmp = 2. + alpha(mgs,lr)
18304 !        i = Int(dgami*(tmp))
18305 !        del = tmp - dgam*i
18306 !        x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
18308         IF ( iferwisventr == 1 ) THEN
18310   ! Ferrier fall speed in the ventillation term [uses fx(lr) ]
18311   
18312         alpr = Min(alpharmax,alpha(mgs,lr) )
18314         x =  1. + alpha(mgs,lr)
18316         IF ( ipconc >= 6 .and. lzr > 1 ) THEN ! 3 moment
18317         tmp = 1. + alpr ! alpha(mgs,lr)
18318         i = Int(dgami*(tmp))
18319         del = tmp - dgam*i
18320         g1palp = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
18322         tmp = 2.5 + alpha(mgs,lr) + 0.5*bx(lr)
18323         i = Int(dgami*(tmp))
18324         del = tmp - dgam*i
18325         y = (gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami)/g1palp ! ratio of gamma functions
18326         ELSE
18327          y = ventrxn(mgs)
18328         ENDIF
18330 !         vent1 = dble(xdia(mgs,lr,1))**(-2. - alpr) ! Actually OK
18331 !         vent2 = dble(1./xdia(mgs,lr,1) + 0.5*fx(lr))**dble(2.5+alpr+0.5*bx(lr))  ! Actually OK
18332          vent1 = dble(xdia(mgs,lr,1))**(0.5 + 0.5*bx(lr)) ! 2016.2.26 Changed for consistency with derivation (recast formula -- should be equivalent)
18333          vent2 = dble(1. + 0.5*fx(lr)*xdia(mgs,lr,1))**dble(2.5+alpr+0.5*bx(lr))
18334         
18335         
18336         rwvent(mgs) =    &
18337      &    0.78*x +    &
18338      &    0.308*fvent(mgs)*y*   &
18339      &            Sqrt(ax(lr)*rhovt(mgs))*(vent1/vent2)
18340        
18341         rwventz(mgs) = 0.0
18343 !        rwventz(mgs) =    &
18344 !     &    0.78*x +    &
18345 !     &    0.308*fvent(mgs)*y*   &
18346 !     &            Sqrt(ax(lr)*rhovt(mgs))*(vent1/vent2)
18349         ELSEIF ( iferwisventr == 2 ) THEN
18350           
18351 !  Following Wisner et al. (1972) but using gamma of volume. Note that Ferrier rain fall speed does not integrate with gamma of volume, so using Vr = ar*d^br
18352          x =  1. + alpha(mgs,lr)
18354            rwvent(mgs) =   &
18355      &  (0.78*x + 0.308*ventrxn(mgs)*fvent(mgs)   &
18356      &   *Sqrt((ar*rhovt(mgs)))   &
18357      &    *(xdia(mgs,lr,1)**((1.0+br)/2.0)) )
18360         IF ( ipconc >= 7 ) THEN
18361         alpr = Min(alpharmax,alpha(mgs,lr) )
18363            tmp = alpr + 5.5 + br/2.
18364            i = Int(dgami*(tmp))
18365            del = tmp - dgam*i
18366            y = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
18368 !        rwventz(mgs) =    &
18369 !     &    0.78*(4. + alpha(mgs,lr))*(3. + alpha(mgs,lr))*(2. + alpha(mgs,lr))*(1. + alpha(mgs,lr)) +    &
18370         rwventz(mgs) =    &
18371      &    0.78*(4. + alpr)*(3. + alpr)*(2. + alpr)*(1. + alpr) +    &
18372      &    0.308*fvent(mgs)*   &
18373      &            Sqrt(ax(lr)*rhovt(mgs))*(y/gf1palp(mgs))*(xdia(mgs,lr,1)**((1.0+br)/2.0))
18375         ENDIF
18377           
18378           ENDIF ! iferwisventr
18379           
18380           ENDIF ! imurain
18381         ELSE
18382          rwvent(mgs) =   &
18383      &  (rwventa + rwventb*fvent(mgs)   &
18384      &   *Sqrt((ar*rhovt(mgs)))   &
18385      &    *(xdia(mgs,lr,1)**((1.0+br)/2.0)) )
18386         ENDIF
18387       ELSE
18388        rwvent(mgs) = 0.0
18389       ENDIF
18390       end do
18392       igmswa = 100.0*2.0
18393       igmswb = 100.*((5.0+ds)/2.0)
18394       swventa = (0.78)*gmoi(igmswa)
18395       swventb = (0.308)*gmoi(igmswb)
18396       do mgs = 1,ngscnt
18397       IF ( qx(mgs,ls) .gt. qxmin(ls) ) THEN
18398       IF ( ipconc .ge. 4 ) THEN
18399       swvent(mgs) = 0.65 + 0.44*fvent(mgs)*Sqrt(vtxbar(mgs,ls,1)*xdia(mgs,ls,1))
18400       ELSE
18401 ! 10-ice version:
18402        swvent(mgs) =   &
18403      &  (swventa + swventb*fvent(mgs)   &
18404      &   *Sqrt((cs*rhovt(mgs)))   &
18405      &   *(xdia(mgs,ls,1)**((1.0+ds)/2.0)) )
18406       ENDIF
18407       ELSE
18408       swvent(mgs) = 0.0
18409       ENDIF
18410       end do
18414       igmhwa = 100.0*2.0
18415       igmhwb = 100.0*2.75
18416       hwventa = (0.78)*gmoi(igmhwa)
18417       hwventb = (0.308)*gmoi(igmhwb)
18418 !      hwventc = (4.0*gr/(3.0*cdx(lh)))**(0.25)
18419       hwvent(:) = 0.0
18420       hwventy(:) = 0.0
18422       do mgs = 1,ngscnt
18423       IF ( qx(mgs,lh) .gt. qxmin(lh) ) THEN
18424        hwventc = (4.0*gr/(3.0*cdxgs(mgs,lh)))**(0.25)
18425        IF ( .false. .or. alpha(mgs,lh) .eq. 0.0 ) THEN
18426         hwvent(mgs) =   &
18427      &  ( hwventa + hwventb*hwventc*fvent(mgs)   &
18428      &    *((xdn(mgs,lh)/rho0(mgs))**(0.25))   &
18429      &    *(xdia(mgs,lh,1)**(0.75)))
18430        ELSE ! Ferrier 1994, eq. B.36
18431        ! linear interpolation of complete gamma function
18432 !        tmp = 2. + alpha(mgs,lh)
18433 !        i = Int(dgami*(tmp))
18434 !        del = tmp - dgam*i
18435 !        x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
18436         
18437 ! note that hwvent includes a division by Gamma(1+alpha), so Gamma(2+alpha)/Gamma(1+alpha) = 1 + alpha
18438 ! and g1palp = Gamma(1+alpha) divides into y
18439         x =  1. + alpha(mgs,lh)
18441         tmp = 1 + alpha(mgs,lh)
18442         i = Int(dgami*(tmp))
18443         del = tmp - dgam*i
18444         g1palp = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
18446         tmp = 2.5 + alpha(mgs,lh) + 0.5*bxx(mgs,lh)
18447         i = Int(dgami*(tmp))
18448         del = tmp - dgam*i
18449         y = (gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami)/g1palp
18450         
18451         
18452         hwventy(mgs) = 0.308*fvent(mgs)*(xdia(mgs,lh,1)**(0.5 + 0.5*bxx(mgs,lh)))*Sqrt(axx(mgs,lh)*rhovt(mgs)) 
18453         hwvent(mgs) =    &
18454      &  ( 0.78*x +  y*hwventy(mgs) ) !   &
18455 !     &    0.308*fvent(mgs)*y*(xdia(mgs,lh,1)**(0.5 + 0.5*bxx(mgs,lh)))*   &
18456 !     &            Sqrt(axx(mgs,lh)*rhovt(mgs)) )
18457        
18458        ENDIF
18459       ELSE
18460       hwvent(mgs) = 0.0
18461       hwventy(mgs) = 0.0
18462       ENDIF
18463       end do
18464       
18466       hlvent(:) = 0.0
18467       hlventy(:) = 0.0
18469       IF ( lhl .gt. 1 ) THEN
18470       igmhwa = 100.0*2.0
18471       igmhwb = 100.0*2.75
18472       hwventa = (0.78)*gmoi(igmhwa)
18473       hwventb = (0.308)*gmoi(igmhwb)
18474 !      hwventc = (4.0*gr/(3.0*cdx(lhl)))**(0.25)
18475       do mgs = 1,ngscnt
18476       IF ( qx(mgs,lhl) .gt. qxmin(lhl) ) THEN
18477       hwventc = (4.0*gr/(3.0*cdxgs(mgs,lhl)))**(0.25)
18479        IF ( .false. .or. alpha(mgs,lhl) .eq. 0.0 ) THEN
18480         hlvent(mgs) =   &
18481      &  ( hwventa + hwventb*hwventc*fvent(mgs)   &
18482      &    *((xdn(mgs,lhl)/rho0(mgs))**(0.25))   &
18483      &    *(xdia(mgs,lhl,1)**(0.75)))
18484        ELSE ! Ferrier 1994, eq. B.36
18485        ! linear interpolation of complete gamma function
18486 !        tmp = 2. + alpha(mgs,lhl)
18487 !        i = Int(dgami*(tmp))
18488 !        del = tmp - dgam*i
18489 !        x = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
18491 ! note that hlvent includes a division by Gamma(1+alpha), so x = Gamma(2+alpha)/Gamma(1+alpha) = 1 + alpha
18492 ! and g1palp = Gamma(1+alpha) divides into y
18494         x =  1. + alpha(mgs,lhl)
18496         tmp = 1 + alpha(mgs,lhl)
18497         i = Int(dgami*(tmp))
18498         del = tmp - dgam*i
18499         g1palp = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
18501         tmp = 2.5 + alpha(mgs,lhl) + 0.5*bxx(mgs,lhl)
18502         i = Int(dgami*(tmp))
18503         del = tmp - dgam*i
18504         y = (gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami)/g1palp ! ratio of gamma functions
18506         hlventy(mgs) = 0.308*fvent(mgs)*(xdia(mgs,lhl,1)**(0.5 + 0.5*bxx(mgs,lhl)))*Sqrt(axx(mgs,lhl)*rhovt(mgs)) 
18507         
18508         hlvent(mgs) =  0.78*x + y*hlventy(mgs)  !   &
18509 !     &    0.308*fvent(mgs)*y*(xdia(mgs,lhl,1)**(0.5 + 0.5*bxx(mgs,lhl)))*   &
18510 !     &            Sqrt(axx(mgs,lhl)*rhovt(mgs)))
18511 !     :            Sqrt(xdn(mgs,lhl)*ax(lhl)*rhovt(mgs)/rg0))/tmp
18513         ENDIF
18514        ENDIF
18515       end do
18516       ENDIF
18521 !  Wet growth constants
18523       do mgs = 1,ngscnt
18524       fwet1(mgs) =   &
18525      & (2.0*pi)*   &
18526      & ( felv(mgs)*fwvdf(mgs)*rho0(mgs)*(qss0(mgs)-qx(mgs,lv))   &
18527      &  -ftka(mgs)*temcg(mgs) )   &
18528      & / ( rho0(mgs)*(felf(mgs)+fcw(mgs)*temcg(mgs)) )
18529       fwet2(mgs) =   &
18530      &  (1.0)-fci(mgs)*temcg(mgs)   &
18531      & / ( felf(mgs)+fcw(mgs)*temcg(mgs) )
18532       end do
18534 !  Melting constants
18536       do mgs = 1,ngscnt
18537       fmlt1(mgs) = (2.0*pi)*   &
18538      &  ( felv(mgs)*fwvdf(mgs)*(qss0(mgs)-qx(mgs,lv))   &
18539      &   -ftka(mgs)*temcg(mgs)/rho0(mgs) )    &
18540      &  / (felf(mgs))
18541       fmlt2(mgs) = -fcw(mgs)*temcg(mgs)/felf(mgs)
18542       fmlt1e(mgs) = (2.0*pi)*   &
18543      &  ( felv(mgs)*fwvdf(mgs)*(qss0(mgs)-qx(mgs,lv))  ) / (felf(mgs))
18544       end do
18546 !  Vapor Deposition constants
18548       do mgs = 1,ngscnt
18549       fvds(mgs) =    &
18550      &  (4.0*pi/rho0(mgs))*(ssi(mgs)-1.0)*   &
18551      &  (1.0/(fai(mgs)+fbi(mgs)))
18552       end do
18553       do mgs = 1,ngscnt
18554       fvce(mgs) =    &
18555      &  (4.0*pi/rho0(mgs))*(ssw(mgs)-1.0)*   &
18556      &  (1.0/(fav(mgs)+fbv(mgs)))
18557       end do
18560 !  deposition, sublimation, and melting of snow, graupel and hail
18562       qsmlr(:) = 0.0
18563       qimlr(:) = 0.0 ! this is not used. qi melts to qc way down in the code.
18564       qhmlr(:) = 0.0
18565       qhlmlr(:) = 0.0
18566       IF ( lhwlg > 1 ) THEN
18567         qhmlrlg(:) = 0.0
18568         qhlmlrlg(:) = 0.0
18569       ENDIF
18570       qhfzh(:) = 0.0
18571       qffzf(:) = 0.0
18572       qhlfzhl(:) = 0.0
18573       qhfzhlg(:) = 0.0
18574       qhlfzhllg(:) = 0.0
18575       vhfzh(:) = 0.0
18576       vffzf(:) = 0.0
18577       vhlfzhl(:) = 0.0
18578       qsfzs(:) = 0.0
18579 !      zsmlr(:) = 0.0
18580       zhmlr(:) = 0.0
18581       zhmlrr(:) = 0.0
18582       zsmlrr(:) = 0.0
18583       zhshr(:) = 0.0
18584       zhlmlr(:) = 0.0
18585       zhlshr(:) = 0.0
18587       zhshrr(:) = 0.0
18588       zhlmlrr(:) = 0.0
18589       zhlshrr(:) = 0.0
18591       csmlr(:) = 0.0
18592       csmlrr(:) = 0.0
18593       chmlr(:) = 0.0
18594       chmlrr(:) = 0.0
18595       chlmlr(:) = 0.0
18596       chlfmlr(:) = 0.0
18597 !      chlmlrsave(:) = 0.0
18598 !      qhlmlrsave(:) = 0.0
18599 !      chlsave(:) = 0.0
18600 !      qhlsave(:) = 0.0
18601       chlmlrr(:) = 0.0
18604       if ( .not. mixedphase ) then !{
18605       do mgs = 1,ngscnt
18607       IF ( temg(mgs) .gt. tfr ) THEN
18608       
18609       IF (  qx(mgs,ls) .gt. qxmin(ls) ) THEN
18610       qsmlr(mgs) =   &
18611      &   min(   &
18612      &  (c1sw*fmlt1(mgs)*cx(mgs,ls)*swvent(mgs)*xdia(mgs,ls,1) ) & ! /rhosm    &
18613      &   , 0.0 )
18614       ENDIF
18616       
18617 !       IF ( qx(mgs,ls) .gt. 0.1e-4 ) write(0,*) 'qsmlr: ',qsmlr(mgs),qx(mgs,ls),cx(mgs,ls),fmlt1(mgs),
18618 !     :        temcg(mgs),swvent(mgs),xdia(mgs,ls,1),qss0(mgs)-qx(mgs,lv)
18619 !      ELSE
18620 !       qsmlr(mgs) = 0.0
18621 !      ENDIF
18622 ! 10ice version:
18623 !     >   min(
18624 !     >  (fmlt1(mgs)*cx(mgs,ls)*swvent(mgs)*xdia(mgs,ls,1) +
18625 !     >   fmlt2(mgs)*(qsacr(mgs)+qsacw(mgs)) )
18626 !     <   , 0.0 )
18628       IF (  qx(mgs,lh) .gt. qxmin(lh) ) THEN
18630       IF ( ibinhmlr == 0 .or. lzh < 1 ) THEN
18631        qhmlr(mgs) =   &
18632      &   meltfac*min(   &
18633      &  fmlt1(mgs)*cx(mgs,lh)*hwvent(mgs)*xdia(mgs,lh,1)   &
18634      &  + fmlt2(mgs)*(qhacrmlr(mgs)+qhacwmlr(mgs))    &
18635      &   , 0.0 )
18636        ELSEIF ( ibinhmlr == 1 ) THEN ! use incomplete gamma functions to approximate the bin results
18638          write(0,*) 'ibinhmlr = 1 not available for 2-moment'
18639          STOP
18640          
18641        ELSEIF ( ibinhmlr == 2 .or. ibinhmlr == 3 ) THEN
18643        ENDIF
18644        
18645        
18646        IF ( ivhmltsoak > 0 .and. qhmlr(mgs) < 0.0 .and. lvol(lh) > 1 .and. xdn(mgs,lh) .lt. xdnmx(lh) ) THEN
18647          ! act as if 100% of the meltwater were soaked into the graupel
18648            v1 = (1. - xdn(mgs,lh)/xdnmx(lh))*(vx(mgs,lh) + rho0(mgs)*qhmlr(mgs)/xdn(mgs,lh) )/(dtp) ! volume available for filling
18649            v2 = -1.0*rho0(mgs)*qhmlr(mgs)/xdnmx(lh)  ! volume of melted ice if it were refrozen in the matrix
18650            
18651            vhsoak(mgs) = Min(v1,v2)
18652            
18653        ENDIF
18655       ENDIF !  qx(mgs,lh) .gt. qxmin(lh)
18657       
18658       IF ( lhl .gt. 1  .and. lhlw < 1 ) THEN
18660        IF ( qx(mgs,lhl) .gt. qxmin(lhl) ) THEN
18661          IF ( ibinhlmlr == 0  .or. lzhl < 1) THEN
18662        qhlmlr(mgs) =   &
18663      &   meltfac*min(   &
18664      &  fmlt1(mgs)*cx(mgs,lhl)*hlvent(mgs)*xdia(mgs,lhl,1)   &
18665      &  + fmlt2(mgs)*(qhlacrmlr(mgs)+qhlacwmlr(mgs))    &
18666      &   , 0.0 )
18668        ELSEIF ( ibinhlmlr == 1 ) THEN ! use incomplete gamma functions to approximate the bin results
18670 ! #ifdef 1
18671 ! #if (defined 1) && defined( COMMAS ) || defined( COMMASTMP )
18673        ELSEIF ( ibinhlmlr == -1 ) THEN ! OLD VERSION use incomplete gamma functions to approximate the bin results
18675         ENDIF ! ibinhlmlr
18678        IF ( ivhmltsoak > 0 .and.  qhlmlr(mgs) < 0.0 .and. lvol(lhl) > 1 .and. xdn(mgs,lhl) .lt. xdnmx(lhl) ) THEN
18679          ! act as if 50% of the meltwater were soaked into the graupel
18680            v1 = (1. - xdn(mgs,lhl)/xdnmx(lhl))*(vx(mgs,lhl) + rho0(mgs)*qhlmlr(mgs)/xdn(mgs,lhl) )/(dtp) ! volume available for filling
18681            v2 = -1.0*rho0(mgs)*qhlmlr(mgs)/xdnmx(lhl)  ! volume of melted ice if it were refrozen in the matrix
18682            
18683            vhlsoak(mgs) = Min(v1,v2)
18684            
18685        ENDIF
18686         
18687         ENDIF
18688        ENDIF
18690       ENDIF
18691       
18693 !      qimlr(mgs)  = max( qimlr(mgs), -qimxd(mgs) ) 
18694 !      qsmlr(mgs)  = max( qsmlr(mgs),  -qsmxd(mgs) ) 
18695 ! erm 5/10/2007 changed to next line:
18696       if ( .not. mixedphase ) qsmlr(mgs)  = max( qsmlr(mgs),  Min( -qsmxd(mgs), -0.7*qx(mgs,ls)*dtpinv ) ) 
18697       IF ( .not. mixedphase ) THEN
18698         qhmlr(mgs)  = max( qhmlr(mgs),  Min( -qhmxd(mgs), -0.95*qx(mgs,lh)*dtpinv ) ) 
18699         chmlr(mgs)  = max( chmlr(mgs),  Min( -chmxd(mgs), -0.95*cx(mgs,lh)*dtpinv ) ) 
18700       ENDIF
18701 !      qhmlr(mgs)  = max( max( qhmlr(mgs),  -qhmxd(mgs) ) , -0.5*qx(mgs,lh)*dtpinv ) !limits to 1/2 qh or max depletion
18702       qhmlh(mgs)  = 0. ! not used
18705       ! Rasmussen and Heymsfield say melt water remains on graupel up to 9 mm before shedding
18708       IF ( lhl .gt. 1 .and. lhlw < 1 ) THEN
18709         qhlmlr(mgs)  = max( qhlmlr(mgs),  Min( -qxmxd(mgs,lhl), -0.95*qx(mgs,lhl)*dtpinv ) )
18710         chlmlr(mgs)  = max( chlmlr(mgs),  Min( -cxmxd(mgs,lhl), -0.95*cx(mgs,lhl)*dtpinv ) )
18711       ENDIF
18714       end do
18716       endif  ! } not mixedphase
18718       if ( ipconc .ge. 1 ) then
18719       do mgs = 1,ngscnt
18720       cimlr(mgs)  = (cx(mgs,li)/(qx(mgs,li)+1.e-20))*qimlr(mgs)
18721       IF ( .not. mixedphase ) THEN !{
18722         IF ( xdia(mgs,ls,1) .gt. 1.e-6 .and. -qsmlr(mgs) .ge. 0.5*qxmin(ls) .and. ipconc .ge. 4 ) THEN 
18723 !         csmlr(mgs)  = rho0(mgs)*qsmlr(mgs)/(xv(mgs,ls)*rhosm)
18724          csmlr(mgs)  = (cx(mgs,ls)/(qx(mgs,ls)))*qsmlr(mgs)
18725         ELSEIF ( qx(mgs,ls) > qxmin(ls) ) THEN
18726          csmlr(mgs)  = (cx(mgs,ls)/(qx(mgs,ls)))*qsmlr(mgs)
18727         ENDIF
18728         
18729         csmlrr(mgs) = csmlr(mgs)/rzxs(mgs)
18730          IF ( -csmlrr(mgs)*dtp > cxmin .and. -qsmlr(mgs)*dtp > qxmin(lr) .and. snowmeltdia > 0.0 ) THEN
18731            rmas = rho0(mgs)*qsmlr(mgs)/csmlrr(mgs)
18732            IF ( rmas > snowmeltmass ) THEN
18733              csmlrr(mgs) = rho0(mgs)*qsmlr(mgs)/snowmeltmass
18734            ENDIF
18735          ENDIF
18736            
18739 !        IF ( xdia(mgs,lh,1) .gt. 1.e-6 .and. Abs(qhmlr(mgs)) .ge. qxmin(lh) ) THEN
18740 !          chmlr(mgs) = rho0(mgs)*qhmlr(mgs)/(pi*xdn(mgs,lh)*xdia(mgs,lh,1)**3)  ! out of hail
18741 !          chmlr(mgs) = Max( chmlr(mgs), -chmxd(mgs) )
18742 !        ELSE
18743          IF ( ibinhmlr == 0 .or. lzh < 1 ) THEN
18744            chmlr(mgs)  = (cx(mgs,lh)/(qx(mgs,lh)+1.e-20))*qhmlr(mgs)
18745            IF ( imltshddmr == 3 .and. qhmlr(mgs) < -qxmin(lh) ) THEN
18746             !  tmpdiam = (shedalp+alpha(mgs,lh))*xdia(mgs,lh,1)
18747             !  
18748             !  IF ( tmpdiam > sheddiam ) THEN ! let size get smaller until it reaches sheddiam
18749             !   chmlr(mgs) = 0.0
18750             !  ENDIF
18751             
18752             ! test to remove the part of the melting associated with large ice particles so they get smaller
18754             tmp = 1. + alpha(mgs,lh)
18755             i = Int(dgami*(tmp))
18756             del = tmp - dgam*i
18757             g1palp = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
18759             ratio = Min( maxratiolu,  mltdiam1/xdia(mgs,lh,1) )
18761             x =  gamxinfdp(2. + alpha(mgs,lh), ratio)/g1palp
18762             y =  gamxinfdp(2.5 + alpha(mgs,lh) + 0.5*bxx(mgs,lh), ratio)/g1palp
18764             hwvent1 =  0.78*x + y*hwventy(mgs) 
18766             qhlmlr1 = min( fmlt1(mgs)*cx(mgs,lh)*hwvent1*xdia(mgs,lh,1), 0.0 )
18768             chmlr(mgs)  = (cx(mgs,lh)/(qx(mgs,lh)+1.e-20))*(qhmlr(mgs) - qhlmlr1)
18769            
18770            
18771            ENDIF
18772 !           IF ( igs(mgs) == 40 ) THEN
18773 !             write(0,*) 'is this running? chmlr = ',kgs(mgs), chmlr(mgs)
18774 !           ENDIF
18775          ENDIF
18776 !        ENDIF
18779      IF ( chmlr(mgs) < 0.0 .and. (ibinhmlr < 1 .or. lzh < 1) ) THEN ! { already done if ibinhmlr > 0
18780       IF (  ipconc >= 6 .and. lzr .gt. 1 .and. lzh < 1  .and. qx(mgs,lh) > qxmin(lh) ) THEN ! Only compute if rain is 3-moment but graupel is not, otherwise is computed later
18781           tmp = qx(mgs,lh)/cx(mgs,lh)
18782           alp = alpha(mgs,lh)
18783           g1 = g1x(mgs,lh) ! (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
18784         
18785         zhmlr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*tmp * qhmlr(mgs) - tmp**2 * chmlr(mgs)  )
18787       ENDIF
18788       
18789       IF ( ibinhmlr == 0 .or. lzh < 1 ) THEN
18790       IF ( ihmlt .eq. 1 ) THEN
18791         chmlrr(mgs)  = Min( chmlr(mgs), rho0(mgs)*qhmlr(mgs)/(xdn(mgs,lr)*vmlt) ) ! into rain 
18792       ELSEIF ( ihmlt .eq. 2 ) THEN
18793         IF ( xv(mgs,lh) .gt. 0.0 .and. chmlr(mgs) .lt. 0.0 ) THEN
18794 !        chmlrr(mgs) = Min( chmlr(mgs), rho0(mgs)*qhmlr(mgs)/(xdn(mgs,lh)*xv(mgs,lh)) ) ! into rain 
18795 ! guess what, this is the same as chmlr: rho0*qhmlr/xmas(lh) --> cx/qx = rho0/xmas
18796           IF(imltshddmr == 1) THEN
18797             ! DTD: If Dmg < sheddiam, then assume complete melting into
18798             ! maximal raindrop.  Between sheddiam and sheddiam0 mm, linearly ramp down to a 3 mm shed drop
18799             tmp = -rho0(mgs)*qhmlr(mgs)/(Min(xdn(mgs,lr)*xvmx(lr), xdn(mgs,lh)*xv(mgs,lh))) ! Min of Maximum raindrop size/mean hail size
18800             tmp2 = -rho0(mgs)*qhmlr(mgs)/(xdn(mgs,lr)*vr3mm) ! conc. change for a 3 mm mean drop diameter
18801             
18802             chmlrr(mgs) = tmp*(sheddiam0-xdia(mgs,lh,3))/(sheddiam0-sheddiam)+tmp2*(xdia(mgs,lh,3)-sheddiam)/(sheddiam0-sheddiam)  ! old version
18803             chmlrr(mgs) = -Max(tmp,Min(tmp2,chmlrr(mgs)))
18804           ELSEIF ( imltshddmr == 2 .or. imltshddmr == 3 ) THEN
18805             ! 8/26/2015 ERM updated to use shedalp and tmpdiam
18806             ! tmpdiam = (shedalp+alpha(mgs,lh))*xdia(mgs,lh,1)
18807             chmlrr(mgs) =  rho0(mgs)*qhmlr(mgs)/(xdn(mgs,lr)*vshdgs(mgs,lh))  ! into rain 
18808           ELSE ! Old method
18809             chmlrr(mgs) =  rho0(mgs)*qhmlr(mgs)/(Min(xdn(mgs,lr)*xvmx(lr), xdn(mgs,lh)*xv(mgs,lh)))  ! into rain 
18810          ENDIF
18811         ELSE
18812         chmlrr(mgs) = chmlr(mgs)
18813         ENDIF
18814       ELSEIF ( ihmlt .eq. 0 ) THEN
18815         chmlrr(mgs) = chmlr(mgs)
18816       ENDIF
18818       ELSE ! ibinhmlr < 0? Already have an outer IF test for ibinhmlr < 1
18819         chmlrr(mgs)  = Min( chmlrr(mgs), rho0(mgs)*qhmlr(mgs)/(xdn(mgs,lr)*xvmx(lr)) ) ! into rain 
18820       ENDIF
18821       
18822       ENDIF ! } ( chmlr(mgs) < 0.0 .and. ibinhmlr < 1)
18824       IF ( lhl .gt. 1 .and. lhlw < 1 .and. .not. mixedphase .and. qhlmlr(mgs) < 0.0 ) THEN ! {
18825       
18826       IF ( ibinhlmlr == 0 .or. lzhl < 1 ) THEN
18827 !      IF ( xdia(mgs,lhl,1) .gt. 1.e-6 .and. Abs(qhlmlr(mgs)) .ge. qxmin(lhl) ) THEN
18828 !      chlmlr(mgs) = rho0(mgs)*qhlmlr(mgs)/(pi*xdn(mgs,lhl)*xdia(mgs,lhl,1)**3)  ! out of hail
18829 !      chlmlr(mgs) = Max( chlmlr(mgs), -cxmxd(mgs,lhl) )
18830 !      ELSE
18831       chlmlr(mgs)  = (cx(mgs,lhl)/(qx(mgs,lhl)+1.e-20))*qhlmlr(mgs)
18832            IF ( imltshddmr == 3 .and. qhlmlr(mgs) < -qxmin(lhl) ) THEN
18833 !           IF ( .false. .and. imltshddmr == 3  ) THEN
18834 !              tmpdiam = (shedalp+alpha(mgs,lhl))*xdia(mgs,lhl,1)
18835 !              
18836 !              IF ( tmpdiam > sheddiam ) THEN ! let size get smaller until it reaches sheddiam
18837 !                chlmlr(mgs) = 0.0
18838 !              ENDIF
18840             ! test to remove the part of the melting associated with large ice particles so they get smaller
18842             tmp = 1. + alpha(mgs,lhl)
18843             i = Int(dgami*(tmp))
18844             del = tmp - dgam*i
18845             g1palp = gmoi(i) + (gmoi(i+1) - gmoi(i))*del*dgami
18847             ratio = Min( maxratiolu,  mltdiam1/xdia(mgs,lhl,1) )
18849             x =  gamxinfdp(2. + alpha(mgs,lhl), ratio)/g1palp
18850             y =  gamxinfdp(2.5 + alpha(mgs,lhl) + 0.5*bxx(mgs,lhl), ratio)/g1palp
18852             hwvent1 =  0.78*x + y*hlventy(mgs) 
18854             qhlmlr1 = min( fmlt1(mgs)*cx(mgs,lhl)*hwvent1*xdia(mgs,lhl,1), 0.0 )
18856             chlmlr(mgs)  = (cx(mgs,lhl)/(qx(mgs,lhl)+1.e-20))*Min(0.0, qhlmlr(mgs) - qhlmlr1)
18858             ENDIF
18859 !      ENDIF
18860       ENDIF
18861       
18862       IF ( ibinhlmlr == 0 .or. lzhl < 1 ) THEN !{
18863       IF ( ihmlt .eq. 1 ) THEN
18864         chlmlrr(mgs)  = Min( chlmlr(mgs), rho0(mgs)*qhlmlr(mgs)/(xdn(mgs,lr)*vmlt) ) ! into rain 
18865       ELSEIF ( ihmlt .eq. 2 ) THEN
18866         IF ( xv(mgs,lhl) .gt. 0.0 .and. chlmlr(mgs) .lt. 0.0 ) THEN
18867 !        chlmlrr(mgs) = rho0(mgs)*qhlmlr(mgs)/(Min(xdn(mgs,lr)*xvmx(lr), xdn(mgs,lhl)*xv(mgs,lhl)))  ! into rain 
18868 !        chlmlrr(mgs) = Min( chlmlr(mgs), rho0(mgs)*qhlmlr(mgs)/(xdn(mgs,lhl)*xv(mgs,lhl)) ) ! into rain 
18869           IF(imltshddmr == 1 ) THEN
18870             tmp = -rho0(mgs)*qhlmlr(mgs)/(Min(xdn(mgs,lr)*xvmx(lr), xdn(mgs,lhl)*xv(mgs,lhl))) ! Min of Maximum raindrop size/mean hail size
18871             tmp2 = -rho0(mgs)*qhlmlr(mgs)/(xdn(mgs,lr)*vr3mm) ! conc. change for a 3 mm mean drop diameter
18872             chlmlrr(mgs) = tmp*(20.e-3-xdia(mgs,lhl,3))/(20.e-3-sheddiam)+tmp2*(xdia(mgs,lhl,3)-sheddiam)/(20.e-3-sheddiam)
18873             chlmlrr(mgs) = -Max(tmp,Min(tmp2,chlmlrr(mgs)))
18874           ELSEIF ( imltshddmr == 2 .or. imltshddmr == 3 ) THEN
18875             ! 8/26/2015 ERM updated to use shedalp and tmpdiam
18876             ! tmpdiam = (shedalp+alpha(mgs,lh))*xdia(mgs,lh,1)
18877             chlmlrr(mgs) =  rho0(mgs)*qhlmlr(mgs)/(xdn(mgs,lr)*vshdgs(mgs,lhl))  ! into rain 
18878           ELSE ! old method
18879             chlmlrr(mgs) = rho0(mgs)*qhlmlr(mgs)/(Min(xdn(mgs,lr)*xvmx(lr), xdn(mgs,lhl)*xv(mgs,lhl)))  ! into rain 
18880           ENDIF
18881         ELSE
18882         chlmlrr(mgs) = chlmlr(mgs)
18883         ENDIF
18884       ELSEIF ( ihmlt .eq. 0 ) THEN
18885         chlmlrr(mgs) = chlmlr(mgs)
18886       ENDIF
18888       ELSE ! } { ibinhlmlr > 0
18889         chlmlrr(mgs)  = Min( chlmlrr(mgs), rho0(mgs)*qhlmlr(mgs)/(xdn(mgs,lr)*xvmx(lr)) ) ! into rain 
18890       ENDIF !}
18891       
18892         
18893        IF ( ipconc >= 8 .and. lzhl .gt. 1 .and. ibinhlmlr <= 0 ) THEN
18894         IF ( cx(mgs,lhl) > 0.0 ) THEN
18896           tmp = qx(mgs,lhl)/cx(mgs,lhl)
18897           alp = alpha(mgs,lhl)
18898 !          g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
18899           g1 = g1x(mgs,lhl) ! (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
18900         
18901         zhlmlr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lhl)))**2*( tmp * qhlmlr(mgs) )
18902        ENDIF
18903       ENDIF
18904       ENDIF ! }
18906       ENDIF ! }.not. mixedphase 
18908 ! 10ice versions:
18909 !      chmlr(mgs)  = (cx(mgs,lh)/(qx(mgs,lh)+1.e-20))*qhmlr(mgs)
18910 !      chmlrr(mgs) = chmlr(mgs)
18911       end do
18912       end if
18915 !  deposition/sublimation of ice
18917       DO mgs = 1,ngscnt
18919       rwcap(mgs) = (0.5)*xdia(mgs,lr,1)
18920       swcap(mgs) = (0.5)*xdia(mgs,ls,1)
18921       hwcap(mgs) = (0.5)*xdia(mgs,lh,1)
18922       IF ( lhl .gt. 1 ) hlcap(mgs) = (0.5)*xdia(mgs,lhl,1)
18924       if ( qx(mgs,li).gt.qxmin(li) .and. xdia(mgs,li,1) .gt. 0.0 ) then
18926 ! from Cotton, 1972 (Part II)
18928         cilen(mgs)   = 0.4764*(xdia(mgs,li,1))**(0.958)
18929         cval = xdia(mgs,li,1)
18930         aval = cilen(mgs)
18931         eval = Sqrt(1.0-(aval**2)/(cval**2))
18932         fval = min(0.99,eval)
18933         gval = alog( abs( (1.+fval)/(1.-fval) ) )
18934         cicap(mgs) = cval*fval / gval
18935       ELSE
18936        cicap(mgs) = 0.0
18937       end if
18938       ENDDO
18941       qhdsv(:) = 0.0
18942       qhldsv(:) = 0.0
18944       do mgs = 1,ngscnt
18945       IF ( icond .eq. 1 .or. temg(mgs) .le. tfrh    &
18946      &      .or. (qx(mgs,lr) .le. qxmin(lr) .and. qx(mgs,lc) .le. qxmin(lc)) ) THEN
18947         qidsv(mgs) =   &
18948      &    fvds(mgs)*cx(mgs,li)*civent(mgs)*cicap(mgs)*depfac
18949         qsdsv(mgs) =   &
18950      &    fvds(mgs)*cx(mgs,ls)*swvent(mgs)*swcap(mgs)*depfac
18952 !        IF ( ny .eq. 2 .and. igs(mgs) .eq. 302 .and. temg(mgs) .le. tfrh+10 .and. qx(mgs,lv) .gt. qis(mgs)
18953 !     :       .and. qx(mgs,li) .gt. qxmin(li) ) THEN
18954 !         write(0,*) 'qidsv = ',nstep,kgs(mgs),qidsv(mgs),temg(mgs)-tfrh,100.*(qx(mgs,lv)/qis(mgs) - 1.),1.e6*xdia(mgs,li,1),
18955 !     :            fvds(mgs),civent(mgs),cicap(mgs)
18956 !        ENDIF
18957       ELSE
18958         qidsv(mgs) = 0.0
18959         qsdsv(mgs) = 0.0
18960       ENDIF
18961         qhdsv(mgs) =   &
18962      &    fvds(mgs)*cx(mgs,lh)*hwvent(mgs)*hwcap(mgs)*depfac
18964         IF ( lhl .gt. 1 ) qhldsv(mgs) = fvds(mgs)*cx(mgs,lhl)*hlvent(mgs)*hlcap(mgs)*depfac
18967       end do
18971 ! #include "nssl.qlimit.F"
18974 !  Use a test saturation adjustment to set limits on ice deposition/sublimation
18975 !  and rain evaporation
18978       IF ( DoSublimationFix ) THEN
18979       
18980       do mgs = 1,ngscnt
18982         qitmp(mgs) = qx(mgs,li) + qx(mgs,ls) + qx(mgs,lh)
18983         IF ( lis > 1 ) qitmp(mgs) = qitmp(mgs) + qx(mgs,lis)
18984         IF ( lhl > 1 ) qitmp(mgs) = qitmp(mgs) + qx(mgs,lhl)
18985         qrtmp(mgs) = qx(mgs,lr)
18986         qctmp(mgs) = qx(mgs,lc)
18987         qsimxdep(mgs) = 0.0
18988         qsimxsub(mgs) = 0.0
18989         dqcitmp(mgs) = 0.0
18990         
18992 !      IF ( ( qitmp(mgs) > qxmin(li) .or. qrtmp(mgs) > qxmin(lr) ) ) THEN
18993       IF ( qitmp(mgs) > qxmin(li)  ) THEN
18994       
18995         qitmp1    = qitmp(mgs)
18996         qctmp1    = qctmp(mgs)
18997         felvcptmp = felvcp(mgs)
18998         felscptmp = felscp(mgs)
18999         qvtmp(mgs) = qx(mgs,lv)
19000         qss(mgs) = qvs(mgs)
19001         qsstmp = qvs(mgs)
19002         qvstmp = qvs(mgs)
19003         qisstmp = qis(mgs)
19004         thetatmp  = theta(mgs)
19005         thetaptmp = thetap(mgs)
19006         temgtmp   = temg(mgs)
19007         temcgtmp  = temcg(mgs)
19008         qvaptmp   = qx(mgs,lv) ! qwvp(mgs) + qv0(mgs)
19009         qvptmp    = 0.0 ! qwvp(mgs)  ! qv pertubation
19011         qsstmp = qisstmp
19013       
19014        dqwvtmp(mgs) = ( qvtmp(mgs) - qsstmp )
19016       do itertd = 1,2
19017       
19019 !  calculate super-saturation
19021       IF ( itertd == 1 ) THEN
19022       
19023       ELSE
19024         dqcitmp(mgs) = dqci(mgs)
19025    !     dqwvtmp(mgs) = dqwv(mgs)
19026       ENDIF
19028       dqcw(mgs) = 0.0
19029       dqci(mgs) = 0.0
19030       dqwv(mgs) = ( qvtmp(mgs) - qsstmp )
19032 !  evaporation and sublimation adjustment
19034       if( dqwv(mgs) .lt. 0. ) then           ! { subsaturated
19035         if( qitmp(mgs) .gt. -dqwv(mgs) ) then  ! check if qi can make up all the deficit
19036           dqci(mgs) = dqwv(mgs)
19037           dqwv(mgs) = 0.
19038         else                                  ! otherwise make all ice available for sublimation
19039           dqci(mgs) = -qitmp(mgs)
19040           dqwv(mgs) = dqwv(mgs) + qitmp(mgs)
19041         end if
19043        qvptmp = qvptmp - ( dqcw(mgs) + dqci(mgs) )  ! add to perturbation vapor
19045        IF ( itertd == 2 .and. eqtset > 1 ) THEN
19046        ! if eqtset == 2, then need to update the latent heats for change in hydrometeor content
19047           tmp = qitmp(mgs) !+ qx(mgs,lh)
19048 !          IF ( lhl > 1 ) tmp = tmp + qx(mgs,lhl)
19049           cvm = cv+cvv*qvtmp(mgs)+cpl*(qx(mgs,lc)+qrtmp(mgs))   &
19050                                   +cpigb*(tmp)
19052           felvcptmp = (felv(mgs)-rw*temg(mgs))/cvm
19053           felscptmp = (fels(mgs)-rw*temg(mgs))/cvm
19054        ENDIF
19057 !      qitmp(mgs) = qx(mgs,li)
19058       qctmp(mgs) = qctmp(mgs) + dqcw(mgs) ! dqcw is zero
19059       qitmp(mgs) = qitmp(mgs) + dqci(mgs)
19060       thetaptmp = thetaptmp +   &
19061      &  1./pi0(mgs)*   &
19062      &  (felvcp(mgs)*dqcw(mgs) +felscp(mgs)*dqci(mgs))
19065       end if  ! } dqwv(mgs) .lt. 0. (end of evap/sublim)
19067 ! condensation/deposition
19069       IF ( dqwv(mgs) .ge. 0. ) THEN ! {
19070       
19071 !      write(iunit,*) 'satadj: mgs,iter = ',mgs,itertd,dqwv(mgs),qss(mgs),qx(mgs,lv),qx(mgs,lc)
19073 !        qitmp(mgs) = qx(mgs,li)
19074         fracl(mgs) = 0.0
19075         fraci(mgs) = 1.0
19076         if ( temg(mgs) .lt. tfr .and. temg(mgs) .gt. thnuc ) then
19077 !          fracl(mgs) = max(min(1.,(temg(mgs)-233.15)/(20.)),0.0)
19078 !          fraci(mgs) = 1.0-fracl(mgs)
19079         end if
19080         if ( temg(mgs) .le. thnuc ) then
19081            fraci(mgs) = 1.0
19082            fracl(mgs) = 0.0
19083          end if
19084 !        fraci(mgs) = 1.0-fracl(mgs)
19086        gamss = (felvcp(mgs)*fracl(mgs) + felscp(mgs)*fraci(mgs))   &
19087      &      / (pi0(mgs))
19089           dqvcnd(mgs) = dqwv(mgs)/(1. + fcqv2(mgs)*qsstmp/   &
19090      &  ((temg(mgs)-cbi)**2))
19092       if ( temg(mgs) .ge. tfr ) then
19093       dqvcnd(mgs) = dqwv(mgs)/(1. + fcqv1(mgs)*qsstmp/   &
19094      &  ((temg(mgs)-cbw)**2))
19095       end if
19097       delqci1=qx(mgs,li)
19100       dqcw(mgs) = dqvcnd(mgs)*fracl(mgs) ! is zero
19101       dqci(mgs) = dqvcnd(mgs)*fraci(mgs)
19103       thetaptmp = thetaptmp +   &
19104      &   (felvcp(mgs)*dqcw(mgs) + felscp(mgs)*dqci(mgs))   &
19105      & / (pi0(mgs))
19107       qvptmp = qvptmp - ( dqvcnd(mgs) )
19108       qctmp(mgs) = qctmp(mgs) + dqcw(mgs)
19109       qitmp(mgs) = qitmp(mgs) + dqci(mgs)
19111        IF ( itertd == 2 .and. eqtset > 1 ) THEN
19112        ! if eqtset == 2, then need to update the latent heats for change in hydrometeor content
19113           tmp = qitmp(mgs) ! + qx(mgs,lh)
19114 !          IF ( lhl > 1 ) tmp = tmp + qx(mgs,lhl)
19115           cvm = cv+cvv*qvtmp(mgs)+cpl*(qctmp(mgs) +qrtmp(mgs))   &
19116                                   +cpigb*(tmp)
19118           felvcptmp = (felv(mgs)-rw*temg(mgs))/cvm
19119           felscptmp = (fels(mgs)-rw*temg(mgs))/cvm
19120        ENDIF
19122       IF ( eqtset > 2 ) THEN
19123         pipert(mgs) = pipert(mgs) + (0   &
19124      &  +felspi(mgs)*dqci(mgs)    &
19125      &  +felvpi(mgs)*dqcw(mgs))*dtp
19126       ENDIF
19130       END IF ! } dqwv(mgs) .ge. 0.
19134       IF ( itertd == 1 ) THEN
19135       ! update temporary saturation values
19137       thetatmp = thetaptmp + theta0(mgs)
19138       temgtmp = thetatmp*pk(mgs) ! ( pres(mgs) / poo ) ** cap
19139       qvaptmp = Max((qvptmp + qv0(mgs)), 0.0)
19140       temcgtmp = temgtmp - tfr
19141       tqvcon = temgtmp-cbw
19142       ltemq = (temgtmp-163.15)/fqsat+1.5
19143       ltemq = Min( nqsat, Max(1,ltemq) )
19144       qvstmp = pqs(mgs)*tabqvs(ltemq)
19145       qisstmp = pqs(mgs)*tabqis(ltemq)
19146       qctmp(mgs) = max( 0.0, qctmp(mgs) )
19147       qitmp(mgs) = max( 0.0, qitmp(mgs) )
19148       qvtmp(mgs) = max( 0.0, qvaptmp )
19149       
19150 !      qsstmp = qvstmp
19151       qsstmp = qisstmp
19152       
19153       ELSE
19154        ! set max depletion
19155         qctmp(mgs) = max( 0.0, qctmp(mgs) )
19156         qitmp(mgs) = max( 0.0, qitmp(mgs) )
19157        
19158         IF ( qitmp(mgs) < qitmp1 ) THEN
19159           qsimxsub(mgs) = (qitmp1 - qitmp(mgs))*dtpinv
19160         ELSEIF ( qitmp(mgs) > qitmp1 ) THEN
19161           qsimxdep(mgs) = (qitmp(mgs) - qitmp1)*dtpinv
19162         ENDIF
19163        
19164       
19165       ENDIF
19166 !      pceds(mgs) = (thetap(mgs) - thsave(mgs))*dtpinv
19167 !      write(iunit,*) 'satadj2: mgs,iter = ',mgs,itertd,dqwv(mgs),qss(mgs),qxtmp,qctmp(mgs)
19169 !  end the saturation adjustment iteration loop
19171       end do ! itertd
19172       
19173       ENDIF
19174       
19175       end do ! mgs
19176       
19177       ELSE
19178       
19179        DO mgs = 1,ngscnt
19180          qsimxdep(mgs) = qvimxd(mgs)
19181          qsimxsub(mgs) = 1.e20
19182        ENDDO
19183       
19184       ENDIF
19186 ! end of qlimit
19188       qhcev(:) = 0.0
19189       chcev(:) = 0.0
19190       qhlcev(:) = 0.0
19191       chlcev(:) = 0.0
19192       qfcev(:) = 0.0
19194       do mgs = 1,ngscnt
19195       qisbv(mgs) = 0.0
19196       qssbv(mgs) = 0.0
19197       qidpv(mgs) = 0.0
19198       qsdpv(mgs) = 0.0
19199       qhsbv(mgs) = 0.0
19200       qscev(mgs) = 0.0
19201       cscev(mgs) = 0.0
19202       IF ( icond .eq. 1 .or. temg(mgs) .le. tfrh    &
19203      &      .or. (qx(mgs,lr) .le. qxmin(lr) .and. qx(mgs,lc) .le. qxmin(lc)) ) THEN ! last condition (qr<qmin & qc<qmin) for case icond=0
19204 !        qisbv(mgs) = max( min(qidsv(mgs), 0.0), -qimxd(mgs) )
19205 !        qssbv(mgs) = max( min(qsdsv(mgs), 0.0), -qsmxd(mgs) )
19206 ! erm 5/10/2007:
19207         qisbv(mgs) = max( min(qidsv(mgs), 0.0),  Min( -qimxd(mgs), -0.5*qx(mgs,li)*dtpinv ) )
19208         IF ( temg(mgs) < tfr .or. .not. qsmlr(mgs) < 0.0 ) THEN
19209         qssbv(mgs) = max( min(qsdsv(mgs), 0.0),  Min( -qsmxd(mgs), -0.5*qx(mgs,ls)*dtpinv ) )
19210         ENDIF
19211         qidpv(mgs) = Max(qidsv(mgs), 0.0)
19212         qsdpv(mgs) = Max(qsdsv(mgs), 0.0)
19213         
19214         IF ( qsmlr(mgs) < 0.0 .and. .not. mixedphase ) THEN ! switch snow sublimation to evaporation if there is melting
19216           qscev(mgs) = evapfac*   &
19217      &  4.0*pi*(qx(mgs,lv)-qss0(mgs))*cx(mgs,ls)*swcap(mgs)*swvent(mgs)/(qss0(mgs)*(fav(mgs)+fbv(mgs)))
19218           qscev(mgs) = Max( Min(0.0,qscev(mgs)),  Min( -qsmxd(mgs), -0.5*qx(mgs,ls)*dtpinv ) )
19219         ELSE
19221         ENDIF
19225       ELSE
19226         qisbv(mgs) = 0.0
19227         qssbv(mgs) = 0.0
19228         qidpv(mgs) = 0.0
19229         qsdpv(mgs) = 0.0
19230       ENDIF
19232       qhsbv(mgs) = 0.0
19233       qhdpv(mgs) = 0.0
19234       IF ( qx(mgs,lh) > qxmin(lh) ) THEN
19235       IF ( temg(mgs) < tfr .or. .not. qhmlr(mgs) < 0.0 ) THEN
19236       ! no liquid from melting, so evaporation is greater. Thus can calculate sublimation rate
19237       qhsbv(mgs) = max( min(qhdsv(mgs), 0.0), -qhmxd(mgs) )
19238       qhdpv(mgs) = Max(qhdsv(mgs), 0.0)
19239       ENDIF
19240       
19241       IF ( .true. .and. qhmlr(mgs) < 0.0 .and. .not. mixedphase ) THEN
19242         ! Liquid is forming, so find the evaporation that was subtracted from melting (if it is not condensing)
19243 !       qhcev(mgs) =   &
19244 !     &   evapfac*min(   &
19245 !     &  fmlt1e(mgs)*cx(mgs,lh)*hwvent(mgs)*xdia(mgs,lh,1), 0.0 )
19246         
19247         qhcev(mgs) =  evapfac*2.0*pi*(qx(mgs,lv)-qss0(mgs))*  &
19248      &   cx(mgs,lh)*xdia(mgs,lh,1)*hwvent(mgs)/(qss0(mgs)*(fav(mgs)+fbv(mgs)))
19250         qhcev(mgs)  = max(qhcev(mgs), -qhmxd(mgs))
19251         IF ( temg(mgs) > tfr ) qhcev(mgs) = Min(0.0, qhcev(mgs) )
19252         
19253       ENDIF
19254       ENDIF
19257       qhlsbv(mgs) = 0.0
19258       qhldpv(mgs) = 0.0
19259       IF ( lhl .gt. 1 ) THEN
19260       IF ( qx(mgs,lhl) > qxmin(lhl) ) THEN
19261         IF ( temg(mgs) < tfr .or. .not. qhlmlr(mgs) < 0.0 ) THEN
19262         qhlsbv(mgs) = max( min(qhldsv(mgs), 0.0), -qxmxd(mgs,lhl) )
19263         qhldpv(mgs) = Max(qhldsv(mgs), 0.0)
19264         ENDIF
19265         IF ( qhlmlr(mgs) < 0.0 .and. .not. mixedphase ) THEN
19266         ! Liquid is forming, so find the evaporation that was subtracted from melting (if it is not condensing)
19267          qhlcev(mgs) =  evapfac*2.0*pi*(qx(mgs,lv)-qss0(mgs))*  &
19268      &      cx(mgs,lhl)*xdia(mgs,lhl,1)*hlvent(mgs)/(qss0(mgs)*(fav(mgs)+fbv(mgs)))
19270          qhlcev(mgs)  = max(qhlcev(mgs), -qhlmxd(mgs))
19271          IF ( temg(mgs) > tfr ) qhlcev(mgs) = Min(0.0, qhlcev(mgs) )
19272         
19273       ENDIF
19274       ENDIF
19275       ENDIF
19276       
19277       temp1 = qidpv(mgs) + qsdpv(mgs) + qhdpv(mgs) + qhldpv(mgs)
19279 !      IF ( temp1 .gt. qvimxd(mgs) ) THEN
19281 !      frac = qvimxd(mgs)/temp1
19283       IF ( temp1 .gt. qsimxdep(mgs) ) THEN
19284       frac = qsimxdep(mgs)/temp1
19286       qidpv(mgs) = frac*qidpv(mgs)
19287       qsdpv(mgs) = frac*qsdpv(mgs)
19288       qhdpv(mgs) = frac*qhdpv(mgs)
19289       qhldpv(mgs) = frac*qhldpv(mgs)
19291 !        IF ( ny .eq. 2 .and. igs(mgs) .eq. 302 .and. temg(mgs) .le. tfrh+10 .and. qx(mgs,lv) .gt. qis(mgs)
19292 !     :       .and. qx(mgs,li) .gt. qxmin(li) ) THEN
19293 !         write(0,*) 'qidpv,frac = ',kgs(mgs),qidpv(mgs),frac
19294 !        ENDIF
19296       ENDIF
19298       temp1 = qisbv(mgs) + qssbv(mgs) + qhsbv(mgs) + qhlsbv(mgs)
19301       IF ( temp1 <  -qsimxsub(mgs) ) THEN
19302       frac = -qsimxsub(mgs)/temp1
19304       qisbv(mgs) = frac*qisbv(mgs)
19305       qssbv(mgs) = frac*qssbv(mgs)
19306       qhsbv(mgs) = frac*qhsbv(mgs)
19307       qhlsbv(mgs) = frac*qhlsbv(mgs)
19309 !        IF ( ny .eq. 2 .and. igs(mgs) .eq. 302 .and. temg(mgs) .le. tfrh+10 .and. qx(mgs,lv) .gt. qis(mgs)
19310 !     :       .and. qx(mgs,li) .gt. qxmin(li) ) THEN
19311 !         write(0,*) 'qidpv,frac = ',kgs(mgs),qidpv(mgs),frac
19312 !        ENDIF
19314       ENDIF
19317       end do
19320       if ( ipconc .ge. 1 ) then
19321       do mgs = 1,ngscnt
19322       cssbv(mgs)  = (cx(mgs,ls)/(qx(mgs,ls)+1.e-20))*qssbv(mgs)
19323       cisbv(mgs)  = (cx(mgs,li)/(qx(mgs,li)+1.e-20))*qisbv(mgs)
19324       chsbv(mgs)  = (cx(mgs,lh)/(qx(mgs,lh)+1.e-20))*qhsbv(mgs)
19325       IF ( lhl .gt. 1 ) chlsbv(mgs)  = (cx(mgs,lhl)/(qx(mgs,lhl)+1.e-20))*qhlsbv(mgs)
19326       csdpv(mgs)  = 0.0 ! (cx(mgs,ls)/(qx(mgs,ls)+1.e-20))*qsdpv(mgs)
19327       cidpv(mgs) =  0.0 ! (cx(mgs,li)/(qx(mgs,li)+1.e-20))*qidpv(mgs)
19328       cisdpv(mgs) = 0.0
19329       chdpv(mgs)  = 0.0 ! (cx(mgs,lh)/(qx(mgs,lh)+1.e-20))*qhdpv(mgs)
19330       chldpv(mgs) = 0.0
19331       end do
19332       end if
19335 !  Aggregation or size conversion of small crystals to snow
19337       if (ndebug .gt. 0 ) write(0,*) 'conc 29a'
19338       do mgs = 1,ngscnt
19339       qscni(mgs) =  0.0
19340       cscni(mgs) = 0.0
19341       cscnis(mgs) = 0.0
19342       if ( ipconc .ge. 4 .and. iscni .ge. 1 .and. qx(mgs,li) .gt. qxmin(li) ) then
19343         IF ( iscni .eq. 1 ) THEN
19344          qscni(mgs) =    &
19345      &      pi*rho0(mgs)*((0.25)/(6.0))   &
19346      &      *eii(mgs)*(qx(mgs,li)**2)*(xdia(mgs,li,2))   &
19347      &      *vtxbar(mgs,li,1)/xmas(mgs,li)
19348          cscni(mgs) = Min(cimxd(mgs),qscni(mgs)*rho0(mgs)/xmas(mgs,li))
19349          cscnis(mgs) = 0.5*cscni(mgs)
19350         ELSEIF ( iscni .eq. 2 .or. iscni .eq. 4 .or. iscni .eq. 5 ) THEN  ! Zeigler 1985/Zrnic 1993, sort of
19351           IF ( iscni .ne. 5 .and. qidpv(mgs) .gt. 0.0 .and.  xdia(mgs,li,3) .ge. 100.e-6 ) THEN
19352           ! convert larger crystals to snow
19353 !            IF ( xdia(mgs,ls,3) .gt. xdia(mgs,li,3) ) THEN
19354 !              qscni(mgs) = Max(0.1,xdia(mgs,li,3)/xdia(mgs,ls,3))*qidpv(mgs)
19355 ! erm 9/5/08 changed max to min
19356               qscni(mgs) = Min(0.5, xdia(mgs,li,3)/200.e-6)*qidpv(mgs)
19357 !            ELSE
19358 !              qscni(mgs) = 0.1*qidpv(mgs)
19359 !            ENDIF
19360             cscni(mgs) = fscni*qscni(mgs)*rho0(mgs)/Max(rho_qs*xvmn(ls),xmas(mgs,li))
19361 !            cscni(mgs) = fscni*Min(cimxd(mgs),qscni(mgs)*rho0(mgs)/Max(xdn(mgs,ls)*xvmn(ls),xmas(mgs,li)))
19362 !            cscni(mgs) = Min(cimxd(mgs),qscni(mgs)*rho0(mgs)/xmas(mgs,li) )
19363 !            IF ( xdia(mgs,ls,3) .le. 200.e-6 ) THEN
19364               cscnis(mgs) = cscni(mgs)
19365 !            ELSE
19366 !              cscnis(mgs) = 0.0
19367 !            ENDIF
19368           ENDIF
19370            IF ( iscni .ne. 4 ) THEN
19371            ! crystal aggregation to become snow
19372 ! erm 9/5/08 commented second line and added xv to 1st line (zrnic et al 1993)
19373              tmp = ess(mgs)*rvt*aa2*cx(mgs,li)*cx(mgs,li)*xv(mgs,li)
19374 !     :         ((cinu + 2.)*xv(mgs,li)/(cinu + 1.) + xv(mgs,li))
19376 !           csacs(mgs) = rvt*aa2*ess(mgs)*cx(mgs,ls)**2*xv(mgs,ls)
19378              qscni(mgs) = qscni(mgs) + Min( qxmxd(mgs,li), 2.0*tmp*xmas(mgs,li)*rhoinv(mgs) )
19379              cscni(mgs) = cscni(mgs) + Min( cxmxd(mgs,li), 2.0*tmp )
19380              cscnis(mgs) = cscnis(mgs) + Min( cxmxd(mgs,li), tmp )
19381            ENDIF
19382         ELSEIF ( iscni .eq. 3 ) THEN ! LFO
19383            qscni(mgs) = 0.001*eii(mgs)*max((qx(mgs,li)-1.e-3),0.0)
19384            qscni(mgs) = min(qscni(mgs),qxmxd(mgs,li))
19385            cscni(mgs) = qscni(mgs)*rho0(mgs)/xmas(mgs,li)
19386            cscnis(mgs) = 0.5*cscni(mgs)
19387 !           write(iunit,*) 'qscni, qi = ',qscni(mgs),qx(mgs,li),igs(mgs),kgs(mgs)
19388         ENDIF
19390       ELSEIF ( ipconc < 4 ) THEN ! LFO
19391            IF ( lwsm6 ) THEN
19392              qimax = rhoinv(mgs)*roqimax
19393              qscni(mgs) = Min(0.90*qx(mgs,li), Max( 0.0, (qx(mgs,li) - qimax)*dtpinv ) )
19394            ELSE
19395              qscni(mgs) = 0.001*eii(mgs)*max((qx(mgs,li)-1.e-3),0.0)
19396              qscni(mgs) = min(qscni(mgs),qxmxd(mgs,li))
19397            ENDIF
19398       else ! 10-ice version
19399       if ( iscni > 0 .and. qx(mgs,li) .gt. qxmin(li) ) then
19400           qscni(mgs) =    &
19401      &    pi*rho0(mgs)*((0.25)/(6.0))   &
19402      &    *eii(mgs)*(qx(mgs,li)**2)*(xdia(mgs,li,2))   &
19403      &    *vtxbar(mgs,li,1)/xmas(mgs,li)
19404          cscni(mgs) = Min(cimxd(mgs),qscni(mgs)*rho0(mgs)/xmas(mgs,li))
19405         end if
19407       end if
19408       end do
19416 !  compute dry growth rate of snow, graupel, and hail
19418       do mgs = 1,ngscnt
19420       qsdry(mgs)  = qsacr(mgs)    + qsacw(mgs)   &
19421      &            + qsaci(mgs)
19423       qhdry(mgs)  = qhaci(mgs)    + qhacs(mgs)   &
19424      &            + qhacr(mgs)   &
19425      &            + qhacw(mgs)
19428       qhldry(mgs) = 0.0
19429       IF ( lhl .gt. 1 ) THEN
19430       qhldry(mgs)  = qhlaci(mgs)    + qhlacs(mgs)   &
19431      &               + qhlacr(mgs)   &
19432      &               + qhlacw(mgs)
19433       ENDIF
19434       end do
19436 !  set wet growth and shedding
19438       do mgs = 1,ngscnt
19439       
19440       IF ( tfrdry < temg(mgs) .and. temg(mgs) < tfr ) THEN
19442 !      qswet(mgs) =
19443 !     >  ( xdia(mgs,ls,1)*swvent(mgs)*cx(mgs,ls)*fwet1(mgs)
19444 !     >  + fwet2(mgs)*(qsaci(mgs)+qsacir(mgs)
19445 !     >               +qsacip(mgs)) )
19446 !      qswet(mgs) = max( 0.0, qswet(mgs))
19448 !      IF ( dnu(lh) .ne. 0. ) THEN
19449 !        qhwet(mgs) = qhdry(mgs)
19450 !      ELSE
19451        IF ( incwet == 0 ) THEN
19452         qhwet(mgs) =   &
19453      &    ( xdia(mgs,lh,1)*hwvent(mgs)*cx(mgs,lh)*fwet1(mgs)   &
19454      &   + fwet2(mgs)*(qhaci(mgs) + qhacs(mgs)) )
19455        qhwet(mgs) = max( 0.0, qhwet(mgs))
19456          ELSE
19457          ENDIF
19459 !      ENDIF
19462        qhlwet(mgs) = 0.0
19463        IF ( lhl .gt. 1 ) THEN
19464          IF ( incwet == 0 ) THEN
19465          qhlwet(mgs) =   &
19466      &     ( xdia(mgs,lhl,1)*hlvent(mgs)*cx(mgs,lhl)*fwet1(mgs)   &
19467      &     + fwet2(mgs)*(qhlaci(mgs) + qhlacs(mgs)) )
19468          qhlwet(mgs) = max( 0.0, qhlwet(mgs))
19469          
19470          ELSE
19471          ENDIF ! incwet
19472        ENDIF
19473        
19474        ELSE
19475        
19476         qhwet(mgs) = qhdry(mgs)
19477         qhlwet(mgs) = qhldry(mgs)
19478        ENDIF
19480 !      qhlwet(mgs) = qhldry(mgs)
19482       end do
19485 ! shedding rate
19487       qsshr(:)  =  0.0
19488       qhshr(:)  =  0.0
19489       qhlshr(:) =  0.0
19490       qhshh(:)  =  0.0
19491       csshr(:)  =  0.0
19492       csshrr(:) = 0.0
19493       chshr(:)  =  0.0
19494       chlshr(:)  =  0.0
19495       chshrr(:)  =  0.0
19496       chlshrr(:)  =  0.0
19497       vhshdr(:)  = 0.0
19498       vhlshdr(:)  = 0.0
19499       wetsfc(:)  = .false.
19500       wetgrowth(:)  = .false.
19501       wetsfchl(:)  = .false.
19502       wetgrowthhl(:)  = .false.
19504       do mgs = 1,ngscnt
19508       qhshr(mgs)  = Min( 0.0, qhwet(mgs) - qhdry(mgs) )  ! water that freezes should never be more than what sheds
19509       
19512       qhlshr(mgs)  =  Min( 0.0, qhlwet(mgs) - qhldry(mgs) )
19515 ! limit wet growth to only higher density particles
19517       qsshr(mgs)  =  0.0
19520 !  no shedding for temperatures < 243.15 
19522       if ( temg(mgs) .lt. 243.15 ) then
19523        qsshr(mgs)  =  0.0
19524        qhshr(mgs)  =  0.0
19525        qhlshr(mgs) =  0.0
19526        vhshdr(mgs)  = 0.0
19527        vhlshdr(mgs)  = 0.0
19528        wetsfc(mgs) = .false.
19529        wetgrowth(mgs) = .false.
19530        wetsfchl(mgs) = .false.
19531        wetgrowthhl(mgs) = .false.
19532       end if
19534 !  shed all at temperatures > 273.15
19536       if ( temg(mgs) .gt. tfr ) then
19538        IF ( .false. ) THEN ! old and incorrect -- Thanks to Shaofeng Hua for noticing this error (9/17/2017)
19539        qsshr(mgs)  = -qsdry(mgs)
19540        qhshr(mgs)  = -qhdry(mgs)
19541        qhlshr(mgs) = -qhldry(mgs)
19542        ELSE ! new and correct
19543        ! note that the qxacr terms should be zero here, so shedding at T > 0 is all from the droplets
19544        qsshr(mgs)   = - qsacr(mgs) - qsacw(mgs) ! -qsdry(mgs)
19545        qhlshr(mgs)  = - qhlacw(mgs) - qhlacr(mgs) ! -qhldry(mgs)
19546        qhshr(mgs)  = - qhacw(mgs) - qhacr(mgs) ! -qhdry(mgs)
19548        ENDIF
19550        vhshdr(mgs)  = -vhacw(mgs) - vhacr(mgs)
19551        vhlshdr(mgs)  = -vhlacw(mgs) - vhlacr(mgs)
19552        qhwet(mgs)  = 0.0
19553        qhlwet(mgs) = 0.0
19554       end if
19556 !      if (qhshr(mgs) .lt. 0.0 .and. temg(mgs) < tfr  ) THEN
19557         wetsfc(mgs) =  (qhshr(mgs) .lt. 0.0 .and. temg(mgs) < tfr ) .or. ( qhmlr(mgs) < -qxmin(lh) .and.  temg(mgs) > tfr )
19558         wetgrowth(mgs) = (qhshr(mgs) .lt. 0.0 .and. temg(mgs) < tfr )
19559 !      ENDIF
19560       if (qhlshr(mgs) .lt. 0.0 .and. temg(mgs) < tfr ) THEN
19561         wetsfchl(mgs) = (qhlshr(mgs) .lt. 0.0 .and. temg(mgs) < tfr ) .or. ( qhlmlr(mgs) < -qxmin(lhl) .and.  temg(mgs) > tfr )
19562         wetgrowthhl(mgs) = (qhlshr(mgs) .lt. 0.0 .and. temg(mgs) < tfr )
19563       ENDIF
19565       end do
19567       if ( ipconc .ge. 1 ) then
19568       do mgs = 1,ngscnt
19569       csshr(mgs)  = 0.0 ! (cx(mgs,ls)/(qx(mgs,ls)+1.e-20))*Min(0.0,qsshr(mgs))
19570        
19571        chshr(mgs) = 0.0 ! no change to graupel number concentration for wet-growth shedding
19572        
19573       !   tmpdiam = (shedalp+alpha(mgs,lh))*xdia(mgs,lh,1)
19574         ! Base the drop size on the shedding regime
19575             ! 8/26/2015 ERM updated to use shedalp and tmpdiam
19576             ! tmpdiam = (shedalp+alpha(mgs,lh))*xdia(mgs,lh,1)
19577             chshrr(mgs) =  rho0(mgs)*qhshr(mgs)/(xdn(mgs,lr)*vshdgs(mgs,lh))  ! into rain 
19578       
19579       
19580       
19581       chlshr(mgs) = 0.0
19582       chlshrr(mgs) = 0.0
19583       IF ( lhl .gt. 1 ) THEN 
19584 !         chlshr(mgs)  = (cx(mgs,lhl)/(qx(mgs,lhl)+1.e-20))*qhlshr(mgs)
19587        chlshr(mgs) = 0.0 ! no change to hail number concentration for wet-growth shedding
19588        
19589       !   tmpdiam = (shedalp+alpha(mgs,lh))*xdia(mgs,lh,1)
19590         ! Base the drop size on the shedding regime
19591             ! 8/26/2015 ERM updated to use shedalp and tmpdiam
19592             ! tmpdiam = (shedalp+alpha(mgs,lh))*xdia(mgs,lh,1)
19593             chlshrr(mgs) =  rho0(mgs)*qhlshr(mgs)/(xdn(mgs,lr)*vshdgs(mgs,lhl))  ! into rain 
19595       ENDIF ! ( lhl > 1 )
19597       
19598       end do
19599       end if
19604 !  final decisions
19606       do mgs = 1,ngscnt
19608 !  Snow
19610       if ( qsshr(mgs) .lt. 0.0 ) then
19611       qsdpv(mgs) = 0.0
19612       qssbv(mgs) = 0.0
19613       else
19614       qsshr(mgs) = 0.0
19615       end if
19617 !     if ( qsdry(mgs) .lt. qswet(mgs) ) then
19618 !     qswet(mgs) = 0.0
19619 !     else
19620 !     qsdry(mgs) = 0.0
19621 !     end if
19624 !  graupel
19627       if ( wetgrowth(mgs) .or. (mixedphase .and. fhw(mgs) .gt. 0.05 .and. temg(mgs) .gt. 243.15) ) then
19628       
19630 ! soaking (when not advected liquid water film with graupel)
19632         IF ( lvol(lh) .gt. 1 .and. .not. mixedphase) THEN
19633         ! rescale volumes to maximum density
19634          IF ( iwetsoak ) THEN 
19636          rimdn(mgs,lh) = xdnmx(lh)
19637          raindn(mgs,lh) = xdnmx(lh)
19638          vhacw(mgs) = qhacw(mgs)*rho0(mgs)/rimdn(mgs,lh)
19639          vhacr(mgs) = qhacr(mgs)*rho0(mgs)/raindn(mgs,lh)
19640 !        IF ( lvol(lh) .gt. 1 .and. wetgrowth(mgs) ) THEN
19641          IF ( xdn(mgs,lh) .lt. xdnmx(lh) ) THEN
19642          ! soak some liquid into the graupel
19643 !           v1 = xdnmx(lh)*vx(mgs,lh)/(xdn(mgs,lh)*dtp) ! volume available for filling
19644            v1 = (1. - xdn(mgs,lh)/xdnmx(lh))*vx(mgs,lh)/(dtp) ! volume available for filling
19645 !            tmp = (vx(mgs,lh)/rho0(mgs))*(xdnmx(lh) - xdn(mgs,lh)) ! max mixing ratio of liquid water that can be added
19646            v2 = rho0(mgs)*qhwet(mgs)/xdnmx(lh)  ! volume of frozen accretion
19647            
19648            vhsoak(mgs) = Min(v1,v2)
19650            
19651          ENDIF
19652          
19653          ENDIF
19655          vhshdr(mgs) = Min(0.0, rho0(mgs)*qhwet(mgs)/xdnmx(lh) - vhacw(mgs) - vhacr(mgs) )
19656          
19657         ELSEIF ( lvol(lh) .gt. 1  .and. mixedphase ) THEN
19658 !         vhacw(mgs) = rho0(mgs)*qhacw(mgs)/xdn0(lr)
19659 !         vhacr(mgs) = rho0(mgs)*qhacr(mgs)/xdn0(lr)
19660         ENDIF
19661         
19663       qhdpv(mgs) = 0.0
19664 !      qhsbv(mgs) = 0.0
19665       chdpv(mgs) = 0.0
19666 !      chsbv(mgs) = 0.0
19668 ! collection efficiency modification
19670       IF ( ehi(mgs) .gt. 0.0 ) THEN
19671         qhaci(mgs) = Min(qimxd(mgs),qhaci0(mgs))  ! effectively sets collection eff to 1
19672         chaci(mgs) = Min(cimxd(mgs),chaci0(mgs))  ! effectively sets collection eff to 1
19673       ENDIF
19674       IF ( ehs(mgs) .gt. 0.0 ) THEN
19675 !        qhacs(mgs) = Min(qsmxd(mgs),qhacs(mgs)/ehs(mgs))  ! effectively sets collection eff to 1
19676         qhacs(mgs) = Min(qsmxd(mgs),qhacs0(mgs)) !/ehs(mgs)                   ! divide out the collection efficiency
19677         chacs(mgs) = Min(csmxd(mgs),chacs0(mgs)) !/ehs(mgs)                   ! divide out the collection efficiency
19678         ehs(mgs) = ehsmax ! 1.0 ! min(ehsfrac*ehs(mgs),ehsmax)            ! modify it
19679         qhacs(mgs) = Min(qsmxd(mgs),qhacs(mgs))   ! plug it back in
19680       ENDIF
19682 ! be sure to catch particles with wet surfaces but not in wet growth to turn off Hallett-Mossop
19683       wetsfc(mgs) = .true.
19685       else
19686 !        qhshr(mgs) = 0.0
19687       end if
19690 !  hail
19692 !      if ( lhl .gt. 1 .and. qhlshr(mgs) .lt. 0.0 ) then
19693       if ( lhl > 1 .and. ( wetgrowthhl(mgs) .or. (mixedphase .and. fhlw(mgs) .gt. 0.05 .and. temg(mgs) .gt. 243.15) ) ) then
19694 !      if ( wetgrowthhl(mgs) ) then
19695        
19697       qhldpv(mgs) = 0.0
19698 !      qhlsbv(mgs) = 0.0
19699       chldpv(mgs) = 0.0
19700 !      chlsbv(mgs) = 0.0
19705         IF ( lvol(lhl) .gt. 1  .and. .not. mixedphase ) THEN
19706 !        IF ( lvol(lhl) .gt. 1 .and. wetgrowthhl(mgs) ) THEN
19708          IF ( iwetsoak ) THEN 
19710          rimdn(mgs,lhl) = xdnmx(lhl) 
19711          raindn(mgs,lhl) = xdnmx(lhl) 
19712          vhlacw(mgs) = qhlacw(mgs)*rho0(mgs)/rimdn(mgs,lhl)
19713          vhlacr(mgs) = qhlacr(mgs)*rho0(mgs)/raindn(mgs,lhl)
19715          IF ( xdn(mgs,lhl) .lt. xdnmx(lhl) ) THEN
19716          ! soak some liquid into the hail
19717 !           v1 = xdnmx(lhl)*vx(mgs,lhl)/(xdn(mgs,lhl)*dtp) ! volume available for filling
19718            v1 = (1. - xdn(mgs,lhl)/xdnmx(lhl))*vx(mgs,lhl)/(dtp) ! volume available for filling
19719 !            tmp = (vx(mgs,lhl)/rho0(mgs))*(xdnmx(lhl) - xdn(mgs,lhl)) ! max mixing ratio of liquid water that can be added
19720            v2 = rho0(mgs)*qhlwet(mgs)/xdnmx(lhl)  ! volume of frozen accretion
19721            IF ( v1 > v2 ) THEN ! all the frozen stuff fits in
19722              vhlsoak(mgs) = v2
19723            ELSE  ! fill up the available space
19724              vhlsoak(mgs) = v1
19725            ENDIF
19726 !           vhlacw(mgs) = 0.0
19727 !           vhlacr(mgs) = Max( 0.0, v2 - v1 )
19728          ELSE
19729            vhlsoak(mgs) = 0.0
19730 !           vhlacw(mgs) = 0.0
19731 !           vhlacr(mgs) = rho0(mgs)*qhlwet(mgs)/raindn(mgs,lhl)
19732          
19733          ENDIF
19734          
19735          ENDIF
19737          vhlshdr(mgs) = Min(0.0, rho0(mgs)*qhlwet(mgs)/xdnmx(lhl) - vhlacw(mgs) - vhlacr(mgs) )
19740         ELSEIF ( lvol(lhl) .gt. 1  .and. mixedphase ) THEN
19741 !         vhlacw(mgs) = rho0(mgs)*qhlacw(mgs)/xdn0(lr)
19742 !         vhlacr(mgs) = rho0(mgs)*qhlacr(mgs)/xdn0(lr)
19743         ENDIF
19745       IF ( ehli(mgs) .gt. 0.0 ) THEN
19746         qhlaci(mgs) = Min(qimxd(mgs),qhlaci0(mgs))  ! effectively sets collection eff to 1
19747         chlaci(mgs) = Min(cimxd(mgs),chlaci0(mgs))  ! effectively sets collection eff to 1
19748       ENDIF
19750 !      IF ( ehls(mgs) .gt. 0.0 ) THEN
19751 !        qhlacs(mgs) = Min(qsmxd(mgs),qhlacs(mgs)/ehls(mgs))
19752 !      ENDIF
19753       IF ( ehls(mgs) .gt. 0.0 ) THEN
19754         qhlacs(mgs) = Min(qsmxd(mgs),qhlacs0(mgs)) !/ehls(mgs)                   ! divide out the collection efficiency
19755         chlacs(mgs) = Min(csmxd(mgs),chlacs0(mgs)) !/ehls(mgs)                   ! divide out the collection efficiency
19756         ehls(mgs) = ehsmax ! 1.0 ! min(ehsfrac*ehs(mgs),ehsmax)            ! modify it
19757 !        qhlacs(mgs) = Min(qsmxd(mgs),qhlacs(mgs))   ! plug it back in
19758       ENDIF
19760       
19761 !      qhlwet(mgs) = 1.0
19763 ! be sure to catch particles with wet surfaces but not in wet growth to turn off Hallett-Mossop
19764       wetsfchl(mgs) = .true.
19767       else
19768 !      qhlshr(mgs) = 0.0
19769 !      qhlwet(mgs) = 0.0
19770       end if
19772       end do
19774 ! Ice -> graupel conversion
19776       DO mgs = 1,ngscnt
19777       
19778       qhcni(mgs) = 0.0
19779       chcni(mgs) = 0.0
19780       chcnih(mgs) = 0.0
19781       vhcni(mgs) = 0.0
19782       
19783       IF ( iglcnvi .ge. 1 ) THEN
19784       IF ( temg(mgs) .lt. 273.0 .and. qiacw(mgs) - qidpv(mgs) .gt. 0.0 ) THEN
19785       
19786         
19787         tmp = rimc1*(-((0.5)*(1.e+06)*xdia(mgs,lc,1))   &
19788      &                *((0.60)*vtxbar(mgs,li,1))   &
19789      &                /(temg(mgs)-273.15))**(rimc2)
19790         tmp = Min( Max( rimc3, tmp ), 900.0 )
19791         
19792         !  Assume that half the volume of the embryo is rime with density 'tmp'
19793         !  m = rhoi*(V/2) + rhorime*(V/2) = (rhoi + rhorime)*V/2
19794         !  V = 2*m/(rhoi + rhorime)
19795         
19796 !        write(0,*)  'rime dens = ',tmp
19797         
19798         IF ( tmp .ge. 200.0 .or. iglcnvi >= 2 ) THEN
19799           r = Max( 0.5*(xdn(mgs,li) + tmp), xdnmn(lh) )
19800 !          r = Max( r, 400. )
19801           qhcni(mgs) = (qiacw(mgs) - qidpv(mgs)) ! *float(iglcnvi)
19802           chcni(mgs) = cx(mgs,li)*qhcni(mgs)/qx(mgs,li)
19803 !          chcnih(mgs) = rho0(mgs)*qhcni(mgs)/(1.6e-10)
19804           chcnih(mgs) = Min(chcni(mgs), rho0(mgs)*qhcni(mgs)/(r*xvmn(lh)) )
19805 !          vhcni(mgs) = rho0(mgs)*2.0*qhcni(mgs)/(xdn(mgs,li) + tmp)
19806           vhcni(mgs) = rho0(mgs)*qhcni(mgs)/r
19807         ENDIF
19808       
19809       ELSEIF ( iglcnvi == 3 ) THEN
19811        IF ( temg(mgs) .lt. 273.0 .and. qiacw(mgs)*dtp > 2.*qxmin(lh) .and. gamice73fac*xmas(mgs,li) > xdnmn(lh)*xvmn(lh) ) THEN
19812       
19813         
19814         tmp = rimc1*(-((0.5)*(1.e+06)*xdia(mgs,lc,1))   &
19815      &                *((0.60)*vtxbar(mgs,li,1))   &
19816      &                /(temg(mgs)-273.15))**(rimc2)
19817         tmp = Min( Max( rimc3, tmp ), 900.0 )
19818         
19819         !  Assume that half the volume of the embryo is rime with density 'tmp'
19820         !  m = rhoi*(V/2) + rhorime*(V/2) = (rhoi + rhorime)*V/2
19821         !  V = 2*m/(rhoi + rhorime)
19822         
19823 !        write(0,*)  'rime dens = ',tmp
19824         ! convert to particles with the mass of the mass-weighted diameter
19825       !  massofmwr = gamice73fac*xmas(mgs,li)
19826         
19827         IF ( tmp .ge. xdnmn(lh)  ) THEN
19828           r = Max( 0.5*(xdn(mgs,li) + tmp), xdnmn(lh) )
19829 !          r = Max( r, 400. )
19830           qhcni(mgs) = 0.5*qiacw(mgs)
19831           chcni(mgs) = qhcni(mgs)/(gamice73fac*xmas(mgs,li))
19832           chcnih(mgs) = Min(chcni(mgs), rho0(mgs)*qhcni(mgs)/(r*xvmn(lh)) )
19833 !          vhcni(mgs) = rho0(mgs)*2.0*qhcni(mgs)/(xdn(mgs,li) + tmp)
19834           vhcni(mgs) = rho0(mgs)*qhcni(mgs)/r
19835         ENDIF
19836       
19837       ENDIF
19839       
19840       ENDIF
19841       ENDIF
19842       
19843       
19844       ENDDO
19845       
19846       
19847       qhlcnh(:) = 0.0
19848       chlcnh(:) = 0.0
19849       chlcnhhl(:) = 0.0
19850       vhlcnh(:) = 0.0
19851       vhlcnhl(:) = 0.0
19852       zhlcnh(:) = 0.0
19854       qhcnhl(:) = 0.0
19855       chcnhl(:) = 0.0
19856       vhcnhl(:) = 0.0
19857       zhcnhl(:) = 0.0
19860       IF ( lhl .gt. 1  ) THEN
19861       
19862       IF ( ihlcnh == 1 .or. ihlcnh == 3 ) THEN
19865 !  Graupel (h) conversion to hail (hl) based on Milbrandt and Yau 2005b
19867       DO mgs = 1,ngscnt
19869 !        IF ( lhl .gt. 1 .and. ipconc .ge. 5 .and. qx(mgs,lh) .gt. 1.0e-3 .and.
19870 !     :        xdn(mgs,lh) .gt. 750. .and. qhshr(mgs) .lt. 0.0 .and.
19871 !     :        xdia(mgs,lh,3) .gt. 1.e-3 ) THEN
19872         IF ( hlcnhdia > 0 ) THEN
19873           ltest = xdia(mgs,lh,3) .gt. hlcnhdia  ! test on mean volume diameter
19874         ELSE 
19875 !          ltest =  xdia(mgs,lh,1)*(3. + alpha(mgs,lh)) > Abs( hlcnhdia ) ! test on maximum mass diameter
19876           ltest =  xdia(mgs,lh,1)*(4. + alpha(mgs,lh)) > Abs( hlcnhdia ) ! test on mass-weighted diameter
19877         ENDIF
19879          IF ( iusedw == 0 .and. ihlcnh == 1 ) THEN
19880            dg0(mgs) = -1.
19881          ELSE
19882          IF (((qhacw(mgs) + qhacr(mgs))*dtp > qxmin(lh) .and. qx(mgs,lh) > hlcnhqmin .and. temg(mgs) .le. tfr-2.0  &
19883                .and.  temg(mgs) .gt. dwtempmin ) .or. ( wetgrowth(mgs) .and. qx(mgs,lh) > hlcnhqmin ) ) THEN
19884 !         dw = 0.01*( Exp( -temcg(mgs)/( 1.1e4 * rho0(mgs)*ehw(mgs)*qx(mgs,lc) - 1.3e3*rho0(mgs)*qx(mgs,li) + 1.0 ) ) - 1.0 )
19885 !         dwr = 0.01*( Exp( -temcg(mgs)/( 1.1e4 * rho0(mgs)*(ehw(mgs)*qx(mgs,lc)+ehr(mgs)*qx(mgs,lr)) - &
19886 !                1.3e3*rho0(mgs)*qx(mgs,li) + 1.0 ) ) - 1.0 )
19887             x =   1.1e4 * rho0(mgs)*(ehw(mgs)*qx(mgs,lc)+ehr(mgs)*qx(mgs,lr)) - &
19888                 1.3e3*rho0(mgs)*qx(mgs,li) + 1.0 
19889             IF ( x > 1.e-20 ) THEN
19890               arg = Min(70.0, (-temcg(mgs)/x )) ! prevent overflow of the exp function in 32 bit
19891               dwr = 0.01*(exp(arg) - 1.0)
19892             ELSE
19893               dwr = 1.e30
19894             ENDIF
19895           d = dwr
19896            IF ( dwr < 0.2 .and. dwr > 0.0 .and. rho0(mgs)*(qx(mgs,lc)+qx(mgs,lr)) > 1.e-4 ) THEN
19897                       sqrtrhovt = Sqrt( rhovt(mgs) )
19898                       fventh = sqrtrhovt*(fpndl(mgs)**(1./3.)) * (fakvisc(mgs))**(-0.5) 
19899                       fventm = sqrtrhovt*(fschm(mgs)**(1./3.)) * (fakvisc(mgs))**(-0.5)
19900                       ltemq = (tfr-163.15)/fqsat+1.5
19901                       qvs0 = pqs(mgs)*tabqvs(ltemq)
19902                       denomdp = felf(mgs) + fcw(mgs)*temcg(mgs)
19903                       denominvdp = 1.d0/(felf(mgs) + fcw(mgs)*temcg(mgs))
19905 !                      write(91,*) 'dw,dwr,temcg = ',100.*dw,100.*dwr,temcg(mgs)
19906                       h1 = ( -ftka(mgs)*temcg(mgs) - felv(mgs)*fwvdf(mgs)*rho0(mgs)*(qx(mgs,lv) - qvs0) )
19907                       h2 = ehi(mgs)*qx(mgs,li)*rho0(mgs)*fci(mgs)*temcg(mgs)
19908                       h3 = Max(dwehwmin, ehw(mgs))*qx(mgs,lc) 
19909                       h4 = ehr(mgs)* qx(mgs,lr)
19910                       ! iterate to find minimum diameter for wet growth. Start with value of dwr
19911                       DO n = 1,10
19912                         d = Max(d, 1.e-4)
19913                         dold = d
19914                         vth = axx(mgs,lh)*d**bxx(mgs,lh) 
19915                         x2 = fventh*sqrtrhovt*Sqrt(d*vth)
19916                        IF ( x2 > 1.4 ) THEN
19917                          ah = 0.78 + 0.308*x2  ! heat ventillation
19918                        ELSE
19919                          ah = 1.0 + 0.108*x2**2 ! mass ventillation (Beard and Pruppacher 1971, eq. 9)
19920                        ENDIF
19922                        IF ( .false. ) THEN ! this option includes 'am' separate from ah, which makes only small differences. Otherwise equivalent to second option
19923                         x1 = fventm*sqrtrhovt*Sqrt(d*vth)
19924                         IF ( x1 > 1.4 ) THEN
19925                           am = 0.78 + 0.308*x1 ! mass ventillation (Beard and Pruppacher 1971, eq. 8)
19926                         ELSE
19927                           am = 1.0 + 0.108*x1**2 ! mass ventillation (Beard and Pruppacher 1971, eq. 9)
19928                         ENDIF
19929                         
19930                         d = 8.*denominvdp*( am*felv(mgs)*fwvdf(mgs)*rho0(mgs)*(qvs0 - qx(mgs,lv)) - ah*ftka(mgs)*temcg(mgs)  )/ &
19931                            (dtp* ( ( Max(0.001,vth - vtxbar(mgs,lc,1))*h3 +                              &
19932                             Max(0.001,vth - vtxbar(mgs,lr,1))*h4) *rho0(mgs) +               &
19933                             Max(0.001,vth - vtxbar(mgs,li,1))*h2*denominvdp))
19934                        
19935                         ELSE
19937                         ! Based on Farley and Orville (1986), eq. 5-9 but neglecting the Ci*(T0-Ts) term in (8) since we want Ts=T0
19938                         ! Simplified mass rates as dm_w/dt = pi/4*d**2*(Vh - Vc)*rhoair*qc*ehw, etc.
19939                         d = 8.*ah*h1/ &
19940                             ( ( Max(0.001,vth - vtxbar(mgs,lc,1))*h3 +                              &
19941                             Max(0.001,vth - vtxbar(mgs,lr,1))*h4) *rho0(mgs)*denomdp +               &
19942                             Max(0.001,vth - vtxbar(mgs,li,1))*h2)
19943                             
19944                         ENDIF
19945                         IF ( Abs(dold - d)/dold < 0.05 .or. ( n > 3 .and. d > dg0thresh ) ) EXIT
19946                         
19947                       ENDDO
19948               ENDIF
19949               
19950               dg0(mgs) = Min( dwmax, Max( d, dwmin ) )
19951           ELSE
19952             IF ( qx(mgs,lh) > qxmin(lh) .and. qx(mgs,lh) > hlcnhqmin .and. temg(mgs) .le. tfr-2.0  ) THEN
19953               dg0(mgs) = dwmax
19954             ELSE
19955               dg0(mgs) = dg0thresh + 0.0001
19956             ENDIF
19957           ENDIF
19958           
19959             IF ( ihlcnh == 3 .and. (qhacw(mgs) + qhacr(mgs))*dtp > qxmin(lh) .and. qx(mgs,lh) > hlcnhqmin &
19960                    .and. temg(mgs) .le. tfr-2.0 ) THEN
19961            ! set a secondary condition on to capture large graupel that is riming but not in wet growth
19962                 dg0(mgs) = Min( dg0(mgs), dg0thresh - 0.0001 )
19963             ENDIF
19964             
19965           ENDIF
19967         wtest = (dg0(mgs) > 0.0 .and. dg0(mgs) < dg0thresh )
19968         
19969         IF ( ihlcnh == 1 ) THEN ! .or. iusedw == 0  THEN
19970         
19971         IF ( ( wetgrowth(mgs) .and. (xdn(mgs,lh) .gt. hldnmn .or. lvh < 1 ) .and.  & ! correct this when hail gets turned on
19972      &        rimdn(mgs,lh) .gt. 800. .and.   &
19973      &        ltest .and. qx(mgs,lh) .gt. hlcnhqmin ) .or. wtest ) THEN ! {
19974 !     :        xdia(mgs,lh,3) .gt. 2.e-3 .and. qx(mgs,lh) .gt. 1.0e-3  THEN ! 0823.2008 erm test
19975 !        IF ( xdia(mgs,lh,3) .gt. 1.e-3 ) THEN
19976         IF ( qhacw(mgs) .gt. 0.0 .and. qhacw(mgs) .gt. qhaci(mgs) .and. temg(mgs) .le. tfr-2.0 ) THEN ! {
19977         ! dh0 is the diameter dividing wet growth from dry growth (Ziegler 1985), modified by MY05
19978 !          dh0 = 0.01*(exp(temcg(mgs)/(1.1e4*(qx(mgs,lc)+qx(mgs,lr)) - 
19979 !     :           1.3e3*qx(mgs,li) + 1.0e-3 ) ) - 1.0)
19980           IF ( wtest ) THEN
19981             dh0 = dg0(mgs)
19982           ELSE
19983             x = (1.1e4*(rho0(mgs)*qx(mgs,lc)) - 1.3e3*rho0(mgs)*qx(mgs,li) + 1.0e-3 )
19984             IF ( x > 1.e-20 ) THEN
19985             arg = Min(70.0, (-temcg(mgs)/x )) ! prevent overflow of the exp function in 32 bit
19986             dh0 = 0.01*(exp(arg) - 1.0)
19987             ELSE
19988              dh0 = 1.e30
19989             ENDIF
19990           ENDIF ! wtest
19991 !          dh0 = Max( dh0, 5.e-3 )
19992           
19993 !         IF ( dh0 .gt. 0.0 ) write(0,*) 'dh0 = ',dh0
19994 !         IF ( dh0 .gt. 1.0e-4 ) THEN
19995          IF ( xdia(mgs,lh,3)/dh0 .gt. 0.1 ) THEN !{
19996 !         IF ( xdia(mgs,lh,3) .lt. 20.*dh0 .and. dh0 .lt. 2.0*xdia(mgs,lh,3) ) THEN 
19997            tmp = qhacw(mgs) + qhacr(mgs) + qhaci(mgs) + qhacs(mgs)
19998 !           qtmp = Min( 1.0, xdia(mgs,lh,3)/(2.0*dh0) )*(tmp)
19999            qtmp = Min( 100.0, xdia(mgs,lh,3)/(2.0*dh0) )*(tmp)
20000            qhlcnh(mgs) = Min(  qxmxd(mgs,lh), qtmp )
20001            
20002            IF ( ipconc .ge. 5 ) THEN !{
20003 !           dh0 = Max( xdia(mgs,lh,3), Min( dh0, 5.e-3 ) ) ! do not create hail greater than 5mm diam. unless the graupel is larger
20004            IF ( .not. wtest ) dh0 = Min( dh0, 10.e-3 ) ! do not create hail greater than 10mm diam., which is the max graupel size
20005            IF ( qx(mgs,lhl) > 0.1e-3 ) dh0 = Max( dh0, xdia(mgs,lhl,3) ) ! when enough hail is established, do not dilute the size
20006            chlcnhhl(mgs) = Min( cxmxd(mgs,lh), rho0(mgs)*qhlcnh(mgs)/(pi*xdn(mgs,lh)*dh0**3/6.0) )
20008            r = rho0(mgs)*qhlcnh(mgs)/(xdn(mgs,lh)*xv(mgs,lh))  ! number of graupel particles at mean volume diameter
20009            chlcnh(mgs) = Max( chlcnhhl(mgs), r )
20010            ENDIF !}
20011            
20012            vhlcnh(mgs) = rho0(mgs)*qhlcnh(mgs)/xdn(mgs,lh)
20013            vhlcnhl(mgs) = rho0(mgs)*qhlcnh(mgs)/Max(xdnmn(lhl), xdn(mgs,lh))
20015           ENDIF !}
20017         ENDIF ! }
20018         ENDIF ! }
20019         
20020         ELSEIF ( ihlcnh == 3 ) THEN !{
20021          
20023           IF ( wtest  .and. &
20024                ( qhacw(mgs)*dtp > qxmin(lh) .and. temg(mgs) .lt. tfr-2. .and. qx(mgs,lh) > hlcnhqmin ) ) THEN
20025         ! convert number, mass, and reflectivity for d > dw
20026            IF ( ipconc == 5 ) THEN
20027             ! dg0(mgs) = Min( dg0(mgs), hldia1 )
20028              !dg0(mgs) = hldia1
20029            ENDIF
20030            
20031            ratio = Min( maxratiolu, dg0(mgs)/xdia(mgs,lh,1) )
20034            ! mass
20035             tmp2 = gaminterp(ratio,alpha(mgs,lh),4,1)
20036            IF ( ipconc == 5 ) THEN
20037        !      tmp2 = Min( 0.25, tmp2 )
20038            ENDIF
20039             qxd1 = qx(mgs,lh)*(tmp2)
20040             qhlcnh(mgs) = dtpinv*qxd1
20041             flim = 1.0
20042             tmp3 = qxmxd(mgs,lh)
20043             IF (qxd1 > tmp3 ) THEN
20044 !              flim = tmp3/(qxd1)
20045 !              qhlcnh(mgs) = flim*qhlcnh(mgs)
20046             ENDIF
20048             
20049             
20050             IF ( ( qxd1 > qxmin(lhl) .and. ipconc > 5 ) .or. ( qxd1 > 10.*qxmin(lhl) .and. ipconc == 5) ) THEN
20051             
20052            ! number
20053             tmp = gaminterp(ratio,alpha(mgs,lh),1,1)
20054              IF ( ipconc == 5 ) THEN
20055           !     tmp = Min( 0.2, tmp )
20056              ENDIF
20057             cxd1 = flim*cx(mgs,lh)*( tmp)
20058             chlcnh(mgs) = dtpinv*cxd1
20059             chlcnhhl(mgs) = chlcnh(mgs)
20061            IF ( qx(mgs,lhl) > qxmin(lhl) .and. dmhlopt > 0 ) THEN
20062              tmp = rho0(mgs)*qhlcnh(mgs)/chlcnhhl(mgs)
20063              IF ( tmp < xmas(mgs,lhl) ) THEN
20064                ! dh0 = ( qxd1*dh0 + qx(mgs,lhl)*xmas(mgs,lhl))/( qxd1 + qx(mgs,lhl))  ! weighted average
20065                dh0 = (( qxd1*tmp**(1./3.) + qx(mgs,lhl)*xmas(mgs,lhl)**(1./3.))/( qxd1 + qx(mgs,lhl)))**3  ! weighted average
20066                chlcnhhl(mgs) = Min( chlcnhhl(mgs), rho0(mgs)*qhlcnh(mgs)/dh0 )
20067              ELSE
20068 !               dh0 = Max( dh0, xmas(mgs,lhl) ) ! when enough hail is established, do not dilute the size
20069              ENDIF
20070            ENDIF
20073            ! reflectivity
20074            IF ( ipconc >= 6 .and. lzh > 1 .and. lzhl > 1 ) THEN
20075             tmp3 = gaminterp(ratio,alpha(mgs,lh),11,1)
20076             zxd1 = flim*zx(mgs,lh)*(tmp3)
20077             zhlcnh(mgs) = dtpinv*zxd1
20078            ELSE
20079             zxd1 = 0
20080            ENDIF
20082             ELSE
20083                qhlcnh(mgs) = 0.0
20084             ENDIF
20086            vhlcnh(mgs) = rho0(mgs)*qhlcnh(mgs)/xdn(mgs,lh)
20087            vhlcnhl(mgs) = rho0(mgs)*qhlcnh(mgs)/Max(xdnmn(lhl), xdn(mgs,lh))
20088            
20089            ENDIF
20092         ENDIF !}
20093       
20094       ENDDO
20095       
20096       ELSEIF ( ihlcnh == 2 ) THEN ! 10-ice type conversion 
20099 ! Staka and Mansell (2005) type conversion
20101 !      hldia1 is set in micro_module and namelist
20102 !      IF ( .true. ) THEN
20103       
20104         ! convert number, mass, and reflectivity for d > hldia1,
20105         ! regardless of wet growth status, but as long as riming > 0
20106         DO mgs = 1,ngscnt
20107         IF ( qhacw(mgs)*dtp > qxmin(lh) .and. temg(mgs) .lt. tfr-2. .and. qx(mgs,lh) > qxmin(lh) ) THEN
20108            ratio = Min( maxratiolu, hldia1/xdia(mgs,lh,1) )
20110            ! number
20111             tmp = gaminterp(ratio,alpha(mgs,lh),1,1)
20112             cxd1 = cx(mgs,lh)*( tmp)
20113             chlcnh(mgs) = dtpinv*cxd1
20114             chlcnhhl(mgs) = chlcnh(mgs)
20116            ! mass
20117             tmp2 = gaminterp(ratio,alpha(mgs,lh),4,1)
20118             qxd1 = qx(mgs,lh)*(tmp2)
20119             qhlcnh(mgs) = dtpinv*qxd1
20121            ! reflectivity
20122            IF ( lzh > 1 .and. lzhl > 1 ) THEN
20123             tmp3 = gaminterp(ratio,alpha(mgs,lh),11,1)
20124             zxd1 = zx(mgs,lh)*(tmp3)
20125             zhlcnh(mgs) = dtpinv*zxd1
20126            ELSE
20127             zxd1 = 0
20128            ENDIF
20129            vhlcnh(mgs) = rho0(mgs)*qhlcnh(mgs)/xdn(mgs,lh)
20130            vhlcnhl(mgs) = rho0(mgs)*qhlcnh(mgs)/Max(xdnmn(lhl), xdn(mgs,lh))
20131            
20132          ENDIF
20133          
20134          ENDDO
20135 !        ENDIF
20136       ELSEIF ( ihlcnh == 0 ) THEN
20138       do mgs = 1,ngscnt
20139 !      qhlcnh(mgs) = 0.0
20140 !      chlcnh(mgs) = 0.0
20141       if ( wetgrowth(mgs) .and. temg(mgs) .lt. tfr-5. .and. qx(mgs,lh) > qxmin(lh) ) then
20142       if ( qhacw(mgs).gt.1.e-6 .and. xdn(mgs,lh) > 700. ) then
20143       qhlcnh(mgs) =                                                   &
20144         ((pi*xdn(mgs,lh)*cx(mgs,lh)) / (6.0*rho0(mgs)*dtp))           &
20145        *exp(-hldia1/xdia(mgs,lh,1))                                    &
20146        *( (hldia1**3) + 3.0*(hldia1**2)*xdia(mgs,lh,1)                  &
20147         + 6.0*(hldia1)*(xdia(mgs,lh,1)**2) + 6.0*(xdia(mgs,lh,1)**3) )
20148       qhlcnh(mgs) =   min(qhlcnh(mgs),qhmxd(mgs))
20149       IF ( ipconc .ge. 5 ) THEN
20150         chlcnh(mgs) = Min( cxmxd(mgs,lh), cx(mgs,lh)*Exp(-hldia1/xdia(mgs,lh,1)))
20151         chlcnhhl(mgs) = chlcnh(mgs)
20152 !        chlcnh(mgs) = Min( cxmxd(mgs,lh), rho0(mgs)*qhlcnh(mgs)/(2.0*xmas(mgs,lh) ))
20153       ENDIF
20154            vhlcnh(mgs) = rho0(mgs)*qhlcnh(mgs)/xdn(mgs,lh)
20155            vhlcnhl(mgs) = rho0(mgs)*qhlcnh(mgs)/Max(xdnmn(lhl), xdn(mgs,lh))
20156       end if
20157       end if
20158       end do
20159       
20160 !      ENDIF ! true
20161       
20162       ENDIF ! ihlcnh options
20163       
20164      ! convert low-density hail to graupel
20165       IF ( icvhl2h >= 1 ) THEN
20166       DO mgs = 1,ngscnt
20167         IF (  qx(mgs,lhl) > qxmin(lhl) .and. xdn(mgs,lhl) < 0.5*(xdnmn(lhl) + xdnmx(lhl)) ) THEN
20168           tmp = Min(0.95, 1. - 0.5*(1. + tanh(0.125*(xdn(mgs,lhl) - 1.01*xdnmn(lhl) )) ))
20169           qhcnhl(mgs) = tmp*qx(mgs,lhl)*dtpinv
20170           chcnhl(mgs) = cx(mgs,lhl)*qhcnhl(mgs)/qx(mgs,lhl)
20171           vhcnhl(mgs) = vx(mgs,lhl)*qhcnhl(mgs)/qx(mgs,lhl)
20172           
20173         ENDIF
20174       ENDDO
20175       
20176       ENDIF
20177       
20178       ENDIF ! lhl > 1
20180   
20181   
20184 ! Ziegler snow conversion to graupel
20186       DO mgs = 1,ngscnt
20188       qhcns(mgs) = 0.0
20189       chcns(mgs) = 0.0
20190       chcnsh(mgs) = 0.0
20191       vhcns(mgs) = 0.0
20193       qscnh(mgs) = 0.0
20194       cscnh(mgs) = 0.0
20195       vscnh(mgs) = 0.0
20197       IF ( ipconc .ge. 5 ) THEN
20199         ! test attempt at converting graupel to snow when not riming but growing by deposition
20200         IF ( temg(mgs) < tfr .and. qx(mgs,lh) .gt. qxmin(lh) .and. qhdpv(mgs) > qxmin(lh)*dtpinv  &
20201      &       .and. qhacw(mgs) < qxmin(lh)*dtpinv ) THEN
20202           IF ( xdn(mgs,lh) < 290. ) THEN
20203 !          qscnh(mgs) = 2.*qhdpv(mgs)
20204 !          cscnh(mgs) = cx(mgs,lh)*qscnh(mgs)/qx(mgs,lh)
20205 !          vscnh(mgs) = rho0(mgs)*qscnh(mgs)/xdn(mgs,lh)
20206           ENDIF
20207         ENDIF
20210         IF ( qx(mgs,ls) .gt. qxmin(ls) .and. qsacw(mgs) .gt. 0.0 ) THEN
20212 !      DATA VGRA/1.413E-2/  ! this is the volume (cm**3) of a 3mm diam. sphere
20213 !    vgra = 1.4137e-8 m**3
20215 !      DNNET=DNCNV-DNAGG
20216 !      DQNET=QXCON+QSACC+SDEP
20218 !      DNSCNV=EXP(-(ROS*XNS*VGRA/(RO*QI)))*((1.-(XNS*VGRA*ROS/
20219 !     / (RO*QI)))*DNNET + (XNS**2*VGRA*ROS/(RO*QI**2))*DQNET)
20220 !      IF(DNSCNV.LT.0.) DNSCNV=0.
20222 !      QIHC=(ROS*VGRA/RO)*DNSCNV
20224 !      QH=QH+DT*QIHC
20225 !      QI=QI-DT*QIHC
20226 !      XNH=XNH+DT*DNSCNV
20227 !      XNS=XNS-DT*DNSCNV
20229         IF ( iglcnvs .eq. 1 ) THEN  ! Zrnic, Ziegler et al (1993)
20231         dnnet = cscnvis(mgs) + cscnis(mgs) - csacs(mgs)
20232         dqnet = qscnvi(mgs) + qscni(mgs) + qsacw(mgs) + qsdpv(mgs) + qssbv(mgs)
20234         a3 = 1./(rho0(mgs)*qx(mgs,ls))
20235         a1 = Exp( - xdn(mgs,ls)*cx(mgs,ls)*vgra*a3 ) !! EXP(-(ROS*XNS*VGRA/(RO*QI)))
20236 ! (1.-(XNS*VGRA*ROS/(RO*QI)))*DNNET
20237         a2 =  (1.-(cx(mgs,ls)*vgra*xdn(mgs,ls)*a3))*dnnet
20238 ! (XNS**2*VGRA*ROS/(RO*QI**2))*DQNET
20239         a4 = cx(mgs,ls)**2*vgra*xdn(mgs,ls)*a3/qx(mgs,ls)*dqnet
20241         chcns(mgs) = Max( 0.0, a1*(a2 + a4) )
20242         chcns(mgs) = Min( chcns(mgs), cxmxd(mgs,ls) )
20243         chcnsh(mgs) = chcns(mgs)
20245         qhcns(mgs) = Min( xdn(mgs,ls)*vgra*rhoinv(mgs)*chcns(mgs), qxmxd(mgs,ls) )
20246         vhcns(mgs) = rho0(mgs)*qhcns(mgs)/Max(xdn(mgs,ls),xdnmn(lh))
20247 !        vhcns(mgs) = rho0(mgs)*qhcns(mgs)/Max(xdn(mgs,ls),400.)
20249         ELSEIF ( iglcnvs .ge. 2  ) THEN  ! treat like ice crystals, i.e., check for rime density (ERM)
20251           IF ( temg(mgs) .lt. 273.0 .and. ( qsacw(mgs) - qsdpv(mgs) .gt. 0.0 .or. &
20252               ( iglcnvs >= 3 .and. qsacw(mgs)*dtp > 2.*qxmin(lh) .and. gamsnow73fac*xmas(mgs,ls) > xdnmn(lh)*xvmn(lh)  ) ) ) THEN !{
20255         tmp = rimc1*(-((0.5)*(1.e+06)*xdia(mgs,lc,1))   &
20256      &                *((0.60)*vtxbar(mgs,ls,1))   &
20257      &                /(temg(mgs)-273.15))**(rimc2)
20258 !        tmp = Min( Max( rimc3, tmp ), 900.0 )
20259         tmp = Min( tmp , 900.0 )
20261         !  Assume that half the volume of the embryo is rime with density 'tmp'
20262         !  m = rhoi*(V/2) + rhorime*(V/2) = (rhoi + rhorime)*V/2
20263         !  V = 2*m/(rhoi + rhorime)
20265 !        write(0,*)  'rime dens = ',tmp
20267         IF ( iglcnvs == 2 ) THEN !{
20268         IF ( tmp .ge. 200.0  ) THEN
20269           r = Max( 0.5*(xdn(mgs,ls) + tmp), xdnmn(lh) )
20270 !          r = Max( r, 400. )
20271           qhcns(mgs) = (qsacw(mgs) - qsdpv(mgs))
20272           chcns(mgs) = cx(mgs,ls)*qhcns(mgs)/qx(mgs,ls)
20273 !          chcnih(mgs) = rho0(mgs)*qhcni(mgs)/(1.6e-10)
20274           chcnsh(mgs) = Min(chcns(mgs), rho0(mgs)*qhcns(mgs)/(r*xvmn(lh)) )
20275 !          vhcni(mgs) = rho0(mgs)*2.0*qhcni(mgs)/(xdn(mgs,li) + tmp)
20276           vhcns(mgs) = rho0(mgs)*qhcns(mgs)/r
20277         ENDIF
20278         
20279         ELSEIF ( iglcnvs == 3 ) THEN
20281          ! convert to particles with the mass of the mass-weighted diameter
20282       !  massofmwr = gamice73fac*xmas(mgs,li)
20283         
20284         IF ( tmp > xdnmn(lh) ) THEN
20285           r = Max( 0.5*(xdn(mgs,ls) + tmp), xdnmn(lh) )
20286 !          r = Max( r, 400. )
20287           qhcns(mgs) = 0.5*qsacw(mgs)
20288           chcns(mgs) = qhcns(mgs)/(gamsnow73fac*xmas(mgs,ls))
20289           chcns(mgs) = Min( chcns(mgs), cx(mgs,ls)*qhcns(mgs)/qx(mgs,ls))
20290           chcnsh(mgs) = Min(chcns(mgs), rho0(mgs)*qhcns(mgs)/(r*xvmn(lh)) )
20291           vhcns(mgs) = rho0(mgs)*qhcns(mgs)/r
20292         ENDIF
20294         ENDIF !}
20296       ENDIF !}
20298         ENDIF
20301         ENDIF
20303        ELSE ! single moment lfo
20305         qhcns(mgs) = 0.001*ehscnv(mgs)*max((qx(mgs,ls)-6.e-4),0.0)
20306         qhcns(mgs) = min(qhcns(mgs),qxmxd(mgs,ls))
20307         IF ( lvol(lh) .ge. 1 ) vhcns(mgs) = rho0(mgs)*qhcns(mgs)/Max(xdn(mgs,ls),400.)
20309        ENDIF
20310       ENDDO
20313 !  heat budget for rain---not all rain that collects ice can freeze
20317       if ( irwfrz .gt. 0 .and. .not. mixedphase) then
20319       do mgs = 1,ngscnt
20321 !  compute total rain that freeze when it interacts with cloud ice
20323       qrztot(mgs) = qrfrz(mgs) + qiacr(mgs) + qsacr(mgs)
20325 !  compute the maximum amount of rain that can freeze
20326 !  Used to limit freezing to 4*qrmxd, but now allow all rain to freeze if possible
20328       qrzmax(mgs) =   &
20329      &  ( xdia(mgs,lr,1)*rwvent(mgs)*cx(mgs,lr)*fwet1(mgs) )
20330       qrzmax(mgs) = max(qrzmax(mgs), 0.0)
20331       qrzmax(mgs) = min(qrztot(mgs), qrzmax(mgs))
20332       qrzmax(mgs) = min(qx(mgs,lr)*dtpinv, qrzmax(mgs))
20334       IF ( temcg(mgs) < -30. ) THEN ! allow all to freeze if T < -30 because fwet becomes invalid (negative)
20335         qrzmax(mgs) = qx(mgs,lr)*dtpinv
20336       ENDIF
20337 !      qrzmax(mgs) = min(4.*qrmxd(mgs), qrzmax(mgs))
20339 !  compute the correction factor
20341 !      IF ( qrztot(mgs) .gt. qxmin(lr) ) THEN
20342       IF ( qrztot(mgs) .gt. qrzmax(mgs) .and. qrztot(mgs) .gt. qxmin(lr) ) THEN
20343         qrzfac(mgs) = qrzmax(mgs)/(qrztot(mgs))
20344       ELSE
20345         qrzfac(mgs) = 1.0
20346       ENDIF
20347       qrzfac(mgs) = min(1.0, qrzfac(mgs))
20349       end do
20352 ! now correct the above sources
20355       do mgs = 1,ngscnt
20356       if ( temg(mgs) .le. 273.15 .and. qrzfac(mgs) .lt. 1.0 ) then
20357       qrfrz(mgs)   = qrzfac(mgs)*qrfrz(mgs)
20358       qrfrzs(mgs)  = qrzfac(mgs)*qrfrzs(mgs)
20359       qrfrzf(mgs)  = qrzfac(mgs)*qrfrzf(mgs)
20360       qiacr(mgs)   = qrzfac(mgs)*qiacr(mgs)
20361       qsacr(mgs)   = qrzfac(mgs)*qsacr(mgs)
20362       qiacrf(mgs)  = qrzfac(mgs)*qiacrf(mgs)
20363       qiacrs(mgs)  = qrzfac(mgs)*qiacrs(mgs)
20364       crfrz(mgs)   = qrzfac(mgs)*crfrz(mgs)
20365       crfrzf(mgs)  = qrzfac(mgs)*crfrzf(mgs)
20366       crfrzs(mgs)  = qrzfac(mgs)*crfrzs(mgs)
20367       ciacr(mgs)   = qrzfac(mgs)*ciacr(mgs)
20368       ciacrf(mgs)  = qrzfac(mgs)*ciacrf(mgs)
20369       ciacrs(mgs)  = qrzfac(mgs)*ciacrs(mgs)
20371 !      IF ( lzh .gt. 1 ) THEN
20372 !        zrfrzf(mgs) = 3.6476*rho0(mgs)**2*(alpha(mgs,lr)+2.)/(xdn0(lr)**2*(alpha(mgs,lr)+1.)) * &
20373 !        ( 2.*tmp * qrfrzf(mgs) - tmp**2 * crfrzf(mgs)  )
20374 !      ENDIF
20375       
20376        vrfrzf(mgs)  = qrzfac(mgs)*vrfrzf(mgs)
20377        viacrf(mgs)  = qrzfac(mgs)*viacrf(mgs)
20378       end if
20379       end do
20383       end if
20387 !  evaporation of rain
20391       qrcev(:) = 0.0
20392       crcev(:) = 0.0
20395       do mgs = 1,ngscnt
20397       IF ( qx(mgs,lr) .gt. qxmin(lr) ) THEN
20399       qrcev(mgs) =   &
20400      &  fvce(mgs)*cx(mgs,lr)*rwvent(mgs)*rwcap(mgs)*evapfac
20401 ! this line to allow condensation on rain:
20402       IF ( rcond .eq. 1 ) THEN
20403         qrcev(mgs) = min(qrcev(mgs), qxmxd(mgs,lv))
20404 ! this line to have evaporation only:
20405       ELSE
20406         qrcev(mgs) = min(qrcev(mgs), 0.0)
20407       ENDIF
20409       qrcev(mgs) = max(qrcev(mgs), -qrmxd(mgs))
20410 !      if ( temg(mgs) .lt. 273.15 ) qrcev(mgs) = 0.0
20411       IF ( qrcev(mgs) .lt. 0. .and. lnr > 1 ) THEN
20412 !        qrcev(mgs) =   -qrmxd(mgs)
20413 !        crcev(mgs) = (rho0(mgs)/(xmas(mgs,lr)+1.e-20))*qrcev(mgs)
20414         IF ( icrcev == 1 ) THEN
20415           crcev(mgs) = (cx(mgs,lr)/(qx(mgs,lr)))*qrcev(mgs)
20416         ELSEIF ( icrcev == 2 ) THEN
20417           crcev(mgs) = (cx(mgs,lr)/(qx(mgs,lr)))*qrcev(mgs)*vtxbar(mgs,lr,2)/vtxbar(mgs,lr,1)
20418         ELSE
20419           crcev(mgs) = 0.0
20420         ENDIF
20421       ELSE
20422          crcev(mgs) = 0.0
20423       ENDIF
20424 !      if ( temg(mgs) .lt. 273.15 ) crcev(mgs) = 0.0
20426       ENDIF
20428       end do
20430 ! evaporation/condensation of wet graupel and snow
20432       IF ( lhwlg > 1 ) THEN
20433       qhcevlg(:) = 0.0
20434       chcevlg(:) = 0.0
20435       ENDIF
20436       IF ( lhlwlg > 1 ) THEN
20437       qhlcevlg(:) = 0.0
20438       chlcevlg(:) = 0.0
20439       ENDIF
20445 !  ICE MULTIPLICATION: Two modes (rimpa, and rimpb)
20446 !  (following Cotton et al. 1986)
20449       chmul1(:) =  0.0
20450       chlmul1(:) =  0.0
20451       csmul1(:) = 0.0
20453       qhmul1(:) =  0.0
20454       qhlmul1(:) =  0.0
20455       qsmul1(:) =  0.0
20456       do mgs = 1,ngscnt
20458        ltest =  qx(mgs,lh) .gt. qxmin(lh)
20459        IF ( lhl > 1 )  ltest =  ltest .or. qx(mgs,lhl) .gt. qxmin(lhl)
20460        
20461       IF ( (itype1 .ge. 1 .or. itype2 .ge. 1 )   &
20462      &              .and. qx(mgs,lc) .gt. qxmin(lc)) THEN
20463       if ( temg(mgs) .ge. 265.15 .and. temg(mgs) .le. 271.15 ) then
20464        IF ( ipconc .ge. 2 ) THEN
20465         IF ( xv(mgs,lc) .gt. 0.0     &
20466      &     .and.  ltest &
20467 !     .and. itype2 .ge. 2    &
20468      &       ) THEN
20470 !  Ziegler et al. 1986 Hallett-Mossop process.  VSTAR = 7.23e-15 (vol of 12micron radius)
20472          IF ( alpha(mgs,lc) == 0.0 ) THEN
20473            ex1 = (1./250.)*Exp(-7.23e-15/xv(mgs,lc))
20474          ELSE
20475            
20476            ratio = (1. + alpha(mgs,lc))*(7.23e-15)/xv(mgs,lc)
20478            IF ( usegamxinfcnu ) THEN
20479             i = Nint(dgami*(1. + alpha(mgs,lc)))
20480             gcnup1 = gmoi(i)
20481             ex1 = (1./250.)*Gamxinf(1.+alpha(mgs,lc), ratio)/(gcnup1)
20482            ELSE
20483              ratio = Min( maxratiolu, ratio )
20484              tmp = gaminterp(ratio,alpha(mgs,lc),1,1)
20485              ex1 = (1./250.)*tmp
20486            ENDIF
20487          ENDIF
20488        IF ( itype2 .le. 2 ) THEN
20489          ft = Max(0.0,Min(1.0,-0.11*temcg(mgs)**2 - 1.1*temcg(mgs)-1.7))
20490        ELSE
20491         IF ( temg(mgs) .ge. 265.15 .and. temg(mgs) .le. 267.15 ) THEN
20492           ft = 0.5
20493         ELSEIF (temg(mgs) .ge. 267.15 .and. temg(mgs) .le. 269.15 ) THEN
20494           ft = 1.0
20495         ELSEIF (temg(mgs) .ge. 269.15 .and. temg(mgs) .le. 271.15 ) THEN
20496           ft = 0.5
20497         ELSE 
20498           ft = 0.0
20499         ENDIF
20500        ENDIF
20501 !        rhoinv = 1./rho0(mgs)
20502 !        DNSTAR = ex1*cglacw(mgs)
20503         
20504        IF ( ft > 0.0 ) THEN
20505         
20506         IF ( itype2 > 0 ) THEN
20507          IF ( qx(mgs,lh) .gt. qxmin(lh) .and. (.not. wetsfc(mgs))  ) THEN
20508           chmul1(mgs) = ft*ex1*chacw(mgs)
20509 !          chmul1(mgs) = Min( ft*ex1*chacw(mgs), ft*(30.*1.e+06)*rho0(mgs)*qhacw(mgs) ) ! 1.e+6 converts kg to mg; Saunders & Hosseini (2001) average of about 30 crystals per mg
20510           qhmul1(mgs) = cimas0*chmul1(mgs)*rhoinv(mgs)
20511          ENDIF
20512          IF ( lhl .gt. 1 ) THEN
20513            IF ( qx(mgs,lhl) .gt. qxmin(lhl) .and. (.not. wetsfchl(mgs))  ) THEN
20514             chlmul1(mgs) = (ft*ex1*chlacw(mgs))
20515             qhlmul1(mgs) = cimas0*chlmul1(mgs)*rhoinv(mgs)
20516            ENDIF
20517          ENDIF
20518         ENDIF ! itype2
20520         IF ( itype1 > 0 ) THEN
20521          IF ( qx(mgs,lh) .gt. qxmin(lh) .and. (.not. wetsfc(mgs))  ) THEN
20522           tmp = ft*(3.5e+08)*rho0(mgs)*qhacw(mgs)
20523           chmul1(mgs) = chmul1(mgs) + tmp
20524           qhmul1(mgs) = qhmul1(mgs) + cimas0*tmp*rhoinv(mgs)
20525          ENDIF
20526          IF ( lhl .gt. 1 ) THEN
20527            IF ( qx(mgs,lhl) .gt. qxmin(lhl) .and. (.not. wetsfchl(mgs)) ) THEN
20528             tmp = ft*(3.5e+08)*rho0(mgs)*qhlacw(mgs)
20529             chlmul1(mgs) = chlmul1(mgs) + tmp
20530             qhlmul1(mgs) = qhlmul1(mgs) + cimas0*tmp*rhoinv(mgs)
20531            ENDIF
20532          ENDIF
20533         ENDIF ! itype1
20535         
20536         ENDIF ! ft
20538         ENDIF ! xv(mgs,lc) .gt. 0.0 .and.
20540        ELSE ! ipconc .lt. 2
20542 !  define the temperature function
20544       fimt1(mgs) = 0.0
20546 ! Cotton et al. (1986) version
20548       if ( temg(mgs) .ge. 268.15 .and. temg(mgs) .le. 270.15 ) then
20549         fimt1(mgs) = 1.0 -(temg(mgs)-268.15)/2.0
20550       elseif (temg(mgs) .le. 268.15 .and. temg(mgs) .ge. 265.15 ) then
20551         fimt1(mgs) = 1.0 +(temg(mgs)-268.15)/3.0
20552       ELSE 
20553         fimt1(mgs) = 0.0
20554       end if
20556 ! Ferrier (1994) version
20558       if ( temg(mgs) .ge. 265.15 .and. temg(mgs) .le. 267.15 ) then
20559         fimt1(mgs) = 0.5
20560       elseif (temg(mgs) .ge. 267.15 .and. temg(mgs) .le. 269.15 ) then
20561         fimt1(mgs) = 1.0
20562       elseif (temg(mgs) .ge. 269.15 .and. temg(mgs) .le. 271.15 ) then
20563         fimt1(mgs) = 0.5
20564       ELSE 
20565         fimt1(mgs) = 0.0
20566       end if
20569 !   type I:  350 splinters are formed for every 1e-3 grams of cloud
20570 !            water accreted by graupel/hail (note converted to MKS units)
20571 !            3.5e+8 has units of 1/kg
20573       IF ( itype1 .ge. 1 ) THEN
20574        fimta(mgs) = (3.5e+08)*rho0(mgs)
20575       ELSE
20576        fimta(mgs) = 0.0
20577       ENDIF
20581 !   type II:  1 splinter formed for every 250 cloud droplets larger than
20582 !             24 micons in diameter (12 microns in radius) accreted by
20583 !             graupel/hail
20586       fimt2(mgs) = 0.0
20587       xcwmas = xmas(mgs,lc) * 1000.
20589       IF ( itype2 .ge. 1 ) THEN
20590       if ( xcwmas.lt.1.26e-9 ) then
20591         fimt2(mgs) = 0.0
20592       end if
20593       if ( xcwmas .le. 3.55e-9 .and. xcwmas .ge. 1.26e-9 ) then
20594         fimt2(mgs) = (2.27)*alog(xcwmas) + 13.39
20595       end if
20596       if ( xcwmas .gt. 3.55e-9 ) then
20597         fimt2(mgs) = 1.0
20598       end if
20600       fimt2(mgs) = min(fimt2(mgs),1.0)
20601       fimt2(mgs) = max(fimt2(mgs),0.0)
20602       
20603       ENDIF
20605 !     qhmul2 = 0.0
20606 !     qsmul2 = 0.0
20608 !     qhmul2 =
20609 !    >  (4.0e-03)*fimt1(mgs)*fimt2(mgs)*qhacw(mgs)
20610 !     qsmul2 =
20611 !    >  (4.0e-03)*fimt1(mgs)*fimt2(mgs)*qsacw(mgs)
20613 !      cimas0 = (1.0e-12)
20614 !      cimas0 = 2.5e-10
20615       IF ( .not. wetsfc(mgs) ) THEN
20616       chmul1(mgs) =  fimt1(mgs)*(fimta(mgs) +   &
20617      &                           (4.0e-03)*fimt2(mgs))*qhacw(mgs)
20618       ENDIF
20620       qhmul1(mgs) =  chmul1(mgs)*(cimas0/rho0(mgs))
20622          IF ( lhl .gt. 1 ) THEN
20623            IF ( qx(mgs,lhl) .gt. qxmin(lhl) .and. (.not. wetsfchl(mgs)) ) THEN
20624             tmp = fimt1(mgs)*(fimta(mgs) +   &
20625      &                           (4.0e-03)*fimt2(mgs))*qhlacw(mgs)
20626             chlmul1(mgs) =  tmp
20627             qhlmul1(mgs) = cimas0*tmp*rhoinv(mgs)
20628            ENDIF
20629          ENDIF
20631 !      qsmul1(mgs) =  csmul1(mgs)*(cimas0/rho0(mgs))
20633       ENDIF ! ( ipconc .ge. 2 )
20634       
20635       end if ! (in temperature range)
20636       
20637       ENDIF ! ( itype1 .eq. 1 .or. itype2 .eq. 1)
20639       end do
20643 !     end if
20645 !     end do
20648 ! ICE MULTIPLICATION FROM SNOW
20649 !   Lo and Passarelli 82 / Willis and Heymsfield 89 / Schuur and Rutledge 00b
20650 !   using kfrag as fragmentation rate (s-1) / 500 microns as char mean diam for max snow mix ratio
20652       csmul(:) = 0.0
20653       qsmul(:) = 0.0
20654       
20655       IF ( isnwfrac /= 0 ) THEN
20656       do mgs = 1,ngscnt
20657        IF (temg(mgs) .gt. 265.0) THEN !{
20658         if (xdia(mgs,ls,1) .gt. 100.e-6 .and. xdia(mgs,ls,1) .lt. 2.0e-3) then  ! equiv diameter 100microns to 2mm
20660         tmp = rhoinv(mgs)*pi*xdn(mgs,ls)*cx(mgs,ls)*(500.e-6)**3
20661         qsmul(mgs) = Max( kfrag*( qx(mgs,ls) - tmp ) , 0.0 )
20663         qsmul(mgs) = Min( qxmxd(mgs,li), qsmul(mgs) )
20664         csmul(mgs) = Min( cxmxd(mgs,li), rho0(mgs)*qsmul(mgs)/mfrag )
20666         endif
20667        ENDIF !}
20668       enddo
20669       ENDIF
20672 !  frozen rain-rain interaction....
20677 !  rain-ice interaction
20680       do mgs = 1,ngscnt
20681       qracif(mgs) = qraci(mgs)
20682       cracif(mgs) = craci(mgs)
20683 !      ciacrf(mgs) = ciacr(mgs)
20684       end do
20687 !  vapor to pristine ice crystals   UP
20691 !  compute the nucleation rate
20693 !     do mgs = 1,ngscnt
20694 !     idqis = 0
20695 !     if ( ssi(mgs) .gt. 1.0 ) idqis = 1
20696 !     fiinit(mgs) = (felv(mgs)**2)/(cp*rw)
20697 !     dqisdt(mgs) = (qx(mgs,lv)-qis(mgs))/
20698 !    >  (1.0 + fiinit(mgs)*qis(mgs)/tsqr(mgs))
20699 !     qidsvp(mgs) = dqisdt(mgs)
20700 !     cnnt = min(cnit*exp(-temcg(mgs)*bta1),1.0e+09)
20701 !     qiint(mgs) = 
20702 !    >  il5(mgs)*idqis*(1.0*dtpinv)
20703 !    <  *min((6.88e-13)*cnnt/rho0(mgs), 0.25*dqisdt(mgs)) 
20704 !     end do
20706 !  Meyers et al. (1992; JAS) and Ferrier (1994) primary ice nucleation
20708       cmassin = cimasn  ! 6.88e-13
20709       do mgs = 1,ngscnt
20710       qiint(mgs) = 0.0
20711       ciint(mgs) = 0.0
20712       qicicnt(mgs) = 0.0
20713       cicint(mgs) = 0.0
20714       qipipnt(mgs) = 0.0
20715       cipint(mgs) = 0.0
20716       ccitmp = 0.0
20717       IF ( icenucopt == 1 .or. icenucopt == -10 .or. icenucopt == -11 ) THEN
20718       if ( ( temg(mgs) .lt. 268.15 .or.  &
20719 !     : ( imeyers5 .and. temg(mgs) .lt.  273.0) ) .and.    &
20720      & ( imeyers5 .and. temg(mgs) .lt.  272.0 .and. temgkm2(mgs) .lt. tfr) ) .and.    &
20721      &    ciintmx .gt. (cx(mgs,li)+ccitmp)  &
20722 !     :    .and. cninm(mgs) .gt. 0.   &
20723      &     ) then
20724       fiinit(mgs) = (felv(mgs)**2)/(cp*rw)
20725       dqisdt(mgs) = (qx(mgs,lv)-qis(mgs))/   &
20726      &  (1.0 + fiinit(mgs)*qis(mgs)/tsqr(mgs))
20727 !      qidsvp(mgs) = dqisdt(mgs)
20728       idqis = 0
20729       if ( ssi(mgs) .gt. 1.0 ) THEN
20730       idqis = 1 
20731       dzfacp = max( float(kgsp(mgs)-kgs(mgs)), 0.0 )
20732       dzfacm = max( float(kgs(mgs)-kgsm(mgs)), 0.0 )
20733       qiint(mgs) =   &
20734      &  idqis*il5(mgs)   &
20735      &  *(cmassin/rho0(mgs))   &
20736      &  *max(0.0,wvel(mgs))   &
20737      &  *max((cninp(mgs)-cninm(mgs)),0.0)/gz(igs(mgs),jgs,kgs(mgs))   &
20738      &  /((dzfacp+dzfacm))
20740       qiint(mgs) = min(qiint(mgs), max(0.25*dqisdt(mgs),0.0)) 
20741       ciint(mgs) = qiint(mgs)*rho0(mgs)/cmassin
20742       
20744 ! limit new crystals so it does not increase the current concentration
20745 !  above ciintmx 20,000 per liter (2.e7 per m**3)
20747 !      ciintmx = 1.e9
20748 !      ciintmx = 1.e9
20749       IF ( icenucopt /= -10 ) THEN
20750       
20751         IF ( lcin > 1 ) THEN
20752           ciint(mgs) = Min(ciint(mgs), ccin(mgs)*dtpinv) ! because ciint is a *rate*
20753           ccin(mgs) = ccin(mgs) - ciint(mgs)*dtp
20754           qiint(mgs) = ciint(mgs)*cmassin/rho0(mgs)
20755         ELSEIF ( lcina > 1 ) THEN
20756           ciint(mgs) = Max(0.0, Min( ciint(mgs), Min( cnina(mgs), ciintmx ) - cina(mgs) ))
20757           qiint(mgs) = ciint(mgs)*cmassin/rho0(mgs)
20758       
20759         ELSEIF ( icenucopt == 1 .and. ciint(mgs) .gt. Max(0.0, ciintmx - cx(mgs,li) - ccitmp )*dtpinv  ) THEN
20760           ciint(mgs) = Max(0.0, ciintmx - (cx(mgs,li)) )*dtpinv 
20761           qiint(mgs) = ciint(mgs)*cmassin/rho0(mgs)
20763         ELSEIF ( icenucopt == -11 .and. dtp*ciint(mgs) .gt. ( cnina(mgs) - (cx(mgs,li) - ccitmp))) THEN
20764           ciint(mgs) = Max(0.0,  cnina(mgs) - (cx(mgs,li)+ccitmp)*dtpinv )
20765           qiint(mgs) = ciint(mgs)*cmassin/rho0(mgs)
20767         ENDIF
20768       ENDIF
20769       
20770       end if
20771       endif
20773       ELSEIF ( icenucopt == 2 .or. icenucopt == -1 .or. icenucopt == -2 ) THEN
20774       
20775         IF ( ( temg(mgs) .lt. 268.15 .and. ssw(mgs) > 1.0 ) .or. ssi(mgs) > 1.25 ) THEN
20776           IF ( lcin > 1 ) THEN
20777            ciint(mgs) = Min(cnina(mgs), ccin(mgs))
20778            ciint(mgs) = Min( ciint(mgs), Max(0.0, ciintmx - (cx(mgs,li) - ccitmp) ) ) ! do not initiate ice beyond concentration of ciintmx
20779            ccin(mgs) = ccin(mgs) - ciint(mgs)
20780            ciint(mgs) = ciint(mgs)*dtpinv ! convert total initiation to a rate
20781           ELSE
20782            ciint(mgs) = Max( 0.0, cnina(mgs) - cina(mgs) )*dtpinv
20783           ENDIF
20784           qiint(mgs) = ciint(mgs)*cmassin/rho0(mgs)
20786           fiinit(mgs) = (felv(mgs)**2)/(cp*rw)
20787           dqisdt(mgs) = (qx(mgs,lv)-qis(mgs))/(1.0 + fiinit(mgs)*qis(mgs)/tsqr(mgs))
20788           qiint(mgs) = min(qiint(mgs), max(0.25*dqisdt(mgs),0.0))
20789           ciint(mgs) = qiint(mgs)*rho0(mgs)/cmassin
20790         ENDIF
20791       
20792       
20793       
20794       ELSEIF ( icenucopt == 3 .or. icenucopt == 4 .or. icenucopt == 10 ) THEN
20795         IF (  temg(mgs) .lt. 268.15 ) THEN
20796           IF ( lcin > 1 ) THEN
20797            ciint(mgs) = Min(cnina(mgs), ccin(mgs))
20798            ciint(mgs) = Min( ciint(mgs), Max(0.0, ciintmx - (cx(mgs,li) + ccitmp) ) ) ! do not initiate ice beyond concentration of ciintmx
20799            ccin(mgs) = ccin(mgs) - ciint(mgs)
20800            ciint(mgs) = ciint(mgs)*dtpinv ! convert total initiation to a rate
20801           ELSE
20802            ciint(mgs) = Max( 0.0, cnina(mgs) - cina(mgs) )*dtpinv
20803           ENDIF
20804           qiint(mgs) = ciint(mgs)*cmassin/rho0(mgs)
20805         ENDIF
20807       ENDIF
20809       if ( xplate(mgs) .eq. 1 ) then
20810       qipipnt(mgs) = qiint(mgs)
20811       cipint(mgs) = ciint(mgs)
20812       end if
20814       if ( xcolmn(mgs) .eq. 1 ) then
20815       qicicnt(mgs) = qiint(mgs)
20816       cicint(mgs) = ciint(mgs)
20817       end if
20819 !     qipipnt(mgs) = 0.0
20820 !     qicicnt(mgs) = qiint(mgs)
20822       end do
20827 !  vapor to cloud droplets   UP
20829       if (ndebug .gt. 0 ) write(0,*) 'dbg = 8'
20832       if (ndebug .gt. 0 ) write(0,*) 'Collection: set 3-component'
20834 !  time for riming....
20836 !     rimtim = 240.0
20837 !     dtrim = rimtim
20838 !     xacrtim  = 120.0
20839 !     tranfr = 0.50
20840 !     tranfw = 0.50
20842 !  coefficients for riming
20844 !     rimc1 = 300.00
20845 !     rimc2 = 0.44
20848 !  zero some arrays
20851       do mgs = 1,ngscnt
20852       qrshr(mgs) = 0.0
20853       qwshw(mgs) = 0.0
20854       cwshw(mgs) = 0.0
20855       qsshrp(mgs) = 0.0
20856       qhshrp(mgs) = 0.0
20857       end do
20860 !  first sum all of the shed rain
20863       do mgs = 1,ngscnt
20864       qrshr(mgs) = qsshr(mgs) + qhshr(mgs) + qhlshr(mgs)
20865       crshr(mgs) = chshrr(mgs)/rzxh(mgs) + chlshrr(mgs)/rzxhl(mgs)
20866       
20867       
20868       IF ( ipconc .ge. 3 ) THEN
20869 !       crshr(mgs) = Max(crshr(mgs), rho0(mgs)*qrshr(mgs)/(xdn(mgs,lr)*vr1mm) )
20870       ENDIF
20871       end do 
20880       IF ( ipconc .ge. 1 ) THEN
20883 !  concentration production terms
20885 !  YYY
20888 !       DO mgs = 1,ngscnt
20889        pccwi(:) = 0.0
20890        pccwd(:) = 0.0
20891        pccwdacc(:) = 0.0
20892        pccii(:) = 0.0
20893        pccin(:) = 0.0
20894        pccid(:) = 0.0
20895        pcisi(:) = 0.0
20896        pcisd(:) = 0.0
20897        pcrwi(:) = 0.0
20898        pcrwd(:) = 0.0
20899        pcswi(:) = 0.0
20900        pcswd(:) = 0.0
20901        pchwi(:) = 0.0
20902        pchwd(:) = 0.0
20903        pchli(:) = 0.0
20904        pchld(:) = 0.0
20905 !       ENDDO
20907 !  Cloud ice
20909 !      IF ( ipconc .ge. 1 ) THEN
20911       IF ( warmonly < 0.5 ) THEN
20912       IF ( ffrzs < 1.0 ) THEN
20913       do mgs = 1,ngscnt
20914       pccii(mgs) =   &
20915      &   il5(mgs)*cicint(mgs)  &
20916      &  +il5(mgs)*((1.0-cwfrz2snowfrac)*cwfrzc(mgs)+cwctfzc(mgs)   &
20917      &  +cicichr(mgs))   &
20918      &  +chmul1(mgs)   &
20919      &  +chlmul1(mgs)    &
20920      &  + csplinter(mgs) + csplinter2(mgs)   &
20921      &  +csmul(mgs)
20922      
20923        pccii(mgs) = pccii(mgs)*(1.0 - ffrzs)
20924        
20925 !     >  + nsplinter*(crfrzf(mgs) + crfrz(mgs))
20926       pccid(mgs) =   &
20927      &   il5(mgs)*(-cscni(mgs) - cscnvi(mgs) & ! - cwaci(mgs)   &
20928      &  -craci(mgs)    &
20929      &  -csaci(mgs)   &
20930      &  -chaci(mgs) - chlaci(mgs)   &
20931      &  -chcni(mgs))   &
20932      &  +il5(mgs)*cisbv(mgs)   &
20933      &  -(1.-il5(mgs))*cimlr(mgs)
20935       pccin(mgs) = ciint(mgs)
20936       
20938       end do
20939       ENDIF ! ffrzs
20940       ELSEIF ( warmonly < 0.8 ) THEN
20941       do mgs = 1,ngscnt
20942       
20943 !      qiint(mgs) = 0.0
20944 !      cicint(mgs) = 0.0
20945 !      qicicnt(mgs) = 0.0
20946       
20947       pccii(mgs) =   &
20948      &   il5(mgs)*cicint(mgs)   &
20949      &  +il5(mgs)*((1.0-cwfrz2snowfrac)*cwfrzc(mgs)+cwctfzc(mgs)   &
20950      &  +cicichr(mgs))   &
20951      &  +chmul1(mgs)   &
20952      &  +chlmul1(mgs)    &
20953      &  + csplinter(mgs) + csplinter2(mgs)   &
20954      &  +csmul(mgs)
20955      
20956        pccii(mgs) = pccii(mgs)*(1. - ffrzs)
20957       pccid(mgs) =   &
20958 !     &   il5(mgs)*(-cscni(mgs) - cscnvi(mgs) & ! - cwaci(mgs)   &
20959 !     &  -craci(mgs)    &
20960 !     &  -csaci(mgs)   &
20961 !     &  -chaci(mgs) - chlaci(mgs)   &
20962 !     &  -chcni(mgs))   &
20963      &  +il5(mgs)*cisbv(mgs)   &
20964      &  -(1.-il5(mgs))*cimlr(mgs)
20966       pccin(mgs) = ciint(mgs)
20968       end do
20969       ENDIF ! warmonly
20971       
20972 !      ENDIF ! ( ipconc .ge. 1 )
20974 !  Cloud water
20976       IF ( ipconc .ge. 2 ) THEN
20977       
20978       do mgs = 1,ngscnt
20979       pccwi(mgs) =  (0.0) - cwshw(mgs) ! + (1-il5(mgs))*(-cirmlw(mgs))
20980       
20981       IF ( warmonly < 0.5 ) THEN
20982       pccwd(mgs) =    &
20983      &  - cautn(mgs) +   &
20984      &  il5(mgs)*(-ciacw(mgs)-cwfrz(mgs)-cwctfzp(mgs)   &
20985      &  -cwctfzc(mgs)   &
20986      &   )   &
20987      &  -cracw(mgs) -csacw(mgs)  -chacw(mgs) - chlacw(mgs)
20990       ELSEIF ( warmonly < 0.8 ) THEN
20991       pccwd(mgs) =    &
20992      &  - cautn(mgs) +   &
20993      &  il5(mgs)*(  &
20994      & -ciacw(mgs)-cwfrz(mgs)-cwctfzp(mgs)   &
20995      &  -cwctfzc(mgs)   &
20996      &   )   &
20997      &  -cracw(mgs) -chacw(mgs) -chlacw(mgs) 
20998       ELSE
20999       
21000 !       tmp3d(igs(mgs),jy,kgs(mgs)) = crcnw(mgs)
21002 !       cracw(mgs) = 0.0 ! turn off accretion
21003 !       qracw(mgs) = 0.0
21004 !       crcev(mgs) = 0.0 ! turn off evap
21005 !       qrcev(mgs) = 0.0 ! turn off evap
21006 !       cracr(mgs) = 0.0 ! turn off self collection
21007        
21008        
21009 !       cautn(mgs) = 0.0 
21010 !       crcnw(mgs) = 0.0
21011 !       qrcnw(mgs) = 0.0
21013       pccwd(mgs) =    &
21014      &  - cautn(mgs) -cracw(mgs)
21015       ENDIF
21018       IF ( .false. .and. exwmindiam > 0.0 .and. ccwresv(mgs) > 0.0 ) THEN
21019       pccwdacc(mgs) =    &
21020      &  il5(mgs)*(-ciacw(mgs)  &
21021      &   )   &
21022      &  -cracw(mgs) -csacw(mgs)  -chacw(mgs) - chlacw(mgs)
21024       IF ( -pccwdacc(mgs)*dtp .gt. cx(mgs,lc) - ccwresv(mgs) ) THEN
21026        frac = -(cx(mgs,lc) - ccwresv(mgs) )/(pccwdacc(mgs)*dtp)
21027        pccwdacc(mgs) = -(cx(mgs,lc) - ccwresv(mgs) )*dtpinv
21029         ciacw(mgs)   = frac*ciacw(mgs)
21030         cracw(mgs)   = frac*cracw(mgs)
21031         csacw(mgs)   = frac*csacw(mgs)
21032         chacw(mgs)   = frac*chacw(mgs)
21033         cautn(mgs)   = frac*cautn(mgs)
21034        
21035         IF ( lhl .gt. 1 ) chlacw(mgs)   = frac*chlacw(mgs)
21037 ! resum
21038       pccwd(mgs) =    &
21039      &  - cautn(mgs) +   &
21040      &  il5(mgs)*(-ciacw(mgs)-cwfrzp(mgs)-cwctfzp(mgs)   &
21041      &  -cwfrzc(mgs)-cwctfzc(mgs)   &
21042      &  -il5(mgs)*(ciihr(mgs))   &
21043      &   )   &
21044      &  -cracw(mgs) -csacw(mgs)  -chacw(mgs) - chlacw(mgs)
21046       ENDIF
21048       ENDIF
21051       IF ( -pccwd(mgs)*dtp .gt. cx(mgs,lc) ) THEN
21052 !       write(0,*) 'OUCH! pccwd(mgs)*dtp .gt. ccw(mgs) ',pccwd(mgs),cx(mgs,lc)
21053 !       write(0,*) 'qc = ',qx(mgs,lc)
21054 !       write(0,*) -ciacw(mgs)-cwfrzp(mgs)-cwctfzp(mgs)-cwfrzc(mgs)-cwctfzc(mgs)
21055 !       write(0,*)  -cracw(mgs) -csacw(mgs)  -chacw(mgs)
21056 !       write(0,*) - cautn(mgs)
21058        frac = -cx(mgs,lc)/(pccwd(mgs)*dtp)
21059        pccwd(mgs) = -cx(mgs,lc)*dtpinv
21061         ciacw(mgs)   = frac*ciacw(mgs)
21062         cwfrz(mgs)  = frac*cwfrz(mgs)
21063         cwfrzp(mgs)  = frac*cwfrzp(mgs)
21064         cwctfzp(mgs) = frac*cwctfzp(mgs)
21065         cwfrzc(mgs)  = frac*cwfrzc(mgs)
21066         cwctfzc(mgs) = frac*cwctfzc(mgs)
21067         cwctfz(mgs) = frac*cwctfz(mgs)
21068         cracw(mgs)   = frac*cracw(mgs)
21069         csacw(mgs)   = frac*csacw(mgs)
21070         chacw(mgs)   = frac*chacw(mgs)
21071         cautn(mgs)   = frac*cautn(mgs)
21072        
21073         pccii(mgs) = pccii(mgs) - (1.-frac)*il5(mgs)*(cwfrzc(mgs)+cwctfzc(mgs))*(1. - ffrzs)
21074         IF ( lhl .gt. 1 ) chlacw(mgs)   = frac*chlacw(mgs)
21076 !       STOP
21077       ENDIF
21079       end do
21081       ENDIF ! ipconc
21084 !  Rain
21086       IF ( ipconc .ge. 3 ) THEN
21088       do mgs = 1,ngscnt
21090       IF ( warmonly < 0.5 ) THEN
21091       pcrwi(mgs) = &
21092 !     >   cracw(mgs) +    &
21093      &   crcnw(mgs)   &
21094      &  +(1-il5(mgs))*(   &
21095      &    -chmlrr(mgs)/rzxh(mgs)   &
21096      &    -chlmlrr(mgs)/rzxhl(mgs)   &
21097 !     &    -csmlr(mgs)/rzxs(mgs)     &
21098      &   -csmlrr(mgs)     &
21099      &   - cimlr(mgs) )   &
21100      &  -crshr(mgs)             !null at this point when wet snow/graupel included
21101       pcrwd(mgs) =   &
21102      &   il5(mgs)*(-ciacr(mgs) - crfrz(mgs) ) & ! - cipacr(mgs))
21103 !     >  -csacr(mgs)   &
21104      &  - chacr(mgs) - chlacr(mgs)   &
21105      &  +crcev(mgs)   &
21106      &  - cracr(mgs)
21107 !     >  -il5(mgs)*ciracr(mgs)
21110       ELSEIF ( warmonly < 0.8 ) THEN
21111        pcrwi(mgs) = &
21112      &   crcnw(mgs)   &
21113      &  +(1-il5(mgs))*(   &
21114      &    -chmlrr(mgs)/rzxh(mgs)    &
21115      &    -chlmlrr(mgs)/rzxhl(mgs)   &
21116 !     &    -csmlr(mgs)     &
21117      &   -csmlrr(mgs)     &
21118      &   - cimlr(mgs) )   &
21119      &  -crshr(mgs)             !null at this point when wet snow/graupel included
21120       pcrwd(mgs) =   &
21121      &   il5(mgs)*( - crfrz(mgs) ) & ! - cipacr(mgs))
21122      &  - chacr(mgs)    &
21123      &  - chlacr(mgs)    &
21124      &  +crcev(mgs)   &
21125      &  - cracr(mgs)
21126       ELSE
21127       pcrwi(mgs) =   &
21128      &   crcnw(mgs)
21129       pcrwd(mgs) =   &
21130      &  +crcev(mgs)   &
21131      &  - cracr(mgs)
21133 !        tmp3d(igs(mgs),jy,kgs(mgs)) = vtxbar(mgs,lr,1) ! crcnw(mgs) ! (pcrwi(mgs) + pcrwd(mgs))
21134 !        pcrwi(mgs) = 0.0
21135 !        pcrwd(mgs) = 0.0
21136 !        qrcnw(mgs) = 0.0
21138       ENDIF
21141       frac = 0.0
21142       IF ( -pcrwd(mgs)*dtp .gt. cx(mgs,lr) ) THEN
21143 !       write(0,*) 'OUCH! pcrwd(mgs)*dtp .gt. crw(mgs) ',pcrwd(mgs)*dtp,cx(mgs,lr),mgs,igs(mgs),kgs(mgs)
21144 !       write(0,*) -ciacr(mgs)
21145 !       write(0,*) -crfrz(mgs)
21146 !       write(0,*) -chacr(mgs)
21147 !       write(0,*)  crcev(mgs)
21148 !       write(0,*)  -cracr(mgs)
21150        frac =  -cx(mgs,lr)/(pcrwd(mgs)*dtp)
21151        pcrwd(mgs) = -cx(mgs,lr)*dtpinv
21153         ciacr(mgs) = frac*ciacr(mgs)
21154         ciacrf(mgs) = frac*ciacrf(mgs)
21155         ciacrs(mgs) = frac*ciacrs(mgs)
21156         crfrz(mgs) = frac*crfrz(mgs)
21157         crfrzf(mgs) = frac*crfrzf(mgs)
21158         crfrzs(mgs) = frac*crfrzs(mgs)
21159         chacr(mgs) = frac*chacr(mgs)
21160         chlacr(mgs) = frac*chlacr(mgs)
21161         crcev(mgs) = frac*crcev(mgs)
21162         cracr(mgs) = frac*cracr(mgs)
21164 !       STOP
21165       ENDIF
21167       end do
21169       ENDIF
21172       IF ( warmonly < 0.5 ) THEN
21175 !  Snow
21177       IF ( ipconc .ge. 4 ) THEN !
21179       do mgs = 1,ngscnt
21180       pcswi(mgs) =   &
21181      &   il5(mgs)*(cscnis(mgs) + cscnvis(mgs) )    &
21182      &  + cwfrz2snowfrac*cwfrz(mgs)/cwfrz2snowratio  &
21183      &  + cscnh(mgs)
21184       
21185       IF (  ffrzs > 0.0 ) THEN
21186        pcswi(mgs) =  pcswi(mgs) + ffrzs* (  &
21187      &   il5(mgs)*cicint(mgs)   &
21188      &  +il5(mgs)*(cwfrzc(mgs)+cwctfzc(mgs)   &
21189      &  +cicichr(mgs))  &
21190      &  +chmul1(mgs)   &
21191      &  +chlmul1(mgs)    &
21192      &  + csplinter(mgs) + csplinter2(mgs)   &
21193      &  +csmul(mgs) )
21194       ENDIF
21196       
21197       IF ( ess0 < 0.0 ) THEN
21198          csacs(mgs) = Max(0.0, csacs(mgs) - (ifrzs)*(crfrzs(mgs) + ciacrs(mgs)))
21199       ENDIF
21200       
21201       pcswd(mgs) = &
21202 !     :  cracs(mgs)     &
21203      &  -chacs(mgs) - chlacs(mgs)   &
21204      &  -chcns(mgs)   &
21205      &  +(1-il5(mgs))*csmlr(mgs) + csshr(mgs) & ! + csshrp(mgs)
21206 !     >  +il5(mgs)*(cssbv(mgs))   &
21207      &   + cssbv(mgs)   &
21208      &  - csacs(mgs)
21210       frac = 0.0
21211       IF ( imixedphase == 0 ) THEN
21212         IF ( cx(mgs,ls) + dtp*(pcswi(mgs) + pcswd(mgs)) < 0.0 ) THEN
21213          frac = (-cx(mgs,ls) + pcswi(mgs)*dtp)/(pcswd(mgs)*dtp)
21214          
21215            pcswd(mgs) = frac*pcswd(mgs)
21216            
21217            chacs(mgs)  = frac*chacs(mgs) 
21218            chlacs(mgs) = frac*chlacs(mgs)
21219            chcns(mgs)  = frac*chcns(mgs) 
21220            csmlr(mgs)  = frac*csmlr(mgs) 
21221            csshr(mgs)  = frac*csshr(mgs) 
21222            cssbv(mgs)  = frac*cssbv(mgs) 
21223            csacs(mgs)  = frac*csacs(mgs)
21224       
21225         ENDIF
21226       ENDIF
21229       
21230       pccii(mgs) =  pccii(mgs) &
21231      &  + (1. - ifrzs)*crfrzs(mgs) &
21232      &  + (1. - ifrzs)*ciacrs(mgs)
21234       pcswi(mgs) =  pcswi(mgs) &
21235      &  + (ifrzs)*crfrzs(mgs) &
21236      &  + (ifrzs)*ciacrs(mgs)
21238       end do
21240       ENDIF
21243 !  Graupel
21245       IF ( ipconc .ge. 5 ) THEN !
21246       do mgs = 1,ngscnt
21247       pchwi(mgs) =   &
21248      &  +(ffrzh*ifrzg*crfrzf(mgs)   &
21249      & +il5(mgs)*ffrzh*ifiacrg*(ciacrf(mgs) ))    &
21250      & + f2h*chcnsh(mgs) + f2h*chcnih(mgs) + chcnhl(mgs)
21252       pchwd(mgs) =   &
21253      &  (1-il5(mgs))*chmlr(mgs) &
21254 !     >  + il5(mgs)*chsbv(mgs)   &
21255      &  + chsbv(mgs)   &
21256      &  - il5(mgs)*chlcnh(mgs) &
21257      &  - cscnh(mgs)
21259       end do
21266 !  Hail
21268       IF ( lhl .gt. 1 .and. lnhl > 1 ) THEN !
21269       do mgs = 1,ngscnt
21270       pchli(mgs) = (ffrzh*(1.0-ifrzg)*crfrzf(mgs) +il5(mgs)*ffrzh*(1.0-ifiacrg)*(ciacrf(mgs) ))  &
21271      & + chlcnhhl(mgs) *rzxhlh(mgs)
21273       pchld(mgs) =   &
21274      &  (1-il5(mgs))*chlmlr(mgs)   &
21275 !     >  + il5(mgs)*chlsbv(mgs)   &
21276      &  + chlsbv(mgs) - chcnhl(mgs)
21277       
21278       IF ( imixedphase == 0 ) THEN
21279       frac = 0.0
21280       IF ( cx(mgs,lhl) + dtp*(pchli(mgs) + pchld(mgs)) < 0.0 ) THEN
21281         ! rescale depletion
21283          frac = (-cx(mgs,lhl) + pchli(mgs)*dtp)/(pchld(mgs)*dtp)
21284          
21285          chlmlr(mgs) = frac*chlmlr(mgs)
21286          chlsbv(mgs) = frac*chlsbv(mgs)
21287          chcnhl(mgs) = frac*chcnhl(mgs)
21288            
21289          pchld(mgs) = frac*pchld(mgs)
21290            
21291       ENDIF
21292       ENDIF
21294       end do
21295       
21296       ENDIF
21299       ENDIF ! (ipconc .ge. 5 )
21301       ELSEIF ( warmonly < 0.8 ) THEN
21304 !  Graupel
21306       IF ( ipconc .ge. 5 ) THEN !
21307       do mgs = 1,ngscnt
21308       pchwi(mgs) =   &
21309      &  +ifrzg*(crfrzf(mgs) ) ! +il5(mgs)*(ciacrf(mgs) ))
21311       pchwd(mgs) =   &
21312      &  (1-il5(mgs))*chmlr(mgs) &
21313      &  - il5(mgs)*chlcnh(mgs)
21314       end do
21316 !  Hail
21318       IF ( lhl .gt. 1 ) THEN !
21319       do mgs = 1,ngscnt
21320       pchli(mgs) = (1.0-ifrzg)*(crfrzf(mgs)) & ! +il5(mgs)*(ciacrf(mgs) ))  &
21321      & + chlcnhhl(mgs) *rzxhl(mgs)/rzxh(mgs)
21323       pchld(mgs) =   &
21324      &  (1-il5(mgs))*chlmlr(mgs) !  &
21325 !     >  + il5(mgs)*chlsbv(mgs)   &
21326 !     &  + chlsbv(mgs)
21328 !      IF ( pchli(mgs) .ne. 0. .or. pchld(mgs) .ne. 0 ) THEN
21329 !       write(0,*) 'dr: pchli,pchld = ', pchli(mgs),pchld(mgs), igs(mgs),kgs(mgs)
21330 !      ENDIF
21331       end do
21333       ENDIF
21335       ENDIF ! ipconc >= 5
21337       ENDIF ! warmonly
21342 !  Balance and checks for continuity.....within machine precision...
21344       do mgs = 1,ngscnt
21345       pctot(mgs)   = pccwi(mgs) +pccwd(mgs) +   &
21346      &               pccii(mgs) +pccid(mgs) +   &
21347      &               pcrwi(mgs) +pcrwd(mgs) +   &
21348      &               pcswi(mgs) +pcswd(mgs) +   &
21349      &               pchwi(mgs) +pchwd(mgs) +   &
21350      &               pchli(mgs) +pchld(mgs)
21351       end do
21354       ENDIF ! ( ipconc .ge. 1 )
21360 !  GOGO
21361 !  production terms for mass
21364        pqwvi(:) = 0.0
21365        pqwvd(:) = 0.0
21366        pqcwi(:) = 0.0
21367        pqcwd(:) = 0.0
21368        pqcwdacc(:) = 0.0
21369        pqcii(:) = 0.0
21370        pqcid(:) = 0.0
21371        pqrwi(:) = 0.0
21372        pqrwd(:) = 0.0
21373        pqswi(:) = 0.0
21374        pqswd(:) = 0.0
21375        pqhwi(:) = 0.0
21376        pqhwd(:) = 0.0
21377        pqhli(:) = 0.0
21378        pqhld(:) = 0.0
21379        pqlwsi(:) = 0.0
21380        pqlwsd(:) = 0.0
21381        pqlwhi(:) = 0.0
21382        pqlwhd(:) = 0.0
21383        pqlwlghi(:) = 0.0
21384        pqlwlghd(:) = 0.0
21385        pqlwlghli(:) = 0.0
21386        pqlwlghld(:) = 0.0
21387        pqlwhli(:) = 0.0
21388        pqlwhld(:) = 0.0
21389        IF ( ipconc > 5 ) THEN
21390        pzhwi(:) = 0.0
21391        pzhwd(:) = 0.0
21392        pzrwi(:) = 0.0
21393        pzrwd(:) = 0.0
21394        pzhli(:) = 0.0
21395        pzhld(:) = 0.0
21396        ENDIF
21400 !  Vapor
21402       IF ( warmonly < 0.5 ) THEN
21403       do mgs = 1,ngscnt
21404       
21405 ! NOTE: ANY CHANGES HERE ALSO NEED TO GO INTO THE RESUM FARTHER DOWN!
21406       pqwvi(mgs) =    &
21407      &  -Min(0.0, qrcev(mgs))   &
21408      &  -Min(0.0, qhcev(mgs))   &
21409      &  -Min(0.0, qhlcev(mgs))   &
21410      &  -Min(0.0, qscev(mgs))   &
21411 !     >  +il5(mgs)*(-qhsbv(mgs) - qhlsbv(mgs) )   &
21412      &  -qhsbv(mgs) - qhlsbv(mgs)   &
21413      &  -qssbv(mgs)    &
21414      &  -il5(mgs)*qisbv(mgs)
21415       
21416       pqwvd(mgs) =     &
21417      &  -Max(0.0, qrcev(mgs))   &
21418      &  -Max(0.0, qhcev(mgs))   &
21419      &  -Max(0.0, qhlcev(mgs))   &
21420      &  -Max(0.0, qscev(mgs))   &
21421      &  +il5(mgs)*(-qiint(mgs)   &
21422      &  -qhdpv(mgs) -qsdpv(mgs) - qhldpv(mgs))   &
21423      &  -il5(mgs)*qidpv(mgs)  
21424       
21425       end do
21427       ELSEIF ( warmonly < 0.8 ) THEN
21428       do mgs = 1,ngscnt
21429       pqwvi(mgs) =    &
21430      &  -Min(0.0, qrcev(mgs)) &
21431      &  -il5(mgs)*qisbv(mgs)
21432       pqwvd(mgs) =     &
21433      &  +il5(mgs)*(-qiint(mgs)   &
21434 !     &  -qhdpv(mgs) ) & !- qhldpv(mgs))   &
21435      &  -qhdpv(mgs) - qhldpv(mgs))   &
21436 !     &  -qhdpv(mgs) -qsdpv(mgs) - qhldpv(mgs))   &
21437      &  -Max(0.0, qrcev(mgs))     &
21438      &  -il5(mgs)*qidpv(mgs)  
21439       end do
21441       ELSE
21442       do mgs = 1,ngscnt
21443       pqwvi(mgs) =    &
21444      &  -Min(0.0, qrcev(mgs))
21445       pqwvd(mgs) =     &
21446      &  -Max(0.0, qrcev(mgs))
21447       end do
21449       ENDIF ! warmonly
21451 !  Cloud water
21453       do mgs = 1,ngscnt
21455       pqcwi(mgs) =  (0.0) + qwcnr(mgs) - qwshw(mgs)
21457       IF ( warmonly < 0.5 ) THEN
21458       pqcwd(mgs) =    &
21459      &  il5(mgs)*(-qiacw(mgs)-qwfrz(mgs)-qwctfz(mgs))   &
21460      &  -il5(mgs)*(qiihr(mgs))   &
21461      &  -qracw(mgs) -qsacw(mgs) -qrcnw(mgs) -qhacw(mgs) - qhlacw(mgs)  !&
21462 !     &  -il5(mgs)*(qwfrzp(mgs))
21463       ELSEIF ( warmonly < 0.8 ) THEN
21464       pqcwd(mgs) =    &
21465      &  il5(mgs)*(-qiacw(mgs)-qwfrz(mgs)-qwctfz(mgs))   &
21466      &  -il5(mgs)*(qiihr(mgs))   &
21467      &  -qracw(mgs) -qrcnw(mgs) -qhacw(mgs) -qhlacw(mgs)
21468       ELSE
21469       pqcwd(mgs) =    &
21470      &  -qracw(mgs) - qrcnw(mgs)
21471       ENDIF
21474       IF ( pqcwd(mgs) .lt. 0.0 .and. -pqcwd(mgs)*dtp .gt. qx(mgs,lc) ) THEN
21476        frac = -Max(0.0,qx(mgs,lc))/(pqcwd(mgs)*dtp)
21477        pqcwd(mgs) = -qx(mgs,lc)*dtpinv
21479         qiacw(mgs)   = frac*qiacw(mgs)
21480 !        qwfrzp(mgs)  = frac*qwfrzp(mgs)
21481 !        qwctfzp(mgs) = frac*qwctfzp(mgs)
21482         qwfrzc(mgs)  = frac*qwfrzc(mgs)
21483         qwfrz(mgs)  = frac*qwfrz(mgs)
21484         qwctfzc(mgs) = frac*qwctfzc(mgs)
21485         qwctfz(mgs) = frac*qwctfz(mgs)
21486         qracw(mgs)   = frac*qracw(mgs)
21487         qsacw(mgs)   = frac*qsacw(mgs)
21488         qhacw(mgs)   = frac*qhacw(mgs)
21489         vhacw(mgs)   = frac*vhacw(mgs)
21490         qrcnw(mgs)   = frac*qrcnw(mgs)
21491         qwfrzp(mgs)  = frac*qwfrzp(mgs)
21492         IF ( lhl .gt. 1 ) THEN
21493           qhlacw(mgs)   = frac*qhlacw(mgs)
21494           vhlacw(mgs)   = frac*vhlacw(mgs)
21495         ENDIF
21496 !        IF ( lzh .gt. 1 ) zhacw(mgs) = frac*zhacw(mgs)
21498 !       STOP
21499       ENDIF
21500       
21502       end do
21504 !  Cloud ice
21506       IF ( warmonly < 0.5 ) THEN
21508       do mgs = 1,ngscnt
21509       IF ( ffrzs < 1.0 ) THEN
21510       pqcii(mgs) =     &
21511      &   il5(mgs)*qicicnt(mgs)    &
21512      &  +il5(mgs)*((1.0-cwfrz2snowfrac)*qwfrzc(mgs)+qwctfzc(mgs))   &
21513      &  +il5(mgs)*(qicichr(mgs))  &
21514      &  +qsmul(mgs)               &
21515      &  +qhmul1(mgs) + qhlmul1(mgs)   &
21516      & + qsplinter(mgs) + qsplinter2(mgs)
21517 !     > + cimas0*nsplinter*(crfrzf(mgs) + crfrz(mgs))/rho0(mgs)
21518       ENDIF
21519        
21520        pqcii(mgs) = pqcii(mgs)*(1.0 - ffrzs) &
21521      &  +il5(mgs)*qidpv(mgs)    &
21522      &  +il5(mgs)*qiacw(mgs)
21523        
21524       pqcid(mgs) =     &
21525      &   il5(mgs)*(-qscni(mgs) - qscnvi(mgs)    & ! -qwaci(mgs)    &
21526      &  -qraci(mgs)    &
21527      &  -qsaci(mgs) )   &
21528      &  -qhaci(mgs)   &
21529      &  -qhlaci(mgs)    &
21530      &  +il5(mgs)*qisbv(mgs)    &
21531      &  +(1.-il5(mgs))*qimlr(mgs)   &
21532      &  - qhcni(mgs)
21533       end do
21535       
21536       ELSEIF ( warmonly < 0.8 ) THEN
21538       do mgs = 1,ngscnt
21539       pqcii(mgs) =     &
21540      &   il5(mgs)*qicicnt(mgs)*(1. - ffrzs)    &
21541      &  +il5(mgs)*((1.0-cwfrz2snowfrac)*qwfrzc(mgs)+qwctfzc(mgs))*(1. - ffrzs)   &
21542      &  +il5(mgs)*(qicichr(mgs))*(1. - ffrzs)   &
21543 !     &  +il5(mgs)*(qicichr(mgs))   &
21544 !     &  +qsmul(mgs)               &
21545      &  +qhmul1(mgs) + qhlmul1(mgs)   &
21546      & + qsplinter(mgs) + qsplinter2(mgs) &
21547      &  +il5(mgs)*qidpv(mgs)    &
21548      &  +il5(mgs)*qiacw(mgs)  ! & ! (qiacwi(mgs)+qwacii(mgs))   &
21549 !     &  +il5(mgs)*(qwfrzc(mgs)+qwctfzc(mgs))   &
21550 !     &  +il5(mgs)*(qicichr(mgs))   &
21551 !     &  +qsmul(mgs)               &
21552 !     &  +qhmul1(mgs) + qhlmul1(mgs)   &
21553 !     & + qsplinter(mgs) + qsplinter2(mgs)
21555       pqcid(mgs) =     &
21556 !     &   il5(mgs)*(-qscni(mgs) - qscnvi(mgs)    & ! -qwaci(mgs)    &
21557 !     &  -qraci(mgs)    &
21558 !     &  -qsaci(mgs) )   &
21559 !     &  -qhaci(mgs)   &
21560 !     &  -qhlaci(mgs)    &
21561      &  +il5(mgs)*qisbv(mgs)    &
21562      &  +(1.-il5(mgs))*qimlr(mgs)  ! &
21563 !     &  - qhcni(mgs)
21564       end do
21566       ENDIF
21568 !  Rain
21571       do mgs = 1,ngscnt
21572       IF ( warmonly < 0.5 ) THEN
21573       pqrwi(mgs) =     &
21574      &   qracw(mgs) + qrcnw(mgs) + Max(0.0, qrcev(mgs))   &
21575      &  +(1-il5(mgs))*(   &
21576      &    -qhmlr(mgs)                 &            !null at this point when wet snow/graupel included
21577      &    -qsmlr(mgs)  - qhlmlr(mgs)     &
21578      &    -qimlr(mgs))   &
21579 !     &    -qsshr(mgs)       &                      !null at this point when wet snow/graupel included
21580 !     &    -qhshr(mgs)       &                      !null at this point when wet snow/graupel included
21581 !     &    -qhlshr(mgs)      &
21582      & - qrshr(mgs)
21584       pqrwd(mgs) =     &
21585      &  il5(mgs)*(-qiacr(mgs)-qrfrz(mgs))    &
21586      &  - qsacr(mgs) - qhacr(mgs) - qhlacr(mgs) - qwcnr(mgs)   &
21587      &  + Min(0.0,qrcev(mgs))
21588       ELSEIF ( warmonly < 0.8 ) THEN
21589       pqrwi(mgs) =     &
21590      &   qracw(mgs) + qrcnw(mgs) + Max(0.0, qrcev(mgs))   &
21591      &  +(1-il5(mgs))*(   &
21592      &    -qhlmlr(mgs)                 &            !null at this point when wet snow/graupel included
21593      &    -qhmlr(mgs)  )               &            !null at this point when wet snow/graupel included
21594      &    -qhshr(mgs)                 &           !null at this point when wet snow/graupel included
21595      &    -qhlshr(mgs)                            !null at this point when wet snow/graupel included
21596       pqrwd(mgs) =     &
21597      &  il5(mgs)*(-qrfrz(mgs))    &
21598      &   - qhacr(mgs)    &
21599      &   - qhlacr(mgs)    &
21600      &  + Min(0.0,qrcev(mgs))
21601       ELSE
21602       pqrwi(mgs) =     &
21603      &   qracw(mgs) + qrcnw(mgs) + Max(0.0, qrcev(mgs))
21604       pqrwd(mgs) =  Min(0.0,qrcev(mgs))
21605       ENDIF ! warmonly
21608  !      IF ( pqrwd(mgs) .lt. 0.0 .and. -(pqrwd(mgs) + pqrwi(mgs))*dtp .gt. qx(mgs,lr)  ) THEN
21609       IF ( pqrwd(mgs) .lt. 0.0 .and. -(pqrwd(mgs) + pqrwi(mgs))*dtp .gt. qx(mgs,lr)  ) THEN
21611        frac = (-qx(mgs,lr) + pqrwi(mgs)*dtp)/(pqrwd(mgs)*dtp)
21612 !       pqrwd(mgs) = -qx(mgs,lr)*dtpinv  + pqrwi(mgs)
21614        pqwvi(mgs) = pqwvi(mgs)    &
21615      &  + Min(0.0, qrcev(mgs))   &
21616      &  - frac*Min(0.0, qrcev(mgs))
21617        pqwvd(mgs) =  pqwvd(mgs)   &
21618      &  + Max(0.0, qrcev(mgs))   &
21619      &  - frac*Max(0.0, qrcev(mgs))
21621        qiacr(mgs)  = frac*qiacr(mgs)
21622        qiacrf(mgs) = frac*qiacrf(mgs)
21623        qiacrs(mgs) = frac*qiacrs(mgs)
21624        viacrf(mgs) = frac*viacrf(mgs)
21625        qrfrz(mgs)  = frac*qrfrz(mgs) 
21626        qrfrzs(mgs) = frac*qrfrzs(mgs) 
21627        qrfrzf(mgs) = frac*qrfrzf(mgs)
21628        vrfrzf(mgs) = frac*vrfrzf(mgs)
21629        qsacr(mgs)  = frac*qsacr(mgs)
21630        qhacr(mgs)  = frac*qhacr(mgs)
21631        vhacr(mgs)  = frac*vhacr(mgs)
21632        qrcev(mgs)  = frac*qrcev(mgs)
21633        qhlacr(mgs) = frac*qhlacr(mgs)
21634        vhlacr(mgs) = frac*vhlacr(mgs)
21635        qhcev(mgs)  = frac*qhcev(mgs)
21636        qhlcev(mgs)  = frac*qhlcev(mgs)
21639       IF ( warmonly < 0.5 ) THEN
21640        pqrwd(mgs) =     &
21641      &  il5(mgs)*(-qiacr(mgs)-qrfrz(mgs) - qsacr(mgs))    &
21642      &  - qhacr(mgs) - qhlacr(mgs) - qwcnr(mgs)   &
21643      &  + Min(0.0,qrcev(mgs))
21644       ELSEIF ( warmonly < 0.8 ) THEN
21645       pqrwd(mgs) =     &
21646      &  il5(mgs)*(-qrfrz(mgs))    &
21647      &   - qhacr(mgs)    &
21648      &   - qhlacr(mgs)    &
21649      &  + Min(0.0,qrcev(mgs))
21650       ELSE
21651        pqrwd(mgs) =  Min(0.0,qrcev(mgs))
21652       ENDIF ! warmonly
21655 ! Resum for vapor since qrcev has changed
21657       IF ( qrcev(mgs) .ne. 0.0 ) THEN
21658        pqwvi(mgs) =    &
21659      &  -Min(0.0, qrcev(mgs))   &
21660      &  -Min(0.0, qhcev(mgs))   &
21661      &  -Min(0.0, qhlcev(mgs))   &
21662      &  -Min(0.0, qscev(mgs))   &
21663 !     >  +il5(mgs)*(-qhsbv(mgs)  - qhlsbv(mgs) )   &
21664      &  -qhsbv(mgs)  - qhlsbv(mgs)   &
21665      &  -qssbv(mgs)    &
21666      &  -il5(mgs)*qisbv(mgs) 
21667      
21668        pqwvd(mgs) =     &
21669      &  -Max(0.0, qrcev(mgs))   &
21670      &  -Max(0.0, qhcev(mgs))   &
21671      &  -Max(0.0, qhlcev(mgs))   &
21672      &  -Max(0.0, qscev(mgs))   &
21673      &  +il5(mgs)*(-qiint(mgs)   &
21674      &  -qhdpv(mgs) -qsdpv(mgs) - qhldpv(mgs))   &
21675      &  -il5(mgs)*qidpv(mgs)  
21677        ENDIF
21680 !       STOP
21681       ENDIF
21684       end do
21686       IF ( warmonly < 0.5 ) THEN
21689 !  Snow
21691       do mgs = 1,ngscnt
21692       pqswi(mgs) =     &
21693      &   il5(mgs)*(qscni(mgs)+qsaci(mgs)+qsdpv(mgs)   &
21694      &   + qscnvi(mgs)                        &
21695      &   + ifrzs*(qiacrs(mgs) + qrfrzs(mgs))  &
21696      &   + il5(mgs)*(( qwfrzc(mgs) + qwctfzc(mgs) + qicichr(mgs) )*ffrzs   &
21697      &   +  (1.0 - ffrzs)*cwfrz2snowfrac*qwfrz(mgs) ) &
21698      &   + il2(mgs)*qsacr(mgs))   &
21699      &   + il5(mgs)*qicicnt(mgs)*ffrzs        &
21700      &   + il3(mgs)*(qiacrf(mgs)+qracif(mgs)) & ! only applies for ipconc <= 3
21701      &   + Max(0.0, qscev(mgs))   &
21702      &   + qsacw(mgs) + qscnh(mgs) &
21703      &  + ffrzs*(qsmul(mgs)               &
21704      &  +qhmul1(mgs) + qhlmul1(mgs)   &
21705      & + qsplinter(mgs) + qsplinter2(mgs))
21706       pqswd(mgs) =    &
21707 !     >  -qfacs(mgs) ! -qwacs(mgs)   &
21708      &  -qracs(mgs)*(1-il2(mgs)) -qhacs(mgs) - qhlacs(mgs)   &
21709      &  -qhcns(mgs)   &
21710      &  +(1-il5(mgs))*qsmlr(mgs) + qsshr(mgs)    &    !null at this point when wet snow included
21711 !     >  +il5(mgs)*(qssbv(mgs))   &
21712      &  + qssbv(mgs)   &
21713      &  + Min(0.0, qscev(mgs))  &
21714      &  -qsmul(mgs)
21715       
21716       
21717       IF ( imixedphase == 0 .and. pqswd(mgs) .lt. 0.0  ) THEN
21718         IF ( qx(mgs,ls) + dtp*(pqswi(mgs) + pqswd(mgs)) < 0.0 ) THEN
21719          frac = (-qx(mgs,ls) + pqswi(mgs)*dtp)/(pqswd(mgs)*dtp)
21720          
21721            pqswd(mgs) = frac*pqswd(mgs)
21722            
21723            qracs(mgs)  = frac*qracs(mgs) ! only used for single moment at this time
21724            qhacs(mgs)  = frac*qhacs(mgs) 
21725            qhlacs(mgs) = frac*qhlacs(mgs)
21726            qhcns(mgs)  = frac*qhcns(mgs) 
21727            qsmlr(mgs)  = frac*qsmlr(mgs) 
21728            qsshr(mgs)  = frac*qsshr(mgs) 
21729            qssbv(mgs)  = frac*qssbv(mgs) 
21730            qsmul(mgs)  = frac*qsmul(mgs) 
21731            IF ( qscev(mgs) < 0.0 ) qscev(mgs) = frac*qscev(mgs)
21733         ENDIF
21734       ENDIF
21735       
21736       pqcii(mgs) =  pqcii(mgs) &
21737      &  + (1. - ifrzs)*qrfrzs(mgs) &
21738      &  + (1. - ifrzs)*qiacrs(mgs)
21739       
21740       end do 
21741       
21743 !  Graupel
21745       do mgs = 1,ngscnt
21746       pqhwi(mgs) =    &
21747      &  +il5(mgs)*(ffrzh*ifrzg*qrfrzf(mgs)  + (1-il3(mgs))*ffrzh*ifiacrg*(qiacrf(mgs)+qracif(mgs)))   &
21748      &  + (1-il2(mgs))*(qracs(mgs) + qsacr(mgs))  & ! only used for ipconc < 3
21749      &  +il5(mgs)*(qhdpv(mgs))   &
21750      &  +Max(0.0, qhcev(mgs))   &
21751      &  +qhacr(mgs)+qhacw(mgs)   &
21752      &  +qhacs(mgs)+qhaci(mgs)   &
21753      &  + f2h*qhcns(mgs) + f2h*qhcni(mgs) + qhcnhl(mgs)
21754       pqhwd(mgs) =     &
21755      &   qhshr(mgs)                &    !null at this point when wet graupel included
21756      &  +(1-il5(mgs))*qhmlr(mgs)   &    !null at this point when wet graupel included
21757 !     >  +il5(mgs)*qhsbv(mgs)   &
21758      &  + qhsbv(mgs)   &
21759      &  + Min(0.0, qhcev(mgs))   &
21760      &  -qhmul1(mgs) - qhlcnh(mgs) - qscnh(mgs)  &
21761      &  - ffrzh*(qsplinter(mgs) + qsplinter2(mgs))
21762 !     > - cimas0*nsplinter*(crfrzf(mgs) + crfrz(mgs))/rho0(mgs)
21764       end do
21768 !  Hail
21770       IF ( lhl .gt. 1 ) THEN
21772       do mgs = 1,ngscnt
21773       pqhli(mgs) =    &
21774      &  +il5(mgs)*(qhldpv(mgs) + ((1.0-ifrzg)*qrfrzf(mgs) + (1.0-ifiacrg)*(qiacrf(mgs)+ qracif(mgs))))   &
21775      &  +Max(0.0, qhlcev(mgs))   &
21776      &  +qhlacr(mgs)+qhlacw(mgs)   &
21777      &  +qhlacs(mgs)+qhlaci(mgs)   &
21778      &  + qhlcnh(mgs)
21779       pqhld(mgs) =     &
21780      &   qhlshr(mgs)    &
21781      &  +(1-il5(mgs))*qhlmlr(mgs)    &
21782 !     >  +il5(mgs)*qhlsbv(mgs)   &
21783      &  + qhlsbv(mgs)   &
21784      &  + Min(0.0, qhlcev(mgs))   &
21785      &  -qhlmul1(mgs) - qhcnhl(mgs)
21787       IF ( imixedphase == 0 ) THEN
21788       frac = 0.0
21789       IF ( qx(mgs,lhl) + dtp*(pqhli(mgs) + pqhld(mgs)) < 0.0 ) THEN
21790         ! rescale depletion
21792          frac = (-qx(mgs,lhl) + pqhli(mgs)*dtp)/(pqhld(mgs)*dtp)
21793          
21794          qhlmlr(mgs) = frac*qhlmlr(mgs)
21795          qhlsbv(mgs) = frac*qhlsbv(mgs)
21796          qhcnhl(mgs) = frac*qhcnhl(mgs)
21797          qhlmul1(mgs) = frac*qhlmul1(mgs)
21798          IF ( qhlcev(mgs) < 0.0 ) qhlcev(mgs) = frac*qhlcev(mgs)
21799            
21800          pqhld(mgs) = frac*pqhld(mgs)
21801            
21802       ENDIF
21803       ENDIF
21806       end do
21807       
21808       ENDIF ! lhl
21810       ELSEIF ( warmonly < 0.8 ) THEN
21812 !  Graupel
21814       do mgs = 1,ngscnt
21815       pqhwi(mgs) =    &
21816      &  +il5(mgs)*ifrzg*(qrfrzf(mgs) )   &
21817      &  +il5(mgs)*(qhdpv(mgs))   &
21818      &  +qhacr(mgs)+qhacw(mgs)   
21819       pqhwd(mgs) =     &
21820      &   qhshr(mgs)                &    !null at this point when wet graupel included
21821      &  - qhlcnh(mgs)   &
21822      &  - qhmul1(mgs)   &
21823      &  - qsplinter(mgs) - qsplinter2(mgs) &
21824      &  +(1-il5(mgs))*qhmlr(mgs)        !null at this point when wet graupel included
21825        end do
21828 !  Hail
21830       IF ( lhl .gt. 1 ) THEN
21832       do mgs = 1,ngscnt
21833       pqhli(mgs) =    &
21834      &  +il5(mgs)*(qhldpv(mgs) ) & ! + (1.0-ifrzg)*(qiacrf(mgs)+qrfrzf(mgs)  + qracif(mgs)))   &
21835      &  +il5(mgs)*(1.0-ifrzg)*(qrfrzf(mgs) )  &
21836      &  +qhlacr(mgs)+qhlacw(mgs)   &
21837 !     &  +qhlacs(mgs)+qhlaci(mgs)   &
21838      &  + qhlcnh(mgs)
21839       pqhld(mgs) =     &
21840      &   qhlshr(mgs)    &
21841      &  +(1-il5(mgs))*qhlmlr(mgs)    &
21842 !     >  +il5(mgs)*qhlsbv(mgs)   &
21843      &  + qhlsbv(mgs)   &
21844      &  -qhlmul1(mgs) - qhcnhl(mgs)
21846       end do
21848       ENDIF ! lhl
21850       ENDIF ! warmonly
21853 !  Liquid water on snow and graupel 
21856       vhmlr(:) = 0.0
21857       vhlmlr(:) = 0.0
21858       vhfzh(:) = 0.0
21859       vhlfzhl(:) = 0.0
21861       IF ( mixedphase ) THEN
21862       ELSE ! set arrays for non-mixedphase graupel
21863       
21864 !        vhshdr(:) = 0.0
21865         vhmlr(:) = qhmlr(:) ! not actually volume, but treated as q in rate equation
21866 !        vhsoak(:) = 0.0
21868 !        vhlshdr(:) = 0.0
21869         vhlmlr(:) = qhlmlr(:) ! not actually volume, but treated as q in rate equation
21870 !        vhlmlr(:) = rho0(:)*qhlmlr(:)/xdn(:,lhl) 
21871 !        vhlsoak(:) = 0.0
21873       ENDIF  ! mixedphase
21878 !  Graupel reflectivity
21880       if (ndebug .gt. 0 .and. my_rank>=0 ) write(0,*) my_rank, 'graupel reflectivity'
21882       do mgs = 1,ngscnt
21883       
21884 !      zhmlr(mgs) = 0.0
21885 !      zhshr(mgs) = 0.0
21886 !      zhmlrr(mgs) = 0.0
21887 !      zhshrr(mgs) = 0.0
21888       zhdsv(mgs) = 0.0
21889 !      IF ( lf < 1 ) THEN
21890       IF ( ffrzh > 0.0 ) THEN
21891       ziacr(mgs) = 0.0
21892       ziacrf(mgs) = 0.0
21893       ENDIF
21894 !      ENDIF
21895       zhcns(mgs) = 0.0
21896       zhcni(mgs) = 0.0
21897       zhacs(mgs) = 0.0
21898       zhaci(mgs) = 0.0
21899       
21900       ENDDO
21902       IF ( lzh .gt. 1 ) THEN ! 
21903       do mgs = 1,ngscnt
21904       
21905       
21906       IF ( qx(mgs,lh) .gt. qxmin(lh) .and. cx(mgs,lh) .gt. 0.0 ) THEN
21907           tmp = qx(mgs,lh)/cx(mgs,lh)
21908           alp = Max( alphamin, alpha(mgs,lh) )
21909 !          g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
21910           g1 = g1x(mgs,lh) ! (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
21911 !          g1r = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
21913            zhaci(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*( tmp ) * qhaci(mgs) )
21914            zhacs(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*( tmp ) * qhacs(mgs) )
21915         
21916         IF ( .not. mixedphase  .and. ibinhmlr < 1 ) THEN
21917         zhmlr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*tmp * qhmlr(mgs) - tmp**2 * chmlr(mgs)  )
21918         ENDIF
21919         
21920         zhshr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*tmp * qhshr(mgs) - tmp**2 * chshr(mgs)  )
21922 !        IF ( lzr > 0 .and. qhshr(mgs) /= 0.0 .and. chshrr(mgs) /= 0.0 .and. ibinhmlr < 1 ) THEN
21923         IF ( lzr > 0 .and. qhshr(mgs) /= 0.0 .and. chshrr(mgs) /= 0.0 ) THEN
21924 !         IF ( temg(mgs) > tfr + 2.0 ) THEN
21925 !           zhshrr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( 2.*tmp * qhshr(mgs) - tmp**2 * chshrr(mgs)  )
21926 !           IF ( zhshrr(mgs) > 0. ) THEN
21927 !             zhshrr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( 2.*tmp * qhshr(mgs) - tmp**2 * chshr(mgs) )
21928 !           ENDIF
21929 !           z1 = g1shr*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhshr(mgs)**2/ chshrr(mgs)  ) ! should this be g1shr?
21930 !           zhshrr(mgs) = Max( z1, zhshrr(mgs))
21931 !         ELSE
21932 !          zhshrr(mgs) =  g1shr*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhshr(mgs)**2/ chshrr(mgs)  )
21935          IF ( temg(mgs) >= tfr ) THEN
21936  !           zhshrr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn0(lr)))**2*( 2.*tmp * qhshr(mgs) - tmp**2 * chshrr(mgs)  )
21937  !           IF ( zhshrr(mgs) > 0.0 ) THEN
21938  !             zhshrr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn0(lr)))**2*( 2.*tmp * qhshr(mgs) - tmp**2 * chshr(mgs)  )
21939  !           ENDIF
21940            IF ( (shedalp + alpha(mgs,lh))*xdia(mgs,lh,1) < sheddiam ) THEN ! if not shedding small drops, then use alpha of hail
21941              z1 = g1*(6.0*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhshr(mgs)**2/ chshrr(mgs)  ) 
21942            ELSE
21943              z1 = g1shr*(6.0*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhshr(mgs)**2/ chshrr(mgs)  ) ! should this be g1shr?
21944            ENDIF
21945            zhshrr(mgs) = z1
21946 !           z1 = g1mlr*(rho0(mgs)/(xdn(mgs,lr)))**2*( qhshr(mgs)**2/ chshrr(mgs)  ) ! should this be g1shr?
21947 !           zhshrr(mgs) = Max( z1, zhshrr(mgs))
21948          ELSE
21949           zhshrr(mgs) =  g1shr*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhshr(mgs)**2/ chshrr(mgs)  )
21950          ENDIF
21951          
21952          zhshrr(mgs) = Min( 0.0, zhshrr(mgs) )
21953         ENDIF
21955         IF ( zhshr(mgs) > 0.0 ) THEN
21956           write(0,*) 'Problem with zhshr! zhshr,qhshr,chshr = ',zhshr(mgs),qhshr(mgs),chshr(mgs)
21957           write(0,*) 'g1,tmp, qx,cx,zx = ',g1,tmp,qx(mgs,lh),cx(mgs,lh),zx(mgs,lh)
21958           write(0,*) ( 2.*tmp * qhshr(mgs) - tmp**2 * chshr(mgs)  ),  2.*tmp * qhshr(mgs), - tmp**2 * chshr(mgs)
21959           write(0,*) 'temcg = ',temcg(mgs),'chshr recalc = ',(cx(mgs,lh)/(qx(mgs,lh)+1.e-20))*qhshr(mgs)
21960           
21961           STOP
21962         ENDIF
21965 !        zhshr(mgs) =  (xdn0(lr)/(xdn(mgs,lh)))**2*( zx(mgs,lh) * qhshr(mgs) )
21966         
21967         qtmp = qhdpv(mgs) + qhcev(mgs) + qhsbv(mgs)
21968         ctmp = chdpv(mgs) + chcev(mgs) + chsbv(mgs)
21970         zhdsv(mgs) = g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*( tmp ) * qtmp - tmp**2 * ctmp )
21972           alp = Max( alphahacx, alpha(mgs,lh) )
21973 !          g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
21974           g1 = g1x(mgs,lh) ! (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
21976           IF ( .true. ) THEN  ! {
21977           IF ( qhacr(mgs) .gt. 0.0 ) THEN
21978 !          zhacr(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( qx(mgs,lh)/cx(mgs,lh)) * qhacr(mgs) )
21980 !          g1r = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
21981 !          zhacr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*( qx(mgs,lh)/cx(mgs,lh)) * qhacr(mgs) )
21982           zhacr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*( qx(mgs,lh)/cx(mgs,lh)) * qhacr(mgs) )
21983 !          zhacrf(mgs) = g1*zhacr
21986 !          z = g1*(6.*rho0(mgs)/(pi*1000.))**2*( (qx(mgs,lh)+dtp*qhacr(mgs))**2)/(cx(mgs,lh))
21988           IF ( z > zx(mgs,lh) ) THEN
21989 !            zhacr(mgs) = (z - zx(mgs,lh))*dtpinv
21990           ELSE
21991 !            zhacr(mgs) = 0.0
21992           ENDIF
21993           ENDIF
21995 !        zhacr(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( tmp ) * qhacr(mgs) )
21996 !        zhacr(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( tmp ) * qhacr(mgs) - tmp**2 * chacr(mgs) )
21998 !          alp = Max( 1.0, alpha(mgs,lh)+1. )
21999 !          g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/
22000 !     :         ((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
22001           IF ( qhacw(mgs) .gt. 0.0 ) THEN
22002 !          zhacw(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( qx(mgs,lh)/cx(mgs,lh)) * qhacw(mgs) )
22003           zhacw(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*( qx(mgs,lh)/cx(mgs,lh)) * qhacw(mgs) )
22005 !          z = g1*(6.*rho0(mgs)/(pi*1000.))**2*( (qx(mgs,lh)+dtp*(qhacw(mgs)-qhmul1(mgs)))**2)/(cx(mgs,lh))
22006           IF ( z > zx(mgs,lh) ) THEN
22007 !            zhacw(mgs) = (z - zx(mgs,lh))*dtpinv
22008           ENDIF
22009           ENDIF
22011           ELSE ! } { ! this is not used because of the 'true' above
22013           IF ( qhacw(mgs) .gt. 0.0 .or. qhacr(mgs) .gt. 0.0 ) THEN
22014           z = g1*(6.*rho0(mgs)/(pi*1000.))**2*( (qx(mgs,lh)+dtp*(qhacr(mgs) + qhacw(mgs)-qhmul1(mgs)))**2)/(cx(mgs,lh))
22015 !          zhacw(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( qx(mgs,lh)/cx(mgs,lh)) * qhacw(mgs) )
22016           IF ( z > zx(mgs,lh) ) THEN
22017             zhacw(mgs) = (z - zx(mgs,lh))*dtpinv
22018           ENDIF
22019           ENDIF
22021           ENDIF ! }
22023           IF ( qhlcnh(mgs) .gt. 0.0 .and. ihlcnh < 2  ) THEN
22024            zhlcnh(mgs) = g1*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*( tmp ) * qhlcnh(mgs) - tmp**2 * chlcnh(mgs) )
22025           ENDIF
22026       ENDIF
22027 ! qsplinter(mgs)
22028       IF ( ffrzh*qiacrf(mgs) .gt. 0.0 .and. cx(mgs,lr) .gt. 0.0 .and. qx(mgs,lr) .gt. qxmin(lr) ) THEN
22029             tmp = qx(mgs,lr)/cx(mgs,lr)
22030 !            alp = 3.0
22031 !            g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
22032             IF ( imurain == 3 ) THEN
22033             ! note that 3.6476 = (6/pi)**2
22034             ziacr(mgs) = 3.6476*rho0(mgs)**2*(alpha(mgs,lr)+2.)/(xdn0(lr)**2*(alpha(mgs,lr)+1.))*  &
22035      &           ( 2.*tmp * qiacrf(mgs) - tmp**2 * ciacrf(mgs)  )
22036             ELSE ! imurain == 1 
22037             ziacr(mgs) = 3.6476*rho0(mgs)**2*g1x(mgs,lr)/(xdn0(lr)**2)*  &
22038      &           ( 2.*tmp * qiacrf(mgs) - tmp**2 * ciacrf(mgs)  )
22039             ENDIF
22040             ziacr(mgs) = Min( ziacr(mgs), zxmxd(mgs,lr) )
22041 !            ziacrf(mgs) = (xdn(mgs,lr)/xdn(mgs,lh))**2 * ziacr(mgs)
22042             ziacrf(mgs) = (xdn(mgs,lr)/xdnmx(lh))**2 * ziacr(mgs)
22043 !            z = g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*tmp * (qiacrf(mgs) - qsplinter(mgs)) - tmp**2 * ciacrf(mgs)  )
22044 !            ziacrf(mgs) = Min(  ziacrf(mgs), z )
22045       ENDIF
22046       
22047       
22048       
22049       IF ( ffrzh*qrfrzf(mgs) .gt. 0.0 .and. cx(mgs,lr) .gt. 0.0 ) THEN
22050             tmp = qx(mgs,lr)/cx(mgs,lr)
22051 !            alp = 3.0
22052 !            g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
22053             IF ( imurain == 3 ) THEN
22054             zrfrz(mgs) = 3.6476*rho0(mgs)**2*(alpha(mgs,lr)+2.)/(xdn0(lr)**2*(alpha(mgs,lr)+1.)) * &
22055      &         ( 2.*tmp * qrfrzf(mgs) - tmp**2 * crfrzf(mgs)  )
22056             zrfrzf(mgs) = (xdn(mgs,lr)/xdn(mgs,lh))**2 * zrfrz(mgs)
22057             ELSEIF ( imurain == 1 .and. ibiggopt /= 2 ) THEN
22058 !            zrfrz(mgs) = 3.6476*rho0(mgs)**2*g1x(mgs,lr)/(xdn0(lr)**2) * &
22059 !     &         ( 2.*tmp * qrfrzf(mgs) - tmp**2 * crfrz(mgs)  )
22060             zrfrz(mgs) = 3.6476*rho0(mgs)**2*g1x(mgs,lr)/(xdn0(lr)**2) * &
22061      &         ( 2.*tmp * qrfrz(mgs) - tmp**2 * crfrz(mgs)  )
22062             zrfrzf(mgs) = 3.6476*rho0(mgs)**2*g1x(mgs,lr)/(rhofrz**2) * &
22063      &         ( 2.*tmp * qrfrzf(mgs) - tmp**2 * crfrzf(mgs)  )
22064             ENDIF
22065             zrfrz(mgs) = Min( zrfrz(mgs), Max(0.4,qrfrz(mgs)/qx(mgs,lr))*zx(mgs,lr)*dtpinv )
22066 !            zrfrzf(mgs) = (xdn(mgs,lr)/xdn(mgs,lh))**2 * zrfrz(mgs)
22067 !            zrfrzf(mgs) = (xdn(mgs,lr)/xdnmx(lh))**2 * zrfrz(mgs)
22068 !            z = g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*tmp * (qrfrzf(mgs)-qsplinter2(mgs)) - tmp**2 * crfrzf(mgs)  )
22069 !             zrfrzf(mgs) = Min(  zrfrzf(mgs), z )
22070       ! change this to be alpha=0?
22071       ENDIF
22072       
22073       IF ( lhl > 1 .and. qhcnhl(mgs) .gt. 0.0 ) THEN
22074         tmp = qx(mgs,lhl)/cx(mgs,lhl)
22075         zhcnhl(mgs) = g1x(mgs,lhl)*(6.*rho0(mgs)/(pi*xdn(mgs,lhl)))**2*( 2.*( tmp ) * qhcnhl(mgs) - tmp**2 * chcnhl(mgs) )
22076         
22077       ENDIF
22078       
22079       IF ( qhcns(mgs) > 0.0 .and. chcns(mgs) > 0.0 .and. cx(mgs,ls) > cxmin .and. vhcns(mgs) > 0 ) THEN
22080         tmp = qx(mgs,ls)/cx(mgs,ls)
22081         r = rho0(mgs)*qhcns(mgs)/vhcns(mgs) ! density of new graupel particles
22082         IF ( imusnow == 3 ) THEN
22083         zhcns(mgs) = 3.6476*rho0(mgs)**2*(alpha(mgs,ls)+2.)/(r**2*(alpha(mgs,ls)+1.)) * &
22084      &         ( 2.*tmp * qhcns(mgs) - tmp**2 * chcns(mgs)  )
22085         ELSE
22086          write(0,*) 'Value of imusnow not valid. Must be 3 (fix me for =1). imusnow = ',imusnow
22087         STOP
22088         ENDIF
22089       ENDIF
22091       IF ( qhcni(mgs) > 0.0 .and. chcni(mgs) > 0.0 .and. cx(mgs,li) > cxmin .and. vhcni(mgs) > 0 ) THEN
22092         tmp = qx(mgs,li)/cx(mgs,li)
22093         r = rho0(mgs)*qhcni(mgs)/vhcni(mgs) ! density of new graupel particles
22094         zhcni(mgs) = 3.6476*rho0(mgs)**2*(alpha(mgs,li)+2.)/(r**2*(alpha(mgs,li)+1.)) * &
22095      &         ( 2.*tmp * qhcni(mgs) - tmp**2 * chcni(mgs)  )
22096       ENDIF
22099       pzhwi(mgs) =   &
22100      &  +ifrzg*ffrzh*(zrfrzf(mgs)   &
22101      & +il5(mgs)*ifiacrg*(ziacrf(mgs) ) )   &
22102 !     : + zhcnsh(mgs) + zhcnih(mgs)   &
22103      & + zhacw(mgs)   &
22104      & + zhacr(mgs)   &
22105      & + zhcnhl(mgs)  &
22106      & + zhacs(mgs)   &
22107      & + zhaci(mgs)   &
22108      &  + f2h*zhcni(mgs) + f2h*zhcns(mgs) &
22109      & + Max( 0.0, zhdsv(mgs) )
22111       pzhwd(mgs) = 0.0   &
22112      & + (1-il5(mgs))*zhmlr(mgs)   &
22113      & + zhshr(mgs)   &
22114      &  + Min( 0.0, zhdsv(mgs) )   &
22115      &  - il5(mgs)*zhlcnh(mgs)
22118            IF ( igs(mgs) == 44 .and. kgs(mgs) == 23 .or. dtp*( pqhwi(mgs) + pqhwd(mgs) ) > qxmin(lh) ) THEN
22119 !             write(0,*)  'i,k,time = ',igs(mgs),kgs(mgs),time_real
22120 !             write(0,*) 'pzhwi,d = ',pzhwi(mgs),pzhwd(mgs),dtp*( pzhwi(mgs) + pzhwd(mgs) ),zx(mgs,lh)
22121 !             write(0,*) 'pqhwi,d = ',pqhwi(mgs),pqhwd(mgs),dtp*( pqhwi(mgs) + pqhwd(mgs) ),qx(mgs,lh)
22122 !             write(0,*) 'pchwi,d = ',pchwi(mgs),pchwd(mgs),dtp*( pchwi(mgs) + pchwd(mgs) ),cx(mgs,lh)
22123            ENDIF
22126 !        IF ( zhcnhl(mgs) < 0.0 ) THEN
22127 !          write(0,*) 'Problem with zhcnhl! zhcnhl,qhcnhl,chcnhl = ',zhcnhl(mgs),qhcnhl(mgs),chcnhl(mgs)
22128 !          write(0,*) 'g1,tmp = ',g1x(mgs,lhl),tmp
22129 !          write(0,*) ( 2.*( tmp ) * qhcnhl(mgs) - tmp**2 * chcnhl(mgs) )
22130 !          
22131 !!          STOP
22132 !        ENDIF
22133       end do
22135       if (ndebug .gt. 0 .and. my_rank>=0 ) write(0,*) my_rank, 'end graupel reflectivity'
22136       
22137       ENDIF
22140 !  Hail reflectivity
22143       do mgs = 1,ngscnt
22144       
22145       zhldsv(mgs) = 0.0
22146       zhlacr(mgs) = 0.0
22147       zhlacw(mgs) = 0.0
22148       
22149       ENDDO
22151       IF ( lzhl .gt. 1 .or. ( lzr > 1 .and. lnhl > 1 ) ) THEN ! also run for 2-moment hail for 3-moment rain sources
22153       if (ndebug .gt. 0 .and. my_rank>=0 ) write(0,*) my_rank, 'hail reflectivity'
22155       do mgs = 1,ngscnt
22156       
22157       IF ( qx(mgs,lhl) .gt. qxmin(lhl) .and. cx(mgs,lhl) .gt. 0.0 ) THEN
22158           tmp = qx(mgs,lhl)/cx(mgs,lhl)
22159           alp = Max( alphamin, alpha(mgs,lhl) )
22160 !          g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
22161           g1 = g1x(mgs,lhl) ! (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
22162         
22163         IF ( .not. mixedphase .and. qhlmlr(mgs) /= 0.0 .and. chlmlr(mgs) /= 0.0 .and. ibinhlmlr < 1 ) THEN
22164          zhlmlr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lhl)))**2*( 2.*tmp * qhlmlr(mgs) - tmp**2 * chlmlr(mgs)  )
22165         ENDIF
22166         
22167         zhlshr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lhl)))**2*( 2.*tmp * qhlshr(mgs) - tmp**2 * chlshr(mgs)  )
22168         IF ( lzr > 1 .and. qhlshr(mgs) /= 0.0 .and. chlshrr(mgs) /= 0.0 ) THEN
22169          IF ( temg(mgs) >= tfr ) THEN
22170  !           zhlshrr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn0(lr)))**2*( 2.*tmp * qhlshr(mgs) - tmp**2 * chlshrr(mgs)  )
22171  !           IF ( zhlshrr(mgs) > 0.0 ) THEN
22172  !             zhlshrr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn0(lr)))**2*( 2.*tmp * qhlshr(mgs) - tmp**2 * chlshr(mgs)  )
22173  !           ENDIF
22174            IF ( (shedalp + alpha(mgs,lhl))*xdia(mgs,lhl,1) < sheddiam ) THEN ! if not shedding small drops, then use alpha of hail
22175              z1 = g1*(6.0*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhlshr(mgs)**2/ chlshrr(mgs)  ) 
22176            ELSE
22177              z1 = g1shr*(6.0*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhlshr(mgs)**2/ chlshrr(mgs)  ) ! should this be g1shr?
22178            ENDIF
22179            zhlshrr(mgs) = z1
22180 !           z1 = g1mlr*(rho0(mgs)/(xdn(mgs,lr)))**2*( qhlshr(mgs)**2/ chlshrr(mgs)  ) ! should this be g1shr?
22181 !           zhlshrr(mgs) = Max( z1, zhlshrr(mgs))
22182          ELSE
22183           zhlshrr(mgs) =  g1shr*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhlshr(mgs)**2/ chlshrr(mgs)  )
22184          ENDIF
22186           zhlshrr(mgs) = Min( 0.0, zhlshrr(mgs) )
22187         ENDIF
22189         IF ( zhlshr(mgs) > 0.0 ) THEN
22190           write(0,*) 'Problem with zhlshr! zhlshr,qhlshr,chlshr = ',zhlshr(mgs),qhlshr(mgs),chlshr(mgs)
22191           write(0,*) 'g1,tmp, qx,cx,zx = ',g1,tmp,qx(mgs,lhl),cx(mgs,lhl),zx(mgs,lhl)
22192           write(0,*) ( 2.*tmp * qhlshr(mgs) - tmp**2 * chlshr(mgs)  ),  2.*tmp * qhlshr(mgs), - tmp**2 * chlshr(mgs)
22193           write(0,*) 'temcg = ',temcg(mgs),'chlshr recalc = ',(cx(mgs,lhl)/(qx(mgs,lhl)+1.e-20))*qhlshr(mgs)
22194           
22195           STOP
22196         ENDIF
22197 !        zhlshr(mgs) = Min( 0.0, zhlshr(mgs) )
22199 !        zhlshr(mgs) =  (xdn0(lr)/(xdn(mgs,lhl)))**2*( zx(mgs,lhl) * qhlshr(mgs) )
22200         
22201         qtmp = qhldpv(mgs) + qhlcev(mgs)
22202         ctmp = chldpv(mgs) + chlcev(mgs)
22203         
22204         zhldsv(mgs) = g1*(6.*rho0(mgs)/(pi*xdn(mgs,lhl)))**2*( 2.*( tmp ) * qtmp - tmp**2 * ctmp )
22206           alp = Max( alphahacx, alpha(mgs,lhl) )
22207 !          g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
22208           g1 = g1x(mgs,lhl) ! (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
22210           IF ( .true. ) THEN ! {
22211           IF ( qhlacr(mgs) .gt. 0.0 ) THEN
22212 !          z = g1*(6.*rho0(mgs)/(pi*1000.))**2*( (qx(mgs,lhl)+dtp*qhlacr(mgs))**2)/(cx(mgs,lhl))
22213           zhlacr(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lhl)))**2*( 2.*( tmp ) * qhlacr(mgs) )
22214 !          zhlacr(mgs) = Min( zxmxd(mgs,lr), zhlacr(mgs) )
22215           
22216 !          IF ( z > zx(mgs,lhl) ) THEN
22217 !            zhlacr(mgs) = (z - zx(mgs,lhl))*dtpinv
22218 !          ELSE
22219 !            zhlacr(mgs) = 0.0
22220 !          ENDIF
22221           ENDIF
22223 !        zhacr(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( tmp ) * qhacr(mgs) )
22224 !        zhacr(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( tmp ) * qhacr(mgs) - tmp**2 * chacr(mgs) )
22226           IF ( qhlacw(mgs) .gt. 0.0 ) THEN
22227           alp = Max( 3.0, alpha(mgs,lhl)+1. )
22228           g1 = (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
22229           
22230 !          z = g1*(6.*rho0(mgs)/(pi*1000.))**2*( (qx(mgs,lhl)+dtp*(qhlacw(mgs)-qhlmul1(mgs)))**2)/(cx(mgs,lhl))
22231 !          zhlacw(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( qx(mgs,lhl)/cx(mgs,lhl)) * qhlacw(mgs) )
22232           zhlacw(mgs) =  g1*(6.*rho0(mgs)/(pi*xdn(mgs,lhl)))**2*( 2.*tmp * qhlacw(mgs) )
22234 !          IF ( z > zx(mgs,lhl) ) THEN
22235 !            zhlacw(mgs) = (z - zx(mgs,lhl))*dtpinv
22236 !          ENDIF
22237           g1 = g1x(mgs,lhl) ! (6.0 + alp)*(5.0 + alp)*(4.0 + alp)/((3.0 + alp)*(2.0 + alp)*(1.0 + alp))
22238           ENDIF
22239           
22240           ELSE ! }  .false. {
22242           IF ( qhlacw(mgs) .gt. 0.0 .or. qhlacr(mgs) .gt. 0.0 ) THEN
22243           z = g1*(6.*rho0(mgs)/(pi*1000.))**2*( (qx(mgs,lhl)+dtp*(qhlacr(mgs) + qhlacw(mgs)-qhlmul1(mgs)))**2)/(cx(mgs,lhl))
22244 !          zhlacw(mgs) =  g1*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*( qx(mgs,lhl)/cx(mgs,lhl)) * qhlacw(mgs) )
22245           IF ( z > zx(mgs,lhl) ) THEN
22246             zhlacw(mgs) = (z - zx(mgs,lhl))*dtpinv
22247           ENDIF
22248           ENDIF
22249           
22250           ENDIF ! }
22251         
22252       ENDIF
22253 ! qsplinter(mgs)
22254       
22255       IF ( lzhl > 1 ) THEN
22256       pzhli(mgs) = ffrzh*(((1.0-ifrzg)*zrfrzf(mgs)   &
22257      & +il5(mgs)*(1.0-ifiacrg)*ziacrf(mgs) )) &
22258      &  + il5(mgs)*zhlcnh(mgs)   &
22259      & + zhlacw(mgs)   &
22260      & + zhlacr(mgs)   &
22261 !     : + zhlacs(mgs)   &
22262      & + Max( 0.0, zhldsv(mgs) )
22264       pzhld(mgs) = 0.0   &
22265      & + (1-il5(mgs))*zhlmlr(mgs)   &
22266      & + zhlshr(mgs)   &
22267      & - zhcnhl(mgs)   &
22268      &  + Min( 0.0, zhldsv(mgs) )
22269       
22271        IF ( .not. ( -1.0 < pzhli(mgs) .and. pzhli(mgs) < 1.e20 ) ) THEN
22272          write(iunit,*) 'Problem with pzhli!'
22273          write(iunit,*) 'zhlcnh,zhlacw,zhlacr,zhldsv = ',zhlcnh(mgs),zhlacw(mgs),zhlacr(mgs),zhldsv(mgs)
22274        ENDIF
22276        IF ( .not. ( -1.0e20 < pzhld(mgs) .and. pzhld(mgs) < 1. ) ) THEN
22277          write(iunit,*) 'Problem with pzhld!'
22278          write(iunit,*) 'zhlmlr,zhlshr,zhldsv = ',zhlmlr(mgs),zhlshr(mgs),zhldsv(mgs)
22279        ENDIF
22280        
22281       ENDIF ! lzhl > 1
22282       
22283       end do
22284       
22285       ENDIF
22288 !  rain reflectivity
22290       if (ndebug .gt. 0 ) write(0,*) 'WARMZIEG: dbg = 11'
22292       IF ( lzr .gt. 1 ) THEN ! 
22293        
22294         DO mgs = 1,ngscnt
22295         
22296         zracw(mgs) = 0.0
22297         zracr(mgs) = 0.0
22298         zrcev(mgs) = 0.0
22299         zrach(mgs) = 0.0
22300         zrachl(mgs) = 0.0
22301         zsshr(mgs) = 0.0
22302         zsshrr(mgs) = 0.0
22303 !        zsmlr(mgs) = 0.0
22304         zsmlrr(mgs) = 0.0
22306         IF ( qx(mgs,ls) .gt. qxmin(ls) .and. ( csmlr(mgs) /= 0.0 .or. csshr(mgs) /= 0.0 .or. &
22307               csmlrr(mgs) /= 0.0 .or. csshrr(mgs) /= 0.0) ) THEN !{
22308          tmp = qx(mgs,ls)/cx(mgs,ls)
22309          g1 = 36.*(xnu(ls)+2.0)/((xnu(ls)+1.0)*pi**2)
22310         IF ( .not. mixedphase ) THEN
22311 !          zsmlr(mgs) =  (xdn(mgs,ls)/xdn(mgs,lr))**2*g1*(rho0(mgs)/(xdn(mgs,ls)))**2* &
22312 !     &                 ( 2.*tmp * qsmlr(mgs) - tmp**2 * csmlr(mgs)  )
22314           IF ( csmlrr(mgs) /= 0.0 ) THEN
22315             z1 = g1smlr*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qsmlr(mgs)**2/ csmlrr(mgs)  )
22316             zsmlrr(mgs) = z1
22317           ENDIF
22318         ENDIF
22319         
22320 !        zsshr(mgs) =  (xdn(mgs,ls)/xdn(mgs,lr))**2*g1*(rho0(mgs)/(xdn(mgs,ls)))**2*  &
22321 !     &                 ( 2.*tmp * qsshr(mgs) - tmp**2 * csshr(mgs)  )
22323          IF ( csshrr(mgs) /= 0.0 ) THEN
22324           z1 = g1smlr*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qsshr(mgs)**2/ csshrr(mgs)  )
22325           zsshrr(mgs) = z1
22326          ENDIF
22327         
22328         ENDIF !}
22329         
22330         IF ( .not. mixedphase ) THEN !{
22331           IF ( zhmlr(mgs) < 0.0 .and. chmlrr(mgs) /= 0.0 .and. ibinhmlr == 0 ) THEN !{
22332           tmp = qx(mgs,lh)/cx(mgs,lh)
22333 !          zhmlrr(mgs) =  Min(0.0, (xdn(mgs,lh)/xdn(mgs,lr))**2 * &
22334 !     &       g1x(mgs,lh)*(6.*rho0(mgs)/(pi*xdn(mgs,lh)))**2*( 2.*tmp * qhmlr(mgs) - tmp**2 * chmlrr(mgs)  ) )
22335             
22336 !            IF ( zhmlrr(mgs) >= 0. ) THEN
22337 !              zhmlrr(mgs) =  (xdn(mgs,lh)/xdn(mgs,lr))**2 * zhmlr(mgs)
22338 !            ENDIF
22339            IF ( (shedalp + alpha(mgs,lh))*xdia(mgs,lh,1) < sheddiam ) THEN ! if not shedding small drops, then use alpha of graupel
22340              z1 = g1x(mgs,lh)*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhmlr(mgs)**2/ chmlrr(mgs)  ) 
22341            ELSE ! assume drops are shed off, so use either alpha for shedding or graupel alpha, whichever gives the lower g-factor (i.e., larger alpha)
22342              z1 = Min(g1x(mgs,lh),g1shr)*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhmlr(mgs)**2/ chmlrr(mgs)  )
22343            ENDIF
22344            zhmlrr(mgs) = z1
22345 !           z1 = g1mlr*(rho0(mgs)/(xdn(mgs,lr)))**2*( qhmlr(mgs)**2/ chmlrr(mgs)  ) 
22346 !           zhmlrr(mgs) = Max( z1, zhmlrr(mgs))
22347           ENDIF !}
22350 !          zhshrr(mgs) =  (xdn(mgs,lh)/xdn(mgs,lr))**2 * zhshr(mgs)
22352          IF ( lhl > 1 .and. qhlmlr(mgs) /= 0 .and. ibinhlmlr == 0) THEN
22353           tmp = qx(mgs,lhl)/cx(mgs,lhl)
22354 !          zhlmlrr(mgs) =  Min(0.0, (xdn(mgs,lhl)/xdn(mgs,lr))**2 * &
22355 !     &       g1x(mgs,lhl)*(6.*rho0(mgs)/(pi*xdn(mgs,lhl)))**2*( 2.*tmp * qhlmlr(mgs) - tmp**2 * chlmlrr(mgs)  ) )
22357 !          IF ( zhlmlrr(mgs) >= 0. ) THEN ! should be negative, if not, then use alternate calculation
22358 !           zhlmlrr(mgs) =  (xdn(mgs,lhl)/xdn(mgs,lr))**2 * zhlmlr(mgs)
22359 !          ENDIF
22361            IF ( (shedalp + alpha(mgs,lhl))*xdia(mgs,lhl,1) < sheddiam ) THEN ! if not shedding small drops, then use alpha of hail
22362              z1 = g1x(mgs,lhl)*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhlmlr(mgs)**2/ chlmlrr(mgs)  ) 
22363            ELSE ! assume drops are shed off, so use either alpha for shedding or graupel alpha, whichever gives the lower g-factor (i.e., larger alpha)
22364              z1 = Min(g1x(mgs,lhl),g1shr)*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhlmlr(mgs)**2/ chlmlrr(mgs)  )
22365 !             z1 = g1shr*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( qhlmlr(mgs)**2/ chlmlrr(mgs)  )
22366            ENDIF
22367            zhlmlrr(mgs) = z1
22369 !           z1 = g1mlr*(rho0(mgs)/(xdn(mgs,lr)))**2*( qhlmlr(mgs)**2/ chlmlrr(mgs)  )
22370 !           zhlmlrr(mgs) = Max( z1, zhlmlrr(mgs))
22371 !         zhlmlr(mgs) =
22372 !          zhlshrr(mgs) =  (xdn(mgs,lhl)/xdn(mgs,lr))**2 * zhlshr(mgs)
22373          ENDIF
22374          
22375          ENDIF ! }
22377         IF ( qx(mgs,lr) .gt. qxmin(lr) .and. cx(mgs,lr) .gt. 0.0 ) THEN
22379           tmp = qx(mgs,lr)/cx(mgs,lr)
22380           g1 = g1x(mgs,lr) ! 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
22383         IF ( qracw(mgs) > 0.0 .and. cx(mgs,lr) > 0.0 ) THEN
22384          zracw(mgs) =  g1x(mgs,lr)*(6.*rho0(mgs)/(pi*1000.))**2*( 2.*tmp * qracw(mgs) )
22385         ENDIF
22386         
22387         IF ( cracr(mgs) > 0.0 .and. cx(mgs,lr) > 0.0  ) THEN
22388          zracr(mgs) =  g1x(mgs,lr)*(6.*rho0(mgs)/(pi*1000.))**2*( tmp**2 * cracr(mgs) )
22389         ENDIF
22391         qtmp = qrcev(mgs)
22392         ctmp = crcev(mgs)
22393         
22394 !        IF ( .false. .or. iferwisventr == 2 ) THEN
22395 !        zrcev(mgs) = Min(0.0, (12./(pii*xdn(mgs,lr)))*xdia(mgs,lr,1)**3*fvce(mgs)*rwcap(mgs)*rwventz(mgs) )
22396 !        ELSE
22397         zrcev(mgs) = g1x(mgs,lr)*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*( 2.*( tmp ) * qtmp - tmp**2 * ctmp )
22399         
22400         IF (  iferwisventr == 2 ) THEN
22401           vent1 = Min(0.0, (12./(pii*xdn(mgs,lr)))*xdia(mgs,lr,1)**3*fvce(mgs)*rwcap(mgs)*rwventz(mgs))
22402           zrcev(mgs) = Max( zrcev(mgs), vent1 )
22403         ENDIF
22404 !        IF ( ny == 2 .and. igs(mgs) == 20 ) THEN
22405 !          write(0,*) 'k,zrcevold,new,maxdep : ',kgs(mgs),zrcev(mgs),vent1,-zxmxd(mgs,lr),alpha(mgs,lr),cx(mgs,lr)
22406 !        ENDIF
22409 !        ENDIF
22410         zrcev(mgs) = Max( zrcev(mgs), -zxmxd(mgs,lr) )
22412         IF ( qhacr(mgs) > 0.0 ) THEN 
22413           zrach(mgs) =  g1x(mgs,lr)*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2* &
22414      &     ( 2.*( qx(mgs,lr)/cx(mgs,lr)) * qhacr(mgs) - tmp**2 * chacr(mgs) )
22415           zrach(mgs) = Min( zrach(mgs), zxmxd(mgs,lr) )
22416          
22417          ENDIF
22419         IF ( lhl > 1 .and. qhlacr(mgs) > 0.0 ) THEN 
22420           zrachl(mgs) = g1x(mgs,lr)*(6.*rho0(mgs)/(pi*xdn(mgs,lr)))**2*   &
22421      &     ( 2.*( qx(mgs,lr)/cx(mgs,lr)) * qhlacr(mgs) - tmp**2 * chlacr(mgs) )
22422           zrachl(mgs) = Min( zrachl(mgs), zxmxd(mgs,lr) )
22423          ENDIF
22426         
22427         ENDIF
22429          pzrwi(mgs) = zrcnw(mgs) + zracw(mgs) + zracr(mgs) &
22430      &    + Max( 0.,zrcev(mgs) )  &
22431      &  - (1-il5(mgs))*zsmlrr(mgs)   &
22432      &  - zsshrr(mgs)   &
22433      &  - (1-il5(mgs))*zhmlrr(mgs)   &
22434      &  - zhshrr(mgs)   &
22435      &  - (1-il5(mgs))*zhlmlrr(mgs)   &
22436      &  - zhlshrr(mgs)   
22439          pzrwd(mgs) = 0.0   &
22440      &   +  Min(0.,zrcev(mgs) )  &
22441      &    - zrach(mgs)  &
22442      &    - zrachl(mgs)  &
22443      &    - zrfrz(mgs)  &
22444      &    - il5(mgs)*(ziacr(mgs) ) 
22447          IF ( zx(mgs,lr) + dtp*(pzrwi(mgs)+pzrwd(mgs))  <= 0.0  &
22448               .and. qx(mgs,lr) > qxmin(lr) ) THEN
22449            pzrwd(mgs) =  -zx(mgs,lr)*dtpinv - pzrwi(mgs)
22450          ENDIF
22452         ENDDO
22454       ENDIF
22459 !  Snow volume
22461       IF ( lvol(ls) .gt. 1 ) THEN
22462       do mgs = 1,ngscnt
22463 !      pvswi(mgs) = rho0(mgs)*( pqswi(mgs) )/xdn0(ls)
22465       pvswi(mgs) = rho0(mgs)*(    &
22466 !aps     >   il5*qsfzs(mgs)/xdn(mgs,ls)   &
22467 !aps     >  -il5*qsfzs(mgs)/xdn(mgs,lr)   &
22468      &  +il5(mgs)*(qscni(mgs)+qsaci(mgs)+qsdpv(mgs)   &
22469      &   + qscnvi(mgs) + (1. - ifrzs)*qiacrs(mgs) &
22470      &   + (1. - ifrzs)*qrfrzs(mgs)  &
22471      &  )/xdn0(ls)   &
22472      &    + (qsacr(mgs))/rimdn(mgs,ls) ) + vsacw(mgs)
22473 !     >   + (qsacw(mgs) + qsacr(mgs))/rimdn(mgs,ls) )
22474       pvswd(mgs) = rho0(mgs)*( pqswd(mgs) )/xdn0(ls)  &
22475 !     >  -qhacs(mgs)
22476 !     >  -qhcns(mgs)
22477 !     >  +(1-il5(mgs))*qsmlr(mgs) + qsshr(mgs)
22478 !     >  +il5(mgs)*(qssbv(mgs))
22479      &   -rho0(mgs)*qsmul(mgs)/xdn0(ls)
22480 !aps     >   +rho0(mgs)*(1-il5(mgs))*(
22481 !aps     >             qsmlr(mgs)/xdn(mgs,ls)
22482 !aps     >    +(qscev-qsmlr(mgs))/xdn(mgs,lr) )
22483       end do
22485 !aps      IF (mixedphase) THEN
22486 !aps        pvswd(mgs) = pvswd(mgs)
22487 !aps     >   + rho0(mgs)*qsshr(mgs)/xdn(mgs,lr)
22488 !aps      ENDIF
22490       ENDIF
22492 !  Graupel volume
22494       IF ( lvol(lh) .gt. 1 ) THEN
22495       DO mgs = 1,ngscnt
22496 !      pvhwi(mgs) = rho0(mgs)*( (pqhwi(mgs) )/xdn0(lh) )
22498 !      pvhwi(mgs) = rho0(mgs)*( (pqhwi(mgs) - il5(mgs)*qrfrzf(mgs) )/xdn0(lh) !
22499 !     :  +  il5(mgs)*qrfrzf(mgs)/rhofrz )
22501       pvhwi(mgs) = rho0(mgs)*(   &
22502      &  +il5(mgs)*( ifiacrg*ffrzh*qracif(mgs))/rhofrz   &
22503 !erm     >  + il5(mgs)*qhfzh(mgs)/rhofrz !aps: or use xdnmx(lh)?   &
22504      &  + (  il5(mgs)*qhdpv(mgs)/qhdpvdn   &
22505      &     + (qhacs(mgs) + qhaci(mgs))/qhacidn ) )   &
22506      &  +   rho0(mgs)*Max(0.0, qhcev(mgs))/1000.   & ! only used in mixed phase: evaporation/condensation of liquid water coating
22507 !     >     + qhacs(mgs) + qhaci(mgs) )/xdn0(ls) )   &
22508      &  + f2h*vhcns(mgs)   &
22509      &  + vhacr(mgs) + vhacw(mgs)  + vhfzh(mgs)   & ! qhacw(mgs)/rimdn(mgs,lh)
22510 !     >  + vhfrh(mgs)   &
22511      &  + f2h*vhcni(mgs) + (ifiacrg*viacrf(mgs) + ifrzg*vrfrzf(mgs))*ffrzh
22512 !     >  +qhacr(mgs)/raindn(mgs,lh) + qhacw(mgs)/rimdn(mgs,lh)
22513       
22514 !      pvhwd(mgs) = rho0(mgs)*(pqhwd(mgs) )/xdn0(lh)
22516       pvhwd(mgs) = rho0(mgs)*(   &
22517 !     >   qhshr(mgs)/xdn0(lr)   &
22518 !     >  - il5(mgs)*qhfzh(mgs)/xdn(mgs,lr)   &
22519      &  +( (1-il5(mgs))*vhmlr(mgs)    &
22520 !     >     +il5(mgs)*qhsbv(mgs)   &
22521      &     + qhsbv(mgs)   &
22522      &     + Min(0.0, qhcev(mgs))   &
22523      &     -qhmul1(mgs) )/xdn(mgs,lh) )   &
22524      &  - vhlcnh(mgs) + vhshdr(mgs) - vhsoak(mgs) - vscnh(mgs)
22526 !      IF (mixedphase) THEN
22527 !       pvhwd(mgs) = pvhwd(mgs) 
22528 !     >  + rho0(mgs)*qhshr(mgs)/xdn(mgs,lh) !xdn(mgs,lr)
22529 !      ENDIF
22531        IF ( lzh > 1 .and. qx(mgs,lh) > qxmin(lh) ) THEN
22532 !       Calculate change in reflectivity due to density changes
22534         xdn_new = rho0(mgs)*(qx(mgs,lh) + dtp*(pqhwi(mgs) + pqhwd(mgs) ))/   &
22535      &   (vx(mgs,lh) + dtp*(pvhwi(mgs) + pvhwd(mgs))  )
22537            IF ( mixedphase ) THEN 
22538              IF ( qxw(mgs,lh) .gt. 0.0 ) THEN
22539                dnmx = xdnmx(lr)
22540              ELSE
22541                dnmx = xdnmx(lh)
22542              ENDIF
22543            ELSE
22544              dnmx = xdnmx(lh)
22545            ENDIF
22547         xdn_new = Max( Min( xdn_new, dnmx ), xdnmn(lh) )
22548         
22549         drhodt = (xdn_new - xdn(mgs,lh))*dtpinv
22550         
22551         zhwdn(mgs) = -2.*g1x(mgs,lh)*(rho0(mgs)*qx(mgs,lh)*6.*pii )**2/(cx(mgs,lh)*xdn(mgs,lh)**3)*drhodt
22552         
22553         pzhwi(mgs) = pzhwi(mgs) + Max(0.0, zhwdn(mgs))
22554         pzhwd(mgs) = pzhwd(mgs) + Min(0.0, zhwdn(mgs))
22555         
22556        
22557        ENDIF
22558       IF ( .false. .and. ny .eq. 2 .and. kgs(mgs) .eq. 9 .and. igs(mgs) .eq. 19 ) THEN
22560       write(iunit,*)
22561       write(iunit,*)   'Graupel at ',igs(mgs),kgs(mgs)
22563       write(iunit,*)   il5(mgs)*qrfrzf(mgs), qrfrzf(mgs) - qrfrz(mgs)
22564       write(iunit,*)   il5(mgs)*qiacrf(mgs)
22565       write(iunit,*)   il5(mgs)*qracif(mgs)
22566       write(iunit,*)   'qhcns',qhcns(mgs)
22567       write(iunit,*)   'qhcni',qhcni(mgs)
22568       write(iunit,*)   il5(mgs)*(qhdpv(mgs))
22569       write(iunit,*)   'qhacr ',qhacr(mgs)
22570       write(iunit,*)   'qhacw', qhacw(mgs)
22571       write(iunit,*)   'qhacs', qhacs(mgs)
22572       write(iunit,*)   'qhaci', qhaci(mgs)
22573       write(iunit,*)   'pqhwi = ',pqhwi(mgs)
22574       write(iunit,*)
22575       write(iunit,*) 'qhcev',qhcev(mgs)
22576       write(iunit,*)
22577       write(iunit,*)   'qhshr',qhshr(mgs)
22578       write(iunit,*)  'qhmlr', (1-il5(mgs))*qhmlr(mgs)
22579       write(iunit,*)   'qhsbv', qhsbv(mgs)
22580       write(iunit,*)   'qhlcnh',-qhlcnh(mgs)
22581       write(iunit,*)   'qhmul1',-qhmul1(mgs)
22582       write(iunit,*)   'pqhwd = ', pqhwd(mgs)
22583       write(iunit,*)
22584       write(iunit,*)  'Volume'
22585       write(iunit,*)
22586       write(iunit,*)  'pvhwi',pvhwi(mgs)
22587       write(iunit,*)   'vhcns', vhcns(mgs)
22588       write(iunit,*)  'vhacr,vhacw',vhacr(mgs), vhacw(mgs) ! qhacw(mgs)/rimdn(mgs,lh)
22589       write(iunit,*)  'vhcni',vhcni(mgs)
22590       write(iunit,*)
22591       write(iunit,*)  'pvhwd',pvhwd(mgs)
22592       write(iunit,*)  'vhlcnh,vhshdr,vhsoak ', vhlcnh(mgs),  vhshdr(mgs), vhsoak(mgs)
22593       write(iunit,*)  'vhmlr', vhmlr(mgs)
22594       write(iunit,*)
22595 !      write(iunit,*)
22596 !      write(iunit,*)
22597 !      write(iunit,*)
22598       write(iunit,*)  'Concentration'
22599       write(iunit,*)   pchwi(mgs),pchwd(mgs)
22600       write(iunit,*)  crfrzf(mgs)
22601       write(iunit,*)  chcns(mgs)
22602       write(iunit,*)  ciacrf(mgs)
22605       ENDIF
22608       ENDDO
22610       ENDIF
22616 !  Hail volume
22618       IF ( lhl .gt. 1 ) THEN
22619       IF ( lvol(lhl) .gt. 1 ) THEN
22620       DO mgs = 1,ngscnt
22622       pvhli(mgs) = rho0(mgs)*(   &
22623      &  + (  il5(mgs)*(((1.0-ifiacrg)*ffrzh*qracif(mgs))/rhofrz  + qhldpv(mgs) )   &
22624 !     &  +    Max(0.0, qhlcev(mgs))   &
22625 !     &     + qhlacs(mgs) + qhlaci(mgs) )/xdnmn(lhl) )   & ! xdn0(ls) )   &
22626 !     &     + qhlacs(mgs) + qhlaci(mgs) )/xdnmn(lh) )   &  ! yes, this is 'lh' on purpose
22627      &     + qhlacs(mgs) + qhlaci(mgs) )/500. )   &  ! changed to 500 instead of min graupel density to keep hail density from dropping too much
22628      &  +   rho0(mgs)*Max(0.0, qhlcev(mgs))/1000.   &
22629      &  + vhlcnhl(mgs) + ((1.0-ifiacrg)*ffrzh*viacrf(mgs) + (1.0-ifrzg)*ffrzh*vrfrzf(mgs))  & 
22630      &  + vhlacr(mgs) + vhlacw(mgs) + vhlfzhl(mgs) ! qhlacw(mgs)/rimdn(mgs,lhl)
22631       
22632       pvhld(mgs) = rho0(mgs)*(   &
22633      &  +(  qhlsbv(mgs)   &
22634      &     + Min(0.0, qhlcev(mgs))   &
22635      &     -qhlmul1(mgs) )/xdn(mgs,lhl) ) &
22636 !     &   + vhlmlr(mgs)                    &
22637      &   + rho0(mgs)*(1-il5(mgs))*vhlmlr(mgs)/xdn(mgs,lhl)  &
22638      &   + vhlshdr(mgs) - vhlsoak(mgs)
22640        IF ( lzhl > 1 .and. qx(mgs,lhl) > qxmin(lhl) ) THEN
22641 !       Calculate change in reflectivity due to density changes
22643         xdn_new = rho0(mgs)*(qx(mgs,lhl) + dtp*(pqhli(mgs) + pqhld(mgs) ))/   &
22644      &   (vx(mgs,lhl) + dtp*(pvhli(mgs) + pvhld(mgs))  )
22645         
22646            IF ( mixedphase ) THEN 
22647              IF ( qxw(mgs,lhl) .gt. 0.0 ) THEN
22648                dnmx = xdnmx(lr)
22649              ELSE
22650                dnmx = xdnmx(lhl)
22651              ENDIF
22652            ELSE
22653              dnmx = xdnmx(lhl)
22654            ENDIF
22655         xdn_new = Max( Min( xdn_new, dnmx ), xdnmn(lhl) )
22656         
22657         drhodt = (xdn_new - xdn(mgs,lhl))*dtpinv
22658         
22659         zhldn(mgs) = -2.*g1x(mgs,lhl)*(rho0(mgs)*qx(mgs,lhl)*6.*pii )**2/(cx(mgs,lhl)*xdn(mgs,lhl)**3)*drhodt
22660         
22661         pzhli(mgs) = pzhli(mgs) + Max(0.0, zhldn(mgs))
22662         pzhld(mgs) = pzhld(mgs) + Min(0.0, zhldn(mgs))
22663         
22664        
22665        ENDIF
22667       ENDDO
22668       
22669       ENDIF
22670       ENDIF
22673       if ( ndebug .ge. 1 ) then
22674       do mgs = 1,ngscnt
22676       ptotal(mgs) = 0.
22677       ptotal(mgs) = ptotal(mgs)     &
22678      &  + pqwvi(mgs) + pqwvd(mgs)   &
22679      &  + pqcwi(mgs) + pqcwd(mgs)   &
22680      &  + pqcii(mgs) + pqcid(mgs)   &
22681      &  + pqrwi(mgs) + pqrwd(mgs)   &
22682      &  + pqswi(mgs) + pqswd(mgs)   &
22683      &  + pqhwi(mgs) + pqhwd(mgs)   &
22684      &  + pqhli(mgs) + pqhld(mgs)
22687       
22688       
22689       ENDDO
22690       
22691       do mgs = 1,ngscnt
22693       if ( ( (ndebug .ge. 0  ) .and. abs(ptotal(mgs)) .gt. eqtot )   &
22694 !      if ( (  abs(ptotal(mgs)) .gt. eqtot )
22695 !     :    .or. pqswi(mgs)*dtp .gt. 1.e-3
22696 !     :    .or. pqhwi(mgs)*dtp .gt. 1.e-3
22697 !     :     .or. dtp*(pqrwi(mgs)+pqrwd(mgs)) .gt. 10.0e-3
22698 !     :     .or. dtp*(pccii(mgs)+pccid(mgs)) .gt. 1.e7
22699 !     :     .or. dtp*(pcipi(mgs)+pcipd(mgs)) .gt. 1.e7    &
22700      &  .or.  .not. (ptotal(mgs) .lt. 1.0 .and.  ptotal(mgs) .gt. -1.0)   & ! this line is basically checking for NaNs
22701      &              ) then
22702       write(iunit,*) 'YIKES! ','ptotal1',mgs,igs(mgs),jgs,   &
22703      &       kgs(mgs),ptotal(mgs)
22705       write(iunit,*) 't7: ', t7(igs(mgs),jgs,kgs(mgs))
22706       write(iunit,*)  'cci,ccw,crw,rdia: ',cx(mgs,li),cx(mgs,lc),cx(mgs,lr),0.5*xdia(mgs,lr,1)
22707       write(iunit,*)  'qc,qi,qr : ',qx(mgs,lc),qx(mgs,li),qx(mgs,lr)
22708       write(iunit,*)  'rmas, qrcalc : ',xmas(mgs,lr),xmas(mgs,lr)*cx(mgs,lr)/rho0(mgs)
22709       write(iunit,*)  'vti,vtc,eiw,vtr: ',vtxbar(mgs,li,1),vtxbar(mgs,lc,1),eiw(mgs),vtxbar(mgs,lr,1)
22710       write(iunit,*)  'cidia,cwdia,qcmxd: ', xdia(mgs,li,1),xdia(mgs,lc,1),qcmxd(mgs)
22711       write(iunit,*)  'snow: ',qx(mgs,ls),cx(mgs,ls),swvent(mgs),vtxbar(mgs,ls,1),xdia(mgs,ls,1)
22712       write(iunit,*)  'graupel: ',qx(mgs,lh),cx(mgs,lh),hwvent(mgs),vtxbar(mgs,lh,1),xdia(mgs,lh,1)
22713       IF ( lhl .gt. 1 ) write(iunit,*)  'hail: ',qx(mgs,lhl),cx(mgs,lhl),hlvent(mgs),vtxbar(mgs,lhl,1),xdia(mgs,lhl,1)
22716       write(iunit,*)  'li: ',xdia(mgs,li,1),xdia(mgs,li,2),xmas(mgs,li),qx(mgs,li),   &
22717      &         vtxbar(mgs,li,1)
22720       write(iunit,*)  'rain cx,xv : ',cx(mgs,lr),xv(mgs,lr)
22721       write(iunit,*)  'temcg = ', temcg(mgs)
22723       write(iunit,*) 'v ', pqwvi(mgs) ,pqwvd(mgs)
22724       write(iunit,*) 'c ', pqcwi(mgs) ,pqcwd(mgs)
22725       write(iunit,*) 'ci', pqcii(mgs) ,pqcid(mgs)
22726       write(iunit,*) 'r ', pqrwi(mgs) ,pqrwd(mgs)
22727       write(iunit,*) 's ', pqswi(mgs) ,pqswd(mgs)
22728       write(iunit,*) 'h ', pqhwi(mgs) ,pqhwd(mgs)
22729       write(iunit,*) 'hl', pqhli(mgs) ,pqhld(mgs)
22730        tmp =  pqwvi(mgs) + pqwvd(mgs)   &
22731      &  + pqcwi(mgs) + pqcwd(mgs)   &
22732      &  + pqcii(mgs) + pqcid(mgs)   &
22733      &  + pqrwi(mgs) + pqrwd(mgs)   &
22734      &  + pqswi(mgs) + pqswd(mgs)   &
22735      &  + pqhwi(mgs) + pqhwd(mgs)   &
22736      &  + pqhli(mgs) + pqhld(mgs)
22738       write(iunit,*) 'total = ',tmp
22739       write(iunit,*) 'END OF OUTPUT OF SOURCE AND SINK'
22742 !  print production terms
22744       write(iunit,*)
22745       write(iunit,*)   'Vapor'
22747       write(iunit,*)   -Min(0.0,qrcev(mgs))
22748       write(iunit,*)   -il5(mgs)*qhsbv(mgs)
22749       write(iunit,*)   -il5(mgs)*qhlsbv(mgs)
22750       write(iunit,*)   -il5(mgs)*qssbv(mgs)
22751       write(iunit,*)   -il5(mgs)*qisbv(mgs)
22752       write(iunit,*)    'pqwvi= ', pqwvi(mgs)
22753       write(iunit,*)   -Max(0.0,qrcev(mgs))
22754       write(iunit,*)   -Max(0.0,qhcev(mgs))
22755       write(iunit,*)   -Max(0.0,qhlcev(mgs))
22756       write(iunit,*)   -Max(0.0,qscev(mgs))
22757       write(iunit,*)   -il5(mgs)*qiint(mgs)
22758       write(iunit,*)   -il5(mgs)*qhdpv(mgs)
22759       write(iunit,*)   -il5(mgs)*qhldpv(mgs)
22760       write(iunit,*)   -il5(mgs)*qsdpv(mgs)
22761       write(iunit,*)   -il5(mgs)*qidpv(mgs)
22762       write(iunit,*)    'pqwvd = ', pqwvd(mgs)
22764       write(iunit,*)
22765       write(iunit,*)   'Cloud ice'
22767       write(iunit,*)   il5(mgs)*qicicnt(mgs)
22768       write(iunit,*)   il5(mgs)*qidpv(mgs)
22769       write(iunit,*)   il5(mgs)*qiacw(mgs)
22770       write(iunit,*)   il5(mgs)*qwfrzc(mgs)
22771       write(iunit,*)   il5(mgs)*qwctfzc(mgs)
22772       write(iunit,*)   il5(mgs)*qicichr(mgs)
22773       write(iunit,*)   qhmul1(mgs)
22774       write(iunit,*)   qhlmul1(mgs)
22775       write(iunit,*)   'pqcii = ', pqcii(mgs)
22776       write(iunit,*)   -il5(mgs)*qscni(mgs)
22777       write(iunit,*)   -il5(mgs)*qscnvi(mgs)
22778       write(iunit,*)   -il5(mgs)*qraci(mgs)
22779       write(iunit,*)   -il5(mgs)*qsaci(mgs)
22780       write(iunit,*)   -il5(mgs)*qhaci(mgs)
22781       write(iunit,*)   -il5(mgs)*qhlaci(mgs)
22782       write(iunit,*)   il5(mgs)*qisbv(mgs)
22783       write(iunit,*)   (1.-il5(mgs))*qimlr(mgs)
22784       write(iunit,*)   -il5(mgs)*qhcni(mgs)
22785       write(iunit,*)   'pqcid = ', pqcid(mgs)
22786       write(iunit,*)   ' Conc:'
22787       write(iunit,*)   pccii(mgs),pccid(mgs)
22788       write(iunit,*)   il5(mgs),cicint(mgs)
22789       write(iunit,*)   cwfrzc(mgs),cwctfzc(mgs)
22790       write(iunit,*)   cicichr(mgs)
22791       write(iunit,*)   chmul1(mgs)
22792       write(iunit,*)   chlmul1(mgs)
22793       write(iunit,*)   csmul(mgs)
22798       write(iunit,*)
22799       write(iunit,*)   'Cloud water'
22801       write(iunit,*)   'pqcwi =', pqcwi(mgs)
22802       write(iunit,*)   -il5(mgs)*qiacw(mgs)
22803       write(iunit,*)   -il5(mgs)*qwfrzc(mgs)
22804       write(iunit,*)   -il5(mgs)*qwctfzc(mgs)
22805 !      write(iunit,*)   -il5(mgs)*qwfrzp(mgs)
22806 !      write(iunit,*)   -il5(mgs)*qwctfzp(mgs)
22807       write(iunit,*)   -il5(mgs)*qiihr(mgs)
22808       write(iunit,*)   -il5(mgs)*qicichr(mgs)
22809       write(iunit,*)   -il5(mgs)*qipiphr(mgs)
22810       write(iunit,*)   -qracw(mgs)
22811       write(iunit,*)   -qsacw(mgs)
22812       write(iunit,*)   -qrcnw(mgs)
22813       write(iunit,*)   -qhacw(mgs)
22814       write(iunit,*)   -qhlacw(mgs)
22815       write(iunit,*)   'pqcwd = ', pqcwd(mgs)
22818       write(iunit,*)
22819       write(iunit,*)  'Concentration:'
22820       write(iunit,*)   -cautn(mgs)
22821       write(iunit,*)   -cracw(mgs)
22822       write(iunit,*)   -csacw(mgs)
22823       write(iunit,*)   -chacw(mgs)
22824       write(iunit,*)  -ciacw(mgs)
22825       write(iunit,*)  -cwfrzp(mgs)
22826       write(iunit,*)  -cwctfzp(mgs)
22827       write(iunit,*)  -cwfrzc(mgs)
22828       write(iunit,*)  -cwctfzc(mgs)
22829       write(iunit,*)   pccwd(mgs)
22831       write(iunit,*)
22832       write(iunit,*)      'Rain '
22834       write(iunit,*)      qracw(mgs)
22835       write(iunit,*)      qrcnw(mgs)
22836       write(iunit,*)      Max(0.0, qrcev(mgs))
22837       write(iunit,*)       -(1-il5(mgs))*qhmlr(mgs)
22838       write(iunit,*)       -(1-il5(mgs))*qhlmlr(mgs)
22839       write(iunit,*)       -(1-il5(mgs))*qsmlr(mgs)
22840       write(iunit,*)       -(1-il5(mgs))*qimlr(mgs)
22841       write(iunit,*)       -qrshr(mgs)
22842       write(iunit,*)       'pqrwi = ', pqrwi(mgs)    
22843       write(iunit,*)        -qsshr(mgs)     
22844       write(iunit,*)        -qhshr(mgs)     
22845       write(iunit,*)        -qhlshr(mgs)
22846       write(iunit,*)        -il5(mgs)*qiacr(mgs),qiacr(mgs), qiacrf(mgs)
22847       write(iunit,*)        -il5(mgs)*qrfrz(mgs)
22848       write(iunit,*)        -qsacr(mgs)
22849       write(iunit,*)        -qhacr(mgs)
22850       write(iunit,*)        -qhlacr(mgs)
22851       write(iunit,*)        qrcev(mgs)
22852       write(iunit,*)       'pqrwd = ', pqrwd(mgs) 
22853       write(iunit,*)        'qrzfac = ', qrzfac(mgs)
22855       
22856       write(iunit,*)
22857       write(iunit,*)  'Rain concentration'
22858       write(iunit,*)  pcrwi(mgs) 
22859       write(iunit,*)    crcnw(mgs)
22860       write(iunit,*)    1-il5(mgs)
22861       write(iunit,*)   -chmlr(mgs),-csmlr(mgs)
22862       write(iunit,*)     -crshr(mgs)
22863       write(iunit,*)  pcrwd(mgs) 
22864       write(iunit,*)    il5(mgs)
22865       write(iunit,*)   -ciacr(mgs),-crfrz(mgs) 
22866       write(iunit,*)   -csacr(mgs),-chacr(mgs)
22867       write(iunit,*)   +crcev(mgs)
22868       write(iunit,*)   cracr(mgs)
22869 !      write(iunit,*)   -il5(mgs)*ciracr(mgs)
22872       write(iunit,*)
22873       write(iunit,*)   'Snow'
22875       write(iunit,*)        il5(mgs)*qscni(mgs), qscnvi(mgs)
22876       write(iunit,*)        il5(mgs)*qsaci(mgs)
22877       write(iunit,*)        il5(mgs)*qrfrzs(mgs)
22878       write(iunit,*)        il5(mgs)*qiacrs(mgs),il3(mgs)*(qiacrf(mgs)+qracif(mgs)),il3(mgs),qiacrf(mgs),qracif(mgs)
22879       write(iunit,*)        il5(mgs)*qsdpv(mgs), qscev(mgs)
22880       write(iunit,*)        qsacw(mgs)
22881       write(iunit,*)        qsacr(mgs), qscnh(mgs)
22882        write(iunit,*)        'pqswi = ',pqswi(mgs)
22883       write(iunit,*)        -qhcns(mgs)
22884       write(iunit,*)        -qracs(mgs)
22885       write(iunit,*)        -qhacs(mgs)
22886       write(iunit,*)        -qhlacs(mgs)
22887       write(iunit,*)       (1-il5(mgs))*qsmlr(mgs)
22888       write(iunit,*)       qsshr(mgs)
22889 !      write(iunit,*)       qsshrp(mgs)
22890       write(iunit,*)       il5(mgs)*(qssbv(mgs))
22891       write(iunit,*)       'pqswd = ', pqswd(mgs)
22892       write(iunit,*)   -qracs(mgs)*(1-il2(mgs)) , qhacs(mgs) , qhlacs(mgs)   
22893       write(iunit,*)   -qhcns(mgs)   
22894       write(iunit,*)   +(1-il5(mgs))*qsmlr(mgs) , qsshr(mgs)     
22895       write(iunit,*)    qssbv(mgs)
22896       write(iunit,*)   Min(0.0, qscev(mgs))  
22897       write(iunit,*)   -qsmul(mgs)
22900       write(iunit,*)
22901       write(iunit,*)   'Graupel'
22903       write(iunit,*)   il5(mgs)*qrfrzf(mgs), qrfrzf(mgs) - qrfrz(mgs)
22904       write(iunit,*)   il5(mgs)*qiacrf(mgs)
22905       write(iunit,*)   il5(mgs)*qracif(mgs)
22906       write(iunit,*)   qhcns(mgs)
22907       write(iunit,*)   qhcni(mgs)
22908       write(iunit,*)   il5(mgs)*(qhdpv(mgs))
22909       write(iunit,*)   qhacr(mgs)
22910       write(iunit,*)   qhacw(mgs)
22911       write(iunit,*)   qhacs(mgs)
22912       write(iunit,*)   qhaci(mgs)
22913       write(iunit,*)   'pqhwi = ',pqhwi(mgs)
22914       write(iunit,*)
22915       write(iunit,*)   qhshr(mgs)
22916       write(iunit,*)   (1-il5(mgs))*qhmlr(mgs)
22917       write(iunit,*)   il5(mgs),qhsbv(mgs)
22918       write(iunit,*)   -qhlcnh(mgs)
22919       write(iunit,*)   -qhmul1(mgs)
22920       write(iunit,*)   'pqhwd = ', pqhwd(mgs)
22921       write(iunit,*)  'Concentration'
22922       write(iunit,*)   pchwi(mgs),pchwd(mgs)
22923       write(iunit,*)  crfrzf(mgs)
22924       write(iunit,*)  chcns(mgs)
22925       write(iunit,*)  ciacrf(mgs)
22928       write(iunit,*)
22929       write(iunit,*)   'Hail'
22931       write(iunit,*)   qhlcnh(mgs)
22932       write(iunit,*)   il5(mgs)*(qhldpv(mgs))
22933       write(iunit,*)   qhlacr(mgs)
22934       write(iunit,*)   qhlacw(mgs)
22935       write(iunit,*)   qhlacs(mgs)
22936       write(iunit,*)   qhlaci(mgs)
22937       write(iunit,*)   pqhli(mgs)
22938       write(iunit,*)
22939       write(iunit,*)   qhlshr(mgs)
22940       write(iunit,*)   (1-il5(mgs))*qhlmlr(mgs)
22941       write(iunit,*)   il5(mgs)*qhlsbv(mgs)
22942       write(iunit,*)   pqhld(mgs)
22943       write(iunit,*)  'Concentration'
22944       write(iunit,*)   pchli(mgs),pchld(mgs)
22945       write(iunit,*)  chlcnh(mgs)
22947 !  Balance and checks for continuity.....within machine precision...
22950       write(iunit,*) 'END OF OUTPUT OF SOURCE AND SINK'
22951       write(iunit,*) 'PTOTAL',ptotal(mgs)
22953       end if ! ptotal out of bounds or NaN
22955       end do
22958       end if ! ( nstep/12*12 .eq. nstep )
22961 !  latent heating from phase changes (except qcw, qci cond, and evap)
22963       do mgs = 1,ngscnt
22964       IF ( warmonly < 0.5 ) THEN
22965       pfrz(mgs) =    &
22966      &  (1-il5(mgs))*   &
22967      &  (qhmlr(mgs)+    &
22968      &   qsmlr(mgs)+qhlmlr(mgs))   & !+qhmlh(mgs))   &
22969      &  +il5(mgs)*(1-imixedphase)*(   &
22970      &   qsacw(mgs)+qhacw(mgs) + qhlacw(mgs)   &
22971      &  +qsacr(mgs)+qhacr(mgs) + qhlacr(mgs)   &
22972      &  +qsshr(mgs)   &
22973      &  +qhshr(mgs)   &
22974      &  +qhlshr(mgs)  &
22975      &  +qrfrz(mgs)+qiacr(mgs)  &
22976      &  )  &
22977      &  +il5(mgs)*(qwfrz(mgs)    &
22978      &  +qwctfz(mgs)+qiihr(mgs)   &
22979      &  +qiacw(mgs))
22980       pmlt(mgs) =    &
22981      &  (1-il5(mgs))*   &
22982      &  (qhmlr(mgs)+qsmlr(mgs)+  &
22983      &   qhlmlr(mgs))    !+qhmlh(mgs))   
22984       ! NOTE: psub is sum of sublimation and deposition
22985       psub(mgs) =    &
22986      &   il5(mgs)*(   &
22987      &  + qsdpv(mgs) + qhdpv(mgs)   &
22988      &  + qhldpv(mgs)    &
22989      &  + qidpv(mgs) + qisbv(mgs) )   &
22990      &   + qssbv(mgs)  + qhsbv(mgs) &
22991      &  + qhlsbv(mgs)   &
22992      &  +il5(mgs)*(qiint(mgs))
22993       pvap(mgs) =    &
22994      &   qrcev(mgs) + qhcev(mgs) + qscev(mgs) + qhlcev(mgs) + qfcev(mgs)
22995       pevap(mgs) =    &
22996      &   Min(0.0,qrcev(mgs)) + Min(0.0,qhcev(mgs)) + Min(0.0,qscev(mgs)) + Min(0.0,qhlcev(mgs)) &
22997          +  Min(0.0,qfcev(mgs))
22998       ! NOTE: pdep is the deposition part only
22999       pdep(mgs) =    &
23000      &   il5(mgs)*(   &
23001      &  + qsdpv(mgs) + qhdpv(mgs)   &
23002      &  + qhldpv(mgs)    &
23003      &  + qidpv(mgs)  )   & 
23004      &  +il5(mgs)*(qiint(mgs))
23005       ELSEIF ( warmonly < 0.8 ) THEN
23006       pfrz(mgs) =    &
23007      &  (1-il5(mgs))*   &
23008      &  (qhmlr(mgs)+qhlmlr(mgs))   & !+qhmlh(mgs))   &
23009      &  +il5(mgs)*(qhfzh(mgs)+qhlfzhl(mgs))   &
23010      &  +il5(mgs)*(   &
23011      &  +qhshr(mgs)   &
23012      &  +qhlshr(mgs)   &
23013      &  +qrfrz(mgs)+qwfrz(mgs)   &
23014      &  +qwctfz(mgs)+qiihr(mgs)   &
23015      &  +qiacw(mgs)                &
23016      & +qhacw(mgs) + qhlacw(mgs)   &
23017      & +qhacr(mgs) + qhlacr(mgs)  ) 
23018       psub(mgs) =  0.0 +  &
23019      &   il5(mgs)*(   &
23020      &  + qhdpv(mgs)   &
23021      &  + qhldpv(mgs)    &
23022      &  + qidpv(mgs) + qisbv(mgs) )   &
23023      &  +il5(mgs)*(qiint(mgs))
23024       pvap(mgs) =    &
23025      &   qrcev(mgs) + qhcev(mgs) + qhlcev(mgs) + qfcev(mgs) 
23026       ELSE
23027       pfrz(mgs) = 0.0
23028       psub(mgs) = 0.0
23029       pvap(mgs) = qrcev(mgs)
23030       ENDIF ! warmonly
23031       ptem(mgs) =    &
23032      &  (1./pi0(mgs))*   &
23033      &  (felfcp(mgs)*pfrz(mgs)   &
23034      &  +felscp(mgs)*psub(mgs)    &
23035      &  +felvcp(mgs)*pvap(mgs))
23036       thetap(mgs) = thetap(mgs) + dtp*ptem(mgs)
23037       ptem2(mgs) = ptem(mgs)
23038       IF ( eqtset > 2 ) THEN
23039         pipert(mgs) = pipert(mgs) + (felfpi(mgs)*pfrz(mgs)   &
23040      &  +felspi(mgs)*psub(mgs)    &
23041      &  +felvpi(mgs)*pvap(mgs))*dtp
23042       ENDIF
23043       end do
23049 !  sum the sources and sinks for qwvp, qcw, qci, qrw, qsw
23052       do mgs = 1,ngscnt
23055       qwvp(mgs) = qwvp(mgs) +        &
23056      &   dtp*(pqwvi(mgs)+pqwvd(mgs))
23057       qx(mgs,lc) = qx(mgs,lc) +   &
23058      &   dtp*(pqcwi(mgs)+pqcwd(mgs))
23059       qx(mgs,lr) = qx(mgs,lr) +   &
23060      &   dtp*(pqrwi(mgs)+pqrwd(mgs))
23061       qx(mgs,li) = qx(mgs,li) +   &
23062      &   dtp*(pqcii(mgs)+pqcid(mgs))
23063       qx(mgs,ls) = qx(mgs,ls) +   &
23064      &   dtp*(pqswi(mgs)+pqswd(mgs))
23065       qx(mgs,lh) = qx(mgs,lh) +    &
23066      &   dtp*(pqhwi(mgs)+pqhwd(mgs))
23068       IF ( lhl .gt. 1 ) THEN
23069       qx(mgs,lhl) = qx(mgs,lhl) +    &
23070      &   dtp*(pqhli(mgs)+pqhld(mgs))
23071       ENDIF
23074       end do
23076 ! sum sources for particle volume
23078       IF ( ldovol ) THEN
23080       do mgs = 1,ngscnt
23082       IF ( lvol(ls) .gt. 1 ) THEN
23083       vx(mgs,ls) = vx(mgs,ls) +    &
23084      &   dtp*(pvswi(mgs)+pvswd(mgs))
23085       ENDIF
23087       IF ( lvol(lh) .gt. 1 ) THEN
23088       vx(mgs,lh) = vx(mgs,lh) +    &
23089      &   dtp*(pvhwi(mgs)+pvhwd(mgs))
23090 !     >   rho0(mgs)*dtp*(pqhwi(mgs)+pqhwd(mgs))/xdn0(lh)
23091       ENDIF
23093       IF ( lhl .gt. 1 ) THEN
23094       IF ( lvol(lhl) .gt. 1 ) THEN
23095       vx(mgs,lhl) = vx(mgs,lhl) +    &
23096      &   dtp*(pvhli(mgs)+pvhld(mgs))
23097 !     >   rho0(mgs)*dtp*(pqhwi(mgs)+pqhwd(mgs))/xdn0(lh)
23098       ENDIF
23099       ENDIF
23101       ENDDO
23103       ENDIF  ! ldovol
23108 ! concentrations
23110       if ( ipconc .ge. 1  ) then
23111       do mgs = 1,ngscnt
23112       cx(mgs,li) = cx(mgs,li) +   &
23113      &   dtp*(pccii(mgs)+pccid(mgs)) 
23114       cina(mgs) = cina(mgs) + pccin(mgs)*dtp
23115       IF ( ipconc .ge. 2 ) THEN
23116       cx(mgs,lc) = cx(mgs,lc) +   &
23117      &   dtp*(pccwi(mgs)+pccwd(mgs))
23118       ENDIF
23119       IF ( ipconc .ge. 3 ) THEN
23120       cx(mgs,lr) = cx(mgs,lr) +   &
23121      &   dtp*(pcrwi(mgs)+pcrwd(mgs))
23122       ENDIF
23123       IF ( ipconc .ge. 4 ) THEN
23124       cx(mgs,ls) = cx(mgs,ls) +   &
23125      &   dtp*(pcswi(mgs)+pcswd(mgs))
23126       ENDIF
23127       IF ( ipconc .ge. 5 ) THEN
23128       cx(mgs,lh) = cx(mgs,lh) +    &
23129      &   dtp*(pchwi(mgs)+pchwd(mgs))
23130        IF ( lhl .gt. 1 ) THEN
23131         cx(mgs,lhl) = cx(mgs,lhl) +    &
23132      &     dtp*(pchli(mgs)+pchld(mgs))
23135         
23136         
23137        ENDIF
23138       ENDIF
23139       IF ( ipconc .ge. 6 ) THEN
23140        IF ( lzr .gt. 1 ) THEN
23141        zx(mgs,lr) = zx(mgs,lr) +    &
23142      &   dtp*(pzrwi(mgs)+pzrwd(mgs))
23143        ENDIF
23144        IF ( lzs .gt. 1 ) THEN
23145        zx(mgs,ls) = zx(mgs,ls) +    &
23146      &   dtp*(pzswi(mgs)+pzswd(mgs))
23147        ENDIF
23148        IF ( lzh .gt. 1 ) THEN
23149        zx(mgs,lh) = zx(mgs,lh) +    &
23150      &   dtp*(pzhwi(mgs)+pzhwd(mgs))
23151        ENDIF
23152        IF ( lzhl .gt. 1 ) THEN
23153         zx(mgs,lhl) = zx(mgs,lhl) +    &
23154      &     dtp*(pzhli(mgs)+pzhld(mgs))
23155 !      IF ( pchli(mgs) .ne. 0. .or. pchld(mgs) .ne. 0 ) THEN
23156 !       write(0,*) 'dr: cx,pchli,pchld = ', cx(mgs,lhl),pchli(mgs),pchld(mgs), igs(mgs),kgs(mgs)
23157 !      ENDIF
23158        ENDIF
23159       ENDIF
23160       end do
23161       end if
23163       IF ( has_wetscav ) THEN
23164         DO mgs = 1,ngscnt
23165          evapprod2d(igs(mgs),kgs(mgs)) = -(qrcev(mgs) + qssbv(mgs)  + qhsbv(mgs) + qhlsbv(mgs)) 
23166          rainprod2d(igs(mgs),kgs(mgs)) = qrcnw(mgs) + qracw(mgs) + qsacw(mgs) + qhacw(mgs) + qhlacw(mgs) + &
23167                                          qraci(mgs) + qsaci(mgs) + qhaci(mgs) + qhlaci(mgs) + qscni(mgs)
23168         ENDDO
23169       ENDIF
23173 ! start saturation adjustment
23175       if (ndebug .gt. 0 ) write(0,*) 'conc 30a'
23176 !      include 'sam.jms.satadj.sgi'
23180 !  Modified Straka adjustment (nearly identical to Tao et al. 1989 MWR)
23184 !  set up temperature and vapor arrays
23186       do mgs = 1,ngscnt
23187       pqs(mgs) = (380.0)/(pres(mgs))
23188       theta(mgs) = thetap(mgs) + theta0(mgs)
23189       qvap(mgs) = max( (qwvp(mgs) + qv0(mgs)), 0.0 )
23190       temg(mgs) = theta(mgs)*pk(mgs) ! ( pres(mgs) / poo ) ** cap
23191       end do
23193 !  melting of cloud ice
23195       do mgs = 1,ngscnt
23196       qcwtmp(mgs) = qx(mgs,lc)
23197       ptimlw(mgs) = 0.0
23198       end do
23200       do mgs = 1,ngscnt
23201       qitmp(mgs) = qx(mgs,li)
23202       if( temg(mgs) .gt. tfr .and.   &
23203      &    qitmp(mgs) .gt. 0.0 ) then
23204       qx(mgs,lc) = qx(mgs,lc) + qitmp(mgs)
23205 !      pfrz(mgs) = pfrz(mgs) - qitmp(mgs)*dtpinv
23206       ptem(mgs) =  ptem(mgs) +   &
23207      &  (1./pi0(mgs))*   &
23208      &  felfcp(mgs)*(- qitmp(mgs)*dtpinv)  
23209       IF ( eqtset > 2 ) THEN
23210         pipert(mgs) = pipert(mgs) - (felfpi(mgs)*qitmp(mgs))
23211       ENDIF
23212       pmlt(mgs) = pmlt(mgs) - qitmp(mgs)*dtpinv
23213       scx(mgs,lc) = scx(mgs,lc) + scx(mgs,li)
23214       thetap(mgs) = thetap(mgs) -   &
23215      &  fcc3(mgs)*qitmp(mgs)
23216       ptimlw(mgs) = -fcc3(mgs)*qitmp(mgs)*dtpinv
23217       cx(mgs,lc) = cx(mgs,lc) + cx(mgs,li)
23218       qx(mgs,li) = 0.0
23219       cx(mgs,li) = 0.0
23220       scx(mgs,li) = 0.0
23221       vx(mgs,li) = 0.0
23222       qitmp(mgs) = 0.0
23223       end if
23224       end do
23230 !      do mgs = 1,ngscnt
23231 !      qimlw(mgs) = (qcwtmp(mgs)-qx(mgs,lc))*dtpinv
23232 !      end do
23234 !  homogeneous freezing of cloud water
23236       IF ( warmonly < 0.8 ) THEN
23238       do mgs = 1,ngscnt
23239       qcwtmp(mgs) = qx(mgs,lc)
23240       ptwfzi(mgs) = 0.0
23241       end do
23243       do mgs = 1,ngscnt
23245 !      if( temg(mgs) .lt. tfrh ) THEN
23246 !       write(0,*) 'GS: mgs,temp,qc,qi = ',mgs,temg(mgs),temcg(mgs),qx(mgs,lc),qx(mgs,li)
23247 !      ENDIF
23249       ctmp = 0.0
23250       frac = 0.0
23251       qtmp = 0.0
23252       
23253 !      if( ( temg(mgs) .lt. thnuc + 2. .or. (ibfc == 2 .and. temg(mgs) < thnuc + 10. ) ) .and.    &
23254 !     &  qx(mgs,lc) .gt. qxmin(lc) .and. (ipconc < 2 .or. ibfc == 0 .or. ibfc == 2 )) then
23255 ! commented for test (12/01/2015):
23256 !      if( temg(mgs) .lt. thnuc + 0. .and.    &
23257 !     &  qx(mgs,lc) .gt. 0.0 .and. (ipconc < 2 .or. ibfc == 0 )) then
23258       if( ( ( temg(mgs) .lt. thnuc + 0.) .or. (temg(mgs) .lt. thnuc + 2. .and. ibfc >= 3) ) .and.    &
23259      &  qx(mgs,lc) .gt. 0.0 .and. (ipconc < 2 .or. ibfc == 0 .or. ibfc == 2)) then
23261       IF ( ibfc >= 3 ) THEN
23262         frac = Max( 0.25, Min( 1., ((thnuc + 2.) - temg(mgs) )/4.0 ) )
23263       ELSEIF ( ibfc /= 2 .or. ipconc < 2 ) THEN
23264         frac = Max( 0.25, Min( 1., ((thnuc + 1.) - temg(mgs) )/4.0 ) )
23265       ELSE
23266           volt = exp( 16.2 + 1.0*temcg(mgs) )* 1.0e-6 !  Ts == -temcg ; volt comes from the fit in Fig. 1 in Bigg 1953 
23267                                                ! for mean temperature for freezing: -ln (V) = a*Ts - b
23268                                                ! volt is given in cm**3, so factor of 1.e-6 to convert to m**3
23269          
23270          cwfrz(mgs) = cx(mgs,lc)*Exp(-volt/xv(mgs,lc)) ! number of droplets with volume greater than volt
23272          qtmp = cwfrz(mgs)*xdn0(lc)*rhoinv(mgs)*(volt + xv(mgs,lc))
23273          frac = qtmp/qx(mgs,lc) ! reset number frozen to same fraction as mass. This makes 
23274                                                        ! sure that cwfrz and qwfrz are consistent and prevents 
23275                                                        ! spurious creation of ice crystals.
23276       
23277       ENDIF
23278       qtmp = frac*qx(mgs,lc)
23280       IF ( ibfc == 4 .and. lis >= 1 ) THEN
23281         qx(mgs,lis) = qx(mgs,lis) + qtmp
23282       ELSE
23283         qx(mgs,li) = qx(mgs,li) + qtmp ! qx(mgs,lc)
23284       ENDIF
23285       pfrz(mgs) = pfrz(mgs) + qtmp*dtpinv
23286       ptem(mgs) =  ptem(mgs) +   &
23287      &  (1./pi0(mgs))*   &
23288      &  felfcp(mgs)*(qtmp*dtpinv)  
23290       IF ( eqtset > 2 ) THEN
23291         pipert(mgs) = pipert(mgs) + felfpi(mgs)*qtmp
23292       ENDIF
23294 !      IF ( lvol(li) .gt. 1 ) vx(mgs,li) = vx(mgs,li) + rho0(mgs)*qx(mgs,lc)/xdn0(li)
23295       IF ( lvol(li) .gt. 1 ) vx(mgs,li) = vx(mgs,li) + rho0(mgs)*qtmp/xdn0(li)
23297       IF ( ipconc .ge. 2 ) THEN
23298         ctmp = frac*cx(mgs,lc)
23299 !        cx(mgs,li) = cx(mgs,li) + cx(mgs,lc)
23300         IF ( ibfc == 4 .and. lis >= 1 ) THEN
23301           cx(mgs,lis) = cx(mgs,lis) + ctmp
23302         ELSE
23303           cx(mgs,li) = cx(mgs,li) + ctmp
23304         ENDIF
23305       ELSE ! (ipconc .lt. 2 )
23306         ctmp = 0.0
23307         IF ( t9(igs(mgs),jgs,kgs(mgs)-1) .gt. qx(mgs,lc) ) THEN
23308            qtmp = frac*t9(igs(mgs),jgs,kgs(mgs)-1)  
23310 !           cx(mgs,lc) = cx(mgs,lc)*qx(mgs,lc)*rho0(mgs)/qtmp
23311            ctmp = cx(mgs,lc)*qx(mgs,lc)*rho0(mgs)/qtmp
23312         ELSE
23313            cx(mgs,lc) = Max(0.0,wvel(mgs))*dtp*cwccn   &
23314      &      /gz(igs(mgs),jgs,kgs(mgs))
23315           cx(mgs,lc) = cwccn
23316         ENDIF
23318        IF ( ipconc .ge. 1 ) cx(mgs,li) = Min(ccimx, cx(mgs,li) + cx(mgs,lc))
23319       ENDIF
23321       sctmp = frac*scx(mgs,lc)
23322 !      scx(mgs,li) = scx(mgs,li) + scx(mgs,lc)
23323       scx(mgs,li) = scx(mgs,li) + sctmp
23324 !      thetap(mgs) = thetap(mgs) + fcc3(mgs)*qx(mgs,lc)
23325 !      ptwfzi(mgs) = fcc3(mgs)*qx(mgs,lc)*dtpinv
23326 !      qx(mgs,lc) = 0.0
23327 !      cx(mgs,lc) = 0.0
23328 !      scx(mgs,lc) = 0.0
23329       thetap(mgs) = thetap(mgs) + fcc3(mgs)*qtmp
23330       ptwfzi(mgs) = fcc3(mgs)*qtmp*dtpinv
23331       qx(mgs,lc) = qx(mgs,lc) - qtmp
23332       cx(mgs,lc) = cx(mgs,lc) - ctmp
23333       scx(mgs,lc) = scx(mgs,lc) - sctmp
23334       end if
23335       end do
23337       ENDIF ! warmonly
23339 !      do mgs = 1,ngscnt
23340 !      qwfzi(mgs) = (qcwtmp(mgs)-qx(mgs,lc))*dtpinv   ! Not used?? (ERM)
23341 !      end do
23343 !  reset temporaries for cloud particles and vapor
23345       qcond(:) = 0.0
23346       
23347       IF ( ipconc .le. 1 .and.  lwsm6 ) THEN ! Explicit cloud condensation/evaporation (Rutledge and Hobbs 1983)
23348        DO mgs = 1,ngscnt
23350         qcwtmp(mgs) = qx(mgs,lc)
23351         theta(mgs) = thetap(mgs) + theta0(mgs)
23352         temgtmp = temg(mgs)
23353 !        temg(mgs) = theta(mgs)*(p2(igs(mgs),jgs,kgs(mgs)) ) ! *pk(mgs) ! ( pres(mgs) / poo ) ** cap
23354 !        temsav = temg(mgs)
23355 !        thsave(mgs) = thetap(mgs)
23356         temg(mgs) = theta(mgs)*pk(mgs) ! ( pres(mgs) / poo ) ** cap
23357         temcg(mgs) = temg(mgs) - tfr
23358         ltemq = (temg(mgs)-163.15)/fqsat+1.5
23359         ltemq = Min( nqsat, Max(1,ltemq) )
23361         qvs(mgs) = pqs(mgs)*tabqvs(ltemq)
23363         IF ( ( qvap(mgs) > qvs(mgs) .or. qx(mgs,lc) > qxmin(lc) ) .and. temg(mgs) > tfrh ) THEN
23364           tmp = (qvap(mgs) - qvs(mgs))/(1. + qvs(mgs)*felv(mgs)**2/(cp*rw*temg(mgs)**2) )
23365           qcond(mgs) = Min( Max( 0.0, tmp ), (qvap(mgs)-qvs(mgs)) )
23366           IF ( qx(mgs,lc) > qxmin(lc) .and. tmp < 0.0 ) THEN ! evaporation
23367             qcond(mgs) = Max( tmp, -qx(mgs,lc) )
23368           ENDIF
23369           qwvp(mgs) = qwvp(mgs) - qcond(mgs)
23370           qvap(mgs) = qvap(mgs) - qcond(mgs)
23371           qx(mgs,lc) = Max( 0.0, qx(mgs,lc) + qcond(mgs) )
23372           thetap(mgs) = thetap(mgs) + felvcp(mgs)*qcond(mgs)/(pi0(mgs))
23373           
23374         ENDIF
23375         
23376         ENDDO
23377       
23378       ENDIF
23379       
23380       
23381       IF ( ipconc .le. 1 .and. .not. lwsm6 ) THEN
23382 !      IF ( ipconc .le. 1  ) THEN
23383       
23384       do mgs = 1,ngscnt
23385       qx(mgs,lv) = max( 0.0, qvap(mgs) )
23386       qx(mgs,lc) = max( 0.0, qx(mgs,lc) )
23387       qx(mgs,li) = max( 0.0, qx(mgs,li) )
23388       qitmp(mgs) = qx(mgs,li)
23389       end do
23392       do mgs = 1,ngscnt
23393       qcwtmp(mgs) = qx(mgs,lc)
23394       qitmp(mgs) = qx(mgs,li)
23395       theta(mgs) = thetap(mgs) + theta0(mgs)
23396       temgtmp = temg(mgs)
23397       temg(mgs) = theta(mgs)*(pinit(kgs(mgs)) + p2(igs(mgs),jgs,kgs(mgs)) ) ! *pk(mgs) ! ( pres(mgs) / poo ) ** cap
23398       temsav = temg(mgs)
23399       thsave(mgs) = thetap(mgs)
23400       temcg(mgs) = temg(mgs) - tfr
23401       tqvcon = temg(mgs)-cbw
23402       ltemq = (temg(mgs)-163.15)/fqsat+1.5
23403       ltemq = Min( nqsat, Max(1,ltemq) )
23405       qvs(mgs) = pqs(mgs)*tabqvs(ltemq)
23406       qis(mgs) = pqs(mgs)*tabqis(ltemq)
23407       qss(mgs) = qvs(mgs)
23408       if ( temg(mgs) .lt. tfr ) then
23409       if( qx(mgs,lc) .ge. 0.0 .and. qitmp(mgs) .le. qxmin(li) )   &
23410      &  qss(mgs) = qvs(mgs)
23411       if( qx(mgs,lc) .le. qxmin(lc) .and. qitmp(mgs) .gt. qxmin(li))   &
23412      &  qss(mgs) = qis(mgs)
23413       if( qx(mgs,lc) .gt. qxmin(lc) .and. qitmp(mgs) .gt. qxmin(li))   &
23414      &   qss(mgs) = (qx(mgs,lc)*qvs(mgs) + qitmp(mgs)*qis(mgs)) /   &
23415      &   (qx(mgs,lc) + qitmp(mgs))
23416       end if
23417       end do
23419 !  iterate  adjustment
23421       do itertd = 1,2
23423       do mgs = 1,ngscnt
23425 !  calculate super-saturation
23427       qitmp(mgs) = qx(mgs,li)
23428       fcci(mgs) = 0.0
23429       fcip(mgs) = 0.0
23430       dqcw(mgs) = 0.0
23431       dqci(mgs) = 0.0
23432       dqwv(mgs) = ( qx(mgs,lv) - qss(mgs) )
23434 !  evaporation and sublimation adjustment
23436       if( dqwv(mgs) .lt. 0. ) then           !  subsaturated
23437         if( qx(mgs,lc) .gt. -dqwv(mgs) ) then  ! check if qc can make up all of the deficit
23438           dqcw(mgs) = dqwv(mgs)
23439           dqwv(mgs) = 0.
23440         else                                 !  otherwise make all qc available for evap
23441           dqcw(mgs) = -qx(mgs,lc)
23442           dqwv(mgs) = dqwv(mgs) + qx(mgs,lc)
23443         end if
23445         if( qitmp(mgs) .gt. -dqwv(mgs) ) then  ! check if qi can make up all the deficit
23446           dqci(mgs) = dqwv(mgs)
23447           dqwv(mgs) = 0.
23448         else                                  ! otherwise make all ice available for sublimation
23449           dqci(mgs) = -qitmp(mgs)
23450           dqwv(mgs) = dqwv(mgs) + qitmp(mgs)
23451         end if
23453        qwvp(mgs) = qwvp(mgs) - ( dqcw(mgs) + dqci(mgs) )  ! add to perturbation vapor
23455 ! This next line removed 3/19/2003 thanks to Adam Houston,
23456 !  who found the bug in the 3-ICE code
23457 !      qwvp(mgs) = max(qwvp(mgs), 0.0)
23458       qitmp(mgs) = qx(mgs,li)
23459       IF ( qitmp(mgs) .ge. qxmin(li) ) THEN
23460         fcci(mgs) = qx(mgs,li)/(qitmp(mgs))
23461       ELSE
23462         fcci(mgs) = 1.0
23463       ENDIF
23464       qx(mgs,lc) = qx(mgs,lc) + dqcw(mgs)
23465       qx(mgs,li) = qx(mgs,li) + dqci(mgs) * fcci(mgs)
23466       thetap(mgs) = thetap(mgs) +   &
23467      &  1./pi0(mgs)*   &
23468      &  (felvcp(mgs)*dqcw(mgs) +felscp(mgs)*dqci(mgs))
23470       IF ( eqtset > 2 ) THEN
23471         pipert(mgs) = pipert(mgs)   &
23472      &  +(felspi(mgs)*dqci(mgs)    &
23473      &  +felvpi(mgs)*dqcw(mgs))*dtp
23474       ENDIF
23476       end if  ! dqwv(mgs) .lt. 0. (end of evap/sublim)
23478 ! condensation/deposition
23480       IF ( dqwv(mgs) .ge. 0. ) THEN
23481       
23482 !      write(iunit,*) 'satadj: mgs,iter = ',mgs,itertd,dqwv(mgs),qss(mgs),qx(mgs,lv),qx(mgs,lc)
23484         qitmp(mgs) = qx(mgs,li)
23485         fracl(mgs) = 1.0
23486         fraci(mgs) = 0.0
23487         if ( temg(mgs) .lt. tfr .and. temg(mgs) .gt. thnuc ) then
23488           fracl(mgs) = max(min(1.,(temg(mgs)-233.15)/(20.)),0.0)
23489           fraci(mgs) = 1.0-fracl(mgs)
23490         end if
23491         if ( temg(mgs) .le. thnuc ) then
23492            fraci(mgs) = 1.0
23493            fracl(mgs) = 0.0
23494          end if
23495         fraci(mgs) = 1.0-fracl(mgs)
23497        gamss = (felvcp(mgs)*fracl(mgs) + felscp(mgs)*fraci(mgs))   &
23498      &      / (pi0(mgs))
23500       IF ( temg(mgs) .lt. tfr ) then
23501         IF (qx(mgs,lc) .ge. 0.0 .and. qitmp(mgs) .le. qxmin(li) ) then
23502          dqvcnd(mgs) = dqwv(mgs)/(1. + fcqv1(mgs)*qss(mgs)/   &
23503      &  ((temg(mgs)-cbw)**2))
23504         END IF
23505         IF ( qx(mgs,lc) .eq. 0.0 .and. qitmp(mgs) .gt. qxmin(li) ) then
23506           dqvcnd(mgs) = dqwv(mgs)/(1. + fcqv2(mgs)*qss(mgs)/   &
23507      &  ((temg(mgs)-cbi)**2))
23508         END IF
23509         IF ( qx(mgs,lc) .gt. 0.0 .and. qitmp(mgs) .gt. qxmin(li) ) then
23510          cdw = caw*pi0(mgs)*tfrcbw/((temg(mgs)-cbw)**2)
23511          cdi = cai*pi0(mgs)*tfrcbi/((temg(mgs)-cbi)**2)
23512          denom1 = qx(mgs,lc) + qitmp(mgs)
23513          denom2 = 1.0 + gamss*   &
23514      &    (qx(mgs,lc)*qvs(mgs)*cdw + qitmp(mgs)*qis(mgs)*cdi) / denom1
23515          dqvcnd(mgs) =  dqwv(mgs) / denom2
23516         END IF 
23518       ENDIF  !  temg(mgs) .lt. tfr
23520       if ( temg(mgs) .ge. tfr ) then
23521       dqvcnd(mgs) = dqwv(mgs)/(1. + fcqv1(mgs)*qss(mgs)/   &
23522      &  ((temg(mgs)-cbw)**2))
23523       end if
23525       delqci1=qx(mgs,li)
23527       IF ( qitmp(mgs) .gt. qxmin(li) ) THEN
23528         fcci(mgs) = qx(mgs,li)/(qitmp(mgs))
23529       ELSE
23530         fcci(mgs) = 1.0
23531       ENDIF
23533       dqcw(mgs) = dqvcnd(mgs)*fracl(mgs)
23534       dqci(mgs) = dqvcnd(mgs)*fraci(mgs)
23536       thetap(mgs) = thetap(mgs) +   &
23537      &   (felvcp(mgs)*dqcw(mgs) + felscp(mgs)*dqci(mgs))   &
23538      & / (pi0(mgs))
23540       IF ( eqtset > 2 ) THEN
23541         pipert(mgs) = pipert(mgs) + (0   &
23542      &  +felspi(mgs)*dqci(mgs)    &
23543      &  +felvpi(mgs)*dqcw(mgs))*dtp
23544       ENDIF
23546       qwvp(mgs) = qwvp(mgs) - ( dqvcnd(mgs) )
23547       qx(mgs,lc) = qx(mgs,lc) + dqcw(mgs)
23548 !      IF ( qitmp(mgs) .gt. qxmin(li) ) THEN
23549         qx(mgs,li) = qx(mgs,li) + dqci(mgs)*fcci(mgs)
23550         qitmp(mgs) = qx(mgs,li)
23551 !      ENDIF
23553 !      delqci(mgs) =  dqci(mgs)*fcci(mgs)
23555       END IF !  dqwv(mgs) .ge. 0.
23556       end do
23558       do mgs = 1,ngscnt
23559       qitmp(mgs) = qx(mgs,li)
23560       theta(mgs) = thetap(mgs) + theta0(mgs)
23561       temg(mgs) = theta(mgs)*pk(mgs) ! ( pres(mgs) / poo ) ** cap
23562       qvap(mgs) = Max((qwvp(mgs) + qv0(mgs)), 0.0)
23563       temcg(mgs) = temg(mgs) - tfr
23564       tqvcon = temg(mgs)-cbw
23565       ltemq = (temg(mgs)-163.15)/fqsat+1.5
23566       ltemq = Min( nqsat, Max(1,ltemq) )
23567       qvs(mgs) = pqs(mgs)*tabqvs(ltemq)
23568       qis(mgs) = pqs(mgs)*tabqis(ltemq)
23569       qx(mgs,lc) = max( 0.0, qx(mgs,lc) )
23570       qitmp(mgs) = max( 0.0, qitmp(mgs) )
23571       qx(mgs,lv) = max( 0.0, qvap(mgs))
23572 !      if ( temg(mgs) .lt. tfr ) then
23573 !      if( qx(mgs,lc) .ge. 0.0 .and. qitmp(mgs) .le. qxmin(li) )
23574 !     >  qss(mgs) = qvs(mgs)
23575 !c      if( qx(mgs,lc) .le. qxmin(lc) .and. qitmp(mgs) .gt. qxmin(li))
23576 !      if( qx(mgs,lc) .eq. 0.0 .and. qitmp(mgs) .gt. qxmin(li))
23577 !     >  qss(mgs) = qis(mgs)
23578 !c      if( qx(mgs,lc) .gt. qxmin(lc) .and. qitmp(mgs) .gt. qxmin(li))
23579 !      if( qx(mgs,lc) .gt. 0.0 .and. qitmp(mgs) .gt. qxmin(li))
23580 !     >  qss(mgs) = (qx(mgs,lc)*qvs(mgs) + qitmp(mgs)*qis(mgs)) /
23581 !     > (qx(mgs,lc) + qitmp(mgs))
23582 !      else
23583 !      qss(mgs) = qvs(mgs)
23584 !      end if
23585       qss(mgs) = qvs(mgs)
23586       if ( temg(mgs) .lt. tfr ) then
23587       if( qx(mgs,lc) .ge. 0.0 .and. qitmp(mgs) .le. qxmin(li) )   &
23588      &  qss(mgs) = qvs(mgs)
23589       if( qx(mgs,lc) .le. qxmin(lc) .and. qitmp(mgs) .gt. qxmin(li))   &
23590      &  qss(mgs) = qis(mgs)
23591       if( qx(mgs,lc) .gt. qxmin(lc) .and. qitmp(mgs) .gt. qxmin(li))   &
23592      &   qss(mgs) = (qx(mgs,lc)*qvs(mgs) + qitmp(mgs)*qis(mgs)) /   &
23593      &   (qx(mgs,lc) + qitmp(mgs))
23594       end if
23595 !      pceds(mgs) = (thetap(mgs) - thsave(mgs))*dtpinv
23596 !      write(iunit,*) 'satadj2: mgs,iter = ',mgs,itertd,dqwv(mgs),qss(mgs),qx(mgs,lv),qx(mgs,lc)
23597       end do
23599 !  end the saturation adjustment iteration loop
23601       end do
23603      ENDIF ! ( ipconc .le. 1 )
23606 !  spread the growth owing to vapor diffusion onto the
23607 !  ice crystal categories using the
23609 !  END OF SATURATION ADJUSTMENT
23612       if (ndebug .gt. 0 ) write(0,*) 'conc 30b'
23615 !  end of saturation adjustment
23619 ! !DIR$ IVDEP
23620       do mgs = 1,ngscnt
23621       t0(igs(mgs),jy,kgs(mgs)) =  temg(mgs)
23622       end do
23624 ! Load the save arrays
23628 ! Sample code for using the axtra array to load microphysical rates or quantities for output
23630 ! Note that indices 1 and 2 are used in the nucond subroutine for condensation/evap of droplets (1) and
23631 !    condensation of rain (2)
23633 !      IF ( io_flag .and. nxtra > 1 ) THEN
23634 !        DO mgs = 1,ngscnt
23635 !          axtra(igs(mgs),jy,kgs(mgs),3)  = pfrz(mgs) !
23636 !          axtra(igs(mgs),jy,kgs(mgs),4)  = qrcev(mgs) ! pre2
23637 !          axtra(igs(mgs),jy,kgs(mgs),5)  = psub(mgs) ! depsubr
23638 !          axtra(igs(mgs),jy,kgs(mgs),6)  = qrfrz(mgs) ! rain freezing (Bigg)
23639 !          axtra(igs(mgs),jy,kgs(mgs),7)  = pmlt(mgs) ! melr2
23640 !        ENDDO
23641 !      ENDIF
23645       if (ndebug .gt. 0 ) write(0,*) 'gs 11'
23647       do mgs = 1,ngscnt
23649       an(igs(mgs),jy,kgs(mgs),lt) =    &
23650      &  theta0(mgs) + thetap(mgs) 
23651       an(igs(mgs),jy,kgs(mgs),lv) = qwvp(mgs) + qv0(mgs) !
23653       IF ( eqtset > 2 ) THEN
23654         p2(igs(mgs),jy,kgs(mgs)) = pipert(mgs)
23655       ENDIF
23657       
23658       DO il = lc,lhab
23659         IF ( ido(il) .eq. 1 ) THEN
23660         IF ( lf > 1 .and. il == lf ) THEN 
23661            lfsave(mgs,1) = an(igs(mgs),jy,kgs(mgs),il)
23662            lfsave(mgs,2) = qx(mgs,il)
23663         ENDIF
23664          an(igs(mgs),jy,kgs(mgs),il) = qx(mgs,il) +   &
23665      &     min( an(igs(mgs),jy,kgs(mgs),il), 0.0 )
23666          qx(mgs,il) = an(igs(mgs),jy,kgs(mgs),il)
23667         ENDIF
23668       ENDDO
23670       IF ( lcina > 1 ) THEN
23671         an(igs(mgs),jy,kgs(mgs),lcina) = cina(mgs)
23672       ENDIF
23679 !  6th moments
23682       IF ( ipconc .ge. 6 ) THEN
23683        DO il = lr,lhab
23684         IF ( lz(il) .gt. 1 ) THEN
23685         IF ( lf > 1 .and. il == lf ) THEN 
23686            lfsave(mgs,3) = an(igs(mgs),jy,kgs(mgs),lz(il))
23687            lfsave(mgs,4) = zx(mgs,il)
23688         ENDIF
23690          an(igs(mgs),jy,kgs(mgs),lz(il)) = zx(mgs,il) +   &
23691      &     min( an(igs(mgs),jy,kgs(mgs),lz(il)), 0.0 )
23692          zx(mgs,il) = an(igs(mgs),jy,kgs(mgs),lz(il))
23693          
23694         ENDIF
23695        ENDDO
23696        
23697       ENDIF
23699       end do
23702       if ( ipconc .ge. 1 ) then
23703       DO il = lc,lhab !{
23705 !        write(0,*) 'limiter loop: il,ipc,lz: ',il,ipc(il),lz(il),ipconc
23707        IF ( ipconc .ge. ipc(il) .and. ido(il) > 0 ) THEN ! {
23709          IF (  ipconc .ge. 4 .and. ipc(il) .ge. 1 ) THEN ! {
23711 !            write(0,*) 'MY limiter: il,ipc,lz: ',il,ipc(il),lz(il),lr,lzr
23712 !            STOP
23714           IF ( lz(il) <= 1 .or. ioldlimiter == 1 ) THEN ! { { is a two-moment category so dont worry about reflectivity
23715           
23717            DO mgs = 1,ngscnt
23718             IF ( qx(mgs,il) .le. 0.0 ) THEN
23719               cx(mgs,il) = 0.0
23720             ELSE !{
23721               IF ( cx(mgs,il) .gt. cxmin ) THEN !{
23722 !              xv(mgs,il) = rho0(mgs)*qx(mgs,il)/(xdn(mgs,il)*Max(1.0e-9,cx(mgs,il)))
23723 !              xv(mgs,il) = rho0(mgs)*qx(mgs,il)/(xdn(mgs,il)*Max(cxmin,cx(mgs,il)))
23724                 xv(mgs,il) = rho0(mgs)*qx(mgs,il)/(xdn(mgs,il)*cx(mgs,il))
23725               
23726 !              IF ( lhl .gt. 1 .and. il .eq. lhl ) THEN
23727 !               write(0,*) 'dr: xv,cx,qx,xdn,ln = ',xv(mgs,il),cx(mgs,il),qx(mgs,il),xdn(mgs,il),ln(il)
23728 !              ENDIF
23730                ! 8/26/2015 erm: apply imaxdiaopt for 2-moment also
23731                IF ( imaxdiaopt == 1 .or. il == lc .or. il == li .or. (il == lr .and. imurain == 3) .or. &
23732      &              (il == ls .and. imusnow == 3 ) ) THEN
23733                  xvbarmax = xvmx(il)
23734                ELSEIF ( imaxdiaopt == 2 ) THEN ! test against maximum mass diameter
23735                  xvbarmax = xvmx(il) /((3. + alpha(mgs,il))**3/((3. + alpha(mgs,il))*(2. + alpha(mgs,il))*(1. + alpha(mgs,il))))
23736                ELSEIF ( imaxdiaopt == 3 ) THEN ! test against mass-weighted diameter
23737                  xvbarmax = xvmx(il) /((4. + alpha(mgs,il))**3/((3. + alpha(mgs,il))*(2. + alpha(mgs,il))*(1. + alpha(mgs,il))))
23738                ELSE
23739                  xvbarmax = xvmx(il)
23740                ENDIF
23742                tmp = 1.0
23743                IF ( il == ls ) THEN
23744                  xvbarmax = xvbarmax*Max(1.,100./Min(100.,xdn(mgs,ls)))
23745                ENDIF
23746                
23747                IF ( xv(mgs,il) .lt. xvmn(il) .or. xv(mgs,il) .gt. xvbarmax ) THEN
23748                 xv(mgs,il) = Min( xvbarmax, xv(mgs,il) )
23749                 xv(mgs,il) = Max( xvmn(il), xv(mgs,il) )
23750                 cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xv(mgs,il)*xdn(mgs,il))
23751                ENDIF
23752               
23753              ENDIF !}
23755 !              IF ( lhl .gt. 1 .and. il .eq. lhl ) THEN
23756 !               write(0,*) 'dr: xv,cx,= ',xv(mgs,il),cx(mgs,il)
23757 !              ENDIF
23759             ENDIF !}
23760            ENDDO ! mgs
23761           
23762           ELSE ! } { is three-moment, so have to adjust Z if size is too large
23763            IF ( il == lr .and. imurain == 3 ) THEN ! { { RAIN
23765 !          rdmx = 
23766 !          rdmn = 
23768           DO mgs = 1,ngscnt
23769           
23771          IF ( iresetmoments == 1 .or. iresetmoments == il  ) THEN
23772          IF ( zx(mgs,lr) <= zxmin ) THEN
23773            qx(mgs,lv) = qx(mgs,lv) + qx(mgs,il)
23774            qx(mgs,lr) = 0.0
23775            cx(mgs,lr) = 0.0
23776            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),lr)
23777            an(igs(mgs),jgs,kgs(mgs),lr) = qx(mgs,lr)
23778            an(igs(mgs),jgs,kgs(mgs),ln(lr)) = cx(mgs,lr)
23779          ELSEIF ( cx(mgs,lr) <= cxmin ) THEN
23780            qx(mgs,lv) = qx(mgs,lv) + qx(mgs,il)
23781            zx(mgs,lr) = 0.0
23782            qx(mgs,lr) = 0.0
23783            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),lr)
23784            an(igs(mgs),jgs,kgs(mgs),lr) = qx(mgs,lr)
23785            an(igs(mgs),jgs,kgs(mgs),lz(lr)) = zx(mgs,lr)
23786          ENDIF
23787          ENDIF
23788          
23789          IF ( qx(mgs,lr) .gt. qxmin(lr) ) THEN
23791         xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xdn(mgs,lr)*Max(1.0e-11,cx(mgs,lr)))
23792         IF ( xv(mgs,lr) .gt. xvmx(lr) ) THEN
23793 !          xv(mgs,lr) = xvmx(lr)
23794 !          cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmx(lr)*xdn(mgs,lr))
23795         ELSEIF ( xv(mgs,lr) .lt. xvmn(lr) ) THEN
23796           xv(mgs,lr) = xvmn(lr)
23797           cx(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(xvmn(lr)*xdn(mgs,lr))
23798         ENDIF
23800           IF ( zx(mgs,il) > 0.0 .and. cx(mgs,il) <= 0.0 ) THEN
23801 !  have mass and reflectivity but no concentration, so set concentration, using default alpha
23802             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
23803             z   = zx(mgs,il)
23804             qr  = qx(mgs,il)
23805             cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(z*xdn(mgs,lr)**2)
23806 !            an(igs(mgs),jgs,kgs(mgs),ln(il)) = zx(mgs,il)
23807            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) > 0.0 ) THEN
23808 !  have mass and concentration but no reflectivity, so set reflectivity, using default alpha
23809             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
23810             chw = cx(mgs,il)
23811             qr  = qx(mgs,il)
23812             zx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(xdn(mgs,lr)**2*chw)
23813             an(igs(mgs),jgs,kgs(mgs),lz(lr)) = zx(mgs,lr)
23815            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) <= 0.0 ) THEN
23816 !   How did this happen?
23817          ! set values according to dBZ of -10, or Z = 0.1
23818 !              0.1 = 1.e18*0.224*an(ix,jy,kz,lzh)*(hwdn/rwdn)**2
23819                zx(mgs,il) = 1.e-19/0.224*(xdn0(lr)/xdn0(il))**2
23820                an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
23821                
23822             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
23823                z   = zx(mgs,il)
23824                qr  = qx(mgs,il)
23825                cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/(z*1000.*1000)
23826                an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
23827           ENDIF
23828         
23829           IF ( zx(mgs,lr) > 0.0 ) THEN
23830             xv(mgs,lr) = rho0(mgs)*qx(mgs,lr)/(1000.*cx(mgs,lr))
23831             vr = xv(mgs,lr)
23832            qr = qx(mgs,lr)
23833            nrx = cx(mgs,lr)
23834            z = zx(mgs,lr)
23836 !           xv = (db(1,kz)*a(1,1,kz,lr))**2/(a(1,1,kz,lnr))
23837 !           rd = z*(pi/6.*1000.)**2/xv
23839 ! determine shape parameter alpha by iteration
23840            IF ( z .gt. 0.0 ) THEN
23841            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
23842            DO i = 1,20
23843             IF ( Abs(alp - alpha(mgs,lr)) .lt. 0.01 ) EXIT
23844              alpha(mgs,lr) = Max( rnumin, Min( rnumax, alp ) )
23845            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
23846              alp = Max( rnumin, Min( rnumax, alp ) )
23847            ENDDO
23849 ! check for artificial breakup (rain larger than allowed max size)
23850         IF (  xv(mgs,il) .gt. xvmx(il) .or. (ioldlimiter == 2 .and. xv(mgs,il) .gt. xvmx(il)/8.) ) THEN
23851           tmp = cx(mgs,il)
23852 !            write(0,*) 'MY limiter: xv: ',xv(mgs,il), xv(mgs,il)/(xvmx(il)/8.)
23853 !            STOP
23854           IF ( ioldlimiter == 2 ) THEN ! MY-style active breakup
23855             x = (6.*rho0(mgs)*qx(mgs,il)/(pi*xdn(mgs,il)*cx(mgs,il)))**(1./3.)
23856             x1 = Max(0.0e-3, x - 3.0e-3)
23857             x2 = Max(0.5, x/6.0e-3)
23858             x3 = x2**3
23859             cx(mgs,il) = cx(mgs,il)*Max((1.+2.222e3*x1**2), x3)
23860             xv(mgs,il) = xv(mgs,il)/Max((1.+2.222e3*x1**2), x3)
23861           ELSE ! simple cutoff 
23862             xv(mgs,il) = Min( xvmx(il), Max( xvmn(il),xv(mgs,il) ) )
23863             xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
23864             cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
23865           ENDIF
23866             !xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
23867             !cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
23868           
23869           
23870           IF ( tmp < cx(mgs,il) ) THEN ! breakup
23872             g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
23873             zx(mgs,il) = zx(mgs,il) + g1*(rho0(mgs)/xdn(mgs,il))**2*( (qx(mgs,il)/tmp)**2 * (tmp-cx(mgs,il)) )
23874             an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
23876            vr = xv(mgs,lr)
23877            qr = qx(mgs,lr)
23878            nrx = cx(mgs,lr)
23879            z = zx(mgs,lr)
23882 ! determine shape parameter alpha by iteration
23883            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
23884            DO i = 1,20
23885             IF ( Abs(alp - alpha(mgs,lr)) .lt. 0.01 ) EXIT
23886              alpha(mgs,lr) = Max( rnumin, Min( rnumax, alp ) )
23887            alp = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/(z*pi**2) - 1.
23888              alp = Max( rnumin, Min( rnumax, alp ) )
23889            ENDDO
23891             
23892           ENDIF
23893         ENDIF
23896 ! Check whether the shape parameter is at or less than the minimum, and if it is, reset the 
23897 ! concentration or reflectivity to match (prevents reflectivity from being out of balance with Q and N)
23899               g1 = 36.*(alpha(mgs,lr)+2.0)/((alpha(mgs,lr)+1.0)*pi**2)
23900            IF ( .true. .and. (alpha(mgs,il) <= rnumin .or. alp == rnumin .or. alp == rnumax) ) THEN
23902             IF ( rescale_high_alpha .and. alp >= rnumax - 0.01  ) THEN  ! reset c at high alpha to prevent growth in Z
23903               cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z*(1./(xdn(mgs,il)))**2
23904               an(igs(mgs),jy,kgs(mgs),ln(il)) = cx(mgs,il)
23905             
23906             ELSEIF ( rescale_low_alphar .and. alp <= rnumin ) THEN
23907              z  = 36.*(alpha(mgs,lr)+2.0)*nrx*vr**2/((alpha(mgs,lr)+1.0)*pi**2)
23908              zx(mgs,il) = z
23909              an(igs(mgs),jy,kgs(mgs),lz(il)) = zx(mgs,il)
23910             ENDIF
23911            ENDIF
23912            
23914            
23915            ENDIF
23916           ENDIF
23917           
23918           ENDIF
23919           
23920           ENDDO
23921 !        CALL cld_cpu('Z-MOMENT-1r')  
23922            
23923            
23924            ELSEIF ( il == lh .or. il == lhl .or. il == lf .or. (il == lr .and. imurain == 1 )) THEN ! } { Rain, GRAUPEL OR HAIL
23926         
23927         
23928         DO mgs = 1,ngscnt
23930         IF ( lf > 1 .and. il == lf ) THEN 
23931            lfsave(mgs,5) = an(igs(mgs),jy,kgs(mgs),ln(il))
23932            lfsave(mgs,6) = cx(mgs,il)
23933         ENDIF
23934         
23935         IF ( il == lhl .and. lnhlf > 1 ) THEN
23936           IF ( cx(mgs,lhl) > cxmin ) THEN
23937             frac = chxf(mgs,lhl)/cx(mgs,lhl)
23938           ELSE
23939             frac = 0.0
23940           ENDIF
23941         ENDIF
23943         IF ( il == lh .and. lnhf > 1 ) THEN
23944           IF ( cx(mgs,lh) > cxmin ) THEN
23945             frach = chxf(mgs,lh)/cx(mgs,lh)
23946           ELSE
23947             frach = 0.0
23948           ENDIF
23949         ENDIF
23953          IF ( iresetmoments == 1 .or. iresetmoments == il .or. iresetmoments == -1  ) THEN ! { .or. qx(mgs,il) <= qxmin(il) 
23954          IF ( zx(mgs,il) <= zxmin ) THEN !  .and. qx(mgs,il) > 0.05e-3 
23955 !!            write(91,*) 'zx=0; qx,cx = ',1000.*qx(mgs,il),cx(mgs,il)
23956            qx(mgs,il) = 0.0
23957            cx(mgs,il) = 0.0
23958            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
23959            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
23960            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
23961          ELSEIF ( iresetmoments == -1 .and. qx(mgs,il) < qxmin(il) ) THEN
23962            zx(mgs,il) = 0.0
23963            cx(mgs,il) = 0.0
23964            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
23966            qx(mgs,il) = 0.0
23967            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
23968            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
23969            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
23970          
23971          ELSEIF ( cx(mgs,il) <= cxmin .and. iresetmoments /= -1 ) THEN !  .and. qx(mgs,il) > 0.05e-3  
23972            qx(mgs,lv) = qx(mgs,lv) + qx(mgs,il)
23973            zx(mgs,il) = 0.0
23974            qx(mgs,il) = 0.0
23975            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
23976            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
23977            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
23978          ENDIF
23979          ELSE
23980             IF ( zx(mgs,il) < 0.0 ) THEN !  .and. qx(mgs,il) > 0.05e-3 
23981                zx(mgs,il) = 0.0
23982              ENDIF
23983          ENDIF !}
23986          IF (  zx(mgs,il) <= zxmin .and. cx(mgs,il) <= cxmin ) THEN
23987            zx(mgs,il) = 0.0
23988            cx(mgs,il) = 0.0
23989            an(igs(mgs),jgs,kgs(mgs),lv) = an(igs(mgs),jgs,kgs(mgs),lv) + an(igs(mgs),jgs,kgs(mgs),il)
23990            qx(mgs,il) = 0.0
23991            an(igs(mgs),jgs,kgs(mgs),il) = qx(mgs,il)
23992            an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
23993            an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
23994          ENDIF
23995         
23996         IF ( qx(mgs,il) .gt. qxmin(il) ) THEN !{
23998         xv(mgs,il) = rho0(mgs)*qx(mgs,il)/(xdn(mgs,il)*Max(1.0e-9,cx(mgs,il)))
23999         xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
24001         IF ( xv(mgs,il) .lt. xvmn(il) ) THEN
24002           xv(mgs,il) = Min( xvmx(il), Max( xvmn(il),xv(mgs,il) ) )
24003           xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
24004           cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
24005         ENDIF
24007           IF ( zx(mgs,il) > 0.0 .and. cx(mgs,il) <= 0.0 ) THEN !{
24008 !  have mass and reflectivity but no concentration, so set concentration, using default alpha
24009             g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
24010      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
24011             z   = zx(mgs,il)
24012             qr  = qx(mgs,il)
24013 !            cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z
24014             cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(6.*qr)**2/(z*(pi*xdn(mgs,il))**2)
24017            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) > 0.0 ) THEN
24018 !  have mass and concentration but no reflectivity, so set reflectivity, using default alpha
24019 !            g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
24020 !     &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
24021             chw = cx(mgs,il)
24022             qr  = qx(mgs,il)
24023 !            zx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/chw
24024 !            zx(mgs,il) = Min(zxmin*1.1, g1*dn(igs(mgs),jy,kgs(mgs))**2*(6.*qr)**2/(chw*(pi*xdn(mgs,il))**2) )
24025             g1 = (6.0 + alphamax)*(5.0 + alphamax)*(4.0 + alphamax)/ &
24026      &            ((3.0 + alphamax)*(2.0 + alphamax)*(1.0 + alphamax))
24027             zx(mgs,il) = Max(zxmin*1.1, g1*dn(igs(mgs),jy,kgs(mgs))**2*(6*qr)**2/(chw*(pi*xdn(mgs,il))**2) )
24028             an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
24030            ELSEIF ( zx(mgs,il) <= zxmin .and. cx(mgs,il) <= 0.0 ) THEN
24031 !   How did this happen?
24032          ! set values according to dBZ of -10, or Z = 0.1
24033 !              0.1 = 1.e18*0.224*an(ix,jy,kz,lzh)*(hwdn/rwdn)**2
24035 !               write(0,*) 'GS: moment problem! il,c,z,q = ',il,cx(mgs,il),zx(mgs,il),qx(mgs,il)
24036                
24037                zx(mgs,il) = 1.e-19/0.224*(xdn0(lr)/xdn0(il))**2
24038                an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
24039                
24040                g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
24041      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
24042                z   = zx(mgs,il)
24043                qr  = qx(mgs,il)
24044 !               cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z
24045                cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(6.*qr)**2/(z*(pi*xdn(mgs,il))**2)
24046                an(igs(mgs),jgs,kgs(mgs),ln(il)) = cx(mgs,il)
24047                
24048 !               write(0,*) 'GS: moment problem! reset il,c,z,q = ',il,cx(mgs,il),zx(mgs,il),qx(mgs,il)
24049                
24050            ELSE
24051           ! have all valid moments, so find shape parameter
24052           chw = cx(mgs,il)
24053           qr  = qx(mgs,il)
24054           z   = zx(mgs,il)
24056           IF ( zx(mgs,il) .gt. 0. ) THEN !{
24057            
24058 !            rdi = z*(pi/6.*1000.)**2*chw/((rho0(mgs)*qr)**2)
24059             rdi = z*(pi/6.*xdn(mgs,il))**2*chw/((rho0(mgs)*qr)**2)
24061 !           alp = 1.e18*(6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/
24062 !     :            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
24063            alp = (6.0+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
24064      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
24065 !           print*,'kz, alp, alpha(mgs,il) = ',kz,alp,alpha(mgs,il),rdi,z,xv
24066            DO i = 1,10
24067 !            IF ( 100.*Abs(alp - alpha(mgs,il))/(Abs(alpha(mgs,il))+1.e-5) .lt. 1. ) EXIT
24068              IF ( Abs(alp - alpha(mgs,il)) .lt. 0.01 ) EXIT
24069              alpha(mgs,il) = Max( alphamin, Min( alphamax, alp ) )
24070 !             alp = 1.e18*(6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/
24071 !     :            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
24072              alp = (6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
24073      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
24074 !           print*,'i,alp = ',i,alp
24075              alp = Max( alphamin, Min( alphamax, alp ) )
24076            ENDDO
24079 ! check for artificial breakup (graupel/hail larger than allowed max size)
24080         IF (  xv(mgs,il) .gt. xvmx(il) ) THEN !{
24081           tmp = cx(mgs,il)
24084           xv(mgs,il) = Min( xvmx(il), Max( xvmn(il),xv(mgs,il) ) )
24085           xmas(mgs,il) = xv(mgs,il)*xdn(mgs,il)
24086           cx(mgs,il) = rho0(mgs)*qx(mgs,il)/(xmas(mgs,il))
24087           IF ( tmp < cx(mgs,il) ) THEN ! breakup
24088             g1 = 36.*(6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
24089      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il))*pi**2)
24090              zx(mgs,il) = zx(mgs,il) + g1*(rho0(mgs)/xdn(mgs,il))**2*( (qx(mgs,il)/tmp)**2 * (tmp-cx(mgs,il)) )
24091              an(igs(mgs),jgs,kgs(mgs),lz(il)) = zx(mgs,il)
24093           chw = cx(mgs,il)
24094           qr  = qx(mgs,il)
24095           z   = zx(mgs,il)
24097             rdi = z*(pi/6.*xdn(mgs,il))**2*chw/((rho0(mgs)*qr)**2)
24098             alp = (6.0+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
24099      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
24100            DO i = 1,10
24101              IF ( Abs(alp - alpha(mgs,il)) .lt. 0.01 ) EXIT
24102              alpha(mgs,il) = Max( alphamin, Min( alphamax, alp ) )
24103              alp = (6.+alpha(mgs,il))*(5.0+alpha(mgs,il))*(4.0+alpha(mgs,il))/   &
24104      &            ((3.0+alpha(mgs,il))*(2.0+alpha(mgs,il))*rdi) - 1.0
24105              alp = Max( alphamin, Min( alphamax, alp ) )
24106            ENDDO
24108             
24109           ENDIF
24110         ENDIF !}
24113 ! Check whether the shape parameter is at or less than the minimum, and if it is, reset the 
24114 ! concentration or reflectivity to match (prevents reflectivity from being out of balance with Q and N)
24116              g1 = (6.0 + alpha(mgs,il))*(5.0 + alpha(mgs,il))*(4.0 + alpha(mgs,il))/ &
24117      &            ((3.0 + alpha(mgs,il))*(2.0 + alpha(mgs,il))*(1.0 + alpha(mgs,il)))
24119            IF ( ( lrescalelow(il) .or. rescale_high_alpha ) .and.  &
24120      &          ( alpha(mgs,il) <= alphamin .or. alp == alphamin .or. alp == alphamax ) ) THEN !{
24122             IF ( rescale_high_alpha .and. alp >= alphamax - 0.01  ) THEN  ! reset c at high alpha to prevent growth in Z
24123               cx(mgs,il) = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z*(6./(pi*xdn(mgs,il)))**2
24124               an(igs(mgs),jy,kgs(mgs),ln(il)) = cx(mgs,il)
24125             
24126             ELSEIF ( lrescalelow(il) .and. alp <= alphamin .and. .not. (il == lh .and. icvhl2h > 0 ) .and. &
24127                      .not. ( il == lr .and. .not. rescale_low_alphar ) ) THEN ! alpha = alphamin, so reset Z to prevent growth in C
24128              
24129              wtest = .false.
24130              IF ( irescalerainopt == 0 ) THEN
24131                wtest = .false.
24132              ELSEIF ( irescalerainopt == 1 ) THEN
24133                wtest = qx(mgs,lc) > qxmin(lc) 
24134              ELSEIF ( irescalerainopt == 2 ) THEN
24135                wtest = qx(mgs,lc) > qxmin(lc) .and. wvel(mgs) < rescale_wthresh
24136              ELSEIF ( irescalerainopt == 3 ) THEN
24137                wtest = temcg(mgs) > rescale_tempthresh .and. qx(mgs,lc) > qxmin(lc) .and. wvel(mgs) < rescale_wthresh
24138              ENDIF
24139              
24140              IF ( il == lr .and. ( wtest .or. .not. rescale_low_alphar ) ) THEN
24141              ! certain situations where rain number is adjusted instead of Z. Helps avoid rain being 'zapped' by autoconverted 
24142              ! drops (i.e., favor preserving Z when alpha tries to go negative)
24143              chw = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z*(6./(pi*xdn(mgs,il)))**2 ! g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/z1
24144              cx(mgs,il) = chw
24145              an(igs(mgs),jy,kgs(mgs),ln(il)) = chw
24146              ELSE
24147              ! Usual resetting of reflectivity moment to force consisntency between Q, N, Z, and alpha when alpha = alphamin
24148              z1 = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/chw
24149              z  = z1*(6./(pi*xdn(mgs,il)))**2
24150              zx(mgs,il) = z
24151              an(igs(mgs),jy,kgs(mgs),lz(il)) = z
24152              ENDIF
24154 !             z1 = g1*dn(igs(mgs),jy,kgs(mgs))**2*(qr)*qr/chw
24155 !             z  = z1*(6./(pi*xdn(mgs,il)))**2
24156 !             zx(mgs,il) = z
24157 !             an(igs(mgs),jy,kgs(mgs),lz(il)) = z
24158             ENDIF
24160            ENDIF !}
24161           
24162           
24163            ENDIF !}
24164           
24165            
24166            ENDIF ! !}
24168           
24169           
24170           ENDIF !}
24172         IF ( lzr > 1 ) THEN
24173           alpha2d(igs(mgs),kgs(mgs),1) = Max(alphamin, Min(alphamax, alpha(mgs,lr) ))
24174         ENDIF
24175         IF ( lzh > 1 ) THEN
24176           alpha2d(igs(mgs),kgs(mgs),2) = Max(alphamin, Min(alphamax, alpha(mgs,lh) ))
24177         ENDIF
24178         IF ( lzhl > 1 ) THEN
24179           alpha2d(igs(mgs),kgs(mgs),3) = Max(alphamin, Min(alphamax, alpha(mgs,lhl) ))
24180         ENDIF
24182         IF ( il == lhl .and. lnhlf > 1 ) THEN
24183         ! update chxf in case cx has changed
24184           chxf(mgs,lhl) = frac*cx(mgs,lhl)
24185         ENDIF
24186         IF ( il == lh .and. lnhf > 1 ) THEN
24187         ! update chxf in case cx has changed
24188           chxf(mgs,lh) = frach*cx(mgs,lh)
24189         ENDIF
24192 !      IF ( lf > 0 .and. il == lf .and. kgs(mgs) <= 20 .and. ( cx(mgs,lf) + dtp*( pcfwi(mgs) + pcfwd(mgs) ) > 200. .or. cx(mgs,lf) > 400. )) THEN
24193 !        write(0,*) 'ix,jy, kz, cf = ',igs(mgs)+ixbeg,jy+jybeg,kgs(mgs), an(igs(mgs),jy,kgs(mgs),ln(lf)),lfsave(mgs,5),lfsave(mgs,6)
24194 !        write(0,*) 'qold,qxold,zold,zxold = ',lfsave(mgs,1),lfsave(mgs,2),lfsave(mgs,3),lfsave(mgs,4)
24195 !        write(0,*) 'cf_new,pcfwi,pcfwd = ',cx(mgs,lf),cx(mgs,lf) + dtp*( pcfwi(mgs) + pcfwd(mgs) ),pcfwi(mgs) + pcfwd(mgs)
24196 !      
24197 !      ENDIF
24198         
24199         ENDDO ! mgs
24201 !         CALL cld_cpu('Z-DELABK')  
24202         
24204 !         CALL cld_cpu('Z-DELABK')  
24205         
24206         
24208            
24209            ENDIF ! } }
24211           ENDIF ! }}
24212           ENDIF ! }
24214           DO mgs = 1,ngscnt
24216             IF ( il == lh ) THEN
24217             IF ( lnhf > 1 ) THEN ! number of graupel from frozen drops
24218               an(igs(mgs),jy,kgs(mgs),lnhf) = Max( chxf(mgs,lh), 0.0)
24219             ENDIF
24220             ENDIF
24222             IF ( il == lhl ) THEN
24223             
24224             IF ( lnhlf > 1 ) THEN ! number of hail from frozen drops
24225 !              an(igs(mgs),jy,kgs(mgs),lnhlf) = Min( cx(mgs,lhl), Max( chxf(mgs,lhl), 0.0) )
24226               an(igs(mgs),jy,kgs(mgs),lnhlf) = Max( chxf(mgs,lhl), 0.0)
24227             ENDIF
24228             ENDIF
24229             an(igs(mgs),jy,kgs(mgs),ln(il)) = Max(cx(mgs,il), 0.0)
24230           ENDDO
24231         ENDIF ! }
24232       ENDDO ! il }
24234       IF ( lcin > 1 ) THEN
24235       do mgs = 1,ngscnt
24236         an(igs(mgs),jy,kgs(mgs),lcin) = Max(0.0, ccin(mgs))
24237       end do
24238       ENDIF
24240       IF ( ipconc .ge. 2 ) THEN
24241       do mgs = 1,ngscnt
24242         IF ( lss > 1 ) THEN
24243           an(igs(mgs),jy,kgs(mgs),lss) = Max(0.0, ssmax(mgs) )
24244         ENDIF
24246         IF ( lccn > 1 ) THEN
24247           an(igs(mgs),jy,kgs(mgs),lccn) = Max(0.0, ccnc(mgs) )
24248         ENDIF
24249       end do
24250       ENDIF
24251       
24252       ELSEIF ( ipconc .eq. 0 .and. lni .gt. 1 ) THEN
24253       
24254           DO mgs = 1,ngscnt
24255             an(igs(mgs),jy,kgs(mgs),lni) = Max(cx(mgs,li), 0.0)
24256           ENDDO
24259       end if
24261       IF ( ldovol ) THEN
24263        DO il = li,lhab
24265         IF ( lvol(il) .ge. 1 ) THEN
24267           DO mgs = 1,ngscnt
24269            an(igs(mgs),jy,kgs(mgs),lvol(il)) = Max( 0.0, vx(mgs,il) )
24270           ENDDO
24271           
24272         ENDIF
24273       
24274        ENDDO
24275       
24276       ENDIF
24282       if (ndebug .gt. 0 ) write(0,*) 'gs 12'
24286       if (ndebug .gt. 0 ) write(0,*) 'gs 13'
24288  9998 continue
24290       if ( kz .gt. nz-1 .and. ix .ge. itile) then
24291         if ( ix .ge. itile ) then
24292          go to 1200 ! exit gather scatter
24293         else
24294          nzmpb = kz
24295         endif
24296       else
24297         nzmpb = kz
24298       end if
24300       if ( ix .ge. itile ) then
24301         nxmpb = 1
24302         nzmpb = kz+1
24303       else
24304        nxmpb = ix+1
24305       end if
24307  1000 continue
24308  1200 continue
24310 !  end of gather scatter (for this jy slice)
24314       return
24315       end subroutine nssl_2mom_gs
24317 !--------------------------------------------------------------------------
24323 !--------------------------------------------------------------------------
24327 END MODULE module_mp_nssl_2mom