Note
Go to the end to download the full example code.
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]](../../_images/sphx_glr_plot_4_hydro_geophysics_001.png)
<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]](../../_images/sphx_glr_plot_4_hydro_geophysics_002.png)
<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]](../../_images/sphx_glr_plot_4_hydro_geophysics_003.png)
<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]](../../_images/sphx_glr_plot_4_hydro_geophysics_004.png)
<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)