1 #ifndef ERF_TWO_STREAM_RADIATION_H_
2 #define ERF_TWO_STREAM_RADIATION_H_
7 #include <AMReX_BoxArray.H>
8 #include <AMReX_DistributionMapping.H>
9 #include <AMReX_Geometry.H>
10 #include <AMReX_MultiFab.H>
11 #include <AMReX_REAL.H>
12 #include <AMReX_Vector.H>
54 void resize (
int nlevs_max);
63 return (lev >= 0 && lev <
static_cast<int>(
m_t_sfc.size()))
92 const amrex::BoxArray& ba2d,
93 const amrex::DistributionMapping& dm,
94 const amrex::BoxArray& ba,
95 const amrex::Box& domain,
96 bool supply_land_forcing =
false);
145 const std::string& call_site,
146 const amrex::MultiFab& cons_old,
147 const amrex::MultiFab* z_phys_nd,
148 const amrex::Geometry& geom,
150 const amrex::Vector<const amrex::MultiFab*>& radiation_inputs,
152 amrex::MultiFab* qheating,
153 amrex::MultiFab* rad_fluxes,
154 const amrex::MultiFab* t_surf,
155 const amrex::MultiFab* sfc_sens_flux,
156 const amrex::MultiFab* sfc_laten_flux,
157 const amrex::MultiFab* lat_m,
158 const amrex::MultiFab* lon_m,
184 [[nodiscard]]
const amrex::MultiFab*
seb_hfx (
int lev)
const {
187 [[nodiscard]]
const amrex::MultiFab*
seb_lh (
int lev)
const {
242 amrex::MultiFab* sw_flux_dn,
243 amrex::MultiFab* lw_flux_dn,
244 amrex::MultiFab* cos_zenith_angle)
const;
264 return lev >= 0 && lev < static_cast<int>(
m_canopy.size()) &&
m_canopy[lev] !=
nullptr;
329 amrex::Vector<std::unique_ptr<RadiationDiagnostics>>
m_diag;
332 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_alb_sw;
334 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_t_sfc;
339 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_hfx_sfc;
340 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_lh_sfc;
342 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_q_sfc;
343 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_t_deep;
344 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_q_deep;
358 amrex::Vector<std::unique_ptr<amrex::MultiFab>>
m_canopy;
constexpr amrex::Real RdoCp
Definition: ERF_Constants.H:53
const Real rdOcp
Definition: ERF_InitCustomPert_ABL.H:72
Radiation model type and control parameters.
Radiation module diagnostic output and CSV logging.
amrex::Real Real
Definition: ERF_ShocInterface.H:19
What the two-stream sweep hands the building faces of the immersed-boundary surface energy balance (e...
constexpr amrex::Real two_stream_tsi_reference
RRTMGP's reference total solar irradiance [W/m^2], scaled by the date's Earth-Sun distance factor.
Definition: ERF_TwoStreamRadiation.H:380
TwoStreamSunDate two_stream_sun_date(const RadChoice &rc, TwoStreamRadiation::OrbitalCache &orbit, double epoch_time)
The calendar sun of the two-stream model at a UTC epoch time (start_time + t).
Definition: ERF_TwoStreamRadiation.cpp:100
void copy_surface_plane(const amrex::MultiFab &src2d, amrex::MultiFab &dst)
Copy a 2D field (k = 0 only) into the k = 0 plane of a surface-model field.
Wrapper class for managing land surface models across AMR levels.
Definition: ERF_LandSurface.H:19
The two-stream radiation model (erf.radiation_model = TwoStream).
Definition: ERF_TwoStreamRadiation.H:49
void write_land_forcing(int lev, amrex::MultiFab *sw_flux_dn, amrex::MultiFab *lw_flux_dn, amrex::MultiFab *cos_zenith_angle) const
Copy the surface forcing of the last sweep on lev into a land-surface model's radiation inputs (Surfa...
Definition: ERF_TwoStreamRadiation.cpp:482
bool supplies_canopy_forcing(int lev) const noexcept
True when supply_canopy_forcing() was called for lev since its last define_level().
Definition: ERF_TwoStreamRadiation.H:263
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_canopy_cosz
Definition: ERF_TwoStreamRadiation.H:359
bool supplies_land_forcing(int lev) const noexcept
True when define_level allocated the land-model forcing fields on lev.
Definition: ERF_TwoStreamRadiation.H:213
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_q_sfc
Definition: ERF_TwoStreamRadiation.H:342
const amrex::MultiFab * seb_hfx(int lev) const
The sensible and latent heat fluxes [W/m^2] the surface energy balance of one level last used,...
Definition: ERF_TwoStreamRadiation.H:184
amrex::MultiFab * seb_q_sfc(int lev)
Definition: ERF_TwoStreamRadiation.H:175
TwoStreamRadiation()=default
void read_checkpoint(int lev, const std::string &restart_chkfile)
Read it back when the checkpoint carries it; else keep defaults.
Definition: ERF_TwoStreamRadiation.cpp:516
void define_level(int lev, const RadChoice &rad_choice, amrex::Real rdOcp, const amrex::BoxArray &ba2d, const amrex::DistributionMapping &dm, const amrex::BoxArray &ba, const amrex::Box &domain, bool supply_land_forcing=false)
Allocate the 2D surface fields of one level on the given horizontal BoxArray and fill them with the s...
Definition: ERF_TwoStreamRadiation.cpp:258
void supply_canopy_forcing(int lev, int m_top)
Have every later sweep on lev write what the building faces need besides the interface fluxes (erf....
Definition: ERF_TwoStreamRadiation.cpp:362
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_canopy
Definition: ERF_TwoStreamRadiation.H:358
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_grdflx_sfc
Definition: ERF_TwoStreamRadiation.H:341
void write_checkpoint(int lev, const std::string &checkpointname) const
Write the prognostic surface state of one level (SEB on).
Definition: ERF_TwoStreamRadiation.cpp:496
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_lw_flux_sfc
Definition: ERF_TwoStreamRadiation.H:338
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_moisture
Definition: ERF_TwoStreamRadiation.H:345
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_q_deep
Definition: ERF_TwoStreamRadiation.H:344
const amrex::MultiFab * seb_surface_moisture(int lev)
What level lev's surface hands the surface layer for its surface mixing ratio (erf....
Definition: ERF_TwoStreamRadiation.cpp:405
amrex::MultiFab * seb_t_sfc(int lev)
The prognostic surface state of one level, or nullptr when the SEB is off or the level has not been b...
Definition: ERF_TwoStreamRadiation.H:172
amrex::Real m_rdOcp
Definition: ERF_TwoStreamRadiation.H:321
amrex::Vector< FluxDiag > m_flux_diag
Definition: ERF_TwoStreamRadiation.H:363
bool active() const
True once a level has been defined with the model selected.
Definition: ERF_TwoStreamRadiation.H:57
const amrex::MultiFab * seb_lh(int lev) const
Definition: ERF_TwoStreamRadiation.H:187
const amrex::MultiFab * land_forcing_lw_dn(int lev) const noexcept
Definition: ERF_TwoStreamRadiation.H:227
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_emiss_lw
Definition: ERF_TwoStreamRadiation.H:333
void resize(int nlevs_max)
Size the per-level containers; no allocation happens here.
Definition: ERF_TwoStreamRadiation.cpp:232
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_t_sfc
Definition: ERF_TwoStreamRadiation.H:334
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_lw_dn_sfc
Definition: ERF_TwoStreamRadiation.H:352
const amrex::MultiFab * land_forcing_sw_dn(int lev) const noexcept
The surface forcing of the last sweep on lev (2D: i,j), or nullptr when the level does not supply it:...
Definition: ERF_TwoStreamRadiation.H:224
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_lh_sfc
Definition: ERF_TwoStreamRadiation.H:340
TwoStreamCanopyView canopy_forcing(int lev, int nstep) const noexcept
The beam and the cosine of the zenith of lev as the sweep of step nstep wrote them (the view's fluxes...
Definition: ERF_TwoStreamRadiation.H:274
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_alb_sw
Definition: ERF_TwoStreamRadiation.H:332
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_sw_flux_sfc
Definition: ERF_TwoStreamRadiation.H:337
const amrex::MultiFab * prognostic_surface_temperature_state(int lev) const noexcept
Read-only view of the per-level prognostic surface-temperature state.
Definition: ERF_TwoStreamRadiation.H:62
OrbitalCache m_orbit
Definition: ERF_TwoStreamRadiation.H:322
void advance(int lev, int nstep, amrex::Real time, amrex::Real dt_step, const std::string &call_site, const amrex::MultiFab &cons_old, const amrex::MultiFab *z_phys_nd, const amrex::Geometry &geom, LandSurface &lsm, const amrex::Vector< const amrex::MultiFab * > &radiation_inputs, bool noahmp_active, amrex::MultiFab *qheating, amrex::MultiFab *rad_fluxes, const amrex::MultiFab *t_surf, const amrex::MultiFab *sfc_sens_flux, const amrex::MultiFab *sfc_laten_flux, const amrex::MultiFab *lat_m, const amrex::MultiFab *lon_m, double epoch_time, bool have_datetime)
One radiation call at one level.
Definition: ERF_TwoStreamRadiation.cpp:536
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_t_deep
Definition: ERF_TwoStreamRadiation.H:343
amrex::Vector< std::unique_ptr< RadiationDiagnostics > > m_diag
Definition: ERF_TwoStreamRadiation.H:329
bool seb_prognostic_active() const
True when the force-restore state is being evolved and so needs transferring.
Definition: ERF_TwoStreamRadiation.H:208
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_sw_dn_sfc
Definition: ERF_TwoStreamRadiation.H:351
const amrex::MultiFab * land_forcing_cos_zenith(int lev) const noexcept
Definition: ERF_TwoStreamRadiation.H:230
const RadChoice * m_rad
Definition: ERF_TwoStreamRadiation.H:320
amrex::Vector< int > m_canopy_step
Definition: ERF_TwoStreamRadiation.H:361
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_hfx_sfc
Definition: ERF_TwoStreamRadiation.H:339
amrex::Vector< int > m_canopy_m
Definition: ERF_TwoStreamRadiation.H:360
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_cos_zenith
Definition: ERF_TwoStreamRadiation.H:353
constexpr std::array< amrex::Real, num_veg_params > rc
Definition: ERF_SLM_DefaultParams.H:22
Container holding radiation-related choices and parameters.
Definition: ERF_RadStruct.H:86
bool seb_prognostic_enable
Enable prognostic SEB surface temperature and moisture evolution. When true, integrates SEB residual ...
Definition: ERF_RadStruct.H:550
bool seb_enable
Master switch for simplified SEB infrastructure. When false (default), no SEB MultiFabs are allocated...
Definition: ERF_RadStruct.H:377
bool enabled
True when erf.radiation_model = TwoStream. Set by init_params from the model SolverChoice read; the e...
Definition: ERF_RadStruct.H:92
The fields a level's faces read for one step: the beam and the cosine of the zenith the sweep of that...
Definition: ERF_TwoStreamCanopyForcing.H:45
const amrex::MultiFab * beam
Direct beam on a horizontal surface, interfaces 0 .. m_top [W/m^2].
Definition: ERF_TwoStreamCanopyForcing.H:46
const amrex::MultiFab * cos_zenith
Cosine of the zenith of the sweep, floored at zero (2D) [1].
Definition: ERF_TwoStreamCanopyForcing.H:47
Definition: ERF_TwoStreamRadiation.H:305
amrex::Real LW_net_surface
Definition: ERF_TwoStreamRadiation.H:315
amrex::Real SW_TOA
Definition: ERF_TwoStreamRadiation.H:313
amrex::Real SW_surface
Definition: ERF_TwoStreamRadiation.H:312
amrex::Real heating_rate_max
Definition: ERF_TwoStreamRadiation.H:317
bool valid
Definition: ERF_TwoStreamRadiation.H:311
amrex::Real LW_up_TOA
Definition: ERF_TwoStreamRadiation.H:316
amrex::Real SW_up_TOA
Definition: ERF_TwoStreamRadiation.H:314
Definition: ERF_TwoStreamRadiation.H:293
bool noted_unscaled
Definition: ERF_TwoStreamRadiation.H:299
double obliqr
Definition: ERF_TwoStreamRadiation.H:296
int year
Definition: ERF_TwoStreamRadiation.H:294
double lambm0
Definition: ERF_TwoStreamRadiation.H:297
double mvelpp
Definition: ERF_TwoStreamRadiation.H:298
double eccen
Definition: ERF_TwoStreamRadiation.H:295
The calendar sun of the two-stream model at one time (see two_stream_sun_date()).
Definition: ERF_TwoStreamRadiation.H:383
double eccf
Earth-Sun distance factor (d0/d)^2.
Definition: ERF_TwoStreamRadiation.H:386
double declin
Solar declination [rad].
Definition: ERF_TwoStreamRadiation.H:385
double calday
Day of the year (1 = 1 January), UTC time of day as the fraction.
Definition: ERF_TwoStreamRadiation.H:384