Repository navigation
mean_field_strain and mean_field_stress: strain localisation around the phase materials (linear) - #144
Open
petlenz wants to merge 1 commit into
Open
mean_field_strain and mean_field_stress: strain localisation around the phase materials (linear)#144petlenz wants to merge 1 commit into
petlenz wants to merge 1 commit into
Conversation
petlenz
force-pushed
the
feature/hencky-elasticity
branch
2 times, most recently
from
October 18, 2026 13:38
ebfb2d6 to
df4dddb
Compare
petlenz
force-pushed
the
feature/mean-field-local-strain
branch
from
October 18, 2026 13:53
fd0fcdc to
4506dbc
Compare
petlenz
force-pushed
the
feature/hencky-elasticity
branch
from
October 18, 2026 18:55
df4dddb to
a0b41e5
Compare
petlenz
force-pushed
the
feature/mean-field-local-strain
branch
from
October 18, 2026 18:55
4506dbc to
f17f10d
Compare
petlenz
force-pushed
the
feature/hencky-elasticity
branch
from
October 18, 2026 20:03
a0b41e5 to
2e918d1
Compare
petlenz
force-pushed
the
feature/mean-field-local-strain
branch
from
October 18, 2026 20:03
f17f10d to
a0a7d3b
Compare
petlenz
force-pushed
the
feature/hencky-elasticity
branch
from
October 18, 2026 20:22
2e918d1 to
d2a423f
Compare
petlenz
force-pushed
the
feature/mean-field-local-strain
branch
from
October 18, 2026 20:22
a0a7d3b to
7f55103
Compare
…he phase materials The composite is split into two nodes. mean_field_strain consumes the composite strain increment and the phases' tangents, fractions and Eshelby tensors and produces one strain per phase (history) and the concentration tensors, for the voigt, reuss, hill, dilute and mori_tanaka kernels. The phase materials consume those strains through strain_source / strain_property like any other strain. mean_field_stress averages the stresses and tangents they produce with the concentrations and reports a residual, the difference between the tangent a phase node carried and its material's current one. With linear phases every edge is global, one pass is exact and the result equals mean_field_tangent with a linear_stress to round-off, the phase strains and stresses available as properties. docs/mean_field.md describes the composite layer.
petlenz
force-pushed
the
feature/hencky-elasticity
branch
from
October 19, 2026 04:07
d2a423f to
72adaf0
Compare
petlenz
force-pushed
the
feature/mean-field-local-strain
branch
from
October 19, 2026 04:07
7f55103 to
427f671
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #116 (the linear half). Part of the uvwmaterial port (#94); stacked on #141 (the whole stack: Eshelby and depolarisation nodes, phase nodes, producer/consumer wiring).
Strain localisation as two nodes around the phase materials. Nothing walks the graph, nothing re-binds relays; the engine orders everything and the materials are ordinary consumers of a produced strain.
mean_field_strain: from the composite strain increment (strain_source, history) and the phases' tangents, fractions and Eshelby tensors (matrix,phases:phasenodes) it produces one strain per phase,strain_<phase>= ε_r,ₙ + A_r : Δε (history properties: commit, revert and the UMAT state vector carry them), and the concentrationsconcentration_<phase>.kernelis any of the global schemes —voigt(A = I, no tangents read),reuss,hill(Aᵣ = ℂᵣ⁻¹ : ℂ_R and the mean with I, no Eshelby tensors),dilute,mori_tanaka— so the rule of mixtures localises through the same pair."strain_source": "mt_strain", "strain_property": "strain_matrix"(materials: strain consumers name the strain property they read #145). Herelinear_stress/linear_elasticityon the producers' tangents — evaluated once per update, at their local strain.mean_field_stress:stress= Σ c_r σ_r andtangent= Σ c_r C_r : A_r from the materials' current stresses and tangents (matrix_stress_source,stress_sources, optionaltangent_sources,matrix_stress_property/matrix_tangent_propertyfor a material that names them differently) and the concentrations of the strain node;residual= the largest relative difference between a phase node's tangent and its material's current one — identically zero here, the handle the nonlinear PR uses.With linear phases every edge is global, one pass is the fixed point and the result equals
mean_field_tangent+linear_stressto round-off, with the phase strains and stresses available as properties. The nonlinear case (a phase whose tangent depends on its own strain) is the next PR: a local tangent edge on the phase node and the passes closing the fixed point.Tests (
test_mean_field_local, 4): the linear wiring converges in one pass (residual= 0) and equals the tangent homogenisation (tangent, stress, matrix strain); Voigt, Reuss and Hill through the pair equalrule_of_mixture(tangent, concentrations, stress; Voigt: equal strain, Reuss: equal stress); non-parallel source lists are rejected; JSON.Docs:
docs/mean_field.md(the composite layer: phase nodes, tangent homogenisation, the self-consistent cycle, strain localisation, who runs the fixed point) and the README links.965/965 tests pass (GCC 14, reports on).
JSON input
{"materials": [ {"type": "external_strain_source", "name": "strain"}, {"type": "constant_scalar", "name": "Km", "value": 3.0}, {"type": "constant_scalar", "name": "Gm", "value": 1.0}, {"type": "constant_scalar", "name": "Ki", "value": 60.0}, {"type": "constant_scalar", "name": "Gi", "value": 30.0}, {"type": "isotropic_tangent", "name": "C_m", "K_source": "Km", "G_source": "Gm"}, {"type": "isotropic_tangent", "name": "C_i", "K_source": "Ki", "G_source": "Gi"}, {"type": "isotropic_moduli", "name": "moduli", "tangent_source": "C_m"}, {"type": "eshelby_sphere", "name": "sphere", "nu_source": "moduli", "nu_property": "poisson_ratio"}, {"type": "constant_scalar", "name": "c", "value": 0.3}, {"type": "constant_scalar", "name": "cm", "value": 0.7}, {"type": "phase", "name": "matrix", "tangent_source": "C_m", "fraction_source": "cm"}, {"type": "phase", "name": "spheres", "tangent_source": "C_i", "fraction_source": "c", "eshelby_source": "sphere"}, {"type": "mean_field_strain", "name": "mt_strain", "strain_source": "strain", "matrix": "matrix", "phases": ["spheres"]}, {"type": "linear_stress", "name": "m", "tangent_source": "C_m", "strain_source": "mt_strain", "strain_property": "strain_matrix"}, {"type": "linear_stress", "name": "s", "tangent_source": "C_i", "strain_source": "mt_strain", "strain_property": "strain_spheres"}, {"type": "mean_field_stress", "name": "mt", "concentration_source": "mt_strain", "matrix": "matrix", "phases": ["spheres"], "matrix_stress_source": "m", "matrix_tangent_source": "C_m", "stress_sources": ["s"], "tangent_sources": ["C_i"]} ]}