Surface#

Submodules#

Module contents#

class abcmodel.land.surface.StandardSurfaceModel(lam=5.9, rsmin=110.0, lai=2.0)[source]#

Bases: AbstractSurfaceModel[StandardSurfaceState]

Standard surface model calculating skin temperature and energy fluxes.

Parameters:
  • lam (float) – thermal diffusivity of the soil/skin layer [W m-1 K-1]. Default is 5.9.

  • rsmin (float) – minimum stomatal resistance [s m-1]. Default is 110.0.

  • lai (float) – leaf area index [m2 m-2]. Default is 2.0.

init_state(alpha=0.25, surf_temp=290.0)[source]#

Initialize the surface state.

Parameters:
  • alpha (float) – surface albedo [-]. Default is 0.25.

  • surf_temp (float) – surface skin temperature [K]. Default is 290.0.

Returns:

The initialized StandardSurfaceState.

run(state)[source]#

Compute surface energy balance, skin temperature, and fluxes.

compute_dqsatdT(esat, theta, surf_pressure)[source]#

Compute the derivative of saturation vapor pressure with respect to temperature dqsatdT.

Notes

Using compute_esat(), the derivative of the saturated vapor pressure \(e_\text{sat}\) with respect to temperature \(T\) is given by

\[\frac{\text{d}e_\text{sat}}{\text{d} T} = e_\text{sat}\frac{17.2694(T-237.16)}{(T-35.86)^2},\]

which combined with compute_qsat() can be used to get

\[\frac{\text{d}q_{\text{sat}}}{\text{d} T} \approx \epsilon \frac{\frac{\text{d}e_\text{sat}}{\text{d} T}}{p}.\]
compute_e(q, surf_pressure)[source]#

Compute the vapor pressure e.

Notes

This function uses the same formula used in compute_esat(), but now factoring the vapor pressure \(e\) as a function of specific humidity \(q\) and surface pressure \(p\), which give us

\[e = q \cdot p / 0.622.\]
compute_skin_temperature(net_rad, theta, q, qsat, dqsatdT, ra, rs, rssoil, cliq, temp_soil, cveg)[source]#

Compute the skin temperature surf_temp.

Notes

The skin temperature is obtained by solving the surface energy balance

\[R_n = H + LE_{\text{veg}} + LE_{\text{liq}} + LE_{\text{soil}} + G\]

where \(R_n\) is the net rad, \(H\) is the sensible heat flux (see compute_hf()), \(LE_{\text{veg}}\) is the latent heat flux from vegetation (see compute_le_veg()), \(LE_{\text{liq}}\) is the latent heat flux from dew on leaves (see compute_le_liq()), \(LE_{\text{soil}}\) is the latent heat flux from the soil (see compute_le_soil()) and \(G\) is the ground heat flux (see compute_gf()).

The equation is solved for the skin temperature \(T_s\) by factoring out \(T_s\) from the above, giving us

\[T_s = \frac{ R_n + \frac{\rho c_p}{r_a} \theta + c_{\text{veg}} (1-c_{\text{liq}}) \frac{\rho L_v}{r_a + r_s} (\frac{\text{d}q_{\text{sat}}}{\text{d}T} \theta - q_{\text{sat}} + q) + (1-c_{\text{veg}}) \frac{\rho L_v}{r_a + r_{s,\text{soil}}} (\frac{\text{d}q_{\text{sat}}}{\text{d}T} \theta - q_{\text{sat}} + q) + c_{\text{veg}} c_{\text{liq}} \frac{\rho L_v}{r_a} (\frac{\text{d}q_{\text{sat}}}{\text{d}T} \theta - q_{\text{sat}} + q) + \Lambda T_{\text{soil}} }{ \frac{\rho c_p}{r_a} + c_{\text{veg}} (1-c_{\text{liq}}) \frac{\rho L_v}{r_a + r_s} \frac{\text{d}q_{\text{sat}}}{\text{d}T} + (1-c_{\text{veg}}) \frac{\rho L_v}{r_a + r_{s,\text{soil}}} \frac{\text{d}q_{\text{sat}}}{\text{d}T} + c_{\text{veg}} c_{\text{liq}} \frac{\rho L_v}{r_a} \frac{\text{d}q_{\text{sat}}}{\text{d}T} + \Lambda }.\]

