Cracks
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 n̂")plotly_scene(shape_traces(RibbonCrack(0.5)); uid = "man-crack-ribbon", height = 400,
title = "Ribbon crack: half-width b, unbounded along ℓ̂")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 = compliance_contribution(pc, C₀)
# Dilute compliance correction ΔS from the Budiansky density ε³ᵈ = N a b²
ε³ᵈ = 0.05
ΔS = delta_compliance(pc, H, ε³ᵈ) # = (4π/3) ε³ᵈ H
# Ribbon crack — same pattern, ε²ᵈ = N b² and ΔS = π ε²ᵈ H
r = RibbonCrack(0.5)
H_r = compliance_contribution(r, C₀) # H = (2/π) n̂ ⊗ˢ B ⊗ˢ n̂
ΔS_r = delta_compliance(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 = compliance_contribution(pc, K₀) # R = (3/4) b (ŵ⊗ŵ)
ΔR = delta_resistivity(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 = compliance_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 = compliance_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') ageing interface kernels, see the Viscoelasticity manual. References: [58], [59].