LCOV - code coverage report
Current view: top level - physics/cam - phys_control.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 123 157 78.3 %
Date: 2025-01-13 21:54:50 Functions: 6 8 75.0 %

          Line data    Source code
       1             : module phys_control
       2             : !-----------------------------------------------------------------------
       3             : ! Purpose:
       4             : !
       5             : ! Provides a control interface to CAM physics packages
       6             : !
       7             : ! Revision history:
       8             : ! 2006-05-01  D. B. Coleman,  Creation of module
       9             : ! 2009-02-13  Eaton           Replace *_{default,set}opts methods with module namelist.
      10             : !                             Add vars to indicate physics version and chemistry type.
      11             : !-----------------------------------------------------------------------
      12             : 
      13             : use spmd_utils,     only: masterproc
      14             : use cam_logfile,    only: iulog
      15             : use cam_abortutils, only: endrun
      16             : use shr_kind_mod,   only: r8 => shr_kind_r8, cl=>shr_kind_cl
      17             : 
      18             : implicit none
      19             : private
      20             : save
      21             : 
      22             : public :: &
      23             :    phys_ctl_readnl,   &! read namelist from file
      24             :    phys_getopts,      &! generic query method
      25             :    phys_setopts,      &! generic set method
      26             :    phys_deepconv_pbl, &! return true if deep convection is allowed in the PBL
      27             :    phys_do_flux_avg,  &! return true to average surface fluxes
      28             :    cam_physpkg_is,    &! query for the name of the physics package
      29             :    cam_chempkg_is,    &! query for the name of the chemistry package
      30             :    waccmx_is
      31             : 
      32             : ! Private module data
      33             : 
      34             : character(len=16), parameter :: unset_str = 'UNSET'
      35             : integer,           parameter :: unset_int = huge(1)
      36             : 
      37             : ! Namelist variables:
      38             : character(len=16) :: cam_physpkg          = unset_str  ! CAM physics package
      39             : character(len=32) :: cam_chempkg          = unset_str  ! CAM chemistry package
      40             : character(len=16) :: waccmx_opt           = unset_str  ! WACCMX run option [ionosphere | neutral | off
      41             : character(len=16) :: deep_scheme          = unset_str  ! deep convection package
      42             : character(len=16) :: shallow_scheme       = unset_str  ! shallow convection package
      43             : character(len=16) :: eddy_scheme          = unset_str  ! vertical diffusion package
      44             : character(len=16) :: microp_scheme        = unset_str  ! microphysics package
      45             : character(len=16) :: macrop_scheme        = unset_str  ! macrophysics package
      46             : character(len=16) :: radiation_scheme     = unset_str  ! radiation package
      47             : character(len=cl) :: cam_physics_mesh     = unset_str  ! SCRIP file for phys
      48             : integer           :: srf_flux_avg         = unset_int  ! 1 => smooth surface fluxes, 0 otherwise
      49             : 
      50             : logical           :: use_subcol_microp    = .false.    ! if .true. then use sub-columns in microphysics
      51             : 
      52             : logical           :: atm_dep_flux         = .true.     ! true => deposition fluxes will be provided
      53             :                                                        ! to the coupler
      54             : logical           :: history_amwg         = .true.     ! output the variables used by the AMWG diag package
      55             : logical           :: history_vdiag        = .false.    ! output the variables used by the AMWG variability diag package
      56             : logical           :: history_aerosol      = .false.    ! output the MAM aerosol variables and tendencies
      57             : logical           :: history_aero_optics  = .false.    ! output the aerosol
      58             : logical           :: history_eddy         = .false.    ! output the eddy variables
      59             : logical           :: history_budget       = .false.    ! output tendencies and state variables for T, water vapor,
      60             :                                                        ! cloud ice and cloud liquid budgets
      61             : logical           :: convproc_do_aer      = .false.    ! switch for new convective scavenging treatment for modal aerosols
      62             : 
      63             : integer           :: history_budget_histfile_num = 1   ! output history file number for budget fields
      64             : logical           :: history_waccm        = .false.    ! output variables of interest for WACCM runs
      65             : logical           :: history_waccmx       = .false.    ! output variables of interest for WACCM-X runs
      66             : logical           :: history_chemistry    = .true.     ! output default chemistry-related variables
      67             : logical           :: history_carma        = .false.    ! output default CARMA-related variables
      68             : logical           :: history_clubb        = .true.     ! output default CLUBB-related variables
      69             : logical           :: history_cesm_forcing = .false.
      70             : logical           :: history_dust         = .false.
      71             : logical           :: history_scwaccm_forcing = .false.
      72             : logical           :: history_chemspecies_srf = .false.
      73             : 
      74             : logical           :: do_clubb_sgs
      75             : logical           :: do_hb_above_clubb       = .false. ! enable HB vertical mixing above clubb top
      76             : 
      77             : ! Check validity of physics_state objects in physics_update.
      78             : logical           :: state_debug_checks   = .false.
      79             : 
      80             : ! Macro/micro-physics co-substeps
      81             : integer           :: cld_macmic_num_steps = 1
      82             : 
      83             : logical           :: offline_driver       = .false.    ! true => offline driver is being used
      84             : 
      85             : 
      86             : logical, public, protected :: use_simple_phys = .false. ! true => simple physics configuration
      87             : 
      88             : logical :: use_spcam       ! true => use super parameterized CAM
      89             : 
      90             : logical :: prog_modal_aero ! determines whether prognostic modal aerosols are present in the run.
      91             : 
      92             : ! Option to use heterogeneous freezing
      93             : logical, public, protected :: use_hetfrz_classnuc = .false.
      94             : 
      95             : ! Which gravity wave sources are used?
      96             : logical, public, protected :: use_gw_oro = .true.         ! Orography.
      97             : logical, public, protected :: use_gw_front = .false.      ! Frontogenesis.
      98             : logical, public, protected :: use_gw_front_igw = .false.  ! Frontogenesis to inertial spectrum.
      99             : logical, public, protected :: use_gw_convect_dp = .false. ! Deep convection.
     100             : logical, public, protected :: use_gw_convect_sh = .false. ! Shallow convection.
     101             : logical, public, protected :: use_gw_movmtn_pbl = .false. ! moving mountain
     102             : 
     103             : ! FV dycore angular momentum correction
     104             : logical, public, protected :: fv_am_correction = .false.
     105             : 
     106             : ! Option for Harmonized Emissions Component (HEMCO)
     107             : logical, public, protected :: use_hemco = .false.
     108             : 
     109             : ! CAM snapshot before/after file numbers and control
     110             : character(len=32) :: cam_take_snapshot_before = ''  ! Physics routine to take a snopshot "before"
     111             : character(len=32) :: cam_take_snapshot_after = ''   ! Physics routine to take a snopshot "after"
     112             : integer           :: cam_snapshot_before_num = -1   ! output history file number for CAM "before" snapshot
     113             : integer           :: cam_snapshot_after_num = -1    ! output history file number for CAM "after" snapshot
     114             : 
     115             : !=======================================================================
     116             : contains
     117             : !=======================================================================
     118             : 
     119        1536 : subroutine phys_ctl_readnl(nlfile)
     120             : 
     121             :    use namelist_utils,  only: find_group_name
     122             :    use units,           only: getunit, freeunit
     123             :    use spmd_utils,      only: mpi_character, mpi_integer, mpi_logical, masterprocid, mpicom
     124             :    use cam_control_mod, only: cam_ctrl_set_physics_type
     125             : 
     126             :    character(len=*), intent(in) :: nlfile  ! filepath for file containing namelist input
     127             : 
     128             :    ! Local variables
     129             :    integer :: unitn, ierr
     130             :    character(len=*), parameter :: subname = 'phys_ctl_readnl'
     131             : 
     132             :    namelist /phys_ctl_nl/ cam_physpkg, use_simple_phys, cam_chempkg, waccmx_opt,  &
     133             :       deep_scheme, shallow_scheme, &
     134             :       eddy_scheme, microp_scheme,  macrop_scheme, radiation_scheme, srf_flux_avg, &
     135             :       use_subcol_microp, atm_dep_flux, history_amwg, history_vdiag, history_aerosol, history_aero_optics, &
     136             :       history_eddy, history_budget,  history_budget_histfile_num, history_waccm, &
     137             :       history_waccmx, history_chemistry, history_carma, history_clubb, history_dust, &
     138             :       history_cesm_forcing, history_scwaccm_forcing, history_chemspecies_srf, &
     139             :       do_clubb_sgs, state_debug_checks, use_hetfrz_classnuc, use_gw_oro, use_gw_front, &
     140             :       use_gw_front_igw, use_gw_convect_dp, use_gw_convect_sh, use_gw_movmtn_pbl, cld_macmic_num_steps, &
     141             :       offline_driver, convproc_do_aer, cam_snapshot_before_num, cam_snapshot_after_num, &
     142             :       cam_take_snapshot_before, cam_take_snapshot_after, cam_physics_mesh, use_hemco, do_hb_above_clubb
     143             :    !-----------------------------------------------------------------------------
     144             : 
     145        1536 :    if (masterproc) then
     146           2 :       unitn = getunit()
     147           2 :       open( unitn, file=trim(nlfile), status='old' )
     148           2 :       call find_group_name(unitn, 'phys_ctl_nl', status=ierr)
     149           2 :       if (ierr == 0) then
     150           2 :          read(unitn, phys_ctl_nl, iostat=ierr)
     151           2 :          if (ierr /= 0) then
     152           0 :             call endrun(subname // ':: ERROR reading namelist')
     153             :          end if
     154             :       end if
     155           2 :       close(unitn)
     156           2 :       call freeunit(unitn)
     157             :    end if
     158             : 
     159             :    ! Broadcast namelist variables
     160        1536 :    call mpi_bcast(deep_scheme,                 len(deep_scheme),      mpi_character, masterprocid, mpicom, ierr)
     161        1536 :    call mpi_bcast(cam_physpkg,                 len(cam_physpkg),      mpi_character, masterprocid, mpicom, ierr)
     162        1536 :    call mpi_bcast(use_simple_phys,             1,                     mpi_logical,   masterprocid, mpicom, ierr)
     163        1536 :    call mpi_bcast(cam_chempkg,                 len(cam_chempkg),      mpi_character, masterprocid, mpicom, ierr)
     164        1536 :    call mpi_bcast(waccmx_opt,                  len(waccmx_opt),       mpi_character, masterprocid, mpicom, ierr)
     165        1536 :    call mpi_bcast(shallow_scheme,              len(shallow_scheme),   mpi_character, masterprocid, mpicom, ierr)
     166        1536 :    call mpi_bcast(eddy_scheme,                 len(eddy_scheme),      mpi_character, masterprocid, mpicom, ierr)
     167        1536 :    call mpi_bcast(microp_scheme,               len(microp_scheme),    mpi_character, masterprocid, mpicom, ierr)
     168        1536 :    call mpi_bcast(radiation_scheme,            len(radiation_scheme), mpi_character, masterprocid, mpicom, ierr)
     169        1536 :    call mpi_bcast(macrop_scheme,               len(macrop_scheme),    mpi_character, masterprocid, mpicom, ierr)
     170        1536 :    call mpi_bcast(srf_flux_avg,                1,                     mpi_integer,   masterprocid, mpicom, ierr)
     171        1536 :    call mpi_bcast(use_subcol_microp,           1,                     mpi_logical,   masterprocid, mpicom, ierr)
     172        1536 :    call mpi_bcast(atm_dep_flux,                1,                     mpi_logical,   masterprocid, mpicom, ierr)
     173        1536 :    call mpi_bcast(history_amwg,                1,                     mpi_logical,   masterprocid, mpicom, ierr)
     174        1536 :    call mpi_bcast(history_vdiag,               1,                     mpi_logical,   masterprocid, mpicom, ierr)
     175        1536 :    call mpi_bcast(history_eddy,                1,                     mpi_logical,   masterprocid, mpicom, ierr)
     176        1536 :    call mpi_bcast(history_aerosol,             1,                     mpi_logical,   masterprocid, mpicom, ierr)
     177        1536 :    call mpi_bcast(history_aero_optics,         1,                     mpi_logical,   masterprocid, mpicom, ierr)
     178        1536 :    call mpi_bcast(history_budget,              1,                     mpi_logical,   masterprocid, mpicom, ierr)
     179        1536 :    call mpi_bcast(history_budget_histfile_num, 1,                     mpi_integer,   masterprocid, mpicom, ierr)
     180        1536 :    call mpi_bcast(history_waccm,               1,                     mpi_logical,   masterprocid, mpicom, ierr)
     181        1536 :    call mpi_bcast(history_waccmx,              1,                     mpi_logical,   masterprocid, mpicom, ierr)
     182        1536 :    call mpi_bcast(history_chemistry,           1,                     mpi_logical,   masterprocid, mpicom, ierr)
     183        1536 :    call mpi_bcast(history_carma,               1,                     mpi_logical,   masterprocid, mpicom, ierr)
     184        1536 :    call mpi_bcast(history_clubb,               1,                     mpi_logical,   masterprocid, mpicom, ierr)
     185        1536 :    call mpi_bcast(history_cesm_forcing,        1,                     mpi_logical,   masterprocid, mpicom, ierr)
     186        1536 :    call mpi_bcast(history_chemspecies_srf,     1,                     mpi_logical,   masterprocid, mpicom, ierr)
     187        1536 :    call mpi_bcast(history_dust,                1,                     mpi_logical,   masterprocid, mpicom, ierr)
     188        1536 :    call mpi_bcast(history_scwaccm_forcing,     1,                     mpi_logical,   masterprocid, mpicom, ierr)
     189        1536 :    call mpi_bcast(do_clubb_sgs,                1,                     mpi_logical,   masterprocid, mpicom, ierr)
     190        1536 :    call mpi_bcast(state_debug_checks,          1,                     mpi_logical,   masterprocid, mpicom, ierr)
     191        1536 :    call mpi_bcast(use_hetfrz_classnuc,         1,                     mpi_logical,   masterprocid, mpicom, ierr)
     192        1536 :    call mpi_bcast(use_gw_oro,                  1,                     mpi_logical,   masterprocid, mpicom, ierr)
     193        1536 :    call mpi_bcast(use_gw_front,                1,                     mpi_logical,   masterprocid, mpicom, ierr)
     194        1536 :    call mpi_bcast(use_gw_front_igw,            1,                     mpi_logical,   masterprocid, mpicom, ierr)
     195        1536 :    call mpi_bcast(use_gw_convect_dp,           1,                     mpi_logical,   masterprocid, mpicom, ierr)
     196        1536 :    call mpi_bcast(use_gw_convect_sh,           1,                     mpi_logical,   masterprocid, mpicom, ierr)
     197        1536 :    call mpi_bcast(use_gw_movmtn_pbl,           1,                     mpi_logical,   masterprocid, mpicom, ierr)
     198        1536 :    call mpi_bcast(cld_macmic_num_steps,        1,                     mpi_integer,   masterprocid, mpicom, ierr)
     199        1536 :    call mpi_bcast(offline_driver,              1,                     mpi_logical,   masterprocid, mpicom, ierr)
     200        1536 :    call mpi_bcast(convproc_do_aer,             1,                     mpi_logical,   masterprocid, mpicom, ierr)
     201        1536 :    call mpi_bcast(cam_snapshot_before_num,     1,                     mpi_integer,   masterprocid, mpicom, ierr)
     202        1536 :    call mpi_bcast(cam_snapshot_after_num,      1,                     mpi_integer,   masterprocid, mpicom, ierr)
     203        1536 :    call mpi_bcast(cam_take_snapshot_before,    len(cam_take_snapshot_before), mpi_character, masterprocid, mpicom, ierr)
     204        1536 :    call mpi_bcast(cam_take_snapshot_after,     len(cam_take_snapshot_after),  mpi_character, masterprocid, mpicom, ierr)
     205        1536 :    call mpi_bcast(cam_physics_mesh,            len(cam_physics_mesh), mpi_character, masterprocid, mpicom, ierr)
     206        1536 :    call mpi_bcast(do_hb_above_clubb,           1,                     mpi_logical,   masterprocid, mpicom, ierr)
     207        1536 :    call mpi_bcast(use_hemco,                   1,                     mpi_logical,   masterprocid, mpicom, ierr)
     208             : 
     209             :    use_spcam       = (     cam_physpkg_is('spcam_sam1mom') &
     210        1536 :                       .or. cam_physpkg_is('spcam_m2005'))
     211             : 
     212        1536 :    call cam_ctrl_set_physics_type(cam_physpkg)
     213             : 
     214             :    ! Error checking:
     215             : 
     216             :    ! Check compatibility of eddy & shallow schemes
     217        1536 :    if (( shallow_scheme .eq. 'UW' ) .and. ( eddy_scheme .ne. 'diag_TKE' )) then
     218           0 :       write(iulog,*)'Do you really want to run UW shallow scheme without diagnostic TKE eddy scheme? Quiting'
     219           0 :       call endrun('shallow convection and eddy scheme may be incompatible')
     220             :    endif
     221             : 
     222        1536 :    if (( shallow_scheme .eq. 'Hack' ) .and. ( ( eddy_scheme .ne. 'HB' ) .and. ( eddy_scheme .ne. 'HBR' ))) then
     223           0 :       write(iulog,*)'Do you really want to run Hack shallow scheme with a non-standard eddy scheme? Quiting.'
     224           0 :       call endrun('shallow convection and eddy scheme may be incompatible')
     225             :    endif
     226             : 
     227             :    ! Check compatibility of PBL and Microphysics schemes
     228        1536 :    if (( eddy_scheme .eq. 'diag_TKE' ) .and. ( microp_scheme .eq. 'RK' )) then
     229           0 :       write(iulog,*)'UW PBL is not compatible with RK microphysics.  Quiting'
     230           0 :       call endrun('PBL and Microphysics schemes incompatible')
     231             :    endif
     232             : 
     233             :    ! Add a check to make sure CLUBB and MG are used together
     234        1536 :    if ( do_clubb_sgs .and. ( microp_scheme .ne. 'MG') .and. .not. use_spcam) then
     235           0 :       write(iulog,*)'CLUBB is only compatible with MG microphysics.  Quiting'
     236           0 :       call endrun('CLUBB and microphysics schemes incompatible')
     237             :    endif
     238             : 
     239             :    ! Check that eddy_scheme, macrop_scheme, shallow_scheme are all set to CLUBB_SGS if do_clubb_sgs is true
     240        1536 :    if (do_clubb_sgs .and. .not. use_spcam) then
     241           0 :       if (eddy_scheme .ne. 'CLUBB_SGS' .or. macrop_scheme .ne. 'CLUBB_SGS' .or. shallow_scheme .ne. 'CLUBB_SGS') then
     242           0 :          write(iulog,*)'eddy_scheme, macrop_scheme and shallow_scheme must all be CLUBB_SGS.  Quiting'
     243           0 :          call endrun('CLUBB and eddy, macrop or shallow schemes incompatible')
     244             :       endif
     245             :    endif
     246             : 
     247        1536 :    if (cam_physpkg_is("cam7")) then
     248             :       ! Check that eddy_scheme, macrop_scheme, shallow_scheme are all set to CLUBB
     249           0 :       if (eddy_scheme /= 'CLUBB_SGS' .or. macrop_scheme /= 'CLUBB_SGS' .or. shallow_scheme /= 'CLUBB_SGS') then
     250           0 :          write(iulog,*) 'cam7 is only compatible with CLUBB.  Quitting'
     251           0 :          call endrun('cam7 is only compatible with eddy, macrop, and shallow schemes = CLUBB_SGS')
     252             :       end if
     253             :       ! Add a check to make sure SPCAM is not used
     254           0 :       if (use_spcam) then
     255           0 :          write(iulog,*)'SPCAM not compatible with cam7 physics.  Quitting'
     256           0 :          call endrun('SPCAM and cam7 incompatible')
     257             :       end if
     258             :       ! Add check to make sure we are not trying to use `camrt`
     259           0 :       if (trim(radiation_scheme) == 'camrt') then
     260           0 :          write(iulog,*) ' camrt specified and it is not compatible with cam7'
     261           0 :          call endrun('cam7 is not compatible with camrt radiation scheme')
     262             :       end if
     263             :    end if
     264             : 
     265             :    ! do_hb_above_clubb requires that CLUBB is being used
     266        1536 :    if (do_hb_above_clubb .and. .not. do_clubb_sgs) then
     267           0 :       write(iulog,*)'do_hb_above_clubb requires CLUBB to be active'
     268           0 :       call endrun('do_hb_above_clubb incompatible with do_clubb_sgs = .false.')
     269             :    endif
     270             : 
     271             :    ! Macro/micro co-substepping support.
     272        1536 :    if (cld_macmic_num_steps > 1) then
     273           0 :       if (microp_scheme /= "MG" .or. (macrop_scheme /= "park" .and. macrop_scheme /= "CLUBB_SGS")) then
     274             :          call endrun ("Setting cld_macmic_num_steps > 1 is only &
     275           0 :               &supported with Park or CLUBB macrophysics and MG microphysics.")
     276             :       end if
     277             :    end if
     278             : 
     279             :    ! prog_modal_aero determines whether prognostic modal aerosols are present in the run.
     280        1536 :    prog_modal_aero = index(cam_chempkg,'_mam')>0
     281             : 
     282        1536 : end subroutine phys_ctl_readnl
     283             : 
     284             : !===============================================================================
     285             : 
     286        4608 : logical function cam_physpkg_is(name)
     287             : 
     288             :    ! query for the name of the physics package
     289             : 
     290             :    character(len=*) :: name
     291             : 
     292        4608 :    cam_physpkg_is = (trim(name) == trim(cam_physpkg))
     293        4608 : end function cam_physpkg_is
     294             : 
     295             : !===============================================================================
     296             : 
     297           0 : logical function cam_chempkg_is(name)
     298             : 
     299             :    ! query for the name of the chemics package
     300             : 
     301             :    character(len=*) :: name
     302             : 
     303           0 :    cam_chempkg_is = (trim(name) == trim(cam_chempkg))
     304           0 : end function cam_chempkg_is
     305             : 
     306             : !===============================================================================
     307             : 
     308   107946048 : logical function waccmx_is(name)
     309             : 
     310             :    ! query for the name of the waccmx run option
     311             : 
     312             :    character(len=*) :: name
     313             : 
     314   107946048 :    waccmx_is = (trim(name) == trim(waccmx_opt))
     315   107946048 : end function waccmx_is
     316             : 
     317             : !===============================================================================
     318             : 
     319           0 : subroutine phys_getopts(deep_scheme_out, shallow_scheme_out, eddy_scheme_out, microp_scheme_out, &
     320           0 :                         radiation_scheme_out, use_subcol_microp_out, atm_dep_flux_out, &
     321             :                          history_amwg_out, history_vdiag_out, history_aerosol_out, history_aero_optics_out, history_eddy_out, &
     322             :                         history_budget_out, history_budget_histfile_num_out, &
     323             :                         history_waccm_out, history_waccmx_out, history_chemistry_out, &
     324             :                         history_carma_out, history_clubb_out, history_dust_out, &
     325             :                         history_cesm_forcing_out, history_scwaccm_forcing_out, history_chemspecies_srf_out, &
     326           0 :                         cam_chempkg_out, prog_modal_aero_out, macrop_scheme_out, &
     327             :                         do_clubb_sgs_out, use_spcam_out, state_debug_checks_out, cld_macmic_num_steps_out, &
     328             :                         offline_driver_out, convproc_do_aer_out, cam_snapshot_before_num_out, cam_snapshot_after_num_out,&
     329           0 :                         cam_take_snapshot_before_out, cam_take_snapshot_after_out, physics_grid_out, do_hb_above_clubb_out)
     330             : !-----------------------------------------------------------------------
     331             : ! Purpose: Return runtime settings
     332             : !          deep_scheme_out   : deep convection scheme
     333             : !          shallow_scheme_out: shallow convection scheme
     334             : !          eddy_scheme_out   : vertical diffusion scheme
     335             : !          microp_scheme_out : microphysics scheme
     336             : !          radiation_scheme_out : radiation_scheme
     337             : !          SPCAM_microp_scheme_out : SPCAM microphysics scheme
     338             : !-----------------------------------------------------------------------
     339             : 
     340             :    character(len=16), intent(out), optional :: deep_scheme_out
     341             :    character(len=16), intent(out), optional :: shallow_scheme_out
     342             :    character(len=16), intent(out), optional :: eddy_scheme_out
     343             :    character(len=16), intent(out), optional :: microp_scheme_out
     344             :    character(len=16), intent(out), optional :: radiation_scheme_out
     345             :    character(len=16), intent(out), optional :: macrop_scheme_out
     346             :    logical,           intent(out), optional :: use_subcol_microp_out
     347             :    logical,           intent(out), optional :: use_spcam_out
     348             :    logical,           intent(out), optional :: atm_dep_flux_out
     349             :    logical,           intent(out), optional :: history_amwg_out
     350             :    logical,           intent(out), optional :: history_vdiag_out
     351             :    logical,           intent(out), optional :: history_eddy_out
     352             :    logical,           intent(out), optional :: history_aerosol_out
     353             :    logical,           intent(out), optional :: history_aero_optics_out
     354             :    logical,           intent(out), optional :: history_budget_out
     355             :    integer,           intent(out), optional :: history_budget_histfile_num_out
     356             :    logical,           intent(out), optional :: history_waccm_out
     357             :    logical,           intent(out), optional :: history_waccmx_out
     358             :    logical,           intent(out), optional :: history_chemistry_out
     359             :    logical,           intent(out), optional :: history_carma_out
     360             :    logical,           intent(out), optional :: history_clubb_out
     361             :    logical,           intent(out), optional :: history_cesm_forcing_out
     362             :    logical,           intent(out), optional :: history_chemspecies_srf_out
     363             :    logical,           intent(out), optional :: history_dust_out
     364             :    logical,           intent(out), optional :: history_scwaccm_forcing_out
     365             :    logical,           intent(out), optional :: do_clubb_sgs_out
     366             :    character(len=32), intent(out), optional :: cam_chempkg_out
     367             :    logical,           intent(out), optional :: prog_modal_aero_out
     368             :    logical,           intent(out), optional :: state_debug_checks_out
     369             :    integer,           intent(out), optional :: cld_macmic_num_steps_out
     370             :    logical,           intent(out), optional :: offline_driver_out
     371             :    logical,           intent(out), optional :: convproc_do_aer_out
     372             :    integer,           intent(out), optional :: cam_snapshot_before_num_out
     373             :    integer,           intent(out), optional :: cam_snapshot_after_num_out
     374             :    character(len=32), intent(out), optional :: cam_take_snapshot_before_out
     375             :    character(len=32), intent(out), optional :: cam_take_snapshot_after_out
     376             :    character(len=cl), intent(out), optional :: physics_grid_out
     377             :    logical,           intent(out), optional :: do_hb_above_clubb_out
     378             : 
     379    30424056 :    if ( present(deep_scheme_out         ) ) deep_scheme_out          = deep_scheme
     380    30424056 :    if ( present(shallow_scheme_out      ) ) shallow_scheme_out       = shallow_scheme
     381    30424056 :    if ( present(eddy_scheme_out         ) ) eddy_scheme_out          = eddy_scheme
     382    30424056 :    if ( present(microp_scheme_out       ) ) microp_scheme_out        = microp_scheme
     383    30424056 :    if ( present(radiation_scheme_out    ) ) radiation_scheme_out     = radiation_scheme
     384    30424056 :    if ( present(use_subcol_microp_out   ) ) use_subcol_microp_out    = use_subcol_microp
     385    30424056 :    if ( present(use_spcam_out           ) ) use_spcam_out            = use_spcam
     386             : 
     387    30424056 :    if ( present(macrop_scheme_out       ) ) macrop_scheme_out        = macrop_scheme
     388    30424056 :    if ( present(atm_dep_flux_out        ) ) atm_dep_flux_out         = atm_dep_flux
     389    30424056 :    if ( present(history_aerosol_out     ) ) history_aerosol_out      = history_aerosol
     390    30424056 :    if ( present(history_aero_optics_out ) ) history_aero_optics_out  = history_aero_optics
     391    30424056 :    if ( present(history_budget_out      ) ) history_budget_out       = history_budget
     392    30424056 :    if ( present(history_amwg_out        ) ) history_amwg_out         = history_amwg
     393    30424056 :    if ( present(history_vdiag_out       ) ) history_vdiag_out        = history_vdiag
     394    30424056 :    if ( present(history_eddy_out        ) ) history_eddy_out         = history_eddy
     395    30424056 :    if ( present(history_budget_histfile_num_out ) ) history_budget_histfile_num_out = history_budget_histfile_num
     396    30424056 :    if ( present(history_waccm_out       ) ) history_waccm_out        = history_waccm
     397    30424056 :    if ( present(history_waccmx_out      ) ) history_waccmx_out       = history_waccmx
     398    30424056 :    if ( present(history_chemistry_out   ) ) history_chemistry_out    = history_chemistry
     399    30424056 :    if ( present(history_cesm_forcing_out) ) history_cesm_forcing_out = history_cesm_forcing
     400    30424056 :    if ( present(history_chemspecies_srf_out) ) history_chemspecies_srf_out = history_chemspecies_srf
     401    30424056 :    if ( present(history_scwaccm_forcing_out) ) history_scwaccm_forcing_out = history_scwaccm_forcing
     402    30424056 :    if ( present(history_carma_out       ) ) history_carma_out        = history_carma
     403    30424056 :    if ( present(history_clubb_out       ) ) history_clubb_out        = history_clubb
     404    30424056 :    if ( present(history_dust_out        ) ) history_dust_out         = history_dust
     405    30424056 :    if ( present(do_clubb_sgs_out        ) ) do_clubb_sgs_out         = do_clubb_sgs
     406    30424056 :    if ( present(cam_chempkg_out         ) ) cam_chempkg_out          = cam_chempkg
     407    30424056 :    if ( present(prog_modal_aero_out     ) ) prog_modal_aero_out      = prog_modal_aero
     408    30424056 :    if ( present(state_debug_checks_out  ) ) state_debug_checks_out   = state_debug_checks
     409    30424056 :    if ( present(cld_macmic_num_steps_out) ) cld_macmic_num_steps_out = cld_macmic_num_steps
     410    30424056 :    if ( present(offline_driver_out      ) ) offline_driver_out       = offline_driver
     411    30424056 :    if ( present(convproc_do_aer_out     ) ) convproc_do_aer_out      = convproc_do_aer
     412    30424056 :    if ( present(cam_snapshot_before_num_out ) ) cam_snapshot_before_num_out = cam_snapshot_before_num
     413    30424056 :    if ( present(cam_snapshot_after_num_out  ) ) cam_snapshot_after_num_out  = cam_snapshot_after_num
     414    30424056 :    if ( present(cam_take_snapshot_before_out) ) cam_take_snapshot_before_out = cam_take_snapshot_before
     415    30424056 :    if ( present(cam_take_snapshot_after_out ) ) cam_take_snapshot_after_out  = cam_take_snapshot_after
     416    30424056 :    if ( present(physics_grid_out         ) ) physics_grid_out        = cam_physics_mesh
     417    30424056 :    if ( present(do_hb_above_clubb_out    ) ) do_hb_above_clubb_out   = do_hb_above_clubb
     418             : 
     419    30424056 : end subroutine phys_getopts
     420             : 
     421             : !===============================================================================
     422             : 
     423           0 : subroutine phys_setopts(fv_am_correction_in)
     424             : 
     425             :    logical, intent(in), optional :: fv_am_correction_in
     426             : 
     427           0 :    if ( present(fv_am_correction_in) ) fv_am_correction = fv_am_correction_in
     428             : 
     429    30424056 : end subroutine phys_setopts
     430             : 
     431             : !===============================================================================
     432             : 
     433        1536 : function phys_deepconv_pbl()
     434             : 
     435             :   logical phys_deepconv_pbl
     436             : 
     437             :    ! Don't allow deep convection in PBL if running UW PBL scheme
     438        1536 :    if ( (eddy_scheme .eq. 'diag_TKE' ) .or. (shallow_scheme .eq. 'UW' ) ) then
     439             :       phys_deepconv_pbl = .true.
     440             :    else
     441        1536 :       phys_deepconv_pbl = .false.
     442             :    endif
     443             : 
     444             :    return
     445             : 
     446             : end function phys_deepconv_pbl
     447             : 
     448             : !===============================================================================
     449             : 
     450     1861656 : function phys_do_flux_avg()
     451             : 
     452             :    logical :: phys_do_flux_avg
     453             :    !----------------------------------------------------------------------
     454             : 
     455     1861656 :    phys_do_flux_avg = .false.
     456     1861656 :    if (srf_flux_avg == 1) phys_do_flux_avg = .true.
     457             : 
     458     1861656 : end function phys_do_flux_avg
     459             : 
     460             : !===============================================================================
     461             : end module phys_control

Generated by: LCOV version 1.14