The terms computed in the equation above in each related function energy flux related method. This approach ensures that the computed skin temperature is consistent with the partitioning of energy fluxes as calculated by the other methods in this class.

compute_le_veg(surf_temp, theta, q, qsat, dqsatdT, ra, rs, cliq, cveg)[source]#

Compute the latent heat flux (transpiration) from vegetation le_veg.

Notes

The latent heat flux is given by

\[LE_{\text{veg}} = \frac{\rho L_v}{r_a+r_s}(q_{\text{sat}}(T_s)-⟨q⟩),\]

where \(\rho\) is the density of air, \(L_v\) is the latent heat of vaporization, \(r_a\) is the aerodynamic resistance, \(r_s\) is the soil resistance, \(q_{\text{sat}}(T_s)\) is the saturation specific humidity at surface temperature, \(⟨q⟩\) is the specific humidity at the surface.

\(q_{\text{sat}}(T_s)\) has very short time-scales because of the small heat capacity (excluding vegetation) of the surface layer and is hard to measure. Consequently, we get \(q_{\text{sat}}(T_s)\) implicitly using

\[q_{\text{sat}}(T_s) = \frac{\text{d}q_{\text{sat}}}{\text{d}T}(\theta_s-\theta),\]

where \(\theta_s\) and \(\theta\) are the potential temperature of the surface layer and mixed layer, respectively.

In the end, we scale the latent heat flux by the vegetation cover fraction \(c_{\text{veg}}\) and the liquid water content \(c_{\text{liq}}\) and return

\[c_{\text{veg}}(1-c_{\text{liq}})LE_{\text{veg}}.\]

References

Equation 9.15 from the CLASS book.

compute_le_liq(surf_temp, theta, q, qsat, dqsatdT, ra, cliq, cveg)[source]#

Compute the latent heat flux on the leaf (dew) le_liq.

Notes

We proceed just like in compute_le_veg(), but omitting vegetation’s resistance \(r_s\), with the assumption that water at the leaf is ready to be evaporated, giving us

\[LE_{\text{liq}} = \frac{\rho L_v}{r_a}(q_{\text{sat}}(T_s)-⟨q⟩).\]

In the end, we scale the result by the fraction of liquid water content \(c_{\text{liq}}\) and the fraction of vegetation \(c_{\text{veg}}\).

References

Equation 9.18 from the CLASS book.

compute_le_soil(surf_temp, theta, q, qsat, dqsatdT, ra, rssoil, cveg)[source]#

Compute the latent heat flux on the soil (evaporation) le_soil.

Notes

We proceed just like in compute_le_veg(), but instead of considering resistance from the vegetation, we consider the resistance from the soil \(r_{soil}\), giving us

\[LE_{\text{soil}} = \frac{\rho L_v}{r_a + r_{soil}}(q_{\text{sat}}(T_s)-⟨q⟩)\]

In the end, we scale the result by the fraction of soil \(c_{\text{soil}} = 1 - c_{\text{veg}}\).

References

Equation 9.21 from the CLASS book.

compute_le(le_soil, le_veg, le_liq)[source]#

Compute the evapotranspiration (latent heat flux) le.

Notes

The latent heat flux is the sum of transpiration from vegetation, bare soil evaporation, and wet-leaf evaporation, clipped to non-negative values

\[\text{LE} = \maxigl(\text{LE}_{\text{soil}} + \text{LE}_{\text{veg}} + \text{LE}_{\text{liq}},; 0\bigr)\]
compute_hf(surf_temp, theta, ra)[source]#

Compute the sensible heat flux hf.

Notes

The sensible heat flux is given by

\[H = \frac{\rho c_p}{r_a} (T_s - \theta),\]

where \(\rho\) is the air density, \(c_p\) is the specific heat capacity of air, \(r_a\) is the aerodynamic resistance, \(T_s\) is the surface temperature and \(\theta\) is the mixed layer air potential temperature.

References

Equation 9.13 from the CLASS book, but why are we using \(T_s\) instead of \(\theta_s\)? Probably because the variations of pressure are not significant enough.

compute_gf(surf_temp, temp_soil)[source]#

Compute the ground heat flux gf.

Notes

The ground heat flux is given by

\[G = \Lambda (T_s - T_{soil}),\]

where \(\Lambda\) is the conductivity of the skin layer, \(T_s\) is the surface temperature and \(T_{soil}\) is the soil temperature.

