ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_IBSEBParams.H
Go to the documentation of this file.
1 #ifndef ERF_IBSEB_PARAMS_H
2 #define ERF_IBSEB_PARAMS_H
3 
4 #include <AMReX_ParmParse.H>
5 #include <AMReX_REAL.H>
6 #include <AMReX.H>
7 #include <string>
8 #include <vector>
9 
10 /**
11  * \file ERF_IBSEBParams.H
12  * \brief Inputs of the immersed-boundary surface energy balance (``erf.ibseb.*``).
13  *
14  * The balance runs on the faces of buildings represented by immersed forcing
15  * (``erf.buildings_type = ImmersedForcing``). Every input lives under the
16  * ``erf.ibseb`` prefix and everything is off unless ``erf.ibseb.enable`` is set,
17  * in which case ERF::init_ibseb() builds one IBFaceSet per level.
18  *
19  * The parameters are parsed once, in ERF::ReadParameters(), and copied into
20  * each IBFaceSet, so a face set never reads ParmParse itself. Every input of
21  * the balance lives here with its default, so that the whole input surface
22  * is in one place; the inputs are documented in Docs/sphinx_doc/Inputs.rst.
23  */
25 {
26  bool enable = false; ///< Master switch
27  int n_slab_layers = 4; ///< Conduction layers per face
28  amrex::Real T_skin_init = 300.0; ///< Initial skin temperature [K]
29  amrex::Real T_interior = 293.0; ///< Interior (deep) temperature [K]
30  std::string csv_file = "ibseb_buildings.csv"; ///< Per-building report
31  int csv_int = 100; ///< Steps between report rows; <= 0 disables
32  bool debug = false; ///< [IBSEB DEBUG] prints: set description at build, per-step summary, per-building rows
33  std::string dump_faces_file; ///< Per-rank face dump at report time (empty = off); a refined level N adds ".levN"
34  bool dump_faces_tag_step = false; ///< Name each dump by its step (keeps every one) instead of overwriting
35 
36  // ---- Radiation provider ------------------------------------------------
37  // Where the downwelling shortwave and longwave come from.
38  // "prescribed" is built in: clear-sky formulas with a fixed or computed
39  // sun. "two_stream": the column fluxes of the TwoStream radiation model
40  // (erf.radiation_model = TwoStream) of each face's own column at the face's
41  // height (ERF_TwoStreamCanopyForcing.H): the direct beam (as a direct-normal
42  // irradiance, the beam over the cosine of the zenith angle), the diffuse
43  // light from the sky and the light the ground reflects; and the longwave
44  // with lw_mode = two_stream, its default there. The sun's position still
45  // comes from sun_mode.
46  std::string radiation = "prescribed";
47  // "fixed": the sun stays at sun_zenith_deg / sun_azimuth_deg; with the
48  // prescribed provider, with the direct-normal and diffuse irradiances given
49  // below (analytic tests).
50  // "solar": sun from the site and time; irradiances from the clear-sky
51  // formulas.
52  // "two_stream": the sun of the two-stream radiation (erf.radiation_model =
53  // TwoStream following start_datetime): its declination, hour angle (no
54  // equation of time), site (erf.rad_cons_lat / lon) and top-of-atmosphere
55  // irradiance; the clear-sky formulas of "solar" then give the irradiances.
56  std::string sun_mode = "fixed";
57  amrex::Real sun_zenith_deg = 45.0; ///< fixed: zenith angle [deg]
58  amrex::Real sun_azimuth_deg = 180.0; ///< fixed: azimuth clockwise from north [deg]; 180 = sun in the south
59  amrex::Real sw_direct_normal = 800.0; ///< fixed: direct-normal irradiance [W/m2]
60  amrex::Real sw_diffuse = 100.0; ///< fixed: diffuse irradiance on a horizontal surface [W/m2]
61  amrex::Real latitude_deg = 40.0; ///< solar: site latitude, north positive
62  amrex::Real longitude_deg = -105.0; ///< solar: site longitude, east positive
63  amrex::Real day_of_year = 172.0; ///< solar: day of year
64  amrex::Real time_zero_utc_s = 12.0 * 3600.0; ///< solar: seconds after 00:00 UTC at simulation time zero (the sun follows UTC and the longitude)
65  amrex::Real solar_constant = 1361.0; ///< solar: [W/m2]
66  amrex::Real sw_transmission = 0.7; ///< solar, two_stream: bulk clear-sky transmission (Bird)
67  amrex::Real sw_diffuse_coeff = 0.5; ///< solar, two_stream: share of the attenuated beam that arrives as diffuse light
68  // Optical properties, uniform unless the material library below overrides them.
69  amrex::Real albedo = 0.3; ///< Face shortwave albedo
70  amrex::Real albedo_ground = 0.2; ///< Ground albedo for the reflected diffuse term
71  amrex::Real emissivity = 0.9; ///< Face longwave emissivity
72  amrex::Real emissivity_ground = 0.95; ///< Ground emissivity for the ground term
73 
74  // ---- View fractions and longwave ----------------------------------------
75  // Rays per face of the cosine-weighted hemisphere sampled once at
76  // initialisation: n_az azimuths x n_el elevations.
77  int view_n_az = 16;
78  int view_n_el = 8;
79  // Downwelling longwave from the sky: "fixed" uses lw_down as given,
80  // "gray" uses sky_emissivity x sigma x T_air^4 with the air temperature
81  // of the face's fluid cell; with both the ground term is
82  // emissivity_ground x sigma x T_ground^4. "two_stream" (radiation =
83  // two_stream only, and its default) takes the sky term from the column's
84  // longwave down at the face's height and the ground term from its
85  // longwave up at the same height (the ground's emission and its reflection
86  // of the sky, seen through the air in between).
87  std::string lw_mode = "gray";
88  amrex::Real lw_down = 300.0; ///< fixed: sky longwave [W/m2]
89  amrex::Real sky_emissivity = 0.83; ///< gray: effective clear-sky emissivity
90  amrex::Real T_ground = 300.0; ///< Ground temperature for the ground term [K]
91 
92  // ---- Sensible and latent heat -------------------------------------------
93  // Wall function between the face skin temperature and the adjacent fluid
94  // cell: u* from the tangential wind at half a cell from the wall with the
95  // roughness length z0_wall, theta* from the skin-to-air difference with
96  // z0h_wall; H = rho c_p u* theta* (positive out of the face). Neutral on
97  // every face unless stability_correction is set, which applies the
98  // surface layer's similarity functions on roofs. couple_heat = false
99  // diagnoses H without adding it to the temperature equation.
100  amrex::Real z0_wall = 0.01; ///< Momentum roughness of the faces [m]
101  amrex::Real z0h_wall = 0.001; ///< Heat roughness of the faces [m]
102  bool stability_correction = false;
103  bool couple_heat = true; ///< Add the face flux to the temperature equation
104 
105  // ---- Ground heat flux and materials -------------------------------------
106  // Every face carries a slab of n_slab_layers layers between the skin and
107  // the building interior at T_interior; the conduction into it is G. The
108  // slab's conductivity, heat capacity and thickness, and the face's albedo
109  // and emissivity, come from the material library (SLUCM schema) when
110  // material_file is given: material_default for every building, or one
111  // id per building in material_by_building (indexed by level 0's building
112  // id from 1; every level maps its buildings to level 0's). Without a file
113  // the uniform values below apply to every face.
114  std::string material_file;
116  std::vector<int> material_by_building;
117  amrex::Real k_therm = 1.0; ///< Uniform conductivity [W/m/K]
118  amrex::Real rho_cp = 1.6e6; ///< Uniform volumetric heat capacity [J/m3/K]
119  amrex::Real thickness = 0.3; ///< Uniform slab thickness [m]
120 
121  // ---- Prognostic balance -------------------------------------------------
122  // With prognostic on, every step solves the massless-skin balance
123  // SW_abs + eps Q_ext + LW_net - H - LE - G = 0 for the skin temperature
124  // of every face by Newton's method (ERF_IBSEBBalance.H), consistent with
125  // the implicit slab step, and stores the fluxes at the solution. Off, the
126  // skin stays at T_skin_init (or the restart value) and the terms are
127  // diagnosed around it, which is what the term-by-term regression tests
128  // use to check each term on its own.
129  bool prognostic = true;
130  amrex::Real T_skin_min = 260.0; ///< Lower bound of the skin temperature [K]
131  amrex::Real T_skin_max = 380.0; ///< Upper bound [K]; raise it for faces under a fire
132  int newton_max_iter = 20; ///< Newton iteration cap per face and step
133  amrex::Real newton_tol_K = 1.0e-3; ///< Newton stops when a step changes T_skin by less than this [K]
134  amrex::Real newton_max_step_K = 20.0; ///< Largest Newton step [K]
135  amrex::Real Q_ext_uniform = 0.0; ///< Uniform external incident flux on every face [W/m2] (test hook)
136 
137  // ---- Wall function beyond neutral ----------------------------------------
138  // stability_correction (above) applies the surface layer's similarity
139  // functions on roofs with the face's own Obukhov length, seeded from the
140  // ground surface layer's 2D Obukhov field at the face's column when
141  // obukhov_seed = "ground" (or from neutral). convective_velocity =
142  // "deardorff" adds a convective velocity scale to the wind the wall
143  // function sees, U_eff^2 = U_tan^2 + (beta w*)^2 with
144  // w* = (g/theta H/(rho c_p) depth)^(1/3) from the previous step's H when it
145  // is out of the face, so u* does not collapse when the wind dies. The
146  // depth is the mixed layer above a roof (z_i - z_face, floored at the
147  // building height; z_i from the bulk Richardson diagnostic on the
148  // horizontal-mean profile, from ERF's surface-layer pblh, or fixed) and
149  // the building height for a wall. All off by default.
150  std::string obukhov_seed = "ground"; ///< "ground" or "neutral"
151  std::string convective_velocity = "none"; ///< "none" or "deardorff"
152  amrex::Real beta_conv = 1.2; ///< Gustiness factor on w*
153  std::string z_i_mode = "bulk_ri"; ///< "bulk_ri", "pblh" or "fixed"
154  amrex::Real z_i = 1000.0; ///< Fixed mixed-layer depth [m] (z_i_mode = fixed, and the fallback)
155  amrex::Real ri_crit = 0.25; ///< Critical bulk Richardson number of the diagnostic
156  amrex::Real obukhov_relax = 0.5; ///< Under-relaxation of the roof's u*, theta* iteration (1 = none), as erf-model #3486
157 
158  /**
159  * Read the ``erf.ibseb.*`` inputs and validate them.
160  *
161  * Only queried, never required: a deck without any ``erf.ibseb`` key gets
162  * the defaults above with the balance off. Validation is skipped when the
163  * balance is off so an unrelated deck cannot abort on an unused key.
164  */
165  void init_params ()
166  {
167  amrex::ParmParse pp("erf.ibseb");
168  pp.query("enable", enable);
169  pp.query("n_slab_layers", n_slab_layers);
170  pp.query("T_skin_init", T_skin_init);
171  pp.query("T_interior", T_interior);
172  pp.query("csv_file", csv_file);
173  pp.query("csv_int", csv_int);
174  pp.query("debug", debug);
175  pp.query("dump_faces_file", dump_faces_file);
176  pp.query("dump_faces_tag_step", dump_faces_tag_step);
177  pp.query("radiation", radiation);
178  pp.query("sun_mode", sun_mode);
179  pp.query("sun_zenith_deg", sun_zenith_deg);
180  pp.query("sun_azimuth_deg", sun_azimuth_deg);
181  pp.query("sw_direct_normal", sw_direct_normal);
182  pp.query("sw_diffuse", sw_diffuse);
183  pp.query("latitude_deg", latitude_deg);
184  pp.query("longitude_deg", longitude_deg);
185  pp.query("day_of_year", day_of_year);
186  pp.query("time_zero_utc_s", time_zero_utc_s);
187  pp.query("solar_constant", solar_constant);
188  pp.query("sw_transmission", sw_transmission);
189  pp.query("sw_diffuse_coeff", sw_diffuse_coeff);
190  pp.query("albedo", albedo);
191  pp.query("albedo_ground", albedo_ground);
192  pp.query("emissivity", emissivity);
193  pp.query("emissivity_ground", emissivity_ground);
194  pp.query("view_n_az", view_n_az);
195  pp.query("view_n_el", view_n_el);
196  pp.query("lw_mode", lw_mode);
197  pp.query("lw_down", lw_down);
198  pp.query("sky_emissivity", sky_emissivity);
199  pp.query("T_ground", T_ground);
200  pp.query("z0_wall", z0_wall);
201  pp.query("z0h_wall", z0h_wall);
202  pp.query("stability_correction", stability_correction);
203  pp.query("couple_heat", couple_heat);
204  pp.query("material_file", material_file);
205  pp.query("material_default", material_default);
206  pp.queryarr("material_by_building", material_by_building);
207  pp.query("k_therm", k_therm);
208  pp.query("rho_cp", rho_cp);
209  pp.query("thickness", thickness);
210  pp.query("prognostic", prognostic);
211  pp.query("T_skin_min", T_skin_min);
212  pp.query("T_skin_max", T_skin_max);
213  pp.query("newton_max_iter", newton_max_iter);
214  pp.query("newton_tol_K", newton_tol_K);
215  pp.query("newton_max_step_K", newton_max_step_K);
216  pp.query("Q_ext_uniform", Q_ext_uniform);
217  pp.query("obukhov_seed", obukhov_seed);
218  pp.query("convective_velocity", convective_velocity);
219  pp.query("beta_conv", beta_conv);
220  pp.query("z_i_mode", z_i_mode);
221  pp.query("z_i", z_i);
222  pp.query("ri_crit", ri_crit);
223  pp.query("obukhov_relax", obukhov_relax);
224  if (enable) {
225  if (radiation != "prescribed" && radiation != "two_stream") {
226  amrex::Abort("erf.ibseb.radiation must be \"prescribed\" or \"two_stream\"");
227  }
228  // The column's longwave goes with its shortwave unless the deck says otherwise.
229  if (radiation == "two_stream" && !pp.contains("lw_mode")) { lw_mode = "two_stream"; }
230  // The columns bring the irradiances and the ground's reflection; the
231  // clear-sky formulas and the uniform ground albedo are not used.
232  if (radiation == "two_stream") {
233  for (const char* k : {"sw_direct_normal", "sw_diffuse", "sw_transmission", "sw_diffuse_coeff",
234  "solar_constant", "albedo_ground"}) {
235  if (pp.contains(k)) {
236  amrex::Abort(std::string("erf.ibseb.") + k + " is not used with erf.ibseb.radiation = two_stream:"
237  " the faces take the two-stream columns' irradiances and the ground's reflection;"
238  " remove it");
239  }
240  }
241  }
242  if (sun_mode != "fixed" && sun_mode != "solar" && sun_mode != "two_stream") {
243  amrex::Abort("erf.ibseb.sun_mode must be \"fixed\", \"solar\" or \"two_stream\"");
244  }
245  // The two-stream sun brings its own position, site, date and irradiance.
246  if (sun_mode == "two_stream") {
247  for (const char* k : {"latitude_deg", "longitude_deg", "day_of_year", "time_zero_utc_s", "solar_constant",
248  "sun_zenith_deg", "sun_azimuth_deg", "sw_direct_normal", "sw_diffuse"}) {
249  if (pp.contains(k)) {
250  amrex::Abort(std::string("erf.ibseb.") + k + " is not used with erf.ibseb.sun_mode = two_stream:"
251  " the faces take the two-stream sun (start_datetime, erf.rad_cons_lat / lon,"
252  " erf.fixed_total_solar_irradiance); remove it");
253  }
254  }
255  }
256  if (sun_zenith_deg < 0.0 || sun_zenith_deg > 180.0) { amrex::Abort("erf.ibseb.sun_zenith_deg must be in [0, 180]"); }
257  if (latitude_deg < -90.0 || latitude_deg > 90.0) { amrex::Abort("erf.ibseb.latitude_deg must be in [-90, 90]"); }
258  if (longitude_deg < -180.0 || longitude_deg > 180.0) { amrex::Abort("erf.ibseb.longitude_deg must be in [-180, 180]"); }
259  if (day_of_year < 1.0 || day_of_year > 366.0) { amrex::Abort("erf.ibseb.day_of_year must be in [1, 366]"); }
260  // The sun is computed from UTC (time_zero_utc_s) and the longitude; a
261  // time-zone offset has no place in that and used to cancel silently.
262  if (pp.contains("utc_offset_hours")) {
263  amrex::Abort("erf.ibseb.utc_offset_hours is not an input: the sun follows time_zero_utc_s (UTC) and longitude_deg; remove it");
264  }
265  if (sw_direct_normal < 0.0 || sw_diffuse < 0.0) { amrex::Abort("erf.ibseb.sw_direct_normal and sw_diffuse must be >= 0"); }
266  if (sw_transmission <= 0.0 || sw_transmission > 1.0) { amrex::Abort("erf.ibseb.sw_transmission must be in (0, 1]"); }
267  if (albedo < 0.0 || albedo > 1.0 || albedo_ground < 0.0 || albedo_ground > 1.0) {
268  amrex::Abort("erf.ibseb.albedo and albedo_ground must be in [0, 1]");
269  }
270  if (emissivity <= 0.0 || emissivity > 1.0 || emissivity_ground <= 0.0 || emissivity_ground > 1.0 ||
271  sky_emissivity <= 0.0 || sky_emissivity > 1.0) {
272  amrex::Abort("erf.ibseb emissivities must be in (0, 1]");
273  }
274  if (view_n_az < 1 || view_n_el < 1) { amrex::Abort("erf.ibseb.view_n_az and view_n_el must be >= 1"); }
275  if (lw_mode != "fixed" && lw_mode != "gray" && lw_mode != "two_stream") {
276  amrex::Abort("erf.ibseb.lw_mode must be \"fixed\", \"gray\" or \"two_stream\"");
277  }
278  if (lw_mode == "two_stream" && radiation != "two_stream") {
279  amrex::Abort("erf.ibseb.lw_mode = two_stream needs erf.ibseb.radiation = two_stream");
280  }
281  if (lw_mode == "two_stream") {
282  for (const char* k : {"lw_down", "sky_emissivity", "T_ground", "emissivity_ground"}) {
283  if (pp.contains(k)) {
284  amrex::Abort(std::string("erf.ibseb.") + k + " is not used with erf.ibseb.lw_mode = two_stream:"
285  " the faces take the two-stream columns' longwave down and the ground's longwave up;"
286  " remove it");
287  }
288  }
289  }
290  if (lw_down < 0.0 || T_ground <= 0.0) { amrex::Abort("erf.ibseb.lw_down must be >= 0 and T_ground > 0"); }
291  if (z0_wall <= 0.0 || z0h_wall <= 0.0) { amrex::Abort("erf.ibseb.z0_wall and z0h_wall must be positive [m]"); }
292  if (k_therm <= 0.0 || rho_cp <= 0.0 || thickness <= 0.0) { amrex::Abort("erf.ibseb.k_therm, rho_cp and thickness must be positive"); }
293  if (n_slab_layers > 32) { amrex::Abort("erf.ibseb.n_slab_layers must be <= 32 (the slab kernels keep their layers on the stack)"); }
294  if (n_slab_layers < 1) { amrex::Abort("erf.ibseb.n_slab_layers must be >= 1"); }
295  if (T_skin_init <= 0.0 || T_interior <= 0.0) {
296  amrex::Abort("erf.ibseb.T_skin_init and T_interior must be positive [K]");
297  }
298  if (T_skin_min <= 0.0 || T_skin_max <= T_skin_min) {
299  amrex::Abort("erf.ibseb.T_skin_min must be positive and below T_skin_max");
300  }
301  if (prognostic && (T_skin_init < T_skin_min || T_skin_init > T_skin_max)) {
302  amrex::Abort("erf.ibseb.T_skin_init must lie within [T_skin_min, T_skin_max]");
303  }
304  if (newton_max_iter < 1 || newton_tol_K <= 0.0 || newton_max_step_K <= 0.0) {
305  amrex::Abort("erf.ibseb.newton_max_iter must be >= 1, newton_tol_K and newton_max_step_K positive");
306  }
307  if (Q_ext_uniform < 0.0) { amrex::Abort("erf.ibseb.Q_ext_uniform must be >= 0"); }
308  if (obukhov_seed != "ground" && obukhov_seed != "neutral") { amrex::Abort("erf.ibseb.obukhov_seed must be \"ground\" or \"neutral\""); }
309  if (convective_velocity != "none" && convective_velocity != "deardorff") {
310  amrex::Abort("erf.ibseb.convective_velocity must be \"none\" or \"deardorff\"");
311  }
312  if (z_i_mode != "bulk_ri" && z_i_mode != "pblh" && z_i_mode != "fixed") {
313  amrex::Abort("erf.ibseb.z_i_mode must be \"bulk_ri\", \"pblh\" or \"fixed\"");
314  }
315  if (beta_conv <= 0.0 || z_i <= 0.0 || ri_crit <= 0.0) { amrex::Abort("erf.ibseb.beta_conv, z_i and ri_crit must be positive"); }
316  if (obukhov_relax <= 0.0 || obukhov_relax > 1.0) { amrex::Abort("erf.ibseb.obukhov_relax must be in (0, 1]"); }
317  }
318  }
319 };
320 
321 #endif
ParmParse pp("prob")
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_IBSEBParams.H:25
amrex::Real newton_max_step_K
Largest Newton step [K].
Definition: ERF_IBSEBParams.H:134
std::string csv_file
Per-building report.
Definition: ERF_IBSEBParams.H:30
amrex::Real T_interior
Interior (deep) temperature [K].
Definition: ERF_IBSEBParams.H:29
std::string sun_mode
Definition: ERF_IBSEBParams.H:56
std::string convective_velocity
"none" or "deardorff"
Definition: ERF_IBSEBParams.H:151
amrex::Real T_ground
Ground temperature for the ground term [K].
Definition: ERF_IBSEBParams.H:90
amrex::Real Q_ext_uniform
Uniform external incident flux on every face [W/m2] (test hook)
Definition: ERF_IBSEBParams.H:135
amrex::Real day_of_year
solar: day of year
Definition: ERF_IBSEBParams.H:63
bool prognostic
Definition: ERF_IBSEBParams.H:129
int material_default
Definition: ERF_IBSEBParams.H:115
amrex::Real newton_tol_K
Newton stops when a step changes T_skin by less than this [K].
Definition: ERF_IBSEBParams.H:133
amrex::Real obukhov_relax
Under-relaxation of the roof's u*, theta* iteration (1 = none), as erf-model #3486.
Definition: ERF_IBSEBParams.H:156
amrex::Real z0_wall
Momentum roughness of the faces [m].
Definition: ERF_IBSEBParams.H:100
amrex::Real k_therm
Uniform conductivity [W/m/K].
Definition: ERF_IBSEBParams.H:117
amrex::Real sw_transmission
solar, two_stream: bulk clear-sky transmission (Bird)
Definition: ERF_IBSEBParams.H:66
bool enable
Master switch.
Definition: ERF_IBSEBParams.H:26
int n_slab_layers
Conduction layers per face.
Definition: ERF_IBSEBParams.H:27
amrex::Real rho_cp
Uniform volumetric heat capacity [J/m3/K].
Definition: ERF_IBSEBParams.H:118
std::string z_i_mode
"bulk_ri", "pblh" or "fixed"
Definition: ERF_IBSEBParams.H:153
amrex::Real thickness
Uniform slab thickness [m].
Definition: ERF_IBSEBParams.H:119
std::string material_file
Definition: ERF_IBSEBParams.H:114
int view_n_az
Definition: ERF_IBSEBParams.H:77
amrex::Real sky_emissivity
gray: effective clear-sky emissivity
Definition: ERF_IBSEBParams.H:89
bool couple_heat
Add the face flux to the temperature equation.
Definition: ERF_IBSEBParams.H:103
amrex::Real ri_crit
Critical bulk Richardson number of the diagnostic.
Definition: ERF_IBSEBParams.H:155
amrex::Real longitude_deg
solar: site longitude, east positive
Definition: ERF_IBSEBParams.H:62
int view_n_el
Definition: ERF_IBSEBParams.H:78
std::vector< int > material_by_building
Definition: ERF_IBSEBParams.H:116
std::string lw_mode
Definition: ERF_IBSEBParams.H:87
amrex::Real albedo_ground
Ground albedo for the reflected diffuse term.
Definition: ERF_IBSEBParams.H:70
bool dump_faces_tag_step
Name each dump by its step (keeps every one) instead of overwriting.
Definition: ERF_IBSEBParams.H:34
amrex::Real emissivity_ground
Ground emissivity for the ground term.
Definition: ERF_IBSEBParams.H:72
void init_params()
Definition: ERF_IBSEBParams.H:165
std::string radiation
Definition: ERF_IBSEBParams.H:46
int csv_int
Steps between report rows; <= 0 disables.
Definition: ERF_IBSEBParams.H:31
amrex::Real beta_conv
Gustiness factor on w*.
Definition: ERF_IBSEBParams.H:152
bool debug
[IBSEB DEBUG] prints: set description at build, per-step summary, per-building rows
Definition: ERF_IBSEBParams.H:32
amrex::Real solar_constant
solar: [W/m2]
Definition: ERF_IBSEBParams.H:65
amrex::Real sw_direct_normal
fixed: direct-normal irradiance [W/m2]
Definition: ERF_IBSEBParams.H:59
std::string dump_faces_file
Per-rank face dump at report time (empty = off); a refined level N adds ".levN".
Definition: ERF_IBSEBParams.H:33
amrex::Real albedo
Face shortwave albedo.
Definition: ERF_IBSEBParams.H:69
amrex::Real T_skin_min
Lower bound of the skin temperature [K].
Definition: ERF_IBSEBParams.H:130
amrex::Real time_zero_utc_s
solar: seconds after 00:00 UTC at simulation time zero (the sun follows UTC and the longitude)
Definition: ERF_IBSEBParams.H:64
amrex::Real sun_zenith_deg
fixed: zenith angle [deg]
Definition: ERF_IBSEBParams.H:57
amrex::Real lw_down
fixed: sky longwave [W/m2]
Definition: ERF_IBSEBParams.H:88
amrex::Real z_i
Fixed mixed-layer depth [m] (z_i_mode = fixed, and the fallback)
Definition: ERF_IBSEBParams.H:154
amrex::Real z0h_wall
Heat roughness of the faces [m].
Definition: ERF_IBSEBParams.H:101
amrex::Real sw_diffuse
fixed: diffuse irradiance on a horizontal surface [W/m2]
Definition: ERF_IBSEBParams.H:60
amrex::Real sun_azimuth_deg
fixed: azimuth clockwise from north [deg]; 180 = sun in the south
Definition: ERF_IBSEBParams.H:58
bool stability_correction
Definition: ERF_IBSEBParams.H:102
amrex::Real T_skin_init
Initial skin temperature [K].
Definition: ERF_IBSEBParams.H:28
amrex::Real latitude_deg
solar: site latitude, north positive
Definition: ERF_IBSEBParams.H:61
std::string obukhov_seed
"ground" or "neutral"
Definition: ERF_IBSEBParams.H:150
amrex::Real sw_diffuse_coeff
solar, two_stream: share of the attenuated beam that arrives as diffuse light
Definition: ERF_IBSEBParams.H:67
amrex::Real T_skin_max
Upper bound [K]; raise it for faces under a fire.
Definition: ERF_IBSEBParams.H:131
amrex::Real emissivity
Face longwave emissivity.
Definition: ERF_IBSEBParams.H:71
int newton_max_iter
Newton iteration cap per face and step.
Definition: ERF_IBSEBParams.H:132