Skip to content

Uniform fields: Voigt–Taylor and Reuss–Sachs ​

The whole page as one script

Every block of this page, in order, is scripts/material_laws/11_uniform_fields.jl. From a clone of the repository, julia --project=docs -e 'using Pkg; Pkg.instantiate()' once, then julia scripts/material_laws/11_uniform_fields.jl, runs it end to end.

The simplest composites of nonlinear phases assume one field to be uniform: every phase undergoes the macroscopic strain, or every phase carries the macroscopic stress. They ignore the shapes and the arrangement of the phases. For linear elastic phases they are the bounds of Voigt (1889) and Reuss (1929), between which every estimate of the effective stiffness lies (Hill, 1952). For plastic phases they are the models of Taylor and of Sachs, the extremes of the polycrystal models. This page states them for any law of MaterialLaws; the secant methods and the polycrystal interactions sit in between. The example below runs them.

Uniform strain ​

Every phase , of volume fraction , undergoes the macroscopic strain and integrates its own law over the step:

being the internal variables of the phase. The phases interact only through the strain they share: each integrates independently, and the consistent tangent of the composite is the average of theirs. A uniform strain is a kinematically admissible field: for phases deriving from convex potentials, it gives an upper bound of the effective potential. For linear elastic phases this is the Voigt stiffness  .

Uniform stress ​

Every phase carries the macroscopic stress, and the strains of the phases, unknown, average to the macroscopic one:

Under a prescribed macroscopic strain, the unknowns of a step are the macroscopic stress, the strain of every phase and their internal variables. They are solved together, the equilibrium of every phase with the macroscopic stress and the mixture rule of the strains being added to the equations of the phase laws. A uniform stress is statically admissible: for convex potentials it gives a lower bound. For linear elastic phases this is the Reuss stiffness  .

As laws of MaterialLaws ​

UniformStrain and UniformStress build laws whose internal variables gather those of the phases, renamed after them (M_εᵖ, …), and for the uniform stress also the macroscopic stress (Σ_σ) and the strains of the phases (M_ε, …). A phase whose step is elastic keeps its internal variables, whatever the others do. The consistent tangent of the composite comes, as for any law, from the implicit-function theorem applied to all these equations: for the uniform stress it is the inverse of the average of the tangent compliances of the phases, which no formula of the code writes. Every phase law of the package fits, with internal variables (plasticity, viscosity, damage) or with several fields, provided the phases share their fields.

Numerical notes ​

startthe Newton iteration of a uniform-stress step starts with every phase taking the macroscopic increment of the strain, a uniform-strain predictor
strongly nonlinear phasesinverting a phase law (a power law of small exponent) is ill-conditioned: the driver cuts the steps that fail
no finite tangenta phase without a finite tangent at the current strain (a power law at zero strain) makes the tangent of the composite undefined there (NaN), not the update

Example: two elastoplastic phases ​

This example builds the two uniform-field composites of a steel and an aluminum alloy, and checks them against the elastic bounds and against the closed form of linear hardening.

The phases ​

julia
using MeanFieldHomogenization, Plots

steel = J2Plasticity(; E = 200e3, ν = 0.3, σ₀ = 250.0, H = 10e3)     # MPa
alloy = J2Plasticity(; E = 70e3, ν = 0.33, σ₀ = 150.0, H = 2e3)
laws, fractions = (S = steel, A = alloy), (S = 0.3, A = 0.7)
taylor = UniformStrain(laws, fractions)
sachs = UniformStress(laws, fractions)
codetheory
UniformStrain(laws, fractions)every phase at the macroscopic strain (Voigt, Taylor)
UniformStress(laws, fractions)every phase at the macroscopic stress (Reuss, Sachs)
laws, fractionsthe law and the volume fraction of each phase, by name

A tensile test ​

julia
path = LoadingPath(range(0, 1; length = 41); ε11 = t -> 6e-3 * t)
rT, rS = point_response(taylor, path), point_response(sachs, path)
p = plot(rT[:ε11] * 1e3, rT[:σ11]; lw = 2, label = "uniform strain (Taylor)",
    xlabel = "axial strain (‰)", ylabel = "axial stress (MPa)", legend = :bottomright)
plot!(p, rS[:ε11] * 1e3, rS[:σ11]; lw = 2, label = "uniform stress (Sachs)")

The uniform strain is the stiffer: the strong steel is strained as much as the alloy and carries a large share of the stress. Under a uniform stress the alloy yields first and takes most of the strain, which the composite shows as an earlier and lower plastic branch. The internal variables of each phase are read by name:

julia
(alloy_p_taylor = rT[:A_p][end], alloy_p_sachs = rS[:A_p][end], alloy_strain_sachs = rS[:A_ε11][end])
(alloy_p_taylor = 0.003778981603972813, alloy_p_sachs = 0.00591286307053942, alloy_strain_sachs = 0.008224659158269119)

Checks ​

Linear hardening in uniaxial stress. Under a uniform stress every phase is in uniaxial stress , and its axial strain is   . The macroscopic strain is their average:

julia
axial(σ, E, σ₀, H) = σ / E + max(σ - σ₀, 0) / H
expected = [0.3 * axial(σ, 200e3, 250.0, 10e3) + 0.7 * axial(σ, 70e3, 150.0, 2e3) for σ in rS[:σ11]]
maximum(abs, expected - rS[:ε11])
5.984795992119984e-17

The elastic bounds. In the elastic range the tangents of the two composites are the Voigt and Reuss stiffnesses of the package:

julia
using TensND, StaticArrays
rve = RVE()
add_phase!(rve, :S, Ellipsoid(1.0), Dict(:C => iso_stiffness_young_poisson(200e3, 0.3)); fraction = 0.3)
add_phase!(rve, :A, Ellipsoid(1.0), Dict(:C => iso_stiffness_young_poisson(70e3, 0.33)); fraction = :rest)
E = Mandel{Float64}(1e-4, 0, 0, 0, 0, 0)
(point_update(taylor, E, initial_state(taylor), 1.0)[2] ≈ KM(homogenize(rve, Voigt(), :C)),
 point_update(sachs, E, initial_state(sachs), 1.0)[2] ≈ KM(homogenize(rve, Reuss(), :C)))
(true, true)

This page was generated using Literate.jl.