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  // The lowest sun elevation [deg] at which the shadow test is exact everywhere: the
69  // ray map each rank keeps (IBFaceSet::build_ray_map()) reaches as far as a ray that
70  // low can travel before it clears the tallest building, (tallest height) / tan(elevation),
71  // beyond this rank's columns. With the sun lower, a building farther than that from a
72  // face casts no shadow on it. The clear-sky direct beam at 2 deg is 0.05 W/m2 with the
73  // default transmission (2.3 W/m2 at sw_transmission = 0.8; a fixed beam keeps its
74  // value at any elevation), and a small domain is covered whole whatever the value.
76  // Optical properties, uniform unless the material library below overrides them.
77  amrex::Real albedo = 0.3; ///< Face shortwave albedo
78  amrex::Real albedo_ground = 0.2; ///< Ground albedo for the reflected diffuse term
79  amrex::Real emissivity = 0.9; ///< Face longwave emissivity
80  amrex::Real emissivity_ground = 0.95; ///< Ground emissivity for the ground term
81 
82  // ---- View fractions and longwave ----------------------------------------
83  // Rays per face of the cosine-weighted hemisphere sampled once at
84  // initialisation: n_az azimuths x n_el elevations.
85  int view_n_az = 16;
86  int view_n_el = 8;
87  // Downwelling longwave from the sky: "fixed" uses lw_down as given,
88  // "gray" uses sky_emissivity x sigma x T_air^4 with the air temperature
89  // of the face's fluid cell; with both the ground term is
90  // emissivity_ground x sigma x T_ground^4. "two_stream" (radiation =
91  // two_stream only, and its default) takes the sky term from the column's
92  // longwave down at the face's height and the ground term from its
93  // longwave up at the same height (the ground's emission and its reflection
94  // of the sky, seen through the air in between).
95  std::string lw_mode = "gray";
96  amrex::Real lw_down = 300.0; ///< fixed: sky longwave [W/m2]
97  amrex::Real sky_emissivity = 0.83; ///< gray: effective clear-sky emissivity
98  amrex::Real T_ground = 300.0; ///< Ground temperature for the ground term [K]
99 
100  // ---- Sensible and latent heat -------------------------------------------
101  // Wall function between the face skin temperature and the adjacent fluid
102  // cell: u* from the tangential wind at half a cell from the wall with the
103  // roughness length z0_wall, theta* from the skin-to-air difference with
104  // z0h_wall; H = rho c_p u* theta* (positive out of the face). Neutral on
105  // every face unless stability_correction is set, which applies the
106  // surface layer's similarity functions on roofs. couple_heat = false
107  // diagnoses H without adding it to the temperature equation.
108  amrex::Real z0_wall = 0.01; ///< Momentum roughness of the faces [m]
109  amrex::Real z0h_wall = 0.001; ///< Heat roughness of the faces [m]
110  bool stability_correction = false;
111  bool couple_heat = true; ///< Add the face flux to the temperature equation
112 
113  // ---- Ground heat flux and materials -------------------------------------
114  // Every face carries a slab of n_slab_layers layers between the skin and
115  // the building interior at T_interior; the conduction into it is G. The
116  // slab's conductivity, heat capacity and thickness, and the face's albedo
117  // and emissivity, come from the material library (SLUCM schema) when
118  // material_file is given: material_default for every building, or one
119  // id per building in material_by_building (indexed by level 0's building
120  // id from 1; every level maps its buildings to level 0's). Without a file
121  // the uniform values below apply to every face.
122  std::string material_file;
124  std::vector<int> material_by_building;
125  amrex::Real k_therm = 1.0; ///< Uniform conductivity [W/m/K]
126  amrex::Real rho_cp = 1.6e6; ///< Uniform volumetric heat capacity [J/m3/K]
127  amrex::Real thickness = 0.3; ///< Uniform slab thickness [m]
128 
129  // ---- Prognostic balance -------------------------------------------------
130  // With prognostic on, every step solves the massless-skin balance
131  // SW_abs + eps Q_ext + LW_net - H - LE - G = 0 for the skin temperature
132  // of every face by Newton's method (ERF_IBSEBBalance.H), consistent with
133  // the implicit slab step, and stores the fluxes at the solution. Off, the
134  // skin stays at T_skin_init (or the restart value) and the terms are
135  // diagnosed around it, which is what the term-by-term regression tests
136  // use to check each term on its own.
137  bool prognostic = true;
138  amrex::Real T_skin_min = 260.0; ///< Lower bound of the skin temperature [K]
139  amrex::Real T_skin_max = 380.0; ///< Upper bound [K]; raise it for faces under a fire
140  int newton_max_iter = 20; ///< Newton iteration cap per face and step
141  amrex::Real newton_tol_K = 1.0e-3; ///< Newton stops when a step changes T_skin by less than this [K]
142  amrex::Real newton_max_step_K = 20.0; ///< Largest Newton step [K]
143  amrex::Real Q_ext_uniform = 0.0; ///< Uniform external incident flux on every face [W/m2] (test hook)
144 
145  // ---- Wall function beyond neutral ----------------------------------------
146  // stability_correction (above) applies the surface layer's similarity
147  // functions on roofs with the face's own Obukhov length, seeded from the
148  // ground surface layer's 2D Obukhov field at the face's column when
149  // obukhov_seed = "ground" (or from neutral). convective_velocity =
150  // "deardorff" adds a convective velocity scale to the wind the wall
151  // function sees, U_eff^2 = U_tan^2 + (beta w*)^2 with
152  // w* = (g/theta H/(rho c_p) depth)^(1/3) from the previous step's H when it
153  // is out of the face, so u* does not collapse when the wind dies. The
154  // depth is the mixed layer above a roof (z_i - z_face, floored at the
155  // building height; z_i from the bulk Richardson diagnostic on the
156  // horizontal-mean profile, from ERF's surface-layer pblh, or fixed) and
157  // the building height for a wall. All off by default.
158  std::string obukhov_seed = "ground"; ///< "ground" or "neutral"
159  std::string convective_velocity = "none"; ///< "none" or "deardorff"
160  amrex::Real beta_conv = 1.2; ///< Gustiness factor on w*
161  std::string z_i_mode = "bulk_ri"; ///< "bulk_ri", "pblh" or "fixed"
162  amrex::Real z_i = 1000.0; ///< Fixed mixed-layer depth [m] (z_i_mode = fixed, and the fallback)
163  amrex::Real ri_crit = 0.25; ///< Critical bulk Richardson number of the diagnostic
164  amrex::Real obukhov_relax = 0.5; ///< Under-relaxation of the roof's u*, theta* iteration (1 = none), as erf-model #3486
165 
166  /**
167  * Read the ``erf.ibseb.*`` inputs and validate them.
168  *
169  * Only queried, never required: a deck without any ``erf.ibseb`` key gets
170  * the defaults above with the balance off. Validation is skipped when the
171  * balance is off so an unrelated deck cannot abort on an unused key.
172  */
173  void init_params ()
174  {
175  amrex::ParmParse pp("erf.ibseb");
176  pp.query("enable", enable);
177  pp.query("n_slab_layers", n_slab_layers);
178  pp.query("T_skin_init", T_skin_init);
179  pp.query("T_interior", T_interior);
180  pp.query("csv_file", csv_file);
181  pp.query("csv_int", csv_int);
182  pp.query("debug", debug);
183  pp.query("dump_faces_file", dump_faces_file);
184  pp.query("dump_faces_tag_step", dump_faces_tag_step);
185  pp.query("radiation", radiation);
186  pp.query("sun_mode", sun_mode);
187  pp.query("sun_zenith_deg", sun_zenith_deg);
188  pp.query("sun_azimuth_deg", sun_azimuth_deg);
189  pp.query("sw_direct_normal", sw_direct_normal);
190  pp.query("sw_diffuse", sw_diffuse);
191  pp.query("latitude_deg", latitude_deg);
192  pp.query("longitude_deg", longitude_deg);
193  pp.query("day_of_year", day_of_year);
194  pp.query("time_zero_utc_s", time_zero_utc_s);
195  pp.query("solar_constant", solar_constant);
196  pp.query("sw_transmission", sw_transmission);
197  pp.query("sw_diffuse_coeff", sw_diffuse_coeff);
198  pp.query("sun_min_elev_deg", sun_min_elev_deg);
199  pp.query("albedo", albedo);
200  pp.query("albedo_ground", albedo_ground);
201  pp.query("emissivity", emissivity);
202  pp.query("emissivity_ground", emissivity_ground);
203  pp.query("view_n_az", view_n_az);
204  pp.query("view_n_el", view_n_el);
205  pp.query("lw_mode", lw_mode);
206  pp.query("lw_down", lw_down);
207  pp.query("sky_emissivity", sky_emissivity);
208  pp.query("T_ground", T_ground);
209  pp.query("z0_wall", z0_wall);
210  pp.query("z0h_wall", z0h_wall);
211  pp.query("stability_correction", stability_correction);
212  pp.query("couple_heat", couple_heat);
213  pp.query("material_file", material_file);
214  pp.query("material_default", material_default);
215  pp.queryarr("material_by_building", material_by_building);
216  pp.query("k_therm", k_therm);
217  pp.query("rho_cp", rho_cp);
218  pp.query("thickness", thickness);
219  pp.query("prognostic", prognostic);
220  pp.query("T_skin_min", T_skin_min);
221  pp.query("T_skin_max", T_skin_max);
222  pp.query("newton_max_iter", newton_max_iter);
223  pp.query("newton_tol_K", newton_tol_K);
224  pp.query("newton_max_step_K", newton_max_step_K);
225  pp.query("Q_ext_uniform", Q_ext_uniform);
226  pp.query("obukhov_seed", obukhov_seed);
227  pp.query("convective_velocity", convective_velocity);
228  pp.query("beta_conv", beta_conv);
229  pp.query("z_i_mode", z_i_mode);
230  pp.query("z_i", z_i);
231  pp.query("ri_crit", ri_crit);
232  pp.query("obukhov_relax", obukhov_relax);
233  if (enable) {
234  if (radiation != "prescribed" && radiation != "two_stream") {
235  amrex::Abort("erf.ibseb.radiation must be \"prescribed\" or \"two_stream\"");
236  }
237  // The column's longwave goes with its shortwave unless the deck says otherwise.
238  if (radiation == "two_stream" && !pp.contains("lw_mode")) { lw_mode = "two_stream"; }
239  // The columns bring the irradiances and the ground's reflection; the
240  // clear-sky formulas and the uniform ground albedo are not used.
241  if (radiation == "two_stream") {
242  for (const char* k : {"sw_direct_normal", "sw_diffuse", "sw_transmission", "sw_diffuse_coeff",
243  "solar_constant", "albedo_ground"}) {
244  if (pp.contains(k)) {
245  amrex::Abort(std::string("erf.ibseb.") + k + " is not used with erf.ibseb.radiation = two_stream:"
246  " the faces take the two-stream columns' irradiances and the ground's reflection;"
247  " remove it");
248  }
249  }
250  }
251  if (sun_mode != "fixed" && sun_mode != "solar" && sun_mode != "two_stream") {
252  amrex::Abort("erf.ibseb.sun_mode must be \"fixed\", \"solar\" or \"two_stream\"");
253  }
254  // The two-stream sun brings its own position, site, date and irradiance.
255  if (sun_mode == "two_stream") {
256  for (const char* k : {"latitude_deg", "longitude_deg", "day_of_year", "time_zero_utc_s", "solar_constant",
257  "sun_zenith_deg", "sun_azimuth_deg", "sw_direct_normal", "sw_diffuse"}) {
258  if (pp.contains(k)) {
259  amrex::Abort(std::string("erf.ibseb.") + k + " is not used with erf.ibseb.sun_mode = two_stream:"
260  " the faces take the two-stream sun (start_datetime, erf.rad_cons_lat / lon,"
261  " erf.fixed_total_solar_irradiance); remove it");
262  }
263  }
264  }
265  if (sun_zenith_deg < 0.0 || sun_zenith_deg > 180.0) { amrex::Abort("erf.ibseb.sun_zenith_deg must be in [0, 180]"); }
266  if (latitude_deg < -90.0 || latitude_deg > 90.0) { amrex::Abort("erf.ibseb.latitude_deg must be in [-90, 90]"); }
267  if (longitude_deg < -180.0 || longitude_deg > 180.0) { amrex::Abort("erf.ibseb.longitude_deg must be in [-180, 180]"); }
268  if (day_of_year < 1.0 || day_of_year > 366.0) { amrex::Abort("erf.ibseb.day_of_year must be in [1, 366]"); }
269  // The sun is computed from UTC (time_zero_utc_s) and the longitude; a
270  // time-zone offset has no place in that and used to cancel silently.
271  if (pp.contains("utc_offset_hours")) {
272  amrex::Abort("erf.ibseb.utc_offset_hours is not an input: the sun follows time_zero_utc_s (UTC) and longitude_deg; remove it");
273  }
274  if (sw_direct_normal < 0.0 || sw_diffuse < 0.0) { amrex::Abort("erf.ibseb.sw_direct_normal and sw_diffuse must be >= 0"); }
275  if (sw_transmission <= 0.0 || sw_transmission > 1.0) { amrex::Abort("erf.ibseb.sw_transmission must be in (0, 1]"); }
276  if (sw_diffuse_coeff < 0.0 || sw_diffuse_coeff > 1.0) { amrex::Abort("erf.ibseb.sw_diffuse_coeff must be in [0, 1]"); }
277  if (solar_constant <= 0.0) { amrex::Abort("erf.ibseb.solar_constant must be > 0"); }
278  if (sun_min_elev_deg <= 0.0 || sun_min_elev_deg >= 90.0) {
279  amrex::Abort("erf.ibseb.sun_min_elev_deg must be in (0, 90) [deg]");
280  }
281  if (albedo < 0.0 || albedo > 1.0 || albedo_ground < 0.0 || albedo_ground > 1.0) {
282  amrex::Abort("erf.ibseb.albedo and albedo_ground must be in [0, 1]");
283  }
284  if (emissivity <= 0.0 || emissivity > 1.0 || emissivity_ground <= 0.0 || emissivity_ground > 1.0 ||
285  sky_emissivity <= 0.0 || sky_emissivity > 1.0) {
286  amrex::Abort("erf.ibseb emissivities must be in (0, 1]");
287  }
288  if (view_n_az < 1 || view_n_el < 1) { amrex::Abort("erf.ibseb.view_n_az and view_n_el must be >= 1"); }
289  if (lw_mode != "fixed" && lw_mode != "gray" && lw_mode != "two_stream") {
290  amrex::Abort("erf.ibseb.lw_mode must be \"fixed\", \"gray\" or \"two_stream\"");
291  }
292  if (lw_mode == "two_stream" && radiation != "two_stream") {
293  amrex::Abort("erf.ibseb.lw_mode = two_stream needs erf.ibseb.radiation = two_stream");
294  }
295  if (lw_mode == "two_stream") {
296  for (const char* k : {"lw_down", "sky_emissivity", "T_ground", "emissivity_ground"}) {
297  if (pp.contains(k)) {
298  amrex::Abort(std::string("erf.ibseb.") + k + " is not used with erf.ibseb.lw_mode = two_stream:"
299  " the faces take the two-stream columns' longwave down and the ground's longwave up;"
300  " remove it");
301  }
302  }
303  }
304  if (lw_down < 0.0 || T_ground <= 0.0) { amrex::Abort("erf.ibseb.lw_down must be >= 0 and T_ground > 0"); }
305  if (z0_wall <= 0.0 || z0h_wall <= 0.0) { amrex::Abort("erf.ibseb.z0_wall and z0h_wall must be positive [m]"); }
306  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"); }
307  if (n_slab_layers > 32) { amrex::Abort("erf.ibseb.n_slab_layers must be <= 32 (the slab kernels keep their layers on the stack)"); }
308  if (n_slab_layers < 1) { amrex::Abort("erf.ibseb.n_slab_layers must be >= 1"); }
309  if (T_skin_init <= 0.0 || T_interior <= 0.0) {
310  amrex::Abort("erf.ibseb.T_skin_init and T_interior must be positive [K]");
311  }
312  if (T_skin_min <= 0.0 || T_skin_max <= T_skin_min) {
313  amrex::Abort("erf.ibseb.T_skin_min must be positive and below T_skin_max");
314  }
315  if (prognostic && (T_skin_init < T_skin_min || T_skin_init > T_skin_max)) {
316  amrex::Abort("erf.ibseb.T_skin_init must lie within [T_skin_min, T_skin_max]");
317  }
318  if (newton_max_iter < 1 || newton_tol_K <= 0.0 || newton_max_step_K <= 0.0) {
319  amrex::Abort("erf.ibseb.newton_max_iter must be >= 1, newton_tol_K and newton_max_step_K positive");
320  }
321  if (Q_ext_uniform < 0.0) { amrex::Abort("erf.ibseb.Q_ext_uniform must be >= 0"); }
322  if (obukhov_seed != "ground" && obukhov_seed != "neutral") { amrex::Abort("erf.ibseb.obukhov_seed must be \"ground\" or \"neutral\""); }
323  if (convective_velocity != "none" && convective_velocity != "deardorff") {
324  amrex::Abort("erf.ibseb.convective_velocity must be \"none\" or \"deardorff\"");
325  }
326  if (z_i_mode != "bulk_ri" && z_i_mode != "pblh" && z_i_mode != "fixed") {
327  amrex::Abort("erf.ibseb.z_i_mode must be \"bulk_ri\", \"pblh\" or \"fixed\"");
328  }
329  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"); }
330  if (obukhov_relax <= 0.0 || obukhov_relax > 1.0) { amrex::Abort("erf.ibseb.obukhov_relax must be in (0, 1]"); }
331  }
332  }
333 };
334 
335 #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:142
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:159
amrex::Real T_ground
Ground temperature for the ground term [K].
Definition: ERF_IBSEBParams.H:98
amrex::Real Q_ext_uniform
Uniform external incident flux on every face [W/m2] (test hook)
Definition: ERF_IBSEBParams.H:143
amrex::Real day_of_year
solar: day of year
Definition: ERF_IBSEBParams.H:63
bool prognostic
Definition: ERF_IBSEBParams.H:137
int material_default
Definition: ERF_IBSEBParams.H:123
amrex::Real newton_tol_K
Newton stops when a step changes T_skin by less than this [K].
Definition: ERF_IBSEBParams.H:141
amrex::Real obukhov_relax
Under-relaxation of the roof's u*, theta* iteration (1 = none), as erf-model #3486.
Definition: ERF_IBSEBParams.H:164
amrex::Real z0_wall
Momentum roughness of the faces [m].
Definition: ERF_IBSEBParams.H:108
amrex::Real k_therm
Uniform conductivity [W/m/K].
Definition: ERF_IBSEBParams.H:125
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:126
std::string z_i_mode
"bulk_ri", "pblh" or "fixed"
Definition: ERF_IBSEBParams.H:161
amrex::Real thickness
Uniform slab thickness [m].
Definition: ERF_IBSEBParams.H:127
std::string material_file
Definition: ERF_IBSEBParams.H:122
int view_n_az
Definition: ERF_IBSEBParams.H:85
amrex::Real sky_emissivity
gray: effective clear-sky emissivity
Definition: ERF_IBSEBParams.H:97
amrex::Real sun_min_elev_deg
Definition: ERF_IBSEBParams.H:75
bool couple_heat
Add the face flux to the temperature equation.
Definition: ERF_IBSEBParams.H:111
amrex::Real ri_crit
Critical bulk Richardson number of the diagnostic.
Definition: ERF_IBSEBParams.H:163
amrex::Real longitude_deg
solar: site longitude, east positive
Definition: ERF_IBSEBParams.H:62
int view_n_el
Definition: ERF_IBSEBParams.H:86
std::vector< int > material_by_building
Definition: ERF_IBSEBParams.H:124
std::string lw_mode
Definition: ERF_IBSEBParams.H:95
amrex::Real albedo_ground
Ground albedo for the reflected diffuse term.
Definition: ERF_IBSEBParams.H:78
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:80
void init_params()
Definition: ERF_IBSEBParams.H:173
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:160
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:77
amrex::Real T_skin_min
Lower bound of the skin temperature [K].
Definition: ERF_IBSEBParams.H:138
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:96
amrex::Real z_i
Fixed mixed-layer depth [m] (z_i_mode = fixed, and the fallback)
Definition: ERF_IBSEBParams.H:162
amrex::Real z0h_wall
Heat roughness of the faces [m].
Definition: ERF_IBSEBParams.H:109
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:110
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:158
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:139
amrex::Real emissivity
Face longwave emissivity.
Definition: ERF_IBSEBParams.H:79
int newton_max_iter
Newton iteration cap per face and step.
Definition: ERF_IBSEBParams.H:140