Skip to content

ADR-0012: Concrete encasement of foundation electrodes

Status Accepted
Date 2026-05-15
Deciders Project maintainers
Scope groundfield.generators.electrode_specs.FoundationElectrodeSpec
(new optional fields); groundfield.generators.grounding
(materialisation); groundfield.generators.tn_network
(PEN service-drop wiring); groundfield.conductors
(one new optional field for the lumped path);
groundfield.geometry.electrodes.StripElectrode (one new
optional field for the distributed path); the
image / image_2layer / image_nlayer assembly path
(per-segment diagonal augmentation).

Context

A foundation electrode according to DIN 18014 is bonded inside the building's Streifenfundament — a buried strip of reinforced concrete. The conductor never touches the surrounding soil directly; every Ampere it injects into earth has to traverse the concrete shell first. Concrete is a markedly different conducting medium from typical soil:

State \(\rho_c\) in Ω·m Typical situation
Wet / fresh 30–80 first months after pouring
Earth-moist (90 % RH) 80–200 typical residential basement
Cycling humidity 200–2 000 unheated cellar
Dry, unused 5 000–50 000 mothballed building

For typical Ortsnetz soils (\(\rho_s = 30\ldots500\,\Omega\,\text{m}\)), the concrete shell can be of the same order of magnitude as the soil or several decades higher. The classical groundfield model assumes the conductor sits directly in soil, which is the right model for ring electrodes at substations, driven rods (Tiefenerder) and strip electrodes (Banderder) buried in trenches, but wrong for the foundation electrodes generated by ADR-0011's OSM-driven path. For the worst-case (dry concrete) the omission underestimates the foundation's spreading impedance by a factor 10–100 ×.

The user request: model the concrete encasement without going to 3-D FEM. Two extensibility axes are required:

  1. Closed-form approximation — useful as the default for parameter studies and Monte-Carlo runs.
  2. Distributed-impedance variant — needed when the surface potential near the foundation (touch / step voltage) has to be right, or when the foundation has a non-uniform concrete resistivity along its length.

Decision

Physical model — cylindrical Sunde shell

Each segment of the foundation wire is treated as a thin cylindrical region:

  • wire of radius \(r_a\) (typ. 5 mm) carries the current,
  • concrete shell of inner radius \(r_a\) and outer radius \(r_b = r_a + t\) (typ. \(t = 50\,\text{mm}\ldots200\,\text{mm}\)) with resistivity \(\rho_c\),
  • soil (\(\rho_s\), possibly layered) outside \(r_b\).

The current flows radially through the shell, then enters the soil. The two contributions add in series along the radial coordinate:

