Chemical (Hydration) Strain
Overview
Concrete, cement and hydrogels change volume as they hydrate or dry. The thermo-chemo-mechanical model (Ulm & Coussy 1995; Coussy 2004) couples the degree of hydration ξ ∈ [0,1] to an autogenous strain
\[\varepsilon_{ch} = \beta\,\xi\, 1\]
so the stress is σ = C (ε − β ξ 1), with β the chemical strain coefficient (negative for shrinkage). The hydration kinetics follow an Arrhenius law
\[\frac{d\xi}{dt} = A\, e^{-E_a/(RT)}\,(1-\xi)^n\]
which Rasmah integrates analytically.
using RasmahArrhenius hydration kinetics
For order n = 1 the degree of hydration is ξ(t) = 1 − exp(−k t) with k = A exp(−E_a/(RT)). Verify the three exact values ξ(0) = 0, ξ(1/k) = 1−e⁻¹, and ξ(∞) = 1:
A, Ea, R, T = 1.0, 0.0, 8.314, 300.0
k = A * exp(-Ea / (R * T))
println("ξ(0) = ", hydration_degree(0.0, T, A, Ea, R, 1.0))
println("ξ(1/k) = ", round(hydration_degree(1 / k, T, A, Ea, R, 1.0); digits = 6), " (1 − e⁻¹ = ", round(1 - exp(-1); digits = 6), ")")
println("ξ(∞) = ", hydration_degree(1e6, T, A, Ea, R, 1.0))ξ(0) = 0.0
ξ(1/k) = 0.632121 (1 − e⁻¹ = 0.632121)
ξ(∞) = 1.0
Chemical shrinkage of a bar
A bar with uniform ξ shrinks freely by β ξ L. Pin the six rigid-body modes, impose ξ = 1 everywhere, and read the free end displacement.
E, ν, β = 1e3, 0.3, 1e-4
m = tetrahedralize_box(1.0, 1.0, 1.0, 4, 2, 2)
n = size(m.nodes, 2)
findnode(x, y, z) = argmin(sum(abs2, m.nodes[:, i] .- [x, y, z]) for i in 1:n)
i0 = findnode(0.0, 0.0, 0.0); i1 = findnode(1.0, 0.0, 0.0); i2 = findnode(0.0, 1.0, 0.0)
fixed = [3i0 - 2, 3i0 - 1, 3i0, 3i1 - 1, 3i1, 3i2]
u = solve(ChemoElasticity(), m, Material(youngs_modulus = E, poisson_ratio = ν);
fixed = fixed, ξ = x -> 1.0, β = β)135-element Vector{Float64}:
0.0
0.0
0.0
2.4999999999999686e-5
-4.569004002235183e-19
-3.740917454368719e-19
4.999999999999952e-5
-3.4917593297486667e-19
-2.162961955130856e-19
7.499999999999942e-5
⋮
4.9999999999995205e-5
9.999999999999715e-5
0.00010000000000000208
7.49999999999952e-5
9.999999999999755e-5
0.00010000000000000263
9.99999999999952e-5
9.999999999999797e-5
0.00010000000000000326
Verification — uniform expansion
The free x-displacement at x = 1 must equal β ξ:
println("u_x(x=1) = ", round(u[3i1 - 2]; digits = 7), " (analytic βξ = ", β, ")")u_x(x=1) = 0.0001 (analytic βξ = 0.0001)
Next steps
- Lithium-ion diffusion and swelling — chemical strain driven by diffusion.
- Thermoelasticity — the analogous thermal expansion.
