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

Generated by: LCOV version 1.14