Variable Grout Properties
The SoilMoisture class updates grout thermal
conductivity, volumetric heat capacity, and density over time as a function
of volumetric water content, to account for irrigation-driven moisture
changes around the borehole.
- class carm.properties.SoilMoisture[source]
Bases:
objectSoil moisture and thermophysical properties module.
Computes borehole thermophysical properties (thermal conductivity, specific heat capacity, density) as a function of volumetric water content, using Chung-Horton (1987) for thermal conductivity, de Vries (1963) for volumetric heat capacity, and a mass-weighted average for density.
- loss_factor
Fraction of water volume lost by drainage at each timestep [-].
- Type:
float
- w_rho
Density of water [kg/m³].
- Type:
float
- w_latent
Latent heat of vaporization of water [J/kg].
- Type:
float
- SOIL_PARAMS
Tabulated parameters for sand, loam, and clay soil types. Each entry contains: b1, b2, b3 (Chung-Horton), theta_s, theta_r (Rawls et al.), xs (solid volume fraction), x0 (organic matter fraction).
- Type:
dict
- water_input
Water flux time series [m/s].
- Type:
NDArray
- rho_dry
Dry soil density [kg/m³].
- Type:
float
- b1_loc
Chung-Horton parameter b1 for the selected soil type [W/(m K)].
- Type:
float
- b2_loc
Chung-Horton parameter b2 for the selected soil type [W/(m K)].
- Type:
float
- b3_loc
Chung-Horton parameter b3 for the selected soil type [W/(m K)].
- Type:
float
- theta_s_loc
Saturated volumetric water content for the selected soil type [-].
- Type:
float
- theta_r_loc
Residual volumetric water content for the selected soil type [-].
- Type:
float
- xs_loc
Solid volume fraction for the selected soil type [-].
- Type:
float
- x0_loc
Organic matter volume fraction for the selected soil type [-].
- Type:
float
- Wvol_prev
Water volume at the previous timestep [m³].
- Type:
float
- Wvol_r
Residual water volume at the current timestep [m³].
- Type:
float
- Wvol_loss
Water volume lost by drainage at the current timestep [m³].
- Type:
float
- Wvol_evap
Water volume lost by evaporation at the current timestep [m³].
- Type:
float
- W_content
Volumetric water content at the current timestep [-].
- Type:
float
- loss_factor = 0.1
- w_rho = 1000.0
- w_latent = 2250000.0
- SOIL_PARAMS = {'clay': {'b1': -0.197, 'b2': -0.962, 'b3': 2.521, 'theta_r': 0.09, 'theta_s': 0.385, 'x0': 0.024, 'xs': 0.591}, 'loam': {'b1': 0.243, 'b2': 0.393, 'b3': 1.534, 'theta_r': 0.027, 'theta_s': 0.434, 'x0': 0.018, 'xs': 0.548}, 'sand': {'b1': 0.228, 'b2': -2.406, 'b3': 4.909, 'theta_r': 0.02, 'theta_s': 0.417, 'x0': 0.012, 'xs': 0.571}}
When to use it
SoilMoisture is only instantiated when water_input is provided in
EnvironmentalTimeSeries. In that case,
D_irrigation and perf_fraction must also be set on
BoreholeGeometry, since they define the irrigation
pipe surface area used in the water balance:
A_irr = pi * borehole.D_irrigation * borehole.perf_fraction * borehole.Lbore
Field-level update
Properties are recomputed once per timestep at the field level, not once per borehole. All boreholes share the same grout composition and receive the same irrigation input; the evaporation term uses the mean heat flux across the field rather than a per-borehole value:
q = np.mean(self.q_nbhes[step - 1])
Sensitivity of the water content to the per-borehole heat flux (as opposed to the field average) was verified to be negligible over the operating range (0–10 kW).
Example
from carm import BoreholeGeometry, BoreholeThermalProperties
geom = BoreholeGeometry(
Lbore=30, D0=0.5,
D_irrigation=0.030, perf_fraction=0.5,
)
thermalprops = BoreholeThermalProperties(
cp_0=796.14, rho_0=1587.09, k0=1.0, soil_type="sand",
)
Note
rho_0 above is the dry soil density, required when water_input
is active. For simulations without irrigation, use the density at
residual water content instead.