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:
- Closed-form approximation — useful as the default for parameter studies and Monte-Carlo runs.
- 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:
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_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
(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:
- 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).
- 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 %.
- 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 = 0on every foundation (within 1 ‰ of the all-isolated reference). - Vanishing concrete limit — for \(\rho_c = 0\) or \(t = 0\), the with-concrete result reproduces the without-concrete result bit-exact.
- Discriminator — setting
concrete_rho_ohm_mon any non-foundation electrode is silently a no-op (the field doesn't exist on those primitives). Setting it onFoundationElectrodeSpecand choosingstyle="ring"withorientation_deg != 0(the rotated-strip path) andstyle="mesh"(the GridMeshElectrode path) both produce the same lumped correction for a square footprint to within 1 ‰. - JSON round-trip — a config with stochastic
concrete_rho_ohm_m=Discrete(...)round-trips throughmodel_dump_json/model_validate_jsonand reproduces the same draws under a fixed seed. - 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
Streifenfundamentenvironment, 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
Distributionframework — Monte Carlo overconcrete_rho_ohm_mis 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
tbecomes 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. StripElectrodeandConductoreach gain one optional field; JSON files written before this ADR continue to round-trip but carryNonedefaults.
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.