Soil Thermal Conductivity and Heat-Flux Estimation

Introduction

This document explains how to estimate soil thermal diffusivity (\(\alpha\)), volumetric heat capacity (\(C_v\)), thermal conductivity (\(k\)), and soil heat flux (\(G\)) from a network of temperature–moisture sensors installed at nine depths (5 cm → 90 cm, sampled every 30 min).

Core concepts

  • Amplitude damping – Daily temperature‐wave amplitude declines with depth.

  • Phase (time-lag) – The peak temperature at deeper layers lags behind the surface.

  • Fourier’s law – Governs vertical conductive heat flow:

    \[G = -\,k \,\frac{\partial T}{\partial z}\]

    :math:`G` positive downward.

  • Link between parameters

    \[k = \alpha \, C_v\]

Measurement-based estimation

Daily angular frequency

\[\omega = \frac{2\pi}{P}\]

where \(P = 86\,400\ \text{s}\) (24 h).

Thermal diffusivity from amplitude

\[\alpha_\mathrm{amp} = \frac{\omega\,(z_2 - z_1)^2} {2\,\ln\!\bigl(A_1 / A_2\bigr)}\]

Thermal diffusivity from phase lag

\[\alpha_\mathrm{lag} = \frac{\omega\,(z_2 - z_1)^2} {2\,\Delta t^{\,2}}\]

Volumetric heat capacity

\[C_v = (1 - \theta_v)\,C_\text{soil} + \theta_v\,C_\text{water}\]

Typical constants:

  • \(C_\text{soil} = 1.9\times10^{6}\ \text{J m}^{-3}\,{}^\circ\text{C}^{-1}\)

  • \(C_\text{water} = 4.18\times10^{6}\ \text{J m}^{-3}\,{}^\circ\text{C}^{-1}\)

Python implementation

import numpy as np
import pandas as pd

SEC_PER_DAY = 86_400
OMEGA = 2 * np.pi / SEC_PER_DAY


# ────────────────────────────────
# 1.  Thermal-diffusivity helpers
# ────────────────────────────────
def thermal_diffusivity_amplitude(A1, A2, z1, z2, period=SEC_PER_DAY):
    """
    Diffusivity from amplitude damping (m² s⁻¹).
    """
    omega = 2 * np.pi / period
    return omega * (z2 - z1) ** 2 / (2 * np.log(A1 / A2))


def thermal_diffusivity_lag(delta_t, z1, z2, period=SEC_PER_DAY):
    """
    Diffusivity from phase lag (m² s⁻¹).
    """
    omega = 2 * np.pi / period
    return omega * (z2 - z1) ** 2 / (2 * delta_t ** 2)


# ───────────────────────────────
# 2.  Volumetric heat-capacity Cv
# ───────────────────────────────
def volumetric_heat_capacity(theta_v,
                             c_soil=1.9e6,
                             c_water=4.18e6):
    """
    Cv from volumetric water content θ_v (fraction).
    """
    return (1 - theta_v) * c_soil + theta_v * c_water


# ───────────────────────────────
# 3.  Thermal conductivity   k
# ───────────────────────────────
def thermal_conductivity(alpha, theta_v):
    """
    k (W m⁻¹ °C⁻¹) from α and θ_v.
    """
    Cv = volumetric_heat_capacity(theta_v)
    return alpha * Cv


# ───────────────────────────────
# 4.  Temperature gradient  ∂T/∂z
# ───────────────────────────────
def temperature_gradient(T_upper, T_lower, z1, z2):
    """
    ∂T/∂z (°C m⁻¹) between two depths.
    """
    return (T_lower - T_upper) / (z2 - z1)


# ───────────────────────────────
# 5.  Soil heat flux          G
# ───────────────────────────────
def soil_heat_flux(T_upper, T_lower, z1, z2, k):
    """
    G (W m⁻²).  Positive downward.
    """
    grad = temperature_gradient(T_upper, T_lower, z1, z2)
    return -k * grad

Example workflow

# Example inputs
A1, A2 = 6.0, 1.5          # °C
z1, z2 = 0.05, 0.30        # m
dt_lag = 3 * 3600          # s
theta_v = 0.25             # 25 % moisture
T_5cm, T_30cm = 18.0, 17.0 # °C snapshots

alpha1 = thermal_diffusivity_amplitude(A1, A2, z1, z2)
alpha2 = thermal_diffusivity_lag(dt_lag, z1, z2)
alpha = (alpha1 + alpha2) / 2               # m² s⁻¹

k_est = thermal_conductivity(alpha, theta_v)  # W m⁻¹ °C⁻¹
G = soil_heat_flux(T_5cm, T_30cm, z1, z2, k_est)

print(f"α = {alpha:.2e} m² s⁻¹")
print(f"k = {k_est:.2f} W m⁻¹ °C⁻¹")
print(f"G = {G:.1f} W m⁻²  (positive = downward)")

Typical conductivity ranges

Soil condition

Approx. \(k\) (W m⁻¹ °C⁻¹)

Dry sandy soil

0.25 – 0.40

Moist sandy soil

0.80 – 1.50

Moist loamy soil

0.60 – 1.30

Moist clay soil

0.80 – 1.60