Corrosion-induced cracking — a constrained-expansion problem on a 3D lattice
Most durability problems are a constrained-expansion story: something inside wants to grow, the surrounding material resists, and cracks form. Corrosion of a steel bar inside concrete is one of the most studied cases. A 3D lattice slice reproduces the textbook two-phase failure — axisymmetric multi-crack expansion, then a single crack reaching the surface — and the pressure jump that goes with it.
A lot of concrete durability problems boil down to the same picture: something inside the material wants to expand, the surroundings resist the expansion, and once the tensile stresses they generate exceed the strength of the material, cracks form. Corrosion of embedded steel is one well-known case — rust occupies about twice the volume of the steel it replaces, so a thin layer of rust at the bar surface pushes outwards on the cover concrete until it splits. Alkali–silica reaction, freeze–thaw, sulphate attack, even shrinkage of restrained concrete or moisture-driven swelling of timber follow a similar recipe.
The axissymmetric thick-wall cylinder is the textbook solution for a corroding rebar close to the surface of a concrete specimen: an internal pressure on a hollow concrete cylinder, with the cover thickness, the bar radius and the tensile strength setting the capacity. It does a reasonable job of predicting peak pressure but cannot represent the failure once the crack reaches the surface. A lattice model can.
The set-up
A 10 mm-thick slice of a 150 mm diameter concrete cylinder with a single
8 mm steel bar along its axis. A 0.1 mm thick layer at the bar/concrete
interface is given a radial eigendisplacement that ramps linearly over
the analysis, simulating the slow, steady growth of corrosion products.
Concrete is modelled with latticeplastdam (plasticity + damage —
plasticity bounds the radial compression around the bar, damage
captures tensile cracking) on a random Voronoi lattice with
spatially-correlated tensile strength.
The relevant scales:
- Bar radius
rᵢ = 8 mm, outer radiusr_o = 75 mm, cover ≈ 67 mm. - Tensile strength
f_t = 3 MPa. Very-ductile equilibrium givesp_ref = f_t · (r_o − rᵢ) / rᵢ ≈ 25 MPa— the pressure the wall could carry if the whole cover was simultaneously atf_tin hoop tension. - Corrosion penetration up to about 0.5 µm by the end of the run, well inside the splitting-failure regime.
Two regimes, one pressure jump
The pressure-vs-penetration curve above, the deformed-mesh contour with displacements magnified below.
Early on, several discrete radial cracks initiate around the bar,
roughly evenly spaced in the circumferential direction. The inner part
of the cylinder expands almost axisymmetrically, the cracks grow
together, and the curve rises monotonically as the cracks propagate
outward through the cover. Up to this point the response is close to
what the thick-wall cylinder model predicts qualitatively, with the
peak in the same range as p_ref.
Then one crack reaches the outer surface first. The axisymmetric mode breaks: the outer crack opens preferentially at its mouth, the cylinder deforms asymmetrically, and the internal pressure that the cover can still mobilise drops sharply. This is the jump in the pressure curve — and the moment in the contour when the radial fan of cracks becomes a single wedge opening to the surface.
The axissymmetric thick-wall cylinder model cannot represent this transition. The lattice does it naturally, because each lattice element is either intact, damaging or fully cracked, and breakthrough is just one element-chain reaching the boundary.
Why a lattice for this problem
Three things motivated the lattice choice:
- Discrete cracks, not smeared damage. The visible cracks in the contour are real displacement discontinuities, not contours of a scalar damage field. They are limited in number, separated by intact concrete, and behave like the cracks observed in tests.
- Heterogeneity built in. Tensile strength is randomised on a correlated field, so the first crack to break through is not always in the same place. It picks up the weakest path through the random lattice and the random field.
- Composite behaviour out of the box. Steel core, rust ITZ and concrete are three separate materials sharing the same Voronoi tessellation. Adding bond-slip, multiple bars or non-uniform corrosion is geometry, not a code change.
The pressure peak in the animation slightly exceeds p_ref. The example uses a coarse 5 mm lattice spacing — only about 13 elements through the 67 mm wall. Refining the lattice brings the peak closer to p_ref, but at the cost of run time, and the qualitative two-regime behaviour is unchanged.
Further reading
The lattice approach to corrosion-induced cracking is used to study corrosion rate dependence and concrete creep in:
I. Aldellaa, P. Grassl. Rate dependence of corrosion-induced surface cracking in concrete: Lattice modelling and experiments. Frontiers in Materials, vol. 327, 2026. DOI
I. Aldellaa, P. Havlásek, M. Jirásek, P. Grassl. Effect of Creep on Corrosion-Induced Cracking. Engineering Fracture Mechanics, vol. 264, 2022. DOI
Reproduce
git clone https://github.com/githubgrasp/oofem-examples.git
cd oofem-examples/lattice-corrosion-3d
docker run --rm -v "$PWD":/work ghcr.io/githubgrasp/oofem-public:lattice-corrosion-3d bash -c "bash run.sh && oofem -f oofem.in > std.out && perl pressureExtractor.pl && gnuplot pressure-plot.gp"
The image tag :lattice-corrosion-3d is the exact build used to
produce the curve and contour above and is immutable. Use :latest
instead to track the current OOFEM build (results may drift slightly
as the code evolves).
The example folder is at github.com/githubgrasp/oofem-examples/tree/main/lattice-corrosion-3d; issues and questions go on the issue tracker.
Built with OOFEM.