The incremental tangent approach
The whole page as one script
Every block of this page, in order, is scripts/material_laws/13_incremental_tangent.jl. From a clone of the repository, julia --project=docs -e 'using Pkg; Pkg.instantiate()' once, then julia scripts/material_laws/13_incremental_tangent.jl, runs it end to end.
The secant methods need phases whose stress is a function of the strain alone. A plastic phase has a history: its stress depends on the path, and a secant modulus means nothing for it. The incremental approach of Hill (1965) linearizes such a phase on each step instead: over an increment of the loading, every phase behaves as a linear material of its tangent stiffness, and a linear scheme concentrates the increment of the macroscopic strain in the phases. It applies to any phase law of MaterialLaws, plasticity, viscosity or damage, and stands between the two uniform-field composites, which ignore the morphology. The example below runs it.
A step
Over a step from
The tangents are taken at the end of the step, where the strains are not yet known: the concentration is a fixed point, which the package solves together with the laws of the phases. The unknowns of a step are the strains and the internal variables of every phase; the equations are the laws of the phases, the concentration of the increment in every phase but one, and the mixture rule
The isotropic projection
The tangent of a plastic phase is anisotropic, oriented by its current flow. A scheme with an anisotropic matrix needs the Hill tensor of an anisotropic medium at every iteration, a numerical integral. As Doghri and Ouaar (2003) do, the package projects every tangent on the isotropic tensors before homogenizing:
which is the average of the tangent over all the rotations of space. The Hill tensors of an isotropic matrix are in closed form, and the projection of the tangent of an isotropic elastic phase is the phase itself.
The composite as a law
IncrementalTangent builds a law of MaterialLaws whose internal variables are the strains of the phases (M_ε, …) and their internal variables (M_εᵖ, …). Its consistent tangent comes from the implicit-function theorem applied to all the equations of the step, the variation of the concentration tensors with the tangents included. With elastic phases it is the linear estimate of the scheme, exactly. With plastic phases its response lies between the uniform stress and the uniform strain, and depends on the morphology through the scheme.
Scope
| phases | any laws of the strain and the stress, with internal variables; one law per phase of the cell |
| schemes | any linear scheme of the package; the phases are projected on isotropic tensors |
| cost | about 1 ms per step for two phases and the Mori–Tanaka scheme |
| not covered | the anisotropic tangent (without projection), and the other linearizations of the literature, which give different estimates: the affine formulation for laws of the strain alone, the second-order one |
Example: a particle-reinforced alloy
This example homogenizes an elastoplastic aluminum alloy reinforced by stiff elastic particles with the incremental tangent approach, and places it between the uniform-field composites.
The composite
using MeanFieldHomogenization, TensND, Plots
alloy = J2Plasticity(; E = 70e3, ν = 0.33, σ₀ = 150.0, H = 1e3) # MPa
particle = LinearElasticity(; E = 400e3, ν = 0.2)
cell(f) = (rve = RVE();
add_phase!(rve, :M, Ellipsoid(1.0), Dict(:C => TensISO{3}(1.0, 1.0)); fraction = :rest);
add_phase!(rve, :I, Ellipsoid(1.0), Dict(:C => TensISO{3}(1.0, 1.0)); fraction = f);
rve)
laws = (M = alloy, I = particle)| code | theory |
|---|---|
cell(f) | the morphology: a matrix and spherical particles of fraction f; its stiffnesses are replaced |
IncrementalTangent(cell(f), laws) | every phase linearized by its tangent at each step, Mori–Tanaka on the isotropic projections |
Tension
path = LoadingPath(range(0, 1; length = 41); ε11 = t -> 1e-2 * t)
p = plot(; xlabel = "axial strain (%)", ylabel = "axial stress (MPa)", legend = :topleft)
r = point_response(IncrementalTangent(cell(0.3), laws), path)
plot!(p, r[:ε11] * 100, r[:σ11]; lw = 2, label = "incremental tangent, 30 % particles")
for (c, label) in ((UniformStrain(laws, (M = 0.7, I = 0.3)), "uniform strain"),
(UniformStress(laws, (M = 0.7, I = 0.3)), "uniform stress"))
rc = point_response(c, path)
plot!(p, rc[:ε11] * 100, rc[:σ11]; lw = 2, ls = :dash, label)
end
plot!(p, r[:ε11] * 100, point_response(alloy, path)[:σ11]; lw = 2, ls = :dot, label = "alloy alone")
p
The incremental tangent estimate lies between the two uniform fields. The uniform strain loads the stiff particles with the full strain of the alloy and overestimates the stress by far; the uniform stress lets the alloy carry all the strain. The particles stiffen the alloy and raise its apparent yield stress, by carrying a share of the load that grows as the alloy yields.
The fraction of particles
q = plot(; xlabel = "axial strain (%)", ylabel = "axial stress (MPa)", legend = :topleft)
for f in (0.0001, 0.1, 0.2, 0.3)
rf = point_response(IncrementalTangent(cell(f), laws), path)
plot!(q, rf[:ε11] * 100, rf[:σ11]; lw = 2, label = "f = $f")
end
q
Check
With elastic phases the approach is the linear Mori–Tanaka estimate:
elastic = IncrementalTangent(cell(0.3), (M = LinearElasticity(; E = 70e3, ν = 0.33), I = particle))
rve = RVE()
add_phase!(rve, :M, Ellipsoid(1.0), Dict(:C => iso_stiffness_young_poisson(70e3, 0.33)); fraction = :rest)
add_phase!(rve, :I, Ellipsoid(1.0), Dict(:C => iso_stiffness_young_poisson(400e3, 0.2)); fraction = 0.3)
E = Mandel{Float64}(1e-3, 0, 0, 0, 0, 0)
point_update(elastic, E, initial_state(elastic), 1.0)[2] ≈ KM(homogenize(rve, MoriTanaka(), :C))trueThis page was generated using Literate.jl.