LCOV - code coverage report
Current view: top level - physics/cam7 - micro_pumas_cam.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1676 2249 74.5 %
Date: 2025-03-13 19:21:45 Functions: 4 8 50.0 %

          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        1536 : 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        1536 :   if (masterproc) then
     296           2 :      unitn = getunit()
     297           2 :      open( unitn, file=trim(nlfile), status='old' )
     298           2 :      call find_group_name(unitn, 'micro_mg_nl', status=ierr)
     299           2 :      if (ierr == 0) then
     300           2 :         read(unitn, micro_mg_nl, iostat=ierr)
     301           2 :         if (ierr /= 0) then
     302           0 :            call endrun(sub // ':: ERROR reading namelist')
     303             :         end if
     304             :      end if
     305           2 :      close(unitn)
     306           2 :      call freeunit(unitn)
     307             : 
     308             :      ! set local variables
     309           2 :      do_cldice = micro_mg_do_cldice
     310           2 :      do_cldliq = micro_mg_do_cldliq
     311           2 :      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           2 :         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           2 :            call bad_version_endrun()
     328             :         end select
     329             :      case default
     330           2 :         call bad_version_endrun()
     331             :      end select
     332             : 
     333           2 :      if (micro_mg_dcs < 0._r8) call endrun( "micro_pumas_cam_readnl: &
     334           0 :               &micro_mg_dcs has not been set to a valid value.")
     335             : 
     336           2 :      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           2 :         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 :                 &micro_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        1536 :   call mpi_bcast(micro_mg_version, 1, mpi_integer, mstrid, mpicom, ierr)
     356        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_version")
     357             : 
     358        1536 :   call mpi_bcast(micro_mg_sub_version, 1, mpi_integer, mstrid, mpicom, ierr)
     359        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_sub_version")
     360             : 
     361        1536 :   call mpi_bcast(do_cldice, 1, mpi_logical, mstrid, mpicom, ierr)
     362        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: do_cldice")
     363             : 
     364        1536 :   call mpi_bcast(do_cldliq, 1, mpi_logical, mstrid, mpicom, ierr)
     365        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: do_cldliq")
     366             : 
     367        1536 :   call mpi_bcast(num_steps, 1, mpi_integer, mstrid, mpicom, ierr)
     368        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: num_steps")
     369             : 
     370        1536 :   call mpi_bcast(microp_uniform, 1, mpi_logical, mstrid, mpicom, ierr)
     371        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: microp_uniform")
     372             : 
     373        1536 :   call mpi_bcast(micro_mg_dcs, 1, mpi_real8, mstrid, mpicom, ierr)
     374        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_dcs")
     375             : 
     376        1536 :   call mpi_bcast(micro_mg_berg_eff_factor, 1, mpi_real8, mstrid, mpicom, ierr)
     377        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_berg_eff_factor")
     378             : 
     379        1536 :   call mpi_bcast(micro_mg_accre_enhan_fact, 1, mpi_real8, mstrid, mpicom, ierr)
     380        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_accre_enhan_fact")
     381             : 
     382        1536 :   call mpi_bcast(micro_mg_autocon_fact, 1, mpi_real8, mstrid, mpicom, ierr)
     383        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_autocon_fact")
     384             : 
     385        1536 :   call mpi_bcast(micro_mg_autocon_nd_exp, 1, mpi_real8, mstrid, mpicom, ierr)
     386        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_autocon_nd_exp")
     387             : 
     388        1536 :   call mpi_bcast(micro_mg_autocon_lwp_exp, 1, mpi_real8, mstrid, mpicom, ierr)
     389        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_autocon_lwp_exp")
     390             : 
     391        1536 :   call mpi_bcast(micro_mg_homog_size, 1, mpi_real8, mstrid, mpicom, ierr)
     392        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_homog_size")
     393             : 
     394        1536 :   call mpi_bcast(micro_mg_vtrmi_factor, 1, mpi_real8, mstrid, mpicom, ierr)
     395        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_vtrmi_factor")
     396             : 
     397        1536 :   call mpi_bcast(micro_mg_vtrms_factor, 1, mpi_real8, mstrid, mpicom, ierr)
     398        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_vtrms_factor")
     399             : 
     400        1536 :   call mpi_bcast(micro_mg_effi_factor, 1, mpi_real8, mstrid, mpicom, ierr)
     401        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_effi_factor")
     402             : 
     403        1536 :   call mpi_bcast(micro_mg_iaccr_factor, 1, mpi_real8, mstrid, mpicom, ierr)
     404        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_iaccr_factor")
     405             : 
     406        1536 :   call mpi_bcast(micro_mg_max_nicons, 1, mpi_real8, mstrid, mpicom, ierr)
     407        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_max_nicons")
     408             : 
     409        1536 :   call mpi_bcast(micro_mg_precip_frac_method, 16, mpi_character, mstrid, mpicom, ierr)
     410        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_precip_frac_method")
     411             : 
     412        1536 :   call mpi_bcast(micro_mg_warm_rain, 16, mpi_character, mstrid, mpicom, ierr)
     413        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_warm_rain")
     414             : 
     415        1536 :   call mpi_bcast(micro_mg_adjust_cpt, 1, mpi_logical, mstrid, mpicom, ierr)
     416        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_adjust_cpt")
     417             : 
     418        1536 :   call mpi_bcast(micro_mg_nccons, 1, mpi_logical, mstrid, mpicom, ierr)
     419        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nccons")
     420             : 
     421        1536 :   call mpi_bcast(micro_mg_nicons, 1, mpi_logical, mstrid, mpicom, ierr)
     422        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nicons")
     423             : 
     424        1536 :   call mpi_bcast(micro_mg_nrcons, 1, mpi_logical, mstrid, mpicom, ierr)
     425        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nrcons")
     426             : 
     427        1536 :   call mpi_bcast(micro_mg_nscons, 1, mpi_logical, mstrid, mpicom, ierr)
     428        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nscons")
     429             : 
     430        1536 :   call mpi_bcast(micro_mg_ncnst, 1, mpi_real8, mstrid, mpicom, ierr)
     431        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ncnst")
     432             : 
     433        1536 :   call mpi_bcast(micro_mg_ninst, 1, mpi_real8, mstrid, mpicom, ierr)
     434        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ninst")
     435             : 
     436        1536 :   call mpi_bcast(micro_mg_nrnst, 1, mpi_real8, mstrid, mpicom, ierr)
     437        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nrnst")
     438             : 
     439        1536 :   call mpi_bcast(micro_mg_nsnst, 1, mpi_real8, mstrid, mpicom, ierr)
     440        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_nsnst")
     441             : 
     442        1536 :   call mpi_bcast(micro_mg_do_hail, 1, mpi_logical, mstrid, mpicom, ierr)
     443        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_do_hail")
     444             : 
     445        1536 :   call mpi_bcast(micro_mg_do_graupel, 1, mpi_logical, mstrid, mpicom, ierr)
     446        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_do_graupel")
     447             : 
     448        1536 :   call mpi_bcast(micro_mg_ngcons, 1, mpi_logical, mstrid, mpicom, ierr)
     449        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ngcons")
     450             : 
     451        1536 :   call mpi_bcast(micro_mg_ngnst, 1, mpi_real8, mstrid, mpicom, ierr)
     452        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ngnst")
     453             : 
     454        1536 :   call mpi_bcast(micro_do_massless_droplet_destroyer, 1, mpi_logical, mstrid, mpicom, ierr)
     455        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_do_massless_droplet_destroyer")
     456             : 
     457        1536 :   call mpi_bcast(micro_mg_evap_sed_off, 1, mpi_logical, mstrid, mpicom, ierr)
     458        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_evap_sed_off")
     459             : 
     460        1536 :   call mpi_bcast(micro_mg_icenuc_rh_off, 1, mpi_logical, mstrid, mpicom, ierr)
     461        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_icenuc_rh_off")
     462             : 
     463        1536 :   call mpi_bcast(micro_mg_icenuc_use_meyers, 1, mpi_logical, mstrid, mpicom, ierr)
     464        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_icenuc_use_meyers")
     465             : 
     466        1536 :   call mpi_bcast(micro_mg_evap_scl_ifs, 1, mpi_logical, mstrid, mpicom, ierr)
     467        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_evap_scl_ifs")
     468             : 
     469        1536 :   call mpi_bcast(micro_mg_evap_rhthrsh_ifs, 1, mpi_logical, mstrid, mpicom, ierr)
     470        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_evap_rhthrsh_ifs")
     471             : 
     472        1536 :   call mpi_bcast(micro_mg_rainfreeze_ifs, 1, mpi_logical, mstrid, mpicom, ierr)
     473        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_rainfreeze_ifs")
     474             : 
     475        1536 :   call mpi_bcast(micro_mg_ifs_sed, 1, mpi_logical, mstrid, mpicom, ierr)
     476        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_ifs_sed")
     477             : 
     478        1536 :   call mpi_bcast(micro_mg_precip_fall_corr, 1, mpi_logical, mstrid, mpicom, ierr)
     479        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_precip_fall_corr")
     480             : 
     481        1536 :   call mpi_bcast(micro_mg_implicit_fall, 1, mpi_logical, mstrid, mpicom, ierr)
     482        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_implicit_fall")
     483             : 
     484        1536 :   call mpi_bcast(micro_mg_accre_sees_auto, 1, mpi_logical, mstrid, mpicom, ierr)
     485        1536 :   if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_accre_sees_auto")
     486             : 
     487        1536 :   if(micro_mg_berg_eff_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_berg_eff_factor is not set")
     488        1536 :   if(micro_mg_accre_enhan_fact == unset_r8) call endrun(sub//": FATAL: micro_mg_accre_enhan_fact is not set")
     489        1536 :   if(micro_mg_autocon_fact == unset_r8) call endrun(sub//": FATAL: micro_mg_autocon_fact is not set")
     490        1536 :   if(micro_mg_autocon_nd_exp == unset_r8) call endrun(sub//": FATAL: micro_mg_autocon_nd_exp is not set")
     491        1536 :   if(micro_mg_autocon_lwp_exp == unset_r8) call endrun(sub//": FATAL: micro_mg_autocon_lwp_exp is not set")
     492        1536 :   if(micro_mg_homog_size == unset_r8) call endrun(sub//": FATAL: micro_mg_homog_size is not set")
     493        1536 :   if(micro_mg_vtrmi_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_vtrmi_factor is not set")
     494        1536 :   if(micro_mg_vtrms_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_vtrms_factor is not set")
     495        1536 :   if(micro_mg_effi_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_effi_factor is not set")
     496        1536 :   if(micro_mg_iaccr_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_iaccr_factor is not set")
     497        1536 :   if(micro_mg_max_nicons == unset_r8) call endrun(sub//": FATAL: micro_mg_max_nicons is not set")
     498             : 
     499        1536 :   if (masterproc) then
     500             : 
     501           2 :      write(iulog,*) 'MG microphysics namelist:'
     502           2 :      write(iulog,*) '  micro_mg_version            = ', micro_mg_version
     503           2 :      write(iulog,*) '  micro_mg_sub_version        = ', micro_mg_sub_version
     504           2 :      write(iulog,*) '  micro_mg_do_cldice          = ', do_cldice
     505           2 :      write(iulog,*) '  micro_mg_do_cldliq          = ', do_cldliq
     506           2 :      write(iulog,*) '  micro_mg_num_steps          = ', num_steps
     507           2 :      write(iulog,*) '  microp_uniform              = ', microp_uniform
     508           2 :      write(iulog,*) '  micro_mg_dcs                = ', micro_mg_dcs
     509           2 :      write(iulog,*) '  micro_mg_berg_eff_factor    = ', micro_mg_berg_eff_factor
     510           2 :      write(iulog,*) '  micro_mg_accre_enhan_fact   = ', micro_mg_accre_enhan_fact
     511           2 :      write(iulog,*) '  micro_mg_autocon_fact       = ' , micro_mg_autocon_fact
     512           2 :      write(iulog,*) '  micro_mg_autocon_nd_exp     = ' , micro_mg_autocon_nd_exp
     513           2 :      write(iulog,*) '  micro_mg_autocon_lwp_exp    = ' , micro_mg_autocon_lwp_exp
     514           2 :      write(iulog,*) '  micro_mg_homog_size         = ', micro_mg_homog_size
     515           2 :      write(iulog,*) '  micro_mg_vtrmi_factor       = ', micro_mg_vtrmi_factor
     516           2 :      write(iulog,*) '  micro_mg_vtrms_factor       = ', micro_mg_vtrms_factor
     517           2 :      write(iulog,*) '  micro_mg_effi_factor        = ', micro_mg_effi_factor
     518           2 :      write(iulog,*) '  micro_mg_iaccr_factor       = ', micro_mg_iaccr_factor
     519           2 :      write(iulog,*) '  micro_mg_max_nicons         = ', micro_mg_max_nicons
     520           2 :      write(iulog,*) '  micro_mg_precip_frac_method = ', micro_mg_precip_frac_method
     521           2 :      write(iulog,*) '  micro_mg_warm_rain          = ', micro_mg_warm_rain
     522           2 :      write(iulog,*) '  micro_mg_adjust_cpt         = ', micro_mg_adjust_cpt
     523           2 :      write(iulog,*) '  micro_mg_nccons             = ', micro_mg_nccons
     524           2 :      write(iulog,*) '  micro_mg_nicons             = ', micro_mg_nicons
     525           2 :      write(iulog,*) '  micro_mg_ncnst              = ', micro_mg_ncnst
     526           2 :      write(iulog,*) '  micro_mg_ninst              = ', micro_mg_ninst
     527           2 :      write(iulog,*) '  micro_mg_ngcons             = ', micro_mg_ngcons
     528           2 :      write(iulog,*) '  micro_mg_ngnst              = ', micro_mg_ngnst
     529           2 :      write(iulog,*) '  micro_mg_do_hail            = ', micro_mg_do_hail
     530           2 :      write(iulog,*) '  micro_mg_do_graupel         = ', micro_mg_do_graupel
     531           2 :      write(iulog,*) '  micro_do_massless_droplet_destroyer = ', micro_do_massless_droplet_destroyer
     532           2 :      write(iulog,*) '  micro_mg_nrcons             = ', micro_mg_nrcons
     533           2 :      write(iulog,*) '  micro_mg_nscons             = ', micro_mg_nscons
     534           2 :      write(iulog,*) '  micro_mg_nrnst              = ', micro_mg_nrnst
     535           2 :      write(iulog,*) '  micro_mg_nsnst              = ', micro_mg_nsnst
     536           2 :      write(iulog,*) '  micro_mg_evap_sed_off       = ', micro_mg_evap_sed_off
     537           2 :      write(iulog,*) '  micro_mg_icenuc_rh_off      = ', micro_mg_icenuc_rh_off
     538           2 :      write(iulog,*) '  micro_mg_icenuc_use_meyers  = ', micro_mg_icenuc_use_meyers
     539           2 :      write(iulog,*) '  micro_mg_evap_scl_ifs       = ', micro_mg_evap_scl_ifs
     540           2 :      write(iulog,*) '  micro_mg_evap_rhthrsh_ifs   = ', micro_mg_evap_rhthrsh_ifs
     541           2 :      write(iulog,*) '  micro_mg_rainfreeze_ifs     = ', micro_mg_rainfreeze_ifs
     542           2 :      write(iulog,*) '  micro_mg_ifs_sed            = ', micro_mg_ifs_sed
     543           2 :      write(iulog,*) '  micro_mg_precip_fall_corr     = ', micro_mg_precip_fall_corr
     544           2 :      write(iulog,*) '  micro_mg_implicit_fall     = ', micro_mg_implicit_fall
     545           2 :      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        3072 :   if( trim(micro_mg_warm_rain) == 'emulated') then
     550           0 :      call stochastic_emulated_readnl(nlfile)
     551        1536 :   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        1536 :   end subroutine bad_version_endrun
     564             : 
     565             : end subroutine micro_pumas_cam_readnl
     566             : 
     567             : !================================================================================================
     568             : 
     569        1536 : 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        4608 :    allocate(trop_levs(pver-top_lev+1), stat=ierr)
     585        1536 :    call handle_allocate_error(ierr, 'micro_pumas_cam_register', 'trop_levs')
     586             : 
     587             :    call phys_getopts(use_subcol_microp_out    = use_subcol_microp, &
     588        1536 :                      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        1536 :       longname='Grid box averaged cloud liquid amount', is_convtran1=.true.)
     594             :    call cnst_add(cnst_names(2), mwh2o, cpair, 0._r8, ixcldice, &
     595        1536 :       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        1536 :       longname='Grid box averaged cloud liquid number', is_convtran1=.true.)
     600             :    call cnst_add(cnst_names(4), mwh2o, cpair, 0._r8, ixnumice, &
     601        1536 :       longname='Grid box averaged cloud ice number', is_convtran1=.true.)
     602             : 
     603             :    ! Add history coordinate for DDT nlev
     604        1536 :    call hist_dimension_values('lev',all_levs, 1, pver, found)
     605             : 
     606        1536 :    if (found) then
     607      130560 :       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        1536 :             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        1536 :         longname='Grid box averaged rain amount', is_convtran1=.true.)
     619             :    call cnst_add(cnst_names(6), mwh2o, cpair, 0._r8, ixsnow, &
     620        1536 :         longname='Grid box averaged snow amount', is_convtran1=.true.)
     621             :    call cnst_add(cnst_names(7), mwh2o, cpair, 0._r8, ixnumrain, &
     622        1536 :         longname='Grid box averaged rain number', is_convtran1=.true.)
     623             :    call cnst_add(cnst_names(8), mwh2o, cpair, 0._r8, ixnumsnow, &
     624        1536 :         longname='Grid box averaged snow number', is_convtran1=.true.)
     625             : 
     626        1536 :    if (micro_mg_version > 2) then
     627             :          call cnst_add(cnst_names(9), mwh2o, cpair, 0._r8, ixgraupel, &
     628        1536 :               longname='Grid box averaged graupel/hail amount', is_convtran1=.true.)
     629             :          call cnst_add(cnst_names(10), mwh2o, cpair, 0._r8, ixnumgraupel, &
     630        1536 :               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        6144 :    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        1536 :    call pbuf_add_field('QME',        'physpkg',dtype_r8,(/pcols,pver/), qme_idx)
     640        1536 :    call pbuf_add_field('PRAIN',      'physpkg',dtype_r8,(/pcols,pver/), prain_idx)
     641        1536 :    call pbuf_add_field('NEVAPR',     'physpkg',dtype_r8,(/pcols,pver/), nevapr_idx)
     642        1536 :    call pbuf_add_field('PRER_EVAP',  'global', dtype_r8,(/pcols,pver/), prer_evap_idx)
     643        1536 :    call pbuf_add_field('BERGSO',     'physpkg',dtype_r8,(/pcols,pver/), bergso_idx)
     644             : 
     645        1536 :    call pbuf_add_field('WSEDL',      'physpkg',dtype_r8,(/pcols,pver/), wsedl_idx)
     646             : 
     647        1536 :    call pbuf_add_field('REI',        'physpkg',dtype_r8,(/pcols,pver/), rei_idx)
     648        1536 :    call pbuf_add_field('SADICE',     'physpkg',dtype_r8,(/pcols,pver/), sadice_idx)
     649        1536 :    call pbuf_add_field('SADSNOW',    'physpkg',dtype_r8,(/pcols,pver/), sadsnow_idx)
     650        1536 :    call pbuf_add_field('REL',        'physpkg',dtype_r8,(/pcols,pver/), rel_idx)
     651             : 
     652             :    ! Mitchell ice effective diameter for radiation
     653        1536 :    call pbuf_add_field('DEI',        'physpkg',dtype_r8,(/pcols,pver/), dei_idx)
     654             :    ! Size distribution shape parameter for radiation
     655        1536 :    call pbuf_add_field('MU',         'physpkg',dtype_r8,(/pcols,pver/), mu_idx)
     656             :    ! Size distribution shape parameter for radiation
     657        1536 :    call pbuf_add_field('LAMBDAC',    'physpkg',dtype_r8,(/pcols,pver/), lambdac_idx)
     658             : 
     659             :    ! Stratiform only in cloud ice water path for radiation
     660        1536 :    call pbuf_add_field('ICIWPST',    'physpkg',dtype_r8,(/pcols,pver/), iciwpst_idx)
     661             :    ! Stratiform in cloud liquid water path for radiation
     662        1536 :    call pbuf_add_field('ICLWPST',    'physpkg',dtype_r8,(/pcols,pver/), iclwpst_idx)
     663             : 
     664             :    ! Snow effective diameter for radiation
     665        1536 :    call pbuf_add_field('DES',        'physpkg',dtype_r8,(/pcols,pver/), des_idx)
     666             :    ! In cloud snow water path for radiation
     667        1536 :    call pbuf_add_field('ICSWP',      'physpkg',dtype_r8,(/pcols,pver/), icswp_idx)
     668             :    ! Cloud fraction for liquid drops + snow
     669        6144 :    call pbuf_add_field('CLDFSNOW ',  'physpkg',dtype_r8,(/pcols,pver,dyn_time_lvls/), cldfsnow_idx)
     670             : 
     671        1536 :    if (micro_mg_version > 2) then
     672             :       ! Graupel effective diameter for radiation
     673        1536 :       call pbuf_add_field('DEGRAU',        'physpkg',dtype_r8,(/pcols,pver/), degrau_idx)
     674             :       ! In cloud snow water path for radiation
     675        1536 :       call pbuf_add_field('ICGRAUWP',      'physpkg',dtype_r8,(/pcols,pver/), icgrauwp_idx)
     676             :       ! Cloud fraction for liquid drops + graupel
     677        1536 :       call pbuf_add_field('CLDFGRAU',      'physpkg',dtype_r8,(/pcols,pver/), cldfgrau_idx)
     678             :    end if
     679             : 
     680        1536 :    if (prog_modal_aero) then
     681        1536 :       call pbuf_add_field('RATE1_CW2PR_ST','physpkg',dtype_r8,(/pcols,pver/), rate1_cw2pr_st_idx)
     682             :    endif
     683             : 
     684        1536 :    call pbuf_add_field('LS_FLXPRC',  'physpkg',dtype_r8,(/pcols,pverp/), ls_flxprc_idx)
     685        1536 :    call pbuf_add_field('LS_FLXSNW',  'physpkg',dtype_r8,(/pcols,pverp/), ls_flxsnw_idx)
     686             : 
     687             : 
     688             :    ! Fields needed as inputs to COSP
     689        1536 :    call pbuf_add_field('LS_MRPRC',   'physpkg',dtype_r8,(/pcols,pver/), ls_mrprc_idx)
     690        1536 :    call pbuf_add_field('LS_MRSNW',   'physpkg',dtype_r8,(/pcols,pver/), ls_mrsnw_idx)
     691        1536 :    call pbuf_add_field('LS_REFFRAIN','physpkg',dtype_r8,(/pcols,pver/), ls_reffrain_idx)
     692        1536 :    call pbuf_add_field('LS_REFFSNOW','physpkg',dtype_r8,(/pcols,pver/), ls_reffsnow_idx)
     693        1536 :    call pbuf_add_field('CV_REFFLIQ', 'physpkg',dtype_r8,(/pcols,pver/), cv_reffliq_idx)
     694        1536 :    call pbuf_add_field('CV_REFFICE', 'physpkg',dtype_r8,(/pcols,pver/), cv_reffice_idx)
     695             : 
     696             :    ! CC_* Fields needed by Park macrophysics
     697        6144 :    call pbuf_add_field('CC_T',     'global',  dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_t_idx)
     698        6144 :    call pbuf_add_field('CC_qv',    'global',  dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_qv_idx)
     699        6144 :    call pbuf_add_field('CC_ql',    'global',  dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_ql_idx)
     700        6144 :    call pbuf_add_field('CC_qi',    'global',  dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_qi_idx)
     701        6144 :    call pbuf_add_field('CC_nl',    'global',  dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_nl_idx)
     702        6144 :    call pbuf_add_field('CC_ni',    'global',  dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_ni_idx)
     703        6144 :    call pbuf_add_field('CC_qlst',  'global',  dtype_r8, (/pcols,pver,dyn_time_lvls/), cc_qlst_idx)
     704             : 
     705             :    ! Fields for UNICON
     706        1536 :    call pbuf_add_field('am_evp_st',  'global', dtype_r8, (/pcols,pver/), am_evp_st_idx)
     707        1536 :    call pbuf_add_field('evprain_st', 'global', dtype_r8, (/pcols,pver/), evprain_st_idx)
     708        1536 :    call pbuf_add_field('evpsnow_st', 'global', dtype_r8, (/pcols,pver/), evpsnow_st_idx)
     709             : 
     710             :    ! Register subcolumn pbuf fields
     711        1536 :    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        1536 :    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        1536 :    call pbuf_add_field('ACPRECL',    'global',dtype_r8,(/pcols/), acpr_idx)   ! accumulated precip
     793        1536 :    call pbuf_add_field('ACGCME',     'global',dtype_r8,(/pcols/), acgcme_idx) ! accumulated condensation
     794        1536 :    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        1536 :    call pbuf_add_field('RELVAR',     'global',dtype_r8,(/pcols,pver/), relvar_idx)
     798        1536 :    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        1536 :    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        1536 :       call pbuf_add_field('QISEVAP', 'physpkg', dtype_r8, (/pcols,pver/), qisevap_idx)
     819             :    end if
     820             : 
     821        3072 : 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        1536 : 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        1536 : 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        1536 :                      do_clubb_sgs_out     =do_clubb_sgs)
     899             : 
     900        1536 :    if (do_clubb_sgs) then
     901        1536 :      allow_sed_supersat = .false.
     902             :    else
     903           0 :      allow_sed_supersat = .true.
     904             :    endif
     905             : 
     906        1536 :    if (masterproc) then
     907           2 :       write(iulog,"(A,I2,A,I2)") "Initializing MG version ",micro_mg_version,".",micro_mg_sub_version
     908           2 :       if (.not. do_cldliq) &
     909           0 :            write(iulog,*) "MG prognostic cloud liquid has been turned off via namelist."
     910           2 :       if (.not. do_cldice) &
     911           0 :            write(iulog,*) "MG prognostic cloud ice has been turned off via namelist."
     912           2 :       write(iulog,*) "Number of microphysics substeps is: ",num_steps
     913             :    end if
     914             : 
     915             :    ! Set constituent number for later loops.
     916        1536 :    if(micro_mg_version == 2) then
     917           0 :          ncnst = 8
     918             :    else
     919        1536 :          ncnst = 10
     920             :    end if
     921             : 
     922             :    ! If Machine learning is turned on, perform its initializations
     923        1536 :    if (trim(micro_mg_warm_rain) == 'tau') then
     924           0 :       call stochastic_tau_init_cam()
     925        1536 :    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        1536 :            stochastic_emulated_filename_output_scale, iulog, errstring)
     952             : 
     953        1536 :    call handle_errmsg(errstring, subname="micro_pumas_cam_init")
     954             : 
     955             :    ! Retrieve the index for water vapor
     956        1536 :    call cnst_get_ind('Q', ixq)
     957             : 
     958             :    ! Register history variables
     959       16896 :    do m = 1, ncnst
     960       15360 :       call cnst_get_ind(cnst_names(m), mm)
     961       70656 :       if ( any(mm == (/ ixcldliq, ixcldice, ixrain, ixsnow, ixgraupel /)) ) then
     962             :          ! mass mixing ratios
     963       15360 :          call addfld(cnst_name(mm), (/ 'lev' /), 'A', 'kg/kg', cnst_longname(mm),  sampled_on_subcycle=.true.)
     964        7680 :          call addfld(sflxnam(mm),    horiz_only, 'A',   'kg/m2/s', trim(cnst_name(mm))//' surface flux', sampled_on_subcycle=.true.)
     965       23040 :       else if ( any(mm == (/ ixnumliq, ixnumice, ixnumrain, ixnumsnow, ixnumgraupel /)) ) then
     966             :          ! number concentrations
     967       15360 :          call addfld(cnst_name(mm), (/ 'lev' /), 'A', '1/kg', cnst_longname(mm), sampled_on_subcycle=.true.)
     968        7680 :          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        3072 :    call addfld(apcnst(ixcldliq), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixcldliq))//' after physics', sampled_on_subcycle=.true.)
     976        3072 :    call addfld(apcnst(ixcldice), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixcldice))//' after physics', sampled_on_subcycle=.true.)
     977        3072 :    call addfld(bpcnst(ixcldliq), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixcldliq))//' before physics', sampled_on_subcycle=.true.)
     978        3072 :    call addfld(bpcnst(ixcldice), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixcldice))//' before physics', sampled_on_subcycle=.true.)
     979             : 
     980        3072 :    call addfld(apcnst(ixrain), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixrain))//' after physics', sampled_on_subcycle=.true.)
     981        3072 :    call addfld(apcnst(ixsnow), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixsnow))//' after physics', sampled_on_subcycle=.true.)
     982        3072 :    call addfld(bpcnst(ixrain), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixrain))//' before physics', sampled_on_subcycle=.true.)
     983        3072 :    call addfld(bpcnst(ixsnow), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixsnow))//' before physics', sampled_on_subcycle=.true.)
     984             : 
     985        1536 :    if (micro_mg_version > 2) then
     986        3072 :       call addfld(apcnst(ixgraupel), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixgraupel))//' after physics',  sampled_on_subcycle=.true.)
     987        3072 :       call addfld(bpcnst(ixgraupel), (/ 'lev' /), 'A', 'kg/kg', trim(cnst_name(ixgraupel))//' before physics', sampled_on_subcycle=.true.)
     988             :    end if
     989             : 
     990        3072 :    call addfld ('CME',        (/ 'lev' /), 'A', 'kg/kg/s',  'Rate of cond-evap within the cloud',              sampled_on_subcycle=.true.)
     991        3072 :    call addfld ('PRODPREC',   (/ 'lev' /), 'A', 'kg/kg/s',  'Rate of conversion of condensate to precip',      sampled_on_subcycle=.true.)
     992        3072 :    call addfld ('EVAPPREC',   (/ 'lev' /), 'A', 'kg/kg/s',  'Rate of evaporation of falling precip',           sampled_on_subcycle=.true.)
     993        3072 :    call addfld ('EVAPSNOW',   (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Rate of evaporation of falling snow',    sampled_on_subcycle=.true.)
     994        3072 :    call addfld ('HPROGCLD',   (/ 'lev' /), 'A', 'W/kg'    , 'Heating from prognostic clouds',                  sampled_on_subcycle=.true.)
     995        3072 :    call addfld ('FICE',       (/ 'lev' /), 'A', 'fraction', 'Fractional ice content within cloud',             sampled_on_subcycle=.true.)
     996        3072 :    call addfld ('CLDFSNOW',   (/ 'lev' /), 'A', '1',        'Cloud fraction adjusted for snow',                sampled_on_subcycle=.true.)
     997        3072 :    call addfld ('ICWMRST',    (/ 'lev' /), 'A', 'kg/kg',    'Prognostic in-stratus water mixing ratio',        sampled_on_subcycle=.true.)
     998        3072 :    call addfld ('ICIMRST',    (/ 'lev' /), 'A', 'kg/kg',    'Prognostic in-stratus ice mixing ratio',          sampled_on_subcycle=.true.)
     999             : 
    1000             :    ! MG microphysics diagnostics
    1001        3072 :    call addfld ('QCSEVAP',    (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Rate of evaporation of falling cloud water', sampled_on_subcycle=.true.)
    1002        3072 :    call addfld ('QISEVAP',    (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Rate of sublimation of falling cloud ice',   sampled_on_subcycle=.true.)
    1003        3072 :    call addfld ('QVRES',      (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Rate of residual condensation term',         sampled_on_subcycle=.true.)
    1004        3072 :    call addfld ('CMEIOUT',    (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Rate of deposition/sublimation of cloud ice',sampled_on_subcycle=.true.)
    1005        3072 :    call addfld ('VTRMC',      (/ 'trop_cld_lev' /), 'A', 'm/s',      'Mass-weighted cloud water fallspeed',        sampled_on_subcycle=.true.)
    1006        3072 :    call addfld ('VTRMI',      (/ 'trop_cld_lev' /), 'A', 'm/s',      'Mass-weighted cloud ice fallspeed',          sampled_on_subcycle=.true.)
    1007        3072 :    call addfld ('QCSEDTEN',   (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Cloud water mixing ratio tendency from sedimentation', sampled_on_subcycle=.true.)
    1008        3072 :    call addfld ('QISEDTEN',   (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Cloud ice mixing ratio tendency from sedimentation',   sampled_on_subcycle=.true.)
    1009        3072 :    call addfld ('PRAO',       (/ 'lev' /), 'A', 'kg/kg/s',  'Accretion of cloud water by rain',                    sampled_on_subcycle=.true.)
    1010        3072 :    call addfld ('PRCO',       (/ 'lev' /), 'A', 'kg/kg/s',  'Autoconversion of cloud water',                       sampled_on_subcycle=.true.)
    1011        3072 :    call addfld ('MNUCCCO',    (/ 'lev' /), 'A', 'kg/kg/s',  'Immersion freezing of cloud water',                   sampled_on_subcycle=.true.)
    1012        3072 :    call addfld ('MNUCCTO',    (/ 'lev' /), 'A', 'kg/kg/s',  'Contact freezing of cloud water',                     sampled_on_subcycle=.true.)
    1013        3072 :    call addfld ('MNUCCDO',    (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Homogeneous and heterogeneous nucleation from vapor', sampled_on_subcycle=.true.)
    1014        3072 :    call addfld ('MNUCCDOhet', (/ 'lev' /), 'A', 'kg/kg/s',  'Heterogeneous nucleation from vapor',                 sampled_on_subcycle=.true.)
    1015        3072 :    call addfld ('MSACWIO',    (/ 'lev' /), 'A', 'kg/kg/s',  'Conversion of cloud water from rime-splintering',     sampled_on_subcycle=.true.)
    1016        3072 :    call addfld ('PSACWSO',    (/ 'lev' /), 'A', 'kg/kg/s',  'Accretion of cloud water by snow',                    sampled_on_subcycle=.true.)
    1017        3072 :    call addfld ('BERGSO',     (/ 'lev' /), 'A', 'kg/kg/s',  'Conversion of cloud water to snow from bergeron',     sampled_on_subcycle=.true.)
    1018        3072 :    call addfld ('BERGO',      (/ 'lev' /), 'A', 'kg/kg/s',  'Conversion of cloud water to cloud ice from bergeron',sampled_on_subcycle=.true.)
    1019        3072 :    call addfld ('MELTO',      (/ 'lev' /), 'A', 'kg/kg/s',  'Melting of cloud ice',                                sampled_on_subcycle=.true.)
    1020        3072 :    call addfld ('MELTSTOT',   (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Melting of snow',                            sampled_on_subcycle=.true.)
    1021        3072 :    call addfld ('MNUDEPO',    (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Deposition Nucleation',                      sampled_on_subcycle=.true.)
    1022        3072 :    call addfld ('HOMOO',      (/ 'lev' /), 'A', 'kg/kg/s',  'Homogeneous freezing of cloud water',                 sampled_on_subcycle=.true.)
    1023        3072 :    call addfld ('QCRESO',     (/ 'lev' /), 'A', 'kg/kg/s',  'Residual condensation term for cloud water',          sampled_on_subcycle=.true.)
    1024        3072 :    call addfld ('PRCIO',      (/ 'lev' /), 'A', 'kg/kg/s',  'Autoconversion of cloud ice to snow',                 sampled_on_subcycle=.true.)
    1025        3072 :    call addfld ('PRAIO',      (/ 'lev' /), 'A', 'kg/kg/s',  'Accretion of cloud ice to snow',                      sampled_on_subcycle=.true.)
    1026        3072 :    call addfld ('QIRESO',     (/ 'lev' /), 'A', 'kg/kg/s',  'Residual deposition term for cloud ice',              sampled_on_subcycle=.true.)
    1027        3072 :    call addfld ('MNUCCRO',    (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Heterogeneous freezing of rain to snow',     sampled_on_subcycle=.true.)
    1028        3072 :    call addfld ('MNUCCRIO',   (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Heterogeneous freezing of rain to ice',      sampled_on_subcycle=.true.)
    1029        3072 :    call addfld ('PRACSO',     (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Accretion of rain by snow',                  sampled_on_subcycle=.true.)
    1030        3072 :    call addfld ('VAPDEPSO',   (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Vapor deposition onto snow',                 sampled_on_subcycle=.true.)
    1031        3072 :    call addfld ('MELTSDT',    (/ 'trop_cld_lev' /), 'A', 'W/kg',     'Latent heating rate due to melting of snow', sampled_on_subcycle=.true.)
    1032        3072 :    call addfld ('FRZRDT',     (/ 'trop_cld_lev' /), 'A', 'W/kg',     'Latent heating rate due to homogeneous freezing of rain', sampled_on_subcycle=.true.)
    1033        3072 :    call addfld ('QRSEDTEN',   (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Rain mixing ratio tendency from sedimentation', sampled_on_subcycle=.true.)
    1034        3072 :    call addfld ('QSSEDTEN',   (/ 'trop_cld_lev' /), 'A', 'kg/kg/s', 'Snow mixing ratio tendency from sedimentation', sampled_on_subcycle=.true.)
    1035        3072 :    call addfld ('NNUCCCO',    (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Immersion freezing of cloud water', sampled_on_subcycle=.true.)
    1036        3072 :    call addfld ('NNUCCTO',    (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Contact freezing of cloud water',   sampled_on_subcycle=.true.)
    1037        3072 :    call addfld ('NNUCCDO',    (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Ice nucleation',                    sampled_on_subcycle=.true.)
    1038        3072 :    call addfld ('NNUDEPO',    (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Deposition Nucleation',             sampled_on_subcycle=.true.)
    1039        3072 :    call addfld ('NHOMO',      (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Homogeneous freezing of cloud water',    sampled_on_subcycle=.true.)
    1040        3072 :    call addfld ('NNUCCRO',    (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to heterogeneous freezing of rain to snow', sampled_on_subcycle=.true.)
    1041        3072 :    call addfld ('NNUCCRIO',   (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Heterogeneous freezing of rain to ice',  sampled_on_subcycle=.true.)
    1042        3072 :    call addfld ('NSACWIO',    (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Ice Multiplication- Rime-splintering',   sampled_on_subcycle=.true.)
    1043        3072 :    call addfld ('NPRAO',      (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Accretion of cloud water by rain',       sampled_on_subcycle=.true.)
    1044        3072 :    call addfld ('NPSACWSO',   (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Accretion of cloud water by snow',       sampled_on_subcycle=.true.)
    1045        3072 :    call addfld ('NPRAIO',     (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Accretion of cloud ice to snow',         sampled_on_subcycle=.true.)
    1046        3072 :    call addfld ('NPRACSO',    (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Accretion of rain by snow',              sampled_on_subcycle=.true.)
    1047        3072 :    call addfld ('NPRCO',      (/ 'trop_cld_lev' /), 'A', '#/kg/s', 'Number Tendency due to Autoconversion of cloud water [to rain]', sampled_on_subcycle=.true.)
    1048        3072 :    call addfld ('NPRCIO',     (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Autoconversion of cloud ice to snow',    sampled_on_subcycle=.true.)
    1049        3072 :    call addfld ('NCSEDTEN',   (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to cloud liquid sedimentation',             sampled_on_subcycle=.true.)
    1050        3072 :    call addfld ('NISEDTEN',   (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to cloud ice sedimentation',                sampled_on_subcycle=.true.)
    1051        3072 :    call addfld ('NRSEDTEN',   (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to rain sedimentation',                     sampled_on_subcycle=.true.)
    1052        3072 :    call addfld ('NSSEDTEN',   (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to snow sedimentation',                     sampled_on_subcycle=.true.)
    1053        3072 :    call addfld ('NMELTO',     (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Melting of cloud ice',                   sampled_on_subcycle=.true.)
    1054        3072 :    call addfld ('NMELTS',     (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Melting of snow',                        sampled_on_subcycle=.true.)
    1055             : 
    1056        1536 :    if (trim(micro_mg_warm_rain) == 'kk2000') then
    1057        3072 :       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        3072 :       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        3072 :       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        3072 :       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        1536 :    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        3072 :    call addfld ('LAMC',    (/ 'trop_cld_lev' /), 'A', 'unitless',  'Size distribution parameter lambda for liquid',    sampled_on_subcycle=.true. )
    1069        3072 :    call addfld ('LAMR',    (/ 'trop_cld_lev' /), 'A', 'unitless',  'Size distribution parameter lambda for rain',      sampled_on_subcycle=.true.)
    1070        3072 :    call addfld ('PGAM',    (/ 'trop_cld_lev' /), 'A', 'unitless',  'Size distribution parameter mu (pgam) for liquid', sampled_on_subcycle=.true.)
    1071        3072 :    call addfld ('N0R',     (/ 'trop_cld_lev' /), 'A', 'unitless',  'Size distribution parameter n0 for rain',          sampled_on_subcycle=.true.)
    1072             : 
    1073        1536 :    if (micro_mg_version > 2) then
    1074        3072 :          call addfld ('NMELTG',     (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to Melting of graupel',     sampled_on_subcycle=.true.)
    1075        3072 :          call addfld ('NGSEDTEN',   (/ 'trop_cld_lev' /), 'A', '#/kg/s',  'Number Tendency due to graupel sedimentation',  sampled_on_subcycle=.true.)
    1076        3072 :          call addfld ('PSACRO',    (/ 'lev' /), 'A', 'kg/kg/s', 'Collisions between rain & snow (Graupel collecting snow)',sampled_on_subcycle=.true.)
    1077        3072 :          call addfld ('PRACGO',    (/ 'lev' /), 'A', 'kg/kg/s',  'Change in q collection rain by graupel',                 sampled_on_subcycle=.true.)
    1078        3072 :          call addfld ('PSACWGO',   (/ 'lev' /), 'A', 'kg/kg/s',  'Change in q collection droplets by graupel',             sampled_on_subcycle=.true.)
    1079        3072 :          call addfld ('PGSACWO',   (/ 'lev' /), 'A', 'kg/kg/s',  'Q conversion to graupel due to collection droplets by snow', sampled_on_subcycle=.true.)
    1080        3072 :          call addfld ('PGRACSO',   (/ 'lev' /), 'A', 'kg/kg/s',  'Q conversion to graupel due to collection rain by snow',     sampled_on_subcycle=.true.)
    1081        3072 :          call addfld ('PRDGO',     (/ 'lev' /), 'A', 'kg/kg/s',  'Deposition of graupel',                                  sampled_on_subcycle=.true.)
    1082        3072 :          call addfld ('QMULTGO',   (/ 'lev' /), 'A', 'kg/kg/s',  'Q change due to ice mult droplets/graupel',              sampled_on_subcycle=.true.)
    1083        3072 :          call addfld ('QMULTRGO',  (/ 'lev' /), 'A', 'kg/kg/s',  'Q change due to ice mult rain/graupel',                  sampled_on_subcycle=.true.)
    1084        3072 :          call addfld ('QGSEDTEN',  (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Graupel/Hail mixing ratio tendency from sedimentation', sampled_on_subcycle=.true.)
    1085        3072 :          call addfld ('NPRACGO',   (/ 'lev' /), 'A', '#/kg/s',   'Change N collection rain by graupel',                    sampled_on_subcycle=.true.)
    1086        3072 :          call addfld ('NSCNGO',    (/ 'lev' /), 'A', '#/kg/s',   'Change N conversion to graupel due to collection droplets by snow', sampled_on_subcycle=.true.)
    1087        3072 :          call addfld ('NGRACSO',   (/ 'lev' /), 'A', '#/kg/s',   'Change N conversion to graupel due to collection rain by snow',     sampled_on_subcycle=.true.)
    1088        3072 :          call addfld ('NMULTGO',   (/ 'lev' /), 'A', '#/kg/s',  'Ice mult due to acc droplets by graupel',                            sampled_on_subcycle=.true.)
    1089        3072 :          call addfld ('NMULTRGO',  (/ 'lev' /), 'A', '#/kg/s',  'Ice mult due to acc rain by graupel',                                sampled_on_subcycle=.true.)
    1090        3072 :          call addfld ('NPSACWGO',  (/ 'lev' /), 'A', '#/kg/s',   'Change N collection droplets by graupel',                           sampled_on_subcycle=.true.)
    1091        3072 :          call addfld ('CLDFGRAU',  (/ 'lev' /), 'A', '1',        'Cloud fraction adjusted for graupel',                               sampled_on_subcycle=.true.)
    1092        3072 :          call addfld ('MELTGTOT',  (/ 'trop_cld_lev' /), 'A', 'kg/kg/s',  'Melting of graupel',                                       sampled_on_subcycle=.true.)
    1093             : 
    1094             :    end if
    1095             : 
    1096        1536 :    call addfld ('RBFRAC',  horiz_only, 'A', 'Fraction',  'Fraction of sky covered by a potential rainbow', sampled_on_subcycle=.true.)
    1097        1536 :    call addfld ('RBFREQ',  horiz_only, 'A', 'Frequency',  'Potential rainbow frequency',                   sampled_on_subcycle=.true.)
    1098        1536 :    call addfld( 'rbSZA', horiz_only, 'I', 'degrees', 'solar zenith angle',                                 sampled_on_subcycle=.true.)
    1099             : 
    1100             :    ! History variables for CAM5 microphysics
    1101        3072 :    call addfld ('MPDT',       (/ 'lev' /), 'A', 'W/kg',     'Heating tendency - Morrison microphysics',   sampled_on_subcycle=.true.)
    1102        3072 :    call addfld ('MPDQ',       (/ 'lev' /), 'A', 'kg/kg/s',  'Q tendency - Morrison microphysics',         sampled_on_subcycle=.true.)
    1103        3072 :    call addfld ('MPDLIQ',     (/ 'lev' /), 'A', 'kg/kg/s',  'CLDLIQ tendency - Morrison microphysics',    sampled_on_subcycle=.true.)
    1104        3072 :    call addfld ('MPDICE',     (/ 'lev' /), 'A', 'kg/kg/s',  'CLDICE tendency - Morrison microphysics',    sampled_on_subcycle=.true.)
    1105        3072 :    call addfld ('MPDNLIQ',    (/ 'lev' /), 'A', '1/kg/s',   'NUMLIQ tendency - Morrison microphysics',    sampled_on_subcycle=.true.)
    1106        3072 :    call addfld ('MPDNICE',    (/ 'lev' /), 'A', '1/kg/s',   'NUMICE tendency - Morrison microphysics',    sampled_on_subcycle=.true.)
    1107        3072 :    call addfld ('MPDW2V',     (/ 'lev' /), 'A', 'kg/kg/s',  'Water <--> Vapor tendency - Morrison microphysics', sampled_on_subcycle=.true.)
    1108        3072 :    call addfld ('MPDW2I',     (/ 'lev' /), 'A', 'kg/kg/s',  'Water <--> Ice tendency - Morrison microphysics',   sampled_on_subcycle=.true.)
    1109        3072 :    call addfld ('MPDW2P',     (/ 'lev' /), 'A', 'kg/kg/s',  'Water <--> Precip tendency - Morrison microphysics',sampled_on_subcycle=.true.)
    1110        3072 :    call addfld ('MPDI2V',     (/ 'lev' /), 'A', 'kg/kg/s',  'Ice <--> Vapor tendency - Morrison microphysics',   sampled_on_subcycle=.true.)
    1111        3072 :    call addfld ('MPDI2W',     (/ 'lev' /), 'A', 'kg/kg/s',  'Ice <--> Water tendency - Morrison microphysics',   sampled_on_subcycle=.true.)
    1112        3072 :    call addfld ('MPDI2P',     (/ 'lev' /), 'A', 'kg/kg/s',  'Ice <--> Precip tendency - Morrison microphysics',  sampled_on_subcycle=.true.)
    1113        3072 :    call addfld ('ICWNC',      (/ 'lev' /), 'A', 'm-3',      'Prognostic in-cloud water number conc',             sampled_on_subcycle=.true.)
    1114        3072 :    call addfld ('ICINC',      (/ 'lev' /), 'A', 'm-3',      'Prognostic in-cloud ice number conc',               sampled_on_subcycle=.true.)
    1115        3072 :    call addfld ('EFFLIQ_IND', (/ 'lev' /), 'A','Micron',    'Prognostic droplet effective radius (indirect effect)', sampled_on_subcycle=.true.)
    1116        1536 :    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        1536 :         &in-cloud Initial Liquid WP (Before Micro)', sampled_on_subcycle=.true.)
    1119             :    call addfld ('MPICIWPI',   horiz_only,  'A', 'kg/m2',    'Vertically-integrated &
    1120        1536 :         &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        1536 :    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        1536 :    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        3072 :    call addfld ('AWNC',        (/ 'lev' /),  'A', 'm-3',      'Average cloud water number conc',          sampled_on_subcycle=.true.)
    1146        3072 :    call addfld ('AWNI',        (/ 'lev' /),  'A', 'm-3',      'Average cloud ice number conc',            sampled_on_subcycle=.true.)
    1147        3072 :    call addfld ('AREL',        (/ 'lev' /),  'A', 'Micron',   'Average droplet effective radius',         sampled_on_subcycle=.true.)
    1148        3072 :    call addfld ('AREI',        (/ 'lev' /),  'A', 'Micron',   'Average ice effective radius',             sampled_on_subcycle=.true.)
    1149             :    ! Frequency arrays for above
    1150        3072 :    call addfld ('FREQL',       (/ 'lev' /),  'A', 'fraction', 'Fractional occurrence of liquid',          sampled_on_subcycle=.true.)
    1151        3072 :    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        1536 :    call addfld ('ACTREL',      horiz_only,   'A', 'Micron',   'Average Cloud Top droplet effective radius', sampled_on_subcycle=.true.)
    1155        1536 :    call addfld ('ACTREI',      horiz_only,   'A', 'Micron',   'Average Cloud Top ice effective radius',     sampled_on_subcycle=.true.)
    1156        1536 :    call addfld ('ACTNL',       horiz_only,   'A', 'm-3',   'Average Cloud Top droplet number',              sampled_on_subcycle=.true.)
    1157        1536 :    call addfld ('ACTNI',       horiz_only,   'A', 'm-3',   'Average Cloud Top ice number',                  sampled_on_subcycle=.true.)
    1158             : 
    1159        1536 :    call addfld ('FCTL',        horiz_only,   'A', 'fraction', 'Fractional occurrence of cloud top liquid',  sampled_on_subcycle=.true.)
    1160        1536 :    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        3072 :    call addfld ('FREQM',       (/ 'lev' /),  'A', 'fraction', 'Fractional occurrence of mixed phase',                  sampled_on_subcycle=.true.)
    1164        3072 :    call addfld ('FREQSL',      (/ 'lev' /),  'A', 'fraction', 'Fractional occurrence of only supercooled liquid',      sampled_on_subcycle=.true.)
    1165        3072 :    call addfld ('FREQSLM',     (/ 'lev' /),  'A', 'fraction', 'Fractional occurrence of super cooled liquid with ice', sampled_on_subcycle=.true.)
    1166        1536 :    call addfld ('FCTM',        horiz_only,   'A', 'fraction', 'Fractional occurrence of cloud top mixed phase',        sampled_on_subcycle=.true.)
    1167        1536 :    call addfld ('FCTSL',       horiz_only,   'A', 'fraction', 'Fractional occurrence of cloud top only supercooled liquid',      sampled_on_subcycle=.true.)
    1168        1536 :    call addfld ('FCTSLM',      horiz_only,   'A', 'fraction', 'Fractional occurrence of cloud top super cooled liquid with ice', sampled_on_subcycle=.true.)
    1169             : 
    1170        3072 :    call addfld ('LS_FLXPRC',   (/ 'ilev' /), 'A', 'kg/m2/s', 'ls stratiform gbm interface rain+snow flux', sampled_on_subcycle=.true.)
    1171        3072 :    call addfld ('LS_FLXSNW',   (/ 'ilev' /), 'A', 'kg/m2/s', 'ls stratiform gbm interface snow flux',      sampled_on_subcycle=.true.)
    1172             : 
    1173        3072 :    call addfld ('REL',         (/ 'lev' /),  'A', 'micron',   'MG REL stratiform cloud effective radius liquid', sampled_on_subcycle=.true.)
    1174        3072 :    call addfld ('REI',         (/ 'lev' /),  'A', 'micron',   'MG REI stratiform cloud effective radius ice',    sampled_on_subcycle=.true.)
    1175        3072 :    call addfld ('LS_REFFRAIN', (/ 'lev' /),  'A', 'micron',   'ls stratiform rain effective radius',             sampled_on_subcycle=.true.)
    1176        3072 :    call addfld ('LS_REFFSNOW', (/ 'lev' /),  'A', 'micron',   'ls stratiform snow effective radius',             sampled_on_subcycle=.true.)
    1177        3072 :    call addfld ('CV_REFFLIQ',  (/ 'lev' /),  'A', 'micron',   'convective cloud liq effective radius',           sampled_on_subcycle=.true.)
    1178        3072 :    call addfld ('CV_REFFICE',  (/ 'lev' /),  'A', 'micron',   'convective cloud ice effective radius',           sampled_on_subcycle=.true.)
    1179        3072 :    call addfld ('MG_SADICE',   (/ 'lev' /),  'A', 'cm2/cm3',  'MG surface area density ice',                     sampled_on_subcycle=.true.)
    1180        3072 :    call addfld ('MG_SADSNOW',  (/ 'lev' /),  'A', 'cm2/cm3',  'MG surface area density snow',                    sampled_on_subcycle=.true.)
    1181             : 
    1182             :    ! diagnostic precip
    1183        3072 :    call addfld ('QRAIN',       (/ 'lev' /),  'A', 'kg/kg',    'Diagnostic grid-mean rain mixing ratio',          sampled_on_subcycle=.true.)
    1184        3072 :    call addfld ('QSNOW',       (/ 'lev' /),  'A', 'kg/kg',    'Diagnostic grid-mean snow mixing ratio',          sampled_on_subcycle=.true.)
    1185        3072 :    call addfld ('NRAIN',       (/ 'lev' /),  'A', 'm-3',      'Diagnostic grid-mean rain number conc',           sampled_on_subcycle=.true.)
    1186        3072 :    call addfld ('NSNOW',       (/ 'lev' /),  'A', 'm-3',      'Diagnostic grid-mean snow number conc',           sampled_on_subcycle=.true.)
    1187             : 
    1188             :    ! size of precip
    1189        3072 :    call addfld ('RERCLD',      (/ 'lev' /),  'A', 'm',         'Diagnostic effective radius of Liquid Cloud and Rain', sampled_on_subcycle=.true.)
    1190        3072 :    call addfld ('DSNOW',       (/ 'lev' /),  'A', 'm',         'Diagnostic grid-mean snow diameter',                   sampled_on_subcycle=.true.)
    1191             : 
    1192             :    ! diagnostic radar reflectivity, cloud-averaged
    1193        3072 :    call addfld ('REFL',        (/ 'lev' /),  'A', 'DBz',      '94 GHz radar reflectivity',                   sampled_on_subcycle=.true.)
    1194        3072 :    call addfld ('AREFL',       (/ 'lev' /),  'A', 'DBz',      'Average 94 GHz radar reflectivity',           sampled_on_subcycle=.true.)
    1195        3072 :    call addfld ('FREFL',       (/ 'lev' /),  'A', 'fraction', 'Fractional occurrence of radar reflectivity', sampled_on_subcycle=.true.)
    1196             : 
    1197        3072 :    call addfld ('CSRFL',       (/ 'lev' /),  'A', 'DBz',      '94 GHz radar reflectivity (CloudSat thresholds)',                   sampled_on_subcycle=.true.)
    1198        3072 :    call addfld ('ACSRFL',      (/ 'lev' /),  'A', 'DBz',      'Average 94 GHz radar reflectivity (CloudSat thresholds)',           sampled_on_subcycle=.true.)
    1199        3072 :    call addfld ('FCSRFL',      (/ 'lev' /),  'A', 'fraction', 'Fractional occurrence of radar reflectivity (CloudSat thresholds)', sampled_on_subcycle=.true.)
    1200             : 
    1201        3072 :    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        3072 :    call addfld ('REFL10CM',    (/ 'lev' /),  'A', 'DBz',      '10cm (Rain) radar reflectivity (Dbz)',     sampled_on_subcycle=.true.)
    1205        3072 :    call addfld ('REFLZ10CM',   (/ 'lev' /),  'A', 'mm^6/m^3', '10cm (Rain) radar reflectivity (Z units)', sampled_on_subcycle=.true.)
    1206             : 
    1207             :    ! Aerosol information
    1208        3072 :    call addfld ('NCAL',        (/ 'lev' /),  'A', '1/m3',     'Number Concentation Activated for Liquid', sampled_on_subcycle=.true.)
    1209        3072 :    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        3072 :    call addfld ('AQRAIN',      (/ 'lev' /),  'A', 'kg/kg',    'Average rain mixing ratio',                sampled_on_subcycle=.true.)
    1213        3072 :    call addfld ('AQSNOW',      (/ 'lev' /),  'A', 'kg/kg',    'Average snow mixing ratio',                sampled_on_subcycle=.true.)
    1214        3072 :    call addfld ('ANRAIN',      (/ 'lev' /),  'A', 'm-3',      'Average rain number conc',                 sampled_on_subcycle=.true.)
    1215        3072 :    call addfld ('ANSNOW',      (/ 'lev' /),  'A', 'm-3',      'Average snow number conc',                 sampled_on_subcycle=.true.)
    1216        3072 :    call addfld ('ADRAIN',      (/ 'lev' /),  'A', 'm',        'Average rain effective Diameter',          sampled_on_subcycle=.true.)
    1217        3072 :    call addfld ('ADSNOW',      (/ 'lev' /),  'A', 'm',        'Average snow effective Diameter',          sampled_on_subcycle=.true.)
    1218        3072 :    call addfld ('FREQR',       (/ 'lev' /),  'A', 'fraction', 'Fractional occurrence of rain',            sampled_on_subcycle=.true.)
    1219        3072 :    call addfld ('FREQS',       (/ 'lev' /),  'A', 'fraction', 'Fractional occurrence of snow',            sampled_on_subcycle=.true.)
    1220             : 
    1221             :    ! precipitation efficiency & other diagnostic fields
    1222        1536 :    call addfld('PE'    ,       horiz_only,   'A', '1',        'Stratiform Precipitation Efficiency  (precip/cmeliq)',       sampled_on_subcycle=.true.)
    1223        1536 :    call addfld('APRL'  ,       horiz_only,   'A', 'm/s',      'Average Stratiform Precip Rate over efficiency calculation', sampled_on_subcycle=.true.)
    1224        1536 :    call addfld('PEFRAC',       horiz_only,   'A', '1',        'Fraction of timesteps precip efficiency reported',           sampled_on_subcycle=.true.)
    1225        1536 :    call addfld('VPRCO' ,       horiz_only,   'A', 'kg/kg/s',  'Vertical average of autoconversion rate',                    sampled_on_subcycle=.true.)
    1226        1536 :    call addfld('VPRAO' ,       horiz_only,   'A', 'kg/kg/s',  'Vertical average of accretion rate',                         sampled_on_subcycle=.true.)
    1227        1536 :    call addfld('RACAU' ,       horiz_only,   'A', 'kg/kg/s',  'Accretion/autoconversion ratio from vertical average',       sampled_on_subcycle=.true.)
    1228             : 
    1229        3072 :    call addfld('UMR', (/ 'trop_cld_lev' /), 'A',   'm/s', 'Mass-weighted rain  fallspeed', sampled_on_subcycle=.true.)
    1230        3072 :    call addfld('UMS', (/ 'trop_cld_lev' /), 'A',   'm/s', 'Mass-weighted snow fallspeed',  sampled_on_subcycle=.true.)
    1231             : 
    1232        1536 :    if (micro_mg_version > 2) then
    1233        3072 :       call addfld('UMG',    (/ 'trop_cld_lev' /), 'A',   'm/s', 'Mass-weighted graupel/hail  fallspeed', sampled_on_subcycle=.true.)
    1234        3072 :       call addfld ('FREQG', (/ 'lev' /),  'A', 'fraction', 'Fractional occurrence of Graupel',           sampled_on_subcycle=.true.)
    1235        3072 :       call addfld ('LS_REFFGRAU', (/ 'lev' /),  'A', 'micron',   'ls stratiform graupel/hail effective radius', sampled_on_subcycle=.true.)
    1236        3072 :       call addfld ('AQGRAU',      (/ 'lev' /),  'A', 'kg/kg',    'Average graupel/hail mixing ratio',           sampled_on_subcycle=.true.)
    1237        3072 :       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        3072 :    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        1536 :                      history_budget_histfile_num_out = budget_histfile)
    1248             : 
    1249        1536 :    if (history_amwg) then
    1250        1536 :       call add_default ('FICE    ', 1, ' ')
    1251        1536 :       call add_default ('AQRAIN   ', 1, ' ')
    1252        1536 :       call add_default ('AQSNOW   ', 1, ' ')
    1253        1536 :       call add_default ('ANRAIN   ', 1, ' ')
    1254        1536 :       call add_default ('ANSNOW   ', 1, ' ')
    1255        1536 :       call add_default ('ADRAIN   ', 1, ' ')
    1256        1536 :       call add_default ('ADSNOW   ', 1, ' ')
    1257        1536 :       call add_default ('AREI     ', 1, ' ')
    1258        1536 :       call add_default ('AREL     ', 1, ' ')
    1259        1536 :       call add_default ('AWNC     ', 1, ' ')
    1260        1536 :       call add_default ('AWNI     ', 1, ' ')
    1261        1536 :       call add_default ('CDNUMC   ', 1, ' ')
    1262        1536 :       call add_default ('FREQR    ', 1, ' ')
    1263        1536 :       call add_default ('FREQS    ', 1, ' ')
    1264        1536 :       call add_default ('FREQL    ', 1, ' ')
    1265        1536 :       call add_default ('FREQI    ', 1, ' ')
    1266       16896 :       do m = 1, ncnst
    1267       15360 :          call cnst_get_ind(cnst_names(m), mm)
    1268       16896 :          call add_default(cnst_name(mm), 1, ' ')
    1269             :       end do
    1270             :    end if
    1271             : 
    1272        1536 :    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        1536 :    ast_idx      = pbuf_get_index('AST')
    1379        1536 :    cld_idx      = pbuf_get_index('CLD')
    1380        1536 :    concld_idx   = pbuf_get_index('CONCLD')
    1381        1536 :    prec_dp_idx  = pbuf_get_index('PREC_DP')
    1382        1536 :    prec_sh_idx  = pbuf_get_index('PREC_SH')
    1383             : 
    1384        1536 :    naai_idx     = pbuf_get_index('NAAI')
    1385        1536 :    naai_hom_idx = pbuf_get_index('NAAI_HOM')
    1386        1536 :    npccn_idx    = pbuf_get_index('NPCCN')
    1387        1536 :    rndst_idx    = pbuf_get_index('RNDST')
    1388        1536 :    nacon_idx    = pbuf_get_index('NACON')
    1389             : 
    1390        1536 :    prec_str_idx = pbuf_get_index('PREC_STR')
    1391        1536 :    snow_str_idx = pbuf_get_index('SNOW_STR')
    1392        1536 :    prec_sed_idx = pbuf_get_index('PREC_SED')
    1393        1536 :    snow_sed_idx = pbuf_get_index('SNOW_SED')
    1394        1536 :    prec_pcw_idx = pbuf_get_index('PREC_PCW')
    1395        1536 :    snow_pcw_idx = pbuf_get_index('SNOW_PCW')
    1396             : 
    1397        1536 :    cmeliq_idx = pbuf_get_index('CMELIQ')
    1398             : 
    1399             :    ! These fields may have been added, so don't abort if they have not been
    1400        1536 :    qsatfac_idx  = pbuf_get_index('QSATFAC', ierr)
    1401        1536 :    qrain_idx    = pbuf_get_index('QRAIN', ierr)
    1402        1536 :    qsnow_idx    = pbuf_get_index('QSNOW', ierr)
    1403        1536 :    nrain_idx    = pbuf_get_index('NRAIN', ierr)
    1404        1536 :    nsnow_idx    = pbuf_get_index('NSNOW', ierr)
    1405             : 
    1406             :   ! fields for heterogeneous freezing
    1407        1536 :   frzimm_idx = pbuf_get_index('FRZIMM', ierr)
    1408        1536 :   frzcnt_idx = pbuf_get_index('FRZCNT', ierr)
    1409        1536 :   frzdep_idx = pbuf_get_index('FRZDEP', ierr)
    1410             : 
    1411             :   ! Initialize physics buffer grid fields for accumulating precip and condensation
    1412        1536 :    if (is_first_step()) then
    1413         768 :       call pbuf_set_field(pbuf2d, cldo_idx,   0._r8)
    1414         768 :       call pbuf_set_field(pbuf2d, cc_t_idx,   0._r8)
    1415         768 :       call pbuf_set_field(pbuf2d, cc_qv_idx,  0._r8)
    1416         768 :       call pbuf_set_field(pbuf2d, cc_ql_idx,  0._r8)
    1417         768 :       call pbuf_set_field(pbuf2d, cc_qi_idx,  0._r8)
    1418         768 :       call pbuf_set_field(pbuf2d, cc_nl_idx,  0._r8)
    1419         768 :       call pbuf_set_field(pbuf2d, cc_ni_idx,  0._r8)
    1420         768 :       call pbuf_set_field(pbuf2d, cc_qlst_idx,0._r8)
    1421         768 :       call pbuf_set_field(pbuf2d, acpr_idx,   0._r8)
    1422         768 :       call pbuf_set_field(pbuf2d, acgcme_idx, 0._r8)
    1423         768 :       call pbuf_set_field(pbuf2d, acnum_idx,  0)
    1424         768 :       call pbuf_set_field(pbuf2d, relvar_idx, 2._r8)
    1425         768 :       call pbuf_set_field(pbuf2d, accre_enhan_idx, 1._r8)
    1426         768 :       call pbuf_set_field(pbuf2d, am_evp_st_idx,  0._r8)
    1427         768 :       call pbuf_set_field(pbuf2d, evprain_st_idx, 0._r8)
    1428         768 :       call pbuf_set_field(pbuf2d, evpsnow_st_idx, 0._r8)
    1429         768 :       call pbuf_set_field(pbuf2d, prer_evap_idx,  0._r8)
    1430         768 :       call pbuf_set_field(pbuf2d, bergso_idx, 0._r8)
    1431         768 :       call pbuf_set_field(pbuf2d, icswp_idx, 0._r8)
    1432         768 :       call pbuf_set_field(pbuf2d, cldfsnow_idx, 0._r8)
    1433         768 :       call pbuf_set_field(pbuf2d, dei_idx,     0.0_r8)
    1434         768 :       call pbuf_set_field(pbuf2d, des_idx,     0.0_r8)
    1435         768 :       call pbuf_set_field(pbuf2d, mu_idx,     0.0_r8)
    1436         768 :       call pbuf_set_field(pbuf2d, lambdac_idx, 0.0_r8)
    1437             : 
    1438         768 :       if (degrau_idx > 0) call pbuf_set_field(pbuf2d, degrau_idx, 0.0_r8)
    1439         768 :       if (icgrauwp_idx > 0) call pbuf_set_field(pbuf2d, icgrauwp_idx, 0.0_r8)
    1440         768 :       if (qrain_idx > 0)   call pbuf_set_field(pbuf2d, qrain_idx, 0._r8)
    1441         768 :       if (qsnow_idx > 0)   call pbuf_set_field(pbuf2d, qsnow_idx, 0._r8)
    1442         768 :       if (nrain_idx > 0)   call pbuf_set_field(pbuf2d, nrain_idx, 0._r8)
    1443         768 :       if (nsnow_idx > 0)   call pbuf_set_field(pbuf2d, nsnow_idx, 0._r8)
    1444         768 :       if (qcsedten_idx > 0)   call pbuf_set_field(pbuf2d, qcsedten_idx, 0._r8)
    1445         768 :       if (qrsedten_idx > 0)   call pbuf_set_field(pbuf2d, qrsedten_idx, 0._r8)
    1446         768 :       if (qisedten_idx > 0)   call pbuf_set_field(pbuf2d, qisedten_idx, 0._r8)
    1447         768 :       if (qssedten_idx > 0)   call pbuf_set_field(pbuf2d, qssedten_idx, 0._r8)
    1448         768 :       if (vtrmc_idx > 0)      call pbuf_set_field(pbuf2d, vtrmc_idx, 0._r8)
    1449         768 :       if (umr_idx > 0)        call pbuf_set_field(pbuf2d, umr_idx, 0._r8)
    1450         768 :       if (vtrmi_idx > 0)      call pbuf_set_field(pbuf2d, vtrmi_idx, 0._r8)
    1451         768 :       if (ums_idx > 0)        call pbuf_set_field(pbuf2d, ums_idx, 0._r8)
    1452         768 :       if (qcsevap_idx > 0)    call pbuf_set_field(pbuf2d, qcsevap_idx, 0._r8)
    1453         768 :       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         768 :       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        1536 : end subroutine micro_pumas_cam_init
    1472             : 
    1473             : !===============================================================================
    1474             : 
    1475     7411824 : 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        1536 :    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      176472 :    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      176472 :    real(r8), pointer :: naai(:,:)      ! ice nucleation number
    1509      176472 :    real(r8), pointer :: naai_hom(:,:)  ! ice nucleation number (homogeneous)
    1510      176472 :    real(r8), pointer :: npccn(:,:)     ! liquid activation number tendency
    1511      176472 :    real(r8), pointer :: rndst(:,:,:)
    1512      176472 :    real(r8), pointer :: nacon(:,:,:)
    1513      176472 :    real(r8), pointer :: am_evp_st_grid(:,:)    ! Evaporation area of stratiform precipitation. 0<= am_evp_st <=1.
    1514      176472 :    real(r8), pointer :: evprain_st_grid(:,:)   ! Evaporation rate of stratiform rain [kg/kg/s]
    1515      176472 :    real(r8), pointer :: evpsnow_st_grid(:,:)   ! Evaporation rate of stratiform snow [kg/kg/s]
    1516             : 
    1517      176472 :    real(r8), pointer :: prec_str(:)          ! [Total] Sfc flux of precip from stratiform [ m/s ]
    1518      176472 :    real(r8), pointer :: snow_str(:)          ! [Total] Sfc flux of snow from stratiform   [ m/s ]
    1519      176472 :    real(r8), pointer :: prec_sed(:)          ! Surface flux of total cloud water from sedimentation
    1520      176472 :    real(r8), pointer :: snow_sed(:)          ! Surface flux of cloud ice from sedimentation
    1521      176472 :    real(r8), pointer :: prec_pcw(:)          ! Sfc flux of precip from microphysics [ m/s ]
    1522      176472 :    real(r8), pointer :: snow_pcw(:)          ! Sfc flux of snow from microphysics [ m/s ]
    1523             : 
    1524      176472 :    real(r8), pointer :: ast(:,:)          ! Relative humidity cloud fraction
    1525      176472 :    real(r8), pointer :: qsatfac(:,:)      ! Subgrid cloud water saturation scaling factor.
    1526      176472 :    real(r8), pointer :: alst_mic(:,:)
    1527      176472 :    real(r8), pointer :: aist_mic(:,:)
    1528      176472 :    real(r8), pointer :: cldo(:,:)         ! Old cloud fraction
    1529      176472 :    real(r8), pointer :: nevapr(:,:)       ! Evaporation of total precipitation (rain + snow)
    1530      176472 :    real(r8), pointer :: prer_evap(:,:)    ! precipitation evaporation rate
    1531      176472 :    real(r8), pointer :: relvar(:,:)       ! relative variance of cloud water
    1532      176472 :    real(r8), pointer :: accre_enhan(:,:)  ! optional accretion enhancement for experimentation
    1533      176472 :    real(r8), pointer :: prain(:,:)        ! Total precipitation (rain + snow)
    1534      176472 :    real(r8), pointer :: dei(:,:)          ! Ice effective diameter (meters)
    1535      176472 :    real(r8), pointer :: mu(:,:)           ! Size distribution shape parameter for radiation
    1536      176472 :    real(r8), pointer :: lambdac(:,:)      ! Size distribution slope parameter for radiation
    1537      176472 :    real(r8), pointer :: des(:,:)          ! Snow effective diameter (m)
    1538      176472 :    real(r8), pointer :: degrau(:,:)       ! Graupel effective diameter (m)
    1539      176472 :    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      352944 :    real(r8) :: evapsnow_sc(state%psetcols,pver-top_lev+1)
    1546      352944 :    real(r8) :: bergstot_sc(state%psetcols,pver-top_lev+1)
    1547      352944 :    real(r8) :: qcrestot_sc(state%psetcols,pver-top_lev+1)
    1548      352944 :    real(r8) :: melttot_sc(state%psetcols,pver-top_lev+1)
    1549      352944 :    real(r8) :: mnuccctot_sc(state%psetcols,pver-top_lev+1)
    1550      352944 :    real(r8) :: mnuccttot_sc(state%psetcols,pver-top_lev+1)
    1551      352944 :    real(r8) :: bergtot_sc(state%psetcols,pver-top_lev+1)
    1552      352944 :    real(r8) :: homotot_sc(state%psetcols,pver-top_lev+1)
    1553      352944 :    real(r8) :: msacwitot_sc(state%psetcols,pver-top_lev+1)
    1554      352944 :    real(r8) :: psacwstot_sc(state%psetcols,pver-top_lev+1)
    1555      352944 :    real(r8) :: cmeitot_sc(state%psetcols,pver-top_lev+1)
    1556      352944 :    real(r8) :: qirestot_sc(state%psetcols,pver-top_lev+1)
    1557      352944 :    real(r8) :: prcitot_sc(state%psetcols,pver-top_lev+1)
    1558      352944 :    real(r8) :: praitot_sc(state%psetcols,pver-top_lev+1)
    1559      352944 :    real(r8) :: pratot_sc(state%psetcols,pver-top_lev+1)
    1560      352944 :    real(r8) :: prctot_sc(state%psetcols,pver-top_lev+1)
    1561      352944 :    real(r8) :: qcsedten_sc(state%psetcols,pver-top_lev+1)
    1562      352944 :    real(r8) :: qisedten_sc(state%psetcols,pver-top_lev+1)
    1563      352944 :    real(r8) :: vtrmc_sc(state%psetcols,pver-top_lev+1)
    1564      352944 :    real(r8) :: vtrmi_sc(state%psetcols,pver-top_lev+1)
    1565      352944 :    real(r8) :: qcsevap_sc(state%psetcols,pver-top_lev+1)
    1566      352944 :    real(r8) :: qisevap_sc(state%psetcols,pver-top_lev+1)
    1567      352944 :    real(r8) :: qrsedten_sc(state%psetcols,pver-top_lev+1)
    1568      352944 :    real(r8) :: qssedten_sc(state%psetcols,pver-top_lev+1)
    1569      352944 :    real(r8) :: umr_sc(state%psetcols,pver-top_lev+1)
    1570      352944 :    real(r8) :: ums_sc(state%psetcols,pver-top_lev+1)
    1571      352944 :    real(r8) :: psacrtot_sc(state%psetcols,pver-top_lev+1)
    1572      352944 :    real(r8) :: pracgtot_sc(state%psetcols,pver-top_lev+1)
    1573      352944 :    real(r8) :: psacwgtot_sc(state%psetcols,pver-top_lev+1)
    1574      352944 :    real(r8) :: pgsacwtot_sc(state%psetcols,pver-top_lev+1)
    1575      352944 :    real(r8) :: pgracstot_sc(state%psetcols,pver-top_lev+1)
    1576      352944 :    real(r8) :: prdgtot_sc(state%psetcols,pver-top_lev+1)
    1577      352944 :    real(r8) :: qmultgtot_sc(state%psetcols,pver-top_lev+1)
    1578      352944 :    real(r8) :: qmultrgtot_sc(state%psetcols,pver-top_lev+1)
    1579      352944 :    real(r8) :: npracgtot_sc(state%psetcols,pver-top_lev+1)
    1580      352944 :    real(r8) :: nscngtot_sc(state%psetcols,pver-top_lev+1)
    1581      352944 :    real(r8) :: ngracstot_sc(state%psetcols,pver-top_lev+1)
    1582      352944 :    real(r8) :: nmultgtot_sc(state%psetcols,pver-top_lev+1)
    1583      352944 :    real(r8) :: nmultrgtot_sc(state%psetcols,pver-top_lev+1)
    1584      352944 :    real(r8) :: npsacwgtot_sc(state%psetcols,pver-top_lev+1)
    1585             : 
    1586      352944 :    real(r8) :: rho(state%psetcols,pver)
    1587      352944 :    real(r8) :: cldmax(state%psetcols,pver)
    1588             : 
    1589      352944 :    real(r8)  :: rate1cld(state%psetcols,pver) ! array to hold rate1ord_cw2pr_st from microphysics
    1590             : 
    1591      352944 :    real(r8)  :: tlat(state%psetcols,pver)
    1592      352944 :    real(r8)  :: qvlat(state%psetcols,pver)
    1593      352944 :    real(r8)  :: qcten(state%psetcols,pver)
    1594      352944 :    real(r8)  :: qiten(state%psetcols,pver)
    1595      352944 :    real(r8)  :: ncten(state%psetcols,pver)
    1596      352944 :    real(r8)  :: niten(state%psetcols,pver)
    1597             : 
    1598      352944 :    real(r8)  :: qrten(state%psetcols,pver)
    1599      352944 :    real(r8)  :: qsten(state%psetcols,pver)
    1600      352944 :    real(r8)  :: nrten(state%psetcols,pver)
    1601      352944 :    real(r8)  :: nsten(state%psetcols,pver)
    1602      352944 :    real(r8)  :: qgten(state%psetcols,pver)
    1603      352944 :    real(r8)  :: ngten(state%psetcols,pver)
    1604             : 
    1605      352944 :    real(r8)  :: prect(state%psetcols)
    1606      352944 :    real(r8)  :: preci(state%psetcols)
    1607      352944 :    real(r8)  :: am_evp_st(state%psetcols,pver)  ! Area over which precip evaporates
    1608      352944 :    real(r8)  :: cmeice(state%psetcols,pver)     ! Rate of cond-evap of ice within the cloud
    1609      352944 :    real(r8)  :: qsout(state%psetcols,pver)      ! Snow mixing ratio
    1610      352944 :    real(r8)  :: cflx(state%psetcols,pverp)      ! grid-box avg liq condensate flux (kg m^-2 s^-1)
    1611      352944 :    real(r8)  :: iflx(state%psetcols,pverp)      ! grid-box avg ice condensate flux (kg m^-2 s^-1)
    1612      352944 :    real(r8)  :: rflx(state%psetcols,pverp)      ! grid-box average rain flux (kg m^-2 s^-1)
    1613      352944 :    real(r8)  :: sflx(state%psetcols,pverp)      ! grid-box average snow flux (kg m^-2 s^-1)
    1614      352944 :    real(r8)  :: gflx(state%psetcols,pverp)      ! grid-box average snow flux (kg m^-2 s^-1)
    1615      352944 :    real(r8)  :: qrout(state%psetcols,pver)      ! Rain mixing ratio
    1616             : 
    1617      352944 :    real(r8)  :: nrout(state%psetcols,pver)
    1618      352944 :    real(r8)  :: nsout(state%psetcols,pver)
    1619      352944 :    real(r8)  :: refl(state%psetcols,pver)    ! analytic radar reflectivity
    1620      352944 :    real(r8)  :: arefl(state%psetcols,pver)   ! average reflectivity will zero points outside valid range
    1621      352944 :    real(r8)  :: areflz(state%psetcols,pver)  ! average reflectivity in z.
    1622      352944 :    real(r8)  :: frefl(state%psetcols,pver)
    1623      352944 :    real(r8)  :: csrfl(state%psetcols,pver)   ! cloudsat reflectivity
    1624      352944 :    real(r8)  :: acsrfl(state%psetcols,pver)  ! cloudsat average
    1625      352944 :    real(r8)  :: fcsrfl(state%psetcols,pver)
    1626      352944 :    real(r8)  :: refl10cm(state%psetcols,pver)    ! analytic radar reflectivity
    1627      352944 :    real(r8)  :: reflz10cm(state%psetcols,pver)    ! analytic radar reflectivity Z
    1628      352944 :    real(r8)  :: rercld(state%psetcols,pver)  ! effective radius calculation for rain + cloud
    1629      352944 :    real(r8)  :: ncai(state%psetcols,pver)    ! output number conc of ice nuclei available (1/m3)
    1630      352944 :    real(r8)  :: ncal(state%psetcols,pver)    ! output number conc of CCN (1/m3)
    1631      352944 :    real(r8)  :: qrout2(state%psetcols,pver)
    1632      352944 :    real(r8)  :: qsout2(state%psetcols,pver)
    1633      352944 :    real(r8)  :: nrout2(state%psetcols,pver)
    1634      352944 :    real(r8)  :: nsout2(state%psetcols,pver)
    1635      352944 :    real(r8)  :: freqs(state%psetcols,pver)
    1636      352944 :    real(r8)  :: freqr(state%psetcols,pver)
    1637      352944 :    real(r8)  :: nfice(state%psetcols,pver)
    1638      352944 :    real(r8)  :: qcrat(state%psetcols,pver)   ! qc limiter ratio (1=no limit)
    1639             : 
    1640             : !Hail/Graupel Output
    1641      352944 :    real(r8)  :: freqg(state%psetcols,pver)
    1642      352944 :    real(r8)  :: qgout(state%psetcols,pver)
    1643      352944 :    real(r8)  :: ngout(state%psetcols,pver)
    1644      352944 :    real(r8)  :: dgout(state%psetcols,pver)
    1645      352944 :    real(r8)  :: qgout2(state%psetcols,pver)
    1646      352944 :    real(r8)  :: ngout2(state%psetcols,pver)
    1647      352944 :    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      352944 :    real(r8) :: rel_fn_dum(state%ncol,pver)
    1653      352944 :    real(r8) :: dsout2_dum(state%ncol,pver)
    1654      352944 :    real(r8) :: drout_dum(state%ncol,pver)
    1655      352944 :    real(r8) :: reff_rain_dum(state%ncol,pver)
    1656      352944 :    real(r8) :: reff_snow_dum(state%ncol,pver)
    1657      352944 :    real(r8) :: reff_grau_dum(state%ncol,pver)   !not used for now or passed to COSP.
    1658      352944 :    real(r8), target :: nan_array(state%ncol,pver)   ! Array for NaN's
    1659             : 
    1660             :    ! Heterogeneous-only version of mnuccdtot.
    1661      352944 :    real(r8) :: mnuccdohet(state%psetcols,pver)
    1662             : 
    1663             :    ! physics buffer fields for COSP simulator
    1664      176472 :    real(r8), pointer :: mgflxprc(:,:)     ! MG grid-box mean flux_large_scale_cloud_rain+snow at interfaces (kg/m2/s)
    1665      176472 :    real(r8), pointer :: mgflxsnw(:,:)     ! MG grid-box mean flux_large_scale_cloud_snow at interfaces (kg/m2/s)
    1666      176472 :    real(r8), pointer :: mgmrprc(:,:)      ! MG grid-box mean mixingratio_large_scale_cloud_rain+snow at interfaces (kg/kg)
    1667      176472 :    real(r8), pointer :: mgmrsnw(:,:)      ! MG grid-box mean mixingratio_large_scale_cloud_snow at interfaces (kg/kg)
    1668      176472 :    real(r8), pointer :: mgreffrain_grid(:,:)   ! MG diagnostic rain effective radius (um)
    1669      176472 :    real(r8), pointer :: mgreffsnow_grid(:,:)   ! MG diagnostic snow effective radius (um)
    1670      176472 :    real(r8), pointer :: cvreffliq(:,:)    ! convective cloud liquid effective radius (um)
    1671      176472 :    real(r8), pointer :: cvreffice(:,:)    ! convective cloud ice effective radius (um)
    1672             : 
    1673             :    ! physics buffer fields used with CARMA
    1674      176472 :    real(r8), pointer, dimension(:,:) :: tnd_qsnow    ! external tendency on snow mass (kg/kg/s)
    1675      176472 :    real(r8), pointer, dimension(:,:) :: tnd_nsnow    ! external tendency on snow number(#/kg/s)
    1676      176472 :    real(r8), pointer, dimension(:,:) :: re_ice       ! ice effective radius (m)
    1677             : 
    1678      176472 :    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      176472 :    real(r8), pointer :: wsedl(:,:)        ! Sedimentation velocity of liquid stratus cloud droplet [ m/s ]
    1681             : 
    1682             : 
    1683      176472 :    real(r8), pointer :: CC_T(:,:)         ! Grid-mean microphysical tendency
    1684      176472 :    real(r8), pointer :: CC_qv(:,:)        ! Grid-mean microphysical tendency
    1685      176472 :    real(r8), pointer :: CC_ql(:,:)        ! Grid-mean microphysical tendency
    1686      176472 :    real(r8), pointer :: CC_qi(:,:)        ! Grid-mean microphysical tendency
    1687      176472 :    real(r8), pointer :: CC_nl(:,:)        ! Grid-mean microphysical tendency
    1688      176472 :    real(r8), pointer :: CC_ni(:,:)        ! Grid-mean microphysical tendency
    1689      176472 :    real(r8), pointer :: CC_qlst(:,:)      ! In-liquid stratus microphysical tendency
    1690             : 
    1691             :    ! variables for heterogeneous freezing
    1692      176472 :    real(r8), pointer :: frzimm(:,:)
    1693      176472 :    real(r8), pointer :: frzcnt(:,:)
    1694      176472 :    real(r8), pointer :: frzdep(:,:)
    1695             : 
    1696      176472 :    real(r8), pointer :: qme(:,:)
    1697             : 
    1698             :    ! A local copy of state is used for diagnostic calculations
    1699      176472 :    type(physics_state) :: state_loc
    1700     7411824 :    type(physics_ptend) :: ptend_loc
    1701             : 
    1702      352944 :    real(r8) :: icecldf(state%psetcols,pver) ! Ice cloud fraction
    1703      352944 :    real(r8) :: liqcldf(state%psetcols,pver) ! Liquid cloud fraction (combined into cloud)
    1704             : 
    1705      176472 :    real(r8), pointer :: rel(:,:)          ! Liquid effective drop radius (microns)
    1706      176472 :    real(r8), pointer :: rei(:,:)          ! Ice effective drop size (microns)
    1707      176472 :    real(r8), pointer :: sadice(:,:)       ! Ice surface area density (cm2/cm3)
    1708      176472 :    real(r8), pointer :: sadsnow(:,:)      ! Snow surface area density (cm2/cm3)
    1709             : 
    1710             : 
    1711      176472 :    real(r8), pointer :: cmeliq(:,:)
    1712             : 
    1713      176472 :    real(r8), pointer :: cld(:,:)          ! Total cloud fraction
    1714      176472 :    real(r8), pointer :: concld(:,:)       ! Convective cloud fraction
    1715      176472 :    real(r8), pointer :: prec_dp(:)        ! Deep Convective precip
    1716      176472 :    real(r8), pointer :: prec_sh(:)        ! Shallow Convective precip
    1717             : 
    1718      176472 :    real(r8), pointer :: iciwpst(:,:)      ! Stratiform in-cloud ice water path for radiation
    1719      176472 :    real(r8), pointer :: iclwpst(:,:)      ! Stratiform in-cloud liquid water path for radiation
    1720      176472 :    real(r8), pointer :: cldfsnow(:,:)     ! Cloud fraction for liquid+snow
    1721      176472 :    real(r8), pointer :: icswp(:,:)        ! In-cloud snow water path
    1722             : 
    1723      176472 :    real(r8), pointer :: cldfgrau(:,:)     ! Cloud fraction for liquid+snow
    1724      176472 :    real(r8), pointer :: icgrauwp(:,:)        ! In-cloud snow water path
    1725             : 
    1726      352944 :    real(r8) :: icimrst(state%psetcols,pver) ! In stratus ice mixing ratio
    1727      352944 :    real(r8) :: icwmrst(state%psetcols,pver) ! In stratus water mixing ratio
    1728      352944 :    real(r8) :: icinc(state%psetcols,pver)   ! In cloud ice number conc
    1729      352944 :    real(r8) :: icwnc(state%psetcols,pver)   ! In cloud water number conc
    1730             : 
    1731      352944 :    real(r8) :: iclwpi(state%psetcols)       ! Vertically-integrated in-cloud Liquid WP before microphysics
    1732      352944 :    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      176472 :    real(r8), pointer, dimension(:) :: acprecl_grid ! accumulated precip across timesteps
    1771      176472 :    real(r8), pointer, dimension(:) :: acgcme_grid  ! accumulated condensation across timesteps
    1772      176472 :    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      176472 :    real(r8), pointer :: lambdac_grid(:,:)
    1794      176472 :    real(r8), pointer :: mu_grid(:,:)
    1795      176472 :    real(r8), pointer :: rel_grid(:,:)
    1796      176472 :    real(r8), pointer :: rei_grid(:,:)
    1797      176472 :    real(r8), pointer :: sadice_grid(:,:)
    1798      176472 :    real(r8), pointer :: sadsnow_grid(:,:)
    1799      176472 :    real(r8), pointer :: dei_grid(:,:)
    1800      176472 :    real(r8), pointer :: des_grid(:,:)
    1801      176472 :    real(r8), pointer :: iclwpst_grid(:,:)
    1802      176472 :    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      352944 :    real(r8) :: state_loc_graup(state%psetcols,pver)
    1883      352944 :    real(r8) :: state_loc_numgraup(state%psetcols,pver)
    1884             : 
    1885      176472 :    real(r8), pointer :: cmeliq_grid(:,:)
    1886             : 
    1887      176472 :    real(r8), pointer :: prec_str_grid(:)
    1888      176472 :    real(r8), pointer :: snow_str_grid(:)
    1889      176472 :    real(r8), pointer :: prec_pcw_grid(:)
    1890      176472 :    real(r8), pointer :: snow_pcw_grid(:)
    1891      176472 :    real(r8), pointer :: prec_sed_grid(:)
    1892      176472 :    real(r8), pointer :: snow_sed_grid(:)
    1893      176472 :    real(r8), pointer :: cldo_grid(:,:)
    1894      176472 :    real(r8), pointer :: nevapr_grid(:,:)
    1895      176472 :    real(r8), pointer :: prain_grid(:,:)
    1896      176472 :    real(r8), pointer :: mgflxprc_grid(:,:)
    1897      176472 :    real(r8), pointer :: mgflxsnw_grid(:,:)
    1898      176472 :    real(r8), pointer :: mgmrprc_grid(:,:)
    1899      176472 :    real(r8), pointer :: mgmrsnw_grid(:,:)
    1900      176472 :    real(r8), pointer :: cvreffliq_grid(:,:)
    1901      176472 :    real(r8), pointer :: cvreffice_grid(:,:)
    1902      176472 :    real(r8), pointer :: rate1ord_cw2pr_st_grid(:,:)
    1903      176472 :    real(r8), pointer :: wsedl_grid(:,:)
    1904      176472 :    real(r8), pointer :: CC_t_grid(:,:)
    1905      176472 :    real(r8), pointer :: CC_qv_grid(:,:)
    1906      176472 :    real(r8), pointer :: CC_ql_grid(:,:)
    1907      176472 :    real(r8), pointer :: CC_qi_grid(:,:)
    1908      176472 :    real(r8), pointer :: CC_nl_grid(:,:)
    1909      176472 :    real(r8), pointer :: CC_ni_grid(:,:)
    1910      176472 :    real(r8), pointer :: CC_qlst_grid(:,:)
    1911      176472 :    real(r8), pointer :: qme_grid(:,:)
    1912      176472 :    real(r8), pointer :: iciwpst_grid(:,:)
    1913      176472 :    real(r8), pointer :: icswp_grid(:,:)
    1914      176472 :    real(r8), pointer :: ast_grid(:,:)
    1915      176472 :    real(r8), pointer :: cldfsnow_grid(:,:)
    1916      176472 :    real(r8), pointer :: bergso_grid(:,:)
    1917             : 
    1918      176472 :    real(r8), pointer :: icgrauwp_grid(:,:)
    1919      176472 :    real(r8), pointer :: cldfgrau_grid(:,:)
    1920             : 
    1921      176472 :    real(r8), pointer :: qrout_grid_ptr(:,:)
    1922      176472 :    real(r8), pointer :: qsout_grid_ptr(:,:)
    1923      176472 :    real(r8), pointer :: nrout_grid_ptr(:,:)
    1924      176472 :    real(r8), pointer :: nsout_grid_ptr(:,:)
    1925      176472 :    real(r8), pointer :: qcsedtenout_grid_ptr(:,:)
    1926      176472 :    real(r8), pointer :: qrsedtenout_grid_ptr(:,:)
    1927      176472 :    real(r8), pointer :: qisedtenout_grid_ptr(:,:)
    1928      176472 :    real(r8), pointer :: qssedtenout_grid_ptr(:,:)
    1929      176472 :    real(r8), pointer :: vtrmcout_grid_ptr(:,:)
    1930      176472 :    real(r8), pointer :: umrout_grid_ptr(:,:)
    1931      176472 :    real(r8), pointer :: vtrmiout_grid_ptr(:,:)
    1932      176472 :    real(r8), pointer :: umsout_grid_ptr(:,:)
    1933      176472 :    real(r8), pointer :: qcsevapout_grid_ptr(:,:)
    1934      176472 :    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      352944 :    real(r8) :: zen_angle(state%psetcols)                   ! Daytime solar zenith angles (radians)
    1951      352944 :    real(r8) :: rlats(state%psetcols), rlons(state%psetcols)   ! chunk latitudes and longitudes (radians)
    1952      352944 :    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      352944 :    real(r8) :: precc(state%psetcols)                ! convective precip rate
    1957             : 
    1958             : ! Rainbow frequency and fraction for output
    1959             : 
    1960      352944 :    real(r8) :: rbfreq(state%psetcols)
    1961      352944 :    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      176472 :    lchnk = state%lchnk
    1980      176472 :    ncol  = state%ncol
    1981      176472 :    psetcols = state%psetcols
    1982      176472 :    ngrdcol  = state%ngrdcol
    1983      176472 :    itim_old = pbuf_old_tim_idx()
    1984      176472 :    nlev = pver - top_lev + 1
    1985             : 
    1986      176472 :    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      176472 :    call proc_rates%allocate(ncol, nlev, ncd, micro_mg_warm_rain, errstring)
    1994             : 
    1995      176472 :    call handle_errmsg(errstring, subname="micro_pumas_cam_tend")
    1996             : 
    1997             : 
    1998      176472 :    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      176472 :    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      176472 :    call pbuf_get_field(pbuf, naai_idx,        naai,        col_type=col_type, copy_if_needed=use_subcol_microp)
    2009      176472 :    call pbuf_get_field(pbuf, naai_hom_idx,    naai_hom,    col_type=col_type, copy_if_needed=use_subcol_microp)
    2010      176472 :    call pbuf_get_field(pbuf, npccn_idx,       npccn,       col_type=col_type, copy_if_needed=use_subcol_microp)
    2011      176472 :    call pbuf_get_field(pbuf, rndst_idx,       rndst,       col_type=col_type, copy_if_needed=use_subcol_microp)
    2012      176472 :    call pbuf_get_field(pbuf, nacon_idx,       nacon,       col_type=col_type, copy_if_needed=use_subcol_microp)
    2013      176472 :    call pbuf_get_field(pbuf, relvar_idx,      relvar,      col_type=col_type, copy_if_needed=use_subcol_microp)
    2014      176472 :    call pbuf_get_field(pbuf, accre_enhan_idx, accre_enhan, col_type=col_type, copy_if_needed=use_subcol_microp)
    2015      176472 :    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     1235304 :         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     1235304 :         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     1235304 :         col_type=col_type, copy_if_needed=use_subcol_microp)
    2023             : 
    2024             :    ! Get convective precip for rainbows
    2025      176472 :    if (prec_dp_idx > 0) then
    2026      176472 :       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      176472 :    if (prec_sh_idx > 0) then
    2031      176472 :       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      176472 :    if (associated(prec_dp) .and. associated(prec_sh)) then
    2038     2946672 :       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      176472 :    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      176472 :       tnd_qsnow => nan_array
    2056      176472 :       tnd_nsnow => nan_array
    2057      176472 :       re_ice => nan_array
    2058             :    end if
    2059             : 
    2060      176472 :    if (use_hetfrz_classnuc) then
    2061      176472 :       call pbuf_get_field(pbuf, frzimm_idx, frzimm, col_type=col_type, copy_if_needed=use_subcol_microp)
    2062      176472 :       call pbuf_get_field(pbuf, frzcnt_idx, frzcnt, col_type=col_type, copy_if_needed=use_subcol_microp)
    2063      176472 :       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      176472 :    if (qsatfac_idx > 0) then
    2072      176472 :       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     3000024 :     preci  = 0._r8
    2081     3000024 :     prect  = 0._r8
    2082             : 
    2083             :    ! initialize subcolumn variables
    2084      176472 :    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      176472 :    call pbuf_get_field(pbuf, prec_str_idx,    prec_str,    col_type=col_type)
    2134      176472 :    call pbuf_get_field(pbuf, snow_str_idx,    snow_str,    col_type=col_type)
    2135      176472 :    call pbuf_get_field(pbuf, prec_pcw_idx,    prec_pcw,    col_type=col_type)
    2136      176472 :    call pbuf_get_field(pbuf, snow_pcw_idx,    snow_pcw,    col_type=col_type)
    2137      176472 :    call pbuf_get_field(pbuf, prec_sed_idx,    prec_sed,    col_type=col_type)
    2138      176472 :    call pbuf_get_field(pbuf, snow_sed_idx,    snow_sed,    col_type=col_type)
    2139      176472 :    call pbuf_get_field(pbuf, nevapr_idx,      nevapr,      col_type=col_type)
    2140      176472 :    call pbuf_get_field(pbuf, prer_evap_idx,   prer_evap,   col_type=col_type)
    2141      176472 :    call pbuf_get_field(pbuf, prain_idx,       prain,       col_type=col_type)
    2142      176472 :    call pbuf_get_field(pbuf, dei_idx,         dei,         col_type=col_type)
    2143      176472 :    call pbuf_get_field(pbuf, mu_idx,          mu,          col_type=col_type)
    2144      176472 :    call pbuf_get_field(pbuf, lambdac_idx,     lambdac,     col_type=col_type)
    2145      176472 :    call pbuf_get_field(pbuf, des_idx,         des,         col_type=col_type)
    2146      176472 :    call pbuf_get_field(pbuf, ls_flxprc_idx,   mgflxprc,    col_type=col_type)
    2147      176472 :    call pbuf_get_field(pbuf, ls_flxsnw_idx,   mgflxsnw,    col_type=col_type)
    2148      176472 :    call pbuf_get_field(pbuf, ls_mrprc_idx,    mgmrprc,     col_type=col_type)
    2149      176472 :    call pbuf_get_field(pbuf, ls_mrsnw_idx,    mgmrsnw,     col_type=col_type)
    2150      176472 :    call pbuf_get_field(pbuf, cv_reffliq_idx,  cvreffliq,   col_type=col_type)
    2151      176472 :    call pbuf_get_field(pbuf, cv_reffice_idx,  cvreffice,   col_type=col_type)
    2152      176472 :    call pbuf_get_field(pbuf, iciwpst_idx,     iciwpst,     col_type=col_type)
    2153      176472 :    call pbuf_get_field(pbuf, iclwpst_idx,     iclwpst,     col_type=col_type)
    2154      176472 :    call pbuf_get_field(pbuf, icswp_idx,       icswp,       col_type=col_type)
    2155      176472 :    call pbuf_get_field(pbuf, rel_idx,         rel,         col_type=col_type)
    2156      176472 :    call pbuf_get_field(pbuf, rei_idx,         rei,         col_type=col_type)
    2157      176472 :    call pbuf_get_field(pbuf, sadice_idx,      sadice,      col_type=col_type)
    2158      176472 :    call pbuf_get_field(pbuf, sadsnow_idx,     sadsnow,     col_type=col_type)
    2159      176472 :    call pbuf_get_field(pbuf, wsedl_idx,       wsedl,       col_type=col_type)
    2160      176472 :    call pbuf_get_field(pbuf, qme_idx,         qme,         col_type=col_type)
    2161      176472 :    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   247696920 :    proc_rates%bergstot(:ncol,1:nlev) = bergstot(:ncol,top_lev:pver)
    2165             : 
    2166      176472 :    if (degrau_idx > 0)   call pbuf_get_field(pbuf, degrau_idx,   degrau,   col_type=col_type)
    2167      176472 :    if (icgrauwp_idx > 0) call pbuf_get_field(pbuf, icgrauwp_idx, icgrauwp, col_type=col_type)
    2168      176472 :    if (cldfgrau_idx > 0) call pbuf_get_field(pbuf, cldfgrau_idx, cldfgrau, col_type=col_type)
    2169             : 
    2170     1235304 :    call pbuf_get_field(pbuf, cldo_idx,        cldo,     start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
    2171     1235304 :    call pbuf_get_field(pbuf, cldfsnow_idx,    cldfsnow, start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
    2172     1235304 :    call pbuf_get_field(pbuf, cc_t_idx,        CC_t,     start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
    2173     1235304 :    call pbuf_get_field(pbuf, cc_qv_idx,       CC_qv,    start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
    2174     1235304 :    call pbuf_get_field(pbuf, cc_ql_idx,       CC_ql,    start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
    2175     1235304 :    call pbuf_get_field(pbuf, cc_qi_idx,       CC_qi,    start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
    2176     1235304 :    call pbuf_get_field(pbuf, cc_nl_idx,       CC_nl,    start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
    2177     1235304 :    call pbuf_get_field(pbuf, cc_ni_idx,       CC_ni,    start=(/1,1,itim_old/), kount=(/psetcols,pver,1/), col_type=col_type)
    2178     1235304 :    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      176472 :    if (rate1_cw2pr_st_idx > 0) then
    2181      176472 :       call pbuf_get_field(pbuf, rate1_cw2pr_st_idx, rate1ord_cw2pr_st, col_type=col_type)
    2182             :    end if
    2183             : 
    2184      176472 :    if (qrain_idx > 0) call pbuf_get_field(pbuf, qrain_idx, qrout_grid_ptr)
    2185      176472 :    if (qsnow_idx > 0) call pbuf_get_field(pbuf, qsnow_idx, qsout_grid_ptr)
    2186      176472 :    if (nrain_idx > 0) call pbuf_get_field(pbuf, nrain_idx, nrout_grid_ptr)
    2187      176472 :    if (nsnow_idx > 0) call pbuf_get_field(pbuf, nsnow_idx, nsout_grid_ptr)
    2188      176472 :    if (qcsedten_idx > 0) call pbuf_get_field(pbuf, qcsedten_idx, qcsedtenout_grid_ptr)
    2189      176472 :    if (qrsedten_idx > 0) call pbuf_get_field(pbuf, qrsedten_idx, qrsedtenout_grid_ptr)
    2190      176472 :    if (qisedten_idx > 0) call pbuf_get_field(pbuf, qisedten_idx, qisedtenout_grid_ptr)
    2191      176472 :    if (qssedten_idx > 0) call pbuf_get_field(pbuf, qssedten_idx, qssedtenout_grid_ptr)
    2192      176472 :    if (vtrmc_idx > 0) call pbuf_get_field(pbuf, vtrmc_idx, vtrmcout_grid_ptr)
    2193      176472 :    if (umr_idx > 0) call pbuf_get_field(pbuf, umr_idx, umrout_grid_ptr)
    2194      176472 :    if (vtrmi_idx > 0) call pbuf_get_field(pbuf, vtrmi_idx, vtrmiout_grid_ptr)
    2195      176472 :    if (ums_idx > 0) call pbuf_get_field(pbuf, ums_idx, umsout_grid_ptr)
    2196      176472 :    if (qcsevap_idx > 0) call pbuf_get_field(pbuf, qcsevap_idx, qcsevapout_grid_ptr)
    2197      176472 :    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      176472 :    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      176472 :       allocate(bergso_grid(pcols,pver), stat=ierr)
    2252      176472 :       call handle_allocate_error(ierr, 'micro_pumas_cam_tend', 'bergso_grid')
    2253   279178704 :       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      176472 :    call pbuf_get_field(pbuf, ls_reffrain_idx, mgreffrain_grid)
    2259      176472 :    call pbuf_get_field(pbuf, ls_reffsnow_idx, mgreffsnow_grid)
    2260      176472 :    call pbuf_get_field(pbuf, acpr_idx,        acprecl_grid)
    2261      176472 :    call pbuf_get_field(pbuf, acgcme_idx,      acgcme_grid)
    2262      176472 :    call pbuf_get_field(pbuf, acnum_idx,       acnum_grid)
    2263      176472 :    call pbuf_get_field(pbuf, cmeliq_idx,      cmeliq_grid)
    2264      705888 :    call pbuf_get_field(pbuf, ast_idx,         ast_grid, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
    2265             : 
    2266      176472 :    call pbuf_get_field(pbuf, evprain_st_idx,  evprain_st_grid)
    2267      176472 :    call pbuf_get_field(pbuf, evpsnow_st_idx,  evpsnow_st_grid)
    2268      176472 :    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     3000024 :    zen_angle(:) = 0.0_r8
    2276     3000024 :    rlats(:) = 0.0_r8
    2277     3000024 :    rlons(:) = 0.0_r8
    2278      176472 :    calday = get_curr_calday()
    2279      176472 :    call get_rlat_all_p( lchnk, ncol, rlats )
    2280      176472 :    call get_rlon_all_p( lchnk, ncol, rlons )
    2281      176472 :    call zenith( calday, rlats, rlons, zen_angle, ncol )
    2282    11470680 :    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     3000024 :    sza(:) = zen_angle(:) * rad2deg
    2289      176472 :    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      176472 :    alst_mic => ast
    2295      176472 :    aist_mic => ast
    2296             : 
    2297             :    ! Output initial in-cloud LWP (before microphysics)
    2298             : 
    2299     3000024 :    iclwpi = 0._r8
    2300     3000024 :    iciwpi = 0._r8
    2301             : 
    2302     2946672 :    do i = 1, ncol
    2303   235643472 :       do k = top_lev, pver
    2304   232696800 :          iclwpi(i) = iclwpi(i) + &
    2305           0 :               min(state%q(i,k,ixcldliq) / max(mincld,ast(i,k)),0.005_r8) &
    2306   465393600 :               * state%pdel(i,k) / gravit
    2307             :          iciwpi(i) = iciwpi(i) + &
    2308   232696800 :               min(state%q(i,k,ixcldice) / max(mincld,ast(i,k)),0.005_r8) &
    2309   468163800 :               * state%pdel(i,k) / gravit
    2310             :       end do
    2311             :    end do
    2312             : 
    2313   495217368 :    cldo(:ncol,top_lev:pver)=ast(:ncol,top_lev:pver)
    2314             : 
    2315             :    ! Initialize local state from input.
    2316      176472 :    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      176472 :    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      176472 :    lq = .false.
    2359      176472 :    lq(ixq) = .true.
    2360      176472 :    lq(ixcldliq) = .true.
    2361      176472 :    lq(ixcldice) = .true.
    2362      176472 :    lq(ixnumliq) = .true.
    2363      176472 :    lq(ixnumice) = .true.
    2364      176472 :    lq(ixrain) = .true.
    2365      176472 :    lq(ixsnow) = .true.
    2366      176472 :    lq(ixnumrain) = .true.
    2367      176472 :    lq(ixnumsnow) = .true.
    2368      176472 :    if (micro_mg_version > 2) then
    2369      176472 :       lq(ixgraupel) = .true.
    2370      176472 :       lq(ixnumgraupel) = .true.
    2371             :    end if
    2372             : 
    2373             :    ! the name 'cldwat' triggers special tests on cldliq
    2374             :    ! and cldice in physics_update
    2375      176472 :    call physics_ptend_init(ptend, psetcols, "cldwat", ls=.true., lq=lq)
    2376             : 
    2377      176472 :    if (micro_mg_version > 2) then
    2378   274216968 :       state_loc_graup(:ncol,:) = state_loc%q(:ncol,:,ixgraupel)
    2379   274216968 :       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     3000024 :    rbfreq = 0._r8
    2387     3000024 :    rbfrac = 0._r8
    2388             : 
    2389             :    ! Zero out values above top_lev before passing into _tend for some pbuf variables that are inputs
    2390    26696520 :    naai(:ncol,:top_lev-1) = 0._r8
    2391    26696520 :    npccn(:ncol,:top_lev-1) = 0._r8
    2392             : 
    2393             :    ! The null value for qsatfac is 1, not zero
    2394    26696520 :    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    26696520 :    tlat(:ncol,:top_lev-1)=0._r8
    2399    26696520 :    qvlat(:ncol,:top_lev-1)=0._r8
    2400    26696520 :    qcten(:ncol,:top_lev-1)=0._r8
    2401    26696520 :    qiten(:ncol,:top_lev-1)=0._r8
    2402    26696520 :    ncten(:ncol,:top_lev-1)=0._r8
    2403    26696520 :    niten(:ncol,:top_lev-1)=0._r8
    2404    26696520 :    qrten(:ncol,:top_lev-1)=0._r8
    2405    26696520 :    qsten(:ncol,:top_lev-1)=0._r8
    2406    26696520 :    nrten(:ncol,:top_lev-1)=0._r8
    2407    26696520 :    nsten(:ncol,:top_lev-1)=0._r8
    2408    26696520 :    qgten(:ncol,:top_lev-1)=0._r8
    2409    26696520 :    ngten(:ncol,:top_lev-1)=0._r8
    2410    26696520 :    rel(:ncol,:top_lev-1)=0._r8
    2411    26696520 :    rel_fn_dum(:ncol,:top_lev-1)=0._r8
    2412    26696520 :    rei(:ncol,:top_lev-1)=0._r8
    2413    26696520 :    sadice(:ncol,:top_lev-1)=0._r8
    2414    26696520 :    sadsnow(:ncol,:top_lev-1)=0._r8
    2415     2946672 :    prect(:ncol)=0._r8
    2416     2946672 :    preci(:ncol)=0._r8
    2417    26696520 :    nevapr(:ncol,:top_lev-1)=0._r8
    2418    26696520 :    am_evp_st(:ncol,:top_lev-1)=0._r8
    2419    26696520 :    prain(:ncol,:top_lev-1)=0._r8
    2420    26696520 :    cmeice(:ncol,:top_lev-1)=0._r8
    2421    26696520 :    dei(:ncol,:top_lev-1)=0._r8
    2422    26696520 :    mu(:ncol,:top_lev-1)=0._r8
    2423    26696520 :    lambdac(:ncol,:top_lev-1)=0._r8
    2424    26696520 :    qsout(:ncol,:top_lev-1)=0._r8
    2425    26696520 :    des(:ncol,:top_lev-1)=0._r8
    2426    26696520 :    qgout(:ncol,:top_lev-1)=0._r8
    2427    26696520 :    ngout(:ncol,:top_lev-1)=0._r8
    2428    26696520 :    dgout(:ncol,:top_lev-1)=0._r8
    2429    26696520 :    cflx(:ncol,:top_lev-1)=0._r8
    2430    26696520 :    iflx(:ncol,:top_lev-1)=0._r8
    2431    26696520 :    gflx(:ncol,:top_lev-1)=0._r8
    2432    26696520 :    rflx(:ncol,:top_lev-1)=0._r8
    2433    26696520 :    sflx(:ncol,:top_lev-1)=0._r8
    2434    26696520 :    qrout(:ncol,:top_lev-1)=0._r8
    2435    26696520 :    reff_rain_dum(:ncol,:top_lev-1)=0._r8
    2436    26696520 :    reff_snow_dum(:ncol,:top_lev-1)=0._r8
    2437    26696520 :    reff_grau_dum(:ncol,:top_lev-1)=0._r8
    2438    26696520 :    nrout(:ncol,:top_lev-1)=0._r8
    2439    26696520 :    nsout(:ncol,:top_lev-1)=0._r8
    2440    26696520 :    refl(:ncol,:top_lev-1)=0._r8
    2441    26696520 :    arefl(:ncol,:top_lev-1)=0._r8
    2442    26696520 :    areflz(:ncol,:top_lev-1)=0._r8
    2443    26696520 :    frefl(:ncol,:top_lev-1)=0._r8
    2444    26696520 :    csrfl(:ncol,:top_lev-1)=0._r8
    2445    26696520 :    acsrfl(:ncol,:top_lev-1)=0._r8
    2446    26696520 :    fcsrfl(:ncol,:top_lev-1)=0._r8
    2447    26696520 :    refl10cm(:ncol,:top_lev-1)=-9999._r8
    2448    26696520 :    reflz10cm(:ncol,:top_lev-1)=0._r8
    2449    26696520 :    rercld(:ncol,:top_lev-1)=0._r8
    2450    26696520 :    ncai(:ncol,:top_lev-1)=0._r8
    2451    26696520 :    ncal(:ncol,:top_lev-1)=0._r8
    2452    26696520 :    qrout2(:ncol,:top_lev-1)=0._r8
    2453    26696520 :    qsout2(:ncol,:top_lev-1)=0._r8
    2454    26696520 :    nrout2(:ncol,:top_lev-1)=0._r8
    2455    26696520 :    nsout2(:ncol,:top_lev-1)=0._r8
    2456    26696520 :    qgout2(:ncol,:top_lev-1)=0._r8
    2457    26696520 :    ngout2(:ncol,:top_lev-1)=0._r8
    2458    26696520 :    dgout2(:ncol,:top_lev-1)=0._r8
    2459    26696520 :    freqg(:ncol,:top_lev-1)=0._r8
    2460    26696520 :    freqs(:ncol,:top_lev-1)=0._r8
    2461    26696520 :    freqr(:ncol,:top_lev-1)=0._r8
    2462    26696520 :    nfice(:ncol,:top_lev-1)=0._r8
    2463    26696520 :    qcrat(:ncol,:top_lev-1)=0._r8
    2464    26696520 :    tnd_qsnow(:ncol,:top_lev-1)=0._r8
    2465    26696520 :    tnd_nsnow(:ncol,:top_lev-1)=0._r8
    2466    26696520 :    re_ice(:ncol,:top_lev-1)=0._r8
    2467    26696520 :    prer_evap(:ncol,:top_lev-1)=0._r8
    2468    26696520 :    frzimm(:ncol,:top_lev-1)=0._r8
    2469    26696520 :    frzcnt(:ncol,:top_lev-1)=0._r8
    2470    26696520 :    frzdep(:ncol,:top_lev-1)=0._r8
    2471             : 
    2472      352944 :    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      176472 :               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      220248 :               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      264024 :               tlat(:ncol,top_lev:),            qvlat(:ncol,top_lev:),           &
    2489       87552 :               qcten(:ncol,top_lev:),          qiten(:ncol,top_lev:),          &
    2490       87552 :               ncten(:ncol,top_lev:),          niten(:ncol,top_lev:),          &
    2491       87552 :               qrten(:ncol,top_lev:),          qsten(:ncol,top_lev:),          &
    2492       87552 :               nrten(:ncol,top_lev:),          nsten(:ncol,top_lev:),          &
    2493       87552 :               qgten(:ncol,top_lev:),          ngten(:ncol,top_lev:),          &
    2494      176472 :               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      176472 :               prect(:ncol),           preci(:ncol),           &
    2497      220248 :               nevapr(:ncol,top_lev:),          am_evp_st(:ncol,top_lev:),       &
    2498           0 :               prain(:ncol,top_lev:),                   &
    2499      220248 :               cmeice(:ncol,top_lev:),          dei(:ncol,top_lev:),             &
    2500           0 :               mu(:ncol,top_lev:),              lambdac(:ncol,top_lev:),         &
    2501      220248 :               qsout(:ncol,top_lev:),           des(:ncol,top_lev:),             &
    2502      307800 :               qgout(:ncol,top_lev:),   ngout(:ncol,top_lev:),   dgout(:ncol,top_lev:),   &
    2503       87552 :               cflx(:ncol,top_lev:),    iflx(:ncol,top_lev:),                    &
    2504       43776 :               gflx(:ncol,top_lev:),                                    &
    2505      131328 :               rflx(:ncol,top_lev:),    sflx(:ncol,top_lev:),    qrout(:ncol,top_lev:),   &
    2506      176472 :               reff_rain_dum(:ncol,top_lev:),          reff_snow_dum(:ncol,top_lev:),   reff_grau_dum(:ncol,top_lev:),       &
    2507       87552 :               nrout(:ncol,top_lev:),           nsout(:ncol,top_lev:),           &
    2508      131328 :               refl(:ncol,top_lev:),    arefl(:ncol,top_lev:),   areflz(:ncol,top_lev:),  &
    2509      351576 :               frefl(:ncol,top_lev:),   csrfl(:ncol,top_lev:),   acsrfl(:ncol,top_lev:),  &
    2510       43776 :               fcsrfl(:ncol,top_lev:),   &
    2511      131328 :               refl10cm(:ncol,top_lev:), reflz10cm(:ncol,top_lev:),    rercld(:ncol,top_lev:),          &
    2512       87552 :               ncai(:ncol,top_lev:),            ncal(:ncol,top_lev:),            &
    2513       87552 :               qrout2(:ncol,top_lev:),          qsout2(:ncol,top_lev:),          &
    2514       87552 :               nrout2(:ncol,top_lev:),          nsout2(:ncol,top_lev:),          &
    2515      176472 :               drout_dum(:ncol,top_lev:),              dsout2_dum(:ncol,top_lev:),             &
    2516      175104 :               qgout2(:ncol,top_lev:), ngout2(:ncol,top_lev:), dgout2(:ncol,top_lev:), freqg(:ncol,top_lev:),   &
    2517      264024 :               freqs(:ncol,top_lev:),           freqr(:ncol,top_lev:),           &
    2518       87552 :               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  3838908960 :               frzimm(:ncol,top_lev:),  frzcnt(:ncol,top_lev:),  frzdep(:ncol,top_lev:)   )
    2524             : 
    2525      176472 :       call handle_errmsg(errstring, subname="micro_pumas_cam_tend")
    2526             : 
    2527             :       call physics_ptend_init(ptend_loc, psetcols, "micro_pumas", &
    2528      176472 :                               ls=.true., lq=lq)
    2529             : 
    2530             :       ! Set local tendency.
    2531   247696920 :       ptend_loc%s(:ncol,top_lev:) = tlat(:ncol,top_lev:)
    2532   247696920 :       ptend_loc%q(:ncol,top_lev:,ixq) = qvlat(:ncol,top_lev:)
    2533   247696920 :       ptend_loc%q(:ncol,top_lev:,ixcldliq) = qcten(:ncol,top_lev:)
    2534   247696920 :       ptend_loc%q(:ncol,top_lev:,ixcldice) = qiten(:ncol,top_lev:)
    2535   247696920 :       ptend_loc%q(:ncol,top_lev:,ixnumliq) = ncten(:ncol,top_lev:)
    2536             : 
    2537      176472 :       if (do_cldice) then
    2538   247696920 :          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   247696920 :       ptend_loc%q(:ncol,top_lev:,ixrain) = qrten(:ncol,top_lev:)
    2549   247696920 :       ptend_loc%q(:ncol,top_lev:,ixsnow) = qsten(:ncol,top_lev:)
    2550   247696920 :       ptend_loc%q(:ncol,top_lev:,ixnumrain) = nrten(:ncol,top_lev:)
    2551   247696920 :       ptend_loc%q(:ncol,top_lev:,ixnumsnow) = nsten(:ncol,top_lev:)
    2552             : 
    2553      176472 :       if (micro_mg_version > 2) then
    2554   247696920 :          ptend_loc%q(:ncol,top_lev:,ixgraupel) = qgten(:ncol,top_lev:)
    2555   247696920 :          ptend_loc%q(:ncol,top_lev:,ixnumgraupel) = ngten(:ncol,top_lev:)
    2556             :       end if
    2557             : 
    2558             :       ! Sum into overall ptend
    2559      176472 :       call physics_ptend_sum(ptend_loc, ptend, ncol)
    2560             : 
    2561             :       ! Update local state
    2562      176472 :       call physics_update(state_loc, ptend_loc, dtime/num_steps)
    2563             : 
    2564      352944 :       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      176472 :    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      176472 :    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      176472 :    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   279178704 :    mnuccdohet = 0._r8
    2599    15000120 :    do k=top_lev,pver
    2600   247696920 :       do i=1,ncol
    2601   247520448 :          if (naai(i,k) > 0._r8) then
    2602     7619987 :             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   250643592 :    mgflxprc(:ncol,top_lev:pverp) = rflx(:ncol,top_lev:pverp) + sflx(:ncol,top_lev:pverp)
    2608   250643592 :    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      176472 :    if (micro_mg_version >= 2) then
    2612   250643592 :       mgflxprc(:ncol,top_lev:pverp) = mgflxprc(:ncol,top_lev:pverp)+ iflx(:ncol,top_lev:pverp) + cflx(:ncol,top_lev:pverp)
    2613   250643592 :       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      176472 :    if (micro_mg_version >= 3) then
    2618   250643592 :       mgflxprc(:ncol,top_lev:pverp) = mgflxprc(:ncol,top_lev:pverp)+gflx(:ncol,top_lev:pverp)
    2619   250643592 :       mgflxsnw(:ncol,top_lev:pverp) = mgflxsnw(:ncol,top_lev:pverp)+gflx(:ncol,top_lev:pverp)
    2620             :    end if
    2621             : 
    2622   247696920 :    mgmrprc(:ncol,top_lev:pver) = qrout(:ncol,top_lev:pver) + qsout(:ncol,top_lev:pver)
    2623   247696920 :    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   247696920 :    cvreffliq(:ncol,top_lev:pver) = 9.0_r8
    2628   247696920 :    cvreffice(:ncol,top_lev:pver) = 37.0_r8
    2629             : 
    2630             :    ! Reassign rate1 if modal aerosols
    2631      176472 :    if (rate1_cw2pr_st_idx > 0) then
    2632   247696920 :       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   247696920 :    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   247696920 :    CC_T(:ncol,top_lev:pver)    = tlat(:ncol,top_lev:pver)/cpair
    2640   247696920 :    CC_qv(:ncol,top_lev:pver)   = qvlat(:ncol,top_lev:pver)
    2641   247696920 :    CC_ql(:ncol,top_lev:pver)   = qcten(:ncol,top_lev:pver)
    2642   247696920 :    CC_qi(:ncol,top_lev:pver)   = qiten(:ncol,top_lev:pver)
    2643   247696920 :    CC_nl(:ncol,top_lev:pver)   = ncten(:ncol,top_lev:pver)
    2644   247696920 :    CC_ni(:ncol,top_lev:pver)   = niten(:ncol,top_lev:pver)
    2645   495217368 :    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    26696520 :    qme(:ncol,:top_lev-1) = 0._r8
    2649   495217368 :    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     3000024 :    prec_pcw = prect
    2656     3000024 :    snow_pcw = preci
    2657     3000024 :    prec_sed = 0._r8
    2658     3000024 :    snow_sed = 0._r8
    2659     5823576 :    prec_str = prec_pcw + prec_sed
    2660     5823576 :    snow_str = snow_pcw + snow_sed
    2661             : 
    2662   247696920 :    icecldf(:ncol,top_lev:pver) = ast(:ncol,top_lev:pver)
    2663   247696920 :    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   279178704 :    icinc = 0._r8
    2671   279178704 :    icwnc = 0._r8
    2672   279178704 :    iciwpst = 0._r8
    2673   279178704 :    iclwpst = 0._r8
    2674   279178704 :    icswp = 0._r8
    2675   279178704 :    cldfsnow = 0._r8
    2676      176472 :    if (micro_mg_version > 2) then
    2677   279178704 :       icgrauwp = 0._r8
    2678   279178704 :       cldfgrau = 0._r8
    2679             :    end if
    2680             : 
    2681    15000120 :    do k = top_lev, pver
    2682   247696920 :       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   232696800 :          icimrst(i,k)   = min( state_loc%q(i,k,ixcldice) / max(mincld,icecldf(i,k)),0.005_r8 )
    2686   232696800 :          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   232696800 :               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   232696800 :               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   232696800 :          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   232696800 :          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   232696800 :          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   465393600 :             ( concld(i,k)   .lt. 1.e-4_r8 ) .and. &
    2703   232696800 :             ( state_loc%q(i,k,ixcldliq) .lt. 1.e-10_r8 ) ) then
    2704    21414204 :             cldfsnow(i,k) = 0._r8
    2705             :          end if
    2706             :          ! If no cloud and snow, then set to 0.25
    2707   232696800 :          if( ( cldfsnow(i,k) .le. 1.e-4_r8 ) .and. ( qsout(i,k) .gt. 1.e-6_r8 ) ) then
    2708    11095073 :             cldfsnow(i,k) = 0.25_r8
    2709             :          end if
    2710             :          ! Calculate in-cloud snow water path
    2711   232696800 :          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   247520448 :        if (micro_mg_version > 2) then
    2717   232696800 :           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   465393600 :               ( concld(i,k)   .lt. 1.e-4_r8 ) .and. &
    2721   232696800 :               ( state_loc%q(i,k,ixcldliq) .lt. 1.e-10_r8 ) ) then
    2722    21414204 :               cldfgrau(i,k) = 0._r8
    2723             :            end if
    2724             :          ! If no cloud and graupel, then set to 0.25
    2725   232696800 :            if( ( cldfgrau(i,k) .le. 1.e-4_r8 ) .and. ( qgout(i,k) .gt. 1.e-9_r8 ) ) then
    2726     2542243 :               cldfgrau(i,k) = 0.25_r8
    2727             :            end if
    2728             : 
    2729             :          ! Calculate in-cloud snow water path
    2730   232696800 :            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   247696920 :    cldmax(:ncol,top_lev:) = max(mincld, ast(:ncol,top_lev:))
    2741    14823648 :    do k = top_lev+1, pver
    2742           0 :       where (state_loc%q(:ncol,k-1,ixrain) >= qsmall .or. &
    2743   259397424 :            state_loc%q(:ncol,k-1,ixsnow) >= qsmall)
    2744    14647176 :          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   247696920 :    bergstot(:ncol,top_lev:) = proc_rates%bergstot(:ncol,1:nlev)
    2750    26696520 :    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      176472 :    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    26696520 :       qcreso_grid(:ncol,:top_lev-1)     = 0._r8
    2890    26696520 :       melto_grid(:ncol,:top_lev-1)      = 0._r8
    2891    26696520 :       mnuccco_grid(:ncol,:top_lev-1)    = 0._r8
    2892    26696520 :       mnuccto_grid(:ncol,:top_lev-1)    = 0._r8
    2893    26696520 :       bergo_grid(:ncol,:top_lev-1)      = 0._r8
    2894    26696520 :       homoo_grid(:ncol,:top_lev-1)      = 0._r8
    2895    26696520 :       msacwio_grid(:ncol,:top_lev-1)    = 0._r8
    2896    26696520 :       psacwso_grid(:ncol,:top_lev-1)    = 0._r8
    2897    26696520 :       cmeiout_grid(:ncol,:top_lev-1)    = 0._r8
    2898    26696520 :       qireso_grid(:ncol,:top_lev-1)     = 0._r8
    2899    26696520 :       prcio_grid(:ncol,:top_lev-1)      = 0._r8
    2900    26696520 :       praio_grid(:ncol,:top_lev-1)      = 0._r8
    2901    26696520 :       prao_grid(:ncol,:top_lev-1)       = 0._r8
    2902    26696520 :       prco_grid(:ncol,:top_lev-1)       = 0._r8
    2903    26696520 :       qcsedtenout_grid(:ncol,:top_lev-1) = 0._r8
    2904    26696520 :       qisedtenout_grid(:ncol,:top_lev-1) = 0._r8
    2905    26696520 :       vtrmcout_grid(:ncol,:top_lev-1)    = 0._r8
    2906    26696520 :       vtrmiout_grid(:ncol,:top_lev-1)    = 0._r8
    2907    26696520 :       qcsevapout_grid(:ncol,:top_lev-1) = 0._r8
    2908    26696520 :       qisevapout_grid(:ncol,:top_lev-1) = 0._r8
    2909    26696520 :       qrsedtenout_grid(:ncol,:top_lev-1) = 0._r8
    2910    26696520 :       qssedtenout_grid(:ncol,:top_lev-1) = 0._r8
    2911    26696520 :       umrout_grid(:ncol,:top_lev-1) = 0._r8
    2912    26696520 :       umsout_grid(:ncol,:top_lev-1) = 0._r8
    2913    26696520 :       psacro_grid(:ncol,:top_lev-1) = 0._r8
    2914    26696520 :       pracgo_grid(:ncol,:top_lev-1) = 0._r8
    2915    26696520 :       psacwgo_grid(:ncol,:top_lev-1) = 0._r8
    2916    26696520 :       pgsacwo_grid(:ncol,:top_lev-1) = 0._r8
    2917    26696520 :       pgracso_grid(:ncol,:top_lev-1) = 0._r8
    2918    26696520 :       prdgo_grid(:ncol,:top_lev-1) = 0._r8
    2919    26696520 :       qmultgo_grid(:ncol,:top_lev-1) = 0._r8
    2920    26696520 :       qmultrgo_grid(:ncol,:top_lev-1) = 0._r8
    2921    26696520 :       npracgo_grid(:ncol,:top_lev-1) = 0._r8
    2922    26696520 :       nscngo_grid(:ncol,:top_lev-1) = 0._r8
    2923    26696520 :       ngracso_grid(:ncol,:top_lev-1) = 0._r8
    2924    26696520 :       nmultgo_grid(:ncol,:top_lev-1) = 0._r8
    2925    26696520 :       nmultrgo_grid(:ncol,:top_lev-1) = 0._r8
    2926    26696520 :       npsacwgo_grid(:ncol,:top_lev-1) = 0._r8
    2927    26696520 :       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      176472 :       lambdac_grid    => lambdac
    2932      176472 :       mu_grid         => mu
    2933      176472 :       rel_grid        => rel
    2934      176472 :       rei_grid        => rei
    2935      176472 :       sadice_grid     => sadice
    2936      176472 :       sadsnow_grid    => sadsnow
    2937      176472 :       dei_grid        => dei
    2938      176472 :       des_grid        => des
    2939      176472 :       degrau_grid     => degrau
    2940             : 
    2941             :       ! fields already on grids, so just assign
    2942      176472 :       prec_str_grid   => prec_str
    2943      176472 :       iclwpst_grid    => iclwpst
    2944      176472 :       cvreffliq_grid  => cvreffliq
    2945      176472 :       cvreffice_grid  => cvreffice
    2946      176472 :       mgflxprc_grid   => mgflxprc
    2947      176472 :       mgflxsnw_grid   => mgflxsnw
    2948      176472 :       qme_grid        => qme
    2949      176472 :       nevapr_grid     => nevapr
    2950      176472 :       prain_grid      => prain
    2951             : 
    2952   247696920 :       bergso_grid(:ncol,top_lev:)    =  proc_rates%bergstot
    2953   279178704 :       am_evp_st_grid  = am_evp_st
    2954             : 
    2955   247696920 :       evpsnow_st_grid(:ncol,top_lev:) = proc_rates%evapsnow
    2956   279178704 :       qrout_grid      = qrout
    2957   279178704 :       qsout_grid      = qsout
    2958   279178704 :       nsout_grid      = nsout
    2959   279178704 :       nrout_grid      = nrout
    2960   279178704 :       cld_grid        = cld
    2961   247696920 :       qcreso_grid(:ncol,top_lev:)     = proc_rates%qcrestot
    2962   247696920 :       melto_grid(:ncol,top_lev:)      = proc_rates%melttot
    2963   247696920 :       mnuccco_grid(:ncol,top_lev:)    = proc_rates%mnuccctot
    2964   247696920 :       mnuccto_grid(:ncol,top_lev:)    = proc_rates%mnuccttot
    2965   247696920 :       bergo_grid(:ncol,top_lev:)      = proc_rates%bergtot
    2966   247696920 :       homoo_grid(:ncol,top_lev:)      = proc_rates%homotot
    2967   247696920 :       msacwio_grid(:ncol,top_lev:)    = proc_rates%msacwitot
    2968   247696920 :       psacwso_grid(:ncol,top_lev:)    = proc_rates%psacwstot
    2969   247696920 :       cmeiout_grid(:ncol,top_lev:)    = proc_rates%cmeitot
    2970   247696920 :       qireso_grid(:ncol,top_lev:)     = proc_rates%qirestot
    2971   247696920 :       prcio_grid(:ncol,top_lev:)      = proc_rates%prcitot
    2972   247696920 :       praio_grid(:ncol,top_lev:)      = proc_rates%praitot
    2973   279178704 :       icwmrst_grid    = icwmrst
    2974   279178704 :       icimrst_grid    = icimrst
    2975   279178704 :       liqcldf_grid    = liqcldf
    2976   279178704 :       icecldf_grid    = icecldf
    2977   279178704 :       icwnc_grid      = icwnc
    2978   279178704 :       icinc_grid      = icinc
    2979   279178704 :       pdel_grid       = state_loc%pdel
    2980   247696920 :       prao_grid(:ncol,top_lev:)       = proc_rates%pratot
    2981   247696920 :       prco_grid(:ncol,top_lev:)       = proc_rates%prctot
    2982             : 
    2983   279178704 :       nc_grid = state_loc%q(:,:,ixnumliq)
    2984   279178704 :       ni_grid = state_loc%q(:,:,ixnumice)
    2985             : 
    2986   247696920 :       qcsedtenout_grid(:ncol,top_lev:) = proc_rates%qcsedten
    2987   247696920 :       qisedtenout_grid(:ncol,top_lev:) = proc_rates%qisedten
    2988   247696920 :       vtrmcout_grid(:ncol,top_lev:)    = proc_rates%vtrmc
    2989   247696920 :       vtrmiout_grid(:ncol,top_lev:)    = proc_rates%vtrmi
    2990   247696920 :       qcsevapout_grid(:ncol,top_lev:) = proc_rates%qcsevap
    2991   247696920 :       qisevapout_grid(:ncol,top_lev:) = proc_rates%qisevap
    2992             : 
    2993   279178704 :       cldmax_grid = cldmax
    2994             : 
    2995   279178704 :       qr_grid = state_loc%q(:,:,ixrain)
    2996   279178704 :       nr_grid = state_loc%q(:,:,ixnumrain)
    2997   279178704 :       qs_grid = state_loc%q(:,:,ixsnow)
    2998   279178704 :       ns_grid = state_loc%q(:,:,ixnumsnow)
    2999   247696920 :       qrsedtenout_grid(:ncol,top_lev:) = proc_rates%qrsedten
    3000   247696920 :       qssedtenout_grid(:ncol,top_lev:) = proc_rates%qssedten
    3001   247696920 :       umrout_grid(:ncol,top_lev:) = proc_rates%umr
    3002   247696920 :       umsout_grid(:ncol,top_lev:) = proc_rates%ums
    3003             : 
    3004             : ! Zero out terms for budgets if not mg3....
    3005      176472 :       psacwgo_grid = 0._r8
    3006      176472 :       pgsacwo_grid = 0._r8
    3007      176472 :       qmultgo_grid = 0._r8
    3008             : 
    3009      176472 :       if (micro_mg_version > 2) then
    3010   279178704 :             qg_grid = state_loc%q(:,:,ixgraupel)
    3011   279178704 :             ng_grid = state_loc%q(:,:,ixnumgraupel)
    3012   247696920 :             psacro_grid(:ncol,top_lev:) =     proc_rates%psacrtot
    3013   247696920 :             pracgo_grid(:ncol,top_lev:) =     proc_rates%pracgtot
    3014   247696920 :             psacwgo_grid(:ncol,top_lev:) =    proc_rates%psacwgtot
    3015   247696920 :             pgsacwo_grid(:ncol,top_lev:) =    proc_rates%pgsacwtot
    3016   247696920 :             pgracso_grid(:ncol,top_lev:) =    proc_rates%pgracstot
    3017   247696920 :             prdgo_grid(:ncol,top_lev:) =      proc_rates%prdgtot
    3018   247696920 :             qmultgo_grid(:ncol,top_lev:) =    proc_rates%qmultgtot
    3019   247696920 :             qmultrgo_grid(:ncol,top_lev:) =   proc_rates%qmultrgtot
    3020   247696920 :             npracgo_grid(:ncol,top_lev:) =   proc_rates%npracgtot
    3021   247696920 :             nscngo_grid(:ncol,top_lev:) =   proc_rates%nscngtot
    3022   247696920 :             ngracso_grid(:ncol,top_lev:) =   proc_rates%ngracstot
    3023   247696920 :             nmultgo_grid(:ncol,top_lev:) =   proc_rates%nmultgtot
    3024   247696920 :             nmultrgo_grid(:ncol,top_lev:) =   proc_rates%nmultrgtot
    3025   247696920 :             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      176472 :    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      352944 :    rho(:ncol,top_lev:) = state%pmid(:ncol,top_lev:) / &
    3075   248049864 :         (rair*state%t(:ncol,top_lev:))
    3076      176472 :    if (use_subcol_microp) then
    3077           0 :       call subcol_field_avg(rho, ngrdcol, lchnk, rho_grid)
    3078             :    else
    3079   279178704 :       rho_grid = rho
    3080             :    end if
    3081             : 
    3082             :    ! Effective radius for cloud liquid, fixed number.
    3083   279178704 :    mu_grid = 0._r8
    3084   279178704 :    lambdac_grid = 0._r8
    3085   279178704 :    rel_fn_grid = 10._r8
    3086             : 
    3087   279178704 :    ncic_grid = 1.e8_r8
    3088             : 
    3089    15000120 :    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    15000120 :                                mu_grid(:ngrdcol,k), lambdac_grid(:ngrdcol,k), ngrdcol)
    3096             :       !$acc end data
    3097             :    end do
    3098             : 
    3099   247696920 :    where (icwmrst_grid(:ngrdcol,top_lev:) > qsmall)
    3100      176472 :       rel_fn_grid(:ngrdcol,top_lev:) = &
    3101      176472 :            (mu_grid(:ngrdcol,top_lev:) + 3._r8)/ &
    3102      176472 :            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   279178704 :    mu_grid = 0._r8
    3108   279178704 :    lambdac_grid = 0._r8
    3109   279178704 :    rel_grid = 10._r8
    3110             : 
    3111             :    ! Calculate ncic on the grid
    3112             :    ncic_grid(:ngrdcol,top_lev:) = nc_grid(:ngrdcol,top_lev:) / &
    3113   247696920 :         max(mincld,liqcldf_grid(:ngrdcol,top_lev:))
    3114             : 
    3115    15000120 :    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    15000120 :            mu_grid(:ngrdcol,k), lambdac_grid(:ngrdcol,k), ngrdcol)
    3122             :       !$acc end data
    3123             :    end do
    3124             : 
    3125   990611208 :    where (icwmrst_grid(:ngrdcol,top_lev:) >= qsmall)
    3126      176472 :       rel_grid(:ngrdcol,top_lev:) = &
    3127      176472 :            (mu_grid(:ngrdcol,top_lev:) + 3._r8) / &
    3128      176472 :            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      176472 :       mu_grid(:ngrdcol,top_lev:) = 0._r8
    3133             :    end where
    3134             : 
    3135             :    ! Rain/Snow effective diameter.
    3136      176472 :    drout2_grid = 0._r8
    3137      176472 :    reff_rain_grid = 0._r8
    3138   279178704 :    des_grid = 0._r8
    3139      176472 :    dsout2_grid = 0._r8
    3140      176472 :    reff_snow_grid = 0._r8
    3141      176472 :    reff_grau_grid = 0._r8
    3142             : 
    3143             :    ! Prognostic precipitation
    3144             : 
    3145   742914288 :    where (qr_grid(:ngrdcol,top_lev:) >= 1.e-7_r8)
    3146             :       drout2_grid(:ngrdcol,top_lev:) = avg_diameter( &
    3147      176472 :            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   990611208 :    where (qs_grid(:ngrdcol,top_lev:) >= 1.e-7_r8)
    3156             :       dsout2_grid(:ngrdcol,top_lev:) = avg_diameter( &
    3157      176472 :            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      176472 :       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      176472 :    if (micro_mg_version > 2) then
    3171   279178704 :       degrau_grid = 0._r8
    3172   990611208 :       where (qg_grid(:ngrdcol,top_lev:) >= 1.e-7_r8)
    3173             :          dgout2_grid(:ngrdcol,top_lev:) = avg_diameter( &
    3174      176472 :               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      176472 :          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   279178704 :    rei_grid = 25._r8
    3187             : 
    3188      176472 :    niic_grid(:ngrdcol,top_lev:) = ni_grid(:ngrdcol,top_lev:) / &
    3189   247873392 :         max(mincld,icecldf_grid(:ngrdcol,top_lev:))
    3190             : 
    3191    15000120 :    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    15000120 :                                  niic_grid(:ngrdcol,k),rei_grid(:ngrdcol,k),ngrdcol)
    3197             :       !$acc end data
    3198             :    end do
    3199             : 
    3200   990611208 :    where (icimrst_grid(:ngrdcol,top_lev:) >= qsmall)
    3201      176472 :       rei_grid(:ngrdcol,top_lev:) = 1.5_r8/rei_grid(:ngrdcol,top_lev:) &
    3202             :            * 1.e6_r8
    3203             :    elsewhere
    3204      176472 :       rei_grid(:ngrdcol,top_lev:) = 25._r8
    3205             :    end where
    3206             : 
    3207   558180936 :    dei_grid = rei_grid * rhoi/rhows * 2._r8
    3208             : 
    3209             :    ! Limiters for low cloud fraction.
    3210    15000120 :    do k = top_lev, pver
    3211   247696920 :       do i = 1, ngrdcol
    3212             :          ! Convert snow effective diameter to microns
    3213   232696800 :          des_grid(i,k) = des_grid(i,k) * 1.e6_r8
    3214   247520448 :          if ( ast_grid(i,k) < 1.e-4_r8 ) then
    3215   183250782 :             mu_grid(i,k) = mucon
    3216   183250782 :             lambdac_grid(i,k) = (mucon + 1._r8)/dcon
    3217   183250782 :             dei_grid(i,k) = deicon
    3218             :          end if
    3219             :       end do
    3220             :    end do
    3221             : 
    3222   247696920 :    mgreffrain_grid(:ngrdcol,top_lev:pver) = reff_rain_grid(:ngrdcol,top_lev:pver)
    3223   247696920 :    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     2946672 :    tgliqwp_grid(:ngrdcol) = 0._r8
    3234     2946672 :    tgcmeliq_grid(:ngrdcol) = 0._r8
    3235    15000120 :    do k = top_lev, pver
    3236   247696920 :       do i = 1, ngrdcol
    3237   232696800 :          tgliqwp_grid(i)  = tgliqwp_grid(i) + iclwpst_grid(i,k)*cld_grid(i,k)
    3238             : 
    3239   247520448 :          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    12069180 :                  (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     2946672 :    pe_grid(:ngrdcol)     = 0._r8
    3258     2946672 :    tpr_grid(:ngrdcol)    = 0._r8
    3259     2946672 :    pefrac_grid(:ngrdcol) = 0._r8
    3260             : 
    3261             :    ! accumulate precip and condensation
    3262     2946672 :    do i = 1, ngrdcol
    3263             : 
    3264     2770200 :       acgcme_grid(i)  = acgcme_grid(i) + tgcmeliq_grid(i)
    3265     2770200 :       acprecl_grid(i) = acprecl_grid(i) + prec_str_grid(i)
    3266     2770200 :       acnum_grid(i)   = acnum_grid(i) + 1
    3267             : 
    3268             :       ! if LWP is zero, then 'end of cloud': calculate precip efficiency
    3269     2770200 :       if (tgliqwp_grid(i) < minlwp) then
    3270     1653860 :          if (acprecl_grid(i) > 5.e-8_r8) then
    3271       53148 :             tpr_grid(i) = max(acprecl_grid(i)/acnum_grid(i), 1.e-15_r8)
    3272       53148 :             if (acgcme_grid(i) > 1.e-10_r8) then
    3273       43170 :                pe_grid(i) = min(max(acprecl_grid(i)/acgcme_grid(i), 1.e-15_r8), 1.e5_r8)
    3274       43170 :                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     1653860 :          acprecl_grid(i) = 0._r8
    3285     1653860 :          acgcme_grid(i)  = 0._r8
    3286     1653860 :          acnum_grid(i)   = 0
    3287             :       end if               ! end LWP zero conditional
    3288             : 
    3289             :       ! if never find any rain....(after 10^3 timesteps...)
    3290     2946672 :       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      176472 :    vprao_grid = 0._r8
    3303      176472 :    cnt_grid = 0
    3304    15000120 :    do k = top_lev, pver
    3305   247520448 :       vprao_grid(:ngrdcol) = vprao_grid(:ngrdcol) + prao_grid(:ngrdcol,k)
    3306   247696920 :       where (prao_grid(:ngrdcol,k) /= 0._r8) cnt_grid(:ngrdcol) = cnt_grid(:ngrdcol) + 1
    3307             :    end do
    3308             : 
    3309     3000024 :    where (cnt_grid > 0) vprao_grid = vprao_grid/cnt_grid
    3310             : 
    3311      176472 :    vprco_grid = 0._r8
    3312      176472 :    cnt_grid = 0
    3313    15000120 :    do k = top_lev, pver
    3314   247520448 :       vprco_grid(:ngrdcol) = vprco_grid(:ngrdcol) + prco_grid(:ngrdcol,k)
    3315   247696920 :       where (prco_grid(:ngrdcol,k) /= 0._r8) cnt_grid(:ngrdcol) = cnt_grid(:ngrdcol) + 1
    3316             :    end do
    3317             : 
    3318    11470680 :    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     3000024 :    racau_grid = min(racau_grid, 1.e10_r8)
    3326             : 
    3327             : !-----------------------------------------------------------------------
    3328             : ! Diagnostic Rainbow Calculation. Seriously.
    3329             : !-----------------------------------------------------------------------
    3330             : 
    3331     2946672 :    do i = 1, ngrdcol
    3332             : 
    3333     2770200 :       top_idx = pver
    3334     2770200 :       convmx = 0._r8
    3335     2770200 :       frlow  = 0._r8
    3336     2770200 :       cldmx  = 0._r8
    3337   238237200 :       cldtot  = maxval(ast(i,top_lev:))
    3338             : 
    3339             : ! Find levels in surface layer
    3340   235467000 :       do k = top_lev, pver
    3341   235467000 :          if (state%pmid(i,k) > rb_pmin) then
    3342    32885103 :             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    38549340 :       convmx = maxval(concld(i,top_idx:))
    3349             : !For stratiform precip, base on precip fraction
    3350    38549340 :       cldmx= maxval(freqr(i,top_idx:))
    3351             : ! Combine and use maximum of strat or conv fraction
    3352     2770200 :       frlow= max(cldmx,convmx)
    3353             : 
    3354             : !max precip
    3355    38549340 :       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     2770200 :       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     2946672 :       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       72109 :           rbfrac(i) =  max(0._r8,(1._r8-COS((sza(i)-48._r8)*deg2rad))/2._r8) * frlow
    3375       72109 :           rbfreq(i) =  1.0_r8
    3376             :       end if
    3377             : 
    3378             :    end do                    ! end column loop for rainbows
    3379             : 
    3380      176472 :    call outfld('RBFRAC',   rbfrac,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3381      176472 :    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   235643472 :         pdel_grid(:ngrdcol,top_lev:pver)/gravit, dim=2)
    3391             : 
    3392             :    ! Averaging for new output fields
    3393      176472 :    efcout_grid      = 0._r8
    3394      176472 :    efiout_grid      = 0._r8
    3395      176472 :    ncout_grid       = 0._r8
    3396      176472 :    niout_grid       = 0._r8
    3397      176472 :    freql_grid       = 0._r8
    3398      176472 :    freqi_grid       = 0._r8
    3399      176472 :    icwmrst_grid_out = 0._r8
    3400      176472 :    icimrst_grid_out = 0._r8
    3401      176472 :    freqm_grid       = 0._r8
    3402      176472 :    freqsl_grid      = 0._r8
    3403      176472 :    freqslm_grid     = 0._r8
    3404             : 
    3405    15000120 :    do k = top_lev, pver
    3406   247696920 :       do i = 1, ngrdcol
    3407   232696800 :          if ( liqcldf_grid(i,k) > 0.01_r8 .and. icwmrst_grid(i,k) > 5.e-5_r8 ) then
    3408     6009395 :             efcout_grid(i,k) = rel_grid(i,k) * liqcldf_grid(i,k)
    3409     6009395 :             ncout_grid(i,k)  = icwnc_grid(i,k) * liqcldf_grid(i,k)
    3410     6009395 :             freql_grid(i,k)  = liqcldf_grid(i,k)
    3411     6009395 :             icwmrst_grid_out(i,k) = icwmrst_grid(i,k)
    3412             :          end if
    3413   232696800 :          if ( icecldf_grid(i,k) > 0.01_r8 .and. icimrst_grid(i,k) > 1.e-6_r8 ) then
    3414    13154874 :             efiout_grid(i,k) = rei_grid(i,k) * icecldf_grid(i,k)
    3415    13154874 :             niout_grid(i,k)  = icinc_grid(i,k) * icecldf_grid(i,k)
    3416    13154874 :             freqi_grid(i,k)  = icecldf_grid(i,k)
    3417    13154874 :             icimrst_grid_out(i,k) = icimrst_grid(i,k)
    3418             :          end if
    3419             : 
    3420             :          ! Supercooled liquid
    3421   232696800 :          if (freql_grid(i,k) > 0.01_r8 .and. freqi_grid(i,k) > 0.01_r8 ) then
    3422      794336 :             freqm_grid(i,k)=min(liqcldf_grid(i,k),icecldf_grid(i,k))
    3423             :          end if
    3424   232696800 :          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     1051845 :             freqsl_grid(i,k)=liqcldf_grid(i,k)
    3426             :          end if
    3427   247520448 :          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      794300 :             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      176472 :    fcti_grid  = 0._r8
    3436      176472 :    fctl_grid  = 0._r8
    3437      176472 :    ctrel_grid = 0._r8
    3438      176472 :    ctrei_grid = 0._r8
    3439      176472 :    ctnl_grid  = 0._r8
    3440      176472 :    ctni_grid  = 0._r8
    3441      176472 :    fctm_grid  = 0._r8
    3442      176472 :    fctsl_grid = 0._r8
    3443      176472 :    fctslm_grid= 0._r8
    3444             : 
    3445     2946672 :    do i = 1, ngrdcol
    3446   161876157 :       do k = top_lev, pver
    3447   161322555 :          if ( liqcldf_grid(i,k) > 0.01_r8 .and. icwmrst_grid(i,k) > 1.e-7_r8 ) then
    3448      540450 :             ctrel_grid(i) = rel_grid(i,k) * liqcldf_grid(i,k)
    3449      540450 :             ctnl_grid(i)  = icwnc_grid(i,k) * liqcldf_grid(i,k)
    3450      540450 :             fctl_grid(i)  = liqcldf_grid(i,k)
    3451             : 
    3452             :             ! Cloud Top Mixed phase, supercooled liquid only and supercooled liquid mixed
    3453      540450 :             if (freqi_grid(i,k) > 0.01_r8) then
    3454       27276 :                fctm_grid(i)=min(liqcldf_grid(i,k),icecldf_grid(i,k))
    3455             :             end if
    3456      540450 :             if (freqi_grid(i,k) < 0.01_r8 .and. state_loc%t(i,k) < tmelt ) then
    3457      129225 :                fctsl_grid(i)=liqcldf_grid(i,k)
    3458             :             end if
    3459      540450 :             if (freqi_grid(i,k) > 0.01_r8 .and. state_loc%t(i,k) < tmelt ) then
    3460       27276 :                fctslm_grid(i)=liqcldf_grid(i,k)
    3461             :             end if
    3462             : 
    3463             :             exit
    3464             :          end if
    3465             : 
    3466   161159235 :          if ( icecldf_grid(i,k) > 0.01_r8 .and. icimrst_grid(i,k) > 1.e-7_r8 ) then
    3467     1852620 :             ctrei_grid(i) = rei_grid(i,k) * icecldf_grid(i,k)
    3468     1852620 :             ctni_grid(i)  = icinc_grid(i,k) * icecldf_grid(i,k)
    3469     1852620 :             fcti_grid(i)  = icecldf_grid(i,k)
    3470     1852620 :             exit
    3471             :          end if
    3472             :       end do
    3473             :    end do
    3474             : 
    3475             :    ! Evaporation of stratiform precipitation fields for UNICON
    3476   548257464 :    evprain_st_grid(:ngrdcol,:pver) = nevapr_grid(:ngrdcol,:pver) - evpsnow_st_grid(:ngrdcol,:pver)
    3477    15000120 :    do k = top_lev, pver
    3478   247696920 :       do i = 1, ngrdcol
    3479   232696800 :          evprain_st_grid(i,k) = max(evprain_st_grid(i,k), 0._r8)
    3480   247520448 :          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      176472 :    if (qrain_idx > 0)  qrout_grid_ptr = qrout_grid
    3486      176472 :    if (qsnow_idx > 0)  qsout_grid_ptr = qsout_grid
    3487      176472 :    if (nrain_idx > 0)  nrout_grid_ptr = nrout_grid
    3488      176472 :    if (nsnow_idx > 0)  nsout_grid_ptr = nsout_grid
    3489      176472 :    if (qcsedten_idx > 0) qcsedtenout_grid_ptr = qcsedtenout_grid
    3490      176472 :    if (qrsedten_idx > 0) qrsedtenout_grid_ptr = qrsedtenout_grid
    3491      176472 :    if (qisedten_idx > 0) qisedtenout_grid_ptr = qisedtenout_grid
    3492      176472 :    if (qssedten_idx > 0) qssedtenout_grid_ptr = qssedtenout_grid
    3493      176472 :    if (vtrmc_idx > 0)    vtrmcout_grid_ptr    = vtrmcout_grid
    3494      176472 :    if (umr_idx > 0)      umrout_grid_ptr      = umrout_grid
    3495      176472 :    if (vtrmi_idx > 0)    vtrmiout_grid_ptr    = vtrmiout_grid
    3496      176472 :    if (ums_idx > 0)      umsout_grid_ptr      = umsout_grid
    3497      176472 :    if (qcsevap_idx > 0 ) qcsevapout_grid_ptr  = qcsevapout_grid
    3498      176472 :    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      176472 :    ftem_grid = 0._r8
    3507             : 
    3508   247696920 :    ftem_grid(:ngrdcol,top_lev:pver) =  qcreso_grid(:ngrdcol,top_lev:pver)
    3509      176472 :    call outfld( 'MPDW2V', ftem_grid, pcols, lchnk)
    3510             : 
    3511      176472 :    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   247873392 :         - msacwio_grid(:ngrdcol,top_lev:pver)
    3514      176472 :    call outfld( 'MPDW2I', ftem_grid, pcols, lchnk)
    3515             : 
    3516      176472 :    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   247696920 :           - 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      176472 :    call outfld( 'MPDW2P', ftem_grid, pcols, lchnk)
    3526             : 
    3527   247696920 :    ftem_grid(:ngrdcol,top_lev:pver) =  cmeiout_grid(:ngrdcol,top_lev:pver) + qireso_grid(:ngrdcol,top_lev:pver)
    3528      176472 :    call outfld( 'MPDI2V', ftem_grid, pcols, lchnk)
    3529             : 
    3530      176472 :    if (micro_mg_version > 2) then
    3531      176472 :       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   247873392 :           - 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      176472 :    call outfld( 'MPDI2W', ftem_grid, pcols, lchnk)
    3542             : 
    3543   247696920 :    ftem_grid(:ngrdcol,top_lev:pver) = -prcio_grid(:ngrdcol,top_lev:pver) - praio_grid(:ngrdcol,top_lev:pver)
    3544      176472 :    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      176472 :    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      176472 :    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      176472 :    if (trim(micro_mg_warm_rain) == 'kk2000') then
    3587      176472 :       call outfld('qctend_KK2000',  proc_rates%qctend_KK2000,  ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3588      176472 :       call outfld('nctend_KK2000',  proc_rates%nctend_KK2000,  ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3589      176472 :       call outfld('qrtend_KK2000',  proc_rates%qrtend_KK2000,  ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3590      176472 :       call outfld('nrtend_KK2000',  proc_rates%nrtend_KK2000,  ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3591             :    end if
    3592      176472 :    call outfld('LAMC',  proc_rates%lamc_out,  ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3593      176472 :    call outfld('LAMR',  proc_rates%lamr_out,  ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3594      176472 :    call outfld('PGAM',  proc_rates%pgam_out,  ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3595      176472 :    call outfld('N0R',  proc_rates%n0r_out,  ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3596             : 
    3597      176472 :    call outfld('MPICLWPI',    iclwpi,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3598      176472 :    call outfld('MPICIWPI',    iciwpi,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3599      176472 :    call outfld('REFL',        refl,        psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3600      176472 :    call outfld('AREFL',       arefl,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3601      176472 :    call outfld('AREFLZ',      areflz,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3602      176472 :    call outfld('FREFL',       frefl,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3603      176472 :    call outfld('CSRFL',       csrfl,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3604      176472 :    call outfld('ACSRFL',      acsrfl,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3605      176472 :    call outfld('FCSRFL',      fcsrfl,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3606      176472 :    call outfld('REFL10CM',    refl10cm,    psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3607      176472 :    call outfld('REFLZ10CM',   reflz10cm,   psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3608      176472 :    call outfld('RERCLD',      rercld,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3609      176472 :    call outfld('NCAL',        ncal,        psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3610      176472 :    call outfld('NCAI',        ncai,        psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3611      176472 :    call outfld('AQRAIN',      qrout2,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3612      176472 :    call outfld('AQSNOW',      qsout2,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3613      176472 :    call outfld('ANRAIN',      nrout2,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3614      176472 :    call outfld('ANSNOW',      nsout2,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3615      176472 :    call outfld('FREQR',       freqr,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3616      176472 :    call outfld('FREQS',       freqs,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3617      176472 :    call outfld('MPDT',        tlat,        psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3618      176472 :    call outfld('MPDQ',        qvlat,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3619      176472 :    call outfld('MPDLIQ',      qcten,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3620      176472 :    call outfld('MPDICE',      qiten,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3621      176472 :    call outfld('MPDNLIQ',     ncten,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3622      176472 :    call outfld('MPDNICE',     niten,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3623      176472 :    call outfld('EVAPSNOW',    proc_rates%evapsnow,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3624      176472 :    call outfld('QCSEVAP',     proc_rates%qcsevap,     ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3625      176472 :    call outfld('QISEVAP',     proc_rates%qisevap,     ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3626      176472 :    call outfld('QVRES',       proc_rates%qvres,       ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3627      176472 :    call outfld('VTRMC',       proc_rates%vtrmc,       ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3628      176472 :    call outfld('VTRMI',       proc_rates%vtrmi,       ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3629      176472 :    call outfld('QCSEDTEN',    proc_rates%qcsedten,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3630      176472 :    call outfld('QISEDTEN',    proc_rates%qisedten,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3631      176472 :    call outfld('QRSEDTEN',    proc_rates%qrsedten,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3632      176472 :    call outfld('QSSEDTEN',    proc_rates%qssedten,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3633      176472 :    call outfld('MNUCCRIO',    proc_rates%mnuccritot,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3634      176472 :    call outfld('MNUDEPO',     proc_rates%mnudeptot,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3635      176472 :    call outfld('MELTSTOT',    proc_rates%meltstot,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3636      176472 :    call outfld('MNUCCDO',     proc_rates%mnuccdtot,     ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3637      176472 :    call outfld('MNUCCDOhet',  mnuccdohet,  psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3638      176472 :    call outfld('MNUCCRO',     proc_rates%mnuccrtot,     ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3639      176472 :    call outfld('PRACSO',      proc_rates%pracstot ,     ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3640      176472 :    call outfld('VAPDEPSO',    proc_rates%vapdepstot,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3641      176472 :    call outfld('MELTSDT',     proc_rates%meltsdttot,     ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3642      176472 :    call outfld('FRZRDT',      proc_rates%frzrdttot ,     ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3643      176472 :    call outfld('FICE',        nfice,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3644      176472 :    call outfld('CLDFSNOW',    cldfsnow,    psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3645      176472 :    call outfld ('NNUCCCO',  proc_rates%nnuccctot  , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3646      176472 :    call outfld ('NNUCCTO',  proc_rates%nnuccttot  , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3647      176472 :    call outfld ('NNUCCDO',  proc_rates%nnuccdtot  , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3648      176472 :    call outfld ('NNUDEPO',  proc_rates%nnudeptot  , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3649      176472 :    call outfld ('NHOMO',    proc_rates%nhomotot   , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3650      176472 :    call outfld ('NNUCCRO',  proc_rates%nnuccrtot  , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3651      176472 :    call outfld ('NNUCCRIO', proc_rates%nnuccritot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3652      176472 :    call outfld ('NSACWIO',  proc_rates%nsacwitot  , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3653      176472 :    call outfld ('NPRAO',    proc_rates%npratot    , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3654      176472 :    call outfld ('NPSACWSO', proc_rates%npsacwstot , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3655      176472 :    call outfld ('NPRAIO',   proc_rates%npraitot   , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3656      176472 :    call outfld ('NPRACSO',  proc_rates%npracstot  , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3657      176472 :    call outfld ('NPRCO',    proc_rates%nprctot    , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3658      176472 :    call outfld ('NPRCIO',   proc_rates%nprcitot   , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3659      176472 :    call outfld ('NCSEDTEN', proc_rates%ncsedten , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3660      176472 :    call outfld ('NISEDTEN', proc_rates%nisedten , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3661      176472 :    call outfld ('NRSEDTEN', proc_rates%nrsedten , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3662      176472 :    call outfld ('NSSEDTEN', proc_rates%nssedten , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3663      176472 :    call outfld ('NMELTO',   proc_rates%nmelttot   , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3664      176472 :    call outfld ('NMELTS',   proc_rates%nmeltstot  , ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3665             : 
    3666      176472 :    call outfld('UMR',      proc_rates%umr,         ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3667      176472 :    call outfld('UMS',      proc_rates%ums,         ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3668             : 
    3669      176472 :    call outfld('QCRAT',    qcrat,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3670             : 
    3671      176472 :    if (micro_mg_version > 2) then
    3672      176472 :       call outfld('UMG',        proc_rates%umg,         ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3673      176472 :       call outfld('QGSEDTEN',   proc_rates%qgsedten,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3674      176472 :       call outfld('FREQG',       freqg,       psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3675      176472 :       call outfld('AQGRAU',      qgout2,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3676      176472 :       call outfld('ANGRAU',      ngout2,      psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3677      176472 :       call outfld('CLDFGRAU',    cldfgrau,    psetcols, lchnk, avg_subcol_field=use_subcol_microp)
    3678      176472 :       call outfld('MELTGTOT',    proc_rates%meltgtot,    ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3679      176472 :       call outfld('NMELTG',      proc_rates%nmeltgtot,     ncol, lchnk, avg_subcol_field=use_subcol_microp)
    3680      176472 :       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      176472 :    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      176472 :    call outfld('QRAIN',       qrout_grid,       pcols, lchnk)
    3693      176472 :    call outfld('QSNOW',       qsout_grid,       pcols, lchnk)
    3694      176472 :    call outfld('NRAIN',       nrout_grid,       pcols, lchnk)
    3695      176472 :    call outfld('NSNOW',       nsout_grid,       pcols, lchnk)
    3696      176472 :    call outfld('CV_REFFLIQ',  cvreffliq_grid,   pcols, lchnk)
    3697      176472 :    call outfld('CV_REFFICE',  cvreffice_grid,   pcols, lchnk)
    3698      176472 :    call outfld('LS_FLXPRC',   mgflxprc_grid,    pcols, lchnk)
    3699      176472 :    call outfld('LS_FLXSNW',   mgflxsnw_grid,    pcols, lchnk)
    3700      176472 :    call outfld('CME',         qme_grid,         pcols, lchnk)
    3701      176472 :    call outfld('PRODPREC',    prain_grid,       pcols, lchnk)
    3702      176472 :    call outfld('EVAPPREC',    nevapr_grid,      pcols, lchnk)
    3703      176472 :    call outfld('QCRESO',      qcreso_grid,      pcols, lchnk)
    3704      176472 :    call outfld('LS_REFFRAIN', mgreffrain_grid,  pcols, lchnk)
    3705      176472 :    call outfld('LS_REFFSNOW', mgreffsnow_grid,  pcols, lchnk)
    3706      176472 :    call outfld('DSNOW',       des_grid,         pcols, lchnk)
    3707      176472 :    call outfld('ADRAIN',      drout2_grid,      pcols, lchnk)
    3708      176472 :    call outfld('ADSNOW',      dsout2_grid,      pcols, lchnk)
    3709      176472 :    call outfld('PE',          pe_grid,          pcols, lchnk)
    3710      176472 :    call outfld('PEFRAC',      pefrac_grid,      pcols, lchnk)
    3711      176472 :    call outfld('APRL',        tpr_grid,         pcols, lchnk)
    3712      176472 :    call outfld('VPRAO',       vprao_grid,       pcols, lchnk)
    3713      176472 :    call outfld('VPRCO',       vprco_grid,       pcols, lchnk)
    3714      176472 :    call outfld('RACAU',       racau_grid,       pcols, lchnk)
    3715      176472 :    call outfld('AREL',        efcout_grid,      pcols, lchnk)
    3716      176472 :    call outfld('AREI',        efiout_grid,      pcols, lchnk)
    3717      176472 :    call outfld('AWNC' ,       ncout_grid,       pcols, lchnk)
    3718      176472 :    call outfld('AWNI' ,       niout_grid,       pcols, lchnk)
    3719      176472 :    call outfld('FREQL',       freql_grid,       pcols, lchnk)
    3720      176472 :    call outfld('FREQI',       freqi_grid,       pcols, lchnk)
    3721      176472 :    call outfld('ACTREL',      ctrel_grid,       pcols, lchnk)
    3722      176472 :    call outfld('ACTREI',      ctrei_grid,       pcols, lchnk)
    3723      176472 :    call outfld('ACTNL',       ctnl_grid,        pcols, lchnk)
    3724      176472 :    call outfld('ACTNI',       ctni_grid,        pcols, lchnk)
    3725      176472 :    call outfld('FCTL',        fctl_grid,        pcols, lchnk)
    3726      176472 :    call outfld('FCTI',        fcti_grid,        pcols, lchnk)
    3727      176472 :    call outfld('ICINC',       icinc_grid,       pcols, lchnk)
    3728      176472 :    call outfld('ICWNC',       icwnc_grid,       pcols, lchnk)
    3729      176472 :    call outfld('EFFLIQ_IND',  rel_fn_grid,      pcols, lchnk)
    3730      176472 :    call outfld('CDNUMC',      cdnumc_grid,      pcols, lchnk)
    3731      176472 :    call outfld('REL',         rel_grid,         pcols, lchnk)
    3732      176472 :    call outfld('REI',         rei_grid,         pcols, lchnk)
    3733      176472 :    call outfld('MG_SADICE',   sadice_grid,      pcols, lchnk)
    3734      176472 :    call outfld('MG_SADSNOW',  sadsnow_grid,     pcols, lchnk)
    3735      176472 :    call outfld('ICIMRST',     icimrst_grid_out, pcols, lchnk)
    3736      176472 :    call outfld('ICWMRST',     icwmrst_grid_out, pcols, lchnk)
    3737      176472 :    call outfld('CMEIOUT',     cmeiout_grid,     pcols, lchnk)
    3738      176472 :    call outfld('PRAO',        prao_grid,        pcols, lchnk)
    3739      176472 :    call outfld('PRCO',        prco_grid,        pcols, lchnk)
    3740      176472 :    call outfld('MNUCCCO',     mnuccco_grid,     pcols, lchnk)
    3741      176472 :    call outfld('MNUCCTO',     mnuccto_grid,     pcols, lchnk)
    3742      176472 :    call outfld('MSACWIO',     msacwio_grid,     pcols, lchnk)
    3743      176472 :    call outfld('PSACWSO',     psacwso_grid,     pcols, lchnk)
    3744      176472 :    call outfld('BERGSO',      bergso_grid,      pcols, lchnk)
    3745      176472 :    call outfld('BERGO',       bergo_grid,       pcols, lchnk)
    3746      176472 :    call outfld('MELTO',       melto_grid,       pcols, lchnk)
    3747      176472 :    call outfld('HOMOO',       homoo_grid,       pcols, lchnk)
    3748      176472 :    call outfld('PRCIO',       prcio_grid,       pcols, lchnk)
    3749      176472 :    call outfld('PRAIO',       praio_grid,       pcols, lchnk)
    3750      176472 :    call outfld('QIRESO',      qireso_grid,      pcols, lchnk)
    3751      176472 :    call outfld('FREQM',       freqm_grid,       pcols, lchnk)
    3752      176472 :    call outfld('FREQSL',      freqsl_grid,      pcols, lchnk)
    3753      176472 :    call outfld('FREQSLM',     freqslm_grid,     pcols, lchnk)
    3754      176472 :    call outfld('FCTM',        fctm_grid,        pcols, lchnk)
    3755      176472 :    call outfld('FCTSL',       fctsl_grid,       pcols, lchnk)
    3756      176472 :    call outfld('FCTSLM',      fctslm_grid,      pcols, lchnk)
    3757             : 
    3758      176472 :    if (micro_mg_version > 2) then
    3759      176472 :       call outfld('PRACGO',      pracgo_grid,      pcols, lchnk)
    3760      176472 :       call outfld('PSACRO',      psacro_grid,      pcols, lchnk)
    3761      176472 :       call outfld('PSACWGO',     psacwgo_grid,     pcols, lchnk)
    3762      176472 :       call outfld('PGSACWO',     pgsacwo_grid,     pcols, lchnk)
    3763      176472 :       call outfld('PGRACSO',     pgracso_grid,     pcols, lchnk)
    3764      176472 :       call outfld('PRDGO',       prdgo_grid,       pcols, lchnk)
    3765      176472 :       call outfld('QMULTGO',     qmultgo_grid,     pcols, lchnk)
    3766      176472 :       call outfld('QMULTRGO',    qmultrgo_grid,    pcols, lchnk)
    3767      176472 :       call outfld('LS_REFFGRAU', reff_grau_grid,  pcols, lchnk)
    3768      176472 :       call outfld ('NPRACGO',    npracgo_grid,  pcols, lchnk)
    3769      176472 :       call outfld ('NSCNGO',     nscngo_grid,  pcols, lchnk)
    3770      176472 :       call outfld ('NGRACSO',    ngracso_grid,  pcols, lchnk)
    3771      176472 :       call outfld ('NMULTGO',    nmultgo_grid,  pcols, lchnk)
    3772      176472 :       call outfld ('NMULTRGO',   nmultrgo_grid,  pcols, lchnk)
    3773      176472 :       call outfld ('NPSACWGO',   npsacwgo_grid,  pcols, lchnk)
    3774             :    end if
    3775             : 
    3776      176472 :    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      176472 :    if (.not. use_subcol_microp) then
    3793      176472 :       deallocate(bergso_grid)
    3794             :    end if
    3795             : 
    3796             :    ! deallocate the proc_rates DDT
    3797      176472 :    call proc_rates%deallocate(micro_mg_warm_rain)
    3798             : 
    3799             :    ! ptend_loc is deallocated in physics_update above
    3800      176472 :    call physics_state_dealloc(state_loc)
    3801             : 
    3802      176472 :    if (qsatfac_idx <= 0) then
    3803           0 :       deallocate(qsatfac)
    3804             :    end if
    3805             : 
    3806      529416 : 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      176472 :      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

Generated by: LCOV version 1.14