ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_SimplifiedSEB.H
Go to the documentation of this file.
1 #ifndef ERF_SIMPLIFIED_SEB_H_
2 #define ERF_SIMPLIFIED_SEB_H_
3 
4 #include <AMReX_GpuControl.H>
5 #include <AMReX_Math.H>
6 #include <AMReX_FArrayBox.H>
7 #include <cmath>
8 
9 #include <ERF_Constants.H>
10 #include <ERF_MicrophysicsConstants.H> // rhor, the density of water
11 
12 /**
13  * @file ERF_SimplifiedSEB.H
14  * @brief Simplified SEB -- the two-stream model's surface energy balance, as pure functions.
15  *
16  * The residual diagnosis below, the force-restore tendencies of the skin temperature and
17  * soil water (prognostic_dTs_dt, prognostic_dqs_dt), the soil's moisture availability
18  * (seb_moisture_availability), the canopy and bare-soil resistances to evaporation
19  * (seb_canopy_resistance_without_vpd, seb_soil_evaporation_resistance), the relative
20  * humidity of bare soil's pore air (seb_soil_surface_relative_humidity), and the soil's
21  * thermal properties (seb_soil_heat_capacity, seb_soil_thermal_conductivity,
22  * seb_force_restore_heat_capacity).
23  *
24  * Surface Energy Balance Equation:
25  * R_net(i,j) = SW_net(i,j) + LW_net(i,j)
26  * = [sw_flux_sfc(i,j)] + [lw_flux_sfc(i,j)]
27  *
28  * SEB_residual(i,j) = R_net(i,j) - hfx_sfc(i,j) - lh_sfc(i,j) - grdflx_sfc(i,j)
29  *
30  * Where:
31  * - sw_flux_sfc: net shortwave flux at surface [W/m^2]
32  * - lw_flux_sfc: net longwave flux at surface [W/m^2]
33  * - hfx_sfc: sensible heat flux (H) [W/m^2]
34  * - lh_sfc: latent heat flux (LE) [W/m^2]
35  * - grdflx_sfc: ground heat flux (G) [W/m^2]
36  *
37  * A perfectly closed budget gives SEB_residual = 0; non-zero residual
38  * indicates energy not accounted for by the four main SEB terms.
39  *
40  * References:
41  * -----------
42  * - Oke, T. R., 1987: Boundary Layer Climates (2nd ed.), Routledge.
43  */
44 
45 /**
46  * @brief Diagnose the surface energy balance residual.
47  *
48  * Computes the SEB residual from net radiative flux and turbulent/ground
49  * heat fluxes. All inputs are guarded with amrex::Math::isfinite() to safely handle
50  * NaN/Inf; if any input is non-finite, returns 0.0 (safe no-op).
51  *
52  * **GPU Safety**:
53  * - AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
54  * - No host-side I/O
55  * - No dynamic allocation
56  * - Safe for use in device reduction kernels
57  *
58  * @param[in] sw_net Shortwave net flux at surface [W/m^2]
59  * @param[in] lw_net Longwave net flux at surface [W/m^2]
60  * @param[in] hfx Sensible heat flux [W/m^2]
61  * @param[in] lh Latent heat flux [W/m^2]
62  * @param[in] grdflx Ground heat flux [W/m^2]
63  *
64  * @return SEB residual [W/m^2] = (sw_net + lw_net) - hfx - lh - grdflx
65  * Returns 0.0 if any input is non-finite (NaN or Inf)
66  */
67 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
69  amrex::Real lw_net,
70  amrex::Real hfx,
71  amrex::Real lh,
72  amrex::Real grdflx)
73 {
74  // Guard all inputs against non-finite values (NaN, Inf)
75  if (!amrex::Math::isfinite(sw_net) || !amrex::Math::isfinite(lw_net) ||
76  !amrex::Math::isfinite(hfx) || !amrex::Math::isfinite(lh) || !amrex::Math::isfinite(grdflx)) {
77  return 0.0; // Safe no-op: return zero residual if any input is invalid
78  }
79 
80  // Compute net radiation
81  amrex::Real r_net = sw_net + lw_net;
82 
83  // Compute SEB residual
84  amrex::Real seb_residual = r_net - hfx - lh - grdflx;
85 
86  return seb_residual;
87 }
88 
89 /**
90  * @brief Compute prognostic surface temperature tendency using force-restore formulation.
91  *
92  * Computes dT_s/dt from SEB residual and restoring term toward deep soil temperature:
93  * dT_s/dt = SEB_residual / C_s - (2*pi/tau) * (T_s - T_deep)
94  *
95  * All inputs are guarded with amrex::Math::isfinite() to safely handle NaN/Inf; if any input
96  * is non-finite, any parameter is non-positive (C_s <= 0, tau <= 0), returns 0.0 (safe no-op).
97  *
98  * **GPU Safety**:
99  * - AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
100  * - No host-side I/O
101  * - No dynamic allocation
102  * - Safe for use in device kernels
103  *
104  * @param[in] seb_residual SEB residual [W/m^2] = R_net - H - LE - G
105  * @param[in] t_s Current surface temperature [K]
106  * @param[in] t_deep Deep soil temperature [K]
107  * @param[in] c_s Effective surface heat capacity [J/(m^2*K)]
108  * @param[in] tau Force-restore timescale [s]
109  *
110  * @return Temperature tendency dT_s/dt [K/s]
111  * Returns 0.0 if any input is non-finite or any parameter is non-positive
112  */
113 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
115  amrex::Real t_s,
116  amrex::Real t_deep,
117  amrex::Real c_s,
118  amrex::Real tau)
119 {
120  // Guard all inputs against non-finite values
121  if (!amrex::Math::isfinite(seb_residual) || !amrex::Math::isfinite(t_s) ||
122  !amrex::Math::isfinite(t_deep) || !amrex::Math::isfinite(c_s) || !amrex::Math::isfinite(tau)) {
123  return 0.0; // Safe no-op
124  }
125 
126  // Validate parameter ranges
127  if (c_s <= 0.0 || tau <= 0.0) {
128  return 0.0; // Safe no-op for invalid parameters
129  }
130 
131  // Compute tendency: SEB_residual / C_s - (2*pi/tau) * (T_s - T_deep)
132  amrex::Real seb_term = seb_residual / c_s;
133  amrex::Real restore_term = (2.0 * PI / tau) * (t_s - t_deep);
134  amrex::Real dt_s_dt = seb_term - restore_term;
135 
136  return dt_s_dt;
137 }
138 
139 /**
140  * @brief Compute prognostic surface moisture tendency using force-restore formulation.
141  *
142  * Computes dq_s/dt from latent heat flux and restoring term toward deep soil moisture:
143  * dq_s/dt = -(LE / (L_v * rhor * d_s)) - (1/tau_q) * (q_s - q_deep)
144  *
145  * Constants:
146  * - L_v = 2.5e6 J/kg (latent heat of vaporization)
147  * - rhor = 1000.0 kg/m^3 (water density, from ERF_MicrophysicsConstants.H)
148  *
149  * All inputs are guarded with amrex::Math::isfinite() to safely handle NaN/Inf; if any input
150  * is non-finite, any parameter is non-positive (d_s <= 0, tau_q <= 0), returns 0.0 (safe no-op).
151  *
152  * **GPU Safety**:
153  * - AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
154  * - No host-side I/O
155  * - No dynamic allocation
156  * - Safe for use in device kernels
157  *
158  * @param[in] le Latent heat flux [W/m^2]
159  * @param[in] q_s Current surface moisture: the volumetric water content [m^3/m^3] of a soil
160  * layer d_s deep, which is what LE / (L_v rhor d_s) drains
161  * @param[in] q_deep Deep soil moisture, in q_s's units
162  * @param[in] d_s Effective surface moisture layer depth [m]
163  * @param[in] tau_q Moisture force-restore timescale [s]
164  *
165  * @return Moisture tendency dq_s/dt [1/s, in q_s's units]
166  * Returns 0.0 if any input is non-finite or any parameter is non-positive
167  */
168 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
170  amrex::Real q_s,
171  amrex::Real q_deep,
172  amrex::Real d_s,
173  amrex::Real tau_q)
174 {
175  // Guard all inputs against non-finite values
176  if (!amrex::Math::isfinite(le) || !amrex::Math::isfinite(q_s) ||
177  !amrex::Math::isfinite(q_deep) || !amrex::Math::isfinite(d_s) || !amrex::Math::isfinite(tau_q)) {
178  return 0.0; // Safe no-op
179  }
180 
181  // Validate parameter ranges
182  if (d_s <= 0.0 || tau_q <= 0.0) {
183  return 0.0; // Safe no-op for invalid parameters
184  }
185 
186  // L_v and rhor both come from ERF_Constants.H. A local L_v here shadowed
187  // the global one, and a local water density duplicated rhor.
188 
189  // Compute tendency: -(LE / (L_v * rhor * d_s)) - (1/tau_q) * (q_s - q_deep)
190  amrex::Real le_term = -(le / (L_v * rhor * d_s));
191  amrex::Real restore_term = (1.0 / tau_q) * (q_s - q_deep);
192  amrex::Real dq_s_dt = le_term - restore_term;
193 
194  return dq_s_dt;
195 }
196 
197 /**
198  * @brief Moisture availability beta of the force-restore surface, from its water content.
199  *
200  * With the prognostic balance, q_s is the volumetric water content [m^3/m^3] of a surface
201  * layer seb_moisture_layer_depth_m deep (see prognostic_dqs_dt). The surface evaporates at
202  * the potential rate when that layer is at or above field capacity, not at all at or below
203  * the wilting point, and in proportion in between:
204  *
205  * beta = clamp((q_s - q_wilt) / (q_fc - q_wilt), 0, 1)
206  *
207  * the "beta" closure of bucket and force-restore land surfaces. The surface layer then
208  * takes the surface mixing ratio beta * q_sat(T_s, p_s) + (1 - beta) * q_air
209  * (erf_surface_moisture::surface_mixing_ratio), so its moisture flux is beta times the
210  * potential one.
211  *
212  * @param[in] q_s surface-layer water content [m^3/m^3]
213  * @param[in] q_wilt wilting point [m^3/m^3]
214  * @param[in] q_fc field capacity [m^3/m^3], above q_wilt
215  * @return beta in [0, 1]; 0 for any non-finite input or q_fc <= q_wilt
216  */
217 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
219  amrex::Real q_wilt,
220  amrex::Real q_fc)
221 {
222  if (!amrex::Math::isfinite(q_s) || !amrex::Math::isfinite(q_wilt) ||
223  !amrex::Math::isfinite(q_fc) || !(q_fc > q_wilt)) {
224  return amrex::Real(0.0);
225  }
226  const amrex::Real beta = (q_s - q_wilt) / (q_fc - q_wilt);
227  return amrex::max(amrex::Real(0.0), amrex::min(amrex::Real(1.0), beta));
228 }
229 
230 /**
231  * @brief Canopy resistance to transpiration [s/m] without its vapour-deficit factor.
232  *
233  * Noah's big-leaf Jarvis form (Chen et al. 1996) on the parameters and floors of Noah-MP's
234  * canopy-resistance option 2 (ResistanceCanopyStomataJarvisMod). Noah-MP itself applies
235  * the factors per sunlit and shaded leaf, with the absorbed PAR (f = 2 PAR / RGL), the
236  * canopy temperature and canopy-air humidity, and a root-zone soil-water factor; here one
237  * big leaf takes the shortwave reaching the surface, the skin temperature, the air at the
238  * surface layer's reference height and the top layer's soil-water factor:
239  *
240  * r_c = RS / (LAI * F_sw * F_T * F_vpd * F_soil),
241  * F_sw = (f + RS/RSMAX) / (1 + f), f = 0.55 * 2 SW_down / (RGL * LAI),
242  * F_T = 1 - 0.0016 (TOPT - T)^2,
243  *
244  * F_soil the soil-water factor (seb_moisture_availability) and F_vpd the vapour-deficit
245  * factor, which needs the air's humidity and is applied by the surface layer
246  * (erf_surface_moisture::vapour_deficit_factor); this returns r_c * F_vpd. F_sw and F_T
247  * are floored at 1e-4 as in Noah-MP, F_soil at 1e-6 (Noah-MP's MinThr).
248  *
249  * @return r_c * F_vpd [s/m], capped at 1e6 (no transpiration), which is also the value
250  * without leaves or for a non-finite input. The surface layer divides by F_vpd
251  * and caps the result at 1e6 again (erf_surface_moisture::canopy_resistance).
252  */
253 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
255  amrex::Real rgl, amrex::Real t_opt,
256  amrex::Real lai, amrex::Real sw_down,
257  amrex::Real t_canopy, amrex::Real soil_factor)
258 {
259  constexpr amrex::Real no_transpiration = amrex::Real(1.0e6);
260  if (!amrex::Math::isfinite(rs_min) || !amrex::Math::isfinite(rs_max) ||
261  !amrex::Math::isfinite(rgl) || !amrex::Math::isfinite(t_opt) ||
262  !amrex::Math::isfinite(lai) || !amrex::Math::isfinite(sw_down) ||
263  !amrex::Math::isfinite(t_canopy) || !amrex::Math::isfinite(soil_factor) ||
264  !(lai > amrex::Real(0.0)) || !(rgl > amrex::Real(0.0)) || !(rs_max > amrex::Real(0.0))) {
265  return no_transpiration;
266  }
267  const amrex::Real f = amrex::Real(0.55) * amrex::Real(2.0) *
268  amrex::max(amrex::Real(0.0), sw_down) / (rgl * lai);
269  const amrex::Real f_sw = amrex::max(amrex::Real(1.0e-4), (f + rs_min / rs_max) / (amrex::Real(1.0) + f));
270  const amrex::Real dt = t_opt - t_canopy;
271  const amrex::Real f_t = amrex::max(amrex::Real(1.0e-4), amrex::Real(1.0) - amrex::Real(0.0016) * dt * dt);
272  const amrex::Real f_soil = amrex::max(amrex::Real(1.0e-6), soil_factor);
273  return amrex::min(no_transpiration, rs_min / (lai * f_sw * f_t * f_soil));
274 }
275 
276 /**
277  * @brief Resistance of bare soil to evaporation [s/m], Noah-MP's ground-evaporation option 1
278  * (Sakaguchi and Zeng 2009; ResistanceGroundEvaporationMod): vapour diffuses through a dry
279  * surface layer whose thickness grows as the top soil dries,
280  *
281  * d_dry = d1 (exp((1 - min(1, theta/theta_sat))^p) - 1) / (e - 1),
282  * D = 2.2e-5 theta_sat^2 (1 - theta_wilt/theta_sat)^(2 + 3/b),
283  * r = d_dry / D,
284  *
285  * with d1 the top layer's thickness and p = RSURF_EXP; 1e6 below theta = 0.01, as in Noah-MP.
286  */
287 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
289  amrex::Real theta_wilt, amrex::Real b,
291 {
292  constexpr amrex::Real no_evaporation = amrex::Real(1.0e6);
293  if (!amrex::Math::isfinite(theta) || !(theta >= amrex::Real(0.01)) ||
294  !(theta_sat > amrex::Real(0.0)) || !(b > amrex::Real(0.0)) || !(d1 > amrex::Real(0.0)) ||
295  !(theta_wilt < theta_sat)) {
296  return no_evaporation;
297  }
298  const amrex::Real dry = amrex::Real(1.0) - amrex::min(amrex::Real(1.0), theta / theta_sat);
299  const amrex::Real d_dry = d1 * (std::exp(std::pow(dry, p)) - amrex::Real(1.0)) /
300  (amrex::Real(2.71828) - amrex::Real(1.0));
301  const amrex::Real diffusivity = amrex::Real(2.2e-5) * theta_sat * theta_sat *
302  std::pow(amrex::Real(1.0) - theta_wilt / theta_sat, amrex::Real(2.0) + amrex::Real(3.0) / b);
303  return amrex::min(no_evaporation, d_dry / diffusivity);
304 }
305 
306 /**
307  * @brief Relative humidity of the air in the top soil's pores, Noah-MP's for bare ground
308  * (ResistanceGroundEvaporationMod), so that bare soil evaporates from RH * q_sat(T):
309  *
310  * psi = -psi_sat (max(0.01, theta) / theta_sat)^(-b),
311  * RH = exp(psi g / (R_v T)),
312  *
313  * with Noah-MP's g = 9.80616 m/s^2 and R_v = 461.269 J/kg/K. Near 1 in moist soil, and
314  * near 0 at the wilting point (about 0.005 for silty clay loam at 325 K). Returns 1
315  * (no reduction) for a non-finite or non-positive parameter or temperature.
316  */
317 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
319  amrex::Real psi_sat, amrex::Real b,
320  amrex::Real t_ground)
321 {
322  if (!amrex::Math::isfinite(theta) || !amrex::Math::isfinite(t_ground) ||
323  !(theta_sat > amrex::Real(0.0)) || !(psi_sat > amrex::Real(0.0)) ||
324  !(b > amrex::Real(0.0)) || !(t_ground > amrex::Real(0.0))) {
325  return amrex::Real(1.0);
326  }
327  const amrex::Real psi = -psi_sat * std::pow(amrex::max(amrex::Real(0.01), theta) / theta_sat, -b);
328  return std::exp(psi * amrex::Real(9.80616) / (amrex::Real(461.269) * t_ground));
329 }
330 
331 /**
332  * @brief Volumetric heat capacity of unfrozen soil [J/m^3/K], as Noah-MP forms it
333  * (SoilThermalPropertyMod): water theta * 4.188e6, solids (1 - theta_sat) * c_soil, and
334  * the air in the remaining pores (theta_sat - theta) * 1004.64 (Noah-MP's constant,
335  * applied per unit volume as Noah-MP does).
336  */
337 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
339 {
340  return theta * amrex::Real(4.188e6) + (amrex::Real(1.0) - theta_sat) * c_soil +
341  amrex::max(amrex::Real(0.0), theta_sat - theta) * amrex::Real(1004.64);
342 }
343 
344 /**
345  * @brief Thermal conductivity of unfrozen soil [W/m/K], Noah-MP's Johansen form
346  * (SoilThermalPropertyMod): solids 7.7^q 2^(1-q) for quartz fraction q, saturated
347  * lambda_solid^(1-theta_sat) 0.57^theta_sat, dry (0.135 g + 64.7)/(2700 - 0.947 g) with
348  * g = 2700 (1 - theta_sat), blended by the Kersten number log10(theta/theta_sat) + 1
349  * (0 below a saturation of 0.1).
350  */
351 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
353 {
354  const amrex::Real lambda_solid = std::pow(amrex::Real(7.7), quartz) *
355  std::pow(amrex::Real(2.0), amrex::Real(1.0) - quartz);
356  const amrex::Real lambda_sat = std::pow(lambda_solid, amrex::Real(1.0) - theta_sat) *
357  std::pow(amrex::Real(0.57), theta_sat);
358  const amrex::Real gamma = (amrex::Real(1.0) - theta_sat) * amrex::Real(2700.0);
359  const amrex::Real lambda_dry = (amrex::Real(0.135) * gamma + amrex::Real(64.7)) /
360  (amrex::Real(2700.0) - amrex::Real(0.947) * gamma);
361  const amrex::Real sat_ratio = theta / theta_sat;
362  const amrex::Real kersten = (sat_ratio > amrex::Real(0.1))
363  ? std::log10(sat_ratio) + amrex::Real(1.0) : amrex::Real(0.0);
364  return kersten * (lambda_sat - lambda_dry) + lambda_dry;
365 }
366 
367 /**
368  * @brief Surface heat capacity [J/m^2/K] of the force-restore balance for a soil of
369  * volumetric heat capacity c and conductivity lambda: the heat capacity of the layer the
370  * diurnal wave penetrates, c d / (2 sqrt(pi)) with d = sqrt(lambda tau / c) (Deardorff
371  * 1978), i.e. sqrt(lambda c tau / pi) / 2 for a restore period tau [s].
372  */
373 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
375 {
376  return amrex::Real(0.5) * std::sqrt(lambda * c * tau / amrex::Real(3.14159265358979323846));
377 }
378 
379 #endif // ERF_SIMPLIFIED_SEB_H_
constexpr amrex::Real L_v
Definition: ERF_Constants.H:63
amrex::Real gamma
Definition: ERF_InitCustomPert_DataAssimilation_ISV.H:9
Physical constants and tuning parameters used only by the moisture and cloud-physics code.
constexpr amrex::Real rhor
Definition: ERF_MicrophysicsConstants.H:39
constexpr amrex::Real PI
Definition: ERF_NumericalConstants.H:46
amrex::Real Real
Definition: ERF_ShocInterface.H:19
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_soil_evaporation_resistance(amrex::Real theta, amrex::Real theta_sat, amrex::Real theta_wilt, amrex::Real b, amrex::Real d1, amrex::Real p)
Resistance of bare soil to evaporation [s/m], Noah-MP's ground-evaporation option 1 (Sakaguchi and Ze...
Definition: ERF_SimplifiedSEB.H:288
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real seb_moisture_availability(amrex::Real q_s, amrex::Real q_wilt, amrex::Real q_fc)
Moisture availability beta of the force-restore surface, from its water content.
Definition: ERF_SimplifiedSEB.H:218
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real seb_soil_surface_relative_humidity(amrex::Real theta, amrex::Real theta_sat, amrex::Real psi_sat, amrex::Real b, amrex::Real t_ground)
Relative humidity of the air in the top soil's pores, Noah-MP's for bare ground (ResistanceGroundEvap...
Definition: ERF_SimplifiedSEB.H:318
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real diagnose_seb_residual(amrex::Real sw_net, amrex::Real lw_net, amrex::Real hfx, amrex::Real lh, amrex::Real grdflx)
Diagnose the surface energy balance residual.
Definition: ERF_SimplifiedSEB.H:68
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real prognostic_dqs_dt(amrex::Real le, amrex::Real q_s, amrex::Real q_deep, amrex::Real d_s, amrex::Real tau_q)
Compute prognostic surface moisture tendency using force-restore formulation.
Definition: ERF_SimplifiedSEB.H:169
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real seb_canopy_resistance_without_vpd(amrex::Real rs_min, amrex::Real rs_max, amrex::Real rgl, amrex::Real t_opt, amrex::Real lai, amrex::Real sw_down, amrex::Real t_canopy, amrex::Real soil_factor)
Canopy resistance to transpiration [s/m] without its vapour-deficit factor.
Definition: ERF_SimplifiedSEB.H:254
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
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real prognostic_dTs_dt(amrex::Real seb_residual, amrex::Real t_s, amrex::Real t_deep, amrex::Real c_s, amrex::Real tau)
Compute prognostic surface temperature tendency using force-restore formulation.
Definition: ERF_SimplifiedSEB.H:114
@ lai
Definition: ERF_SLM.H:76
@ theta
Definition: ERF_Kessler.H:26
@ beta
Definition: ERF_SLM.H:152
@ p
Definition: ERF_WSM6.H:280