Line data Source code
1 : module micro_pumas_cam
2 :
3 : !---------------------------------------------------------------------------------
4 : !
5 : ! CAM Interfaces for MG microphysics
6 : !
7 : !---------------------------------------------------------------------------------
8 :
9 : use shr_kind_mod, only: r8=>shr_kind_r8
10 : use shr_kind_mod, only: cl=>shr_kind_cl
11 : use spmd_utils, only: masterproc
12 : use ppgrid, only: pcols, pver, pverp, psubcols
13 : use physconst, only: gravit, rair, tmelt, cpair, rh2o, rhoh2o, &
14 : latvap, latice, mwh2o
15 : use phys_control, only: phys_getopts, use_hetfrz_classnuc
16 :
17 : use shr_const_mod, only: pi => shr_const_pi
18 : use time_manager, only: get_curr_date, get_curr_calday
19 : use phys_grid, only: get_rlat_all_p, get_rlon_all_p
20 : use orbit, only: zenith
21 :
22 : use physics_types, only: physics_state, physics_ptend, &
23 : physics_ptend_init, physics_state_copy, &
24 : physics_update, physics_state_dealloc, &
25 : physics_ptend_sum, physics_ptend_scale
26 :
27 : use physics_buffer, only: physics_buffer_desc, pbuf_add_field, dyn_time_lvls, &
28 : pbuf_old_tim_idx, pbuf_get_index, dtype_r8, dtype_i4, &
29 : pbuf_get_field, pbuf_set_field, col_type_subcol, &
30 : pbuf_register_subcol
31 : use constituents, only: cnst_add, cnst_get_ind, &
32 : cnst_name, cnst_longname, sflxnam, apcnst, bpcnst, pcnst
33 :
34 : use cldfrc2m, only: rhmini=>rhmini_const
35 :
36 : use cam_history, only: addfld, add_default, outfld, horiz_only
37 :
38 : use cam_logfile, only: iulog
39 : use cam_abortutils, only: endrun
40 : use error_messages, only: handle_errmsg
41 : use ref_pres, only: top_lev=>trop_cloud_top_lev
42 :
43 : use micro_pumas_diags, only: proc_rates_type
44 :
45 : use subcol_utils, only: subcol_get_scheme
46 :
47 : implicit none
48 : private
49 : save
50 :
51 : public :: &
52 : micro_pumas_cam_readnl, &
53 : micro_pumas_cam_register, &
54 : micro_pumas_cam_init_cnst, &
55 : micro_pumas_cam_implements_cnst, &
56 : micro_pumas_cam_init, &
57 : micro_pumas_cam_tend, &
58 : micro_mg_version, &
59 : massless_droplet_destroyer
60 :
61 : integer :: micro_mg_version = 1 ! Version number for MG.
62 : integer :: micro_mg_sub_version = 0 ! Second part of version number.
63 :
64 : real(r8) :: micro_mg_dcs = -1._r8
65 : real(r8), target, allocatable :: trop_levs(:)
66 :
67 : logical :: microp_uniform = .false.
68 : logical :: micro_mg_adjust_cpt = .false.
69 :
70 : logical :: micro_do_massless_droplet_destroyer ! turn on/off destruction of massless droplets
71 :
72 : character(len=16) :: micro_mg_precip_frac_method = 'max_overlap' ! type of precipitation fraction method
73 :
74 : real(r8), parameter :: unset_r8 = huge(1.0_r8)
75 :
76 : ! Tunable namelist parameters (set in atm_in)
77 : real(r8) :: micro_mg_berg_eff_factor = unset_r8 ! berg efficiency factor
78 : real(r8) :: micro_mg_accre_enhan_fact = unset_r8 ! accretion enhancment factor
79 : real(r8) :: micro_mg_autocon_fact = unset_r8 ! autoconversion prefactor
80 : real(r8) :: micro_mg_autocon_nd_exp = unset_r8 ! autoconversion nd exponent
81 : real(r8) :: micro_mg_autocon_lwp_exp = unset_r8 ! autoconversion lwp exponent
82 : real(r8) :: micro_mg_homog_size = unset_r8 ! size of freezing homogeneous ice
83 : real(r8) :: micro_mg_vtrmi_factor = unset_r8 ! ice fall speed factor
84 : real(r8) :: micro_mg_vtrms_factor = unset_r8 ! snow fall speed factor
85 : real(r8) :: micro_mg_effi_factor = unset_r8 ! ice effective radius factor
86 : real(r8) :: micro_mg_iaccr_factor = unset_r8 ! ice accretion of cloud droplet
87 : real(r8) :: micro_mg_max_nicons = unset_r8 ! max allowed ice number concentration
88 :
89 :
90 : logical, public :: do_cldliq ! Prognose cldliq flag
91 : logical, public :: do_cldice ! Prognose cldice flag
92 :
93 : integer :: num_steps ! Number of MG substeps
94 :
95 : integer :: ncnst = 4 ! Number of constituents
96 :
97 : ! Namelist variables for option to specify constant cloud droplet/ice number
98 : logical :: micro_mg_nccons = .false. ! set .true. to specify constant cloud droplet number
99 : logical :: micro_mg_nicons = .false. ! set .true. to specify constant cloud ice number
100 : logical :: micro_mg_ngcons = .false. ! set .true. to specify constant graupel/hail number
101 : logical :: micro_mg_nrcons = .false. ! set .true. to specify constant rain number
102 : logical :: micro_mg_nscons = .false. ! set .true. to specify constant snow number
103 :
104 : ! parameters for specified ice and droplet number concentration
105 : ! note: these are local in-cloud values, not grid-mean
106 : real(r8) :: micro_mg_ncnst = 50.e6_r8 ! constant liquid droplet num concentration (m-3)
107 : real(r8) :: micro_mg_ninst = 0.05e6_r8 ! ice num concentration when nicons=.true. (m-3)
108 : real(r8) :: micro_mg_nrnst = 0.2e6_r8 ! rain num concentration when nrcons=.true. (m-3)
109 : real(r8) :: micro_mg_nsnst = 0.005e6_r8 ! snow num concentration when nscons=.true. (m-3)
110 : real(r8) :: micro_mg_ngnst = 0.0005e6_r8 ! graupel/hail num concentration when ngcons=.true. (m-3)
111 :
112 : logical, public :: micro_mg_do_graupel
113 : logical, public :: micro_mg_do_hail
114 :
115 : ! switches for IFS like behavior
116 : logical :: micro_mg_evap_sed_off = .false. ! Turn off evaporation/sublimation based on cloud fraction for sedimenting condensate
117 : logical :: micro_mg_icenuc_rh_off = .false. ! Remove RH conditional from ice nucleation
118 : logical :: micro_mg_icenuc_use_meyers = .false. ! Meyers Ice Nucleation
119 : logical :: micro_mg_evap_scl_ifs = .false. ! Scale evaporation as IFS does
120 : logical :: micro_mg_evap_rhthrsh_ifs = .false. ! Evap RH threhold following IFS
121 : logical :: micro_mg_rainfreeze_ifs = .false. ! Rain freezing at 0C following IFS
122 : logical :: micro_mg_ifs_sed = .false. ! Snow sedimentation = 1 m/s following IFS
123 : logical :: micro_mg_precip_fall_corr = .false. ! Precip fall speed following IFS (does not go to zero)
124 :
125 : logical :: micro_mg_implicit_fall = .false. !Implicit fall speed (sedimentation) for hydrometeors
126 :
127 : logical :: micro_mg_accre_sees_auto = .false. !Accretion sees autoconverted rain
128 :
129 : character(len=10), parameter :: & ! Constituent names
130 : cnst_names(10) = (/'CLDLIQ', 'CLDICE','NUMLIQ','NUMICE', &
131 : 'RAINQM', 'SNOWQM','NUMRAI','NUMSNO','GRAUQM','NUMGRA'/)
132 :
133 : integer :: &
134 : ixq = -1, &! water vapor
135 : ixcldliq = -1, &! cloud liquid amount index
136 : ixcldice = -1, &! cloud ice amount index
137 : ixnumliq = -1, &! cloud liquid number index
138 : ixnumice = -1, &! cloud ice water index
139 : ixrain = -1, &! rain index
140 : ixsnow = -1, &! snow index
141 : ixnumrain = -1, &! rain number index
142 : ixnumsnow = -1, &! snow number index
143 : ixgraupel = -1, &! graupel index
144 : ixnumgraupel = -1 ! graupel number index
145 :
146 : ! Physics buffer indices for fields registered by this module
147 : integer :: &
148 : cldo_idx, &
149 : qme_idx, &
150 : prain_idx, &
151 : nevapr_idx, &
152 : wsedl_idx, &
153 : rei_idx, &
154 : sadice_idx, &
155 : sadsnow_idx, &
156 : rel_idx, &
157 : dei_idx, &
158 : mu_idx, &
159 : prer_evap_idx, &
160 : lambdac_idx, &
161 : iciwpst_idx, &
162 : iclwpst_idx, &
163 : des_idx, &
164 : icswp_idx, &
165 : cldfsnow_idx, &
166 : degrau_idx = -1, &
167 : icgrauwp_idx = -1, &
168 : cldfgrau_idx = -1, &
169 : rate1_cw2pr_st_idx = -1, &
170 : ls_flxprc_idx, &
171 : ls_flxsnw_idx, &
172 : relvar_idx, &
173 : cmeliq_idx, &
174 : accre_enhan_idx
175 :
176 : ! Fields for UNICON
177 : integer :: &
178 : am_evp_st_idx, &! Evaporation area of stratiform precipitation
179 : evprain_st_idx, &! Evaporation rate of stratiform rain [kg/kg/s]. >= 0.
180 : evpsnow_st_idx ! Evaporation rate of stratiform snow [kg/kg/s]. >= 0.
181 :
182 : ! Fields needed as inputs to COSP
183 : integer :: &
184 : ls_mrprc_idx, ls_mrsnw_idx, &
185 : ls_reffrain_idx, ls_reffsnow_idx, &
186 : cv_reffliq_idx, cv_reffice_idx
187 :
188 : ! Fields needed by Park macrophysics
189 : integer :: &
190 : cc_t_idx, cc_qv_idx, &
191 : cc_ql_idx, cc_qi_idx, &
192 : cc_nl_idx, cc_ni_idx, &
193 : cc_qlst_idx
194 :
195 : ! Used to replace aspects of MG microphysics
196 : ! (e.g. by CARMA)
197 : integer :: &
198 : tnd_qsnow_idx = -1, &
199 : tnd_nsnow_idx = -1, &
200 : re_ice_idx = -1
201 :
202 : ! Index fields for precipitation efficiency.
203 : integer :: &
204 : acpr_idx = -1, &
205 : acgcme_idx = -1, &
206 : acnum_idx = -1
207 :
208 : ! Physics buffer indices for fields registered by other modules
209 : integer :: &
210 : ast_idx = -1, &
211 : cld_idx = -1, &
212 : concld_idx = -1, &
213 : prec_dp_idx = -1, &
214 : prec_sh_idx = -1, &
215 : qsatfac_idx = -1
216 :
217 : ! Pbuf fields needed for subcol_SILHS
218 : integer :: &
219 : qrain_idx=-1, qsnow_idx=-1, &
220 : nrain_idx=-1, nsnow_idx=-1, &
221 : qcsedten_idx=-1, qrsedten_idx=-1, &
222 : qisedten_idx=-1, qssedten_idx=-1, &
223 : vtrmc_idx=-1, umr_idx=-1, &
224 : vtrmi_idx=-1, ums_idx=-1, &
225 : qcsevap_idx=-1, qisevap_idx=-1
226 :
227 : integer :: &
228 : naai_idx = -1, &
229 : naai_hom_idx = -1, &
230 : npccn_idx = -1, &
231 : rndst_idx = -1, &
232 : nacon_idx = -1, &
233 : prec_str_idx = -1, &
234 : snow_str_idx = -1, &
235 : prec_pcw_idx = -1, &
236 : snow_pcw_idx = -1, &
237 : prec_sed_idx = -1, &
238 : snow_sed_idx = -1
239 :
240 : ! pbuf fields for heterogeneous freezing
241 : integer :: &
242 : frzimm_idx = -1, &
243 : frzcnt_idx = -1, &
244 : frzdep_idx = -1
245 :
246 : logical :: allow_sed_supersat ! allow supersaturated conditions after sedimentation loop
247 : character(len=16) :: micro_mg_warm_rain= 'kk2000' ! 'tau', 'emulated', 'sb2001' and ' kk2000'
248 :
249 : integer :: bergso_idx = -1
250 :
251 : !===============================================================================
252 : contains
253 : !===============================================================================
254 :
255 2304 : subroutine micro_pumas_cam_readnl(nlfile)
256 :
257 : use namelist_utils, only: find_group_name
258 : use units, only: getunit, freeunit
259 : use spmd_utils, only: mpicom, mstrid=>masterprocid, mpi_integer, mpi_real8, &
260 : mpi_logical, mpi_character
261 :
262 : use stochastic_emulated_cam, only: stochastic_emulated_readnl
263 : use stochastic_tau_cam, only: stochastic_tau_readnl
264 :
265 : character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input
266 :
267 : ! Namelist variables
268 : logical :: micro_mg_do_cldice = .true. ! do_cldice = .true., MG microphysics is prognosing cldice
269 : logical :: micro_mg_do_cldliq = .true. ! do_cldliq = .true., MG microphysics is prognosing cldliq
270 : integer :: micro_mg_num_steps = 1 ! Number of substepping iterations done by MG (1.5 only for now).
271 :
272 :
273 : ! Local variables
274 : integer :: unitn, ierr
275 : character(len=*), parameter :: sub = 'micro_pumas_cam_readnl'
276 :
277 : namelist /micro_mg_nl/ micro_mg_version, micro_mg_sub_version, &
278 : micro_mg_do_cldice, micro_mg_do_cldliq, micro_mg_num_steps, &
279 : microp_uniform, micro_mg_dcs, micro_mg_precip_frac_method, &
280 : micro_mg_berg_eff_factor, micro_mg_warm_rain, micro_mg_adjust_cpt, &
281 : micro_mg_do_hail, micro_mg_do_graupel, micro_mg_ngcons, micro_mg_ngnst, &
282 : micro_mg_vtrmi_factor, micro_mg_vtrms_factor, micro_mg_effi_factor, &
283 : micro_mg_iaccr_factor, micro_mg_max_nicons, micro_mg_accre_enhan_fact, &
284 : micro_mg_autocon_fact, micro_mg_autocon_nd_exp, micro_mg_autocon_lwp_exp, micro_mg_homog_size, &
285 : micro_mg_nccons, micro_mg_nicons, micro_mg_ncnst, micro_mg_ninst, &
286 : micro_mg_nrcons, micro_mg_nscons, micro_mg_nrnst, micro_mg_nsnst, &
287 : micro_do_massless_droplet_destroyer, &
288 : micro_mg_evap_sed_off, micro_mg_icenuc_rh_off, micro_mg_icenuc_use_meyers, &
289 : micro_mg_evap_scl_ifs, micro_mg_evap_rhthrsh_ifs, &
290 : micro_mg_rainfreeze_ifs, micro_mg_ifs_sed, micro_mg_precip_fall_corr, &
291 : micro_mg_accre_sees_auto, micro_mg_implicit_fall
292 :
293 : !-----------------------------------------------------------------------------
294 :
295 2304 : if (masterproc) then
296 3 : unitn = getunit()
297 3 : open( unitn, file=trim(nlfile), status='old' )
298 3 : call find_group_name(unitn, 'micro_mg_nl', status=ierr)
299 3 : if (ierr == 0) then
300 3 : read(unitn, micro_mg_nl, iostat=ierr)
301 3 : if (ierr /= 0) then
302 0 : call endrun(sub // ':: ERROR reading namelist')
303 : end if
304 : end if
305 3 : close(unitn)
306 3 : call freeunit(unitn)
307 :
308 : ! set local variables
309 3 : do_cldice = micro_mg_do_cldice
310 3 : do_cldliq = micro_mg_do_cldliq
311 3 : num_steps = micro_mg_num_steps
312 :
313 : ! Verify that version numbers are valid.
314 0 : select case (micro_mg_version)
315 : case (2)
316 3 : select case (micro_mg_sub_version)
317 : case(0)
318 : ! MG version 2.0
319 : case default
320 0 : call bad_version_endrun()
321 : end select
322 : case (3)
323 0 : select case (micro_mg_sub_version)
324 : case(0)
325 : ! MG version 3.0
326 : case default
327 3 : call bad_version_endrun()
328 : end select
329 : case default
330 3 : call bad_version_endrun()
331 : end select
332 :
333 3 : if (micro_mg_dcs < 0._r8) call endrun( "micro_pumas_cam_readnl: &
334 0 : µ_mg_dcs has not been set to a valid value.")
335 :
336 3 : if (micro_mg_version < 3) then
337 :
338 0 : if(micro_mg_do_graupel .or. micro_mg_do_hail ) then
339 : call endrun ("micro_pumas_cam_readnl: Micro_mg_do_graupel and micro_mg_do_hail &
340 0 : &must be false for MG versions before MG3.")
341 : end if
342 :
343 : else ! micro_mg_version = 3 or greater
344 :
345 3 : if(micro_mg_do_graupel .and. micro_mg_do_hail ) then
346 : call endrun ("micro_pumas_cam_readnl: Only one of micro_mg_do_graupel or &
347 0 : µ_mg_do_hail may be true at a time.")
348 : end if
349 :
350 : end if
351 :
352 : end if
353 :
354 : ! Broadcast namelist variables
355 2304 : call mpi_bcast(micro_mg_version, 1, mpi_integer, mstrid, mpicom, ierr)
356 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_version")
357 :
358 2304 : call mpi_bcast(micro_mg_sub_version, 1, mpi_integer, mstrid, mpicom, ierr)
359 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_sub_version")
360 :
361 2304 : call mpi_bcast(do_cldice, 1, mpi_logical, mstrid, mpicom, ierr)
362 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: do_cldice")
363 :
364 2304 : call mpi_bcast(do_cldliq, 1, mpi_logical, mstrid, mpicom, ierr)
365 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: do_cldliq")
366 :
367 2304 : call mpi_bcast(num_steps, 1, mpi_integer, mstrid, mpicom, ierr)
368 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: num_steps")
369 :
370 2304 : call mpi_bcast(microp_uniform, 1, mpi_logical, mstrid, mpicom, ierr)
371 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: microp_uniform")
372 :
373 2304 : call mpi_bcast(micro_mg_dcs, 1, mpi_real8, mstrid, mpicom, ierr)
374 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_dcs")
375 :
376 2304 : call mpi_bcast(micro_mg_berg_eff_factor, 1, mpi_real8, mstrid, mpicom, ierr)
377 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_berg_eff_factor")
378 :
379 2304 : call mpi_bcast(micro_mg_accre_enhan_fact, 1, mpi_real8, mstrid, mpicom, ierr)
380 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_accre_enhan_fact")
381 :
382 2304 : call mpi_bcast(micro_mg_autocon_fact, 1, mpi_real8, mstrid, mpicom, ierr)
383 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_autocon_fact")
384 :
385 2304 : call mpi_bcast(micro_mg_autocon_nd_exp, 1, mpi_real8, mstrid, mpicom, ierr)
386 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_autocon_nd_exp")
387 :
388 2304 : call mpi_bcast(micro_mg_autocon_lwp_exp, 1, mpi_real8, mstrid, mpicom, ierr)
389 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_autocon_lwp_exp")
390 :
391 2304 : call mpi_bcast(micro_mg_homog_size, 1, mpi_real8, mstrid, mpicom, ierr)
392 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_homog_size")
393 :
394 2304 : call mpi_bcast(micro_mg_vtrmi_factor, 1, mpi_real8, mstrid, mpicom, ierr)
395 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_vtrmi_factor")
396 :
397 2304 : call mpi_bcast(micro_mg_vtrms_factor, 1, mpi_real8, mstrid, mpicom, ierr)
398 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_vtrms_factor")
399 :
400 2304 : call mpi_bcast(micro_mg_effi_factor, 1, mpi_real8, mstrid, mpicom, ierr)
401 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_effi_factor")
402 :
403 2304 : call mpi_bcast(micro_mg_iaccr_factor, 1, mpi_real8, mstrid, mpicom, ierr)
404 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_iaccr_factor")
405 :
406 2304 : call mpi_bcast(micro_mg_max_nicons, 1, mpi_real8, mstrid, mpicom, ierr)
407 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_max_nicons")
408 :
409 2304 : call mpi_bcast(micro_mg_precip_frac_method, 16, mpi_character, mstrid, mpicom, ierr)
410 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_precip_frac_method")
411 :
412 2304 : call mpi_bcast(micro_mg_warm_rain, 16, mpi_character, mstrid, mpicom, ierr)
413 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_warm_rain")
414 :
415 2304 : call mpi_bcast(micro_mg_adjust_cpt, 1, mpi_logical, mstrid, mpicom, ierr)
416 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_adjust_cpt")
417 :
418 2304 : call mpi_bcast(micro_mg_nccons, 1, mpi_logical, mstrid, mpicom, ierr)
419 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nccons")
420 :
421 2304 : call mpi_bcast(micro_mg_nicons, 1, mpi_logical, mstrid, mpicom, ierr)
422 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nicons")
423 :
424 2304 : call mpi_bcast(micro_mg_nrcons, 1, mpi_logical, mstrid, mpicom, ierr)
425 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nrcons")
426 :
427 2304 : call mpi_bcast(micro_mg_nscons, 1, mpi_logical, mstrid, mpicom, ierr)
428 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nscons")
429 :
430 2304 : call mpi_bcast(micro_mg_ncnst, 1, mpi_real8, mstrid, mpicom, ierr)
431 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ncnst")
432 :
433 2304 : call mpi_bcast(micro_mg_ninst, 1, mpi_real8, mstrid, mpicom, ierr)
434 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ninst")
435 :
436 2304 : call mpi_bcast(micro_mg_nrnst, 1, mpi_real8, mstrid, mpicom, ierr)
437 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nrnst")
438 :
439 2304 : call mpi_bcast(micro_mg_nsnst, 1, mpi_real8, mstrid, mpicom, ierr)
440 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nsnst")
441 :
442 2304 : call mpi_bcast(micro_mg_do_hail, 1, mpi_logical, mstrid, mpicom, ierr)
443 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_do_hail")
444 :
445 2304 : call mpi_bcast(micro_mg_do_graupel, 1, mpi_logical, mstrid, mpicom, ierr)
446 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_do_graupel")
447 :
448 2304 : call mpi_bcast(micro_mg_ngcons, 1, mpi_logical, mstrid, mpicom, ierr)
449 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ngcons")
450 :
451 2304 : call mpi_bcast(micro_mg_ngnst, 1, mpi_real8, mstrid, mpicom, ierr)
452 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ngnst")
453 :
454 2304 : call mpi_bcast(micro_do_massless_droplet_destroyer, 1, mpi_logical, mstrid, mpicom, ierr)
455 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_do_massless_droplet_destroyer")
456 :
457 2304 : call mpi_bcast(micro_mg_evap_sed_off, 1, mpi_logical, mstrid, mpicom, ierr)
458 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_evap_sed_off")
459 :
460 2304 : call mpi_bcast(micro_mg_icenuc_rh_off, 1, mpi_logical, mstrid, mpicom, ierr)
461 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_icenuc_rh_off")
462 :
463 2304 : call mpi_bcast(micro_mg_icenuc_use_meyers, 1, mpi_logical, mstrid, mpicom, ierr)
464 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_icenuc_use_meyers")
465 :
466 2304 : call mpi_bcast(micro_mg_evap_scl_ifs, 1, mpi_logical, mstrid, mpicom, ierr)
467 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_evap_scl_ifs")
468 :
469 2304 : call mpi_bcast(micro_mg_evap_rhthrsh_ifs, 1, mpi_logical, mstrid, mpicom, ierr)
470 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_evap_rhthrsh_ifs")
471 :
472 2304 : call mpi_bcast(micro_mg_rainfreeze_ifs, 1, mpi_logical, mstrid, mpicom, ierr)
473 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_rainfreeze_ifs")
474 :
475 2304 : call mpi_bcast(micro_mg_ifs_sed, 1, mpi_logical, mstrid, mpicom, ierr)
476 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ifs_sed")
477 :
478 2304 : call mpi_bcast(micro_mg_precip_fall_corr, 1, mpi_logical, mstrid, mpicom, ierr)
479 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_precip_fall_corr")
480 :
481 2304 : call mpi_bcast(micro_mg_implicit_fall, 1, mpi_logical, mstrid, mpicom, ierr)
482 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_implicit_fall")
483 :
484 2304 : call mpi_bcast(micro_mg_accre_sees_auto, 1, mpi_logical, mstrid, mpicom, ierr)
485 2304 : if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_accre_sees_auto")
486 :
487 2304 : if(micro_mg_berg_eff_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_berg_eff_factor is not set")
488 2304 : if(micro_mg_accre_enhan_fact == unset_r8) call endrun(sub//": FATAL: micro_mg_accre_enhan_fact is not set")
489 2304 : if(micro_mg_autocon_fact == unset_r8) call endrun(sub//": FATAL: micro_mg_autocon_fact is not set")
490 2304 : if(micro_mg_autocon_nd_exp == unset_r8) call endrun(sub//": FATAL: micro_mg_autocon_nd_exp is not set")
491 2304 : if(micro_mg_autocon_lwp_exp == unset_r8) call endrun(sub//": FATAL: micro_mg_autocon_lwp_exp is not set")
492 2304 : if(micro_mg_homog_size == unset_r8) call endrun(sub//": FATAL: micro_mg_homog_size is not set")
493 2304 : if(micro_mg_vtrmi_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_vtrmi_factor is not set")
494 2304 : if(micro_mg_vtrms_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_vtrms_factor is not set")
495 2304 : if(micro_mg_effi_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_effi_factor is not set")
496 2304 : if(micro_mg_iaccr_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_iaccr_factor is not set")
497 2304 : if(micro_mg_max_nicons == unset_r8) call endrun(sub//": FATAL: micro_mg_max_nicons is not set")
498 :
499 2304 : if (masterproc) then
500 :
501 3 : write(iulog,*) 'MG microphysics namelist:'
502 3 : write(iulog,*) ' micro_mg_version = ', micro_mg_version
503 3 : write(iulog,*) ' micro_mg_sub_version = ', micro_mg_sub_version
504 3 : write(iulog,*) ' micro_mg_do_cldice = ', do_cldice
505 3 : write(iulog,*) ' micro_mg_do_cldliq = ', do_cldliq
506 3 : write(iulog,*) ' micro_mg_num_steps = ', num_steps
507 3 : write(iulog,*) ' microp_uniform = ', microp_uniform
508 3 : write(iulog,*) ' micro_mg_dcs = ', micro_mg_dcs
509 3 : write(iulog,*) ' micro_mg_berg_eff_factor = ', micro_mg_berg_eff_factor
510 3 : write(iulog,*) ' micro_mg_accre_enhan_fact = ', micro_mg_accre_enhan_fact
511 3 : write(iulog,*) ' micro_mg_autocon_fact = ' , micro_mg_autocon_fact
512 3 : write(iulog,*) ' micro_mg_autocon_nd_exp = ' , micro_mg_autocon_nd_exp
513 3 : write(iulog,*) ' micro_mg_autocon_lwp_exp = ' , micro_mg_autocon_lwp_exp
514 3 : write(iulog,*) ' micro_mg_homog_size = ', micro_mg_homog_size
515 3 : write(iulog,*) ' micro_mg_vtrmi_factor = ', micro_mg_vtrmi_factor
516 3 : write(iulog,*) ' micro_mg_vtrms_factor = ', micro_mg_vtrms_factor
517 3 : write(iulog,*) ' micro_mg_effi_factor = ', micro_mg_effi_factor
518 3 : write(iulog,*) ' micro_mg_iaccr_factor = ', micro_mg_iaccr_factor
519 3 : write(iulog,*) ' micro_mg_max_nicons = ', micro_mg_max_nicons
520 3 : write(iulog,*) ' micro_mg_precip_frac_method = ', micro_mg_precip_frac_method
521 3 : write(iulog,*) ' micro_mg_warm_rain = ', micro_mg_warm_rain
522 3 : write(iulog,*) ' micro_mg_adjust_cpt = ', micro_mg_adjust_cpt
523 3 : write(iulog,*) ' micro_mg_nccons = ', micro_mg_nccons
524 3 : write(iulog,*) ' micro_mg_nicons = ', micro_mg_nicons
525 3 : write(iulog,*) ' micro_mg_ncnst = ', micro_mg_ncnst
526 3 : write(iulog,*) ' micro_mg_ninst = ', micro_mg_ninst
527 3 : write(iulog,*) ' micro_mg_ngcons = ', micro_mg_ngcons
528 3 : write(iulog,*) ' micro_mg_ngnst = ', micro_mg_ngnst
529 3 : write(iulog,*) ' micro_mg_do_hail = ', micro_mg_do_hail
530 3 : write(iulog,*) ' micro_mg_do_graupel = ', micro_mg_do_graupel
531 3 : write(iulog,*) ' micro_do_massless_droplet_destroyer = ', micro_do_massless_droplet_destroyer
532 3 : write(iulog,*) ' micro_mg_nrcons = ', micro_mg_nrcons
533 3 : write(iulog,*) ' micro_mg_nscons = ', micro_mg_nscons
534 3 : write(iulog,*) ' micro_mg_nrnst = ', micro_mg_nrnst
535 3 : write(iulog,*) ' micro_mg_nsnst = ', micro_mg_nsnst
536 3 : write(iulog,*) ' micro_mg_evap_sed_off = ', micro_mg_evap_sed_off
537 3 : write(iulog,*) ' micro_mg_icenuc_rh_off = ', micro_mg_icenuc_rh_off
538 3 : write(iulog,*) ' micro_mg_icenuc_use_meyers = ', micro_mg_icenuc_use_meyers
539 3 : write(iulog,*) ' micro_mg_evap_scl_ifs = ', micro_mg_evap_scl_ifs
540 3 : write(iulog,*) ' micro_mg_evap_rhthrsh_ifs = ', micro_mg_evap_rhthrsh_ifs
541 3 : write(iulog,*) ' micro_mg_rainfreeze_ifs = ', micro_mg_rainfreeze_ifs
542 3 : write(iulog,*) ' micro_mg_ifs_sed = ', micro_mg_ifs_sed
543 3 : write(iulog,*) ' micro_mg_precip_fall_corr = ', micro_mg_precip_fall_corr
544 3 : write(iulog,*) ' micro_mg_implicit_fall = ', micro_mg_implicit_fall
545 3 : write(iulog,*) ' micro_mg_accre_sees_auto = ', micro_mg_accre_sees_auto
546 : end if
547 :
548 : ! Read in the emulated or tau namelist if needed
549 4608 : if( trim(micro_mg_warm_rain) == 'emulated') then
550 0 : call stochastic_emulated_readnl(nlfile)
551 2304 : else if (trim(micro_mg_warm_rain) == 'tau') then
552 0 : call stochastic_tau_readnl(nlfile)
553 : end if
554 :
555 : contains
556 :
557 0 : subroutine bad_version_endrun
558 : ! Endrun wrapper with a more useful error message.
559 : character(len=128) :: errstring
560 0 : write(errstring,*) "Invalid version number specified for MG microphysics: ", &
561 0 : micro_mg_version,".",micro_mg_sub_version
562 0 : call endrun(errstring)
563 2304 : end subroutine bad_version_endrun
564 :
565 : end subroutine micro_pumas_cam_readnl
566 :
567 : !================================================================================================
568 :
569 2304 : subroutine micro_pumas_cam_register
570 : use cam_history_support, only: add_vert_coord, hist_dimension_values
571 : use cam_abortutils, only: handle_allocate_error
572 : use carma_flags_mod, only: carma_model
573 :
574 : ! Register microphysics constituents and fields in the physics buffer.
575 : !-----------------------------------------------------------------------
576 :
577 : logical :: prog_modal_aero
578 : logical :: use_subcol_microp ! If true, then are using subcolumns in microphysics
579 : logical :: found
580 :
581 : integer :: i, ierr
582 : real(r8) :: all_levs(pver)
583 :
584 6912 : allocate(trop_levs(pver-top_lev+1), stat=ierr)
585 2304 : call handle_allocate_error(ierr, 'micro_pumas_cam_register', 'trop_levs')
586 :
587 : call phys_getopts(use_subcol_microp_out = use_subcol_microp, &
588 2304 : prog_modal_aero_out = prog_modal_aero)
589 :
590 : ! Register microphysics constituents and save indices.
591 :
592 : call cnst_add(cnst_names(1), mwh2o, cpair, 0._r8, ixcldliq, &
593 2304 : longname='Grid box averaged cloud liquid amount', is_convtran1=.true.)
594 : call cnst_add(cnst_names(2), mwh2o, cpair, 0._r8, ixcldice, &
595 2304 : longname='Grid box averaged cloud ice amount', is_convtran1=.true.)
596 :
597 : call cnst_add(cnst_names(3), mwh2o, cpair, 0._r8, ixnumliq, &
598 : ndropmixed=prog_modal_aero.or.carma_model(:10)=='trop_strat', &
599 2304 : longname='Grid box averaged cloud liquid number', is_convtran1=.true.)
600 : call cnst_add(cnst_names(4), mwh2o, cpair, 0._r8, ixnumice, &
601 2304 : longname='Grid box averaged cloud ice number', is_convtran1=.true.)
602 :
603 : ! Add history coordinate for DDT nlev
604 2304 : call hist_dimension_values('lev',all_levs, 1, pver, found)
605 :
606 2304 : if (found) then
607 195840 : trop_levs(1:pver-top_lev+1) = all_levs(top_lev:pver)
608 : call add_vert_coord('trop_cld_lev', pver-top_lev+1, &
609 : 'troposphere hybrid level at midpoints (1000*(A+B))', 'hPa', trop_levs, &
610 2304 : positive='down' )
611 : else
612 0 : call endrun( "micro_pumas_cam_register: unable to find dimension field 'lev'")
613 : end if
614 :
615 :
616 : ! ---- Note is_convtran1 is set to .true.
617 : call cnst_add(cnst_names(5), mwh2o, cpair, 0._r8, ixrain, &
618 2304 : longname='Grid box averaged rain amount', is_convtran1=.true.)
619 : call cnst_add(cnst_names(6), mwh2o, cpair, 0._r8, ixsnow, &
620 2304 : longname='Grid box averaged snow amount', is_convtran1=.true.)
621 : call cnst_add(cnst_names(7), mwh2o, cpair, 0._r8, ixnumrain, &
622 2304 : longname='Grid box averaged rain number', is_convtran1=.true.)
623 : call cnst_add(cnst_names(8), mwh2o, cpair, 0._r8, ixnumsnow, &
624 2304 : longname='Grid box averaged snow number', is_convtran1=.true.)
625 :
626 2304 : if (micro_mg_version > 2) then
627 : call cnst_add(cnst_names(9), mwh2o, cpair, 0._r8, ixgraupel, &
628 2304 : longname='Grid box averaged graupel/hail amount', is_convtran1=.true.)
629 : call cnst_add(cnst_names(10), mwh2o, cpair, 0._r8, ixnumgraupel, &
630 2304 : longname='Grid box averaged graupel/hail number', is_convtran1=.true.)
631 : end if
632 :
633 : ! Request physics buffer space for fields that persist across timesteps.
634 :
635 9216 : call pbuf_add_field('CLDO','global',dtype_r8,(/pcols,pver,dyn_time_lvls/), cldo_idx)
636 :
637 : ! Physics buffer variables for convective cloud properties.
638 :
639 2304 : call pbuf_add_field('QME', 'physpkg',dtype_r8,(/pcols,pver/), qme_idx)
640 2304 : call pbuf_add_field('PRAIN', 'physpkg',dtype_r8,(/pcols,pver/), prain_idx)
641 2304 : call pbuf_add_field('NEVAPR', 'physpkg',dtype_r8,(/pcols,pver/), nevapr_idx)
642 2304 : call pbuf_add_field('PRER_EVAP', 'global', dtype_r8,(/pcols,pver/), prer_evap_idx)
643 2304 : call pbuf_add_field('BERGSO', 'physpkg',dtype_r8,(/pcols,pver/), bergso_idx)
644 :
645 2304 : call pbuf_add_field('WSEDL', 'physpkg',dtype_r8,(/pcols,pver/), wsedl_idx)
646 :
647 2304 : call pbuf_add_field('REI', 'physpkg',dtype_r8,(/pcols,pver/), rei_idx)
648 2304 : call pbuf_add_field('SADICE', 'physpkg',dtype_r8,(/pcols,pver/), sadice_idx)
649 2304 : call pbuf_add_field('SADSNOW', 'physpkg',dtype_r8,(/pcols,pver/), sadsnow_idx)
650 2304 : call pbuf_add_field('REL', 'physpkg',dtype_r8,(/pcols,pver/), rel_idx)
651 :
652 : ! Mitchell ice effective diameter for radiation
653 2304 : call pbuf_add_field('DEI', 'physpkg',dtype_r8,(/pcols,pver/), dei_idx)
654 : ! Size distribution shape parameter for radiation
655 2304 : call pbuf_add_field('MU', 'physpkg',dtype_r8,(/pcols,pver/), mu_idx)
656 : ! Size distribution shape parameter for radiation
657 2304 : call pbuf_add_field('LAMBDAC', 'physpkg',dtype_r8,(/pcols,pver/), lambdac_idx)
658 :
659 : ! Stratiform only in cloud ice water path for radiation
660 2304 : call pbuf_add_field('ICIWPST', 'physpkg',dtype_r8,(/pcols,pver/), iciwpst_idx)
661 : ! Stratiform in cloud liquid water path for radiation
662 2304 : call pbuf_add_field('ICLWPST', 'physpkg',dtype_r8,(/pcols,pver/), iclwpst_idx)
663 :
664 : ! Snow effective diameter for radiation
665 2304 : call pbuf_add_field('DES', 'physpkg',dtype_r8,(/pcols,pver/), des_idx)
666 : ! In cloud snow water path for radiation
667 2304 : call pbuf_add_field('ICSWP', 'physpkg',dtype_r8,(/pcols,pver/), icswp_idx)
668 : ! Cloud fraction for liquid drops + snow
669 9216 : call pbuf_add_field('CLDFSNOW ', 'physpkg',dtype_r8,(/pcols,pver,dyn_time_lvls/), cldfsnow_idx)
670 :
671 2304 : if (micro_mg_version > 2) then
672 : ! Graupel effective diameter for radiation
673 2304 : call pbuf_add_field('DEGRAU', 'physpkg',dtype_r8,(/pcols,pver/), degrau_idx)
674 : ! In cloud snow water path for radiation
675 2304 : call pbuf_add_field('ICGRAUWP', 'physpkg',dtype_r8,(/pcols,pver/), icgrauwp_idx)
676 : ! Cloud fraction for liquid drops + graupel
677 2304 : call pbuf_add_field('CLDFGRAU', 'physpkg',dtype_r8,(/pcols,pver/), cldfgrau_idx)
678 : end if
679 :
680 2304 : if (prog_modal_aero) then
681 2304 : call pbuf_add_field('RATE1_CW2PR_ST','physpkg',dtype_r8,(/pcols,pver/), rate1_cw2pr_st_idx)
682 : endif
683 :
684 2304 : call pbuf_add_field('LS_FLXPRC', 'physpkg',dtype_r8,(/pcols,pverp/), ls_flxprc_idx)
685 2304 : call pbuf_add_field('LS_FLXSNW', 'physpkg',dtype_r8,(/pcols,pverp/), ls_flxsnw_idx)
686 :
687 :
688 : ! Fields needed as inputs to COSP
689 2304 : call pbuf_add_field('LS_MRPRC', 'physpkg',dtype_r8,(/pcols,pver/), ls_mrprc_idx)
690 2304 : call pbuf_add_field('LS_MRSNW', 'physpkg',dtype_r8,(/pcols,pver/), ls_mrsnw_idx)
691 2304 : call pbuf_add_field('LS_REFFRAIN','physpkg',dtype_r8,(/pcols,pver/), ls_reffrain_idx)
692 2304 : call pbuf_add_field('LS_REFFSNOW','physpkg',dtype_r8,(/pcols,pver/), ls_reffsnow_idx)
693 2304 : call pbuf_add_field('CV_REFFLIQ', 'physpkg',dtype_r8,(/pcols,pver/), cv_reffliq_idx)
694 2304 : call pbuf_add_field('CV_REFFICE', 'physpkg',dtype_r8,(/pcols,pver/), cv_reffice_idx)
695 :
696 : ! CC_* Fields needed by Park macrophysics
697 9216 : call pbuf_add_field('CC_T', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_t_idx)
698 9216 : call pbuf_add_field('CC_qv', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_qv_idx)
699 9216 : call pbuf_add_field('CC_ql', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_ql_idx)
700 9216 : call pbuf_add_field('CC_qi', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_qi_idx)
701 9216 : call pbuf_add_field('CC_nl', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_nl_idx)
702 9216 : call pbuf_add_field('CC_ni', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_ni_idx)
703 9216 : call pbuf_add_field('CC_qlst', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_qlst_idx)
704 :
705 : ! Fields for UNICON
706 2304 : call pbuf_add_field('am_evp_st', 'global', dtype_r8, (/pcols,pver/), am_evp_st_idx)
707 2304 : call pbuf_add_field('evprain_st', 'global', dtype_r8, (/pcols,pver/), evprain_st_idx)
708 2304 : call pbuf_add_field('evpsnow_st', 'global', dtype_r8, (/pcols,pver/), evpsnow_st_idx)
709 :
710 : ! Register subcolumn pbuf fields
711 2304 : if (use_subcol_microp) then
712 : ! Global pbuf fields
713 0 : call pbuf_register_subcol('CLDO', 'micro_pumas_cam_register', cldo_idx)
714 :
715 : ! CC_* Fields needed by Park macrophysics
716 0 : call pbuf_register_subcol('CC_T', 'micro_pumas_cam_register', cc_t_idx)
717 0 : call pbuf_register_subcol('CC_qv', 'micro_pumas_cam_register', cc_qv_idx)
718 0 : call pbuf_register_subcol('CC_ql', 'micro_pumas_cam_register', cc_ql_idx)
719 0 : call pbuf_register_subcol('CC_qi', 'micro_pumas_cam_register', cc_qi_idx)
720 0 : call pbuf_register_subcol('CC_nl', 'micro_pumas_cam_register', cc_nl_idx)
721 0 : call pbuf_register_subcol('CC_ni', 'micro_pumas_cam_register', cc_ni_idx)
722 0 : call pbuf_register_subcol('CC_qlst', 'micro_pumas_cam_register', cc_qlst_idx)
723 :
724 : ! Physpkg pbuf fields
725 : ! Physics buffer variables for convective cloud properties.
726 :
727 0 : call pbuf_register_subcol('QME', 'micro_pumas_cam_register', qme_idx)
728 0 : call pbuf_register_subcol('PRAIN', 'micro_pumas_cam_register', prain_idx)
729 0 : call pbuf_register_subcol('NEVAPR', 'micro_pumas_cam_register', nevapr_idx)
730 0 : call pbuf_register_subcol('PRER_EVAP', 'micro_pumas_cam_register', prer_evap_idx)
731 0 : call pbuf_register_subcol('BERGSO', 'micro_pumas_cam_register', bergso_idx)
732 :
733 0 : call pbuf_register_subcol('WSEDL', 'micro_pumas_cam_register', wsedl_idx)
734 :
735 0 : call pbuf_register_subcol('REI', 'micro_pumas_cam_register', rei_idx)
736 0 : call pbuf_register_subcol('SADICE', 'micro_pumas_cam_register', sadice_idx)
737 0 : call pbuf_register_subcol('SADSNOW', 'micro_pumas_cam_register', sadsnow_idx)
738 0 : call pbuf_register_subcol('REL', 'micro_pumas_cam_register', rel_idx)
739 :
740 : ! Mitchell ice effective diameter for radiation
741 0 : call pbuf_register_subcol('DEI', 'micro_pumas_cam_register', dei_idx)
742 : ! Size distribution shape parameter for radiation
743 0 : call pbuf_register_subcol('MU', 'micro_pumas_cam_register', mu_idx)
744 : ! Size distribution shape parameter for radiation
745 0 : call pbuf_register_subcol('LAMBDAC', 'micro_pumas_cam_register', lambdac_idx)
746 :
747 : ! Stratiform only in cloud ice water path for radiation
748 0 : call pbuf_register_subcol('ICIWPST', 'micro_pumas_cam_register', iciwpst_idx)
749 : ! Stratiform in cloud liquid water path for radiation
750 0 : call pbuf_register_subcol('ICLWPST', 'micro_pumas_cam_register', iclwpst_idx)
751 :
752 : ! Snow effective diameter for radiation
753 0 : call pbuf_register_subcol('DES', 'micro_pumas_cam_register', des_idx)
754 : ! In cloud snow water path for radiation
755 0 : call pbuf_register_subcol('ICSWP', 'micro_pumas_cam_register', icswp_idx)
756 : ! Cloud fraction for liquid drops + snow
757 0 : call pbuf_register_subcol('CLDFSNOW ', 'micro_pumas_cam_register', cldfsnow_idx)
758 :
759 0 : if (micro_mg_version > 2) then
760 : ! Graupel effective diameter for radiation
761 0 : call pbuf_register_subcol('DEGRAU', 'micro_pumas_cam_register', degrau_idx)
762 : ! In cloud snow water path for radiation
763 0 : call pbuf_register_subcol('ICGRAUWP', 'micro_pumas_cam_register', icgrauwp_idx)
764 : ! Cloud fraction for liquid drops + snow
765 0 : call pbuf_register_subcol('CLDFGRAU', 'micro_pumas_cam_register', cldfgrau_idx)
766 : end if
767 :
768 0 : if (prog_modal_aero) then
769 0 : call pbuf_register_subcol('RATE1_CW2PR_ST', 'micro_pumas_cam_register', rate1_cw2pr_st_idx)
770 : end if
771 :
772 0 : call pbuf_register_subcol('LS_FLXPRC', 'micro_pumas_cam_register', ls_flxprc_idx)
773 0 : call pbuf_register_subcol('LS_FLXSNW', 'micro_pumas_cam_register', ls_flxsnw_idx)
774 :
775 : ! Fields needed as inputs to COSP
776 0 : call pbuf_register_subcol('LS_MRPRC', 'micro_pumas_cam_register', ls_mrprc_idx)
777 0 : call pbuf_register_subcol('LS_MRSNW', 'micro_pumas_cam_register', ls_mrsnw_idx)
778 0 : call pbuf_register_subcol('LS_REFFRAIN', 'micro_pumas_cam_register', ls_reffrain_idx)
779 0 : call pbuf_register_subcol('LS_REFFSNOW', 'micro_pumas_cam_register', ls_reffsnow_idx)
780 0 : call pbuf_register_subcol('CV_REFFLIQ', 'micro_pumas_cam_register', cv_reffliq_idx)
781 0 : call pbuf_register_subcol('CV_REFFICE', 'micro_pumas_cam_register', cv_reffice_idx)
782 : end if
783 :
784 : ! Additional pbuf for CARMA interface
785 2304 : if (.not. do_cldice) then
786 0 : call pbuf_add_field('TND_QSNOW', 'physpkg',dtype_r8,(/pcols,pver/), tnd_qsnow_idx)
787 0 : call pbuf_add_field('TND_NSNOW', 'physpkg',dtype_r8,(/pcols,pver/), tnd_nsnow_idx)
788 0 : call pbuf_add_field('RE_ICE', 'physpkg',dtype_r8,(/pcols,pver/), re_ice_idx)
789 : end if
790 :
791 : ! Precipitation efficiency fields across timesteps.
792 2304 : call pbuf_add_field('ACPRECL', 'global',dtype_r8,(/pcols/), acpr_idx) ! accumulated precip
793 2304 : call pbuf_add_field('ACGCME', 'global',dtype_r8,(/pcols/), acgcme_idx) ! accumulated condensation
794 2304 : call pbuf_add_field('ACNUM', 'global',dtype_i4,(/pcols/), acnum_idx) ! counter for accumulated # timesteps
795 :
796 : ! SGS variability -- These could be reset by CLUBB so they need to be grid only
797 2304 : call pbuf_add_field('RELVAR', 'global',dtype_r8,(/pcols,pver/), relvar_idx)
798 2304 : call pbuf_add_field('ACCRE_ENHAN','global',dtype_r8,(/pcols,pver/), accre_enhan_idx)
799 :
800 : ! Diagnostic fields needed for subcol_SILHS, need to be grid-only
801 2304 : if (subcol_get_scheme() == 'SILHS') then
802 0 : call pbuf_add_field('QRAIN', 'global',dtype_r8,(/pcols,pver/), qrain_idx)
803 0 : call pbuf_add_field('QSNOW', 'global',dtype_r8,(/pcols,pver/), qsnow_idx)
804 0 : call pbuf_add_field('NRAIN', 'global',dtype_r8,(/pcols,pver/), nrain_idx)
805 0 : call pbuf_add_field('NSNOW', 'global',dtype_r8,(/pcols,pver/), nsnow_idx)
806 :
807 : ! Fields for subcol_SILHS hole filling
808 : ! Note -- hole filling is on the grid, so pbuf_register_setcols do not need to be called for these pbuf fields
809 0 : call pbuf_add_field('QCSEDTEN', 'physpkg', dtype_r8, (/pcols,pver/), qcsedten_idx)
810 0 : call pbuf_add_field('QRSEDTEN', 'physpkg', dtype_r8, (/pcols,pver/), qrsedten_idx)
811 0 : call pbuf_add_field('QISEDTEN', 'physpkg', dtype_r8, (/pcols,pver/), qisedten_idx)
812 0 : call pbuf_add_field('QSSEDTEN', 'physpkg', dtype_r8, (/pcols,pver/), qssedten_idx)
813 0 : call pbuf_add_field('VTRMC', 'physpkg', dtype_r8, (/pcols,pver/), vtrmc_idx)
814 0 : call pbuf_add_field('UMR', 'physpkg', dtype_r8, (/pcols,pver/), umr_idx)
815 0 : call pbuf_add_field('VTRMI', 'physpkg', dtype_r8, (/pcols,pver/), vtrmi_idx)
816 0 : call pbuf_add_field('UMS', 'physpkg', dtype_r8, (/pcols,pver/), ums_idx)
817 0 : call pbuf_add_field('QCSEVAP', 'physpkg', dtype_r8, (/pcols,pver/), qcsevap_idx)
818 2304 : call pbuf_add_field('QISEVAP', 'physpkg', dtype_r8, (/pcols,pver/), qisevap_idx)
819 : end if
820 :
821 4608 : end subroutine micro_pumas_cam_register
822 :
823 : !===============================================================================
824 :
825 0 : function micro_pumas_cam_implements_cnst(name)
826 :
827 : ! Return true if specified constituent is implemented by the
828 : ! microphysics package
829 :
830 : character(len=*), intent(in) :: name ! constituent name
831 : logical :: micro_pumas_cam_implements_cnst ! return value
832 :
833 : !-----------------------------------------------------------------------
834 :
835 0 : micro_pumas_cam_implements_cnst = any(name == cnst_names)
836 :
837 2304 : end function micro_pumas_cam_implements_cnst
838 :
839 : !===============================================================================
840 :
841 0 : subroutine micro_pumas_cam_init_cnst(name, latvals, lonvals, mask, q)
842 :
843 : ! Initialize the microphysics constituents, if they are
844 : ! not read from the initial file.
845 :
846 : character(len=*), intent(in) :: name ! constituent name
847 : real(r8), intent(in) :: latvals(:) ! lat in degrees (ncol)
848 : real(r8), intent(in) :: lonvals(:) ! lon in degrees (ncol)
849 : logical, intent(in) :: mask(:) ! Only initialize where .true.
850 : real(r8), intent(out) :: q(:,:) ! kg tracer/kg dry air (gcol, plev
851 : !-----------------------------------------------------------------------
852 : integer :: k
853 :
854 0 : if (micro_pumas_cam_implements_cnst(name)) then
855 0 : do k = 1, size(q, 2)
856 0 : where(mask)
857 0 : q(:, k) = 0.0_r8
858 : end where
859 : end do
860 : end if
861 :
862 0 : end subroutine micro_pumas_cam_init_cnst
863 :
864 : !===============================================================================
865 :
866 2304 : subroutine micro_pumas_cam_init(pbuf2d)
867 : use time_manager, only: is_first_step
868 : use micro_pumas_utils, only: micro_pumas_utils_init
869 : use micro_pumas_v1, only: micro_mg_init3_0 => micro_pumas_init
870 : use stochastic_tau_cam, only: stochastic_tau_init_cam
871 : use stochastic_emulated_cam, only: stochastic_emulated_init_cam
872 :
873 : !-----------------------------------------------------------------------
874 : !
875 : ! Initialization for MG microphysics
876 : !
877 : !-----------------------------------------------------------------------
878 :
879 : type(physics_buffer_desc), pointer :: pbuf2d(:,:)
880 :
881 : integer :: m, mm
882 : logical :: history_amwg ! output the variables used by the AMWG diag package
883 : logical :: history_budget ! Output tendencies and state variables for CAM4
884 : ! temperature, water vapor, cloud ice and cloud
885 : ! liquid budgets.
886 : logical :: use_subcol_microp
887 : logical :: do_clubb_sgs
888 : integer :: budget_histfile ! output history file number for budget fields
889 : integer :: ierr
890 : character(128) :: errstring ! return status (non-blank for error return)
891 :
892 : character(len=cl) :: stochastic_emulated_filename_quantile, stochastic_emulated_filename_input_scale, &
893 : stochastic_emulated_filename_output_scale
894 :
895 : !-----------------------------------------------------------------------
896 :
897 : call phys_getopts(use_subcol_microp_out=use_subcol_microp, &
898 2304 : do_clubb_sgs_out =do_clubb_sgs)
899 :
900 2304 : if (do_clubb_sgs) then
901 2304 : allow_sed_supersat = .false.
902 : else
903 0 : allow_sed_supersat = .true.
904 : endif
905 :
906 2304 : if (masterproc) then
907 3 : write(iulog,"(A,I2,A,I2)") "Initializing MG version ",micro_mg_version,".",micro_mg_sub_version
908 3 : if (.not. do_cldliq) &
909 0 : write(iulog,*) "MG prognostic cloud liquid has been turned off via namelist."
910 3 : if (.not. do_cldice) &
911 0 : write(iulog,*) "MG prognostic cloud ice has been turned off via namelist."
912 3 : write(iulog,*) "Number of microphysics substeps is: ",num_steps
913 : end if
914 :
915 : ! Set constituent number for later loops.
916 2304 : if(micro_mg_version == 2) then
917 0 : ncnst = 8
918 : else
919 2304 : ncnst = 10
920 : end if
921 :
922 : ! If Machine learning is turned on, perform its initializations
923 2304 : if (trim(micro_mg_warm_rain) == 'tau') then
924 0 : call stochastic_tau_init_cam()
925 2304 : else if( trim(micro_mg_warm_rain) == 'emulated') then
926 : call stochastic_emulated_init_cam(stochastic_emulated_filename_quantile, &
927 : stochastic_emulated_filename_input_scale, &
928 0 : stochastic_emulated_filename_output_scale)
929 : end if
930 :
931 : call micro_mg_init3_0( &
932 : r8, gravit, rair, rh2o, cpair, &
933 : tmelt, latvap, latice, rhmini, &
934 : micro_mg_dcs, &
935 : micro_mg_do_hail,micro_mg_do_graupel, &
936 : microp_uniform, do_cldice, use_hetfrz_classnuc, &
937 : micro_mg_precip_frac_method, micro_mg_berg_eff_factor, &
938 : micro_mg_accre_enhan_fact , &
939 : micro_mg_autocon_fact , micro_mg_autocon_nd_exp, micro_mg_autocon_lwp_exp, micro_mg_homog_size, &
940 : micro_mg_vtrmi_factor, micro_mg_vtrms_factor, micro_mg_effi_factor, &
941 : micro_mg_iaccr_factor, micro_mg_max_nicons, &
942 : allow_sed_supersat, micro_mg_warm_rain, &
943 : micro_mg_evap_sed_off, micro_mg_icenuc_rh_off, micro_mg_icenuc_use_meyers, &
944 : micro_mg_evap_scl_ifs, micro_mg_evap_rhthrsh_ifs, &
945 : micro_mg_rainfreeze_ifs, micro_mg_ifs_sed, micro_mg_precip_fall_corr,&
946 : micro_mg_accre_sees_auto, micro_mg_implicit_fall, &
947 : micro_mg_nccons, micro_mg_nicons, micro_mg_ncnst, &
948 : micro_mg_ninst, micro_mg_ngcons, micro_mg_ngnst, &
949 : micro_mg_nrcons, micro_mg_nrnst, micro_mg_nscons, micro_mg_nsnst, &
950 : stochastic_emulated_filename_quantile, stochastic_emulated_filename_input_scale, &
951 2304 : stochastic_emulated_filename_output_scale, iulog, errstring)
952 :
953 2304 : call handle_errmsg(errstring, subname="micro_pumas_cam_init")
954 :
955 : ! Retrieve the index for water vapor
956 2304 : call cnst_get_ind('Q', ixq)
957 :
958 : ! Register history variables
959 25344 : do m = 1, ncnst
960 23040 : call cnst_get_ind(cnst_names(m), mm)
961 105984 : if ( any(mm == (/ ixcldliq, ixcldice, ixrain, ixsnow, ixgraupel /)) ) then
962 : ! mass mixing ratios
963 23040 : call addfld(cnst_name(mm), (/ 'lev' /), 'A', 'kg/kg', cnst_longname(mm), sampled_on_subcycle=.true.)
964 11520 : call addfld(sflxnam(mm), horiz_only, 'A', 'kg/m2/s', trim(cnst_name(mm))//' surface flux', sampled_on_subcycle=.true.)
965 34560 : else if ( any(mm == (/ ixnumliq, ixnumice, ixnumrain, ixnumsnow, ixnumgraupel /)) ) then
966 : ! number concentrations
967 23040 : call addfld(cnst_name(mm), (/ 'lev' /), 'A', '1/kg', cnst_longname(mm), sampled_on_subcycle=.true.)
968 11520 : call addfld(sflxnam(mm), horiz_only, 'A', '1/m2/s', trim(cnst_name(mm))//' surface flux', sampled_on_subcycle=.true.)
969 : else
970 : call endrun( "micro_pumas_cam_init: &
971 0 : &Could not call addfld for constituent with unknown units.")
972 : endif
973 : end do
974 :
975 4608 : call addfld(apcnst(ixcldliq), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixcldliq))//' after physics', sampled_on_subcycle=.true.)
976 4608 : call addfld(apcnst(ixcldice), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixcldice))//' after physics', sampled_on_subcycle=.true.)
977 4608 : call addfld(bpcnst(ixcldliq), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixcldliq))//' before physics', sampled_on_subcycle=.true.)
978 4608 : call addfld(bpcnst(ixcldice), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixcldice))//' before physics', sampled_on_subcycle=.true.)
979 :
980 4608 : call addfld(apcnst(ixrain), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixrain))//' after physics', sampled_on_subcycle=.true.)
981 4608 : call addfld(apcnst(ixsnow), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixsnow))//' after physics', sampled_on_subcycle=.true.)
982 4608 : call addfld(bpcnst(ixrain), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixrain))//' before physics', sampled_on_subcycle=.true.)
983 4608 : call addfld(bpcnst(ixsnow), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixsnow))//' before physics', sampled_on_subcycle=.true.)
984 :
985 2304 : if (micro_mg_version > 2) then
986 4608 : call addfld(apcnst(ixgraupel), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixgraupel))//' after physics', sampled_on_subcycle=.true.)
987 4608 : call addfld(bpcnst(ixgraupel), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixgraupel))//' before physics', sampled_on_subcycle=.true.)
988 : end if
989 :
990 4608 : call addfld ('CME', (/ 'lev' /), 'A', 'kg/kg/s', 'Rate of cond-evap within the cloud', sampled_on_subcycle=.true.)
991 4608 : call addfld ('PRODPREC', (/ 'lev' /), 'A', 'kg/kg/s', 'Rate of conversion of condensate to precip', sampled_on_subcycle=.true.)
992 4608 : call addfld ('EVAPPREC', (/ 'lev' /), 'A', 'kg/kg/s', 'Rate of evaporation of falling precip', sampled_on_subcycle=.true.)
993 4608 : call addfld ('EVAPSNOW', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Rate of evaporation of falling snow', sampled_on_subcycle=.true.)
994 4608 : call addfld ('HPROGCLD', (/ 'lev' /), 'A', 'W/kg' , 'Heating from prognostic clouds', sampled_on_subcycle=.true.)
995 4608 : call addfld ('FICE', (/ 'lev' /), 'A', 'fraction', 'Fractional ice content within cloud', sampled_on_subcycle=.true.)
996 4608 : call addfld ('CLDFSNOW', (/ 'lev' /), 'A', '1', 'Cloud fraction adjusted for snow', sampled_on_subcycle=.true.)
997 4608 : call addfld ('ICWMRST', (/ 'lev' /), 'A', 'kg/kg', 'Prognostic in-stratus water mixing ratio', sampled_on_subcycle=.true.)
998 4608 : call addfld ('ICIMRST', (/ 'lev' /), 'A', 'kg/kg', 'Prognostic in-stratus ice mixing ratio', sampled_on_subcycle=.true.)
999 :
1000 : ! MG microphysics diagnostics
1001 4608 : call addfld ('QCSEVAP', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Rate of evaporation of falling cloud water', sampled_on_subcycle=.true.)
1002 4608 : call addfld ('QISEVAP', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Rate of sublimation of falling cloud ice', sampled_on_subcycle=.true.)
1003 4608 : call addfld ('QVRES', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Rate of residual condensation term', sampled_on_subcycle=.true.)
1004 4608 : call addfld ('CMEIOUT', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Rate of deposition/sublimation of cloud ice',sampled_on_subcycle=.true.)
1005 4608 : call addfld ('VTRMC', (/ 'trop_cld_lev' /), 'A', 'm/s', 'Mass-weighted cloud water fallspeed', sampled_on_subcycle=.true.)
1006 4608 : call addfld ('VTRMI', (/ 'trop_cld_lev' /), 'A', 'm/s', 'Mass-weighted cloud ice fallspeed', sampled_on_subcycle=.true.)
1007 4608 : call addfld ('QCSEDTEN', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Cloud water mixing ratio tendency from sedimentation', sampled_on_subcycle=.true.)
1008 4608 : call addfld ('QISEDTEN', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Cloud ice mixing ratio tendency from sedimentation', sampled_on_subcycle=.true.)
1009 4608 : call addfld ('PRAO', (/ 'lev' /), 'A', 'kg/kg/s', 'Accretion of cloud water by rain', sampled_on_subcycle=.true.)
1010 4608 : call addfld ('PRCO', (/ 'lev' /), 'A', 'kg/kg/s', 'Autoconversion of cloud water', sampled_on_subcycle=.true.)
1011 4608 : call addfld ('MNUCCCO', (/ 'lev' /), 'A', 'kg/kg/s', 'Immersion freezing of cloud water', sampled_on_subcycle=.true.)
1012 4608 : call addfld ('MNUCCTO', (/ 'lev' /), 'A', 'kg/kg/s', 'Contact freezing of cloud water', sampled_on_subcycle=.true.)
1013 4608 : call addfld ('MNUCCDO', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Homogeneous and heterogeneous nucleation from vapor', sampled_on_subcycle=.true.)
1014 4608 : call addfld ('MNUCCDOhet', (/ 'lev' /), 'A', 'kg/kg/s', 'Heterogeneous nucleation from vapor', sampled_on_subcycle=.true.)
1015 4608 : call addfld ('MSACWIO', (/ 'lev' /), 'A', 'kg/kg/s', 'Conversion of cloud water from rime-splintering', sampled_on_subcycle=.true.)
1016 4608 : call addfld ('PSACWSO', (/ 'lev' /), 'A', 'kg/kg/s', 'Accretion of cloud water by snow', sampled_on_subcycle=.true.)
1017 4608 : call addfld ('BERGSO', (/ 'lev' /), 'A', 'kg/kg/s', 'Conversion of cloud water to snow from bergeron', sampled_on_subcycle=.true.)
1018 4608 : call addfld ('BERGO', (/ 'lev' /), 'A', 'kg/kg/s', 'Conversion of cloud water to cloud ice from bergeron',sampled_on_subcycle=.true.)
1019 4608 : call addfld ('MELTO', (/ 'lev' /), 'A', 'kg/kg/s', 'Melting of cloud ice', sampled_on_subcycle=.true.)
1020 4608 : call addfld ('MELTSTOT', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Melting of snow', sampled_on_subcycle=.true.)
1021 4608 : call addfld ('MNUDEPO', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Deposition Nucleation', sampled_on_subcycle=.true.)
1022 4608 : call addfld ('HOMOO', (/ 'lev' /), 'A', 'kg/kg/s', 'Homogeneous freezing of cloud water', sampled_on_subcycle=.true.)
1023 4608 : call addfld ('QCRESO', (/ 'lev' /), 'A', 'kg/kg/s', 'Residual condensation term for cloud water', sampled_on_subcycle=.true.)
1024 4608 : call addfld ('PRCIO', (/ 'lev' /), 'A', 'kg/kg/s', 'Autoconversion of cloud ice to snow', sampled_on_subcycle=.true.)
1025 4608 : call addfld ('PRAIO', (/ 'lev' /), 'A', 'kg/kg/s', 'Accretion of cloud ice to snow', sampled_on_subcycle=.true.)
1026 4608 : call addfld ('QIRESO', (/ 'lev' /), 'A', 'kg/kg/s', 'Residual deposition term for cloud ice', sampled_on_subcycle=.true.)
1027 4608 : call addfld ('MNUCCRO', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Heterogeneous freezing of rain to snow', sampled_on_subcycle=.true.)
1028 4608 : call addfld ('MNUCCRIO', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Heterogeneous freezing of rain to ice', sampled_on_subcycle=.true.)
1029 4608 : call addfld ('PRACSO', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Accretion of rain by snow', sampled_on_subcycle=.true.)
1030 4608 : call addfld ('VAPDEPSO', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Vapor deposition onto snow', sampled_on_subcycle=.true.)
1031 4608 : call addfld ('MELTSDT', (/ 'trop_cld_lev' /), 'A', 'W/kg', 'Latent heating rate due to melting of snow', sampled_on_subcycle=.true.)
1032 4608 : call addfld ('FRZRDT', (/ 'trop_cld_lev' /), 'A', 'W/kg', 'Latent heating rate due to homogeneous freezing of rain', sampled_on_subcycle=.true.)
1033 4608 : call addfld ('QRSEDTEN', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Rain mixing ratio tendency from sedimentation', sampled_on_subcycle=.true.)
1034 4608 : call addfld ('QSSEDTEN', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Snow mixing ratio tendency from sedimentation', sampled_on_subcycle=.true.)
1035 4608 : call addfld ('NNUCCCO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Immersion freezing of cloud water', sampled_on_subcycle=.true.)
1036 4608 : call addfld ('NNUCCTO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Contact freezing of cloud water', sampled_on_subcycle=.true.)
1037 4608 : call addfld ('NNUCCDO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Ice nucleation', sampled_on_subcycle=.true.)
1038 4608 : call addfld ('NNUDEPO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Deposition Nucleation', sampled_on_subcycle=.true.)
1039 4608 : call addfld ('NHOMO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Homogeneous freezing of cloud water', sampled_on_subcycle=.true.)
1040 4608 : call addfld ('NNUCCRO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to heterogeneous freezing of rain to snow', sampled_on_subcycle=.true.)
1041 4608 : call addfld ('NNUCCRIO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Heterogeneous freezing of rain to ice', sampled_on_subcycle=.true.)
1042 4608 : call addfld ('NSACWIO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Ice Multiplication- Rime-splintering', sampled_on_subcycle=.true.)
1043 4608 : call addfld ('NPRAO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Accretion of cloud water by rain', sampled_on_subcycle=.true.)
1044 4608 : call addfld ('NPSACWSO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Accretion of cloud water by snow', sampled_on_subcycle=.true.)
1045 4608 : call addfld ('NPRAIO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Accretion of cloud ice to snow', sampled_on_subcycle=.true.)
1046 4608 : call addfld ('NPRACSO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Accretion of rain by snow', sampled_on_subcycle=.true.)
1047 4608 : call addfld ('NPRCO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Autoconversion of cloud water [to rain]', sampled_on_subcycle=.true.)
1048 4608 : call addfld ('NPRCIO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Autoconversion of cloud ice to snow', sampled_on_subcycle=.true.)
1049 4608 : call addfld ('NCSEDTEN', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to cloud liquid sedimentation', sampled_on_subcycle=.true.)
1050 4608 : call addfld ('NISEDTEN', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to cloud ice sedimentation', sampled_on_subcycle=.true.)
1051 4608 : call addfld ('NRSEDTEN', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to rain sedimentation', sampled_on_subcycle=.true.)
1052 4608 : call addfld ('NSSEDTEN', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to snow sedimentation', sampled_on_subcycle=.true.)
1053 4608 : call addfld ('NMELTO', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Melting of cloud ice', sampled_on_subcycle=.true.)
1054 4608 : call addfld ('NMELTS', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Melting of snow', sampled_on_subcycle=.true.)
1055 :
1056 2304 : if (trim(micro_mg_warm_rain) == 'kk2000') then
1057 4608 : call addfld ('qctend_KK2000', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'cloud liquid mass tendency due to autoconversion & accretion from KK2000', sampled_on_subcycle=.true.)
1058 4608 : call addfld ('nctend_KK2000', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'cloud number mass tendency due to autoconversion & accretion from KK2000', sampled_on_subcycle=.true.)
1059 4608 : call addfld ('qrtend_KK2000', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'rain mass tendency due to autoconversion & accretion from KK2000', sampled_on_subcycle=.true.)
1060 4608 : call addfld ('nrtend_KK2000', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'rain number tendency due to autoconversion & accretion from KK2000', sampled_on_subcycle=.true.)
1061 : end if
1062 2304 : if (trim(micro_mg_warm_rain) == 'sb2001') then
1063 0 : call addfld ('qctend_SB2001', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'cloud liquid mass tendency due to autoconversion & accretion from SB2001', sampled_on_subcycle=.true.)
1064 0 : call addfld ('nctend_SB2001', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'cloud liquid number tendency due to autoconversion & accretion from SB2001',sampled_on_subcycle=.true.)
1065 0 : call addfld ('qrtend_SB2001', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'rain mass tendency due to autoconversion & accretion from SB2001', sampled_on_subcycle=.true.)
1066 0 : call addfld ('nrtend_SB2001', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'rain number tendency due to autoconversion & accretion from SB2001', sampled_on_subcycle=.true.)
1067 : end if
1068 4608 : call addfld ('LAMC', (/ 'trop_cld_lev' /), 'A', 'unitless', 'Size distribution parameter lambda for liquid', sampled_on_subcycle=.true. )
1069 4608 : call addfld ('LAMR', (/ 'trop_cld_lev' /), 'A', 'unitless', 'Size distribution parameter lambda for rain', sampled_on_subcycle=.true.)
1070 4608 : call addfld ('PGAM', (/ 'trop_cld_lev' /), 'A', 'unitless', 'Size distribution parameter mu (pgam) for liquid', sampled_on_subcycle=.true.)
1071 4608 : call addfld ('N0R', (/ 'trop_cld_lev' /), 'A', 'unitless', 'Size distribution parameter n0 for rain', sampled_on_subcycle=.true.)
1072 :
1073 2304 : if (micro_mg_version > 2) then
1074 4608 : call addfld ('NMELTG', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Melting of graupel', sampled_on_subcycle=.true.)
1075 4608 : call addfld ('NGSEDTEN', (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to graupel sedimentation', sampled_on_subcycle=.true.)
1076 4608 : call addfld ('PSACRO', (/ 'lev' /), 'A', 'kg/kg/s', 'Collisions between rain & snow (Graupel collecting snow)',sampled_on_subcycle=.true.)
1077 4608 : call addfld ('PRACGO', (/ 'lev' /), 'A', 'kg/kg/s', 'Change in q collection rain by graupel', sampled_on_subcycle=.true.)
1078 4608 : call addfld ('PSACWGO', (/ 'lev' /), 'A', 'kg/kg/s', 'Change in q collection droplets by graupel', sampled_on_subcycle=.true.)
1079 4608 : call addfld ('PGSACWO', (/ 'lev' /), 'A', 'kg/kg/s', 'Q conversion to graupel due to collection droplets by snow', sampled_on_subcycle=.true.)
1080 4608 : call addfld ('PGRACSO', (/ 'lev' /), 'A', 'kg/kg/s', 'Q conversion to graupel due to collection rain by snow', sampled_on_subcycle=.true.)
1081 4608 : call addfld ('PRDGO', (/ 'lev' /), 'A', 'kg/kg/s', 'Deposition of graupel', sampled_on_subcycle=.true.)
1082 4608 : call addfld ('QMULTGO', (/ 'lev' /), 'A', 'kg/kg/s', 'Q change due to ice mult droplets/graupel', sampled_on_subcycle=.true.)
1083 4608 : call addfld ('QMULTRGO', (/ 'lev' /), 'A', 'kg/kg/s', 'Q change due to ice mult rain/graupel', sampled_on_subcycle=.true.)
1084 4608 : call addfld ('QGSEDTEN', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Graupel/Hail mixing ratio tendency from sedimentation', sampled_on_subcycle=.true.)
1085 4608 : call addfld ('NPRACGO', (/ 'lev' /), 'A', '#/kg/s', 'Change N collection rain by graupel', sampled_on_subcycle=.true.)
1086 4608 : call addfld ('NSCNGO', (/ 'lev' /), 'A', '#/kg/s', 'Change N conversion to graupel due to collection droplets by snow', sampled_on_subcycle=.true.)
1087 4608 : call addfld ('NGRACSO', (/ 'lev' /), 'A', '#/kg/s', 'Change N conversion to graupel due to collection rain by snow', sampled_on_subcycle=.true.)
1088 4608 : call addfld ('NMULTGO', (/ 'lev' /), 'A', '#/kg/s', 'Ice mult due to acc droplets by graupel', sampled_on_subcycle=.true.)
1089 4608 : call addfld ('NMULTRGO', (/ 'lev' /), 'A', '#/kg/s', 'Ice mult due to acc rain by graupel', sampled_on_subcycle=.true.)
1090 4608 : call addfld ('NPSACWGO', (/ 'lev' /), 'A', '#/kg/s', 'Change N collection droplets by graupel', sampled_on_subcycle=.true.)
1091 4608 : call addfld ('CLDFGRAU', (/ 'lev' /), 'A', '1', 'Cloud fraction adjusted for graupel', sampled_on_subcycle=.true.)
1092 4608 : call addfld ('MELTGTOT', (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Melting of graupel', sampled_on_subcycle=.true.)
1093 :
1094 : end if
1095 :
1096 2304 : call addfld ('RBFRAC', horiz_only, 'A', 'Fraction', 'Fraction of sky covered by a potential rainbow', sampled_on_subcycle=.true.)
1097 2304 : call addfld ('RBFREQ', horiz_only, 'A', 'Frequency', 'Potential rainbow frequency', sampled_on_subcycle=.true.)
1098 2304 : call addfld( 'rbSZA', horiz_only, 'I', 'degrees', 'solar zenith angle', sampled_on_subcycle=.true.)
1099 :
1100 : ! History variables for CAM5 microphysics
1101 4608 : call addfld ('MPDT', (/ 'lev' /), 'A', 'W/kg', 'Heating tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1102 4608 : call addfld ('MPDQ', (/ 'lev' /), 'A', 'kg/kg/s', 'Q tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1103 4608 : call addfld ('MPDLIQ', (/ 'lev' /), 'A', 'kg/kg/s', 'CLDLIQ tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1104 4608 : call addfld ('MPDICE', (/ 'lev' /), 'A', 'kg/kg/s', 'CLDICE tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1105 4608 : call addfld ('MPDNLIQ', (/ 'lev' /), 'A', '1/kg/s', 'NUMLIQ tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1106 4608 : call addfld ('MPDNICE', (/ 'lev' /), 'A', '1/kg/s', 'NUMICE tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1107 4608 : call addfld ('MPDW2V', (/ 'lev' /), 'A', 'kg/kg/s', 'Water <--> Vapor tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1108 4608 : call addfld ('MPDW2I', (/ 'lev' /), 'A', 'kg/kg/s', 'Water <--> Ice tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1109 4608 : call addfld ('MPDW2P', (/ 'lev' /), 'A', 'kg/kg/s', 'Water <--> Precip tendency - Morrison microphysics',sampled_on_subcycle=.true.)
1110 4608 : call addfld ('MPDI2V', (/ 'lev' /), 'A', 'kg/kg/s', 'Ice <--> Vapor tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1111 4608 : call addfld ('MPDI2W', (/ 'lev' /), 'A', 'kg/kg/s', 'Ice <--> Water tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1112 4608 : call addfld ('MPDI2P', (/ 'lev' /), 'A', 'kg/kg/s', 'Ice <--> Precip tendency - Morrison microphysics', sampled_on_subcycle=.true.)
1113 4608 : call addfld ('ICWNC', (/ 'lev' /), 'A', 'm-3', 'Prognostic in-cloud water number conc', sampled_on_subcycle=.true.)
1114 4608 : call addfld ('ICINC', (/ 'lev' /), 'A', 'm-3', 'Prognostic in-cloud ice number conc', sampled_on_subcycle=.true.)
1115 4608 : call addfld ('EFFLIQ_IND', (/ 'lev' /), 'A','Micron', 'Prognostic droplet effective radius (indirect effect)', sampled_on_subcycle=.true.)
1116 2304 : call addfld ('CDNUMC', horiz_only, 'A', '1/m2', 'Vertically-integrated droplet concentration', sampled_on_subcycle=.true.)
1117 : call addfld ('MPICLWPI', horiz_only, 'A', 'kg/m2', 'Vertically-integrated &
1118 2304 : &in-cloud Initial Liquid WP (Before Micro)', sampled_on_subcycle=.true.)
1119 : call addfld ('MPICIWPI', horiz_only, 'A', 'kg/m2', 'Vertically-integrated &
1120 2304 : &in-cloud Initial Ice WP (Before Micro)', sampled_on_subcycle=.true.)
1121 :
1122 : ! This is provided as an example on how to write out subcolumn output
1123 : ! NOTE -- only 'I' should be used for sub-column fields as subc-columns could shift from time-step to time-step
1124 2304 : if (use_subcol_microp) then
1125 : call addfld('FICE_SCOL', (/'psubcols','lev '/), 'I', 'fraction', &
1126 0 : 'Sub-column fractional ice content within cloud', flag_xyfill=.true., fill_value=1.e30_r8, sampled_on_subcycle=.true.)
1127 : call addfld('MPDICE_SCOL', (/'psubcols','lev '/), 'I', 'kg/kg/s', &
1128 0 : 'Sub-column CLDICE tendency - Morrison microphysics', flag_xyfill=.true., fill_value=1.e30_r8, sampled_on_subcycle=.true.)
1129 : call addfld('MPDLIQ_SCOL', (/'psubcols','lev '/), 'I', 'kg/kg/s', &
1130 0 : 'Sub-column CLDLIQ tendency - Morrison microphysics', flag_xyfill=.true., fill_value=1.e30_r8, sampled_on_subcycle=.true.)
1131 : end if
1132 :
1133 :
1134 : ! This is only if the coldpoint temperatures are being adjusted.
1135 : ! NOTE: Some fields related to these and output later are added in tropopause.F90.
1136 2304 : if (micro_mg_adjust_cpt) then
1137 0 : call addfld ('TROPF_TADJ', (/ 'lev' /), 'A', 'K', 'Temperatures after cold point adjustment', sampled_on_subcycle=.true.)
1138 0 : call addfld ('TROPF_RHADJ', (/ 'lev' /), 'A', 'K', 'Relative Hunidity after cold point adjustment', sampled_on_subcycle=.true.)
1139 0 : call addfld ('TROPF_CDT', horiz_only, 'A', 'K', 'Cold point temperature adjustment', sampled_on_subcycle=.true.)
1140 0 : call addfld ('TROPF_CDZ', horiz_only, 'A', 'm', 'Distance of coldpoint from coldest model level',sampled_on_subcycle=.true.)
1141 : end if
1142 :
1143 :
1144 : ! Averaging for cloud particle number and size
1145 4608 : call addfld ('AWNC', (/ 'lev' /), 'A', 'm-3', 'Average cloud water number conc', sampled_on_subcycle=.true.)
1146 4608 : call addfld ('AWNI', (/ 'lev' /), 'A', 'm-3', 'Average cloud ice number conc', sampled_on_subcycle=.true.)
1147 4608 : call addfld ('AREL', (/ 'lev' /), 'A', 'Micron', 'Average droplet effective radius', sampled_on_subcycle=.true.)
1148 4608 : call addfld ('AREI', (/ 'lev' /), 'A', 'Micron', 'Average ice effective radius', sampled_on_subcycle=.true.)
1149 : ! Frequency arrays for above
1150 4608 : call addfld ('FREQL', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of liquid', sampled_on_subcycle=.true.)
1151 4608 : call addfld ('FREQI', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of ice', sampled_on_subcycle=.true.)
1152 :
1153 : ! Average cloud top particle size and number (liq, ice) and frequency
1154 2304 : call addfld ('ACTREL', horiz_only, 'A', 'Micron', 'Average Cloud Top droplet effective radius', sampled_on_subcycle=.true.)
1155 2304 : call addfld ('ACTREI', horiz_only, 'A', 'Micron', 'Average Cloud Top ice effective radius', sampled_on_subcycle=.true.)
1156 2304 : call addfld ('ACTNL', horiz_only, 'A', 'm-3', 'Average Cloud Top droplet number', sampled_on_subcycle=.true.)
1157 2304 : call addfld ('ACTNI', horiz_only, 'A', 'm-3', 'Average Cloud Top ice number', sampled_on_subcycle=.true.)
1158 :
1159 2304 : call addfld ('FCTL', horiz_only, 'A', 'fraction', 'Fractional occurrence of cloud top liquid', sampled_on_subcycle=.true.)
1160 2304 : call addfld ('FCTI', horiz_only, 'A', 'fraction', 'Fractional occurrence of cloud top ice', sampled_on_subcycle=.true.)
1161 :
1162 : ! New frequency arrays for mixed phase and supercooled liquid (only and mixed) for (a) Cloud Top and (b) everywhere..
1163 4608 : call addfld ('FREQM', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of mixed phase', sampled_on_subcycle=.true.)
1164 4608 : call addfld ('FREQSL', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of only supercooled liquid', sampled_on_subcycle=.true.)
1165 4608 : call addfld ('FREQSLM', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of super cooled liquid with ice', sampled_on_subcycle=.true.)
1166 2304 : call addfld ('FCTM', horiz_only, 'A', 'fraction', 'Fractional occurrence of cloud top mixed phase', sampled_on_subcycle=.true.)
1167 2304 : call addfld ('FCTSL', horiz_only, 'A', 'fraction', 'Fractional occurrence of cloud top only supercooled liquid', sampled_on_subcycle=.true.)
1168 2304 : call addfld ('FCTSLM', horiz_only, 'A', 'fraction', 'Fractional occurrence of cloud top super cooled liquid with ice', sampled_on_subcycle=.true.)
1169 :
1170 4608 : call addfld ('LS_FLXPRC', (/ 'ilev' /), 'A', 'kg/m2/s', 'ls stratiform gbm interface rain+snow flux', sampled_on_subcycle=.true.)
1171 4608 : call addfld ('LS_FLXSNW', (/ 'ilev' /), 'A', 'kg/m2/s', 'ls stratiform gbm interface snow flux', sampled_on_subcycle=.true.)
1172 :
1173 4608 : call addfld ('REL', (/ 'lev' /), 'A', 'micron', 'MG REL stratiform cloud effective radius liquid', sampled_on_subcycle=.true.)
1174 4608 : call addfld ('REI', (/ 'lev' /), 'A', 'micron', 'MG REI stratiform cloud effective radius ice', sampled_on_subcycle=.true.)
1175 4608 : call addfld ('LS_REFFRAIN', (/ 'lev' /), 'A', 'micron', 'ls stratiform rain effective radius', sampled_on_subcycle=.true.)
1176 4608 : call addfld ('LS_REFFSNOW', (/ 'lev' /), 'A', 'micron', 'ls stratiform snow effective radius', sampled_on_subcycle=.true.)
1177 4608 : call addfld ('CV_REFFLIQ', (/ 'lev' /), 'A', 'micron', 'convective cloud liq effective radius', sampled_on_subcycle=.true.)
1178 4608 : call addfld ('CV_REFFICE', (/ 'lev' /), 'A', 'micron', 'convective cloud ice effective radius', sampled_on_subcycle=.true.)
1179 4608 : call addfld ('MG_SADICE', (/ 'lev' /), 'A', 'cm2/cm3', 'MG surface area density ice', sampled_on_subcycle=.true.)
1180 4608 : call addfld ('MG_SADSNOW', (/ 'lev' /), 'A', 'cm2/cm3', 'MG surface area density snow', sampled_on_subcycle=.true.)
1181 :
1182 : ! diagnostic precip
1183 4608 : call addfld ('QRAIN', (/ 'lev' /), 'A', 'kg/kg', 'Diagnostic grid-mean rain mixing ratio', sampled_on_subcycle=.true.)
1184 4608 : call addfld ('QSNOW', (/ 'lev' /), 'A', 'kg/kg', 'Diagnostic grid-mean snow mixing ratio', sampled_on_subcycle=.true.)
1185 4608 : call addfld ('NRAIN', (/ 'lev' /), 'A', 'm-3', 'Diagnostic grid-mean rain number conc', sampled_on_subcycle=.true.)
1186 4608 : call addfld ('NSNOW', (/ 'lev' /), 'A', 'm-3', 'Diagnostic grid-mean snow number conc', sampled_on_subcycle=.true.)
1187 :
1188 : ! size of precip
1189 4608 : call addfld ('RERCLD', (/ 'lev' /), 'A', 'm', 'Diagnostic effective radius of Liquid Cloud and Rain', sampled_on_subcycle=.true.)
1190 4608 : call addfld ('DSNOW', (/ 'lev' /), 'A', 'm', 'Diagnostic grid-mean snow diameter', sampled_on_subcycle=.true.)
1191 :
1192 : ! diagnostic radar reflectivity, cloud-averaged
1193 4608 : call addfld ('REFL', (/ 'lev' /), 'A', 'DBz', '94 GHz radar reflectivity', sampled_on_subcycle=.true.)
1194 4608 : call addfld ('AREFL', (/ 'lev' /), 'A', 'DBz', 'Average 94 GHz radar reflectivity', sampled_on_subcycle=.true.)
1195 4608 : call addfld ('FREFL', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of radar reflectivity', sampled_on_subcycle=.true.)
1196 :
1197 4608 : call addfld ('CSRFL', (/ 'lev' /), 'A', 'DBz', '94 GHz radar reflectivity (CloudSat thresholds)', sampled_on_subcycle=.true.)
1198 4608 : call addfld ('ACSRFL', (/ 'lev' /), 'A', 'DBz', 'Average 94 GHz radar reflectivity (CloudSat thresholds)', sampled_on_subcycle=.true.)
1199 4608 : call addfld ('FCSRFL', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of radar reflectivity (CloudSat thresholds)', sampled_on_subcycle=.true.)
1200 :
1201 4608 : call addfld ('AREFLZ', (/ 'lev' /), 'A', 'mm^6/m^3', 'Average 94 GHz radar reflectivity', sampled_on_subcycle=.true.)
1202 :
1203 : ! 10cm (rain) radar reflectivity
1204 4608 : call addfld ('REFL10CM', (/ 'lev' /), 'A', 'DBz', '10cm (Rain) radar reflectivity (Dbz)', sampled_on_subcycle=.true.)
1205 4608 : call addfld ('REFLZ10CM', (/ 'lev' /), 'A', 'mm^6/m^3', '10cm (Rain) radar reflectivity (Z units)', sampled_on_subcycle=.true.)
1206 :
1207 : ! Aerosol information
1208 4608 : call addfld ('NCAL', (/ 'lev' /), 'A', '1/m3', 'Number Concentation Activated for Liquid', sampled_on_subcycle=.true.)
1209 4608 : call addfld ('NCAI', (/ 'lev' /), 'A', '1/m3', 'Number Concentation Activated for Ice', sampled_on_subcycle=.true.)
1210 :
1211 : ! Average rain and snow mixing ratio (Q), number (N) and diameter (D), with frequency
1212 4608 : call addfld ('AQRAIN', (/ 'lev' /), 'A', 'kg/kg', 'Average rain mixing ratio', sampled_on_subcycle=.true.)
1213 4608 : call addfld ('AQSNOW', (/ 'lev' /), 'A', 'kg/kg', 'Average snow mixing ratio', sampled_on_subcycle=.true.)
1214 4608 : call addfld ('ANRAIN', (/ 'lev' /), 'A', 'm-3', 'Average rain number conc', sampled_on_subcycle=.true.)
1215 4608 : call addfld ('ANSNOW', (/ 'lev' /), 'A', 'm-3', 'Average snow number conc', sampled_on_subcycle=.true.)
1216 4608 : call addfld ('ADRAIN', (/ 'lev' /), 'A', 'm', 'Average rain effective Diameter', sampled_on_subcycle=.true.)
1217 4608 : call addfld ('ADSNOW', (/ 'lev' /), 'A', 'm', 'Average snow effective Diameter', sampled_on_subcycle=.true.)
1218 4608 : call addfld ('FREQR', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of rain', sampled_on_subcycle=.true.)
1219 4608 : call addfld ('FREQS', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of snow', sampled_on_subcycle=.true.)
1220 :
1221 : ! precipitation efficiency & other diagnostic fields
1222 2304 : call addfld('PE' , horiz_only, 'A', '1', 'Stratiform Precipitation Efficiency (precip/cmeliq)', sampled_on_subcycle=.true.)
1223 2304 : call addfld('APRL' , horiz_only, 'A', 'm/s', 'Average Stratiform Precip Rate over efficiency calculation', sampled_on_subcycle=.true.)
1224 2304 : call addfld('PEFRAC', horiz_only, 'A', '1', 'Fraction of timesteps precip efficiency reported', sampled_on_subcycle=.true.)
1225 2304 : call addfld('VPRCO' , horiz_only, 'A', 'kg/kg/s', 'Vertical average of autoconversion rate', sampled_on_subcycle=.true.)
1226 2304 : call addfld('VPRAO' , horiz_only, 'A', 'kg/kg/s', 'Vertical average of accretion rate', sampled_on_subcycle=.true.)
1227 2304 : call addfld('RACAU' , horiz_only, 'A', 'kg/kg/s', 'Accretion/autoconversion ratio from vertical average', sampled_on_subcycle=.true.)
1228 :
1229 4608 : call addfld('UMR', (/ 'trop_cld_lev' /), 'A', 'm/s', 'Mass-weighted rain fallspeed', sampled_on_subcycle=.true.)
1230 4608 : call addfld('UMS', (/ 'trop_cld_lev' /), 'A', 'm/s', 'Mass-weighted snow fallspeed', sampled_on_subcycle=.true.)
1231 :
1232 2304 : if (micro_mg_version > 2) then
1233 4608 : call addfld('UMG', (/ 'trop_cld_lev' /), 'A', 'm/s', 'Mass-weighted graupel/hail fallspeed', sampled_on_subcycle=.true.)
1234 4608 : call addfld ('FREQG', (/ 'lev' /), 'A', 'fraction', 'Fractional occurrence of Graupel', sampled_on_subcycle=.true.)
1235 4608 : call addfld ('LS_REFFGRAU', (/ 'lev' /), 'A', 'micron', 'ls stratiform graupel/hail effective radius', sampled_on_subcycle=.true.)
1236 4608 : call addfld ('AQGRAU', (/ 'lev' /), 'A', 'kg/kg', 'Average graupel/hail mixing ratio', sampled_on_subcycle=.true.)
1237 4608 : call addfld ('ANGRAU', (/ 'lev' /), 'A', 'm-3', 'Average graupel/hail number conc', sampled_on_subcycle=.true.)
1238 : end if
1239 :
1240 :
1241 : ! qc limiter (only output in versions 1.5 and later)
1242 4608 : call addfld('QCRAT', (/ 'lev' /), 'A', 'fraction', 'Qc Limiter: Fraction of qc tendency applied', sampled_on_subcycle=.true.)
1243 :
1244 : ! determine the add_default fields
1245 : call phys_getopts(history_amwg_out = history_amwg , &
1246 : history_budget_out = history_budget , &
1247 2304 : history_budget_histfile_num_out = budget_histfile)
1248 :
1249 2304 : if (history_amwg) then
1250 2304 : call add_default ('FICE ', 1, ' ')
1251 2304 : call add_default ('AQRAIN ', 1, ' ')
1252 2304 : call add_default ('AQSNOW ', 1, ' ')
1253 2304 : call add_default ('ANRAIN ', 1, ' ')
1254 2304 : call add_default ('ANSNOW ', 1, ' ')
1255 2304 : call add_default ('ADRAIN ', 1, ' ')
1256 2304 : call add_default ('ADSNOW ', 1, ' ')
1257 2304 : call add_default ('AREI ', 1, ' ')
1258 2304 : call add_default ('AREL ', 1, ' ')
1259 2304 : call add_default ('AWNC ', 1, ' ')
1260 2304 : call add_default ('AWNI ', 1, ' ')
1261 2304 : call add_default ('CDNUMC ', 1, ' ')
1262 2304 : call add_default ('FREQR ', 1, ' ')
1263 2304 : call add_default ('FREQS ', 1, ' ')
1264 2304 : call add_default ('FREQL ', 1, ' ')
1265 2304 : call add_default ('FREQI ', 1, ' ')
1266 25344 : do m = 1, ncnst
1267 23040 : call cnst_get_ind(cnst_names(m), mm)
1268 25344 : call add_default(cnst_name(mm), 1, ' ')
1269 : end do
1270 : end if
1271 :
1272 2304 : if ( history_budget ) then
1273 0 : call add_default ('EVAPSNOW ', budget_histfile, ' ')
1274 0 : call add_default ('EVAPPREC ', budget_histfile, ' ')
1275 0 : call add_default ('QVRES ', budget_histfile, ' ')
1276 0 : call add_default ('QISEVAP ', budget_histfile, ' ')
1277 0 : call add_default ('QCSEVAP ', budget_histfile, ' ')
1278 0 : call add_default ('QISEDTEN ', budget_histfile, ' ')
1279 0 : call add_default ('QCSEDTEN ', budget_histfile, ' ')
1280 0 : call add_default ('QIRESO ', budget_histfile, ' ')
1281 0 : call add_default ('QCRESO ', budget_histfile, ' ')
1282 0 : call add_default ('QRSEDTEN ', budget_histfile, ' ')
1283 0 : call add_default ('QSSEDTEN ', budget_histfile, ' ')
1284 0 : call add_default ('PSACWSO ', budget_histfile, ' ')
1285 0 : call add_default ('PRCO ', budget_histfile, ' ')
1286 0 : call add_default ('PRCIO ', budget_histfile, ' ')
1287 0 : call add_default ('PRAO ', budget_histfile, ' ')
1288 0 : call add_default ('PRAIO ', budget_histfile, ' ')
1289 0 : call add_default ('PRACSO ', budget_histfile, ' ')
1290 0 : call add_default ('VAPDEPSO ', budget_histfile, ' ')
1291 0 : call add_default ('MSACWIO ', budget_histfile, ' ')
1292 0 : call add_default ('MPDW2V ', budget_histfile, ' ')
1293 0 : call add_default ('MPDW2P ', budget_histfile, ' ')
1294 0 : call add_default ('MPDW2I ', budget_histfile, ' ')
1295 0 : call add_default ('MPDT ', budget_histfile, ' ')
1296 0 : call add_default ('MPDQ ', budget_histfile, ' ')
1297 0 : call add_default ('MPDLIQ ', budget_histfile, ' ')
1298 0 : call add_default ('MPDICE ', budget_histfile, ' ')
1299 0 : call add_default ('MPDI2W ', budget_histfile, ' ')
1300 0 : call add_default ('MPDI2V ', budget_histfile, ' ')
1301 0 : call add_default ('MPDI2P ', budget_histfile, ' ')
1302 0 : call add_default ('MNUCCTO ', budget_histfile, ' ')
1303 0 : call add_default ('MNUCCRO ', budget_histfile, ' ')
1304 0 : call add_default ('MNUCCRIO ', budget_histfile, ' ')
1305 0 : call add_default ('MNUCCCO ', budget_histfile, ' ')
1306 0 : call add_default ('MELTSDT ', budget_histfile, ' ')
1307 0 : call add_default ('MELTO ', budget_histfile, ' ')
1308 0 : call add_default ('HOMOO ', budget_histfile, ' ')
1309 0 : call add_default ('FRZRDT ', budget_histfile, ' ')
1310 0 : call add_default ('CMEIOUT ', budget_histfile, ' ')
1311 0 : call add_default ('BERGSO ', budget_histfile, ' ')
1312 0 : call add_default ('BERGO ', budget_histfile, ' ')
1313 0 : call add_default ('MELTSTOT ', budget_histfile, ' ')
1314 0 : call add_default ('MNUDEPO ', budget_histfile, ' ')
1315 0 : call add_default ('NNUCCCO ', budget_histfile, ' ')
1316 0 : call add_default ('NNUCCTO ', budget_histfile, ' ')
1317 0 : call add_default ('NNUCCDO ', budget_histfile, ' ')
1318 0 : call add_default ('NNUDEPO ', budget_histfile, ' ')
1319 0 : call add_default ('NHOMO ', budget_histfile, ' ')
1320 0 : call add_default ('NNUCCRO ', budget_histfile, ' ')
1321 0 : call add_default ('NNUCCRIO ', budget_histfile, ' ')
1322 0 : call add_default ('NSACWIO ', budget_histfile, ' ')
1323 0 : call add_default ('NPRAO ', budget_histfile, ' ')
1324 0 : call add_default ('NPSACWSO ', budget_histfile, ' ')
1325 0 : call add_default ('NPRAIO ', budget_histfile, ' ')
1326 0 : call add_default ('NPRACSO ', budget_histfile, ' ')
1327 0 : call add_default ('NPRCO ', budget_histfile, ' ')
1328 0 : call add_default ('NPRCIO ', budget_histfile, ' ')
1329 0 : call add_default ('NCSEDTEN ', budget_histfile, ' ')
1330 0 : call add_default ('NISEDTEN ', budget_histfile, ' ')
1331 0 : call add_default ('NRSEDTEN ', budget_histfile, ' ')
1332 0 : call add_default ('NSSEDTEN ', budget_histfile, ' ')
1333 0 : call add_default ('NMELTO ', budget_histfile, ' ')
1334 0 : call add_default ('NMELTS ', budget_histfile, ' ')
1335 0 : call add_default ('NCAL ', budget_histfile, ' ')
1336 0 : if (micro_mg_version > 2) then
1337 0 : call add_default ('QGSEDTEN ', budget_histfile, ' ')
1338 0 : call add_default ('PSACRO ', budget_histfile, ' ')
1339 0 : call add_default ('PRACGO ', budget_histfile, ' ')
1340 0 : call add_default ('PSACWGO ', budget_histfile, ' ')
1341 0 : call add_default ('PGSACWO ', budget_histfile, ' ')
1342 0 : call add_default ('PGRACSO ', budget_histfile, ' ')
1343 0 : call add_default ('PRDGO ', budget_histfile, ' ')
1344 0 : call add_default ('QMULTGO ', budget_histfile, ' ')
1345 0 : call add_default ('QMULTRGO ', budget_histfile, ' ')
1346 0 : call add_default ('MELTGTOT ', budget_histfile, ' ')
1347 0 : call add_default ('NPRACGO ', budget_histfile, ' ')
1348 0 : call add_default ('NSCNGO ', budget_histfile, ' ')
1349 0 : call add_default ('NGRACSO ', budget_histfile, ' ')
1350 0 : call add_default ('NMULTGO ', budget_histfile, ' ')
1351 0 : call add_default ('NMULTRGO ', budget_histfile, ' ')
1352 0 : call add_default ('NPSACWGO ', budget_histfile, ' ')
1353 0 : call add_default ('NGSEDTEN ', budget_histfile, ' ')
1354 0 : call add_default ('NMELTG ', budget_histfile, ' ')
1355 : end if
1356 0 : call add_default(cnst_name(ixcldliq), budget_histfile, ' ')
1357 0 : call add_default(cnst_name(ixcldice), budget_histfile, ' ')
1358 0 : call add_default(apcnst (ixcldliq), budget_histfile, ' ')
1359 0 : call add_default(apcnst (ixcldice), budget_histfile, ' ')
1360 0 : call add_default(bpcnst (ixcldliq), budget_histfile, ' ')
1361 0 : call add_default(bpcnst (ixcldice), budget_histfile, ' ')
1362 0 : call add_default(cnst_name(ixrain), budget_histfile, ' ')
1363 0 : call add_default(cnst_name(ixsnow), budget_histfile, ' ')
1364 0 : call add_default(apcnst (ixrain), budget_histfile, ' ')
1365 0 : call add_default(apcnst (ixsnow), budget_histfile, ' ')
1366 0 : call add_default(bpcnst (ixrain), budget_histfile, ' ')
1367 0 : call add_default(bpcnst (ixsnow), budget_histfile, ' ')
1368 :
1369 0 : if (micro_mg_version > 2) then
1370 0 : call add_default(cnst_name(ixgraupel), budget_histfile, ' ')
1371 0 : call add_default(apcnst (ixgraupel), budget_histfile, ' ')
1372 0 : call add_default(bpcnst (ixgraupel), budget_histfile, ' ')
1373 : end if
1374 :
1375 : end if
1376 :
1377 : ! physics buffer indices
1378 2304 : ast_idx = pbuf_get_index('AST')
1379 2304 : cld_idx = pbuf_get_index('CLD')
1380 2304 : concld_idx = pbuf_get_index('CONCLD')
1381 2304 : prec_dp_idx = pbuf_get_index('PREC_DP')
1382 2304 : prec_sh_idx = pbuf_get_index('PREC_SH')
1383 :
1384 2304 : naai_idx = pbuf_get_index('NAAI')
1385 2304 : naai_hom_idx = pbuf_get_index('NAAI_HOM')
1386 2304 : npccn_idx = pbuf_get_index('NPCCN')
1387 2304 : rndst_idx = pbuf_get_index('RNDST')
1388 2304 : nacon_idx = pbuf_get_index('NACON')
1389 :
1390 2304 : prec_str_idx = pbuf_get_index('PREC_STR')
1391 2304 : snow_str_idx = pbuf_get_index('SNOW_STR')
1392 2304 : prec_sed_idx = pbuf_get_index('PREC_SED')
1393 2304 : snow_sed_idx = pbuf_get_index('SNOW_SED')
1394 2304 : prec_pcw_idx = pbuf_get_index('PREC_PCW')
1395 2304 : snow_pcw_idx = pbuf_get_index('SNOW_PCW')
1396 :
1397 2304 : cmeliq_idx = pbuf_get_index('CMELIQ')
1398 :
1399 : ! These fields may have been added, so don't abort if they have not been
1400 2304 : qsatfac_idx = pbuf_get_index('QSATFAC', ierr)
1401 2304 : qrain_idx = pbuf_get_index('QRAIN', ierr)
1402 2304 : qsnow_idx = pbuf_get_index('QSNOW', ierr)
1403 2304 : nrain_idx = pbuf_get_index('NRAIN', ierr)
1404 2304 : nsnow_idx = pbuf_get_index('NSNOW', ierr)
1405 :
1406 : ! fields for heterogeneous freezing
1407 2304 : frzimm_idx = pbuf_get_index('FRZIMM', ierr)
1408 2304 : frzcnt_idx = pbuf_get_index('FRZCNT', ierr)
1409 2304 : frzdep_idx = pbuf_get_index('FRZDEP', ierr)
1410 :
1411 : ! Initialize physics buffer grid fields for accumulating precip and condensation
1412 2304 : if (is_first_step()) then
1413 1536 : call pbuf_set_field(pbuf2d, cldo_idx, 0._r8)
1414 1536 : call pbuf_set_field(pbuf2d, cc_t_idx, 0._r8)
1415 1536 : call pbuf_set_field(pbuf2d, cc_qv_idx, 0._r8)
1416 1536 : call pbuf_set_field(pbuf2d, cc_ql_idx, 0._r8)
1417 1536 : call pbuf_set_field(pbuf2d, cc_qi_idx, 0._r8)
1418 1536 : call pbuf_set_field(pbuf2d, cc_nl_idx, 0._r8)
1419 1536 : call pbuf_set_field(pbuf2d, cc_ni_idx, 0._r8)
1420 1536 : call pbuf_set_field(pbuf2d, cc_qlst_idx,0._r8)
1421 1536 : call pbuf_set_field(pbuf2d, acpr_idx, 0._r8)
1422 1536 : call pbuf_set_field(pbuf2d, acgcme_idx, 0._r8)
1423 1536 : call pbuf_set_field(pbuf2d, acnum_idx, 0)
1424 1536 : call pbuf_set_field(pbuf2d, relvar_idx, 2._r8)
1425 1536 : call pbuf_set_field(pbuf2d, accre_enhan_idx, 1._r8)
1426 1536 : call pbuf_set_field(pbuf2d, am_evp_st_idx, 0._r8)
1427 1536 : call pbuf_set_field(pbuf2d, evprain_st_idx, 0._r8)
1428 1536 : call pbuf_set_field(pbuf2d, evpsnow_st_idx, 0._r8)
1429 1536 : call pbuf_set_field(pbuf2d, prer_evap_idx, 0._r8)
1430 1536 : call pbuf_set_field(pbuf2d, bergso_idx, 0._r8)
1431 1536 : call pbuf_set_field(pbuf2d, icswp_idx, 0._r8)
1432 1536 : call pbuf_set_field(pbuf2d, cldfsnow_idx, 0._r8)
1433 1536 : call pbuf_set_field(pbuf2d, dei_idx, 0.0_r8)
1434 1536 : call pbuf_set_field(pbuf2d, des_idx, 0.0_r8)
1435 1536 : call pbuf_set_field(pbuf2d, mu_idx, 0.0_r8)
1436 1536 : call pbuf_set_field(pbuf2d, lambdac_idx, 0.0_r8)
1437 :
1438 1536 : if (degrau_idx > 0) call pbuf_set_field(pbuf2d, degrau_idx, 0.0_r8)
1439 1536 : if (icgrauwp_idx > 0) call pbuf_set_field(pbuf2d, icgrauwp_idx, 0.0_r8)
1440 1536 : if (qrain_idx > 0) call pbuf_set_field(pbuf2d, qrain_idx, 0._r8)
1441 1536 : if (qsnow_idx > 0) call pbuf_set_field(pbuf2d, qsnow_idx, 0._r8)
1442 1536 : if (nrain_idx > 0) call pbuf_set_field(pbuf2d, nrain_idx, 0._r8)
1443 1536 : if (nsnow_idx > 0) call pbuf_set_field(pbuf2d, nsnow_idx, 0._r8)
1444 1536 : if (qcsedten_idx > 0) call pbuf_set_field(pbuf2d, qcsedten_idx, 0._r8)
1445 1536 : if (qrsedten_idx > 0) call pbuf_set_field(pbuf2d, qrsedten_idx, 0._r8)
1446 1536 : if (qisedten_idx > 0) call pbuf_set_field(pbuf2d, qisedten_idx, 0._r8)
1447 1536 : if (qssedten_idx > 0) call pbuf_set_field(pbuf2d, qssedten_idx, 0._r8)
1448 1536 : if (vtrmc_idx > 0) call pbuf_set_field(pbuf2d, vtrmc_idx, 0._r8)
1449 1536 : if (umr_idx > 0) call pbuf_set_field(pbuf2d, umr_idx, 0._r8)
1450 1536 : if (vtrmi_idx > 0) call pbuf_set_field(pbuf2d, vtrmi_idx, 0._r8)
1451 1536 : if (ums_idx > 0) call pbuf_set_field(pbuf2d, ums_idx, 0._r8)
1452 1536 : if (qcsevap_idx > 0) call pbuf_set_field(pbuf2d, qcsevap_idx, 0._r8)
1453 1536 : if (qisevap_idx > 0) call pbuf_set_field(pbuf2d, qisevap_idx, 0._r8)
1454 :
1455 : ! If sub-columns turned on, need to set the sub-column fields as well
1456 1536 : if (use_subcol_microp) then
1457 0 : call pbuf_set_field(pbuf2d, cldo_idx, 0._r8, col_type=col_type_subcol)
1458 0 : call pbuf_set_field(pbuf2d, cc_t_idx, 0._r8, col_type=col_type_subcol)
1459 0 : call pbuf_set_field(pbuf2d, cc_qv_idx, 0._r8, col_type=col_type_subcol)
1460 0 : call pbuf_set_field(pbuf2d, cc_ql_idx, 0._r8, col_type=col_type_subcol)
1461 0 : call pbuf_set_field(pbuf2d, cc_qi_idx, 0._r8, col_type=col_type_subcol)
1462 0 : call pbuf_set_field(pbuf2d, cc_nl_idx, 0._r8, col_type=col_type_subcol)
1463 0 : call pbuf_set_field(pbuf2d, cc_ni_idx, 0._r8, col_type=col_type_subcol)
1464 0 : call pbuf_set_field(pbuf2d, cc_qlst_idx, 0._r8, col_type=col_type_subcol)
1465 0 : call pbuf_set_field(pbuf2d, icswp_idx, 0._r8, col_type=col_type_subcol)
1466 0 : call pbuf_set_field(pbuf2d, cldfsnow_idx,0._r8, col_type=col_type_subcol)
1467 : end if
1468 :
1469 : end if
1470 :
1471 2304 : end subroutine micro_pumas_cam_init
1472 :
1473 : !===============================================================================
1474 :
1475 11312784 : subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf)
1476 :
1477 : use micro_pumas_utils, only: size_dist_param_basic, size_dist_param_liq
1478 2304 : use micro_pumas_utils, only: mg_liq_props, mg_ice_props, avg_diameter
1479 : use micro_pumas_utils, only: rhoi, rhosn, rhow, rhows, rhog, qsmall, mincld
1480 :
1481 : use micro_pumas_v1, only: micro_pumas_tend
1482 :
1483 : use physics_buffer, only: pbuf_col_type_index
1484 : use subcol, only: subcol_field_avg
1485 : use tropopause, only: tropopause_find_cam, TROP_ALG_CPP, TROP_ALG_NONE, NOTFOUND
1486 : use wv_saturation, only: qsat
1487 : use infnan, only: nan, assignment(=)
1488 : use cam_abortutils, only: handle_allocate_error
1489 :
1490 : use stochastic_tau_cam, only: ncd
1491 :
1492 : type(physics_state), intent(in) :: state
1493 : type(physics_ptend), intent(out) :: ptend
1494 : real(r8), intent(in) :: dtime
1495 : type(physics_buffer_desc), pointer :: pbuf(:)
1496 :
1497 : ! Local variables
1498 :
1499 269352 : type(proc_rates_type) :: proc_rates
1500 :
1501 : integer :: lchnk, ncol, psetcols, ngrdcol
1502 :
1503 : integer :: i, k, itim_old, it
1504 :
1505 : real(r8), parameter :: micron2meter = 1.e6_r8
1506 : real(r8), parameter :: shapeparam = 1.e5_r8
1507 :
1508 269352 : real(r8), pointer :: naai(:,:) ! ice nucleation number
1509 269352 : real(r8), pointer :: naai_hom(:,:) ! ice nucleation number (homogeneous)
1510 269352 : real(r8), pointer :: npccn(:,:) ! liquid activation number tendency
1511 269352 : real(r8), pointer :: rndst(:,:,:)
1512 269352 : real(r8), pointer :: nacon(:,:,:)
1513 269352 : real(r8), pointer :: am_evp_st_grid(:,:) ! Evaporation area of stratiform precipitation. 0<= am_evp_st <=1.
1514 269352 : real(r8), pointer :: evprain_st_grid(:,:) ! Evaporation rate of stratiform rain [kg/kg/s]
1515 269352 : real(r8), pointer :: evpsnow_st_grid(:,:) ! Evaporation rate of stratiform snow [kg/kg/s]
1516 :
1517 269352 : real(r8), pointer :: prec_str(:) ! [Total] Sfc flux of precip from stratiform [ m/s ]
1518 269352 : real(r8), pointer :: snow_str(:) ! [Total] Sfc flux of snow from stratiform [ m/s ]
1519 269352 : real(r8), pointer :: prec_sed(:) ! Surface flux of total cloud water from sedimentation
1520 269352 : real(r8), pointer :: snow_sed(:) ! Surface flux of cloud ice from sedimentation
1521 269352 : real(r8), pointer :: prec_pcw(:) ! Sfc flux of precip from microphysics [ m/s ]
1522 269352 : real(r8), pointer :: snow_pcw(:) ! Sfc flux of snow from microphysics [ m/s ]
1523 :
1524 269352 : real(r8), pointer :: ast(:,:) ! Relative humidity cloud fraction
1525 269352 : real(r8), pointer :: qsatfac(:,:) ! Subgrid cloud water saturation scaling factor.
1526 269352 : real(r8), pointer :: alst_mic(:,:)
1527 269352 : real(r8), pointer :: aist_mic(:,:)
1528 269352 : real(r8), pointer :: cldo(:,:) ! Old cloud fraction
1529 269352 : real(r8), pointer :: nevapr(:,:) ! Evaporation of total precipitation (rain + snow)
1530 269352 : real(r8), pointer :: prer_evap(:,:) ! precipitation evaporation rate
1531 269352 : real(r8), pointer :: relvar(:,:) ! relative variance of cloud water
1532 269352 : real(r8), pointer :: accre_enhan(:,:) ! optional accretion enhancement for experimentation
1533 269352 : real(r8), pointer :: prain(:,:) ! Total precipitation (rain + snow)
1534 269352 : real(r8), pointer :: dei(:,:) ! Ice effective diameter (meters)
1535 269352 : real(r8), pointer :: mu(:,:) ! Size distribution shape parameter for radiation
1536 269352 : real(r8), pointer :: lambdac(:,:) ! Size distribution slope parameter for radiation
1537 269352 : real(r8), pointer :: des(:,:) ! Snow effective diameter (m)
1538 269352 : real(r8), pointer :: degrau(:,:) ! Graupel effective diameter (m)
1539 269352 : real(r8), pointer :: bergstot(:,:) ! Conversion of cloud water to snow from bergeron
1540 :
1541 : !These variables need to be extracted from the
1542 : !proc_rates DDT in order for the subcolumn averaging
1543 : !routine to work properly when writing out diagnostic
1544 : !fields.
1545 538704 : real(r8) :: evapsnow_sc(state%psetcols,pver-top_lev+1)
1546 538704 : real(r8) :: bergstot_sc(state%psetcols,pver-top_lev+1)
1547 538704 : real(r8) :: qcrestot_sc(state%psetcols,pver-top_lev+1)
1548 538704 : real(r8) :: melttot_sc(state%psetcols,pver-top_lev+1)
1549 538704 : real(r8) :: mnuccctot_sc(state%psetcols,pver-top_lev+1)
1550 538704 : real(r8) :: mnuccttot_sc(state%psetcols,pver-top_lev+1)
1551 538704 : real(r8) :: bergtot_sc(state%psetcols,pver-top_lev+1)
1552 538704 : real(r8) :: homotot_sc(state%psetcols,pver-top_lev+1)
1553 538704 : real(r8) :: msacwitot_sc(state%psetcols,pver-top_lev+1)
1554 538704 : real(r8) :: psacwstot_sc(state%psetcols,pver-top_lev+1)
1555 538704 : real(r8) :: cmeitot_sc(state%psetcols,pver-top_lev+1)
1556 538704 : real(r8) :: qirestot_sc(state%psetcols,pver-top_lev+1)
1557 538704 : real(r8) :: prcitot_sc(state%psetcols,pver-top_lev+1)
1558 538704 : real(r8) :: praitot_sc(state%psetcols,pver-top_lev+1)
1559 538704 : real(r8) :: pratot_sc(state%psetcols,pver-top_lev+1)
1560 538704 : real(r8) :: prctot_sc(state%psetcols,pver-top_lev+1)
1561 538704 : real(r8) :: qcsedten_sc(state%psetcols,pver-top_lev+1)
1562 538704 : real(r8) :: qisedten_sc(state%psetcols,pver-top_lev+1)
1563 538704 : real(r8) :: vtrmc_sc(state%psetcols,pver-top_lev+1)
1564 538704 : real(r8) :: vtrmi_sc(state%psetcols,pver-top_lev+1)
1565 538704 : real(r8) :: qcsevap_sc(state%psetcols,pver-top_lev+1)
1566 538704 : real(r8) :: qisevap_sc(state%psetcols,pver-top_lev+1)
1567 538704 : real(r8) :: qrsedten_sc(state%psetcols,pver-top_lev+1)
1568 538704 : real(r8) :: qssedten_sc(state%psetcols,pver-top_lev+1)
1569 538704 : real(r8) :: umr_sc(state%psetcols,pver-top_lev+1)
1570 538704 : real(r8) :: ums_sc(state%psetcols,pver-top_lev+1)
1571 538704 : real(r8) :: psacrtot_sc(state%psetcols,pver-top_lev+1)
1572 538704 : real(r8) :: pracgtot_sc(state%psetcols,pver-top_lev+1)
1573 538704 : real(r8) :: psacwgtot_sc(state%psetcols,pver-top_lev+1)
1574 538704 : real(r8) :: pgsacwtot_sc(state%psetcols,pver-top_lev+1)
1575 538704 : real(r8) :: pgracstot_sc(state%psetcols,pver-top_lev+1)
1576 538704 : real(r8) :: prdgtot_sc(state%psetcols,pver-top_lev+1)
1577 538704 : real(r8) :: qmultgtot_sc(state%psetcols,pver-top_lev+1)
1578 538704 : real(r8) :: qmultrgtot_sc(state%psetcols,pver-top_lev+1)
1579 538704 : real(r8) :: npracgtot_sc(state%psetcols,pver-top_lev+1)
1580 538704 : real(r8) :: nscngtot_sc(state%psetcols,pver-top_lev+1)
1581 538704 : real(r8) :: ngracstot_sc(state%psetcols,pver-top_lev+1)
1582 538704 : real(r8) :: nmultgtot_sc(state%psetcols,pver-top_lev+1)
1583 538704 : real(r8) :: nmultrgtot_sc(state%psetcols,pver-top_lev+1)
1584 538704 : real(r8) :: npsacwgtot_sc(state%psetcols,pver-top_lev+1)
1585 :
1586 538704 : real(r8) :: rho(state%psetcols,pver)
1587 538704 : real(r8) :: cldmax(state%psetcols,pver)
1588 :
1589 538704 : real(r8) :: rate1cld(state%psetcols,pver) ! array to hold rate1ord_cw2pr_st from microphysics
1590 :
1591 538704 : real(r8) :: tlat(state%psetcols,pver)
1592 538704 : real(r8) :: qvlat(state%psetcols,pver)
1593 538704 : real(r8) :: qcten(state%psetcols,pver)
1594 538704 : real(r8) :: qiten(state%psetcols,pver)
1595 538704 : real(r8) :: ncten(state%psetcols,pver)
1596 538704 : real(r8) :: niten(state%psetcols,pver)
1597 :
1598 538704 : real(r8) :: qrten(state%psetcols,pver)
1599 538704 : real(r8) :: qsten(state%psetcols,pver)
1600 538704 : real(r8) :: nrten(state%psetcols,pver)
1601 538704 : real(r8) :: nsten(state%psetcols,pver)
1602 538704 : real(r8) :: qgten(state%psetcols,pver)
1603 538704 : real(r8) :: ngten(state%psetcols,pver)
1604 :
1605 538704 : real(r8) :: prect(state%psetcols)
1606 538704 : real(r8) :: preci(state%psetcols)
1607 538704 : real(r8) :: am_evp_st(state%psetcols,pver) ! Area over which precip evaporates
1608 538704 : real(r8) :: cmeice(state%psetcols,pver) ! Rate of cond-evap of ice within the cloud
1609 538704 : real(r8) :: qsout(state%psetcols,pver) ! Snow mixing ratio
1610 538704 : real(r8) :: cflx(state%psetcols,pverp) ! grid-box avg liq condensate flux (kg m^-2 s^-1)
1611 538704 : real(r8) :: iflx(state%psetcols,pverp) ! grid-box avg ice condensate flux (kg m^-2 s^-1)
1612 538704 : real(r8) :: rflx(state%psetcols,pverp) ! grid-box average rain flux (kg m^-2 s^-1)
1613 538704 : real(r8) :: sflx(state%psetcols,pverp) ! grid-box average snow flux (kg m^-2 s^-1)
1614 538704 : real(r8) :: gflx(state%psetcols,pverp) ! grid-box average snow flux (kg m^-2 s^-1)
1615 538704 : real(r8) :: qrout(state%psetcols,pver) ! Rain mixing ratio
1616 :
1617 538704 : real(r8) :: nrout(state%psetcols,pver)
1618 538704 : real(r8) :: nsout(state%psetcols,pver)
1619 538704 : real(r8) :: refl(state%psetcols,pver) ! analytic radar reflectivity
1620 538704 : real(r8) :: arefl(state%psetcols,pver) ! average reflectivity will zero points outside valid range
1621 538704 : real(r8) :: areflz(state%psetcols,pver) ! average reflectivity in z.
1622 538704 : real(r8) :: frefl(state%psetcols,pver)
1623 538704 : real(r8) :: csrfl(state%psetcols,pver) ! cloudsat reflectivity
1624 538704 : real(r8) :: acsrfl(state%psetcols,pver) ! cloudsat average
1625 538704 : real(r8) :: fcsrfl(state%psetcols,pver)
1626 538704 : real(r8) :: refl10cm(state%psetcols,pver) ! analytic radar reflectivity
1627 538704 : real(r8) :: reflz10cm(state%psetcols,pver) ! analytic radar reflectivity Z
1628 538704 : real(r8) :: rercld(state%psetcols,pver) ! effective radius calculation for rain + cloud
1629 538704 : real(r8) :: ncai(state%psetcols,pver) ! output number conc of ice nuclei available (1/m3)
1630 538704 : real(r8) :: ncal(state%psetcols,pver) ! output number conc of CCN (1/m3)
1631 538704 : real(r8) :: qrout2(state%psetcols,pver)
1632 538704 : real(r8) :: qsout2(state%psetcols,pver)
1633 538704 : real(r8) :: nrout2(state%psetcols,pver)
1634 538704 : real(r8) :: nsout2(state%psetcols,pver)
1635 538704 : real(r8) :: freqs(state%psetcols,pver)
1636 538704 : real(r8) :: freqr(state%psetcols,pver)
1637 538704 : real(r8) :: nfice(state%psetcols,pver)
1638 538704 : real(r8) :: qcrat(state%psetcols,pver) ! qc limiter ratio (1=no limit)
1639 :
1640 : !Hail/Graupel Output
1641 538704 : real(r8) :: freqg(state%psetcols,pver)
1642 538704 : real(r8) :: qgout(state%psetcols,pver)
1643 538704 : real(r8) :: ngout(state%psetcols,pver)
1644 538704 : real(r8) :: dgout(state%psetcols,pver)
1645 538704 : real(r8) :: qgout2(state%psetcols,pver)
1646 538704 : real(r8) :: ngout2(state%psetcols,pver)
1647 538704 : real(r8) :: dgout2(state%psetcols,pver)
1648 :
1649 : ! Dummy arrays for cases where we throw away the MG version and
1650 : ! recalculate sizes on the CAM grid to avoid time/subcolumn averaging
1651 : ! issues.
1652 538704 : real(r8) :: rel_fn_dum(state%ncol,pver)
1653 538704 : real(r8) :: dsout2_dum(state%ncol,pver)
1654 538704 : real(r8) :: drout_dum(state%ncol,pver)
1655 538704 : real(r8) :: reff_rain_dum(state%ncol,pver)
1656 538704 : real(r8) :: reff_snow_dum(state%ncol,pver)
1657 538704 : real(r8) :: reff_grau_dum(state%ncol,pver) !not used for now or passed to COSP.
1658 538704 : real(r8), target :: nan_array(state%ncol,pver) ! Array for NaN's
1659 :
1660 : ! Heterogeneous-only version of mnuccdtot.
1661 538704 : real(r8) :: mnuccdohet(state%psetcols,pver)
1662 :
1663 : ! physics buffer fields for COSP simulator
1664 269352 : real(r8), pointer :: mgflxprc(:,:) ! MG grid-box mean flux_large_scale_cloud_rain+snow at interfaces (kg/m2/s)
1665 269352 : real(r8), pointer :: mgflxsnw(:,:) ! MG grid-box mean flux_large_scale_cloud_snow at interfaces (kg/m2/s)
1666 269352 : real(r8), pointer :: mgmrprc(:,:) ! MG grid-box mean mixingratio_large_scale_cloud_rain+snow at interfaces (kg/kg)
1667 269352 : real(r8), pointer :: mgmrsnw(:,:) ! MG grid-box mean mixingratio_large_scale_cloud_snow at interfaces (kg/kg)
1668 269352 : real(r8), pointer :: mgreffrain_grid(:,:) ! MG diagnostic rain effective radius (um)
1669 269352 : real(r8), pointer :: mgreffsnow_grid(:,:) ! MG diagnostic snow effective radius (um)
1670 269352 : real(r8), pointer :: cvreffliq(:,:) ! convective cloud liquid effective radius (um)
1671 269352 : real(r8), pointer :: cvreffice(:,:) ! convective cloud ice effective radius (um)
1672 :
1673 : ! physics buffer fields used with CARMA
1674 269352 : real(r8), pointer, dimension(:,:) :: tnd_qsnow ! external tendency on snow mass (kg/kg/s)
1675 269352 : real(r8), pointer, dimension(:,:) :: tnd_nsnow ! external tendency on snow number(#/kg/s)
1676 269352 : real(r8), pointer, dimension(:,:) :: re_ice ! ice effective radius (m)
1677 :
1678 269352 : real(r8), pointer :: rate1ord_cw2pr_st(:,:) ! 1st order rate for direct conversion of
1679 : ! strat. cloud water to precip (1/s) ! rce 2010/05/01
1680 269352 : real(r8), pointer :: wsedl(:,:) ! Sedimentation velocity of liquid stratus cloud droplet [ m/s ]
1681 :
1682 :
1683 269352 : real(r8), pointer :: CC_T(:,:) ! Grid-mean microphysical tendency
1684 269352 : real(r8), pointer :: CC_qv(:,:) ! Grid-mean microphysical tendency
1685 269352 : real(r8), pointer :: CC_ql(:,:) ! Grid-mean microphysical tendency
1686 269352 : real(r8), pointer :: CC_qi(:,:) ! Grid-mean microphysical tendency
1687 269352 : real(r8), pointer :: CC_nl(:,:) ! Grid-mean microphysical tendency
1688 269352 : real(r8), pointer :: CC_ni(:,:) ! Grid-mean microphysical tendency
1689 269352 : real(r8), pointer :: CC_qlst(:,:) ! In-liquid stratus microphysical tendency
1690 :
1691 : ! variables for heterogeneous freezing
1692 269352 : real(r8), pointer :: frzimm(:,:)
1693 269352 : real(r8), pointer :: frzcnt(:,:)
1694 269352 : real(r8), pointer :: frzdep(:,:)
1695 :
1696 269352 : real(r8), pointer :: qme(:,:)
1697 :
1698 : ! A local copy of state is used for diagnostic calculations
1699 269352 : type(physics_state) :: state_loc
1700 11312784 : type(physics_ptend) :: ptend_loc
1701 :
1702 538704 : real(r8) :: icecldf(state%psetcols,pver) ! Ice cloud fraction
1703 538704 : real(r8) :: liqcldf(state%psetcols,pver) ! Liquid cloud fraction (combined into cloud)
1704 :
1705 269352 : real(r8), pointer :: rel(:,:) ! Liquid effective drop radius (microns)
1706 269352 : real(r8), pointer :: rei(:,:) ! Ice effective drop size (microns)
1707 269352 : real(r8), pointer :: sadice(:,:) ! Ice surface area density (cm2/cm3)
1708 269352 : real(r8), pointer :: sadsnow(:,:) ! Snow surface area density (cm2/cm3)
1709 :
1710 :
1711 269352 : real(r8), pointer :: cmeliq(:,:)
1712 :
1713 269352 : real(r8), pointer :: cld(:,:) ! Total cloud fraction
1714 269352 : real(r8), pointer :: concld(:,:) ! Convective cloud fraction
1715 269352 : real(r8), pointer :: prec_dp(:) ! Deep Convective precip
1716 269352 : real(r8), pointer :: prec_sh(:) ! Shallow Convective precip
1717 :
1718 269352 : real(r8), pointer :: iciwpst(:,:) ! Stratiform in-cloud ice water path for radiation
1719 269352 : real(r8), pointer :: iclwpst(:,:) ! Stratiform in-cloud liquid water path for radiation
1720 269352 : real(r8), pointer :: cldfsnow(:,:) ! Cloud fraction for liquid+snow
1721 269352 : real(r8), pointer :: icswp(:,:) ! In-cloud snow water path
1722 :
1723 269352 : real(r8), pointer :: cldfgrau(:,:) ! Cloud fraction for liquid+snow
1724 269352 : real(r8), pointer :: icgrauwp(:,:) ! In-cloud snow water path
1725 :
1726 538704 : real(r8) :: icimrst(state%psetcols,pver) ! In stratus ice mixing ratio
1727 538704 : real(r8) :: icwmrst(state%psetcols,pver) ! In stratus water mixing ratio
1728 538704 : real(r8) :: icinc(state%psetcols,pver) ! In cloud ice number conc
1729 538704 : real(r8) :: icwnc(state%psetcols,pver) ! In cloud water number conc
1730 :
1731 538704 : real(r8) :: iclwpi(state%psetcols) ! Vertically-integrated in-cloud Liquid WP before microphysics
1732 538704 : real(r8) :: iciwpi(state%psetcols) ! Vertically-integrated in-cloud Ice WP before microphysics
1733 :
1734 : ! Averaging arrays for effective radius and number....
1735 : real(r8) :: efiout_grid(pcols,pver)
1736 : real(r8) :: efcout_grid(pcols,pver)
1737 : real(r8) :: ncout_grid(pcols,pver)
1738 : real(r8) :: niout_grid(pcols,pver)
1739 : real(r8) :: freqi_grid(pcols,pver)
1740 : real(r8) :: freql_grid(pcols,pver)
1741 :
1742 : ! Averaging arrays for supercooled liquid
1743 : real(r8) :: freqm_grid(pcols,pver)
1744 : real(r8) :: freqsl_grid(pcols,pver)
1745 : real(r8) :: freqslm_grid(pcols,pver)
1746 : real(r8) :: fctm_grid(pcols)
1747 : real(r8) :: fctsl_grid(pcols)
1748 : real(r8) :: fctslm_grid(pcols)
1749 :
1750 : real(r8) :: cdnumc_grid(pcols) ! Vertically-integrated droplet concentration
1751 : real(r8) :: icimrst_grid_out(pcols,pver) ! In stratus ice mixing ratio
1752 : real(r8) :: icwmrst_grid_out(pcols,pver) ! In stratus water mixing ratio
1753 :
1754 : ! Cloud fraction used for precipitation.
1755 : real(r8) :: cldmax_grid(pcols,pver)
1756 :
1757 : ! Average cloud top radius & number
1758 : real(r8) :: ctrel_grid(pcols)
1759 : real(r8) :: ctrei_grid(pcols)
1760 : real(r8) :: ctnl_grid(pcols)
1761 : real(r8) :: ctni_grid(pcols)
1762 : real(r8) :: fcti_grid(pcols)
1763 : real(r8) :: fctl_grid(pcols)
1764 :
1765 : real(r8) :: ftem_grid(pcols,pver)
1766 :
1767 : ! Variables for precip efficiency calculation
1768 : real(r8) :: minlwp ! LWP threshold
1769 :
1770 269352 : real(r8), pointer, dimension(:) :: acprecl_grid ! accumulated precip across timesteps
1771 269352 : real(r8), pointer, dimension(:) :: acgcme_grid ! accumulated condensation across timesteps
1772 269352 : integer, pointer, dimension(:) :: acnum_grid ! counter for # timesteps accumulated
1773 :
1774 : ! Variables for liquid water path and column condensation
1775 : real(r8) :: tgliqwp_grid(pcols) ! column liquid
1776 : real(r8) :: tgcmeliq_grid(pcols) ! column condensation rate (units)
1777 :
1778 : real(r8) :: pe_grid(pcols) ! precip efficiency for output
1779 : real(r8) :: pefrac_grid(pcols) ! fraction of time precip efficiency is written out
1780 : real(r8) :: tpr_grid(pcols) ! average accumulated precipitation rate in pe calculation
1781 :
1782 : ! variables for autoconversion and accretion vertical averages
1783 : real(r8) :: vprco_grid(pcols) ! vertical average autoconversion
1784 : real(r8) :: vprao_grid(pcols) ! vertical average accretion
1785 : real(r8) :: racau_grid(pcols) ! ratio of vertical averages
1786 : integer :: cnt_grid(pcols) ! counters
1787 :
1788 : logical :: lq(pcnst)
1789 :
1790 : real(r8) :: icimrst_grid(pcols,pver) ! stratus ice mixing ratio - on grid
1791 : real(r8) :: icwmrst_grid(pcols,pver) ! stratus water mixing ratio - on grid
1792 :
1793 269352 : real(r8), pointer :: lambdac_grid(:,:)
1794 269352 : real(r8), pointer :: mu_grid(:,:)
1795 269352 : real(r8), pointer :: rel_grid(:,:)
1796 269352 : real(r8), pointer :: rei_grid(:,:)
1797 269352 : real(r8), pointer :: sadice_grid(:,:)
1798 269352 : real(r8), pointer :: sadsnow_grid(:,:)
1799 269352 : real(r8), pointer :: dei_grid(:,:)
1800 269352 : real(r8), pointer :: des_grid(:,:)
1801 269352 : real(r8), pointer :: iclwpst_grid(:,:)
1802 269352 : real(r8), pointer :: degrau_grid(:,:)
1803 :
1804 : real(r8) :: rho_grid(pcols,pver)
1805 : real(r8) :: liqcldf_grid(pcols,pver)
1806 : real(r8) :: qsout_grid(pcols,pver)
1807 : real(r8) :: ncic_grid(pcols,pver)
1808 : real(r8) :: niic_grid(pcols,pver)
1809 : real(r8) :: rel_fn_grid(pcols,pver) ! Ice effective drop size at fixed number (indirect effect) (microns) - on grid
1810 : real(r8) :: qrout_grid(pcols,pver)
1811 : real(r8) :: drout2_grid(pcols,pver)
1812 : real(r8) :: dsout2_grid(pcols,pver)
1813 : real(r8) :: nsout_grid(pcols,pver)
1814 : real(r8) :: nrout_grid(pcols,pver)
1815 : real(r8) :: reff_rain_grid(pcols,pver)
1816 : real(r8) :: reff_snow_grid(pcols,pver)
1817 : real(r8) :: reff_grau_grid(pcols,pver)
1818 : real(r8) :: cld_grid(pcols,pver)
1819 : real(r8) :: pdel_grid(pcols,pver)
1820 : real(r8) :: prco_grid(pcols,pver)
1821 : real(r8) :: prao_grid(pcols,pver)
1822 : real(r8) :: icecldf_grid(pcols,pver)
1823 : real(r8) :: icwnc_grid(pcols,pver)
1824 : real(r8) :: icinc_grid(pcols,pver)
1825 : real(r8) :: qcreso_grid(pcols,pver)
1826 : real(r8) :: melto_grid(pcols,pver)
1827 : real(r8) :: mnuccco_grid(pcols,pver)
1828 : real(r8) :: mnuccto_grid(pcols,pver)
1829 : real(r8) :: bergo_grid(pcols,pver)
1830 : real(r8) :: homoo_grid(pcols,pver)
1831 : real(r8) :: msacwio_grid(pcols,pver)
1832 : real(r8) :: psacwso_grid(pcols,pver)
1833 : real(r8) :: cmeiout_grid(pcols,pver)
1834 : real(r8) :: qireso_grid(pcols,pver)
1835 : real(r8) :: prcio_grid(pcols,pver)
1836 : real(r8) :: praio_grid(pcols,pver)
1837 : real(r8) :: psacro_grid(pcols,pver)
1838 : real(r8) :: pracgo_grid(pcols,pver)
1839 : real(r8) :: psacwgo_grid(pcols,pver)
1840 : real(r8) :: pgsacwo_grid(pcols,pver)
1841 : real(r8) :: pgracso_grid(pcols,pver)
1842 : real(r8) :: prdgo_grid(pcols,pver)
1843 : real(r8) :: qmultgo_grid(pcols,pver)
1844 : real(r8) :: qmultrgo_grid(pcols,pver)
1845 : real(r8) :: npracgo_grid(pcols,pver)
1846 : real(r8) :: nscngo_grid(pcols,pver)
1847 : real(r8) :: ngracso_grid(pcols,pver)
1848 : real(r8) :: nmultgo_grid(pcols,pver)
1849 : real(r8) :: nmultrgo_grid(pcols,pver)
1850 : real(r8) :: npsacwgo_grid(pcols,pver)
1851 : real(r8) :: qcsedtenout_grid(pcols,pver)
1852 : real(r8) :: qrsedtenout_grid(pcols,pver)
1853 : real(r8) :: qisedtenout_grid(pcols,pver)
1854 : real(r8) :: qssedtenout_grid(pcols,pver)
1855 : real(r8) :: vtrmcout_grid(pcols,pver)
1856 : real(r8) :: umrout_grid(pcols,pver)
1857 : real(r8) :: vtrmiout_grid(pcols,pver)
1858 : real(r8) :: umsout_grid(pcols,pver)
1859 : real(r8) :: qcsevapout_grid(pcols,pver)
1860 : real(r8) :: qisevapout_grid(pcols,pver)
1861 :
1862 : real(r8) :: nc_grid(pcols,pver)
1863 : real(r8) :: ni_grid(pcols,pver)
1864 : real(r8) :: qr_grid(pcols,pver)
1865 : real(r8) :: nr_grid(pcols,pver)
1866 : real(r8) :: qs_grid(pcols,pver)
1867 : real(r8) :: ns_grid(pcols,pver)
1868 : real(r8) :: qg_grid(pcols,pver)
1869 : real(r8) :: ng_grid(pcols,pver)
1870 :
1871 : real(r8) :: dgout2_grid(pcols,pver)
1872 :
1873 : real(r8) :: cp_rh(pcols,pver)
1874 : real(r8) :: cp_t(pcols)
1875 : real(r8) :: cp_z(pcols)
1876 : real(r8) :: cp_dt(pcols)
1877 : real(r8) :: cp_dz(pcols)
1878 : integer :: troplev(pcols)
1879 : real(r8) :: es
1880 : real(r8) :: qs
1881 :
1882 538704 : real(r8) :: state_loc_graup(state%psetcols,pver)
1883 538704 : real(r8) :: state_loc_numgraup(state%psetcols,pver)
1884 :
1885 269352 : real(r8), pointer :: cmeliq_grid(:,:)
1886 :
1887 269352 : real(r8), pointer :: prec_str_grid(:)
1888 269352 : real(r8), pointer :: snow_str_grid(:)
1889 269352 : real(r8), pointer :: prec_pcw_grid(:)
1890 269352 : real(r8), pointer :: snow_pcw_grid(:)
1891 269352 : real(r8), pointer :: prec_sed_grid(:)
1892 269352 : real(r8), pointer :: snow_sed_grid(:)
1893 269352 : real(r8), pointer :: cldo_grid(:,:)
1894 269352 : real(r8), pointer :: nevapr_grid(:,:)
1895 269352 : real(r8), pointer :: prain_grid(:,:)
1896 269352 : real(r8), pointer :: mgflxprc_grid(:,:)
1897 269352 : real(r8), pointer :: mgflxsnw_grid(:,:)
1898 269352 : real(r8), pointer :: mgmrprc_grid(:,:)
1899 269352 : real(r8), pointer :: mgmrsnw_grid(:,:)
1900 269352 : real(r8), pointer :: cvreffliq_grid(:,:)
1901 269352 : real(r8), pointer :: cvreffice_grid(:,:)
1902 269352 : real(r8), pointer :: rate1ord_cw2pr_st_grid(:,:)
1903 269352 : real(r8), pointer :: wsedl_grid(:,:)
1904 269352 : real(r8), pointer :: CC_t_grid(:,:)
1905 269352 : real(r8), pointer :: CC_qv_grid(:,:)
1906 269352 : real(r8), pointer :: CC_ql_grid(:,:)
1907 269352 : real(r8), pointer :: CC_qi_grid(:,:)
1908 269352 : real(r8), pointer :: CC_nl_grid(:,:)
1909 269352 : real(r8), pointer :: CC_ni_grid(:,:)
1910 269352 : real(r8), pointer :: CC_qlst_grid(:,:)
1911 269352 : real(r8), pointer :: qme_grid(:,:)
1912 269352 : real(r8), pointer :: iciwpst_grid(:,:)
1913 269352 : real(r8), pointer :: icswp_grid(:,:)
1914 269352 : real(r8), pointer :: ast_grid(:,:)
1915 269352 : real(r8), pointer :: cldfsnow_grid(:,:)
1916 269352 : real(r8), pointer :: bergso_grid(:,:)
1917 :
1918 269352 : real(r8), pointer :: icgrauwp_grid(:,:)
1919 269352 : real(r8), pointer :: cldfgrau_grid(:,:)
1920 :
1921 269352 : real(r8), pointer :: qrout_grid_ptr(:,:)
1922 269352 : real(r8), pointer :: qsout_grid_ptr(:,:)
1923 269352 : real(r8), pointer :: nrout_grid_ptr(:,:)
1924 269352 : real(r8), pointer :: nsout_grid_ptr(:,:)
1925 269352 : real(r8), pointer :: qcsedtenout_grid_ptr(:,:)
1926 269352 : real(r8), pointer :: qrsedtenout_grid_ptr(:,:)
1927 269352 : real(r8), pointer :: qisedtenout_grid_ptr(:,:)
1928 269352 : real(r8), pointer :: qssedtenout_grid_ptr(:,:)
1929 269352 : real(r8), pointer :: vtrmcout_grid_ptr(:,:)
1930 269352 : real(r8), pointer :: umrout_grid_ptr(:,:)
1931 269352 : real(r8), pointer :: vtrmiout_grid_ptr(:,:)
1932 269352 : real(r8), pointer :: umsout_grid_ptr(:,:)
1933 269352 : real(r8), pointer :: qcsevapout_grid_ptr(:,:)
1934 269352 : real(r8), pointer :: qisevapout_grid_ptr(:,:)
1935 :
1936 :
1937 : logical :: use_subcol_microp
1938 : integer :: col_type ! Flag to store whether accessing grid or sub-columns in pbuf_get_field
1939 : integer :: ierr
1940 : integer :: nlev
1941 :
1942 : character(128) :: errstring ! return status (non-blank for error return)
1943 :
1944 : ! For rrtmg optics. specified distribution.
1945 : real(r8), parameter :: dcon = 25.e-6_r8 ! Convective size distribution effective radius (meters)
1946 : real(r8), parameter :: mucon = 5.3_r8 ! Convective size distribution shape parameter
1947 : real(r8), parameter :: deicon = 50._r8 ! Convective ice effective diameter (meters)
1948 :
1949 : ! Rainbows: SZA
1950 538704 : real(r8) :: zen_angle(state%psetcols) ! Daytime solar zenith angles (radians)
1951 538704 : real(r8) :: rlats(state%psetcols), rlons(state%psetcols) ! chunk latitudes and longitudes (radians)
1952 538704 : real(r8) :: sza(state%psetcols) ! solar zenith angles (degrees)
1953 : real(r8), parameter :: rad2deg = 180._r8/pi ! radians to degrees conversion factor
1954 : real(r8) :: calday !current calendar day
1955 :
1956 538704 : real(r8) :: precc(state%psetcols) ! convective precip rate
1957 :
1958 : ! Rainbow frequency and fraction for output
1959 :
1960 538704 : real(r8) :: rbfreq(state%psetcols)
1961 538704 : real(r8) :: rbfrac(state%psetcols)
1962 :
1963 : !Rainbows: parameters
1964 :
1965 : real(r8), parameter :: rb_rmin =1.e-6_r8 ! Strat Rain threshold (mixing ratio)
1966 : real(r8), parameter :: rb_rcmin = 5._r8/(86400._r8*1000._r8) ! Conv Rain Threshold (mm/d--> m/s)
1967 : real(r8), parameter :: rb_pmin =85000._r8 ! Minimum pressure for surface layer
1968 : real(r8), parameter :: deg2rad = pi/180._r8 ! Conversion factor
1969 : integer :: top_idx !Index for top level below rb_pmin
1970 : real(r8) :: convmx
1971 : real(r8) :: cldmx
1972 : real(r8) :: frlow
1973 : real(r8) :: cldtot
1974 : real(r8) :: rmax
1975 : logical :: rval
1976 :
1977 : !-------------------------------------------------------------------------------
1978 :
1979 269352 : lchnk = state%lchnk
1980 269352 : ncol = state%ncol
1981 269352 : psetcols = state%psetcols
1982 269352 : ngrdcol = state%ngrdcol
1983 269352 : itim_old = pbuf_old_tim_idx()
1984 269352 : nlev = pver - top_lev + 1
1985 :
1986 269352 : nan_array = nan
1987 :
1988 : ! Allocate the proc_rates DDT
1989 : ! IMPORTANT NOTE -- elements in proc_rates are dimensioned to the nlev dimension while
1990 : ! all the other arrays in this routine are dimensioned pver. This is required because
1991 : ! PUMAS only gets the top_lev:pver array subsection, and the proc_rates arrays
1992 : ! need to be the same levels.
1993 269352 : call proc_rates%allocate(ncol, nlev, ncd, micro_mg_warm_rain, errstring)
1994 :
1995 269352 : call handle_errmsg(errstring, subname="micro_pumas_cam_tend")
1996 :
1997 :
1998 269352 : call phys_getopts(use_subcol_microp_out=use_subcol_microp)
1999 :
2000 : ! Set the col_type flag to grid or subcolumn dependent on the value of use_subcol_microp
2001 269352 : call pbuf_col_type_index(use_subcol_microp, col_type=col_type)
2002 :
2003 : !-----------------------
2004 : ! These physics buffer fields are read only and not set in this parameterization
2005 : ! If these fields do not have subcolumn data, copy the grid to the subcolumn if subcolumns is turned on
2006 : ! If subcolumns is not turned on, then these fields will be grid data
2007 :
2008 269352 : call pbuf_get_field(pbuf, naai_idx, naai, col_type=col_type, copy_if_needed=use_subcol_microp)
2009 269352 : call pbuf_get_field(pbuf, naai_hom_idx, naai_hom, col_type=col_type, copy_if_needed=use_subcol_microp)
2010 269352 : call pbuf_get_field(pbuf, npccn_idx, npccn, col_type=col_type, copy_if_needed=use_subcol_microp)
2011 269352 : call pbuf_get_field(pbuf, rndst_idx, rndst, col_type=col_type, copy_if_needed=use_subcol_microp)
2012 269352 : call pbuf_get_field(pbuf, nacon_idx, nacon, col_type=col_type, copy_if_needed=use_subcol_microp)
2013 269352 : call pbuf_get_field(pbuf, relvar_idx, relvar, col_type=col_type, copy_if_needed=use_subcol_microp)
2014 269352 : call pbuf_get_field(pbuf, accre_enhan_idx, accre_enhan, col_type=col_type, copy_if_needed=use_subcol_microp)
2015 269352 : call pbuf_get_field(pbuf, cmeliq_idx, cmeliq, col_type=col_type, copy_if_needed=use_subcol_microp)
2016 :
2017 : call pbuf_get_field(pbuf, cld_idx, cld, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), &
2018 1885464 : col_type=col_type, copy_if_needed=use_subcol_microp)
2019 : call pbuf_get_field(pbuf, concld_idx, concld, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), &
2020 1885464 : col_type=col_type, copy_if_needed=use_subcol_microp)
2021 : call pbuf_get_field(pbuf, ast_idx, ast, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), &
2022 1885464 : col_type=col_type, copy_if_needed=use_subcol_microp)
2023 :
2024 : ! Get convective precip for rainbows
2025 269352 : if (prec_dp_idx > 0) then
2026 269352 : call pbuf_get_field(pbuf, prec_dp_idx, prec_dp, col_type=col_type, copy_if_needed=use_subcol_microp)
2027 : else
2028 0 : nullify(prec_dp)
2029 : end if
2030 269352 : if (prec_sh_idx > 0) then
2031 269352 : call pbuf_get_field(pbuf, prec_sh_idx, prec_sh, col_type=col_type, copy_if_needed=use_subcol_microp)
2032 : else
2033 0 : nullify(prec_sh)
2034 : end if
2035 :
2036 : ! Merge Precipitation rates (multi-process)
2037 269352 : if (associated(prec_dp) .and. associated(prec_sh)) then
2038 4497552 : precc(:ncol) = prec_dp(:ncol) + prec_sh(:ncol)
2039 0 : else if (associated(prec_dp)) then
2040 0 : precc(:ncol) = prec_dp(:ncol)
2041 0 : else if (associated(prec_sh)) then
2042 0 : precc(:ncol) = prec_sh(:ncol)
2043 : else
2044 0 : precc(:ncol) = 0._r8
2045 : end if
2046 :
2047 269352 : if (.not. do_cldice) then
2048 : ! If we are NOT prognosing ice and snow tendencies, then get them from the Pbuf
2049 0 : call pbuf_get_field(pbuf, tnd_qsnow_idx, tnd_qsnow, col_type=col_type, copy_if_needed=use_subcol_microp)
2050 0 : call pbuf_get_field(pbuf, tnd_nsnow_idx, tnd_nsnow, col_type=col_type, copy_if_needed=use_subcol_microp)
2051 0 : call pbuf_get_field(pbuf, re_ice_idx, re_ice, col_type=col_type, copy_if_needed=use_subcol_microp)
2052 : else
2053 : ! If we ARE prognosing tendencies, then just point to an array of NaN fields to have
2054 : ! something for PUMAS to use in call
2055 269352 : tnd_qsnow => nan_array
2056 269352 : tnd_nsnow => nan_array
2057 269352 : re_ice => nan_array
2058 : end if
2059 :
2060 269352 : if (use_hetfrz_classnuc) then
2061 269352 : call pbuf_get_field(pbuf, frzimm_idx, frzimm, col_type=col_type, copy_if_needed=use_subcol_microp)
2062 269352 : call pbuf_get_field(pbuf, frzcnt_idx, frzcnt, col_type=col_type, copy_if_needed=use_subcol_microp)
2063 269352 : call pbuf_get_field(pbuf, frzdep_idx, frzdep, col_type=col_type, copy_if_needed=use_subcol_microp)
2064 : else
2065 : ! Needed to satisfy gnu compiler with optional argument - set to an array of Nan fields
2066 0 : frzimm => nan_array
2067 0 : frzcnt => nan_array
2068 0 : frzdep => nan_array
2069 : end if
2070 :
2071 269352 : if (qsatfac_idx > 0) then
2072 269352 : call pbuf_get_field(pbuf, qsatfac_idx, qsatfac, col_type=col_type, copy_if_needed=use_subcol_microp)
2073 : else
2074 0 : allocate(qsatfac(ncol,pver),stat=ierr)
2075 0 : call handle_allocate_error(ierr, 'micro_pumas_cam_tend', 'qsatfac')
2076 0 : qsatfac = 1._r8
2077 : end if
2078 :
2079 : ! initialize tendency variables
2080 4578984 : preci = 0._r8
2081 4578984 : prect = 0._r8
2082 :
2083 : ! initialize subcolumn variables
2084 269352 : if (use_subcol_microp) then
2085 0 : evapsnow_sc = 0.0_r8
2086 0 : bergstot_sc = 0.0_r8
2087 0 : qcrestot_sc = 0.0_r8
2088 0 : melttot_sc = 0.0_r8
2089 0 : mnuccctot_sc = 0.0_r8
2090 0 : mnuccttot_sc = 0.0_r8
2091 0 : bergtot_sc = 0.0_r8
2092 0 : homotot_sc = 0.0_r8
2093 0 : msacwitot_sc = 0.0_r8
2094 0 : psacwstot_sc = 0.0_r8
2095 0 : cmeitot_sc = 0.0_r8
2096 0 : qirestot_sc = 0.0_r8
2097 0 : prcitot_sc = 0.0_r8
2098 0 : praitot_sc = 0.0_r8
2099 0 : pratot_sc = 0.0_r8
2100 0 : prctot_sc = 0.0_r8
2101 0 : qcsedten_sc = 0.0_r8
2102 0 : qisedten_sc = 0.0_r8
2103 0 : vtrmc_sc = 0.0_r8
2104 0 : vtrmi_sc = 0.0_r8
2105 0 : qcsevap_sc = 0.0_r8
2106 0 : qisevap_sc = 0.0_r8
2107 0 : qrsedten_sc = 0.0_r8
2108 0 : qssedten_sc = 0.0_r8
2109 0 : umr_sc = 0.0_r8
2110 0 : ums_sc = 0.0_r8
2111 0 : if (micro_mg_version > 2) then
2112 0 : psacrtot_sc = 0.0_r8
2113 0 : pracgtot_sc = 0.0_r8
2114 0 : psacwgtot_sc = 0.0_r8
2115 0 : pgsacwtot_sc = 0.0_r8
2116 0 : pgracstot_sc = 0.0_r8
2117 0 : prdgtot_sc = 0.0_r8
2118 0 : qmultgtot_sc = 0.0_r8
2119 0 : qmultrgtot_sc = 0.0_r8
2120 0 : npracgtot_sc = 0.0_r8
2121 0 : nscngtot_sc = 0.0_r8
2122 0 : ngracstot_sc = 0.0_r8
2123 0 : nmultgtot_sc = 0.0_r8
2124 0 : nmultrgtot_sc = 0.0_r8
2125 0 : npsacwgtot_sc = 0.0_r8
2126 : end if
2127 : end if
2128 :
2129 : !-----------------------
2130 : ! These physics buffer fields are calculated and set in this parameterization
2131 : ! If subcolumns is turned on, then these fields will be calculated on a subcolumn grid, otherwise they will be a normal grid
2132 :
2133 269352 : call pbuf_get_field(pbuf, prec_str_idx, prec_str, col_type=col_type)
2134 269352 : call pbuf_get_field(pbuf, snow_str_idx, snow_str, col_type=col_type)
2135 269352 : call pbuf_get_field(pbuf, prec_pcw_idx, prec_pcw, col_type=col_type)
2136 269352 : call pbuf_get_field(pbuf, snow_pcw_idx, snow_pcw, col_type=col_type)
2137 269352 : call pbuf_get_field(pbuf, prec_sed_idx, prec_sed, col_type=col_type)
2138 269352 : call pbuf_get_field(pbuf, snow_sed_idx, snow_sed, col_type=col_type)
2139 269352 : call pbuf_get_field(pbuf, nevapr_idx, nevapr, col_type=col_type)
2140 269352 : call pbuf_get_field(pbuf, prer_evap_idx, prer_evap, col_type=col_type)
2141 269352 : call pbuf_get_field(pbuf, prain_idx, prain, col_type=col_type)
2142 269352 : call pbuf_get_field(pbuf, dei_idx, dei, col_type=col_type)
2143 269352 : call pbuf_get_field(pbuf, mu_idx, mu, col_type=col_type)
2144 269352 : call pbuf_get_field(pbuf, lambdac_idx, lambdac, col_type=col_type)
2145 269352 : call pbuf_get_field(pbuf, des_idx, des, col_type=col_type)
2146 269352 : call pbuf_get_field(pbuf, ls_flxprc_idx, mgflxprc, col_type=col_type)
2147 269352 : call pbuf_get_field(pbuf, ls_flxsnw_idx, mgflxsnw, col_type=col_type)
2148 269352 : call pbuf_get_field(pbuf, ls_mrprc_idx, mgmrprc, col_type=col_type)
2149 269352 : call pbuf_get_field(pbuf, ls_mrsnw_idx, mgmrsnw, col_type=col_type)
2150 269352 : call pbuf_get_field(pbuf, cv_reffliq_idx, cvreffliq, col_type=col_type)
2151 269352 : call pbuf_get_field(pbuf, cv_reffice_idx, cvreffice, col_type=col_type)
2152 269352 : call pbuf_get_field(pbuf, iciwpst_idx, iciwpst, col_type=col_type)
2153 269352 : call pbuf_get_field(pbuf, iclwpst_idx, iclwpst, col_type=col_type)
2154 269352 : call pbuf_get_field(pbuf, icswp_idx, icswp, col_type=col_type)
2155 269352 : call pbuf_get_field(pbuf, rel_idx, rel, col_type=col_type)
2156 269352 : call pbuf_get_field(pbuf, rei_idx, rei, col_type=col_type)
2157 269352 : call pbuf_get_field(pbuf, sadice_idx, sadice, col_type=col_type)
2158 269352 : call pbuf_get_field(pbuf, sadsnow_idx, sadsnow, col_type=col_type)
2159 269352 : call pbuf_get_field(pbuf, wsedl_idx, wsedl, col_type=col_type)
2160 269352 : call pbuf_get_field(pbuf, qme_idx, qme, col_type=col_type)
2161 269352 : call pbuf_get_field(pbuf, bergso_idx, bergstot, col_type=col_type)
2162 :
2163 : ! Assign the pointer values to the non-pointer proc_rates element
2164 378063720 : proc_rates%bergstot(:ncol,1:nlev) = bergstot(:ncol,top_lev:pver)
2165 :
2166 269352 : if (degrau_idx > 0) call pbuf_get_field(pbuf, degrau_idx, degrau, col_type=col_type)
2167 269352 : if (icgrauwp_idx > 0) call pbuf_get_field(pbuf, icgrauwp_idx, icgrauwp, col_type=col_type)
2168 269352 : if (cldfgrau_idx > 0) call pbuf_get_field(pbuf, cldfgrau_idx, cldfgrau, col_type=col_type)
2169 :
2170 1885464 : call pbuf_get_field(pbuf, cldo_idx, cldo, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
2171 1885464 : call pbuf_get_field(pbuf, cldfsnow_idx, cldfsnow, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
2172 1885464 : call pbuf_get_field(pbuf, cc_t_idx, CC_t, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
2173 1885464 : call pbuf_get_field(pbuf, cc_qv_idx, CC_qv, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
2174 1885464 : call pbuf_get_field(pbuf, cc_ql_idx, CC_ql, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
2175 1885464 : call pbuf_get_field(pbuf, cc_qi_idx, CC_qi, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
2176 1885464 : call pbuf_get_field(pbuf, cc_nl_idx, CC_nl, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
2177 1885464 : call pbuf_get_field(pbuf, cc_ni_idx, CC_ni, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
2178 1885464 : call pbuf_get_field(pbuf, cc_qlst_idx, CC_qlst, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
2179 :
2180 269352 : if (rate1_cw2pr_st_idx > 0) then
2181 269352 : call pbuf_get_field(pbuf, rate1_cw2pr_st_idx, rate1ord_cw2pr_st, col_type=col_type)
2182 : end if
2183 :
2184 269352 : if (qrain_idx > 0) call pbuf_get_field(pbuf, qrain_idx, qrout_grid_ptr)
2185 269352 : if (qsnow_idx > 0) call pbuf_get_field(pbuf, qsnow_idx, qsout_grid_ptr)
2186 269352 : if (nrain_idx > 0) call pbuf_get_field(pbuf, nrain_idx, nrout_grid_ptr)
2187 269352 : if (nsnow_idx > 0) call pbuf_get_field(pbuf, nsnow_idx, nsout_grid_ptr)
2188 269352 : if (qcsedten_idx > 0) call pbuf_get_field(pbuf, qcsedten_idx, qcsedtenout_grid_ptr)
2189 269352 : if (qrsedten_idx > 0) call pbuf_get_field(pbuf, qrsedten_idx, qrsedtenout_grid_ptr)
2190 269352 : if (qisedten_idx > 0) call pbuf_get_field(pbuf, qisedten_idx, qisedtenout_grid_ptr)
2191 269352 : if (qssedten_idx > 0) call pbuf_get_field(pbuf, qssedten_idx, qssedtenout_grid_ptr)
2192 269352 : if (vtrmc_idx > 0) call pbuf_get_field(pbuf, vtrmc_idx, vtrmcout_grid_ptr)
2193 269352 : if (umr_idx > 0) call pbuf_get_field(pbuf, umr_idx, umrout_grid_ptr)
2194 269352 : if (vtrmi_idx > 0) call pbuf_get_field(pbuf, vtrmi_idx, vtrmiout_grid_ptr)
2195 269352 : if (ums_idx > 0) call pbuf_get_field(pbuf, ums_idx, umsout_grid_ptr)
2196 269352 : if (qcsevap_idx > 0) call pbuf_get_field(pbuf, qcsevap_idx, qcsevapout_grid_ptr)
2197 269352 : if (qisevap_idx > 0) call pbuf_get_field(pbuf, qisevap_idx, qisevapout_grid_ptr)
2198 :
2199 : !-----------------------
2200 : ! If subcolumns is turned on, all calculated fields which are on subcolumns
2201 : ! need to be retrieved on the grid as well for storing averaged values
2202 :
2203 269352 : if (use_subcol_microp) then
2204 0 : call pbuf_get_field(pbuf, prec_str_idx, prec_str_grid)
2205 0 : call pbuf_get_field(pbuf, snow_str_idx, snow_str_grid)
2206 0 : call pbuf_get_field(pbuf, prec_pcw_idx, prec_pcw_grid)
2207 0 : call pbuf_get_field(pbuf, snow_pcw_idx, snow_pcw_grid)
2208 0 : call pbuf_get_field(pbuf, prec_sed_idx, prec_sed_grid)
2209 0 : call pbuf_get_field(pbuf, snow_sed_idx, snow_sed_grid)
2210 0 : call pbuf_get_field(pbuf, nevapr_idx, nevapr_grid)
2211 0 : call pbuf_get_field(pbuf, prain_idx, prain_grid)
2212 0 : call pbuf_get_field(pbuf, dei_idx, dei_grid)
2213 0 : call pbuf_get_field(pbuf, mu_idx, mu_grid)
2214 0 : call pbuf_get_field(pbuf, lambdac_idx, lambdac_grid)
2215 0 : call pbuf_get_field(pbuf, des_idx, des_grid)
2216 0 : call pbuf_get_field(pbuf, ls_flxprc_idx, mgflxprc_grid)
2217 0 : call pbuf_get_field(pbuf, ls_flxsnw_idx, mgflxsnw_grid)
2218 0 : call pbuf_get_field(pbuf, ls_mrprc_idx, mgmrprc_grid)
2219 0 : call pbuf_get_field(pbuf, ls_mrsnw_idx, mgmrsnw_grid)
2220 0 : call pbuf_get_field(pbuf, cv_reffliq_idx, cvreffliq_grid)
2221 0 : call pbuf_get_field(pbuf, cv_reffice_idx, cvreffice_grid)
2222 0 : call pbuf_get_field(pbuf, iciwpst_idx, iciwpst_grid)
2223 0 : call pbuf_get_field(pbuf, iclwpst_idx, iclwpst_grid)
2224 0 : call pbuf_get_field(pbuf, icswp_idx, icswp_grid)
2225 0 : call pbuf_get_field(pbuf, rel_idx, rel_grid)
2226 0 : call pbuf_get_field(pbuf, rei_idx, rei_grid)
2227 0 : call pbuf_get_field(pbuf, sadice_idx, sadice_grid)
2228 0 : call pbuf_get_field(pbuf, sadsnow_idx, sadsnow_grid)
2229 0 : call pbuf_get_field(pbuf, wsedl_idx, wsedl_grid)
2230 0 : call pbuf_get_field(pbuf, qme_idx, qme_grid)
2231 0 : call pbuf_get_field(pbuf, bergso_idx, bergso_grid)
2232 0 : if (degrau_idx > 0) call pbuf_get_field(pbuf, degrau_idx, degrau_grid)
2233 0 : if (icgrauwp_idx > 0) call pbuf_get_field(pbuf, icgrauwp_idx, icgrauwp_grid)
2234 0 : if (cldfgrau_idx > 0) call pbuf_get_field(pbuf, cldfgrau_idx, cldfgrau_grid)
2235 :
2236 0 : call pbuf_get_field(pbuf, cldo_idx, cldo_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2237 0 : call pbuf_get_field(pbuf, cldfsnow_idx, cldfsnow_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2238 0 : call pbuf_get_field(pbuf, cc_t_idx, CC_t_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2239 0 : call pbuf_get_field(pbuf, cc_qv_idx, CC_qv_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2240 0 : call pbuf_get_field(pbuf, cc_ql_idx, CC_ql_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2241 0 : call pbuf_get_field(pbuf, cc_qi_idx, CC_qi_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2242 0 : call pbuf_get_field(pbuf, cc_nl_idx, CC_nl_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2243 0 : call pbuf_get_field(pbuf, cc_ni_idx, CC_ni_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2244 0 : call pbuf_get_field(pbuf, cc_qlst_idx, CC_qlst_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2245 :
2246 0 : if (rate1_cw2pr_st_idx > 0) then
2247 0 : call pbuf_get_field(pbuf, rate1_cw2pr_st_idx, rate1ord_cw2pr_st_grid)
2248 : end if
2249 :
2250 : else
2251 269352 : allocate(bergso_grid(pcols,pver), stat=ierr)
2252 269352 : call handle_allocate_error(ierr, 'micro_pumas_cam_tend', 'bergso_grid')
2253 426114864 : bergso_grid(:,:) = 0._r8
2254 : end if
2255 :
2256 : !-----------------------
2257 : ! These are only on the grid regardless of whether subcolumns are turned on or not
2258 269352 : call pbuf_get_field(pbuf, ls_reffrain_idx, mgreffrain_grid)
2259 269352 : call pbuf_get_field(pbuf, ls_reffsnow_idx, mgreffsnow_grid)
2260 269352 : call pbuf_get_field(pbuf, acpr_idx, acprecl_grid)
2261 269352 : call pbuf_get_field(pbuf, acgcme_idx, acgcme_grid)
2262 269352 : call pbuf_get_field(pbuf, acnum_idx, acnum_grid)
2263 269352 : call pbuf_get_field(pbuf, cmeliq_idx, cmeliq_grid)
2264 1077408 : call pbuf_get_field(pbuf, ast_idx, ast_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
2265 :
2266 269352 : call pbuf_get_field(pbuf, evprain_st_idx, evprain_st_grid)
2267 269352 : call pbuf_get_field(pbuf, evpsnow_st_idx, evpsnow_st_grid)
2268 269352 : call pbuf_get_field(pbuf, am_evp_st_idx, am_evp_st_grid)
2269 :
2270 : !-----------------------------------------------------------------------
2271 : ! ... Calculate cosine of zenith angle
2272 : ! then cast back to angle (radians)
2273 : !-----------------------------------------------------------------------
2274 :
2275 4578984 : zen_angle(:) = 0.0_r8
2276 4578984 : rlats(:) = 0.0_r8
2277 4578984 : rlons(:) = 0.0_r8
2278 269352 : calday = get_curr_calday()
2279 269352 : call get_rlat_all_p( lchnk, ncol, rlats )
2280 269352 : call get_rlon_all_p( lchnk, ncol, rlons )
2281 269352 : call zenith( calday, rlats, rlons, zen_angle, ncol )
2282 17507880 : where (zen_angle(:) <= 1.0_r8 .and. zen_angle(:) >= -1.0_r8)
2283 : zen_angle(:) = acos( zen_angle(:) )
2284 : elsewhere
2285 : zen_angle(:) = 0.0_r8
2286 : end where
2287 :
2288 4578984 : sza(:) = zen_angle(:) * rad2deg
2289 269352 : call outfld( 'rbSZA', sza, ncol, lchnk )
2290 :
2291 : !-------------------------------------------------------------------------------------
2292 : ! Microphysics assumes 'liquid stratus frac = ice stratus frac
2293 : ! = max( liquid stratus frac, ice stratus frac )'.
2294 269352 : alst_mic => ast
2295 269352 : aist_mic => ast
2296 :
2297 : ! Output initial in-cloud LWP (before microphysics)
2298 :
2299 4578984 : iclwpi = 0._r8
2300 4578984 : iciwpi = 0._r8
2301 :
2302 4497552 : do i = 1, ncol
2303 359666352 : do k = top_lev, pver
2304 355168800 : iclwpi(i) = iclwpi(i) + &
2305 0 : min(state%q(i,k,ixcldliq) / max(mincld,ast(i,k)),0.005_r8) &
2306 710337600 : * state%pdel(i,k) / gravit
2307 : iciwpi(i) = iciwpi(i) + &
2308 355168800 : min(state%q(i,k,ixcldice) / max(mincld,ast(i,k)),0.005_r8) &
2309 714565800 : * state%pdel(i,k) / gravit
2310 : end do
2311 : end do
2312 :
2313 755858088 : cldo(:ncol,top_lev:pver)=ast(:ncol,top_lev:pver)
2314 :
2315 : ! Initialize local state from input.
2316 269352 : call physics_state_copy(state, state_loc)
2317 :
2318 : ! Because of the of limited vertical resolution, there can be a signifcant
2319 : ! warm bias at the cold point tropopause, which can create a wet bias in the
2320 : ! stratosphere. For the microphysics only, update the cold point temperature, with
2321 : ! an estimate of the coldest point between the model layers.
2322 269352 : if (micro_mg_adjust_cpt) then
2323 0 : cp_rh(:ncol, :pver) = 0._r8
2324 0 : cp_dt(:ncol) = 0._r8
2325 0 : cp_dz(:ncol) = 0._r8
2326 :
2327 : !REMOVECAM - no longer need this when CAM is retired and pcols no longer exists
2328 0 : troplev(:) = 0
2329 0 : cp_z(:) = 0._r8
2330 0 : cp_t(:) = 0._r8
2331 : !REMOVECAM_END
2332 : call tropopause_find_cam(state_loc, troplev, primary=TROP_ALG_CPP, backup=TROP_ALG_NONE, &
2333 0 : tropZ=cp_z, tropT=cp_t)
2334 :
2335 0 : do i = 1, ncol
2336 :
2337 : ! Update statistics and output results.
2338 0 : if (troplev(i) .ne. NOTFOUND) then
2339 0 : cp_dt(i) = cp_t(i) - state_loc%t(i,troplev(i))
2340 0 : cp_dz(i) = cp_z(i) - state_loc%zm(i,troplev(i))
2341 :
2342 : ! NOTE: This change in temperature is just for the microphysics
2343 : ! and should not be added to any tendencies or used to update
2344 : ! any states
2345 0 : state_loc%t(i,troplev(i)) = state_loc%t(i,troplev(i)) + cp_dt(i)
2346 : end if
2347 : end do
2348 :
2349 : ! Output all of the statistics related to the cold point
2350 : ! tropopause adjustment. Th cold point information itself is
2351 : ! output in tropopause.F90.
2352 0 : call outfld("TROPF_TADJ", state_loc%t, pcols, lchnk)
2353 0 : call outfld("TROPF_CDT", cp_dt, pcols, lchnk)
2354 0 : call outfld("TROPF_CDZ", cp_dz, pcols, lchnk)
2355 : end if
2356 :
2357 : ! Initialize ptend for output.
2358 269352 : lq = .false.
2359 269352 : lq(ixq) = .true.
2360 269352 : lq(ixcldliq) = .true.
2361 269352 : lq(ixcldice) = .true.
2362 269352 : lq(ixnumliq) = .true.
2363 269352 : lq(ixnumice) = .true.
2364 269352 : lq(ixrain) = .true.
2365 269352 : lq(ixsnow) = .true.
2366 269352 : lq(ixnumrain) = .true.
2367 269352 : lq(ixnumsnow) = .true.
2368 269352 : if (micro_mg_version > 2) then
2369 269352 : lq(ixgraupel) = .true.
2370 269352 : lq(ixnumgraupel) = .true.
2371 : end if
2372 :
2373 : ! the name 'cldwat' triggers special tests on cldliq
2374 : ! and cldice in physics_update
2375 269352 : call physics_ptend_init(ptend, psetcols, "cldwat", ls=.true., lq=lq)
2376 :
2377 269352 : if (micro_mg_version > 2) then
2378 418541688 : state_loc_graup(:ncol,:) = state_loc%q(:ncol,:,ixgraupel)
2379 418541688 : state_loc_numgraup(:ncol,:) = state_loc%q(:ncol,:,ixnumgraupel)
2380 : else
2381 0 : state_loc_graup(:ncol,:) = 0._r8
2382 0 : state_loc_numgraup(:ncol,:) = 0._r8
2383 : end if
2384 :
2385 : ! Zero out diagnostic rainbow arrays
2386 4578984 : rbfreq = 0._r8
2387 4578984 : rbfrac = 0._r8
2388 :
2389 : ! Zero out values above top_lev before passing into _tend for some pbuf variables that are inputs
2390 40747320 : naai(:ncol,:top_lev-1) = 0._r8
2391 40747320 : npccn(:ncol,:top_lev-1) = 0._r8
2392 :
2393 : ! The null value for qsatfac is 1, not zero
2394 40747320 : qsatfac(:ncol,:top_lev-1) = 1._r8
2395 :
2396 : ! Zero out values above top_lev for all output variables
2397 : ! Note that elements in proc_rates do not have the extra levels as they are dimensioned to be nlev instead of pver
2398 40747320 : tlat(:ncol,:top_lev-1)=0._r8
2399 40747320 : qvlat(:ncol,:top_lev-1)=0._r8
2400 40747320 : qcten(:ncol,:top_lev-1)=0._r8
2401 40747320 : qiten(:ncol,:top_lev-1)=0._r8
2402 40747320 : ncten(:ncol,:top_lev-1)=0._r8
2403 40747320 : niten(:ncol,:top_lev-1)=0._r8
2404 40747320 : qrten(:ncol,:top_lev-1)=0._r8
2405 40747320 : qsten(:ncol,:top_lev-1)=0._r8
2406 40747320 : nrten(:ncol,:top_lev-1)=0._r8
2407 40747320 : nsten(:ncol,:top_lev-1)=0._r8
2408 40747320 : qgten(:ncol,:top_lev-1)=0._r8
2409 40747320 : ngten(:ncol,:top_lev-1)=0._r8
2410 40747320 : rel(:ncol,:top_lev-1)=0._r8
2411 40747320 : rel_fn_dum(:ncol,:top_lev-1)=0._r8
2412 40747320 : rei(:ncol,:top_lev-1)=0._r8
2413 40747320 : sadice(:ncol,:top_lev-1)=0._r8
2414 40747320 : sadsnow(:ncol,:top_lev-1)=0._r8
2415 4497552 : prect(:ncol)=0._r8
2416 4497552 : preci(:ncol)=0._r8
2417 40747320 : nevapr(:ncol,:top_lev-1)=0._r8
2418 40747320 : am_evp_st(:ncol,:top_lev-1)=0._r8
2419 40747320 : prain(:ncol,:top_lev-1)=0._r8
2420 40747320 : cmeice(:ncol,:top_lev-1)=0._r8
2421 40747320 : dei(:ncol,:top_lev-1)=0._r8
2422 40747320 : mu(:ncol,:top_lev-1)=0._r8
2423 40747320 : lambdac(:ncol,:top_lev-1)=0._r8
2424 40747320 : qsout(:ncol,:top_lev-1)=0._r8
2425 40747320 : des(:ncol,:top_lev-1)=0._r8
2426 40747320 : qgout(:ncol,:top_lev-1)=0._r8
2427 40747320 : ngout(:ncol,:top_lev-1)=0._r8
2428 40747320 : dgout(:ncol,:top_lev-1)=0._r8
2429 40747320 : cflx(:ncol,:top_lev-1)=0._r8
2430 40747320 : iflx(:ncol,:top_lev-1)=0._r8
2431 40747320 : gflx(:ncol,:top_lev-1)=0._r8
2432 40747320 : rflx(:ncol,:top_lev-1)=0._r8
2433 40747320 : sflx(:ncol,:top_lev-1)=0._r8
2434 40747320 : qrout(:ncol,:top_lev-1)=0._r8
2435 40747320 : reff_rain_dum(:ncol,:top_lev-1)=0._r8
2436 40747320 : reff_snow_dum(:ncol,:top_lev-1)=0._r8
2437 40747320 : reff_grau_dum(:ncol,:top_lev-1)=0._r8
2438 40747320 : nrout(:ncol,:top_lev-1)=0._r8
2439 40747320 : nsout(:ncol,:top_lev-1)=0._r8
2440 40747320 : refl(:ncol,:top_lev-1)=0._r8
2441 40747320 : arefl(:ncol,:top_lev-1)=0._r8
2442 40747320 : areflz(:ncol,:top_lev-1)=0._r8
2443 40747320 : frefl(:ncol,:top_lev-1)=0._r8
2444 40747320 : csrfl(:ncol,:top_lev-1)=0._r8
2445 40747320 : acsrfl(:ncol,:top_lev-1)=0._r8
2446 40747320 : fcsrfl(:ncol,:top_lev-1)=0._r8
2447 40747320 : refl10cm(:ncol,:top_lev-1)=-9999._r8
2448 40747320 : reflz10cm(:ncol,:top_lev-1)=0._r8
2449 40747320 : rercld(:ncol,:top_lev-1)=0._r8
2450 40747320 : ncai(:ncol,:top_lev-1)=0._r8
2451 40747320 : ncal(:ncol,:top_lev-1)=0._r8
2452 40747320 : qrout2(:ncol,:top_lev-1)=0._r8
2453 40747320 : qsout2(:ncol,:top_lev-1)=0._r8
2454 40747320 : nrout2(:ncol,:top_lev-1)=0._r8
2455 40747320 : nsout2(:ncol,:top_lev-1)=0._r8
2456 40747320 : qgout2(:ncol,:top_lev-1)=0._r8
2457 40747320 : ngout2(:ncol,:top_lev-1)=0._r8
2458 40747320 : dgout2(:ncol,:top_lev-1)=0._r8
2459 40747320 : freqg(:ncol,:top_lev-1)=0._r8
2460 40747320 : freqs(:ncol,:top_lev-1)=0._r8
2461 40747320 : freqr(:ncol,:top_lev-1)=0._r8
2462 40747320 : nfice(:ncol,:top_lev-1)=0._r8
2463 40747320 : qcrat(:ncol,:top_lev-1)=0._r8
2464 40747320 : tnd_qsnow(:ncol,:top_lev-1)=0._r8
2465 40747320 : tnd_nsnow(:ncol,:top_lev-1)=0._r8
2466 40747320 : re_ice(:ncol,:top_lev-1)=0._r8
2467 40747320 : prer_evap(:ncol,:top_lev-1)=0._r8
2468 40747320 : frzimm(:ncol,:top_lev-1)=0._r8
2469 40747320 : frzcnt(:ncol,:top_lev-1)=0._r8
2470 40747320 : frzdep(:ncol,:top_lev-1)=0._r8
2471 :
2472 538704 : do it = 1, num_steps
2473 :
2474 : call micro_pumas_tend( &
2475 : ncol, nlev, dtime/num_steps,&
2476 0 : state_loc%t(:ncol,top_lev:), state_loc%q(:ncol,top_lev:,ixq), &
2477 0 : state_loc%q(:ncol,top_lev:,ixcldliq), state_loc%q(:ncol,top_lev:,ixcldice), &
2478 0 : state_loc%q(:ncol,top_lev:,ixnumliq), state_loc%q(:ncol,top_lev:,ixnumice), &
2479 0 : state_loc%q(:ncol,top_lev:,ixrain), state_loc%q(:ncol,top_lev:,ixsnow), &
2480 0 : state_loc%q(:ncol,top_lev:,ixnumrain), state_loc%q(:ncol,top_lev:,ixnumsnow), &
2481 269352 : state_loc_graup(:ncol,top_lev:), state_loc_numgraup(:ncol,top_lev:), &
2482 0 : relvar(:ncol,top_lev:), accre_enhan(:ncol,top_lev:), &
2483 0 : state_loc%pmid(:ncol,top_lev:), state_loc%pdel(:ncol,top_lev:), state_loc%pint(:ncol,top_lev:), &
2484 0 : ast(:ncol,top_lev:), alst_mic(:ncol,top_lev:), aist_mic(:ncol,top_lev:), qsatfac(:ncol,top_lev:), &
2485 336168 : rate1cld(:ncol,top_lev:), &
2486 0 : naai(:ncol,top_lev:), npccn(:ncol,top_lev:), &
2487 0 : rndst(:ncol,top_lev:,:), nacon(:ncol,top_lev:,:), &
2488 402984 : tlat(:ncol,top_lev:), qvlat(:ncol,top_lev:), &
2489 133632 : qcten(:ncol,top_lev:), qiten(:ncol,top_lev:), &
2490 133632 : ncten(:ncol,top_lev:), niten(:ncol,top_lev:), &
2491 133632 : qrten(:ncol,top_lev:), qsten(:ncol,top_lev:), &
2492 133632 : nrten(:ncol,top_lev:), nsten(:ncol,top_lev:), &
2493 133632 : qgten(:ncol,top_lev:), ngten(:ncol,top_lev:), &
2494 269352 : rel(:ncol,top_lev:), rel_fn_dum(:ncol,top_lev:), rei(:ncol,top_lev:), &
2495 0 : sadice(:ncol,top_lev:), sadsnow(:ncol,top_lev:), &
2496 269352 : prect(:ncol), preci(:ncol), &
2497 336168 : nevapr(:ncol,top_lev:), am_evp_st(:ncol,top_lev:), &
2498 0 : prain(:ncol,top_lev:), &
2499 336168 : cmeice(:ncol,top_lev:), dei(:ncol,top_lev:), &
2500 0 : mu(:ncol,top_lev:), lambdac(:ncol,top_lev:), &
2501 336168 : qsout(:ncol,top_lev:), des(:ncol,top_lev:), &
2502 469800 : qgout(:ncol,top_lev:), ngout(:ncol,top_lev:), dgout(:ncol,top_lev:), &
2503 133632 : cflx(:ncol,top_lev:), iflx(:ncol,top_lev:), &
2504 66816 : gflx(:ncol,top_lev:), &
2505 200448 : rflx(:ncol,top_lev:), sflx(:ncol,top_lev:), qrout(:ncol,top_lev:), &
2506 269352 : reff_rain_dum(:ncol,top_lev:), reff_snow_dum(:ncol,top_lev:), reff_grau_dum(:ncol,top_lev:), &
2507 133632 : nrout(:ncol,top_lev:), nsout(:ncol,top_lev:), &
2508 200448 : refl(:ncol,top_lev:), arefl(:ncol,top_lev:), areflz(:ncol,top_lev:), &
2509 536616 : frefl(:ncol,top_lev:), csrfl(:ncol,top_lev:), acsrfl(:ncol,top_lev:), &
2510 66816 : fcsrfl(:ncol,top_lev:), &
2511 200448 : refl10cm(:ncol,top_lev:), reflz10cm(:ncol,top_lev:), rercld(:ncol,top_lev:), &
2512 133632 : ncai(:ncol,top_lev:), ncal(:ncol,top_lev:), &
2513 133632 : qrout2(:ncol,top_lev:), qsout2(:ncol,top_lev:), &
2514 133632 : nrout2(:ncol,top_lev:), nsout2(:ncol,top_lev:), &
2515 269352 : drout_dum(:ncol,top_lev:), dsout2_dum(:ncol,top_lev:), &
2516 267264 : qgout2(:ncol,top_lev:), ngout2(:ncol,top_lev:), dgout2(:ncol,top_lev:), freqg(:ncol,top_lev:), &
2517 402984 : freqs(:ncol,top_lev:), freqr(:ncol,top_lev:), &
2518 133632 : nfice(:ncol,top_lev:), qcrat(:ncol,top_lev:), &
2519 : proc_rates, &
2520 : errstring, &
2521 0 : tnd_qsnow(:ncol,top_lev:),tnd_nsnow(:ncol,top_lev:),re_ice(:ncol,top_lev:),&
2522 0 : prer_evap(:ncol,top_lev:), &
2523 5859387360 : frzimm(:ncol,top_lev:), frzcnt(:ncol,top_lev:), frzdep(:ncol,top_lev:) )
2524 :
2525 269352 : call handle_errmsg(errstring, subname="micro_pumas_cam_tend")
2526 :
2527 : call physics_ptend_init(ptend_loc, psetcols, "micro_pumas", &
2528 269352 : ls=.true., lq=lq)
2529 :
2530 : ! Set local tendency.
2531 378063720 : ptend_loc%s(:ncol,top_lev:) = tlat(:ncol,top_lev:)
2532 378063720 : ptend_loc%q(:ncol,top_lev:,ixq) = qvlat(:ncol,top_lev:)
2533 378063720 : ptend_loc%q(:ncol,top_lev:,ixcldliq) = qcten(:ncol,top_lev:)
2534 378063720 : ptend_loc%q(:ncol,top_lev:,ixcldice) = qiten(:ncol,top_lev:)
2535 378063720 : ptend_loc%q(:ncol,top_lev:,ixnumliq) = ncten(:ncol,top_lev:)
2536 :
2537 269352 : if (do_cldice) then
2538 378063720 : ptend_loc%q(:ncol,top_lev:,ixnumice) = niten(:ncol,top_lev:)
2539 : else
2540 : ! In this case, the tendency should be all 0.
2541 0 : if (any(niten(:ncol,:) /= 0._r8)) then
2542 : call endrun("micro_pumas_cam:ERROR - MG microphysics is configured not to prognose cloud ice,"// &
2543 0 : " but micro_pumas_tend has ice number tendencies.")
2544 : end if
2545 0 : ptend_loc%q(:ncol,:,ixnumice) = 0._r8
2546 : end if
2547 :
2548 378063720 : ptend_loc%q(:ncol,top_lev:,ixrain) = qrten(:ncol,top_lev:)
2549 378063720 : ptend_loc%q(:ncol,top_lev:,ixsnow) = qsten(:ncol,top_lev:)
2550 378063720 : ptend_loc%q(:ncol,top_lev:,ixnumrain) = nrten(:ncol,top_lev:)
2551 378063720 : ptend_loc%q(:ncol,top_lev:,ixnumsnow) = nsten(:ncol,top_lev:)
2552 :
2553 269352 : if (micro_mg_version > 2) then
2554 378063720 : ptend_loc%q(:ncol,top_lev:,ixgraupel) = qgten(:ncol,top_lev:)
2555 378063720 : ptend_loc%q(:ncol,top_lev:,ixnumgraupel) = ngten(:ncol,top_lev:)
2556 : end if
2557 :
2558 : ! Sum into overall ptend
2559 269352 : call physics_ptend_sum(ptend_loc, ptend, ncol)
2560 :
2561 : ! Update local state
2562 269352 : call physics_update(state_loc, ptend_loc, dtime/num_steps)
2563 :
2564 538704 : if (trim(micro_mg_warm_rain) == 'tau') then
2565 0 : proc_rates%amk_c(:ncol,:,:) = proc_rates%amk_c(:ncol,:,:)/num_steps
2566 0 : proc_rates%ank_c(:ncol,:,:) = proc_rates%ank_c(:ncol,:,:)/num_steps
2567 0 : proc_rates%amk_r(:ncol,:,:) = proc_rates%amk_r(:ncol,:,:)/num_steps
2568 0 : proc_rates%ank_r(:ncol,:,:) = proc_rates%ank_r(:ncol,:,:)/num_steps
2569 0 : proc_rates%amk(:ncol,:,:) = proc_rates%amk(:ncol,:,:)/num_steps
2570 0 : proc_rates%ank(:ncol,:,:) = proc_rates%ank(:ncol,:,:)/num_steps
2571 0 : proc_rates%amk_out(:ncol,:,:) = proc_rates%amk_out(:ncol,:,:)/num_steps
2572 : end if
2573 :
2574 : end do
2575 :
2576 : ! Divide ptend by substeps.
2577 269352 : call physics_ptend_scale(ptend, 1._r8/num_steps, ncol)
2578 :
2579 : ! Check to make sure that the microphysics code is respecting the flags that control
2580 : ! whether MG should be prognosing cloud ice and cloud liquid or not.
2581 269352 : if (.not. do_cldice) then
2582 0 : if (any(ptend%q(:ncol,top_lev:pver,ixcldice) /= 0.0_r8)) &
2583 : call endrun("micro_pumas_cam:ERROR - MG microphysics is configured not to prognose cloud ice,"// &
2584 0 : " but micro_pumas_tend has ice mass tendencies.")
2585 0 : if (any(ptend%q(:ncol,top_lev:pver,ixnumice) /= 0.0_r8)) &
2586 : call endrun("micro_pumas_cam:ERROR - MG microphysics is configured not to prognose cloud ice,"// &
2587 0 : " but micro_pumas_tend has ice number tendencies.")
2588 : end if
2589 269352 : if (.not. do_cldliq) then
2590 0 : if (any(ptend%q(:ncol,top_lev:pver,ixcldliq) /= 0.0_r8)) &
2591 : call endrun("micro_pumas_cam:ERROR - MG microphysics is configured not to prognose cloud liquid,"// &
2592 0 : " but micro_pumas_tend has liquid mass tendencies.")
2593 0 : if (any(ptend%q(:ncol,top_lev:pver,ixnumliq) /= 0.0_r8)) &
2594 : call endrun("micro_pumas_cam:ERROR - MG microphysics is configured not to prognose cloud liquid,"// &
2595 0 : " but micro_pumas_tend has liquid number tendencies.")
2596 : end if
2597 :
2598 426114864 : mnuccdohet = 0._r8
2599 22894920 : do k=top_lev,pver
2600 378063720 : do i=1,ncol
2601 377794368 : if (naai(i,k) > 0._r8) then
2602 10301119 : mnuccdohet(i,k) = proc_rates%mnuccdtot(i,k-top_lev+1) - (naai_hom(i,k)/naai(i,k))*proc_rates%mnuccdtot(i,k-top_lev+1)
2603 : end if
2604 : end do
2605 : end do
2606 :
2607 382561272 : mgflxprc(:ncol,top_lev:pverp) = rflx(:ncol,top_lev:pverp) + sflx(:ncol,top_lev:pverp)
2608 382561272 : mgflxsnw(:ncol,top_lev:pverp) = sflx(:ncol,top_lev:pverp)
2609 :
2610 : !add condensate fluxes for MG2 (ice and snow already added for MG1)
2611 269352 : if (micro_mg_version >= 2) then
2612 382561272 : mgflxprc(:ncol,top_lev:pverp) = mgflxprc(:ncol,top_lev:pverp)+ iflx(:ncol,top_lev:pverp) + cflx(:ncol,top_lev:pverp)
2613 382561272 : mgflxsnw(:ncol,top_lev:pverp) = mgflxsnw(:ncol,top_lev:pverp) + iflx(:ncol,top_lev:pverp)
2614 : end if
2615 :
2616 : !add graupel fluxes for MG3 to snow flux
2617 269352 : if (micro_mg_version >= 3) then
2618 382561272 : mgflxprc(:ncol,top_lev:pverp) = mgflxprc(:ncol,top_lev:pverp)+gflx(:ncol,top_lev:pverp)
2619 382561272 : mgflxsnw(:ncol,top_lev:pverp) = mgflxsnw(:ncol,top_lev:pverp)+gflx(:ncol,top_lev:pverp)
2620 : end if
2621 :
2622 378063720 : mgmrprc(:ncol,top_lev:pver) = qrout(:ncol,top_lev:pver) + qsout(:ncol,top_lev:pver)
2623 378063720 : mgmrsnw(:ncol,top_lev:pver) = qsout(:ncol,top_lev:pver)
2624 :
2625 : !! calculate effective radius of convective liquid and ice using dcon and deicon (not used by code, not useful for COSP)
2626 : !! hard-coded as average of hard-coded values used for deep/shallow convective detrainment (near line 1502/1505)
2627 378063720 : cvreffliq(:ncol,top_lev:pver) = 9.0_r8
2628 378063720 : cvreffice(:ncol,top_lev:pver) = 37.0_r8
2629 :
2630 : ! Reassign rate1 if modal aerosols
2631 269352 : if (rate1_cw2pr_st_idx > 0) then
2632 378063720 : rate1ord_cw2pr_st(:ncol,top_lev:pver) = rate1cld(:ncol,top_lev:pver)
2633 : end if
2634 :
2635 : ! Sedimentation velocity for liquid stratus cloud droplet
2636 378063720 : wsedl(:ncol,top_lev:pver) = proc_rates%vtrmc(:ncol,1:nlev)
2637 :
2638 : ! Microphysical tendencies for use in the macrophysics at the next time step
2639 378063720 : CC_T(:ncol,top_lev:pver) = tlat(:ncol,top_lev:pver)/cpair
2640 378063720 : CC_qv(:ncol,top_lev:pver) = qvlat(:ncol,top_lev:pver)
2641 378063720 : CC_ql(:ncol,top_lev:pver) = qcten(:ncol,top_lev:pver)
2642 378063720 : CC_qi(:ncol,top_lev:pver) = qiten(:ncol,top_lev:pver)
2643 378063720 : CC_nl(:ncol,top_lev:pver) = ncten(:ncol,top_lev:pver)
2644 378063720 : CC_ni(:ncol,top_lev:pver) = niten(:ncol,top_lev:pver)
2645 755858088 : CC_qlst(:ncol,top_lev:pver) = qcten(:ncol,top_lev:pver)/max(0.01_r8,alst_mic(:ncol,top_lev:pver))
2646 :
2647 : ! Net micro_pumas_cam condensation rate
2648 40747320 : qme(:ncol,:top_lev-1) = 0._r8
2649 755858088 : qme(:ncol,top_lev:pver) = cmeliq(:ncol,top_lev:pver) + proc_rates%cmeitot(:ncol,1:nlev)
2650 :
2651 : ! For precip, accumulate only total precip in prec_pcw and snow_pcw variables.
2652 : ! Other precip output variables are set to 0
2653 : ! Do not subscript by ncol here, because in physpkg we divide the whole
2654 : ! array and need to avoid an FPE due to uninitialized data.
2655 4578984 : prec_pcw = prect
2656 4578984 : snow_pcw = preci
2657 4578984 : prec_sed = 0._r8
2658 4578984 : snow_sed = 0._r8
2659 8888616 : prec_str = prec_pcw + prec_sed
2660 8888616 : snow_str = snow_pcw + snow_sed
2661 :
2662 378063720 : icecldf(:ncol,top_lev:pver) = ast(:ncol,top_lev:pver)
2663 378063720 : liqcldf(:ncol,top_lev:pver) = ast(:ncol,top_lev:pver)
2664 :
2665 : ! ------------------------------------------------------------ !
2666 : ! Compute in cloud ice and liquid mixing ratios !
2667 : ! Note that 'iclwp, iciwp' are used for radiation computation. !
2668 : ! ------------------------------------------------------------ !
2669 :
2670 426114864 : icinc = 0._r8
2671 426114864 : icwnc = 0._r8
2672 426114864 : iciwpst = 0._r8
2673 426114864 : iclwpst = 0._r8
2674 426114864 : icswp = 0._r8
2675 426114864 : cldfsnow = 0._r8
2676 269352 : if (micro_mg_version > 2) then
2677 426114864 : icgrauwp = 0._r8
2678 426114864 : cldfgrau = 0._r8
2679 : end if
2680 :
2681 22894920 : do k = top_lev, pver
2682 378063720 : do i = 1, ncol
2683 : ! Limits for in-cloud mixing ratios consistent with MG microphysics
2684 : ! in-cloud mixing ratio maximum limit of 0.005 kg/kg
2685 355168800 : icimrst(i,k) = min( state_loc%q(i,k,ixcldice) / max(mincld,icecldf(i,k)),0.005_r8 )
2686 355168800 : icwmrst(i,k) = min( state_loc%q(i,k,ixcldliq) / max(mincld,liqcldf(i,k)),0.005_r8 )
2687 0 : icinc(i,k) = state_loc%q(i,k,ixnumice) / max(mincld,icecldf(i,k)) * &
2688 355168800 : state_loc%pmid(i,k) / (287.15_r8*state_loc%t(i,k))
2689 0 : icwnc(i,k) = state_loc%q(i,k,ixnumliq) / max(mincld,liqcldf(i,k)) * &
2690 355168800 : state_loc%pmid(i,k) / (287.15_r8*state_loc%t(i,k))
2691 : ! Calculate micro_pumas_cam cloud water paths in each layer
2692 : ! Note: uses stratiform cloud fraction!
2693 355168800 : iciwpst(i,k) = min(state_loc%q(i,k,ixcldice)/max(mincld,ast(i,k)),0.005_r8) * state_loc%pdel(i,k) / gravit
2694 355168800 : iclwpst(i,k) = min(state_loc%q(i,k,ixcldliq)/max(mincld,ast(i,k)),0.005_r8) * state_loc%pdel(i,k) / gravit
2695 :
2696 : ! ------------------------------ !
2697 : ! Adjust cloud fraction for snow !
2698 : ! ------------------------------ !
2699 355168800 : cldfsnow(i,k) = cld(i,k)
2700 : ! If cloud and only ice ( no convective cloud or ice ), then set to 0.
2701 0 : if( ( cldfsnow(i,k) .gt. 1.e-4_r8 ) .and. &
2702 710337600 : ( concld(i,k) .lt. 1.e-4_r8 ) .and. &
2703 355168800 : ( state_loc%q(i,k,ixcldliq) .lt. 1.e-10_r8 ) ) then
2704 26628884 : cldfsnow(i,k) = 0._r8
2705 : end if
2706 : ! If no cloud and snow, then set to 0.25
2707 355168800 : if( ( cldfsnow(i,k) .le. 1.e-4_r8 ) .and. ( qsout(i,k) .gt. 1.e-6_r8 ) ) then
2708 14706154 : cldfsnow(i,k) = 0.25_r8
2709 : end if
2710 : ! Calculate in-cloud snow water path
2711 355168800 : icswp(i,k) = qsout(i,k) / max( mincld, cldfsnow(i,k) ) * state_loc%pdel(i,k) / gravit
2712 :
2713 : ! --------------------------------- !
2714 : ! Adjust cloud fraction for graupel !
2715 : ! --------------------------------- !
2716 377794368 : if (micro_mg_version > 2) then
2717 355168800 : cldfgrau(i,k) = cld(i,k)
2718 : ! If cloud and only ice ( no convective cloud or ice ), then set to 0.
2719 0 : if( ( cldfgrau(i,k) .gt. 1.e-4_r8 ) .and. &
2720 710337600 : ( concld(i,k) .lt. 1.e-4_r8 ) .and. &
2721 355168800 : ( state_loc%q(i,k,ixcldliq) .lt. 1.e-10_r8 ) ) then
2722 26628884 : cldfgrau(i,k) = 0._r8
2723 : end if
2724 : ! If no cloud and graupel, then set to 0.25
2725 355168800 : if( ( cldfgrau(i,k) .le. 1.e-4_r8 ) .and. ( qgout(i,k) .gt. 1.e-9_r8 ) ) then
2726 3350778 : cldfgrau(i,k) = 0.25_r8
2727 : end if
2728 :
2729 : ! Calculate in-cloud snow water path
2730 355168800 : icgrauwp(i,k) = qgout(i,k) / max( 1.e-2_r8, cldfgrau(i,k) ) * state_loc%pdel(i,k) / gravit
2731 : end if
2732 :
2733 : end do
2734 : end do
2735 :
2736 : ! Calculate cloud fraction for prognostic precip sizes.
2737 : ! Cloud fraction for purposes of precipitation is maximum cloud
2738 : ! fraction out of all the layers that the precipitation may be
2739 : ! falling down from.
2740 378063720 : cldmax(:ncol,top_lev:) = max(mincld, ast(:ncol,top_lev:))
2741 22625568 : do k = top_lev+1, pver
2742 0 : where (state_loc%q(:ncol,k-1,ixrain) >= qsmall .or. &
2743 395922384 : state_loc%q(:ncol,k-1,ixsnow) >= qsmall)
2744 22356216 : cldmax(:ncol,k) = max(cldmax(:ncol,k-1), cldmax(:ncol,k))
2745 : end where
2746 : end do
2747 :
2748 : !Copy pbuf field from proc_rates back to pbuf pointer
2749 378063720 : bergstot(:ncol,top_lev:) = proc_rates%bergstot(:ncol,1:nlev)
2750 40747320 : bergstot(:ncol,1:top_lev-1) = 0._r8
2751 :
2752 : ! ------------------------------------------------------ !
2753 : ! ------------------------------------------------------ !
2754 : ! All code from here to the end is on grid columns only !
2755 : ! ------------------------------------------------------ !
2756 : ! ------------------------------------------------------ !
2757 :
2758 : ! Average the fields which are needed later in this paramterization to be on the grid
2759 269352 : if (use_subcol_microp) then
2760 0 : call subcol_field_avg(prec_str, ngrdcol, lchnk, prec_str_grid)
2761 0 : call subcol_field_avg(iclwpst, ngrdcol, lchnk, iclwpst_grid)
2762 0 : call subcol_field_avg(cvreffliq, ngrdcol, lchnk, cvreffliq_grid)
2763 0 : call subcol_field_avg(cvreffice, ngrdcol, lchnk, cvreffice_grid)
2764 0 : call subcol_field_avg(mgflxprc, ngrdcol, lchnk, mgflxprc_grid)
2765 0 : call subcol_field_avg(mgflxsnw, ngrdcol, lchnk, mgflxsnw_grid)
2766 0 : call subcol_field_avg(qme, ngrdcol, lchnk, qme_grid)
2767 0 : call subcol_field_avg(nevapr, ngrdcol, lchnk, nevapr_grid)
2768 0 : call subcol_field_avg(prain, ngrdcol, lchnk, prain_grid)
2769 :
2770 0 : evapsnow_sc(:ncol,:) = proc_rates%evapsnow(:ncol,1:nlev)
2771 0 : call subcol_field_avg(evapsnow_sc, ngrdcol, lchnk, evpsnow_st_grid(:,top_lev:))
2772 0 : bergstot_sc(:ncol,:) = proc_rates%bergstot(:ncol,1:nlev)
2773 0 : call subcol_field_avg(bergstot_sc, ngrdcol, lchnk, bergso_grid(:,top_lev:))
2774 :
2775 0 : call subcol_field_avg(am_evp_st, ngrdcol, lchnk, am_evp_st_grid)
2776 :
2777 : ! Average fields which are not in pbuf
2778 0 : call subcol_field_avg(qrout, ngrdcol, lchnk, qrout_grid)
2779 0 : call subcol_field_avg(qsout, ngrdcol, lchnk, qsout_grid)
2780 0 : call subcol_field_avg(nsout, ngrdcol, lchnk, nsout_grid)
2781 0 : call subcol_field_avg(nrout, ngrdcol, lchnk, nrout_grid)
2782 0 : call subcol_field_avg(cld, ngrdcol, lchnk, cld_grid)
2783 :
2784 0 : qcrestot_sc(:ncol,:) = proc_rates%qcrestot(:ncol,1:nlev)
2785 0 : call subcol_field_avg(qcrestot_sc, ngrdcol, lchnk, qcreso_grid(:,top_lev:))
2786 0 : melttot_sc(:ncol,:) = proc_rates%melttot(:ncol,1:nlev)
2787 0 : call subcol_field_avg(melttot_sc, ngrdcol, lchnk, melto_grid(:,top_lev:))
2788 0 : mnuccctot_sc(:ncol,:) = proc_rates%mnuccctot(:ncol,1:nlev)
2789 0 : call subcol_field_avg(mnuccctot_sc, ngrdcol, lchnk, mnuccco_grid(:,top_lev:))
2790 0 : mnuccttot_sc(:ncol,:) = proc_rates%mnuccttot(:ncol,1:nlev)
2791 0 : call subcol_field_avg(mnuccttot_sc, ngrdcol, lchnk, mnuccto_grid(:,top_lev:))
2792 0 : bergtot_sc(:ncol,:) = proc_rates%bergtot(:ncol,1:nlev)
2793 0 : call subcol_field_avg(bergtot_sc, ngrdcol, lchnk, bergo_grid(:,top_lev:))
2794 0 : homotot_sc(:ncol,:) = proc_rates%homotot(:ncol,1:nlev)
2795 0 : call subcol_field_avg(homotot_sc, ngrdcol, lchnk, homoo_grid(:,top_lev:))
2796 0 : msacwitot_sc(:ncol,:) = proc_rates%msacwitot(:ncol,1:nlev)
2797 0 : call subcol_field_avg(msacwitot_sc, ngrdcol, lchnk, msacwio_grid(:,top_lev:))
2798 0 : psacwstot_sc(:ncol,:) = proc_rates%psacwstot(:ncol,1:nlev)
2799 0 : call subcol_field_avg(psacwstot_sc, ngrdcol, lchnk, psacwso_grid(:,top_lev:))
2800 0 : cmeitot_sc(:ncol,:) = proc_rates%cmeitot(:ncol,1:nlev)
2801 0 : call subcol_field_avg(cmeitot_sc, ngrdcol, lchnk, cmeiout_grid(:,top_lev:))
2802 0 : qirestot_sc(:ncol,:) = proc_rates%qirestot(:ncol,1:nlev)
2803 0 : call subcol_field_avg(qirestot_sc, ngrdcol, lchnk, qireso_grid(:,top_lev:))
2804 0 : prcitot_sc(:ncol,:) = proc_rates%prcitot(:ncol,1:nlev)
2805 0 : call subcol_field_avg(prcitot_sc, ngrdcol, lchnk, prcio_grid(:,top_lev:))
2806 0 : praitot_sc(:ncol,:) = proc_rates%praitot(:ncol,1:nlev)
2807 0 : call subcol_field_avg(praitot_sc, ngrdcol, lchnk, praio_grid(:,top_lev:))
2808 :
2809 0 : call subcol_field_avg(icwmrst, ngrdcol, lchnk, icwmrst_grid)
2810 0 : call subcol_field_avg(icimrst, ngrdcol, lchnk, icimrst_grid)
2811 0 : call subcol_field_avg(liqcldf, ngrdcol, lchnk, liqcldf_grid)
2812 0 : call subcol_field_avg(icecldf, ngrdcol, lchnk, icecldf_grid)
2813 0 : call subcol_field_avg(icwnc, ngrdcol, lchnk, icwnc_grid)
2814 0 : call subcol_field_avg(icinc, ngrdcol, lchnk, icinc_grid)
2815 0 : call subcol_field_avg(state_loc%pdel, ngrdcol, lchnk, pdel_grid)
2816 :
2817 0 : pratot_sc(:ncol,:) = proc_rates%pratot(:ncol,1:nlev)
2818 0 : call subcol_field_avg(pratot_sc, ngrdcol, lchnk, prao_grid(:,top_lev:))
2819 0 : prctot_sc(:ncol,:) = proc_rates%prctot(:ncol,1:nlev)
2820 0 : call subcol_field_avg(prctot_sc, ngrdcol, lchnk, prco_grid(:,top_lev:))
2821 :
2822 0 : call subcol_field_avg(state_loc%q(:,:,ixnumliq), ngrdcol, lchnk, nc_grid(:,top_lev:))
2823 0 : call subcol_field_avg(state_loc%q(:,:,ixnumice), ngrdcol, lchnk, ni_grid(:,top_lev:))
2824 :
2825 0 : qcsedten_sc(:ncol,:) = proc_rates%qcsedten(:ncol,1:nlev)
2826 0 : call subcol_field_avg(qcsedten_sc, ngrdcol, lchnk, qcsedtenout_grid(:,top_lev:))
2827 0 : qisedten_sc(:ncol,:) = proc_rates%qisedten(:ncol,1:nlev)
2828 0 : call subcol_field_avg(qisedten_sc, ngrdcol, lchnk, qisedtenout_grid(:,top_lev:))
2829 0 : vtrmc_sc(:ncol,:) = proc_rates%vtrmc(:ncol,1:nlev)
2830 0 : call subcol_field_avg(vtrmc_sc, ngrdcol, lchnk, vtrmcout_grid(:,top_lev:))
2831 0 : vtrmi_sc(:ncol,:) = proc_rates%vtrmi(:ncol,1:nlev)
2832 0 : call subcol_field_avg(vtrmi_sc, ngrdcol, lchnk, vtrmiout_grid(:,top_lev:))
2833 0 : qcsevap_sc(:ncol,:) = proc_rates%qcsevap(:ncol,1:nlev)
2834 0 : call subcol_field_avg(qcsevap_sc, ngrdcol, lchnk, qcsevapout_grid(:,top_lev:))
2835 0 : qisevap_sc(:ncol,:) = proc_rates%qisevap(:ncol,1:nlev)
2836 0 : call subcol_field_avg(qisevap_sc, ngrdcol, lchnk, qisevapout_grid(:,top_lev:))
2837 :
2838 0 : call subcol_field_avg(cldmax, ngrdcol, lchnk, cldmax_grid)
2839 :
2840 0 : call subcol_field_avg(state_loc%q(:,:,ixrain), ngrdcol, lchnk, qr_grid)
2841 0 : call subcol_field_avg(state_loc%q(:,:,ixnumrain), ngrdcol, lchnk, nr_grid)
2842 0 : call subcol_field_avg(state_loc%q(:,:,ixsnow), ngrdcol, lchnk, qs_grid)
2843 0 : call subcol_field_avg(state_loc%q(:,:,ixnumsnow), ngrdcol, lchnk, ns_grid)
2844 :
2845 0 : qrsedten_sc(:ncol,:) = proc_rates%qrsedten(:ncol,1:nlev)
2846 0 : call subcol_field_avg(qrsedten_sc, ngrdcol, lchnk, qrsedtenout_grid(:,top_lev:))
2847 0 : qssedten_sc(:ncol,:) = proc_rates%qssedten(:ncol,1:nlev)
2848 0 : call subcol_field_avg(qssedten_sc, ngrdcol, lchnk, qssedtenout_grid(:,top_lev:))
2849 0 : umr_sc(:ncol,:) = proc_rates%umr(:ncol,1:nlev)
2850 0 : call subcol_field_avg(umr_sc, ngrdcol, lchnk, umrout_grid(:,top_lev:))
2851 0 : ums_sc(:ncol,:) = proc_rates%ums(:ncol,1:nlev)
2852 0 : call subcol_field_avg(ums_sc, ngrdcol, lchnk, umsout_grid(:,top_lev:))
2853 :
2854 0 : if (micro_mg_version > 2) then
2855 0 : call subcol_field_avg(state_loc%q(:,:,ixgraupel), ngrdcol, lchnk, qg_grid)
2856 0 : call subcol_field_avg(state_loc%q(:,:,ixnumgraupel), ngrdcol, lchnk, ng_grid)
2857 :
2858 0 : psacrtot_sc(:ncol,:) = proc_rates%psacrtot(:ncol,1:nlev)
2859 0 : call subcol_field_avg(psacrtot_sc, ngrdcol, lchnk, psacro_grid(:,top_lev:))
2860 0 : pracgtot_sc(:ncol,:) = proc_rates%pracgtot(:ncol,1:nlev)
2861 0 : call subcol_field_avg(pracgtot_sc, ngrdcol, lchnk, pracgo_grid(:,top_lev:))
2862 0 : psacwgtot_sc(:ncol,:) = proc_rates%psacwgtot(:ncol,1:nlev)
2863 0 : call subcol_field_avg(psacwgtot_sc, ngrdcol, lchnk, psacwgo_grid(:,top_lev:))
2864 0 : pgsacwtot_sc(:ncol,:) = proc_rates%pgsacwtot(:ncol,1:nlev)
2865 0 : call subcol_field_avg(pgsacwtot_sc, ngrdcol, lchnk, pgsacwo_grid(:,top_lev:))
2866 0 : pgracstot_sc(:ncol,:) = proc_rates%pgracstot(:ncol,1:nlev)
2867 0 : call subcol_field_avg(pgracstot_sc, ngrdcol, lchnk, pgracso_grid(:,top_lev:))
2868 0 : prdgtot_sc(:ncol,:) = proc_rates%prdgtot(:ncol,1:nlev)
2869 0 : call subcol_field_avg(prdgtot_sc, ngrdcol, lchnk, prdgo_grid(:,top_lev:))
2870 0 : qmultgtot_sc(:ncol,:) = proc_rates%qmultgtot(:ncol,1:nlev)
2871 0 : call subcol_field_avg(qmultgtot_sc, ngrdcol, lchnk, qmultgo_grid(:,top_lev:))
2872 0 : qmultrgtot_sc(:ncol,:) = proc_rates%qmultrgtot(:ncol,1:nlev)
2873 0 : call subcol_field_avg(qmultrgtot_sc, ngrdcol, lchnk, qmultrgo_grid(:,top_lev:))
2874 0 : npracgtot_sc(:ncol,:) = proc_rates%npracgtot(:ncol,1:nlev)
2875 0 : call subcol_field_avg(npracgtot_sc, ngrdcol, lchnk, npracgo_grid(:,top_lev:))
2876 0 : nscngtot_sc(:ncol,:) = proc_rates%nscngtot(:ncol,1:nlev)
2877 0 : call subcol_field_avg(nscngtot_sc, ngrdcol, lchnk, nscngo_grid(:,top_lev:))
2878 0 : ngracstot_sc(:ncol,:) = proc_rates%ngracstot(:ncol,1:nlev)
2879 0 : call subcol_field_avg(ngracstot_sc, ngrdcol, lchnk, ngracso_grid(:,top_lev:))
2880 0 : nmultgtot_sc(:ncol,:) = proc_rates%nmultgtot(:ncol,1:nlev)
2881 0 : call subcol_field_avg(nmultgtot_sc, ngrdcol, lchnk, nmultgo_grid(:,top_lev:))
2882 0 : nmultrgtot_sc(:ncol,:) = proc_rates%nmultrgtot(:ncol,1:nlev)
2883 0 : call subcol_field_avg(nmultrgtot_sc, ngrdcol, lchnk, nmultrgo_grid(:,top_lev:))
2884 0 : npsacwgtot_sc(:ncol,:) = proc_rates%npsacwgtot(:ncol,1:nlev)
2885 0 : call subcol_field_avg(npsacwgtot_sc, ngrdcol, lchnk, npsacwgo_grid(:,top_lev:))
2886 : end if
2887 :
2888 : else
2889 40747320 : qcreso_grid(:ncol,:top_lev-1) = 0._r8
2890 40747320 : melto_grid(:ncol,:top_lev-1) = 0._r8
2891 40747320 : mnuccco_grid(:ncol,:top_lev-1) = 0._r8
2892 40747320 : mnuccto_grid(:ncol,:top_lev-1) = 0._r8
2893 40747320 : bergo_grid(:ncol,:top_lev-1) = 0._r8
2894 40747320 : homoo_grid(:ncol,:top_lev-1) = 0._r8
2895 40747320 : msacwio_grid(:ncol,:top_lev-1) = 0._r8
2896 40747320 : psacwso_grid(:ncol,:top_lev-1) = 0._r8
2897 40747320 : cmeiout_grid(:ncol,:top_lev-1) = 0._r8
2898 40747320 : qireso_grid(:ncol,:top_lev-1) = 0._r8
2899 40747320 : prcio_grid(:ncol,:top_lev-1) = 0._r8
2900 40747320 : praio_grid(:ncol,:top_lev-1) = 0._r8
2901 40747320 : prao_grid(:ncol,:top_lev-1) = 0._r8
2902 40747320 : prco_grid(:ncol,:top_lev-1) = 0._r8
2903 40747320 : qcsedtenout_grid(:ncol,:top_lev-1) = 0._r8
2904 40747320 : qisedtenout_grid(:ncol,:top_lev-1) = 0._r8
2905 40747320 : vtrmcout_grid(:ncol,:top_lev-1) = 0._r8
2906 40747320 : vtrmiout_grid(:ncol,:top_lev-1) = 0._r8
2907 40747320 : qcsevapout_grid(:ncol,:top_lev-1) = 0._r8
2908 40747320 : qisevapout_grid(:ncol,:top_lev-1) = 0._r8
2909 40747320 : qrsedtenout_grid(:ncol,:top_lev-1) = 0._r8
2910 40747320 : qssedtenout_grid(:ncol,:top_lev-1) = 0._r8
2911 40747320 : umrout_grid(:ncol,:top_lev-1) = 0._r8
2912 40747320 : umsout_grid(:ncol,:top_lev-1) = 0._r8
2913 40747320 : psacro_grid(:ncol,:top_lev-1) = 0._r8
2914 40747320 : pracgo_grid(:ncol,:top_lev-1) = 0._r8
2915 40747320 : psacwgo_grid(:ncol,:top_lev-1) = 0._r8
2916 40747320 : pgsacwo_grid(:ncol,:top_lev-1) = 0._r8
2917 40747320 : pgracso_grid(:ncol,:top_lev-1) = 0._r8
2918 40747320 : prdgo_grid(:ncol,:top_lev-1) = 0._r8
2919 40747320 : qmultgo_grid(:ncol,:top_lev-1) = 0._r8
2920 40747320 : qmultrgo_grid(:ncol,:top_lev-1) = 0._r8
2921 40747320 : npracgo_grid(:ncol,:top_lev-1) = 0._r8
2922 40747320 : nscngo_grid(:ncol,:top_lev-1) = 0._r8
2923 40747320 : ngracso_grid(:ncol,:top_lev-1) = 0._r8
2924 40747320 : nmultgo_grid(:ncol,:top_lev-1) = 0._r8
2925 40747320 : nmultrgo_grid(:ncol,:top_lev-1) = 0._r8
2926 40747320 : npsacwgo_grid(:ncol,:top_lev-1) = 0._r8
2927 40747320 : bergso_grid(:ncol,:top_lev-1) = 0._r8
2928 :
2929 : ! These pbuf fields need to be assigned. There is no corresponding subcol_field_avg
2930 : ! as they are reset before being used, so it would be a needless calculation
2931 269352 : lambdac_grid => lambdac
2932 269352 : mu_grid => mu
2933 269352 : rel_grid => rel
2934 269352 : rei_grid => rei
2935 269352 : sadice_grid => sadice
2936 269352 : sadsnow_grid => sadsnow
2937 269352 : dei_grid => dei
2938 269352 : des_grid => des
2939 269352 : degrau_grid => degrau
2940 :
2941 : ! fields already on grids, so just assign
2942 269352 : prec_str_grid => prec_str
2943 269352 : iclwpst_grid => iclwpst
2944 269352 : cvreffliq_grid => cvreffliq
2945 269352 : cvreffice_grid => cvreffice
2946 269352 : mgflxprc_grid => mgflxprc
2947 269352 : mgflxsnw_grid => mgflxsnw
2948 269352 : qme_grid => qme
2949 269352 : nevapr_grid => nevapr
2950 269352 : prain_grid => prain
2951 :
2952 378063720 : bergso_grid(:ncol,top_lev:) = proc_rates%bergstot
2953 426114864 : am_evp_st_grid = am_evp_st
2954 :
2955 378063720 : evpsnow_st_grid(:ncol,top_lev:) = proc_rates%evapsnow
2956 426114864 : qrout_grid = qrout
2957 426114864 : qsout_grid = qsout
2958 426114864 : nsout_grid = nsout
2959 426114864 : nrout_grid = nrout
2960 426114864 : cld_grid = cld
2961 378063720 : qcreso_grid(:ncol,top_lev:) = proc_rates%qcrestot
2962 378063720 : melto_grid(:ncol,top_lev:) = proc_rates%melttot
2963 378063720 : mnuccco_grid(:ncol,top_lev:) = proc_rates%mnuccctot
2964 378063720 : mnuccto_grid(:ncol,top_lev:) = proc_rates%mnuccttot
2965 378063720 : bergo_grid(:ncol,top_lev:) = proc_rates%bergtot
2966 378063720 : homoo_grid(:ncol,top_lev:) = proc_rates%homotot
2967 378063720 : msacwio_grid(:ncol,top_lev:) = proc_rates%msacwitot
2968 378063720 : psacwso_grid(:ncol,top_lev:) = proc_rates%psacwstot
2969 378063720 : cmeiout_grid(:ncol,top_lev:) = proc_rates%cmeitot
2970 378063720 : qireso_grid(:ncol,top_lev:) = proc_rates%qirestot
2971 378063720 : prcio_grid(:ncol,top_lev:) = proc_rates%prcitot
2972 378063720 : praio_grid(:ncol,top_lev:) = proc_rates%praitot
2973 426114864 : icwmrst_grid = icwmrst
2974 426114864 : icimrst_grid = icimrst
2975 426114864 : liqcldf_grid = liqcldf
2976 426114864 : icecldf_grid = icecldf
2977 426114864 : icwnc_grid = icwnc
2978 426114864 : icinc_grid = icinc
2979 426114864 : pdel_grid = state_loc%pdel
2980 378063720 : prao_grid(:ncol,top_lev:) = proc_rates%pratot
2981 378063720 : prco_grid(:ncol,top_lev:) = proc_rates%prctot
2982 :
2983 426114864 : nc_grid = state_loc%q(:,:,ixnumliq)
2984 426114864 : ni_grid = state_loc%q(:,:,ixnumice)
2985 :
2986 378063720 : qcsedtenout_grid(:ncol,top_lev:) = proc_rates%qcsedten
2987 378063720 : qisedtenout_grid(:ncol,top_lev:) = proc_rates%qisedten
2988 378063720 : vtrmcout_grid(:ncol,top_lev:) = proc_rates%vtrmc
2989 378063720 : vtrmiout_grid(:ncol,top_lev:) = proc_rates%vtrmi
2990 378063720 : qcsevapout_grid(:ncol,top_lev:) = proc_rates%qcsevap
2991 378063720 : qisevapout_grid(:ncol,top_lev:) = proc_rates%qisevap
2992 :
2993 426114864 : cldmax_grid = cldmax
2994 :
2995 426114864 : qr_grid = state_loc%q(:,:,ixrain)
2996 426114864 : nr_grid = state_loc%q(:,:,ixnumrain)
2997 426114864 : qs_grid = state_loc%q(:,:,ixsnow)
2998 426114864 : ns_grid = state_loc%q(:,:,ixnumsnow)
2999 378063720 : qrsedtenout_grid(:ncol,top_lev:) = proc_rates%qrsedten
3000 378063720 : qssedtenout_grid(:ncol,top_lev:) = proc_rates%qssedten
3001 378063720 : umrout_grid(:ncol,top_lev:) = proc_rates%umr
3002 378063720 : umsout_grid(:ncol,top_lev:) = proc_rates%ums
3003 :
3004 : ! Zero out terms for budgets if not mg3....
3005 269352 : psacwgo_grid = 0._r8
3006 269352 : pgsacwo_grid = 0._r8
3007 269352 : qmultgo_grid = 0._r8
3008 :
3009 269352 : if (micro_mg_version > 2) then
3010 426114864 : qg_grid = state_loc%q(:,:,ixgraupel)
3011 426114864 : ng_grid = state_loc%q(:,:,ixnumgraupel)
3012 378063720 : psacro_grid(:ncol,top_lev:) = proc_rates%psacrtot
3013 378063720 : pracgo_grid(:ncol,top_lev:) = proc_rates%pracgtot
3014 378063720 : psacwgo_grid(:ncol,top_lev:) = proc_rates%psacwgtot
3015 378063720 : pgsacwo_grid(:ncol,top_lev:) = proc_rates%pgsacwtot
3016 378063720 : pgracso_grid(:ncol,top_lev:) = proc_rates%pgracstot
3017 378063720 : prdgo_grid(:ncol,top_lev:) = proc_rates%prdgtot
3018 378063720 : qmultgo_grid(:ncol,top_lev:) = proc_rates%qmultgtot
3019 378063720 : qmultrgo_grid(:ncol,top_lev:) = proc_rates%qmultrgtot
3020 378063720 : npracgo_grid(:ncol,top_lev:) = proc_rates%npracgtot
3021 378063720 : nscngo_grid(:ncol,top_lev:) = proc_rates%nscngtot
3022 378063720 : ngracso_grid(:ncol,top_lev:) = proc_rates%ngracstot
3023 378063720 : nmultgo_grid(:ncol,top_lev:) = proc_rates%nmultgtot
3024 378063720 : nmultrgo_grid(:ncol,top_lev:) = proc_rates%nmultrgtot
3025 378063720 : npsacwgo_grid(:ncol,top_lev:) = proc_rates%npsacwgtot
3026 : end if
3027 :
3028 :
3029 : end if
3030 :
3031 : ! If on subcolumns, average the rest of the pbuf fields which were modified on subcolumns but are not used further in
3032 : ! this parameterization (no need to assign in the non-subcolumn case -- the else step)
3033 269352 : if (use_subcol_microp) then
3034 0 : call subcol_field_avg(snow_str, ngrdcol, lchnk, snow_str_grid)
3035 0 : call subcol_field_avg(prec_pcw, ngrdcol, lchnk, prec_pcw_grid)
3036 0 : call subcol_field_avg(snow_pcw, ngrdcol, lchnk, snow_pcw_grid)
3037 0 : call subcol_field_avg(prec_sed, ngrdcol, lchnk, prec_sed_grid)
3038 0 : call subcol_field_avg(snow_sed, ngrdcol, lchnk, snow_sed_grid)
3039 0 : call subcol_field_avg(cldo, ngrdcol, lchnk, cldo_grid)
3040 0 : call subcol_field_avg(mgmrprc, ngrdcol, lchnk, mgmrprc_grid)
3041 0 : call subcol_field_avg(mgmrsnw, ngrdcol, lchnk, mgmrsnw_grid)
3042 0 : call subcol_field_avg(wsedl, ngrdcol, lchnk, wsedl_grid)
3043 0 : call subcol_field_avg(cc_t, ngrdcol, lchnk, cc_t_grid)
3044 0 : call subcol_field_avg(cc_qv, ngrdcol, lchnk, cc_qv_grid)
3045 0 : call subcol_field_avg(cc_ql, ngrdcol, lchnk, cc_ql_grid)
3046 0 : call subcol_field_avg(cc_qi, ngrdcol, lchnk, cc_qi_grid)
3047 0 : call subcol_field_avg(cc_nl, ngrdcol, lchnk, cc_nl_grid)
3048 0 : call subcol_field_avg(cc_ni, ngrdcol, lchnk, cc_ni_grid)
3049 0 : call subcol_field_avg(cc_qlst, ngrdcol, lchnk, cc_qlst_grid)
3050 0 : call subcol_field_avg(iciwpst, ngrdcol, lchnk, iciwpst_grid)
3051 0 : call subcol_field_avg(icswp, ngrdcol, lchnk, icswp_grid)
3052 0 : call subcol_field_avg(cldfsnow, ngrdcol, lchnk, cldfsnow_grid)
3053 :
3054 0 : if (micro_mg_version > 2) then
3055 0 : call subcol_field_avg(icgrauwp, ngrdcol, lchnk, icgrauwp_grid)
3056 0 : call subcol_field_avg(cldfgrau, ngrdcol, lchnk, cldfsnow_grid)
3057 : end if
3058 :
3059 0 : if (rate1_cw2pr_st_idx > 0) then
3060 0 : call subcol_field_avg(rate1ord_cw2pr_st, ngrdcol, lchnk, rate1ord_cw2pr_st_grid)
3061 : end if
3062 :
3063 : end if
3064 :
3065 : ! ------------------------------------- !
3066 : ! Size distribution calculation !
3067 : ! ------------------------------------- !
3068 :
3069 : ! Calculate rho (on subcolumns if turned on) for size distribution
3070 : ! parameter calculations and average it if needed
3071 : !
3072 : ! State instead of state_loc to preserve answers for MG1 (and in any
3073 : ! case, it is unlikely to make much difference).
3074 538704 : rho(:ncol,top_lev:) = state%pmid(:ncol,top_lev:) / &
3075 378602424 : (rair*state%t(:ncol,top_lev:))
3076 269352 : if (use_subcol_microp) then
3077 0 : call subcol_field_avg(rho, ngrdcol, lchnk, rho_grid)
3078 : else
3079 426114864 : rho_grid = rho
3080 : end if
3081 :
3082 : ! Effective radius for cloud liquid, fixed number.
3083 426114864 : mu_grid = 0._r8
3084 426114864 : lambdac_grid = 0._r8
3085 426114864 : rel_fn_grid = 10._r8
3086 :
3087 426114864 : ncic_grid = 1.e8_r8
3088 :
3089 22894920 : do k = top_lev, pver
3090 : !$acc data copyin (mg_liq_props,icwmrst_grid(:ngrdcol,k),rho_grid(:ngrdcol,k)) &
3091 : !$acc copy (ncic_grid(:ngrdcol,k)) &
3092 : !$acc copyout (mu_grid(:ngrdcol,k),lambdac_grid(:ngrdcol,k))
3093 0 : call size_dist_param_liq(mg_liq_props, icwmrst_grid(:ngrdcol,k), &
3094 : ncic_grid(:ngrdcol,k), rho_grid(:ngrdcol,k), &
3095 22894920 : mu_grid(:ngrdcol,k), lambdac_grid(:ngrdcol,k), ngrdcol)
3096 : !$acc end data
3097 : end do
3098 :
3099 378063720 : where (icwmrst_grid(:ngrdcol,top_lev:) > qsmall)
3100 269352 : rel_fn_grid(:ngrdcol,top_lev:) = &
3101 269352 : (mu_grid(:ngrdcol,top_lev:) + 3._r8)/ &
3102 269352 : lambdac_grid(:ngrdcol,top_lev:)/2._r8 * 1.e6_r8
3103 : end where
3104 :
3105 : ! Effective radius for cloud liquid, and size parameters
3106 : ! mu_grid and lambdac_grid.
3107 426114864 : mu_grid = 0._r8
3108 426114864 : lambdac_grid = 0._r8
3109 426114864 : rel_grid = 10._r8
3110 :
3111 : ! Calculate ncic on the grid
3112 : ncic_grid(:ngrdcol,top_lev:) = nc_grid(:ngrdcol,top_lev:) / &
3113 378063720 : max(mincld,liqcldf_grid(:ngrdcol,top_lev:))
3114 :
3115 22894920 : do k = top_lev, pver
3116 : !$acc data copyin (mg_liq_props,icwmrst_grid(:ngrdcol,k), rho_grid(:ngrdcol,k)) &
3117 : !$acc copy (ncic_grid(:ngrdcol,k)) &
3118 : !$acc copyout (mu_grid(:ngrdcol,k),lambdac_grid(:ngrdcol,k))
3119 0 : call size_dist_param_liq(mg_liq_props, icwmrst_grid(:ngrdcol,k), &
3120 : ncic_grid(:ngrdcol,k), rho_grid(:ngrdcol,k), &
3121 22894920 : mu_grid(:ngrdcol,k), lambdac_grid(:ngrdcol,k), ngrdcol)
3122 : !$acc end data
3123 : end do
3124 :
3125 1511985528 : where (icwmrst_grid(:ngrdcol,top_lev:) >= qsmall)
3126 269352 : rel_grid(:ngrdcol,top_lev:) = &
3127 269352 : (mu_grid(:ngrdcol,top_lev:) + 3._r8) / &
3128 269352 : lambdac_grid(:ngrdcol,top_lev:)/2._r8 * 1.e6_r8
3129 : elsewhere
3130 : ! Deal with the fact that size_dist_param_liq sets mu_grid to -100
3131 : ! wherever there is no cloud.
3132 269352 : mu_grid(:ngrdcol,top_lev:) = 0._r8
3133 : end where
3134 :
3135 : ! Rain/Snow effective diameter.
3136 269352 : drout2_grid = 0._r8
3137 269352 : reff_rain_grid = 0._r8
3138 426114864 : des_grid = 0._r8
3139 269352 : dsout2_grid = 0._r8
3140 269352 : reff_snow_grid = 0._r8
3141 269352 : reff_grau_grid = 0._r8
3142 :
3143 : ! Prognostic precipitation
3144 :
3145 1133921808 : where (qr_grid(:ngrdcol,top_lev:) >= 1.e-7_r8)
3146 : drout2_grid(:ngrdcol,top_lev:) = avg_diameter( &
3147 269352 : qr_grid(:ngrdcol,top_lev:), &
3148 : nr_grid(:ngrdcol,top_lev:) * rho_grid(:ngrdcol,top_lev:), &
3149 : rho_grid(:ngrdcol,top_lev:), rhow)
3150 :
3151 : reff_rain_grid(:ngrdcol,top_lev:) = drout2_grid(:ngrdcol,top_lev:) * &
3152 : shapeparam * micron2meter
3153 : end where
3154 :
3155 1511985528 : where (qs_grid(:ngrdcol,top_lev:) >= 1.e-7_r8)
3156 : dsout2_grid(:ngrdcol,top_lev:) = avg_diameter( &
3157 269352 : qs_grid(:ngrdcol,top_lev:), &
3158 : ns_grid(:ngrdcol,top_lev:) * rho_grid(:ngrdcol,top_lev:), &
3159 : rho_grid(:ngrdcol,top_lev:), rhosn)
3160 :
3161 269352 : des_grid(:ngrdcol,top_lev:) = dsout2_grid(:ngrdcol,top_lev:) *&
3162 : 3._r8 * rhosn/rhows
3163 :
3164 : reff_snow_grid(:ngrdcol,top_lev:) = dsout2_grid(:ngrdcol,top_lev:) * &
3165 : shapeparam * micron2meter
3166 : end where
3167 :
3168 :
3169 : ! Graupel/Hail size distribution Placeholder
3170 269352 : if (micro_mg_version > 2) then
3171 426114864 : degrau_grid = 0._r8
3172 1511985528 : where (qg_grid(:ngrdcol,top_lev:) >= 1.e-7_r8)
3173 : dgout2_grid(:ngrdcol,top_lev:) = avg_diameter( &
3174 269352 : qg_grid(:ngrdcol,top_lev:), &
3175 : ng_grid(:ngrdcol,top_lev:) * rho_grid(:ngrdcol,top_lev:), &
3176 : rho_grid(:ngrdcol,top_lev:), rhog)
3177 :
3178 : reff_grau_grid(:ngrdcol,top_lev:) = dgout2_grid(:ngrdcol,top_lev:) * &
3179 : 1.5_r8 * 1.e6_r8
3180 269352 : degrau_grid(:ngrdcol,top_lev:) = dgout2_grid(:ngrdcol,top_lev:) *&
3181 : 3._r8 * rhog/rhows
3182 : end where
3183 : end if
3184 :
3185 : ! Effective radius and diameter for cloud ice.
3186 426114864 : rei_grid = 25._r8
3187 :
3188 269352 : niic_grid(:ngrdcol,top_lev:) = ni_grid(:ngrdcol,top_lev:) / &
3189 378333072 : max(mincld,icecldf_grid(:ngrdcol,top_lev:))
3190 :
3191 22894920 : do k = top_lev, pver
3192 : !$acc data copyin (mg_ice_props, icimrst_grid(:ngrdcol,k)) &
3193 : !$acc copy (niic_grid(:ngrdcol,k)) &
3194 : !$acc copyout (rei_grid(:ngrdcol,k))
3195 0 : call size_dist_param_basic(mg_ice_props,icimrst_grid(:ngrdcol,k), &
3196 22894920 : niic_grid(:ngrdcol,k),rei_grid(:ngrdcol,k),ngrdcol)
3197 : !$acc end data
3198 : end do
3199 :
3200 1511985528 : where (icimrst_grid(:ngrdcol,top_lev:) >= qsmall)
3201 269352 : rei_grid(:ngrdcol,top_lev:) = 1.5_r8/rei_grid(:ngrdcol,top_lev:) &
3202 : * 1.e6_r8
3203 : elsewhere
3204 269352 : rei_grid(:ngrdcol,top_lev:) = 25._r8
3205 : end where
3206 :
3207 851960376 : dei_grid = rei_grid * rhoi/rhows * 2._r8
3208 :
3209 : ! Limiters for low cloud fraction.
3210 22894920 : do k = top_lev, pver
3211 378063720 : do i = 1, ngrdcol
3212 : ! Convert snow effective diameter to microns
3213 355168800 : des_grid(i,k) = des_grid(i,k) * 1.e6_r8
3214 377794368 : if ( ast_grid(i,k) < 1.e-4_r8 ) then
3215 290167169 : mu_grid(i,k) = mucon
3216 290167169 : lambdac_grid(i,k) = (mucon + 1._r8)/dcon
3217 290167169 : dei_grid(i,k) = deicon
3218 : end if
3219 : end do
3220 : end do
3221 :
3222 378063720 : mgreffrain_grid(:ngrdcol,top_lev:pver) = reff_rain_grid(:ngrdcol,top_lev:pver)
3223 378063720 : mgreffsnow_grid(:ngrdcol,top_lev:pver) = reff_snow_grid(:ngrdcol,top_lev:pver)
3224 :
3225 : ! ------------------------------------- !
3226 : ! Precipitation efficiency Calculation !
3227 : ! ------------------------------------- !
3228 :
3229 : !-----------------------------------------------------------------------
3230 : ! Liquid water path
3231 :
3232 : ! Compute liquid water paths, and column condensation
3233 4497552 : tgliqwp_grid(:ngrdcol) = 0._r8
3234 4497552 : tgcmeliq_grid(:ngrdcol) = 0._r8
3235 22894920 : do k = top_lev, pver
3236 378063720 : do i = 1, ngrdcol
3237 355168800 : tgliqwp_grid(i) = tgliqwp_grid(i) + iclwpst_grid(i,k)*cld_grid(i,k)
3238 :
3239 377794368 : if (cmeliq_grid(i,k) > 1.e-12_r8) then
3240 : !convert cmeliq to right units: kgh2o/kgair/s * kgair/m2 / kgh2o/m3 = m/s
3241 : tgcmeliq_grid(i) = tgcmeliq_grid(i) + cmeliq_grid(i,k) * &
3242 16328502 : (pdel_grid(i,k) / gravit) / rhoh2o
3243 : end if
3244 : end do
3245 : end do
3246 :
3247 : ! note: 1e-6 kgho2/kgair/s * 1000. pa / (9.81 m/s2) / 1000 kgh2o/m3 = 1e-7 m/s
3248 : ! this is 1ppmv of h2o in 10hpa
3249 : ! alternatively: 0.1 mm/day * 1.e-4 m/mm * 1/86400 day/s = 1.e-9
3250 :
3251 : !-----------------------------------------------------------------------
3252 : ! precipitation efficiency calculation (accumulate cme and precip)
3253 :
3254 : minlwp = 0.01_r8 !minimum lwp threshold (kg/m3)
3255 :
3256 : ! zero out precip efficiency and total averaged precip
3257 4497552 : pe_grid(:ngrdcol) = 0._r8
3258 4497552 : tpr_grid(:ngrdcol) = 0._r8
3259 4497552 : pefrac_grid(:ngrdcol) = 0._r8
3260 :
3261 : ! accumulate precip and condensation
3262 4497552 : do i = 1, ngrdcol
3263 :
3264 4228200 : acgcme_grid(i) = acgcme_grid(i) + tgcmeliq_grid(i)
3265 4228200 : acprecl_grid(i) = acprecl_grid(i) + prec_str_grid(i)
3266 4228200 : acnum_grid(i) = acnum_grid(i) + 1
3267 :
3268 : ! if LWP is zero, then 'end of cloud': calculate precip efficiency
3269 4228200 : if (tgliqwp_grid(i) < minlwp) then
3270 2644533 : if (acprecl_grid(i) > 5.e-8_r8) then
3271 87061 : tpr_grid(i) = max(acprecl_grid(i)/acnum_grid(i), 1.e-15_r8)
3272 87061 : if (acgcme_grid(i) > 1.e-10_r8) then
3273 67965 : pe_grid(i) = min(max(acprecl_grid(i)/acgcme_grid(i), 1.e-15_r8), 1.e5_r8)
3274 67965 : pefrac_grid(i) = 1._r8
3275 : end if
3276 : end if
3277 :
3278 : ! reset counters
3279 : ! if (pe_grid(i) /= 0._r8 .and. (pe_grid(i) < 1.e-8_r8 .or. pe_grid(i) > 1.e3_r8)) then
3280 : ! write (iulog,*) 'PE_grid:ANOMALY pe_grid, acprecl_grid, acgcme_grid, tpr_grid, acnum_grid ', &
3281 : ! pe_grid(i),acprecl_grid(i), acgcme_grid(i), tpr_grid(i), acnum_grid(i)
3282 : ! endif
3283 :
3284 2644533 : acprecl_grid(i) = 0._r8
3285 2644533 : acgcme_grid(i) = 0._r8
3286 2644533 : acnum_grid(i) = 0
3287 : end if ! end LWP zero conditional
3288 :
3289 : ! if never find any rain....(after 10^3 timesteps...)
3290 4497552 : if (acnum_grid(i) > 1000) then
3291 0 : acnum_grid(i) = 0
3292 0 : acprecl_grid(i) = 0._r8
3293 0 : acgcme_grid(i) = 0._r8
3294 : end if
3295 :
3296 : end do
3297 :
3298 : !-----------------------------------------------------------------------
3299 : ! vertical average of non-zero accretion, autoconversion and ratio.
3300 : ! vars: vprco_grid(i),vprao_grid(i),racau_grid(i),cnt_grid
3301 :
3302 269352 : vprao_grid = 0._r8
3303 269352 : cnt_grid = 0
3304 22894920 : do k = top_lev, pver
3305 377794368 : vprao_grid(:ngrdcol) = vprao_grid(:ngrdcol) + prao_grid(:ngrdcol,k)
3306 378063720 : where (prao_grid(:ngrdcol,k) /= 0._r8) cnt_grid(:ngrdcol) = cnt_grid(:ngrdcol) + 1
3307 : end do
3308 :
3309 4578984 : where (cnt_grid > 0) vprao_grid = vprao_grid/cnt_grid
3310 :
3311 269352 : vprco_grid = 0._r8
3312 269352 : cnt_grid = 0
3313 22894920 : do k = top_lev, pver
3314 377794368 : vprco_grid(:ngrdcol) = vprco_grid(:ngrdcol) + prco_grid(:ngrdcol,k)
3315 378063720 : where (prco_grid(:ngrdcol,k) /= 0._r8) cnt_grid(:ngrdcol) = cnt_grid(:ngrdcol) + 1
3316 : end do
3317 :
3318 17507880 : where (cnt_grid > 0)
3319 : vprco_grid = vprco_grid/cnt_grid
3320 : racau_grid = vprao_grid/vprco_grid
3321 : elsewhere
3322 : racau_grid = 0._r8
3323 : end where
3324 :
3325 4578984 : racau_grid = min(racau_grid, 1.e10_r8)
3326 :
3327 : !-----------------------------------------------------------------------
3328 : ! Diagnostic Rainbow Calculation. Seriously.
3329 : !-----------------------------------------------------------------------
3330 :
3331 4497552 : do i = 1, ngrdcol
3332 :
3333 4228200 : top_idx = pver
3334 4228200 : convmx = 0._r8
3335 4228200 : frlow = 0._r8
3336 4228200 : cldmx = 0._r8
3337 363625200 : cldtot = maxval(ast(i,top_lev:))
3338 :
3339 : ! Find levels in surface layer
3340 359397000 : do k = top_lev, pver
3341 359397000 : if (state%pmid(i,k) > rb_pmin) then
3342 50202783 : top_idx = min(k,top_idx)
3343 : end if
3344 : end do
3345 :
3346 : !For all fractional precip calculated below, use maximum in surface layer.
3347 : !For convective precip, base on convective cloud area
3348 58847259 : convmx = maxval(concld(i,top_idx:))
3349 : !For stratiform precip, base on precip fraction
3350 58847259 : cldmx= maxval(freqr(i,top_idx:))
3351 : ! Combine and use maximum of strat or conv fraction
3352 4228200 : frlow= max(cldmx,convmx)
3353 :
3354 : !max precip
3355 58847259 : rmax=maxval(qrout_grid(i,top_idx:))
3356 :
3357 : ! Stratiform precip mixing ratio OR some convective precip
3358 : ! (rval = true if any sig precip)
3359 :
3360 4228200 : rval = ((precc(i) > rb_rcmin) .or. (rmax > rb_rmin))
3361 :
3362 : !Now can find conditions for a rainbow:
3363 : ! Maximum cloud cover (CLDTOT) < 0.5
3364 : ! 48 < SZA < 90
3365 : ! freqr (below rb_pmin) > 0.25
3366 : ! Some rain (liquid > 1.e-6 kg/kg, convective precip > 1.e-7 m/s
3367 :
3368 4497552 : if ((cldtot < 0.5_r8) .and. (sza(i) > 48._r8) .and. (sza(i) < 90._r8) .and. rval) then
3369 :
3370 : !Rainbow 'probability' (area) derived from solid angle theory
3371 : !as the fraction of the hemisphere for a spherical cap with angle phi=sza-48.
3372 : ! This is only valid between 48 < sza < 90 (controlled for above).
3373 :
3374 75987 : rbfrac(i) = max(0._r8,(1._r8-COS((sza(i)-48._r8)*deg2rad))/2._r8) * frlow
3375 75987 : rbfreq(i) = 1.0_r8
3376 : end if
3377 :
3378 : end do ! end column loop for rainbows
3379 :
3380 269352 : call outfld('RBFRAC', rbfrac, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3381 269352 : call outfld('RBFREQ', rbfreq, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3382 :
3383 :
3384 : ! --------------------- !
3385 : ! History Output Fields !
3386 : ! --------------------- !
3387 :
3388 : ! Column droplet concentration
3389 0 : cdnumc_grid(:ngrdcol) = sum(nc_grid(:ngrdcol,top_lev:pver) * &
3390 359666352 : pdel_grid(:ngrdcol,top_lev:pver)/gravit, dim=2)
3391 :
3392 : ! Averaging for new output fields
3393 269352 : efcout_grid = 0._r8
3394 269352 : efiout_grid = 0._r8
3395 269352 : ncout_grid = 0._r8
3396 269352 : niout_grid = 0._r8
3397 269352 : freql_grid = 0._r8
3398 269352 : freqi_grid = 0._r8
3399 269352 : icwmrst_grid_out = 0._r8
3400 269352 : icimrst_grid_out = 0._r8
3401 269352 : freqm_grid = 0._r8
3402 269352 : freqsl_grid = 0._r8
3403 269352 : freqslm_grid = 0._r8
3404 :
3405 22894920 : do k = top_lev, pver
3406 378063720 : do i = 1, ngrdcol
3407 355168800 : if ( liqcldf_grid(i,k) > 0.01_r8 .and. icwmrst_grid(i,k) > 5.e-5_r8 ) then
3408 10108417 : efcout_grid(i,k) = rel_grid(i,k) * liqcldf_grid(i,k)
3409 10108417 : ncout_grid(i,k) = icwnc_grid(i,k) * liqcldf_grid(i,k)
3410 10108417 : freql_grid(i,k) = liqcldf_grid(i,k)
3411 10108417 : icwmrst_grid_out(i,k) = icwmrst_grid(i,k)
3412 : end if
3413 355168800 : if ( icecldf_grid(i,k) > 0.01_r8 .and. icimrst_grid(i,k) > 1.e-6_r8 ) then
3414 18392797 : efiout_grid(i,k) = rei_grid(i,k) * icecldf_grid(i,k)
3415 18392797 : niout_grid(i,k) = icinc_grid(i,k) * icecldf_grid(i,k)
3416 18392797 : freqi_grid(i,k) = icecldf_grid(i,k)
3417 18392797 : icimrst_grid_out(i,k) = icimrst_grid(i,k)
3418 : end if
3419 :
3420 : ! Supercooled liquid
3421 355168800 : if (freql_grid(i,k) > 0.01_r8 .and. freqi_grid(i,k) > 0.01_r8 ) then
3422 1539683 : freqm_grid(i,k)=min(liqcldf_grid(i,k),icecldf_grid(i,k))
3423 : end if
3424 355168800 : if (freql_grid(i,k) > 0.01_r8 .and. freqi_grid(i,k) < 0.01_r8 .and. state_loc%t(i,k) < tmelt ) then
3425 1902105 : freqsl_grid(i,k)=liqcldf_grid(i,k)
3426 : end if
3427 377794368 : if (freql_grid(i,k) > 0.01_r8 .and. freqi_grid(i,k) > 0.01_r8 .and. state_loc%t(i,k) < tmelt ) then
3428 1539617 : freqslm_grid(i,k)=liqcldf_grid(i,k)
3429 : end if
3430 :
3431 : end do
3432 : end do
3433 :
3434 : ! Cloud top effective radius and number.
3435 269352 : fcti_grid = 0._r8
3436 269352 : fctl_grid = 0._r8
3437 269352 : ctrel_grid = 0._r8
3438 269352 : ctrei_grid = 0._r8
3439 269352 : ctnl_grid = 0._r8
3440 269352 : ctni_grid = 0._r8
3441 269352 : fctm_grid = 0._r8
3442 269352 : fctsl_grid = 0._r8
3443 269352 : fctslm_grid= 0._r8
3444 :
3445 4497552 : do i = 1, ngrdcol
3446 261752869 : do k = top_lev, pver
3447 260379217 : if ( liqcldf_grid(i,k) > 0.01_r8 .and. icwmrst_grid(i,k) > 1.e-7_r8 ) then
3448 664636 : ctrel_grid(i) = rel_grid(i,k) * liqcldf_grid(i,k)
3449 664636 : ctnl_grid(i) = icwnc_grid(i,k) * liqcldf_grid(i,k)
3450 664636 : fctl_grid(i) = liqcldf_grid(i,k)
3451 :
3452 : ! Cloud Top Mixed phase, supercooled liquid only and supercooled liquid mixed
3453 664636 : if (freqi_grid(i,k) > 0.01_r8) then
3454 27691 : fctm_grid(i)=min(liqcldf_grid(i,k),icecldf_grid(i,k))
3455 : end if
3456 664636 : if (freqi_grid(i,k) < 0.01_r8 .and. state_loc%t(i,k) < tmelt ) then
3457 148033 : fctsl_grid(i)=liqcldf_grid(i,k)
3458 : end if
3459 664636 : if (freqi_grid(i,k) > 0.01_r8 .and. state_loc%t(i,k) < tmelt ) then
3460 27691 : fctslm_grid(i)=liqcldf_grid(i,k)
3461 : end if
3462 :
3463 : exit
3464 : end if
3465 :
3466 260818881 : if ( icecldf_grid(i,k) > 0.01_r8 .and. icimrst_grid(i,k) > 1.e-7_r8 ) then
3467 2459264 : ctrei_grid(i) = rei_grid(i,k) * icecldf_grid(i,k)
3468 2459264 : ctni_grid(i) = icinc_grid(i,k) * icecldf_grid(i,k)
3469 2459264 : fcti_grid(i) = icecldf_grid(i,k)
3470 2459264 : exit
3471 : end if
3472 : end do
3473 : end do
3474 :
3475 : ! Evaporation of stratiform precipitation fields for UNICON
3476 836814024 : evprain_st_grid(:ngrdcol,:pver) = nevapr_grid(:ngrdcol,:pver) - evpsnow_st_grid(:ngrdcol,:pver)
3477 22894920 : do k = top_lev, pver
3478 378063720 : do i = 1, ngrdcol
3479 355168800 : evprain_st_grid(i,k) = max(evprain_st_grid(i,k), 0._r8)
3480 377794368 : evpsnow_st_grid(i,k) = max(evpsnow_st_grid(i,k), 0._r8)
3481 : end do
3482 : end do
3483 :
3484 : ! Assign the values to the pbuf pointers if they exist in pbuf
3485 269352 : if (qrain_idx > 0) qrout_grid_ptr = qrout_grid
3486 269352 : if (qsnow_idx > 0) qsout_grid_ptr = qsout_grid
3487 269352 : if (nrain_idx > 0) nrout_grid_ptr = nrout_grid
3488 269352 : if (nsnow_idx > 0) nsout_grid_ptr = nsout_grid
3489 269352 : if (qcsedten_idx > 0) qcsedtenout_grid_ptr = qcsedtenout_grid
3490 269352 : if (qrsedten_idx > 0) qrsedtenout_grid_ptr = qrsedtenout_grid
3491 269352 : if (qisedten_idx > 0) qisedtenout_grid_ptr = qisedtenout_grid
3492 269352 : if (qssedten_idx > 0) qssedtenout_grid_ptr = qssedtenout_grid
3493 269352 : if (vtrmc_idx > 0) vtrmcout_grid_ptr = vtrmcout_grid
3494 269352 : if (umr_idx > 0) umrout_grid_ptr = umrout_grid
3495 269352 : if (vtrmi_idx > 0) vtrmiout_grid_ptr = vtrmiout_grid
3496 269352 : if (ums_idx > 0) umsout_grid_ptr = umsout_grid
3497 269352 : if (qcsevap_idx > 0 ) qcsevapout_grid_ptr = qcsevapout_grid
3498 269352 : if (qisevap_idx > 0 ) qisevapout_grid_ptr = qisevapout_grid
3499 :
3500 : ! --------------------------------------------- !
3501 : ! General outfield calls for microphysics !
3502 : ! --------------------------------------------- !
3503 :
3504 : ! Output a handle of variables which are calculated on the fly
3505 :
3506 269352 : ftem_grid = 0._r8
3507 :
3508 378063720 : ftem_grid(:ngrdcol,top_lev:pver) = qcreso_grid(:ngrdcol,top_lev:pver)
3509 269352 : call outfld( 'MPDW2V', ftem_grid, pcols, lchnk)
3510 :
3511 269352 : ftem_grid(:ngrdcol,top_lev:pver) = melto_grid(:ngrdcol,top_lev:pver) - mnuccco_grid(:ngrdcol,top_lev:pver)&
3512 : - mnuccto_grid(:ngrdcol,top_lev:pver) - bergo_grid(:ngrdcol,top_lev:pver) - homoo_grid(:ngrdcol,top_lev:pver)&
3513 378333072 : - msacwio_grid(:ngrdcol,top_lev:pver)
3514 269352 : call outfld( 'MPDW2I', ftem_grid, pcols, lchnk)
3515 :
3516 269352 : if (micro_mg_version > 2) then
3517 0 : ftem_grid(:ngrdcol,top_lev:pver) = -prao_grid(:ngrdcol,top_lev:pver) - prco_grid(:ngrdcol,top_lev:pver)&
3518 0 : - psacwso_grid(:ngrdcol,top_lev:pver) - bergso_grid(:ngrdcol,top_lev:pver)&
3519 378063720 : - psacwgo_grid(:ngrdcol,top_lev:pver) - pgsacwo_grid(:ngrdcol,top_lev:pver)
3520 : else
3521 0 : ftem_grid(:ngrdcol,top_lev:pver) = -prao_grid(:ngrdcol,top_lev:pver) - prco_grid(:ngrdcol,top_lev:pver)&
3522 0 : - psacwso_grid(:ngrdcol,top_lev:pver) - bergso_grid(:ngrdcol,top_lev:pver)
3523 : endif
3524 :
3525 269352 : call outfld( 'MPDW2P', ftem_grid, pcols, lchnk)
3526 :
3527 378063720 : ftem_grid(:ngrdcol,top_lev:pver) = cmeiout_grid(:ngrdcol,top_lev:pver) + qireso_grid(:ngrdcol,top_lev:pver)
3528 269352 : call outfld( 'MPDI2V', ftem_grid, pcols, lchnk)
3529 :
3530 269352 : if (micro_mg_version > 2) then
3531 269352 : ftem_grid(:ngrdcol,top_lev:pver) = -melto_grid(:ngrdcol,top_lev:pver) + mnuccco_grid(:ngrdcol,top_lev:pver) &
3532 : + mnuccto_grid(:ngrdcol,top_lev:pver) + bergo_grid(:ngrdcol,top_lev:pver) + homoo_grid(:ngrdcol,top_lev:pver)&
3533 : + msacwio_grid(:ngrdcol,top_lev:pver)&
3534 378333072 : - qmultgo_grid(:ngrdcol,top_lev:pver)
3535 : else
3536 0 : ftem_grid(:ngrdcol,top_lev:pver) = -melto_grid(:ngrdcol,top_lev:pver) + mnuccco_grid(:ngrdcol,top_lev:pver) &
3537 : + mnuccto_grid(:ngrdcol,top_lev:pver) + bergo_grid(:ngrdcol,top_lev:pver) + homoo_grid(:ngrdcol,top_lev:pver)&
3538 0 : + msacwio_grid(:ngrdcol,top_lev:pver)
3539 : endif
3540 :
3541 269352 : call outfld( 'MPDI2W', ftem_grid, pcols, lchnk)
3542 :
3543 378063720 : ftem_grid(:ngrdcol,top_lev:pver) = -prcio_grid(:ngrdcol,top_lev:pver) - praio_grid(:ngrdcol,top_lev:pver)
3544 269352 : call outfld( 'MPDI2P', ftem_grid, pcols, lchnk)
3545 :
3546 : ! Output fields which have not been averaged already, averaging if use_subcol_microp is true
3547 269352 : if (trim(micro_mg_warm_rain) == 'tau' .or. trim(micro_mg_warm_rain) == 'emulated') then
3548 0 : call outfld('scale_qc', proc_rates%scale_qc, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3549 0 : call outfld('scale_nc', proc_rates%scale_nc, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3550 0 : call outfld('scale_qr', proc_rates%scale_qr, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3551 0 : call outfld('scale_nr', proc_rates%scale_nr, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3552 0 : call outfld('amk_c', proc_rates%amk_c, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3553 0 : call outfld('ank_c', proc_rates%ank_c, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3554 0 : call outfld('amk_r', proc_rates%amk_r, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3555 0 : call outfld('ank_r', proc_rates%ank_r, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3556 0 : call outfld('amk', proc_rates%amk, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3557 0 : call outfld('ank', proc_rates%ank, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3558 0 : call outfld('amk_out', proc_rates%amk_out, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3559 0 : call outfld('ank_out', proc_rates%ank_out, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3560 0 : call outfld('QC_TAU_out', proc_rates%qc_out_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3561 0 : call outfld('NC_TAU_out', proc_rates%nc_out_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3562 0 : call outfld('QR_TAU_out', proc_rates%qr_out_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3563 0 : call outfld('NR_TAU_out', proc_rates%nr_out_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3564 0 : call outfld('qctend_TAU', proc_rates%qctend_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3565 0 : call outfld('nctend_TAU', proc_rates%nctend_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3566 0 : call outfld('qrtend_TAU', proc_rates%qrtend_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3567 0 : call outfld('nrtend_TAU', proc_rates%nrtend_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3568 0 : call outfld('gmnnn_lmnnn_TAU', proc_rates%gmnnn_lmnnn_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3569 0 : call outfld('ML_fixer', proc_rates%ML_fixer, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3570 0 : call outfld('qc_fixer', proc_rates%qc_fixer, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3571 0 : call outfld('nc_fixer', proc_rates%nc_fixer, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3572 0 : call outfld('qr_fixer', proc_rates%qr_fixer, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3573 0 : call outfld('nr_fixer', proc_rates%nr_fixer, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3574 0 : call outfld('QC_TAU_in', proc_rates%qc_in_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3575 0 : call outfld('NC_TAU_in', proc_rates%nc_in_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3576 0 : call outfld('QR_TAU_in', proc_rates%qr_in_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3577 0 : call outfld('NR_TAU_in', proc_rates%nr_in_TAU, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3578 : end if
3579 :
3580 269352 : if (trim(micro_mg_warm_rain) == 'sb2001') then
3581 0 : call outfld('qctend_SB2001', proc_rates%qctend_SB2001, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3582 0 : call outfld('nctend_SB2001', proc_rates%nctend_SB2001, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3583 0 : call outfld('qrtend_SB2001', proc_rates%qrtend_SB2001, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3584 0 : call outfld('nrtend_SB2001', proc_rates%nrtend_SB2001, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3585 : end if
3586 269352 : if (trim(micro_mg_warm_rain) == 'kk2000') then
3587 269352 : call outfld('qctend_KK2000', proc_rates%qctend_KK2000, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3588 269352 : call outfld('nctend_KK2000', proc_rates%nctend_KK2000, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3589 269352 : call outfld('qrtend_KK2000', proc_rates%qrtend_KK2000, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3590 269352 : call outfld('nrtend_KK2000', proc_rates%nrtend_KK2000, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3591 : end if
3592 269352 : call outfld('LAMC', proc_rates%lamc_out, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3593 269352 : call outfld('LAMR', proc_rates%lamr_out, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3594 269352 : call outfld('PGAM', proc_rates%pgam_out, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3595 269352 : call outfld('N0R', proc_rates%n0r_out, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3596 :
3597 269352 : call outfld('MPICLWPI', iclwpi, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3598 269352 : call outfld('MPICIWPI', iciwpi, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3599 269352 : call outfld('REFL', refl, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3600 269352 : call outfld('AREFL', arefl, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3601 269352 : call outfld('AREFLZ', areflz, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3602 269352 : call outfld('FREFL', frefl, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3603 269352 : call outfld('CSRFL', csrfl, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3604 269352 : call outfld('ACSRFL', acsrfl, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3605 269352 : call outfld('FCSRFL', fcsrfl, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3606 269352 : call outfld('REFL10CM', refl10cm, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3607 269352 : call outfld('REFLZ10CM', reflz10cm, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3608 269352 : call outfld('RERCLD', rercld, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3609 269352 : call outfld('NCAL', ncal, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3610 269352 : call outfld('NCAI', ncai, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3611 269352 : call outfld('AQRAIN', qrout2, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3612 269352 : call outfld('AQSNOW', qsout2, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3613 269352 : call outfld('ANRAIN', nrout2, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3614 269352 : call outfld('ANSNOW', nsout2, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3615 269352 : call outfld('FREQR', freqr, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3616 269352 : call outfld('FREQS', freqs, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3617 269352 : call outfld('MPDT', tlat, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3618 269352 : call outfld('MPDQ', qvlat, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3619 269352 : call outfld('MPDLIQ', qcten, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3620 269352 : call outfld('MPDICE', qiten, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3621 269352 : call outfld('MPDNLIQ', ncten, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3622 269352 : call outfld('MPDNICE', niten, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3623 269352 : call outfld('EVAPSNOW', proc_rates%evapsnow, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3624 269352 : call outfld('QCSEVAP', proc_rates%qcsevap, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3625 269352 : call outfld('QISEVAP', proc_rates%qisevap, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3626 269352 : call outfld('QVRES', proc_rates%qvres, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3627 269352 : call outfld('VTRMC', proc_rates%vtrmc, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3628 269352 : call outfld('VTRMI', proc_rates%vtrmi, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3629 269352 : call outfld('QCSEDTEN', proc_rates%qcsedten, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3630 269352 : call outfld('QISEDTEN', proc_rates%qisedten, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3631 269352 : call outfld('QRSEDTEN', proc_rates%qrsedten, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3632 269352 : call outfld('QSSEDTEN', proc_rates%qssedten, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3633 269352 : call outfld('MNUCCRIO', proc_rates%mnuccritot, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3634 269352 : call outfld('MNUDEPO', proc_rates%mnudeptot, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3635 269352 : call outfld('MELTSTOT', proc_rates%meltstot, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3636 269352 : call outfld('MNUCCDO', proc_rates%mnuccdtot, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3637 269352 : call outfld('MNUCCDOhet', mnuccdohet, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3638 269352 : call outfld('MNUCCRO', proc_rates%mnuccrtot, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3639 269352 : call outfld('PRACSO', proc_rates%pracstot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3640 269352 : call outfld('VAPDEPSO', proc_rates%vapdepstot, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3641 269352 : call outfld('MELTSDT', proc_rates%meltsdttot, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3642 269352 : call outfld('FRZRDT', proc_rates%frzrdttot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3643 269352 : call outfld('FICE', nfice, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3644 269352 : call outfld('CLDFSNOW', cldfsnow, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3645 269352 : call outfld ('NNUCCCO', proc_rates%nnuccctot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3646 269352 : call outfld ('NNUCCTO', proc_rates%nnuccttot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3647 269352 : call outfld ('NNUCCDO', proc_rates%nnuccdtot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3648 269352 : call outfld ('NNUDEPO', proc_rates%nnudeptot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3649 269352 : call outfld ('NHOMO', proc_rates%nhomotot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3650 269352 : call outfld ('NNUCCRO', proc_rates%nnuccrtot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3651 269352 : call outfld ('NNUCCRIO', proc_rates%nnuccritot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3652 269352 : call outfld ('NSACWIO', proc_rates%nsacwitot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3653 269352 : call outfld ('NPRAO', proc_rates%npratot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3654 269352 : call outfld ('NPSACWSO', proc_rates%npsacwstot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3655 269352 : call outfld ('NPRAIO', proc_rates%npraitot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3656 269352 : call outfld ('NPRACSO', proc_rates%npracstot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3657 269352 : call outfld ('NPRCO', proc_rates%nprctot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3658 269352 : call outfld ('NPRCIO', proc_rates%nprcitot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3659 269352 : call outfld ('NCSEDTEN', proc_rates%ncsedten , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3660 269352 : call outfld ('NISEDTEN', proc_rates%nisedten , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3661 269352 : call outfld ('NRSEDTEN', proc_rates%nrsedten , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3662 269352 : call outfld ('NSSEDTEN', proc_rates%nssedten , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3663 269352 : call outfld ('NMELTO', proc_rates%nmelttot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3664 269352 : call outfld ('NMELTS', proc_rates%nmeltstot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3665 :
3666 269352 : call outfld('UMR', proc_rates%umr, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3667 269352 : call outfld('UMS', proc_rates%ums, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3668 :
3669 269352 : call outfld('QCRAT', qcrat, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3670 :
3671 269352 : if (micro_mg_version > 2) then
3672 269352 : call outfld('UMG', proc_rates%umg, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3673 269352 : call outfld('QGSEDTEN', proc_rates%qgsedten, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3674 269352 : call outfld('FREQG', freqg, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3675 269352 : call outfld('AQGRAU', qgout2, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3676 269352 : call outfld('ANGRAU', ngout2, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3677 269352 : call outfld('CLDFGRAU', cldfgrau, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
3678 269352 : call outfld('MELTGTOT', proc_rates%meltgtot, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3679 269352 : call outfld('NMELTG', proc_rates%nmeltgtot, ncol, lchnk, avg_subcol_field=use_subcol_microp)
3680 269352 : call outfld('NGSEDTEN', proc_rates%ngsedten , ncol, lchnk, avg_subcol_field=use_subcol_microp)
3681 :
3682 : end if
3683 :
3684 : ! Example subcolumn outfld call
3685 269352 : if (use_subcol_microp) then
3686 0 : call outfld('FICE_SCOL', nfice, psubcols*pcols, lchnk)
3687 0 : call outfld('MPDLIQ_SCOL', ptend%q(:,:,ixcldliq), psubcols*pcols, lchnk)
3688 0 : call outfld('MPDICE_SCOL', qiten, psubcols*pcols, lchnk)
3689 : end if
3690 :
3691 : ! Output fields which are already on the grid
3692 269352 : call outfld('QRAIN', qrout_grid, pcols, lchnk)
3693 269352 : call outfld('QSNOW', qsout_grid, pcols, lchnk)
3694 269352 : call outfld('NRAIN', nrout_grid, pcols, lchnk)
3695 269352 : call outfld('NSNOW', nsout_grid, pcols, lchnk)
3696 269352 : call outfld('CV_REFFLIQ', cvreffliq_grid, pcols, lchnk)
3697 269352 : call outfld('CV_REFFICE', cvreffice_grid, pcols, lchnk)
3698 269352 : call outfld('LS_FLXPRC', mgflxprc_grid, pcols, lchnk)
3699 269352 : call outfld('LS_FLXSNW', mgflxsnw_grid, pcols, lchnk)
3700 269352 : call outfld('CME', qme_grid, pcols, lchnk)
3701 269352 : call outfld('PRODPREC', prain_grid, pcols, lchnk)
3702 269352 : call outfld('EVAPPREC', nevapr_grid, pcols, lchnk)
3703 269352 : call outfld('QCRESO', qcreso_grid, pcols, lchnk)
3704 269352 : call outfld('LS_REFFRAIN', mgreffrain_grid, pcols, lchnk)
3705 269352 : call outfld('LS_REFFSNOW', mgreffsnow_grid, pcols, lchnk)
3706 269352 : call outfld('DSNOW', des_grid, pcols, lchnk)
3707 269352 : call outfld('ADRAIN', drout2_grid, pcols, lchnk)
3708 269352 : call outfld('ADSNOW', dsout2_grid, pcols, lchnk)
3709 269352 : call outfld('PE', pe_grid, pcols, lchnk)
3710 269352 : call outfld('PEFRAC', pefrac_grid, pcols, lchnk)
3711 269352 : call outfld('APRL', tpr_grid, pcols, lchnk)
3712 269352 : call outfld('VPRAO', vprao_grid, pcols, lchnk)
3713 269352 : call outfld('VPRCO', vprco_grid, pcols, lchnk)
3714 269352 : call outfld('RACAU', racau_grid, pcols, lchnk)
3715 269352 : call outfld('AREL', efcout_grid, pcols, lchnk)
3716 269352 : call outfld('AREI', efiout_grid, pcols, lchnk)
3717 269352 : call outfld('AWNC' , ncout_grid, pcols, lchnk)
3718 269352 : call outfld('AWNI' , niout_grid, pcols, lchnk)
3719 269352 : call outfld('FREQL', freql_grid, pcols, lchnk)
3720 269352 : call outfld('FREQI', freqi_grid, pcols, lchnk)
3721 269352 : call outfld('ACTREL', ctrel_grid, pcols, lchnk)
3722 269352 : call outfld('ACTREI', ctrei_grid, pcols, lchnk)
3723 269352 : call outfld('ACTNL', ctnl_grid, pcols, lchnk)
3724 269352 : call outfld('ACTNI', ctni_grid, pcols, lchnk)
3725 269352 : call outfld('FCTL', fctl_grid, pcols, lchnk)
3726 269352 : call outfld('FCTI', fcti_grid, pcols, lchnk)
3727 269352 : call outfld('ICINC', icinc_grid, pcols, lchnk)
3728 269352 : call outfld('ICWNC', icwnc_grid, pcols, lchnk)
3729 269352 : call outfld('EFFLIQ_IND', rel_fn_grid, pcols, lchnk)
3730 269352 : call outfld('CDNUMC', cdnumc_grid, pcols, lchnk)
3731 269352 : call outfld('REL', rel_grid, pcols, lchnk)
3732 269352 : call outfld('REI', rei_grid, pcols, lchnk)
3733 269352 : call outfld('MG_SADICE', sadice_grid, pcols, lchnk)
3734 269352 : call outfld('MG_SADSNOW', sadsnow_grid, pcols, lchnk)
3735 269352 : call outfld('ICIMRST', icimrst_grid_out, pcols, lchnk)
3736 269352 : call outfld('ICWMRST', icwmrst_grid_out, pcols, lchnk)
3737 269352 : call outfld('CMEIOUT', cmeiout_grid, pcols, lchnk)
3738 269352 : call outfld('PRAO', prao_grid, pcols, lchnk)
3739 269352 : call outfld('PRCO', prco_grid, pcols, lchnk)
3740 269352 : call outfld('MNUCCCO', mnuccco_grid, pcols, lchnk)
3741 269352 : call outfld('MNUCCTO', mnuccto_grid, pcols, lchnk)
3742 269352 : call outfld('MSACWIO', msacwio_grid, pcols, lchnk)
3743 269352 : call outfld('PSACWSO', psacwso_grid, pcols, lchnk)
3744 269352 : call outfld('BERGSO', bergso_grid, pcols, lchnk)
3745 269352 : call outfld('BERGO', bergo_grid, pcols, lchnk)
3746 269352 : call outfld('MELTO', melto_grid, pcols, lchnk)
3747 269352 : call outfld('HOMOO', homoo_grid, pcols, lchnk)
3748 269352 : call outfld('PRCIO', prcio_grid, pcols, lchnk)
3749 269352 : call outfld('PRAIO', praio_grid, pcols, lchnk)
3750 269352 : call outfld('QIRESO', qireso_grid, pcols, lchnk)
3751 269352 : call outfld('FREQM', freqm_grid, pcols, lchnk)
3752 269352 : call outfld('FREQSL', freqsl_grid, pcols, lchnk)
3753 269352 : call outfld('FREQSLM', freqslm_grid, pcols, lchnk)
3754 269352 : call outfld('FCTM', fctm_grid, pcols, lchnk)
3755 269352 : call outfld('FCTSL', fctsl_grid, pcols, lchnk)
3756 269352 : call outfld('FCTSLM', fctslm_grid, pcols, lchnk)
3757 :
3758 269352 : if (micro_mg_version > 2) then
3759 269352 : call outfld('PRACGO', pracgo_grid, pcols, lchnk)
3760 269352 : call outfld('PSACRO', psacro_grid, pcols, lchnk)
3761 269352 : call outfld('PSACWGO', psacwgo_grid, pcols, lchnk)
3762 269352 : call outfld('PGSACWO', pgsacwo_grid, pcols, lchnk)
3763 269352 : call outfld('PGRACSO', pgracso_grid, pcols, lchnk)
3764 269352 : call outfld('PRDGO', prdgo_grid, pcols, lchnk)
3765 269352 : call outfld('QMULTGO', qmultgo_grid, pcols, lchnk)
3766 269352 : call outfld('QMULTRGO', qmultrgo_grid, pcols, lchnk)
3767 269352 : call outfld('LS_REFFGRAU', reff_grau_grid, pcols, lchnk)
3768 269352 : call outfld ('NPRACGO', npracgo_grid, pcols, lchnk)
3769 269352 : call outfld ('NSCNGO', nscngo_grid, pcols, lchnk)
3770 269352 : call outfld ('NGRACSO', ngracso_grid, pcols, lchnk)
3771 269352 : call outfld ('NMULTGO', nmultgo_grid, pcols, lchnk)
3772 269352 : call outfld ('NMULTRGO', nmultrgo_grid, pcols, lchnk)
3773 269352 : call outfld ('NPSACWGO', npsacwgo_grid, pcols, lchnk)
3774 : end if
3775 :
3776 269352 : if (micro_mg_adjust_cpt) then
3777 0 : cp_rh(:ncol, :pver) = 0._r8
3778 :
3779 0 : do i = 1, ncol
3780 :
3781 : ! Calculate the RH including any T change that we make.
3782 0 : do k = top_lev, pver
3783 0 : call qsat(state_loc%t(i,k), state_loc%pmid(i,k), es, qs)
3784 0 : cp_rh(i,k) = state_loc%q(i, k, ixq) / qs * 100._r8
3785 : end do
3786 : end do
3787 :
3788 0 : call outfld("TROPF_RHADJ", cp_rh, pcols, lchnk)
3789 : end if
3790 :
3791 : ! deallocate the temporary pbuf grid variable which was allocated if subcolumns are not used
3792 269352 : if (.not. use_subcol_microp) then
3793 269352 : deallocate(bergso_grid)
3794 : end if
3795 :
3796 : ! deallocate the proc_rates DDT
3797 269352 : call proc_rates%deallocate(micro_mg_warm_rain)
3798 :
3799 : ! ptend_loc is deallocated in physics_update above
3800 269352 : call physics_state_dealloc(state_loc)
3801 :
3802 269352 : if (qsatfac_idx <= 0) then
3803 0 : deallocate(qsatfac)
3804 : end if
3805 :
3806 808056 : end subroutine micro_pumas_cam_tend
3807 :
3808 0 : subroutine massless_droplet_destroyer(ztodt, state, ptend)
3809 :
3810 : ! This subroutine eradicates cloud droplets in grid boxes with no cloud
3811 : ! mass. This code is now expanded to remove massless rain drops, ice
3812 : ! crystals, and snow flakes.
3813 : !
3814 : ! Note: qsmall, which is a small, positive number, is used as the
3815 : ! threshold here instead of qmin, which is 0. Some numbers that are
3816 : ! supposed to have a value of 0, but don't because of numerical
3817 : ! roundoff (especially after hole filling) will have small, positive
3818 : ! values. Using qsmall as the threshold here instead of qmin allows
3819 : ! for unreasonable massless drop concentrations to be removed in
3820 : ! those scenarios.
3821 :
3822 269352 : use micro_pumas_utils, only: qsmall
3823 : use ref_pres, only: top_lev => trop_cloud_top_lev
3824 :
3825 : implicit none
3826 :
3827 : ! Input Variables
3828 : real(r8), intent(in) :: ztodt ! model time increment
3829 : type(physics_state), intent(in) :: state ! state for columns
3830 :
3831 : ! Input/Output Variables
3832 : type(physics_ptend), intent(inout) :: ptend ! ptend for columns
3833 :
3834 : ! Local Variables
3835 : integer :: icol, k
3836 :
3837 : !----- Begin Code -----
3838 :
3839 : ! Don't do anything if this option isn't enabled.
3840 0 : if ( .not. micro_do_massless_droplet_destroyer ) return
3841 :
3842 0 : col_loop: do icol=1, state%ncol
3843 0 : vert_loop: do k = top_lev, pver
3844 : ! If updated qc (after microphysics) is zero, then ensure updated nc is also zero!!
3845 0 : if ( state%q(icol,k,ixcldliq) + ztodt * ptend%q(icol,k,ixcldliq) < qsmall ) then
3846 0 : ptend%lq(ixnumliq) = .true. ! This is probably already true, but it doesn't
3847 : ! hurt to set it.
3848 0 : ptend%q(icol,k,ixnumliq) = -(state%q(icol,k,ixnumliq) / ztodt)
3849 : end if
3850 0 : if ( ixnumrain > 0 ) then
3851 : ! If updated qr (after microphysics) is zero, then ensure updated nr is also zero!!
3852 0 : if ( state%q(icol,k,ixrain) + ztodt * ptend%q(icol,k,ixrain) < qsmall ) then
3853 0 : ptend%lq(ixnumrain) = .true. ! This is probably already true, but it doesn't
3854 : ! hurt to set it.
3855 0 : ptend%q(icol,k,ixnumrain) = -(state%q(icol,k,ixnumrain) / ztodt)
3856 : end if
3857 : endif ! ixnumrain > 0
3858 : ! If updated qi (after microphysics) is zero, then ensure updated ni is also zero!!
3859 0 : if ( state%q(icol,k,ixcldice) + ztodt * ptend%q(icol,k,ixcldice) < qsmall ) then
3860 0 : ptend%lq(ixnumice) = .true. ! This is probably already true, but it doesn't
3861 : ! hurt to set it.
3862 0 : ptend%q(icol,k,ixnumice) = -(state%q(icol,k,ixnumice) / ztodt)
3863 : end if
3864 0 : if ( ixnumsnow > 0 ) then
3865 : ! If updated qs (after microphysics) is zero, then ensure updated ns is also zero!!
3866 0 : if ( state%q(icol,k,ixsnow) + ztodt * ptend%q(icol,k,ixsnow) < qsmall ) then
3867 0 : ptend%lq(ixnumsnow) = .true. ! This is probably already true, but it doesn't
3868 : ! hurt to set it.
3869 0 : ptend%q(icol,k,ixnumsnow) = -(state%q(icol,k,ixnumsnow) / ztodt)
3870 : end if
3871 : endif ! ixnumsnow > 0
3872 : end do vert_loop
3873 : end do col_loop
3874 :
3875 : return
3876 0 : end subroutine massless_droplet_destroyer
3877 :
3878 : end module micro_pumas_cam
|