module runtime_opts 1,20
!-----------------------------------------------------------------------
!
! Purpose: This module is responsible for reading CAM namelist cam_inparm
! and broadcasting namelist values if needed.
!
! Author:
! Original routines: CMS
! Module: T. Henderson, September 2003
!
!-----------------------------------------------------------------------
!-----------------------------------------------------------------------
!- use statements ------------------------------------------------------
!-----------------------------------------------------------------------
use shr_kind_mod
, only: r8 => shr_kind_r8, SHR_KIND_CL
use spmd_utils
, only: masterproc
use namelist_utils
, only: find_group_name
use pmgrid
, only: plat, plev, plon
use cam_history
use cam_control_mod
use cam_diagnostics
, only: inithist_all
use cam_logfile
, only: iulog
use pspect
!use shr_orb_mod
use units
use constituents
, only: pcnst, readtrace
use tracers
, only: tracers_flag
use time_manager
, only: dtime
use filenames
, only: ncdata, bnd_topo, &
absems_data, modal_optics, &
caseid, isccpdata, &
brnch_retain_casename
use cloudsimulator
, only: doisccp
use cloudsimulator_38
, only: doisccp_38
use dycore
, only: dycore_is
use abortutils
, only: endrun
use fv_control_mod
, only: nsplit, nspltrac, nspltvrm, iord, jord, kord, dyn_conservative, &
filtcw, ct_overlap, trac_decomp, fft_flt, div24del2flag, del2coef
use rayleigh_friction
, only: rayk0, raykrange, raytau0
!-----------------------------------------------------------------------
!- module boilerplate --------------------------------------------------
!-----------------------------------------------------------------------
implicit none
private
save
!-----------------------------------------------------------------------
! Public interfaces ----------------------------------------------------
!-----------------------------------------------------------------------
public read_namelist ! Set and/or get all runtime options
!-----------------------------------------------------------------------
! Private data ---------------------------------------------------------
!-----------------------------------------------------------------------
character(len=SHR_KIND_CL), private :: nlfilename = 'atm_in' ! Namelist filename
!-----------------------------------------------------------------------
!
! SOMEWHAT ALPHABETICAL listing of variables in the cam_inparm namelist:
!
! variable description
! -------- -----------------
!
! bnd_topo Path and filename of topography dataset
!
! absems_data Dataset with absorption and emissivity factors.
!
! modal_optics Dataset with coefficients for modal aerosol optics.
!
!
! dif2 = nnn.n, del2 horizontal diffusion coeff. Default value
! defined in module comhd.
real(r8) :: dif2
! dif4 = nnn.n, del4 horizontal diffusion coeff. Default value
! defined in module comhd.
real(r8) :: dif4
!
! kmxhdc = nn number of levels (starting from model top) to
! apply Courant limiter. Default value defined
! in module comhd.
integer :: kmxhdc
!
! divdampn = 0. Number of days (from nstep 0) to run divergence
! damper
!
! dtime = nnnn, Model time step in seconds. Default is dycore dependent.
!
! eps = nnn.n, time filter coefficient. Defaults to 0.06.
!
! fincl1 = 'field1', 'field2',...
! List of fields to add to the primary history file.
! fincl1lonlat = 'longitude by latitude','longitude by latitude',...
! List of columns ('longitude_latitude') or contiguous
! columns ('longitude:longitude_latitude:latitude') at
! which the fincl1 fields will be output. Individual
! columns are specified as a string using a longitude
! degree (greater or equal to 0.) followed by a single
! character (e)ast/(w)est identifer, an
! underscore '_' , and a latitude degree followed by a
! single character (n)orth/(s)outh identifier.
! example '10e_20n' would pick the model column closest
! to 10 degrees east longitude by 20 degrees north
! latitude. A group of contiguous columns can be
! specified by using lon lat ranges with their single
! character east/west or north/south identifiers
! example '10e:20e_15n:20n'. Would outfield all
! fincl1 fields at the model columns which fall
! with in the longitude range from 10 east to 20 east
! and the latitude range from 15 north to 20 north
!
! fincl[2..6] = 'field1', 'field2',...
! List of fields to add to the auxiliary history file.
!
! fincl2..6]lonlat = 'longitude by latitude','longitude by latitude',...
! List of columns ('longitude_latitude') or contiguous
! columns ('longitude:longitude_latitude:latitude') at
! which the fincl[2..6] fields will be output. Individual
! columns are specified as a string using a longitude
! degree (greater or equal to 0.) followed by a single
! character (e)ast/(w)est identifer, an
! underscore '_' , and a latitude degree followed by a
! singel character (n)orth/(s)outh identifier.
! example '10e_20n' would pick the model column closest
! to 10 degrees east longitude by 20 degrees north
! latitude. A group of contiguous columns can be
! specified by using lon lat ranges with their single
! character east/west or north/south identifiers
! example '10e:20e_15n:20n'. Would outfield all
! fincl[2..6] fields at the model columns which fall
! with in the longitude range from 10 east to 20 east
! and the latitude range from 15 north to 20 north
!
! fexcl1 = 'field1','field2',...
! List of field names to exclude from default
! primary history file (default fields on the
! Master Field List).
!
! fexcl[2..6] = 'field1','field2',...
! List of field names to exclude from
! auxiliary history files.
!
! fhstpr1 = 'field1', 'field2',...
! List of fields to change buffer size in
! primary history file
!
! fhstpr[2..6] = 'field1', 'field2',...
! List of fields to change buffer size in auxiliary files
!
! fwrtpr1 = 'field1', 'field2',...
! List of fields to change output data type in
! primary history file
!
! fwrtpr[2..6] = 'field1', 'field2',...
! List of fields to change output data type in
! auxiliary files
!
! mfilt = nn,nn,nn Array containing the maximum number of time
! samples per disk history file. Defaults to 5.
! The first value applies to the primary hist. file,
! the second to the first aux. hist. file, etc.
!
! ncdata Path and filename of initial condition dataset.
!
! nhtfrq = nn,nn,nn,.. Output history frequency for each tape
!
! If = 0 : monthly average
! If > 0 : output every nhtfrq time steps.
! If < 0 : output every abs(nhtfrq) hours.
!
! nlvdry = nn, Number of layers over which to do dry
! adjustment. Defaults to 3.
!
! cam_branch_file Filepath of restart file to branch from (nsrest=3)
! Full pathname required.
character(len=256) :: cam_branch_file = ' '
!
! use_64bit_nc True if new 64-bit netCDF formit, false otherwise (default false)
!
!------------------------------------------------------------------
! The following are specific to f-v dynamics (see dynpkg for info)
!------------------------------------------------------------------
! nsplit Intended number of dynamics timesteps per physics timestep
! nspltrac Intended number of tracer advection timesteps per physics timestep
! Nsplit is partitioned into nspltrac and nsplit/nspltrac,
! with the latter being the number of dynamics timesteps per
! tracer timestep, possibly rounded upward; after initialization,
! the code quantity nsplit is redefined to be the number of
! dynamics timesteps per tracer timestep.
! nspltvrm Number of vertical re-mapping timesteps per physics timestep
! Nspltrac is partitioned into nspltvrm and nspltrac/nspltvrm,
! with the latter being the number of tracer timesteps per
! re-mapping timestep, possibly rounded upward; after initialization,
! the code quantity nspltrac is redefined to be the number of
! tracer timesteps per re-mapping timestep.
! iord scheme to be used for E-W transport (default: 4)
! jord scheme to be used for N-S transport (default: 4)
! kord scheme to be used for vertical mapping (default: 4)
! filtcw filter c-grid winds if nonzero
! ct_overlap Nonzero for overlapping cd_core and trac2d, 0 otherwise
! trac_decomp Size of trac2d domain decomposition (default 1)
! fft_flt 1 for FFT filter always, 0 for algebraic/FFT filter
! (default: 0 for cam3, cam3_5; 1 otherwise)
! ldiv2 .true. : CAM3, CAM3.5 default divergence damping
! .false.: 4th-order divergence damping except model top
! layers where 2nd-order Laplacian damping is used
!------------------------------------------------------------------
!
!------------------------------------------------------------------
! The following 29 are specific to f-v decomposition and transposes
! (see spmd_dyn for info)
!------------------------------------------------------------------
! npr_yz(4) yz and xy decompositions
integer :: npr_yz(4)
! geopktrans geopotential method (routine geopk, geopk16,
! or geopk_d)
integer :: geopktrans
! geopkblocks number of stages to use in Z-serial non-transpose
! geopotential method (routine geopk_d)
integer :: geopkblocks
! force_2d option to force transpose computation for 1D decomp.
integer :: force_2d
! modcomm_transpose mod_comm transpose method
integer :: modcomm_transpose
! modcomm_geopk mod_comm geopk method
integer :: modcomm_geopk
! modcomm_gatscat mod_comm gather/scatter method
integer :: modcomm_gatscat
! modc_sw_dynrun mod_comm irregular underlying communication method for dyn_run/misc
integer :: modc_sw_dynrun
! modc_hs_dynrun mod_comm irregular communication handshaking for dyn_run/misc
logical :: modc_hs_dynrun
! modc_send_dynrun mod_comm irregular communication send protocol for dyn_run/misc
logical :: modc_send_dynrun
! modc_mxreq_dynrun mod_comm irregular communication nonblocking request throttle for dyn_run/misc
integer :: modc_mxreq_dynrun
! modc_sw_cdcore mod_comm irregular underlying communication method for cd_core/geopk
integer :: modc_sw_cdcore
! modc_hs_cdcore mod_comm irregular communication handshaking for cd_core/geopk
logical :: modc_hs_cdcore
! modc_send_cdcore geopk_d and mod_comm irregular communication send protocol for cd_core/geopk
logical :: modc_send_cdcore
! modc_mxreq_cdcore mod_comm irregular communication nonblocking request throttle for cd_core/geopk
integer :: modc_mxreq_cdcore
! modc_sw_gather mod_comm irregular underlying communication method for gather
integer :: modc_sw_gather
! modc_hs_gather mod_comm irregular communication handshaking for gather
logical :: modc_hs_gather
! modc_send_gather mod_comm irregular communication send protocol for gather
logical :: modc_send_gather
! modc_mxreq_gather mod_comm irregular communication nonblocking request throttle for gather
integer :: modc_mxreq_gather
! modc_sw_scatter mod_comm irregular underlying communication method for scatter
integer :: modc_sw_scatter
! modc_hs_scatter mod_comm irregular communication handshaking for scatter
logical :: modc_hs_scatter
! modc_send_scatter mod_comm irregular communication send protocol for scatter
logical :: modc_send_scatter
! modc_mxreq_scatter mod_comm irregular communication nonblocking request throttle for scatter
integer :: modc_mxreq_scatter
! modc_sw_tracer mod_comm irregular underlying communication method for multiple tracers
integer :: modc_sw_tracer
! modc_hs_tracer mod_comm irregular communication handshaking for multiple tracers
logical :: modc_hs_tracer
! modc_send_tracer mod_comm irregular communication send protocol for multiple tracers
logical :: modc_send_tracer
! modc_mxreq_tracer mod_comm irregular communication nonblocking request throttle for multiple tracers
integer :: modc_mxreq_tracer
! modc_onetwo one or two simultaneous mod_comm irregular communications (excl. tracers)
integer :: modc_onetwo
! modc_tracers max number of tracers for simultaneous mod_comm irregular communications
! if 0, then use mp_sendirr/mp_recvirr to do one at a time
integer :: modc_tracers
!------------------------------------------------------------------
!------------------------------------------------------------------
! The following 5 are specific to eul/sld communication algorithms
! (see { eul | sld }/spmd_dyn for info)
!------------------------------------------------------------------
! dyn_alltoall dynamics transpose option.
integer :: dyn_alltoall
! dyn_allgather dynamics gather option.
integer :: dyn_allgather
! dyn_equi_by_col dynamics load balancing option.
logical :: dyn_equi_by_col
! dyn_npes number of processes assigned to dynamics (EUL and SLD dycores)
integer :: dyn_npes
! dyn_npes_stride stride for dynamics processes (EUL and SLD dycores)
! (e.g., if stride=2, assign every second process to the dynamics)
integer :: dyn_npes_stride
!------------------------------------------------------------------
! The following 3 are specific to the spmd_utils module, used
! in the point-to-point implementations of eul/sld and physics
! communication algorithms and in the flow-controlled gather collective
! (see spmd_utils for info)
!------------------------------------------------------------------
! swap_comm_protocol Performance tuning option for swap communication.
integer :: swap_comm_protocol
! swap_comm_maxreq Performance tuning option for swap communication.
integer :: swap_comm_maxreq
! fc_gather_flow_cntl Tuning option for flow-controlled gather, used
! to improve robustness at high process count and
! to improve performance
integer :: fc_gather_flow_cntl
!------------------------------------------------------------------
! The following 3 are specific to Rayleigh friction
! integer rayk0 vertical level at which rayleigh friction term is centered
! real(r8) raykrange range of rayleigh friction profile; if 0, range is set automatically
! real(r8) raytau0 approximate value of decay time at model top (days);
! if 0., no rayleigh friction is applied
!------------------------------------------------------------------
!
!
! hfilename_spec Flexible filename specifier for history files
!
!
! pertlim = n.n Max size of perturbation to apply to initial
! temperature field.
!
! phys_alltoall Dynamics/physics transpose option. See phys_grid module.
!
integer :: phys_alltoall
!
! phys_loadbalance Load balance option for performance tuning of
! physics chunks. See phys_grid module.
integer :: phys_loadbalance
!
! phys_twin_algorithm Load balance option for performance tuning of
! physics chunks. See phys_grid module.
integer :: phys_twin_algorithm
!
! phys_chnk_per_thd Performance tuning option for physics chunks. See
! phys_grid module.
integer :: phys_chnk_per_thd
!
! repro_sum_use_ddpdd Flag indicating that the double-double summation
! algorithm should be used instead of the repro
! fixed precision algorithm
logical :: repro_sum_use_ddpdd
!
! repro_sum_rel_diff_max Maximum permissible relative difference between
! repro and nonrepro scalable algorithms.
! See repro_sum_mod module.
real(r8) :: repro_sum_rel_diff_max
!
! repro_sum_recompute Flag indicating that an alternative, serial, algorithm
! should be used when the relative difference between
! the repro and nonrepro scalable algorithms exceeds
! the tolerance specified by repro_sum_rel_diff_max.
! See repro_sum_mod module.
logical :: repro_sum_recompute
!
! tracers_flag = .F. If true, implement tracer test code. Number of tracers determined
! in tracers_suite.F90 must agree with PCNST
!
! readtrace = .T. If true, tracer initial conditions obtained from
! initial file.
!
! inithist Generate initial dataset as auxillary history file
! can be set to '6-HOURLY', 'DAILY', 'MONTHLY', 'YEARLY' or 'NONE'.
! default: 'YEARLY'
!
! empty_htapes true => no fields by default on history tapes
!
! print_step_cost true => print per timestep cost info
!
! avgflag_pertape A, I, X, or M means avg, instantaneous, max or min for all fields on
! that tape
!
! doisccp whether to do ISCCP calcs (version 3.4) and history output (default false)
! doisccp_38 whether to do ISCCP calcs (version 3.8) and history output (default false)
!
! logical indirect
! ! true => include indirect radiative effects of
! ! sulfate aerosols. Default is false.
!
! inithist_all .false.: include only REQUIRED fields on IC file
! .true. : include required AND optional fields on IC file
! default: .false.
!
! met_data_file name of file that contains the offline meteorology data
!
! met_filenames_list name of file that contains names of the offline
! meteorology data files
!
! met_remove_file true => the offline meteorology file will be removed
!
! met_cell_wall_winds true => the offline meteorology winds are defined on the model
! grid cell walls
! Physics buffer
logical :: pbuf_global_allocate ! allocate all buffers as global (default: .true.)
! Diagnostics options
character(len=8) :: diag_cnst_conv_tend ! output constituent tendencies due to convection
! 'none', 'q_only' or 'all'
! Conservation checks
logical :: print_energy_errors ! switch for diagnostic output from check_energy module
! Radiative heating rate calculation options
integer :: iradsw ! freq. of shortwave radiation calc in time steps (positive)
! or hours (negative). Default: -1
integer :: iradlw ! frequency of longwave rad. calc. in time steps (positive)
! or hours (negative). Default: -1
integer :: iradae ! frequency of absorp/emis calc in time steps (positive)
! or hours (negative). Default: -12
integer :: irad_always ! Specifies length of time in timesteps (positive)
! or hours (negative) SW/LW radiation will be run continuously
! from the start of an initial run. Default: 0
#if (defined WACCM_PHYS)
! iondrag / efield
character(len=256) :: efield_lflux_file
character(len=256) :: efield_hflux_file
character(len=256) :: efield_wei96_file
! waccm qbo data variables
character(len=256) :: qbo_forcing_file
logical :: qbo_use_forcing
logical :: qbo_cyclic
#endif
! Upper atmosphere radiative processes (waccm phys)
logical :: nlte_use_mo ! Determines which constituents are used from NLTE calculations
! = .true. uses MOZART constituents
! = .false. uses constituents from bnd dataset cftgcm
integer :: itgcmcyc ! flag for cycling TIME/GCM input dataset:
! = 0 : one time sample only
! = 1 : full annual cycle (default)
! = 2 : two time samples
character(len=256) :: cftgcm ! Pathname of time-variant TIME/GCM output
! SCM Options
logical :: single_column
real(r8) :: scmlat,scmlon
integer, parameter :: max_chars = 128
character(len=max_chars) iopfile
logical :: scm_iop_srf_prop
logical :: scm_relaxation
logical :: scm_diurnal_avg
logical :: scm_crm_mode
#if ( defined OFFLINE_DYN )
logical :: met_remove_file
logical :: met_cell_wall_winds
character(len=256) :: met_data_file
character(len=256) :: met_filenames_list
real(r8) :: met_rlx_top ! (km) top of relaxation region of winds for offline waccm
real(r8) :: met_rlx_bot ! (km) bottom of relaxation region of winds for offline waccm
real(r8) :: met_max_rlx ! maximum of vertical relaxation function in bottom portion (default is 1.0)
logical :: met_fix_mass ! switch to turn on/off mass fixer for offline driver (default is TRUE)
character(len=16) :: met_shflx_name ! srf heat flux field name in met data file
character(len=16) :: met_qflx_name ! water vapor flux field name in met data file
real(r8) :: met_shflx_factor ! multiplication factor for srf heat flux
real(r8) :: met_qflx_factor ! multiplication factor for water vapor flux
#endif
contains
!=======================================================================
subroutine read_namelist(single_column_in, scmlon_in, scmlat_in, nlfilename_in ) 1,119
!-----------------------------------------------------------------------
!
! Purpose:
! Read data from namelist cam_inparm to define the run. Process some of the
! namelist variables to determine history and restart/branch file path
! names. Check input namelist variables for validity and print them
! to standard output.
!
! Method:
! Important Note for running on SUN systems: "implicit automatic (a-z)"
! will not work because namelist data must be static.
!
! Author:
! Original version: CCM1
! Standardized: L. Bath, June 1992
! T. Acker, March 1996
!
!-----------------------------------------------------------------------
! Note that the following interfaces are prototypes proposed by Henderson
! and Eaton. They minimize coupling with other modules. Design of these
! interfaces should be refined via review by other CAM developers.
! Interface *_defaultopts() gets default values from the responsible
! module (Expert) prior to namelist read.
! Interface *_setopts() sends values to the responsible module (Expert)
! after namelist read. Erroneous values are handled by Experts.
! TBH 9/8/03
!
use phys_grid
, only: phys_grid_defaultopts, phys_grid_setopts
use repro_sum_mod
, only: repro_sum_defaultopts, repro_sum_setopts
use phys_buffer
, only: pbuf_defaultopts, pbuf_setopts
#if ( defined SPMD )
use spmd_utils
, only: swap_comm_defaultopts, swap_comm_setopts, &
fc_gather_defaultopts, fc_gather_setopts
use spmd_dyn
, only: spmd_dyn_defaultopts, spmd_dyn_setopts
#endif
#if (defined WACCM_PHYS)
use iondrag, only: iondrag_defaultopts, iondrag_setopts
use qbo, only: qbo_defaultopts, qbo_setopts
#endif
use chem_surfvals
, only: chem_surfvals_readnl
use cam_diagnostics
, only: diag_defaultopts, diag_setopts
use check_energy
, only: check_energy_defaultopts, check_energy_setopts
use comhd
, only: comhd_defaultopts, comhd_setopts
use radiation
, only: radiation_defaultopts, radiation_setopts, radiation_printopts
use cam_restart
, only: restart_defaultopts, restart_setopts, restart_printopts
use radheat
, only: radheat_defaultopts, radheat_setopts
#if ( defined OFFLINE_DYN )
use metdata
, only: offline_met_defaultopts, offline_met_setopts
#endif
use co2_cycle
, only: co2_cycle_readnl
use shr_string_mod
, only: shr_string_toUpper
use scamMod
, only: scam_setopts,scam_default_opts
! Some modules read their own namelist input.
use physconst
, only: physconst_readnl
use phys_control
, only: phys_ctl_readnl
use cam3_aero_data
, only: cam3_aero_data_readnl
use cam3_ozone_data
, only: cam3_ozone_data_readnl
use cloud_fraction
, only: cldfrc_readnl
use cldwat
, only: cldwat_readnl
use zm_conv
, only: zmconv_readnl
use hk_conv
, only: hkconv_readnl
use pkg_cld_sediment
, only: cld_sediment_readnl
use gw_drag
, only: gw_drag_readnl
use phys_debug_util
, only: phys_debug_readnl
use rad_constituents
, only: rad_cnst_readnl
use radiation_data
, only: rad_data_readnl
use chemistry
, only: chem_readnl
use prescribed_volcaero
, only: prescribed_volcaero_readnl
use aerodep_flx
, only: aerodep_flx_readnl
use solar_data
, only: solar_data_readnl
use tropopause
, only: tropopause_readnl
use aoa_tracers
, only: aoa_tracers_readnl
use prescribed_ozone
, only: prescribed_ozone_readnl
use prescribed_aero
, only: prescribed_aero_readnl
use prescribed_ghg
, only: prescribed_ghg_readnl
!---------------------------Arguments-----------------------------------
logical , intent(in), optional :: single_column_in
real(r8), intent(in), optional :: scmlon_in
real(r8), intent(in), optional :: scmlat_in
character(len=*) , optional :: nlfilename_in
!-----------------------------------------------------------------------
include 'netcdf.inc'
!---------------------------Local variables-----------------------------
character(len=*), parameter :: subname = "read_namelist"
!
character ctemp*8 ! Temporary character strings
integer ntspdy ! number of timesteps per day
integer t ! history tape index
integer lastchar ! index to last char of a char variable
integer ierr ! error code
integer unitn ! namelist unit number
integer f, i
integer, parameter :: fieldname_len = 16
integer, parameter :: fieldname_lenp2 = fieldname_len + 2
integer, parameter :: max_chars = 128
character(len=fieldname_lenp2) fincl1(pflds)
character(len=fieldname_lenp2) fincl2(pflds)
character(len=fieldname_lenp2) fincl3(pflds)
character(len=fieldname_lenp2) fincl4(pflds)
character(len=fieldname_lenp2) fincl5(pflds)
character(len=fieldname_lenp2) fincl6(pflds)
character(len=max_chars) fincl1lonlat(pflds)
character(len=max_chars) fincl2lonlat(pflds)
character(len=max_chars) fincl3lonlat(pflds)
character(len=max_chars) fincl4lonlat(pflds)
character(len=max_chars) fincl5lonlat(pflds)
character(len=max_chars) fincl6lonlat(pflds)
character(len=fieldname_len) fexcl1(pflds)
character(len=fieldname_len) fexcl2(pflds)
character(len=fieldname_len) fexcl3(pflds)
character(len=fieldname_len) fexcl4(pflds)
character(len=fieldname_len) fexcl5(pflds)
character(len=fieldname_len) fexcl6(pflds)
character(len=fieldname_lenp2) fhstpr1(pflds)
character(len=fieldname_lenp2) fhstpr2(pflds)
character(len=fieldname_lenp2) fhstpr3(pflds)
character(len=fieldname_lenp2) fhstpr4(pflds)
character(len=fieldname_lenp2) fhstpr5(pflds)
character(len=fieldname_lenp2) fhstpr6(pflds)
character(len=fieldname_lenp2) fwrtpr1(pflds)
character(len=fieldname_lenp2) fwrtpr2(pflds)
character(len=fieldname_lenp2) fwrtpr3(pflds)
character(len=fieldname_lenp2) fwrtpr4(pflds)
character(len=fieldname_lenp2) fwrtpr5(pflds)
character(len=fieldname_lenp2) fwrtpr6(pflds)
!
! Define the cam_inparm namelist
!
! TBH: NOTE: Move the definition of cam_inparm outside of this routine
! TBH: as soon as common blocks in comctl.h, comtfc.h,
! TBH: comsol.h, comadj.h, and perturb.h have been converted to
! TBH: modules.
!
! ***NOTE*** If a namelist option is not described in the CAM Users Guide,
! it is not supported.
namelist /cam_inparm/ ncdata, bnd_topo, &
cam_branch_file ,nhstpr ,ndens ,nhtfrq , &
mfilt ,absems_data ,modal_optics, &
fincl1 ,fincl2 ,fincl3 ,fincl4 ,fincl5 , &
fincl1lonlat,fincl2lonlat,fincl3lonlat, &
fincl4lonlat ,fincl5lonlat , &
fincl6 ,fexcl1 ,fexcl2 ,fexcl3 ,fexcl4 , &
fexcl5 ,fexcl6 ,hfilename_spec, &
fhstpr1 ,fhstpr2 ,fhstpr3 ,fhstpr4 ,fhstpr5 ,fhstpr6 , &
fwrtpr1 ,fwrtpr2 ,fwrtpr3, fwrtpr4 ,fwrtpr5 ,fwrtpr6 , &
dtime, eps ,dif2 ,dif4 ,kmxhdc , &
nlvdry, &
pertlim ,divdampn, &
readtrace, rayk0, raykrange, raytau0, &
tracers_flag, &
inithist, indirect, nsplit, nspltrac, nspltvrm, filtcw, fft_flt, &
iord, jord, kord, dyn_conservative, div24del2flag, del2coef, &
npr_yz, geopktrans, geopkblocks, &
force_2d, ct_overlap, trac_decomp, &
modcomm_transpose, modcomm_geopk, modcomm_gatscat, &
modc_sw_dynrun, modc_hs_dynrun, modc_send_dynrun, modc_mxreq_dynrun, &
modc_sw_cdcore, modc_hs_cdcore, modc_send_cdcore, modc_mxreq_cdcore, &
modc_sw_gather, modc_hs_gather, modc_send_gather, modc_mxreq_gather, &
modc_sw_scatter, modc_hs_scatter, modc_send_scatter, modc_mxreq_scatter, &
modc_sw_tracer, modc_hs_tracer, modc_send_tracer, modc_mxreq_tracer, &
modc_onetwo, modc_tracers, &
dyn_alltoall, dyn_allgather, dyn_equi_by_col, &
dyn_npes, dyn_npes_stride, &
swap_comm_protocol, swap_comm_maxreq, &
fc_gather_flow_cntl, &
empty_htapes, use_64bit_nc, &
print_step_cost, avgflag_pertape, &
doisccp, doisccp_38, isccpdata, &
phys_alltoall, phys_loadbalance, phys_twin_algorithm, &
phys_chnk_per_thd, &
repro_sum_use_ddpdd, repro_sum_rel_diff_max, repro_sum_recompute, &
inithist_all
! physics buffer
namelist /cam_inparm/ pbuf_global_allocate
! diagnostic options
namelist /cam_inparm/ diag_cnst_conv_tend
! conservation checks
namelist /cam_inparm/ print_energy_errors
! radiative heating calculation options
namelist /cam_inparm/ iradsw, iradlw, iradae, irad_always
#if (defined WACCM_PHYS)
! iondrag / efield options
namelist /cam_inparm/ efield_lflux_file, efield_hflux_file, efield_wei96_file
! waccm qbo namelist variables
namelist /cam_inparm/ qbo_use_forcing, qbo_forcing_file, qbo_cyclic
#endif
! upper atmosphere radiative processes
namelist /cam_inparm/ nlte_use_mo, itgcmcyc, cftgcm
! scam
namelist /cam_inparm/ iopfile,scm_iop_srf_prop,scm_relaxation, &
scm_diurnal_avg,scm_crm_mode
#if ( defined OFFLINE_DYN )
! offline meteorology parameters
namelist /cam_inparm/ met_data_file, met_remove_file, met_cell_wall_winds, &
met_filenames_list, met_rlx_top, met_rlx_bot, met_max_rlx, &
met_fix_mass, met_shflx_name, met_qflx_name, &
met_shflx_factor, met_qflx_factor
#endif
!
!-----------------------------------------------------------------------
if (present(nlfilename_in)) then
nlfilename = nlfilename_in
end if
!
! Determine preset values (this is currently being phased out)
!
call preset
()
!
! Finite volume code only: Set Lagrangian time splits. A default of zero indicates the number
! should be automatically computed unless the user enters something.
!
! This is a hack to set nsplit for the waccm model at resolutions of 2x2.5 and finer.
if (plev > 65 .and. plat > 90) then
nsplit = 8
end if
!
! Preset sulfate aerosol related variables
indirect = .false.
!
! Get default values of runtime options for spmd_dyn
!
#if ( defined SPMD )
if ( dycore_is
('UNSTRUCTURED') ) then
call spmd_dyn_defaultopts
()
else if ( dycore_is
('LR') ) then
call spmd_dyn_defaultopts
( &
npr_yz_out =npr_yz, &
geopktrans_out =geopktrans, &
geopkblocks_out =geopkblocks, &
force_2d_out =force_2d, &
modcomm_transpose_out =modcomm_transpose, &
modcomm_geopk_out =modcomm_geopk, &
modcomm_gatscat_out =modcomm_gatscat, &
modc_sw_dynrun_out =modc_sw_dynrun, &
modc_hs_dynrun_out =modc_hs_dynrun, &
modc_send_dynrun_out =modc_send_dynrun, &
modc_mxreq_dynrun_out =modc_mxreq_dynrun, &
modc_sw_cdcore_out =modc_sw_cdcore, &
modc_hs_cdcore_out =modc_hs_cdcore, &
modc_send_cdcore_out =modc_send_cdcore, &
modc_mxreq_cdcore_out =modc_mxreq_cdcore, &
modc_sw_gather_out =modc_sw_gather, &
modc_hs_gather_out =modc_hs_gather, &
modc_send_gather_out =modc_send_gather, &
modc_mxreq_gather_out =modc_mxreq_gather, &
modc_sw_scatter_out =modc_sw_scatter, &
modc_hs_scatter_out =modc_hs_scatter, &
modc_send_scatter_out =modc_send_scatter, &
modc_mxreq_scatter_out=modc_mxreq_scatter,&
modc_sw_tracer_out =modc_sw_tracer, &
modc_hs_tracer_out =modc_hs_tracer, &
modc_send_tracer_out =modc_send_tracer, &
modc_mxreq_tracer_out =modc_mxreq_tracer, &
modc_onetwo_out =modc_onetwo, &
modc_tracers_out =modc_tracers )
else if ( dycore_is
('EUL') .or. dycore_is ('SLD') ) then
call spmd_dyn_defaultopts
( &
dyn_alltoall_out =dyn_alltoall, &
dyn_allgather_out =dyn_allgather, &
dyn_equi_by_col_out =dyn_equi_by_col,&
dyn_npes_out =dyn_npes, &
dyn_npes_stride_out =dyn_npes_stride )
endif
! Get default values of runtime options for swap communication
call swap_comm_defaultopts
( &
swap_comm_protocol_out=swap_comm_protocol, &
swap_comm_maxreq_out=swap_comm_maxreq )
! Get default values of runtime options for flow-controlled
! gather collective
call fc_gather_defaultopts
( &
fc_gather_flow_cntl_out=fc_gather_flow_cntl )
#endif
! restart write interval
call restart_defaultopts
( &
cam_branch_file_out =cam_branch_file )
! Get default values of runtime options for physics chunking.
call phys_grid_defaultopts
( &
phys_loadbalance_out =phys_loadbalance, &
phys_twin_algorithm_out =phys_twin_algorithm, &
phys_alltoall_out =phys_alltoall, &
phys_chnk_per_thd_out =phys_chnk_per_thd )
! Get default values of runtime options for reproducible sum
! calculations.
call repro_sum_defaultopts
( &
repro_sum_use_ddpdd_out=repro_sum_use_ddpdd, &
repro_sum_rel_diff_max_out=repro_sum_rel_diff_max, &
repro_sum_recompute_out=repro_sum_recompute )
! physics buffer
call pbuf_defaultopts
( &
pbuf_global_allocate_out = pbuf_global_allocate )
! diagnostics
call diag_defaultopts
( &
diag_cnst_conv_tend_out = diag_cnst_conv_tend )
! conservation
call check_energy_defaultopts
( &
print_energy_errors_out = print_energy_errors )
! radiative heating calcs
call radiation_defaultopts
( &
iradsw_out = iradsw, &
iradlw_out = iradlw, &
iradae_out = iradae, &
irad_always_out = irad_always )
#if (defined WACCM_PHYS)
! iondrag / efield
call iondrag_defaultopts( &
efield_lflux_file_out =efield_lflux_file, &
efield_hflux_file_out =efield_hflux_file, &
efield_wei96_file_out =efield_wei96_file )
! qbo forcing
call qbo_defaultopts( &
qbo_use_forcing_out = qbo_use_forcing, &
qbo_forcing_file_out = qbo_forcing_file,&
qbo_cyclic_out = qbo_cyclic )
#endif
! Upper atmosphere radiative processes
call radheat_defaultopts
( &
nlte_use_mo_out =nlte_use_mo, &
itgcmcyc_out =itgcmcyc, &
cftgcm_out =cftgcm )
!
! Get default values of runtime options for comhd
!
call comhd_defaultopts
(dif2_out =dif2, &
dif4_out =dif4, &
kmxhdc_out=kmxhdc)
#if ( defined OFFLINE_DYN )
!
! Get runtime defualts for the metdata module
!
call offline_met_defaultopts
( met_data_file_out = met_data_file, &
met_remove_file_out = met_remove_file, &
met_cell_wall_winds_out = met_cell_wall_winds, &
met_filenames_list_out = met_filenames_list, &
met_rlx_top_km_out = met_rlx_top, &
met_rlx_bot_km_out = met_rlx_bot, &
met_max_rlx_out = met_max_rlx, &
met_fix_mass_out = met_fix_mass, &
met_shflx_name_out = met_shflx_name, &
met_qflx_name_out = met_qflx_name, &
met_shflx_factor_out = met_shflx_factor, &
met_qflx_factor_out = met_qflx_factor )
#endif
if (present(single_column_in)) then
call scam_default_opts
(scmlat_out=scmlat,scmlon_out=scmlon, &
single_column_out=single_column, &
scm_iop_srf_prop_out=scm_iop_srf_prop,&
scm_relaxation_out=scm_relaxation, &
scm_diurnal_avg_out=scm_diurnal_avg, &
scm_crm_mode_out=scm_crm_mode)
end if
do f = 1, pflds
fincl1(f) = ' '
fincl2(f) = ' '
fincl3(f) = ' '
fincl4(f) = ' '
fincl5(f) = ' '
fincl6(f) = ' '
fincl1lonlat(f) = ' '
fincl2lonlat(f) = ' '
fincl3lonlat(f) = ' '
fincl4lonlat(f) = ' '
fincl5lonlat(f) = ' '
fincl6lonlat(f) = ' '
fexcl1(f) = ' '
fexcl2(f) = ' '
fexcl3(f) = ' '
fexcl4(f) = ' '
fexcl5(f) = ' '
fexcl6(f) = ' '
fhstpr1(f) = ' '
fhstpr2(f) = ' '
fhstpr3(f) = ' '
fhstpr4(f) = ' '
fhstpr5(f) = ' '
fhstpr6(f) = ' '
fwrtpr1(f) = ' '
fwrtpr2(f) = ' '
fwrtpr3(f) = ' '
fwrtpr4(f) = ' '
fwrtpr5(f) = ' '
fwrtpr6(f) = ' '
enddo
! Read in the cam_inparm namelist from input filename
if (masterproc) then
write(iulog,*) 'Read in cam_inparm namelist from: ', trim(nlfilename)
unitn = getunit
()
open( unitn, file=trim(nlfilename), status='old' )
! Look for cam_inparm group name in the input file. If found, leave the
! file positioned at that namelist group.
call find_group_name
(unitn, 'cam_inparm', status=ierr)
if (ierr == 0) then ! found cam_inparm
read(unitn, cam_inparm, iostat=ierr) ! read the cam_inparm namelist group
if (ierr /= 0) then
call endrun
( subname//':: namelist read returns an'// &
' error condition for cam_inparm' )
end if
else
call endrun
(subname // ':: can''t find cam_inparm in file ' // trim(nlfilename))
end if
close( unitn )
call freeunit
( unitn )
!
! Check CASE namelist variable
!
if (caseid==' ') then
call endrun
('READ_NAMELIST: Namelist variable CASEID must be set')
end if
lastchar = len(caseid)
if (caseid(lastchar:lastchar) /= ' ') then
write(iulog,*)'READ_NAMELIST: CASEID must not exceed ', len(caseid)-1, ' characters'
call endrun
end if
do f=1, pflds
fincl(f, 1) = fincl1(f)
fincl(f, 2) = fincl2(f)
fincl(f, 3) = fincl3(f)
fincl(f, 4) = fincl4(f)
fincl(f, 5) = fincl5(f)
fincl(f, 6) = fincl6(f)
fincllonlat(f, 1) = fincl1lonlat(f)
fincllonlat(f, 2) = fincl2lonlat(f)
fincllonlat(f, 3) = fincl3lonlat(f)
fincllonlat(f, 4) = fincl4lonlat(f)
fincllonlat(f, 5) = fincl5lonlat(f)
fincllonlat(f, 6) = fincl6lonlat(f)
if(dycore_is
('UNSTRUCTURED') ) then
do i=1,6
if (fincllonlat(f,i) .ne. ' ') then
call endrun
('READ_NAMELIST: Column output is not supported in Unstructered Grids')
end if
end do
end if
fexcl(f, 1) = fexcl1(f)
fexcl(f, 2) = fexcl2(f)
fexcl(f, 3) = fexcl3(f)
fexcl(f, 4) = fexcl4(f)
fexcl(f, 5) = fexcl5(f)
fexcl(f, 6) = fexcl6(f)
fhstpr(f, 1) = fhstpr1(f)
fhstpr(f, 2) = fhstpr2(f)
fhstpr(f, 3) = fhstpr3(f)
fhstpr(f, 4) = fhstpr4(f)
fhstpr(f, 5) = fhstpr5(f)
fhstpr(f, 6) = fhstpr6(f)
fwrtpr(f, 1) = fwrtpr1(f)
fwrtpr(f, 2) = fwrtpr2(f)
fwrtpr(f, 3) = fwrtpr3(f)
fwrtpr(f, 4) = fwrtpr4(f)
fwrtpr(f, 5) = fwrtpr5(f)
fwrtpr(f, 6) = fwrtpr6(f)
enddo
end if
!
! Scatter namelist data to all processes
#if ( defined SPMD )
call distnl
( )
#endif
!
! Auxiliary history files:
! Store input auxf values in array aux (from common block /comhst/).
!
! If generate an initial conditions history file as an auxillary tape:
!
ctemp = shr_string_toUpper
(inithist)
inithist = trim(ctemp)
if (inithist /= '6-HOURLY' .and. inithist /= 'DAILY' .and. &
inithist /= 'MONTHLY' .and. inithist /= 'YEARLY' .and. &
inithist /= 'CAMIOP' .and. inithist /= 'ENDOFRUN') then
inithist = 'NONE'
endif
!
! Ensure that monthly averages have not been specified for aux. tapes
!
do t=2,ptapes
if (nhtfrq(t) == 0) then
call endrun
('READ_NAMELIST: Only the primary history file may be monthly averaged')
end if
end do
!
! History file write up times
! Convert write freq. of hist files from hours to timesteps if necessary.
!
do t=1,ptapes
if (nhtfrq(t) < 0) then
nhtfrq(t) = nint((-nhtfrq(t)*3600._r8)/dtime)
end if
end do
!
! Initialize the filename specifier if not already set
! This is the format for the history filenames:
! %c= caseid, %t=tape no., %y=year, %m=month, %d=day, %s=second, %%=%
! See the filenames module for more information
!
do t = 1, ptapes
if ( len_trim(hfilename_spec(t)) == 0 )then
if ( nhtfrq(t) == 0 )then
hfilename_spec(t) = '%c.cam2.h%t.%y-%m.nc' ! Monthly files
else
hfilename_spec(t) = '%c.cam2.h%t.%y-%m-%d-%s.nc'
end if
end if
end do
!
! Only one time sample allowed per monthly average file
!
if (nhtfrq(1) == 0) mfilt(1) = 1
! Print per-tape averaging flags
if (masterproc) then
do t=1,ptapes
if (avgflag_pertape(t) /= ' ') then
write(iulog,*)'Unless overridden by namelist input on a per-field basis (FINCL),'
write(iulog,*)'All fields on history file ',t,' will have averaging flag ',avgflag_pertape(t)
end if
end do
end if
#if ( defined SPMD )
!
! Set runtime options for spmd_dyn
!
if ( dycore_is
('HOMME') ) then
call spmd_dyn_setopts
()
else if ( dycore_is
('LR') ) then
call spmd_dyn_setopts
( &
npr_yz_in =npr_yz, &
geopktrans_in =geopktrans, &
geopkblocks_in =geopkblocks, &
force_2d_in =force_2d, &
modcomm_transpose_in =modcomm_transpose, &
modcomm_geopk_in =modcomm_geopk, &
modcomm_gatscat_in =modcomm_gatscat, &
modc_sw_dynrun_in =modc_sw_dynrun, &
modc_hs_dynrun_in =modc_hs_dynrun, &
modc_send_dynrun_in =modc_send_dynrun, &
modc_mxreq_dynrun_in =modc_mxreq_dynrun, &
modc_sw_cdcore_in =modc_sw_cdcore, &
modc_hs_cdcore_in =modc_hs_cdcore, &
modc_send_cdcore_in =modc_send_cdcore, &
modc_mxreq_cdcore_in =modc_mxreq_cdcore, &
modc_sw_gather_in =modc_sw_gather, &
modc_hs_gather_in =modc_hs_gather, &
modc_send_gather_in =modc_send_gather, &
modc_mxreq_gather_in =modc_mxreq_gather, &
modc_sw_scatter_in =modc_sw_scatter, &
modc_hs_scatter_in =modc_hs_scatter, &
modc_send_scatter_in =modc_send_scatter, &
modc_mxreq_scatter_in=modc_mxreq_scatter,&
modc_sw_tracer_in =modc_sw_tracer, &
modc_hs_tracer_in =modc_hs_tracer, &
modc_send_tracer_in =modc_send_tracer, &
modc_mxreq_tracer_in =modc_mxreq_tracer, &
modc_onetwo_in =modc_onetwo, &
modc_tracers_in =modc_tracers )
else if ( dycore_is
('EUL') .or. dycore_is ('SLD') ) then
call spmd_dyn_setopts
( &
dyn_alltoall_in =dyn_alltoall, &
dyn_allgather_in =dyn_allgather, &
dyn_equi_by_col_in =dyn_equi_by_col,&
dyn_npes_in =dyn_npes, &
dyn_npes_stride_in =dyn_npes_stride )
endif
!
! Set runtime options for swap communications.
!
call swap_comm_setopts
( &
swap_comm_protocol_in=swap_comm_protocol, &
swap_comm_maxreq_in=swap_comm_maxreq)
!
! Set runtime options for flow-controlled gather collective.
!
call fc_gather_setopts
( &
fc_gather_flow_cntl_in=fc_gather_flow_cntl )
#endif
! restart write interval
call restart_setopts
( nsrest, &
cam_branch_file_in =cam_branch_file )
! Set runtime options for physics chunking.
call phys_grid_setopts
( &
phys_loadbalance_in =phys_loadbalance, &
phys_twin_algorithm_in =phys_twin_algorithm, &
phys_alltoall_in =phys_alltoall, &
phys_chnk_per_thd_in =phys_chnk_per_thd )
! Set runtime options for reproducible sum calculations.
call repro_sum_setopts
( &
repro_sum_use_ddpdd_in=repro_sum_use_ddpdd, &
repro_sum_rel_diff_max_in=repro_sum_rel_diff_max, &
repro_sum_recompute_in=repro_sum_recompute )
! physics buffer
call pbuf_setopts
( &
pbuf_global_allocate_in = pbuf_global_allocate )
! diagnostics
call diag_setopts
( &
diag_cnst_conv_tend_in = diag_cnst_conv_tend )
! conservation
call check_energy_setopts
( &
print_energy_errors_in = print_energy_errors )
call radiation_setopts
( dtime, nhtfrq(1), &
iradsw_in = iradsw, &
iradlw_in = iradlw, &
iradae_in = iradae, &
irad_always_in = irad_always )
#if (defined WACCM_PHYS)
! iondrag / efield
call iondrag_setopts( &
efield_lflux_file_in =efield_lflux_file, &
efield_hflux_file_in =efield_hflux_file, &
efield_wei96_file_in =efield_wei96_file)
! qbo forcing
call qbo_setopts( &
qbo_use_forcing_in = qbo_use_forcing, &
qbo_forcing_file_in = qbo_forcing_file,&
qbo_cyclic_in = qbo_cyclic )
#endif
! Upper atmosphere radiative processes
call radheat_setopts
( &
nlte_use_mo_in =nlte_use_mo, &
itgcmcyc_in =itgcmcyc, &
cftgcm_in =cftgcm )
!
! Set runtime options for comhd
!
call comhd_setopts
( dif2_in =dif2, &
dif4_in =dif4, &
kmxhdc_in=kmxhdc)
!
! Set runtime options for single column mode
!
if (present(single_column_in) .and. present(scmlon_in) .and. present(scmlat_in)) then
if (single_column_in) then
single_column = single_column_in
scmlon = scmlon_in
scmlat = scmlat_in
call scam_setopts
( scmlat_in=scmlat,scmlon_in=scmlon, &
iopfile_in=iopfile,single_column_in=single_column,&
scm_iop_srf_prop_in=scm_iop_srf_prop,&
scm_relaxation_in=scm_relaxation, &
scm_diurnal_avg_in=scm_diurnal_avg, &
scm_crm_mode_in=scm_crm_mode)
end if
endif
#if ( defined OFFLINE_DYN )
!
! Set runtime options for comhd
!
call offline_met_setopts
( met_data_file_in = met_data_file, &
met_remove_file_in = met_remove_file, &
met_cell_wall_winds_in = met_cell_wall_winds, &
met_filenames_list_in = met_filenames_list, &
met_rlx_top_km_in = met_rlx_top, &
met_rlx_bot_km_in = met_rlx_bot, &
met_max_rlx_in = met_max_rlx, &
met_fix_mass_in = met_fix_mass, &
met_shflx_name_in = met_shflx_name, &
met_qflx_name_in = met_qflx_name, &
met_shflx_factor_in = met_shflx_factor, &
met_qflx_factor_in = met_qflx_factor )
#endif
! Call subroutines for modules to read their own namelist.
! In some cases namelist default values may depend on settings from
! other modules, so there may be an order dependence in the following
! calls.
! Modules that read their own namelist are responsible for making sure
! all processes receive the values.
call physconst_readnl
(nlfilename)
call chem_surfvals_readnl
(nlfilename)
call phys_ctl_readnl
(nlfilename)
call cam3_aero_data_readnl
(nlfilename)
call cam3_ozone_data_readnl
(nlfilename)
call cldfrc_readnl
(nlfilename)
call zmconv_readnl
(nlfilename)
call cldwat_readnl
(nlfilename)
call hkconv_readnl
(nlfilename)
call cld_sediment_readnl
(nlfilename)
call gw_drag_readnl
(nlfilename)
call phys_debug_readnl
(nlfilename)
call rad_cnst_readnl
(nlfilename)
call rad_data_readnl
(nlfilename)
call chem_readnl
(nlfilename)
call prescribed_volcaero_readnl
(nlfilename)
call solar_data_readnl
(nlfilename)
call tropopause_readnl
(nlfilename)
call aoa_tracers_readnl
(nlfilename)
call aerodep_flx_readnl
(nlfilename)
call prescribed_ozone_readnl
(nlfilename)
call prescribed_aero_readnl
(nlfilename)
call prescribed_ghg_readnl
(nlfilename)
call co2_cycle_readnl
(nlfilename)
!
! Print cam_inparm input variables to standard output
!
if (masterproc) then
write(iulog,*)' ------------------------------------------'
write(iulog,*)' *** INPUT VARIABLES (CAM_INPARM) ***'
write(iulog,*)' ------------------------------------------'
if (nsrest/=0) then
write(iulog,*) ' Continuation of an earlier run'
else
write(iulog,*) ' Initial run'
end if
write(iulog,*) ' ********** CASE = ',trim(caseid),' **********'
write(iulog,'(1x,a)') ctitle
if (len_trim(ncdata) > 0) then
write(iulog,*) 'Initial dataset is: ',trim(ncdata)
end if
write(iulog,*)'Topography dataset is: ', trim(bnd_topo)
write(iulog,*)'Time-invariant (absorption/emissivity) factor dataset is: ', trim(absems_data)
#ifdef MODAL_AERO
write(iulog,*)'Time-invariant modal aerosol optics datset is: ', trim(modal_optics)
#endif
! Type of run
write(iulog,*)'Run type flag (NSREST) 0=initial, 1=restart, 3=branch ',nsrest
call restart_printopts
()
end if
!
! History file info
!
if (masterproc) then
if (inithist == '6-HOURLY' ) then
write(iulog,*)'Initial conditions history files will be written 6-hourly.'
else if (inithist == 'DAILY' ) then
write(iulog,*)'Initial conditions history files will be written daily.'
else if (inithist == 'MONTHLY' ) then
write(iulog,*)'Initial conditions history files will be written monthly.'
else if (inithist == 'YEARLY' ) then
write(iulog,*)'Initial conditions history files will be written yearly.'
else if (inithist == 'CAMIOP' ) then
write(iulog,*)'Initial conditions history files will be written for IOP.'
else if (inithist == 'ENDOFRUN' ) then
write(iulog,*)'Initial conditions history files will be written at end of run.'
else
write(iulog,*)'Initial conditions history files will not be created'
end if
!
! Write physics variables from namelist cam_inparm to std. output
!
write(iulog,9108) eps,dif2,dif4,kmxhdc,nlvdry
9108 format(' Time filter coefficient (EPS) ',f10.3,/,&
' DEL2 Horizontal diffusion coefficient (DIF2) ',e10.3/, &
' DEL4 Horizontal diffusion coefficient (DIF4) ',e10.3/, &
' Number of levels Courant limiter applied ',i10/, &
' Lowest level for dry adiabatic adjust (NLVDRY)',i10)
call radiation_printopts
()
if (dycore_is
('EUL') .or. dycore_is ('SLD')) then
if (divdampn > 0._r8) then
write(iulog,*) 'Divergence damper for spectral dycore invoked for days 0. to ',divdampn,' of this case'
elseif (divdampn < 0._r8) then
call endrun
('READ_NAMELIST: divdampn must be a positive number')
else
write(iulog,*) 'Divergence damper for spectral dycore NOT invoked'
endif
end if
if ( (adiabatic .and. ideal_phys) .or. (adiabatic .and. aqua_planet) .or. &
(ideal_phys .and. aqua_planet) ) then
call endrun
('READ_NAMELIST: Only one of ADIABATIC, IDEAL_PHYS, or AQUA_PLANET can be .true.')
end if
#ifdef COUP_SOM
if (adiabatic .or. ideal_phys .or. aqua_planet )then
call endrun
('READ_NAMELIST: adiabatic, ideal_phys or aqua_planet can not be used with SOM')
end if
#else
if (adiabatic) write(iulog,*) 'Model will run ADIABATICALLY (i.e. no physics)'
if (ideal_phys) write(iulog,*) 'Run ONLY the "idealized" dynamical core of the ', &
'model (dynamics + Held&Suarez-specified physics)'
if (aqua_planet) write(iulog,*) 'Run model in "AQUA_PLANET" mode'
#endif
end if
! set public data in cam_control_mod
moist_physics = (.not. adiabatic) .and. (.not. ideal_phys)
#ifdef PERGRO
if (masterproc) then
write(iulog,*)'pergro for cloud water is true'
end if
#endif
ntspdy = nint(86400._r8/dtime) ! no. timesteps per day
if (masterproc) then
if (doisccp) then
write(iulog,*)'ISCCP calcs (version 3.4) and history IO will be done'
else if (doisccp_38) then
write(iulog,*)'ISCCP calcs (version 3.8) and history IO will be done'
else
write(iulog,*)'ISCCP calcs and history IO will NOT be done'
end if
end if
end subroutine read_namelist
!=======================================================================
#ifdef SPMD
subroutine distnl 1,132
!-----------------------------------------------------------------------
!
! Purpose:
! Distribute namelist data to all processors.
!
! The cpp SPMD definition provides for the funnelling of all program i/o
! through the master processor. Processor 0 either reads restart/history
! data from the disk and distributes it to all processors, or collects
! data from all processors and writes it to disk.
!
!---------------------------Code history-------------------------------
!
! Original version: CCM2
! Standardized: J. Rosinski, Oct 1995
! J. Truesdale, Feb. 1996
!
!-----------------------------------------------------------------------
use mpishorthand
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
call mpibcast
(dtime, 1,mpiint,0,mpicom)
call mpibcast
(nhstpr ,ptapes,mpiint,0,mpicom)
call mpibcast
(ndens ,ptapes,mpiint,0,mpicom)
call mpibcast
(nhtfrq ,ptapes,mpiint,0,mpicom)
call mpibcast
(mfilt ,ptapes,mpiint,0,mpicom)
call mpibcast
(nsrest ,1,mpiint,0,mpicom)
call mpibcast
(kmxhdc ,1,mpiint,0,mpicom)
call mpibcast
(nlvdry ,1,mpiint,0,mpicom)
! f-v dynamics specific
call mpibcast
(nsplit ,1,mpiint,0,mpicom)
call mpibcast
(nspltrac,1,mpiint,0,mpicom)
call mpibcast
(nspltvrm,1,mpiint,0,mpicom)
call mpibcast
(iord ,1,mpiint,0,mpicom)
call mpibcast
(jord ,1,mpiint,0,mpicom)
call mpibcast
(kord ,1,mpiint,0,mpicom)
call mpibcast
(dyn_conservative,1,mpilog,0,mpicom)
call mpibcast
(filtcw ,1,mpiint,0,mpicom)
call mpibcast
(ct_overlap ,1,mpiint,0,mpicom)
call mpibcast
(trac_decomp ,1,mpiint,0,mpicom)
call mpibcast
(fft_flt ,1,mpiint,0,mpicom)
call mpibcast
(div24del2flag ,1,mpiint,0,mpicom)
call mpibcast
(del2coef ,1,mpir8,0,mpicom)
call mpibcast
(rayk0 ,1,mpiint,0,mpicom)
call mpibcast
(raykrange,1,mpir8,0,mpicom)
call mpibcast
(raytau0 ,1,mpir8,0,mpicom)
call mpibcast
(divdampn,1,mpir8,0,mpicom)
call mpibcast
(eps ,1,mpir8,0,mpicom)
call mpibcast
(dif2 ,1,mpir8,0,mpicom)
call mpibcast
(dif4 ,1,mpir8,0,mpicom)
call mpibcast
(tracers_flag,1,mpilog,0,mpicom)
call mpibcast
(readtrace ,1,mpilog,0,mpicom)
call mpibcast
(adiabatic ,1,mpilog,0,mpicom)
call mpibcast
(ideal_phys ,1,mpilog,0,mpicom)
call mpibcast
(aqua_planet ,1,mpilog,0,mpicom)
call mpibcast
(empty_htapes,1,mpilog,0,mpicom)
call mpibcast
(use_64bit_nc,1,mpilog,0,mpicom)
call mpibcast
(print_step_cost,1,mpilog,0,mpicom)
call mpibcast
(inithist_all ,1,mpilog,0,mpicom)
call mpibcast
(doisccp ,1,mpilog,0,mpicom)
call mpibcast
(doisccp_38 ,1,mpilog,0,mpicom)
call mpibcast
(pertlim ,1, mpir8, 0, mpicom )
call mpibcast
(caseid ,len(caseid) ,mpichar,0,mpicom)
call mpibcast
(avgflag_pertape, ptapes, mpichar,0,mpicom)
call mpibcast
(ctitle ,len(ctitle),mpichar,0,mpicom)
call mpibcast
(ncdata ,len(ncdata) ,mpichar,0,mpicom)
call mpibcast
(bnd_topo ,len(bnd_topo) ,mpichar,0,mpicom)
call mpibcast
(absems_data,len(absems_data),mpichar,0,mpicom)
#ifdef MODAL_AERO
call mpibcast
(modal_optics,len(modal_optics),mpichar,0,mpicom)
#endif
call mpibcast
(cam_branch_file ,len(cam_branch_file) ,mpichar,0,mpicom)
call mpibcast
(inithist,len(inithist) ,mpichar,0,mpicom)
call mpibcast
(hfilename_spec, len(hfilename_spec(1))*ptapes, mpichar, 0, mpicom)
call mpibcast
(fincl ,len(fincl (1,1))*pflds*ptapes,mpichar,0,mpicom)
call mpibcast
(fexcl ,len(fexcl (1,1))*pflds*ptapes,mpichar,0,mpicom)
call mpibcast
(fincllonlat ,len(fincllonlat (1,1))*pflds*ptapes,mpichar,0,mpicom)
call mpibcast
(fhstpr ,len(fhstpr(1,1))*pflds*ptapes,mpichar,0,mpicom)
call mpibcast
(fwrtpr ,len(fwrtpr(1,1))*pflds*ptapes,mpichar,0,mpicom)
#if (defined OFFLINE_DYN)
!
! Offline dynamics parameters
!
call mpibcast
(met_data_file ,len(met_data_file) ,mpichar,0,mpicom)
call mpibcast
(met_remove_file ,1 ,mpilog, 0, mpicom )
call mpibcast
(met_cell_wall_winds,1 ,mpilog, 0, mpicom )
call mpibcast
(met_filenames_list ,len(met_filenames_list),mpichar,0,mpicom)
call mpibcast
(met_rlx_top, 1 ,mpir8, 0, mpicom )
call mpibcast
(met_rlx_bot, 1 ,mpir8, 0, mpicom )
call mpibcast
(met_max_rlx, 1 ,mpir8, 0, mpicom )
call mpibcast
(met_fix_mass, 1 ,mpilog, 0, mpicom )
call mpibcast
(met_qflx_name ,len(met_qflx_name), mpichar,0,mpicom)
call mpibcast
(met_shflx_name ,len(met_shflx_name), mpichar,0,mpicom)
call mpibcast
(met_qflx_factor ,1, mpir8, 0, mpicom )
call mpibcast
(met_shflx_factor ,1, mpir8, 0, mpicom )
#endif
!
! Orbital stuff
!
call mpibcast
(eccen ,1 ,mpir8 ,0,mpicom)
call mpibcast
(obliqr ,1 ,mpir8 ,0,mpicom)
call mpibcast
(mvelpp ,1 ,mpir8 ,0,mpicom)
call mpibcast
(lambm0 ,1 ,mpir8 ,0,mpicom)
call mpibcast
(indirect , 1 ,mpilog, 0,mpicom)
! spmd_dyn
if ( dycore_is
('LR') ) then
call mpibcast
(npr_yz ,4,mpiint,0,mpicom)
call mpibcast
(geopktrans ,1,mpiint,0,mpicom)
call mpibcast
(geopkblocks ,1,mpiint,0,mpicom)
call mpibcast
(force_2d ,1,mpiint,0,mpicom)
call mpibcast
(modcomm_transpose ,1,mpiint,0,mpicom)
call mpibcast
(modcomm_geopk ,1,mpiint,0,mpicom)
call mpibcast
(modcomm_gatscat ,1,mpiint,0,mpicom)
call mpibcast
(modc_sw_dynrun ,1,mpiint,0,mpicom)
call mpibcast
(modc_hs_dynrun ,1,mpilog,0,mpicom)
call mpibcast
(modc_send_dynrun ,1,mpilog,0,mpicom)
call mpibcast
(modc_mxreq_dynrun ,1,mpiint,0,mpicom)
call mpibcast
(modc_sw_cdcore ,1,mpiint,0,mpicom)
call mpibcast
(modc_hs_cdcore ,1,mpilog,0,mpicom)
call mpibcast
(modc_send_cdcore ,1,mpilog,0,mpicom)
call mpibcast
(modc_mxreq_cdcore ,1,mpiint,0,mpicom)
call mpibcast
(modc_sw_gather ,1,mpiint,0,mpicom)
call mpibcast
(modc_hs_gather ,1,mpilog,0,mpicom)
call mpibcast
(modc_send_gather ,1,mpilog,0,mpicom)
call mpibcast
(modc_mxreq_gather ,1,mpiint,0,mpicom)
call mpibcast
(modc_sw_scatter ,1,mpiint,0,mpicom)
call mpibcast
(modc_hs_scatter ,1,mpilog,0,mpicom)
call mpibcast
(modc_send_scatter ,1,mpilog,0,mpicom)
call mpibcast
(modc_mxreq_scatter,1,mpiint,0,mpicom)
call mpibcast
(modc_sw_tracer ,1,mpiint,0,mpicom)
call mpibcast
(modc_hs_tracer ,1,mpilog,0,mpicom)
call mpibcast
(modc_send_tracer ,1,mpilog,0,mpicom)
call mpibcast
(modc_mxreq_tracer ,1,mpiint,0,mpicom)
call mpibcast
(modc_onetwo ,1,mpiint,0,mpicom)
call mpibcast
(modc_tracers ,1,mpiint,0,mpicom)
endif
if ( dycore_is
('EUL') .or. dycore_is ('SLD') ) then
call mpibcast
(dyn_alltoall ,1,mpiint,0,mpicom)
call mpibcast
(dyn_allgather ,1,mpiint,0,mpicom)
call mpibcast
(dyn_equi_by_col,1,mpilog,0,mpicom)
call mpibcast
(dyn_npes ,1,mpiint,0,mpicom)
call mpibcast
(dyn_npes_stride,1,mpiint,0,mpicom)
endif
! Physics chunk tuning
call mpibcast
(phys_loadbalance ,1,mpiint,0,mpicom)
call mpibcast
(phys_twin_algorithm,1,mpiint,0,mpicom)
call mpibcast
(phys_alltoall ,1,mpiint,0,mpicom)
call mpibcast
(phys_chnk_per_thd ,1,mpiint,0,mpicom)
! Reproducible sum options
call mpibcast
(repro_sum_use_ddpdd,1,mpilog,0,mpicom)
call mpibcast
(repro_sum_rel_diff_max,1,mpir8,0,mpicom)
call mpibcast
(repro_sum_recompute,1,mpilog,0,mpicom)
! Interprocessor communication tuning
call mpibcast
(swap_comm_protocol,1,mpiint,0,mpicom)
call mpibcast
(swap_comm_maxreq,1,mpiint,0,mpicom)
call mpibcast
(fc_gather_flow_cntl,1,mpiint,0,mpicom)
! Physics buffer
call mpibcast
(pbuf_global_allocate, 1, mpilog, 0, mpicom)
! Diagnostic options
call mpibcast
(diag_cnst_conv_tend, len(diag_cnst_conv_tend), mpichar, 0, mpicom)
! Conservation
call mpibcast
(print_energy_errors, 1, mpilog, 0, mpicom)
! Radiative heating calculation
call mpibcast
(iradsw, 1, mpiint, 0, mpicom)
call mpibcast
(iradlw, 1, mpiint, 0, mpicom)
call mpibcast
(iradae, 1, mpiint, 0, mpicom)
call mpibcast
(irad_always,1, mpiint, 0, mpicom)
#if (defined WACCM_PHYS)
! iondrag / efield options
call mpibcast
(efield_lflux_file, len(efield_lflux_file), mpichar, 0, mpicom)
call mpibcast
(efield_hflux_file, len(efield_hflux_file), mpichar, 0, mpicom)
call mpibcast
(efield_wei96_file, len(efield_wei96_file), mpichar, 0, mpicom)
! qbo variables
call mpibcast
(qbo_forcing_file, len(qbo_forcing_file ), mpichar, 0, mpicom)
call mpibcast
(qbo_use_forcing, 1, mpilog, 0, mpicom)
call mpibcast
(qbo_cyclic, 1, mpilog, 0, mpicom)
#endif
end subroutine distnl
#endif
subroutine preset 1,2
!-----------------------------------------------------------------------
!
! Purpose: Preset namelist CAM_INPARM input variables and initialize some other variables
!
! Method: Hardwire the values
!
! Author: CCM Core Group
!
!-----------------------------------------------------------------------
use cam_history
, only: fincl, fexcl, fhstpr, fwrtpr,fincllonlat
use rgrid
!-----------------------------------------------------------------------
include 'netcdf.inc'
!-----------------------------------------------------------------------
!
! Preset character history variables here because module initialization of character arrays
! does not work on all machines
! $$$ TBH: is this still true? 12/14/03
!
fincl(:,:) = ' '
fincllonlat(:,:) = ' '
fexcl(:,:) = ' '
fhstpr(:,:) = ' '
fwrtpr(:,:) = ' '
!
! Flags
!
print_step_cost = .false. ! print per timestep cost info
!
! Numerical scheme default values
!
eps = 0.06_r8
nlvdry = 3
!
! No divergence damping
!
divdampn = 0._r8
!
! rgrid: set default to full grid
!
nlon(:) = plon
!!
!! Unit numbers: set to invalid
!!
! ncid_ini = -1
! ncid_sst = -1
! ncid_trc = -1
!
! /perturb/
!
pertlim = 0.0_r8
return
end subroutine preset
end module runtime_opts