1 #ifndef ERF_RAD_STRUCT_H_
2 #define ERF_RAD_STRUCT_H_
8 #include <AMReX_ParmParse.H>
9 #include <AMReX_ParallelDescriptor.H>
10 #include <AMReX_Print.H>
11 #include <AMReX_Gpu.H>
43 AMREX_ENUM(AerosolProfileType, Constant, Exponential, Table);
79 void read (
const std::string& prefix)
81 amrex::ParmParse
pp(prefix);
82 pp.queryAdd(
"fixed_solar_zenith_angle",
fixed_mu);
86 if (!std::isfinite(
latitude) || latitude < -90.0 || latitude > 90.0) {
87 amrex::Abort(
"erf.rad_cons_lat = " + std::to_string(
latitude) +
88 " must lie in [-90, 90] degrees.");
90 if (!std::isfinite(
longitude) || longitude < -180.0 || longitude > 180.0) {
91 amrex::Abort(
"erf.rad_cons_lon = " + std::to_string(
longitude) +
92 " must lie in [-180, 180] degrees.");
95 amrex::Abort(
"erf.fixed_solar_zenith_angle = " + std::to_string(
fixed_mu) +
96 " is the cosine of the solar zenith angle and cannot exceed 1; 60 degrees is 0.5.");
876 if (amrex::ParallelDescriptor::IOProcessor()) {
877 amrex::Print() <<
"WARNING: erf.radiation." << key <<
" = " << value
878 <<
" is below its minimum " <<
lo <<
"; using " <<
lo <<
"\n";
886 if (amrex::ParallelDescriptor::IOProcessor()) {
887 amrex::Print() <<
"WARNING: erf.radiation." << key <<
" = " << value
888 <<
" is above its maximum " <<
hi <<
"; using " <<
hi <<
"\n";
895 if (!std::isfinite(value) || value <= 0.0) {
896 if (amrex::ParallelDescriptor::IOProcessor()) {
897 amrex::Print() <<
"WARNING: erf.radiation." << key <<
" = " << value
898 <<
" must be positive; using " << fallback <<
"\n";
904 void init_params (
bool two_stream_selected, std::string pp_prefix)
906 amrex::ParmParse
pp(pp_prefix);
929 static const char* retired_keys[][2] = {
930 {
"radiation.solar_zenith",
931 "erf.fixed_solar_zenith_angle, which is the cosine of the angle (60 degrees is 0.5)"},
932 {
"radiation.solar_zenith_deg",
933 "erf.fixed_solar_zenith_angle, which is the cosine of the angle (60 degrees is 0.5)"},
934 {
"radiation.S0",
"erf.fixed_total_solar_irradiance"},
935 {
"radiation.earth_sun_distance_enable",
936 "nothing: leave erf.fixed_total_solar_irradiance unset and the irradiance follows the date"},
937 {
"radiation.surface_temp_k",
"erf.rad_t_sfc"},
938 {
"radiation.solar_geometry_dynamic_enable",
939 "nothing: leave erf.fixed_solar_zenith_angle unset and the sun follows start_datetime"},
940 {
"radiation.latitude_deg",
"erf.rad_cons_lat"},
941 {
"radiation.longitude_deg",
"erf.rad_cons_lon"},
942 {
"radiation.day_of_year",
"start_datetime"},
943 {
"radiation.time_zone_offset_hours",
944 "nothing: start_datetime is UTC and the longitude sets the local solar time"},
946 for (
const auto& entry : retired_keys) {
947 if (
pp.contains(entry[0])) {
948 amrex::Abort(std::string(
"erf.") + entry[0] +
" is no longer read by the "
949 "two-stream model; use " + entry[1] +
".");
955 " is the cosine of the solar zenith angle (as for RRTMGP) and cannot "
956 "exceed 1; 60 degrees is 0.5.");
960 amrex::Abort(
"erf.radiation_model = TwoStream needs erf.rad_t_sfc, the surface "
961 "temperature [K] used where no land-surface model or surface layer "
962 "supplies one (the same input RRTMGP requires).");
965 amrex::Abort(
"erf.rad_t_sfc = " + std::to_string(
rad_t_sfc) +
" must be a positive temperature [K].");
969 if (!std::isfinite(
rad_cons_lat) || rad_cons_lat < -90.0 || rad_cons_lat > 90.0) {
970 amrex::Abort(
"erf.rad_cons_lat = " + std::to_string(
rad_cons_lat) +
" must lie in [-90, 90] degrees.");
972 if (!std::isfinite(
rad_cons_lon) || rad_cons_lon < -180.0 || rad_cons_lon > 180.0) {
973 amrex::Abort(
"erf.rad_cons_lon = " + std::to_string(
rad_cons_lon) +
" must lie in [-180, 180] degrees.");
979 if (
pp.contains(
"rad_freq_in_steps") && amrex::ParallelDescriptor::IOProcessor()) {
980 amrex::Print() <<
"WARNING: erf.rad_freq_in_steps is not read by the two-stream model, "
981 "which runs every step.\n";
983 std::string tau_model_str =
"per_layer";
984 pp.query(
"radiation.tau_model", tau_model_str);
985 if (tau_model_str ==
"per_layer") {
987 }
else if (tau_model_str ==
"mass") {
993 if (amrex::ParallelDescriptor::IOProcessor()) {
994 amrex::Print() <<
"WARNING: unknown erf.radiation.tau_model '"
995 << tau_model_str <<
"'; valid values are per_layer "
996 "and mass. Using per_layer.\n";
1025 std::string tau_profile_type_str =
"constant";
1026 pp.query(
"radiation.tau_profile_type", tau_profile_type_str);
1027 if (tau_profile_type_str ==
"constant") {
1029 }
else if (tau_profile_type_str ==
"cloud_layer") {
1034 if (amrex::ParallelDescriptor::IOProcessor()) {
1035 amrex::Print() <<
"WARNING: unknown erf.radiation.tau_profile_type '"
1036 << tau_profile_type_str <<
"'; valid values are "
1037 "constant and cloud_layer. Using constant, so no "
1038 "cloud layer is applied.\n";
1086 if (amrex::ParallelDescriptor::IOProcessor()) {
1087 amrex::Print() <<
"WARNING: unknown erf.radiation.diag_callsite_mode '"
1089 "pre_only and post_only. Using both.\n";
1146 " must be positive [kg/kg].");
1154 std::string aerosol_profile_type_str =
"constant";
1155 pp.query(
"radiation.aerosol_profile_type", aerosol_profile_type_str);
1156 if (aerosol_profile_type_str ==
"constant") {
1158 }
else if (aerosol_profile_type_str ==
"exponential") {
1160 }
else if (aerosol_profile_type_str ==
"table") {
1165 if (amrex::ParallelDescriptor::IOProcessor()) {
1166 amrex::Print() <<
"WARNING: erf.radiation.aerosol_profile_type = table is "
1167 "not implemented and contributes no aerosol optical "
1168 "depth. Use constant or exponential.\n";
1173 if (amrex::ParallelDescriptor::IOProcessor()) {
1174 amrex::Print() <<
"WARNING: unknown erf.radiation.aerosol_profile_type '"
1175 << aerosol_profile_type_str <<
"'; valid values are "
1176 "constant and exponential. Using constant.\n";
1199 pp.query_enum_sloppy(
"radiation.seb_turbulent_flux_source",
1203 pp.query(
"radiation.seb_turbulent_flux_source", value);
1204 amrex::Abort(
"erf.radiation.seb_turbulent_flux_source must be surface_layer "
1205 "or defaults, not '" + value +
"'");
1213 if (
pp.contains(
"radiation.seb_soil_moisture_wilt") ||
1214 pp.contains(
"radiation.seb_soil_moisture_fc")) {
1215 amrex::Abort(
"erf.radiation.seb_soil_type sets the wilting point and field "
1216 "capacity from Noah-MP's soil table; do not also give "
1217 "seb_soil_moisture_wilt or seb_soil_moisture_fc");
1221 amrex::Abort(
"erf.radiation.seb_soil_type = " + std::to_string(
seb_soil_type) +
1222 " is not a Noah-MP soil category with a field capacity above its "
1223 "wilting point (1-19, not 14, water; see ERF_NoahMPSoilTable.H)");
1233 if (veg ==
nullptr) {
1234 amrex::Abort(
"erf.radiation.seb_vegetation_type = " + std::to_string(
seb_vegetation_type) +
1235 " is not a Noah-MP MODIS land-use category (1-20; see "
1236 "ERF_NoahMPVegetationTable.H)");
1240 if (!(veg->
z0 > 0.0)) {
1241 amrex::Abort(
"erf.radiation.seb_vegetation_type = " + std::to_string(
seb_vegetation_type) +
1242 " has no vegetation in Noah-MP's table (Z0MVT = 0, LAI 0 all year). "
1243 "For bare land leave seb_vegetation_type at 0: the soil's resistance "
1244 "and roughness (Z0SOIL) then apply.");
1247 amrex::Abort(
"erf.radiation.seb_vegetation_type needs "
1248 "erf.radiation.seb_surface_layer_uses_moisture = true and "
1249 "erf.radiation.seb_soil_type (the bare-soil resistance uses the "
1250 "soil's porosity and Clapp-Hornberger b)");
1254 amrex::Abort(
"erf.radiation.seb_vegetation_fraction must be in [0, 1]; got " +
1257 if (
pp.contains(
"radiation.seb_leaf_area_index")) {
1259 amrex::Abort(
"erf.radiation.seb_leaf_area_index must be >= 0; got " +
1266 amrex::ParmParse pp_top;
1268 if (!pp_top.query(
"start_datetime", start) ||
1270 amrex::Abort(
"erf.radiation.seb_vegetation_type: give "
1271 "erf.radiation.seb_leaf_area_index, or a valid start_datetime "
1272 "(YYYY-MM-DD HH:MM:SS) so that it can be taken from the table");
1276 if (amrex::ParallelDescriptor::IOProcessor()) {
1277 amrex::Print() <<
"NOTE: erf.radiation.seb_leaf_area_index = "
1280 <<
", fixed for the run.\n";
1314 if (amrex::ParallelDescriptor::IOProcessor()) {
1315 amrex::Print() <<
"NOTE: erf.radiation.seb_prognostic_enable = true "
1316 "also enables seb_enable and "
1317 "seb_diagnostic_enable, which it depends on.\n";
1344 amrex::Abort(
"erf.radiation.seb_surface_layer_uses_skin = true needs "
1345 "erf.radiation.seb_prognostic_enable = true: without it the "
1346 "skin temperature does not evolve");
1349 amrex::Abort(
"erf.radiation.seb_surface_layer_uses_skin = true needs "
1350 "erf.radiation.seb_turbulent_flux_source = surface_layer: the "
1351 "balance must remove the heat flux the surface layer computes "
1360 pp.contains(
"radiation.seb_soil_moisture_fc")) {
1364 amrex::Abort(
"erf.radiation.seb_soil_moisture_wilt and seb_soil_moisture_fc must "
1365 "satisfy 0 <= wilt < fc <= 1 (volumetric water contents); got wilt = " +
1373 (
pp.contains(
"radiation.seb_soil_moisture_wilt") ||
1374 pp.contains(
"radiation.seb_soil_moisture_fc"))) {
1375 amrex::Abort(
"erf.radiation.seb_soil_moisture_wilt and seb_soil_moisture_fc are used "
1376 "only with erf.radiation.seb_surface_layer_uses_moisture = true");
1379 (
pp.contains(
"radiation.seb_vegetation_fraction") ||
1380 pp.contains(
"radiation.seb_leaf_area_index"))) {
1381 amrex::Abort(
"erf.radiation.seb_vegetation_fraction and seb_leaf_area_index are used "
1382 "only with erf.radiation.seb_vegetation_type");
1387 amrex::Abort(
"erf.radiation.seb_surface_layer_uses_moisture = true needs "
1388 "erf.radiation.seb_surface_layer_uses_skin = true: the surface "
1389 "mixing ratio is the saturation value at the balance's skin "
1393 amrex::ParallelDescriptor::IOProcessor()) {
1394 amrex::Print() <<
"NOTE: erf.radiation.seb_surface_layer_uses_moisture: the soil "
1395 "starts at or below the wilting point (seb_q_sfc_default = "
1399 ?
"no transpiration, and the bare soil's pore air is nearly "
1400 "dry (Noah-MP's relative humidity exp(psi g / (R_v T))), so it "
1401 "hardly evaporates and may take up vapour."
1402 :
"no evaporation at all.")
1403 <<
" Set seb_q_sfc_default (and seb_q_deep_default, which q_s "
1404 "restores to) to the soil's water content if that is not meant.\n";
1409 amrex::ParallelDescriptor::IOProcessor()) {
1410 amrex::Print() <<
"NOTE: erf.radiation.seb_surface_layer_uses_moisture: "
1413 <<
"), and q_s restores toward it over seb_moisture_restore_timescale_s"
1415 " Set seb_q_deep_default to the deep soil's water content if that "
1424 amrex::ParallelDescriptor::IOProcessor()) {
1425 amrex::Print() <<
"WARNING: erf.radiation.seb_grdflx_default = " <<
seb_grdflx_default
1426 <<
" with seb_prognostic_enable: the force-restore term already "
1427 "carries the ground heat flux, so this counts it twice.\n";
1434 if (!(std::isfinite(value) && value > 0.0)) {
1435 amrex::Abort(std::string(
"erf.radiation.") +
name +
" must be > 0; got " +
1436 std::to_string(value));
1455 "erf.radiation.seb_*: the land roughness from Noah-MP's tables is not positive");
1465 const bool given =
pp.contains(
"radiation.seb_surface_heat_capacity");
1467 if (amrex::ParallelDescriptor::IOProcessor()) {
1468 amrex::Print() <<
"NOTE: erf.radiation.seb_surface_heat_capacity = "
1470 << (given ?
" as given; Noah-MP soil category " :
1471 ", from Noah-MP soil category ")
1473 <<
" (heat capacity " << c <<
" J/m^3/K, conductivity " << lambda
1475 << (given ?
" gives " + std::to_string(
derived) : std::string())
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(axis >=0 &&axis< AMREX_SPACEDIM, "prob.axis must be 0, 1 or 2")
Noah-MP's soil parameters by soil category, for the two-stream surface energy balance (erf....
constexpr amrex::Real noahmp_soil_roughness
Definition: ERF_NoahMPSoilTable.H:42
const NoahMPSoilParams * noahmp_soil_params(int category) noexcept
The parameters of STAS soil category category (1-19), as Noah-MP reads them.
Definition: ERF_NoahMPSoilTable.H:49
constexpr amrex::Real noahmp_soil_heat_capacity
Definition: ERF_NoahMPSoilTable.H:35
Noah-MP's canopy-resistance parameters, roughness length and monthly leaf area index by land-use cate...
amrex::Real noahmp_leaf_area_index(const NoahMPVegetationParams ¶ms, amrex::Real day, amrex::Real days_in_year, bool southern) noexcept
Leaf area index of params on day of year day, interpolated between the monthly values as Noah-MP does...
Definition: ERF_NoahMPVegetationTable.H:98
const NoahMPVegetationParams * noahmp_vegetation_params(int category) noexcept
The parameters of MODIS land-use category category (1-20), as Noah-MP reads them.
Definition: ERF_NoahMPVegetationTable.H:41
bool noahmp_day_of_year(const std::string &datetime, amrex::Real &day, amrex::Real &days_in_year)
The day of the year, as Noah-MP counts it, of a date "YYYY-MM-DD[ HH:MM[:SS]]" (ERF's start_datetime)...
Definition: ERF_NoahMPVegetationTable.H:130
std::string name
Definition: ERF_Plotfile2DCatalog.cpp:116
AMREX_ENUM(TauProfileType, Constant, CloudLayer)
Optical depth profile type for the two-stream solver.
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Simplified SEB – the two-stream model's surface energy balance, as pure functions.
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real seb_soil_thermal_conductivity(amrex::Real theta, amrex::Real theta_sat, amrex::Real quartz)
Thermal conductivity of unfrozen soil [W/m/K], Noah-MP's Johansen form (SoilThermalPropertyMod): soli...
Definition: ERF_SimplifiedSEB.H:352
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real seb_force_restore_heat_capacity(amrex::Real lambda, amrex::Real c, amrex::Real tau)
Surface heat capacity [J/m^2/K] of the force-restore balance for a soil of volumetric heat capacity c...
Definition: ERF_SimplifiedSEB.H:374
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real seb_soil_heat_capacity(amrex::Real theta, amrex::Real theta_sat, amrex::Real c_soil)
Volumetric heat capacity of unfrozen soil [J/m^3/K], as Noah-MP forms it (SoilThermalPropertyMod): wa...
Definition: ERF_SimplifiedSEB.H:338
Definition: ERF_SurfaceLayer.H:60
@ theta
Definition: ERF_Kessler.H:26
@ tmp
Definition: ERF_AdvanceWSM6.cpp:116
Definition: ERF_Derive.cpp:172
Definition: ERF_NoahMPSoilTable.H:20
amrex::Real smc_ref
REFSMC reference soil moisture, field capacity [m^3/m^3].
Definition: ERF_NoahMPSoilTable.H:24
amrex::Real smc_wilt
WLTSMC wilting point [m^3/m^3].
Definition: ERF_NoahMPSoilTable.H:27
amrex::Real smc_max
MAXSMC saturated soil moisture (porosity) [m^3/m^3].
Definition: ERF_NoahMPSoilTable.H:23
amrex::Real quartz
QTZ quartz fraction [1].
Definition: ERF_NoahMPSoilTable.H:28
Definition: ERF_NoahMPVegetationTable.H:23
amrex::Real z0
Z0MVT momentum roughness length of the vegetation [m].
Definition: ERF_NoahMPVegetationTable.H:29
Definition: ERF_RadStruct.H:73
amrex::Real fixed_mu
Definition: ERF_RadStruct.H:74
amrex::Real latitude
Definition: ERF_RadStruct.H:75
void read(const std::string &prefix)
Definition: ERF_RadStruct.H:79
amrex::Real longitude
Definition: ERF_RadStruct.H:76
int radiation_interval
Definition: ERF_RadStruct.H:77
Container holding radiation-related choices and parameters.
Definition: ERF_RadStruct.H:132
amrex::Real lw_kabs_dry
Dry-air gray LW mass absorption coefficient [m^2/kg].
Definition: ERF_RadStruct.H:250
bool aerosol_enable
Enable prescribed bulk aerosol/turbidity optical depth. When true, aerosol optical depth is added on ...
Definition: ERF_RadStruct.H:746
TauModel tau_model
Optical depth model: "per_layer" (default, fixed tau per layer) or "mass" (from the layer mass path i...
Definition: ERF_RadStruct.H:217
amrex::Real sw_kabs_vapor
Mass model, SW: water-vapor gray absorption coefficient [m^2/kg].
Definition: ERF_RadStruct.H:226
amrex::Real cloud_top_height_m
Cloud layer top height [m]. Only used when tau_profile_type == CloudLayer. Must be >= cloud_base_heig...
Definition: ERF_RadStruct.H:338
static void reset_nonpositive(const char *key, amrex::Real &value, amrex::Real fallback)
Definition: ERF_RadStruct.H:893
amrex::Real aerosol_tau_surface
Total-column aerosol optical depth at surface [dimensionless]. Used for AerosolProfileType::Exponenti...
Definition: ERF_RadStruct.H:778
int rad_orbital_year
erf.rad_orbital_year and the orbital overrides: negative means the year of the timestamp and the Berg...
Definition: ERF_RadStruct.H:207
amrex::Real fixed_solar_zenith_angle
erf.fixed_solar_zenith_angle: the COSINE of the solar zenith angle (mu0), as RRTMGP takes it,...
Definition: ERF_RadStruct.H:182
bool sw_enabled
Enable shortwave (solar) radiation computation. Only used by the two-stream model.
Definition: ERF_RadStruct.H:144
amrex::Real cloud_asymmetry_factor
Cloud scattering asymmetry factor in [-1, 1], used instead of asymmetry_factor for levels where the c...
Definition: ERF_RadStruct.H:393
int seb_vegetation_type
Noah-MP land-use category (modified IGBP MODIS, 1-20 except the unvegetated 15, 16 and 17,...
Definition: ERF_RadStruct.H:517
std::string diag_file
Output file path for radiation diagnostics CSV. Paths are relative to the simulation working director...
Definition: ERF_RadStruct.H:268
static void clamp_high(const char *key, amrex::Real &value, amrex::Real hi)
Definition: ERF_RadStruct.H:883
amrex::Real tau_lw_per_layer
Longwave optical depth per layer (constant for all layers). Used in gray-gas LW two-stream solver....
Definition: ERF_RadStruct.H:164
amrex::Real surface_albedo_sw
Shortwave surface albedo fallback [0, 1] for per-column heterogeneous-surface-property resolution....
Definition: ERF_RadStruct.H:402
amrex::Real surface_emissivity_lw
Longwave surface emissivity fallback [0, 1] for per-column heterogeneous-surface-property resolution....
Definition: ERF_RadStruct.H:417
amrex::Real rad_orbital_mvelp
Definition: ERF_RadStruct.H:210
amrex::Real seb_grdflx_default
Fallback SEB ground heat flux [W/m^2]. The force-restore restoring term already represents the flux i...
Definition: ERF_RadStruct.H:558
amrex::Real diag_dedup_tol
Tolerance for time equality in duplicate guard [s]. Times within this tolerance are considered equal....
Definition: ERF_RadStruct.H:319
amrex::Real seb_restore_timescale_s
Force-restore timescale for surface temperature [s]. Relaxation time constant toward T_deep in progno...
Definition: ERF_RadStruct.H:615
std::string diag_callsite_mode
Call-site filtering mode: "both" (pre+post rows), "pre_only", or "post_only".
Definition: ERF_RadStruct.H:312
bool diag_regtest_line_enable
Enable RADIATION_DIAG: line emission. Controls regtest-parsing diagnostics line. Default true.
Definition: ERF_RadStruct.H:299
amrex::Real sw_kext_cloud
Mass model, SW: cloud-water extinction coefficient m^2/kg.
Definition: ERF_RadStruct.H:229
amrex::Real tau_sw_coeff_qv
Shortwave optical depth coefficient for water vapor [dimensionless]. Dynamic SW tau = tau_sw_coeff_qv...
Definition: ERF_RadStruct.H:682
amrex::Real fixed_total_solar_irradiance
erf.fixed_total_solar_irradiance: top-of-atmosphere irradiance [W/m^2] when >= 0. Otherwise (default)...
Definition: ERF_RadStruct.H:189
bool tau_lw_dynamic_enable
Enable dynamic longwave optical depth diagnosis from moisture/clouds. When true, LW optical depth is ...
Definition: ERF_RadStruct.H:673
amrex::Real seb_lh_default
Fallback SEB latent heat flux [W/m^2].
Definition: ERF_RadStruct.H:551
void init_params(bool two_stream_selected, std::string pp_prefix)
Definition: ERF_RadStruct.H:904
amrex::Real seb_moisture_restore_timescale_s
Force-restore timescale for surface moisture [s]. Relaxation time constant toward q_deep in prognosti...
Definition: ERF_RadStruct.H:631
amrex::Real seb_lw_flux_default
Fallback SEB surface net longwave flux [W/m^2].
Definition: ERF_RadStruct.H:443
amrex::Real tau_sw_coeff_qc
Shortwave optical depth coefficient for cloud liquid water [dimensionless]. Default 0....
Definition: ERF_RadStruct.H:690
amrex::Real aerosol_tau_per_layer
Constant aerosol optical depth per layer [dimensionless]. Used for AerosolProfileType::Constant profi...
Definition: ERF_RadStruct.H:762
bool seb_surface_layer_uses_skin
Two-way coupling with the zlo surface layer: the surface layer takes its land surface temperature fro...
Definition: ERF_RadStruct.H:459
amrex::Real seb_q_sfc_default
Fallback SEB surface moisture, and the initial value of the prognostic one. With seb_prognostic_enabl...
Definition: ERF_RadStruct.H:566
amrex::Real rad_orbital_eccentricity
Definition: ERF_RadStruct.H:208
amrex::Real single_scattering_albedo
Clear-sky (background gas) single-scattering albedo in [0, 1] for the SW diffuse (scattering) two-str...
Definition: ERF_RadStruct.H:364
bool diag_csv_enable
Enable CSV file append behavior. When false, no file writes; other enabled streams may still print....
Definition: ERF_RadStruct.H:306
bool tau_sw_dynamic_enable
Definition: ERF_RadStruct.H:674
bool uses_two_stream_radiation() const noexcept
Check if two-stream radiation is active.
Definition: ERF_RadStruct.H:1509
amrex::Real seb_t_deep_default
Fallback SEB deep soil temperature [K].
Definition: ERF_RadStruct.H:571
AerosolProfileType aerosol_profile_type
Aerosol optical depth profile type: Constant, Exponential, or Table.
Definition: ERF_RadStruct.H:755
amrex::Real seb_prognostic_t_max_k
Maximum clamping bound for prognostic surface temperature [K]. After each Euler update,...
Definition: ERF_RadStruct.H:648
amrex::Real rad_t_sfc
erf.rad_t_sfc: surface temperature [K] used as the longwave boundary condition wherever no land-surfa...
Definition: ERF_RadStruct.H:197
bool seb_prognostic_enable
Enable prognostic SEB surface temperature and moisture evolution. When true, integrates SEB residual ...
Definition: ERF_RadStruct.H:596
bool seb_use_radiation_fluxes
Take the SEB's net surface shortwave and longwave fluxes from the two-stream sweep itself (per column...
Definition: ERF_RadStruct.H:433
amrex::Real seb_prognostic_t_min_k
Minimum clamping bound for prognostic surface temperature [K]. After each Euler update,...
Definition: ERF_RadStruct.H:640
amrex::Real tau_lw_coeff_qc
Longwave optical depth coefficient for cloud liquid water [dimensionless]. Default 0....
Definition: ERF_RadStruct.H:706
amrex::Real rad_orbital_obliquity
Definition: ERF_RadStruct.H:209
amrex::Real cloud_fraction
Cloud fraction in [0, 1] used to blend clear-sky and cloudy-column fluxes: F = (1 - cloud_fraction) *...
Definition: ERF_RadStruct.H:354
amrex::Real cloud_single_scattering_albedo
Cloud single-scattering albedo in [0, 1], used instead of single_scattering_albedo for levels where t...
Definition: ERF_RadStruct.H:384
amrex::Real lw_kabs_cloud
Cloud-water LW mass absorption coefficient m^2/kg.
Definition: ERF_RadStruct.H:256
amrex::Real sw_cloud_omega
Mass model, SW: cloud-water single-scattering albedo.
Definition: ERF_RadStruct.H:232
amrex::Real sw_kscat_dry
Mass model, SW: dry-air (Rayleigh) scattering coefficient [m^2/kg], omega = 1, g = 0.
Definition: ERF_RadStruct.H:223
amrex::Real sw_kabs_dry
Mass model, SW: dry-air gray absorption coefficient [m^2/kg].
Definition: ERF_RadStruct.H:220
amrex::Real seb_soil_moisture_wilt
Wilting point [m^3/m^3]: at or below it the soil-water factor is 0, so the vegetation does not transp...
Definition: ERF_RadStruct.H:485
amrex::Real seb_leaf_area_index
Leaf area index [m^2/m^2] of the vegetated fraction (seb_vegetation_type; giving it otherwise stops a...
Definition: ERF_RadStruct.H:532
amrex::Real asymmetry_factor
Clear-sky (background gas) scattering asymmetry factor in [-1, 1] (0 = isotropic scattering,...
Definition: ERF_RadStruct.H:372
static void clamp_low(const char *key, amrex::Real &value, amrex::Real lo)
Read radiation options from the input parameter database.
Definition: ERF_RadStruct.H:873
bool seb_surface_layer_uses_moisture
Two-way coupling of moisture as well: the surface layer takes its land surface mixing ratio from the ...
Definition: ERF_RadStruct.H:476
amrex::Real cloud_fraction_qc_scale
Cloud water [kg/kg] at which the liquid-water term alone gives a cloud fraction of 1: cf += min(1,...
Definition: ERF_RadStruct.H:738
bool cloud_fraction_prog_enable
Enable prognostic cloud fraction diagnosis from RH/qc. When true, cloud fraction is computed per-leve...
Definition: ERF_RadStruct.H:714
amrex::Real seb_prognostic_q_max
Maximum clamping bound for prognostic surface moisture [kg/kg]. After each Euler update,...
Definition: ERF_RadStruct.H:664
bool lw_enabled
Enable longwave (thermal) radiation computation. Only used by the two-stream model.
Definition: ERF_RadStruct.H:150
int seb_soil_type
Noah-MP soil category (STAS, 1-19, not 14 (water), as in NoahmpTable.TBL; see ERF_NoahMPSoilTable....
Definition: ERF_RadStruct.H:505
amrex::Real seb_soil_moisture_fc
Field capacity [m^3/m^3]: at or above it the soil-water factor is 1, so without seb_soil_type the sur...
Definition: ERF_RadStruct.H:493
amrex::Real surface_albedo_sw_diffuse
Shortwave surface albedo for diffuse light [0,1]. A negative value (default) uses surface_albedo_sw f...
Definition: ERF_RadStruct.H:408
amrex::Real cloud_base_height_m
Cloud layer base height [m]. Only used when tau_profile_type == CloudLayer.
Definition: ERF_RadStruct.H:332
amrex::Real lw_kabs_vapor
Water-vapor gray LW mass absorption coefficient [m^2/kg].
Definition: ERF_RadStruct.H:253
amrex::Real tau_per_layer
Shortwave optical depth per layer (constant for all layers). Used in Beer-Lambert direct-beam formula...
Definition: ERF_RadStruct.H:157
amrex::Real seb_moisture_layer_depth_m
Effective surface moisture layer depth [m]. Used in force-restore prognostic q_s equation: dq_s/dt = ...
Definition: ERF_RadStruct.H:623
amrex::Real seb_vegetation_fraction
Vegetated fraction of the surface [0, 1] (seb_vegetation_type; giving it otherwise stops at start-up)...
Definition: ERF_RadStruct.H:523
SEBTurbulentFluxSource seb_turbulent_flux_source
Source of the SEB's sensible and latent heat fluxes when no land-surface model supplies them: "surfac...
Definition: ERF_RadStruct.H:450
amrex::Real tau_lw_coeff_qv
Longwave optical depth coefficient for water vapor [dimensionless]. Dynamic LW tau = tau_lw_coeff_qv ...
Definition: ERF_RadStruct.H:698
amrex::Real seb_hfx_default
Fallback SEB sensible heat flux [W/m^2].
Definition: ERF_RadStruct.H:546
amrex::Real cloud_fraction_rh_max
Maximum relative humidity threshold for cloud fraction diagnosis [0, 1]. Must be >= cloud_fraction_rh...
Definition: ERF_RadStruct.H:730
amrex::Real sw_cloud_g
Mass model, SW: cloud-water asymmetry factor.
Definition: ERF_RadStruct.H:235
amrex::Real rad_cons_lon
Definition: ERF_RadStruct.H:201
bool lw_mass_absorption_enable
Gray longwave optical depth from the layer mass path instead of the fixed tau_lw_per_layer (also sele...
Definition: ERF_RadStruct.H:247
amrex::Real cloud_tau_per_layer
Additional optical depth per layer contributed by the cloud, added on top of the clear-sky tau_per_la...
Definition: ERF_RadStruct.H:346
amrex::Real aerosol_scale_height_m
Scale height for exponential aerosol profile [m]. Controls decay rate: tau_aerosol(k) = aerosol_tau_s...
Definition: ERF_RadStruct.H:770
amrex::Real seb_land_roughness
Land roughness length [m] the coupled surface layer takes when erf.most.z0 is not given (derived,...
Definition: ERF_RadStruct.H:541
bool diag_tagged_enable
Enable tagged [RAD][...] debug lines. Controls emission of bracketed-tag debug output....
Definition: ERF_RadStruct.H:292
amrex::Real seb_q_deep_default
Deep soil moisture the prognostic q_s restores to, in q_s's units (see seb_q_sfc_default).
Definition: ERF_RadStruct.H:577
amrex::Real rad_cons_lat
erf.rad_cons_lat / erf.rad_cons_lon: site latitude and longitude [degrees] when the grid has no lat/l...
Definition: ERF_RadStruct.H:200
amrex::Real seb_sw_flux_default
Fallback SEB surface net shortwave flux [W/m^2].
Definition: ERF_RadStruct.H:438
bool diag_enable
Master switch for radiation diagnostics emission. When false, no diagnostics output (stdout/tagged/re...
Definition: ERF_RadStruct.H:278
amrex::Real seb_prognostic_q_min
Minimum clamping bound for prognostic surface moisture [kg/kg]. After each Euler update,...
Definition: ERF_RadStruct.H:656
amrex::Real cloud_fraction_rh_min
Minimum relative humidity threshold for cloud fraction diagnosis [0, 1]. Cloud fraction ramps from 0 ...
Definition: ERF_RadStruct.H:722
bool seb_enable
Master switch for simplified SEB infrastructure. When false (default), no SEB MultiFabs are allocated...
Definition: ERF_RadStruct.H:423
bool diag_stdout_enable
Enable human-readable stdout diagnostics block. Controls tagged [RAD][...] debug line emission (when ...
Definition: ERF_RadStruct.H:285
bool enabled
True when erf.radiation_model = TwoStream. Set by init_params from the model SolverChoice read; the e...
Definition: ERF_RadStruct.H:138
int verbosity
Debug verbosity level (0=off, 1+=debug output). Gated debug prints only emit when this is >= 1.
Definition: ERF_RadStruct.H:262
amrex::Real seb_surface_heat_capacity
Effective surface heat capacity [J/(m^2*K)]. Used in force-restore prognostic T_s equation: dT_s/dt =...
Definition: ERF_RadStruct.H:607
TauProfileType tau_profile_type
Optical depth profile type: "constant" (default, the thickness-independent tau) or "cloud_layer" (add...
Definition: ERF_RadStruct.H:326
bool seb_diagnostic_enable
Enable diagnostic SEB residual computation and reporting. When true, computes and reports SEB residua...
Definition: ERF_RadStruct.H:587
Definition: ERF_RadStruct.H:103
void read(const std::string &prefix, const RRTMGPSolarChoice &solar)
Definition: ERF_TopographicShading.cpp:39
amrex::Real shadlen
Definition: ERF_RadStruct.H:106
bool active() const
Definition: ERF_RadStruct.H:113
amrex::Real longitude
Definition: ERF_RadStruct.H:110
amrex::Real fixed_mu
Definition: ERF_RadStruct.H:107
bool slope_rad
Definition: ERF_RadStruct.H:104
int radiation_interval
Definition: ERF_RadStruct.H:111
amrex::Real latitude
Definition: ERF_RadStruct.H:109
amrex::Real fixed_azimuth
Definition: ERF_RadStruct.H:108
bool topo_shading
Definition: ERF_RadStruct.H:105