Skip to content

Thick-walled cylinder

The canonical MFront/FEniCS coupling demonstration, run the other way round: every Gauss point carries a microstructure, and the scheme that upscales it supplies the stress and the tangent.

Quarter annulus, plane strain, internal pressure   MPa:

The mesh is a structured rectangle bent into annulus_grid — so no gmsh is involved.

This page is static

Figures come from scripts/fe/make_thick_cylinder_figures.jl, run by hand and committed, so no documentation build re-runs a finite-element solve. The model itself is scripts/88_fe_thick_cylinder.jl.

Step 1 — a linear composite, against Lamé

A matrix with 25 % stiff spherical inclusions is isotropic, so the closed form applies with the homogenized moduli:

julia
rve = RVE()
add_phase!(rve, :M, Ellipsoid(1.0), Dict(:C => TensISO{3}(3 * 30.0, 2 * 18.0)); fraction = :rest)
add_phase!(rve, :I, Ellipsoid(1.0), Dict(:C => TensISO{3}(3 * 120.0, 2 * 80.0));
           fraction = 0.25)

mat = HomogenizedElastic(rve, MoriTanaka())      # E = 61.76 GPa, ν = 0.2427

The error converges at the expected second order for Q1 elements, which is what validates the coupling — any defect in the plumbing would show up here:

mesh24×2448×4896×96
 1.6·10⁻²4.3·10⁻³1.1·10⁻³

Step 2 — cracks that close

Two crack families, normals and , replace the inclusions. Nothing else in the driver changes:

julia
add_phase!(rve, :Fx, PennyCrack(1.0; euler_angles = (π/2, 0.0)), props; density = 0.15)
add_phase!(rve, :Fy, PennyCrack(1.0; euler_angles = (π/2, π/2)), props; density = 0.15)

mat = MicrocrackedMaterial(rve, MoriTanaka(); ω₀ = (2.0e-3, 2.0e-3))

A family closes where the traction normal to its plane turns compressive. In a pressurized cylinder   and  , and a crack of normal sees

so it closes near   and stays open near   — while the family does the mirror image. The result is an anisotropy that varies with position and with the load, which no fitted law reproduces:

What it costs

cracked run: 4 scheme solves for 2304 quadrature points

The homogenized stiffness depends on the state only through the discrete open/closed set — for a flat crack is the   limit and carries no aperture — so a MaterialCache reduces 12 load steps × Newton iterations × 2304 points to four Mori-Tanaka solves.

The tangent is exact on every branch, so Newton keeps quadratic convergence without any algorithmic tangent being derived: see scale transition.