\[ R'_\text{per metre} \;=\;\underbrace{\frac{\rho_c}{2\pi}\,\ln\!\frac{r_b}{r_a}}_{R'_\text{shell}} \;+\;\underbrace{R'_\text{soil}(r_b,\,\text{geometry},\,\text{soil})}_{\text{what the solver gives today}} \]

The second term is computed as before, only with the effective wire radius \(r_b\) instead of \(r_a\). Substituting \(r_a \to r_b\) in the classical Sunde / Tagg series shifts the spreading resistance by at most a few percent (the series has \(\ln(2L/r)\), and going from 5 mm to 50 mm changes the logarithm by 20–25 %), so the dominant new contribution is \(R'_\text{shell}\).

This decomposition is exact in the cylindrically-symmetric limit (infinite straight wire). For a finite-length electrode and a non-uniformly distributed leakage current along the wire, the decomposition is no longer rigorous but remains a very good approximation as long as the soil's transverse diffusion length exceeds the foundation's extent — which it does in the quasi-static regime (\(f \le 1\,\text{kHz}\), foundation \(\lesssim 30\,\text{m}\) across).

Why not a planar concrete layer

A naïve "concrete as a third soil layer in image_nlayer" would treat the concrete as a horizontal slab at the foundation depth extending across the entire \((x, y)\) plane. That is wrong: concrete sits only around the wire, not under the rest of the neighbourhood. The cylindrical-shell model is the physically correct localisation. We name this distinction in the docstrings and refuse the planar interpretation outright.

Two implementation variants

Variant 1 — lumped series resistance (concrete_model="lumped")

The total shell resistance of one foundation electrode of perimeter \(L_\text{perim}\) is

\[ R_\text{shell,total} \;=\;\frac{R'_\text{shell}}{L_\text{perim}} \;=\;\frac{\rho_c}{2\pi\,L_\text{perim}}\,\ln\!\frac{r_b}{r_a}. \]

R_shell_total is injected as a lumped series resistance on the PEN service drop between the KVS (or substation) and the foundation's anchor electrode. The service-drop bond is the electrical wire that links the rest of the network to this foundation; adding the shell resistance there is topologically equivalent to inserting it in series between the conductor and the soil, because the bond is the only galvanic path the foundation has to the rest of the network.

The solver itself runs unchanged. The MoM matrix is unaffected. The cluster impedance, surface potential at the substation and the contour plot are all automatically corrected because the PEN backbone carries the extra series resistance natively (it was already designed to support distributed conductor impedance, see ADR-0003).

Cost: one new optional float on Conductor (lumped_series_resistance_ohm) plus a small change in TnNetworkGenerator._build_pen_backbone that reads the recorded shell resistance and forwards it as the bond's series impedance.

Variant 2 — distributed shell impedance (concrete_model="distributed")

The shell resistance is applied per segment of the foundation's strip electrodes. The MoM diagonal entry for segment \(i\) of length \(\Delta s_i\) gets

\[ G_{ii}^{\text{new}}\;=\;G_{ii}\;+\;\frac{R'_\text{shell}}{\Delta s_i}. \]

(In a matrix equation \(\Phi = G\cdot I\) the diagonal augmentation \(\Delta G_{ii} = R_\text{shell,segment\,i}/\Delta s_i\) adds the shell's voltage drop \(V_i = I_i\,R_\text{shell,segment\,i}\) on top of the spreading kernel.) The off-diagonal entries are unchanged because the shell does not couple separate segments — each shell is a local cylindrical region around its own segment.

This variant is exact in the cylindrical-symmetric limit per segment and correctly captures non-uniform current distribution along the foundation. The price is one new optional field on StripElectrode (internal_impedance_per_m) and a diagonal augmentation hook in each layered backend that mirrors the existing Sommerfeld-correction pattern.

Choice between V1 and V2 — and discriminator

Default concrete_model="lumped" because:

  • The current distribution along the typical Fundamenterder ring is close to uniform for the low-frequency range (\(f \le 1\,\text{kHz}\)), so V1's approximation error vs. V2 is below the soil-resistivity uncertainty.
  • V1 is zero solver-side risk: the existing distributed-conductor path already handles arbitrary bond impedances correctly across all backends.

concrete_model="distributed" is opt-in for:

  • studies where the foundation's internal current distribution matters (e.g. inhomogeneous concrete drying patterns modelled by a per-segment \(\rho_c\)),
  • validation that V1 is sufficient for a given study.

The two variants share the same concrete_rho_ohm_m and concrete_thickness_m API. Cross-validation V1 ≈ V2 (within 2 %) for uniform \(\rho_c\) is the V2 acceptance criterion.

API additions

FoundationElectrodeSpec (only):

concrete_rho_ohm_m: float | AnyDistribution | None = None
"""Resistivity of the concrete encasement.
None: wire sits directly in soil (historic behaviour, applies to
all other electrode kinds since they sit in trenches, not in
concrete)."""

concrete_thickness_m: float | AnyDistribution = 0.05
"""Radial shell thickness in m; only honoured when
``concrete_rho_ohm_m is not None``. Default 50 mm matches a
typical 30 cm wide Streifenfundament with the conductor on the
axis."""

concrete_model: Literal["lumped", "distributed"] = "lumped"
"""How the shell resistance enters the linear system."""

Conductor (one new optional field, additive):

lumped_series_resistance_ohm: float | None = None
"""Optional override for the conductor's total series impedance.
When None: the resistance is derived from ``resistivity`` and
``effective_cross_section`` as before. When set: replaces the
geometric formula entirely. Used by the V1 concrete-shell path to
inject ``R_shell_total`` on the PEN service drop without faking a
geometric cross section. The ``series_resistance`` property is the
single point of consumption; backends already query it through
that property and therefore pick up the override transparently."""

StripElectrode (one new optional field, additive):

internal_impedance_per_m: complex | None = None
"""Per-metre radial internal impedance, in Ω/m. None means no
shell (historic). When set, the MoM/image diagonal for every
segment of this strip is augmented by
``internal_impedance_per_m * segment_length``. Used by the V2
concrete-shell path. Complex-valued so that future moisture or
high-frequency models with a capacitive shell can plug in the same
field."""

Other electrode kinds (RodElectrode, RingElectrode, MeshElectrode, GridMeshElectrode) do not get the field because they correspond to electrodes that sit in trenches or concrete-less driven holes — by domain convention a non-foundation electrode is direct-in-soil.

Stochastic concrete moisture

concrete_rho_ohm_m: float | AnyDistribution | None lets the moisture state be sampled per realisation. A recommended default distribution for Monte-Carlo studies (matches the four empirical bands in the introduction):

concrete_rho_ohm_m=Discrete(
    values=[50.0, 150.0, 500.0, 2000.0],
    weights=[0.25, 0.40, 0.25, 0.10],   # weighted toward earth-moist
)

presence_prob continues to gate the existence of the foundation; concrete_rho_ohm_m gates only the resistivity when the foundation is present.

Validation programme

tests/test_concrete_encasement.py:

  1. Closed-form lumped check — for a single straight strip of length \(L = 40\,\text{m}\) at depth 0.8 m in homogeneous soil, the difference \(Z_\text{with concrete} - Z_\text{without concrete}\) matches \(R_\text{shell,total}\) from the analytical formula to within \(10^{-9}\) (the lumped path is exact by construction).
  2. V1 ↔ V2 cross-validation — same world, same uniform \(\rho_c\), V1 and V2 produce cluster impedances that agree within 2 % for a foundation of perimeter 40 m at depth 0.8 m; for longer perimeters (e.g. 200 m for an industrial site) the tolerance widens to 5 %.
  3. Insulating concrete limit — for \(\rho_c \to \infty\) (e.g. \(10^{12}\,\Omega\,\text{m}\)), the foundation becomes electrically isolated; cluster impedance of the substation converges to the value with presence_prob = 0 on every foundation (within 1 ‰ of the all-isolated reference).
  4. Vanishing concrete limit — for \(\rho_c = 0\) or \(t = 0\), the with-concrete result reproduces the without-concrete result bit-exact.
  5. Discriminator — setting concrete_rho_ohm_m on any non-foundation electrode is silently a no-op (the field doesn't exist on those primitives). Setting it on FoundationElectrodeSpec and choosing style="ring" with orientation_deg != 0 (the rotated-strip path) and style="mesh" (the GridMeshElectrode path) both produce the same lumped correction for a square footprint to within 1 ‰.
  6. JSON round-trip — a config with stochastic concrete_rho_ohm_m=Discrete(...) round-trips through model_dump_json / model_validate_json and reproduces the same draws under a fixed seed.
  7. Stochastic-moisture sweep — a 1 000-sample Monte Carlo over concrete_rho_ohm_m=Discrete(values=[50, 150, 500, 2000]) reproduces the analytical mean of \(R_\text{shell,total}\) to within 1 % statistical noise.

Consequences

Positive

  • Foundation electrodes generated from the OSM path (ADR-0011) now reflect their real Streifenfundament environment, closing one of the largest physical gaps in the generator pipeline.
  • The dry-concrete worst case becomes computable without leaving the 1-kHz quasi-static regime.
  • Stochastic moisture maps cleanly onto the existing Distribution framework — Monte Carlo over concrete_rho_ohm_m is one line of config.
  • The lumped path adds zero solver risk: existing distributed- conductor machinery already handles arbitrary bond impedances.

Negative

  • The distributed path touches the diagonal-augmentation hooks of every layered backend (image, image_2layer, image_nlayer, optionally mom_sommerfeld). Each backend gets one new conditional branch; the test programme covers the cross-engine agreement.
  • The shell-thickness t becomes a new modelling decision the user has to make. We document the typical range (50–200 mm) and default to 50 mm so a "I just set \(\rho_c\) and want it to work" experience exists.
  • StripElectrode and Conductor each gain one optional field; JSON files written before this ADR continue to round-trip but carry None defaults.

Neutral

  • The Sunde-shell decomposition is well-known textbook physics (Sunde 1968 §4.4, Tagg 1964 ch. 7). Implementing it does not expand groundfield's modelling envelope, only fills a gap.
  • ADR-0007 (cross-layer electrodes) is orthogonal: a foundation at 0.8 m with a 5 cm shell stays entirely inside a typical \(h_1 \ge 1\,\text{m}\) upper layer, so the cross-layer machinery is not exercised by the concrete shell itself.

References

  • Sunde, E. D. (1968). Earth Conduction Effects in Transmission Systems, Dover. §4.4 — wire in concrete in conducting earth (the closed-form cylindrical-shell formula used here).
  • Tagg, G. F. (1964). Earth Resistances, George Newnes. Ch. 7 — foundation earth electrodes, contact-resistance contribution.
  • DIN 18014:2023-04. Fundamenterder — Planung, Ausführung und Dokumentation. DIN, Berlin. Defines the geometric envelope (depth, perimeter, conductor cross section) the Sunde shell wraps.
  • Banton, O. et al. (2017). Electrical resistivity of concrete: a function of moisture content and ageing. Cement and Concrete Research 95, 60–69. Empirical basis for the four-state moisture bands recommended above.
  • ADR-0003 — distributed conductor model. The V1 path reuses the per-conductor distributed framework introduced there.
  • ADR-0011 — OSM building footprints. This ADR completes the OSM-driven generator pipeline by giving the generated foundations the right electrical boundary condition.