Cracks
Before this page
Crack opening displacement and compliance, where the tensors
A crack is an inclusion of zero volume: the
plotly_scene(shape_traces(PennyCrack(1.0)); uid = "man-crack-penny", height = 400,
title = "Penny-shaped crack: a = b, c = 0, normal <u><i>n</i></u>")plotly_scene(shape_traces(RibbonCrack(0.5)); uid = "man-crack-ribbon", height = 400,
title = "Ribbon crack: half-width b, unbounded along <u><i>ℓ</i></u>")The full set of shapes, tilted cracks included, is in The inclusion zoo; the geometry and the symbols are defined in Crack opening displacement.
using MeanFieldHomogenization, TensND
E, ν = 210.0, 0.3
k = E/(3*(1-2ν)); μ = E/(2*(1+ν))
C₀ = TensISO{3}(3k, 2μ)
# Penny-shaped crack — size-independent COD tensor B
pc = PennyCrack(1.0)
B = cod_tensor(pc, C₀)
# Size-independent compliance contribution tensor H = (3/4) n̂ ⊗ˢ B ⊗ˢ n̂
H = inverse_property_contribution(pc, C₀)
# Dilute compliance correction ΔS from the Budiansky density ε³ᵈ = N a b²
ε³ᵈ = 0.05
ΔS = delta_inverse_property(pc, H, ε³ᵈ) # = (4π/3) ε³ᵈ H
# Ribbon crack — same pattern, ε²ᵈ = N b² and ΔS = π ε²ᵈ H
r = RibbonCrack(0.5)
H_r = inverse_property_contribution(r, C₀) # H = (2/π) n̂ ⊗ˢ B ⊗ˢ n̂
ΔS_r = delta_inverse_property(r, H_r, 0.05)
# Thermal / conductivity — scalar COD b and rank-1 resistivity tensor R
K₀ = TensISO{3}(1.0)
b = cod_tensor(pc, K₀) # scalar
R = inverse_property_contribution(pc, K₀) # R = (3/4) b (ŵ⊗ŵ)
ΔR = delta_inverse_property(pc, R, 0.05) # = (4π/3) ε³ᵈ RCracks with finite interface stiffness (Sevostianov)
A flat crack carrying a spring-like interface elasticity with stiffness tensor
where semi_minor(crack). The two limits are the familiar ones:
# Elasticity : iso interface stiffness K = 5·𝟏
B_eff = cod_tensor(pc, C₀; K_interface = TensISO{3}(5.0))
H_eff = inverse_property_contribution(pc, C₀; K_interface = TensISO{3}(5.0))
# Conductivity (Kapitza scalar interface conductance α)
b_eff = cod_tensor(pc, K₀; α_interface = 1.0)
R_eff = inverse_property_contribution(pc, K₀; α_interface = 1.0)When building an RVE for a homogenize call, attach the interface data as phase properties so the dispatcher picks them up automatically :
rve = RVE()
add_phase!(rve, :M, Ellipsoid(1.0), Dict(:C => C₀, :K => K₀); fraction = :rest)
add_phase!(rve, :CRACK, PennyCrack(1.0),
Dict(:C => C₀,
:K_interface => TensISO{3}(5.0), # elastic interface
:K => K₀,
:α_interface => 1.0); # Kapitza scalar
density = 0.10, symmetrize = :iso)
C_eff = homogenize(rve, MoriTanaka(), :C)
K_eff = homogenize(rve, MoriTanaka(), :K)For SC-type schemes on cracked RVEs, which form applies depends on the orientation distribution:
single orientation — the symmetric
SelfConsistentraises aSingularException: its strain-concentration tensor degenerates for a phase with no volume and no orientation average to smooth it. UseAsymmetricSelfConsistent.isotropic or TI distribution (
symmetrize = IsoSymmetrize()orTISymmetrize(axis)) — both forms run, and they solve different fixed points: the symmetric one iterates on the stiffness, the asymmetric one on the compliance. Both percolate, but not at the same crack density: for randomly oriented penny cracks the compliance form reaches zero at the classical Budiansky–O'Connell value exactly, the stiffness one at — both independent of . Between the two thresholds they therefore disagree qualitatively, not just numerically. Which one to pick is a modeling decision, worked out with numbers in Crack distributions: isotropic or parallel.
For the time-dependent (ALV) version with Rn(t,t') and Rt(t,t') aging interface kernels, see the Viscoelasticity manual. References: Sevostianov and Kachanov (2002), Barthélémy et al. (2019).
Where to go next
Layered inclusions leaves the ellipsoid family for composite patterns, which have no Hill tensor. The tutorial Cracks and crack density drives the calls above through the schemes, and Crack distributions: isotropic or parallel quantifies the choice between the two self-consistent forms discussed above.