Hydro-geophysics: aquifer properties#

EMHydroModel is the quantitative step: it runs a petrophysical model (Archie by default) over the resistivity section to estimate porosity, water saturation, hydraulic conductivity, the water table, and transmissivity — the numbers a hydrogeologist actually needs. The result is an EMHydroResult, which the pycsamt.interp.plot classes turn into finished figures.

Run the model#

A PetrophysicalConfig sets the rock physics (pore-water resistivity, porosity prior, cementation). fit returns the result object with one map/profile per property.

from _interp_data import demo_model

from pycsamt.interp import EMHydroModel, PetrophysicalConfig

# Use the hydraulic-conductivity section (2nd figure) as the thumbnail.

rm = demo_model()
cfg = PetrophysicalConfig(rho_w=20.0, porosity_prior=0.25)
result = EMHydroModel(rm, cfg, method_tag="AMT").fit()

import numpy as np

print(
    "porosity range:",
    np.round([result.porosity.min(), result.porosity.max()], 2),
)
print(
    "K range (m/s):",
    np.format_float_scientific(np.nanmin(result.hydraulic_K), 1),
    "-",
    np.format_float_scientific(np.nanmax(result.hydraulic_K), 1),
)
print(
    "water table (m), first 5 stations:", np.round(result.water_table[:5], 1)
)
porosity range: [0.08 0.75]
K range (m/s): 1.2e-06 - 1.1e-02
water table (m), first 5 stations: [5. 5. 5. 5. 5.]

Hydraulic-conductivity section#

PlotHydroSection images any quantitative map. Hydraulic conductivity K is the headline aquifer property — high in the clean sand aquifer, low in the clay.

from pycsamt.interp.plot import (
    PlotAquiferCharacterization,
    PlotHydroSection,
    PlotWaterTableProfile,
)

PlotHydroSection(result, quantity="K").plot()
Hydro section — K  [AMT]
<Figure size 1300x500 with 2 Axes>

Water-saturation section#

The same view for saturation Sw separates the saturated aquifer from the drained overburden above the water table.

PlotHydroSection(result, quantity="saturation").plot()
Hydro section — saturation  [AMT]
<Figure size 1300x500 with 2 Axes>

Water table and transmissivity#

PlotWaterTableProfile reduces the section to the two most-requested profiles along the line: the water-table depth and the aquifer transmissivity (\(T\), on a log scale) — the deliverable for well-siting.

PlotWaterTableProfile(result, reference_depth=20.0).plot()
Water table & transmissivity [AMT]
<Figure size 1300x600 with 2 Axes>

Dar-Zarrouk aquifer characterization#

PlotAquiferCharacterization stacks the classic Dar-Zarrouk parameters — transverse resistance TR and longitudinal conductance S — with the water table and transmissivity, a compact one-figure aquifer summary.

PlotAquiferCharacterization(result).plot()
Aquifer characterization [AMT]
<Figure size 1300x900 with 4 Axes>

Reading it. K and T both peak where the sand aquifer is thickest and cleanest, and collapse over the clay — so the best well targets are the high-T segments of the profile. The petrophysics example shows the rock-physics model behind these numbers, and uncertainty puts error bars on them.

Total running time of the script: (0 minutes 1.026 seconds)

Gallery generated by Sphinx-Gallery