RasmahRasmah

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 Rasmah

Arrhenius 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