References

Equation 9.33 from the CLASS book.

compute_le_pot(net_rad, gf, dqsatdT, qsat, q, ra)[source]#

Compute the potential latent heat flux le_pot.

Notes

The potential latent heat flux is given by

\[LE_{\text{pot}} = \frac{ \frac{\text{d}q_{sat}}{\text{d} T} (R_n - G) + \frac{\rho c_p}{r_a} (q_{\text{sat}} - q) }{ \frac{\text{d}q_{sat}}{\text{d} T} + \frac{\rho c_p}{L_v} },\]

which is the Penman-Monteith equation assuming no soil resistance.

References

Equation 9.16 from the CLASS book.

compute_le_ref(net_rad, gf, dqsatdT, qsat, q, ra)[source]#

Compute the reference latent heat flux le_ref.

Notes

The reference latent heat flux is given by

\[LE_{\text{ref}} = \frac{ \frac{\text{d}q_{sat}}{\text{d} T} (R_n - G) + \frac{\rho c_p}{r_a} (q_{\text{sat}} - q) }{ \frac{\text{d}q_{sat}}{\text{d} T} + \frac{\rho c_p}{L_v}( 1 + \frac{r_{s,\text{min}}}{\text{LAI} \cdot r_a} ) },\]

which is the Penman-Monteith equation assuming that the soil resistance is given by \(r_{s,\text{min}} / \text{LAI}\), i.e., no correction functions are applied.

References

Equation 9.16 from the CLASS book.

compute_wtheta(hf)[source]#

Compute the kinematic heat flux wtheta.

Notes

The kinematic heat flux \(\overline{(w'\theta')}_s\) is directly related to the sensible heat flux \(H\) through

\[\overline{(w'\theta')}_s = \frac{H}{\rho c_p},\]

where \(\rho\) is the density of air and \(c_p\) is the specific heat capacity of air at constant pressure.

compute_wq(le)[source]#

Compute the kinematic moisture flux wq.

Notes

The kinematic moisture flux \(\overline{(w'q')}_s\) is directly related to the latent heat flux \(LE\) through

\[\overline{(w'q')}_s = \frac{LE}{\rho L_v},\]

where \(\rho\) is the density of air and \(L_v\) is the latent heat of vaporization.

compute_vpd(q, qsat)[source]#

Compute the vapour pressure deficit vpd.

Notes

The vapour pressure deficit is the difference between the saturation specific humidity and the actual specific humidity

\[D_q = q_{ ext{sat}} - q\]

where \(q_{ ext{sat}}\) is the saturation specific humidity and \(q\) is the actual specific humidity.

class abcmodel.land.surface.StandardSurfaceState(alpha, surf_temp, esat=<factory>, qsat=<factory>, dqsatdT=<factory>, e=<factory>, qsatsurf=<factory>, le_veg=<factory>, le_liq=<factory>, le_soil=<factory>, le=<factory>, hf=<factory>, gf=<factory>, le_pot=<factory>, le_ref=<factory>, vpd=<factory>, wtheta=<factory>, wq=<factory>)[source]#

Bases: AbstractSurfaceState

Standard surface state.

alpha: Array#

Surface albedo [-].

surf_temp: Array#

Surface temperature [K].

esat: Array#

Saturation vapor pressure [Pa].

qsat: Array#

Saturation specific humidity [kg/kg].

dqsatdT: Array#

Derivative of saturation specific humidity with respect to temperature [kg/kg/K].

e: Array#

Vapor pressure [Pa].

qsatsurf: Array#

Saturation specific humidity at surface temperature [kg/kg].

le_veg: Array#

Latent heat flux from vegetation [W m-2].

le_liq: Array#

Latent heat flux from liquid water [W m-2].

le_soil: Array#

Latent heat flux from soil [W m-2].

le: Array#

Total latent heat flux [W m-2].

hf: Array#

Sensible heat flux [W m-2].

gf: Array#

Ground heat flux [W m-2].

le_pot: Array#

Potential latent heat flux [W m-2].

le_ref: Array#

Reference latent heat flux [W m-2].

vpd: Array#

Vapor pressure deficit [Pa].

wtheta: Array#

Kinematic heat flux [K m/s].

wq: Array#

Kinematic moisture flux [kg/kg m/s].