Repository navigation
short_fibre_composite: Mori-Tanaka over the fibre orientation distribution - #133
Conversation
389f17f to
47f5ce0
Compare
1171b6f to
2e38cdd
Compare
|
Review findings (design, tmech expressions instead of component loops, modern C++, comments, tests, correctness). Severity: must = wrong result, hang, build break or unreachable feature; should = design, duplication, accuracy; nit = style. short_fibre_composite — needs changes
|
47f5ce0 to
98a1951
Compare
2e38cdd to
3805b49
Compare
|
Rebased on the Eshelby-node refactor (#128): the fibre shape is an
Not added: an anisotropic-fibre test — the repo has no transversely isotropic linear material to feed it yet. |
98a1951 to
af8c49a
Compare
3805b49 to
7208e62
Compare
af8c49a to
d228631
Compare
7208e62 to
90289e1
Compare
|
Producer/consumer pass: the fibre is one |
d228631 to
1c1894f
Compare
90289e1 to
f444ebe
Compare
1c1894f to
d38f8e9
Compare
f444ebe to
ef6e567
Compare
d38f8e9 to
a894d13
Compare
5b014b8 to
7058b57
Compare
a894d13 to
03b3598
Compare
7058b57 to
557b163
Compare
03b3598 to
a22be6e
Compare
557b163 to
40204f6
Compare
a22be6e to
ed2da02
Compare
40204f6 to
d65215c
Compare
core/elliptic_integrals.h: R_F, R_C, R_D, R_J by Carlson's duplication algorithm and the complete integrals K, E, so the Eshelby tensors of ellipsoids and the orientation averaging need no Boost. core/elastic_constants.h: K, G, E, nu, lambda conversions, the isotropic stiffness, rotation of rank-2 and rank-4 tensors, rotations from axis and angle and onto a direction.
umat/deformation_gradient_driver.h drives a material point by F under mixed F / P control, Newton on the full nine components with dP/dF; deformation_control names them (21, 31, 32 included). A report whose point has a deformation_gradient_source records F and P with nine components, the Cauchy stress as stress_11..23 and J; tensors in cases may have nine components. Reports for neo_hooke and saint_venant_kirchhoff with exact checks (S = F^-1 P under uniaxial stress, simple shear, volumetric).
core/eshelby.h: sphere in closed form from the projectors; elliptic and circular cylinders along any axis or direction (Mura 11.21); ellipsoids with any semi-axes from Mura's I-integrals through Carlson's R_D, the degenerate pairs (spheroid, sphere) from the sum rules, an infinite axis dispatching to the cylinder. Tests against the closed forms, the limits, uvwmaterial's spheroid formula and the identity S_iikk = (1 + nu)/(1 - nu).
…ses, projectors of the controls, load path accessors
…n tensor, float-safe rotation_to The elliptic integrals come from Boost.Math where they are first used (the Eshelby tensors). rotation() builds [axis]_x as -(epsilon . axis); rotation_to() uses 8 eps of the scalar type instead of 1e-14, which did not compile for float and would have been c > 1 there. [[nodiscard]] on the pure helpers.
…per shape eshelby_sphere, eshelby_cylinder, eshelby_spheroid and eshelby_ellipsoid consume nu_source / nu_property and publish the output "tensor"; the engine orders and re-evaluates them with nu. Two scalar producers feed them: poisson_ratio_from_moduli (K_source, G_source -> value) and isotropic_moduli (tangent_source -> K, G, poisson_ratio through isotropize, rejecting an anisotropic tangent). Composites hold a node through eshelby_tensor_interface (tensor() at the wired nu, tensor(nu) for the self-consistent iterate). core/eshelby.h keeps the closed forms: the integrals come from Boost.Math (ellint_rd), the tensors are assembled on the eigenprojectors, equal axes are detected at sqrt(eps).
core/isotropize.h: K = Pvol::C / Dim, G = Pdev::C / (2 (Dim(Dim+1)/2 - 1)), and the isotropic part built from them. core/lebedev.h with generated tables (tools/extract_lebedev.py from uvwmaterial's rule, precisions 3 to 23, up to 194 points): spherical means and integrals of tensor-valued functions of the direction. eshelby::depolarisation for ellipsoids via Carlson's R_J, the elliptic cylinder in closed form, and the cylinder along a direction.
Phases are materials providing a tangent, with volume fractions; outputs the effective tangent, the stress and the strain concentration tensors (sum c_i A_i = Isym). Report with the closed forms of the three kernels and their ordering. Report generator: derived values resolve in dependency order, independent of the key order.
…ent producer over phases The composite consumes the phases' produced tangents, fractions and Eshelby tensors and produces the effective tangent and the concentrations; the stress is a linear_stress on the tangent. It reaches into no other node: no material_ref, no eshelby(nu), no isotropisation of the matrix. Self-consistent is a graph cycle closed by one local edge: isotropic_moduli on the composite tangent produces nu of the effective medium, the Eshelby nodes read it with nu_edge = local (from nu_initial on the first pass), and one update() is one relaxed Picard step with "residual" as its error. The matrix is a phase with its own Eshelby node, so its shape is no longer a hard-coded sphere. material_point_evaluator closes the fixed point per host call (residual_property, residual_tolerance, max_passes; the report point names them). isotropic_moduli with a non-positive tolerance projects without the isotropy check, which the effective medium needs.
…ution Spheroidal fibres in an isotropic matrix with the second-order orientation tensor: Mori-Tanaka with the orientation-averaged dilute concentration, or the averaged unidirectional stiffness. Eshelby tensors per direction are cached for the matrix Poisson ratio. Report with aligned, injection-moulded and random states against the unidirectional composite and isotropy.
core/orientation.h: fit_acg solves a_i = R_D(b_j, b_k, b_i) / 3 with det b = 1 by Newton in the principal frame of the orientation tensor (any A, not only diagonal), the aligned case as a single direction, planar cases by an eigenvalue floor; nodes maps the Lebedev rule through B^-1/2; average integrates a function of the direction.
… in the fibre frame Both phases come in as produced properties (tangent, fraction, the fibre's Eshelby tensor along x1); the composite consumes them, forms the dilute concentration once in the fibre frame, rotates onto the quadrature directions with otimesu(R, R) fixed per direction, and produces the tangent and the two concentrations. The stress is a linear_stress on the tangent. No material_ref.
ed2da02 to
d855f53
Compare
d65215c to
02524f8
Compare
…ls-and-constants # Conflicts: # tests/CMakeLists.txt
…eshelby-tensors # Conflicts: # tests/CMakeLists.txt
…v-depolarisation # Conflicts: # tests/CMakeLists.txt
…/rule-of-mixture # Conflicts: # tests/CMakeLists.txt
# Conflicts: # include/numsim-materials/report/report_json.h # tests/CMakeLists.txt
residual_source, residual_tolerance and max_passes are driver parameters (material_point's defaults) and keys of the report's "point"; the mean-field tangent report uses them for the self-consistent fixed point.
…averaging # Conflicts: # tests/CMakeLists.txt
…-composite # Conflicts: # tests/CMakeLists.txt
Closes #106. Part of the uvwmaterial port (#94); stacked on #132.
short_fibre_composite: Mori–Tanaka stiffness of fibres in an isotropic matrix averaged over the fibre orientation distribution, as a tangent producer overphasenodes (#130). The orientation enters as the second-order tensororientation[a11, a22, a33, a12, a13, a23]; the ACG distribution with that second moment (#132) gives the quadrature directions, Lebedevprecision(default 23) the weights. Two averagings as in uvwmaterial:concentration(the orientation average of the dilute concentration inside Mori–Tanaka) andstiffness(the average of the unidirectional Mori–Tanaka stiffness).Matrix and fibre are phases (
matrix,fibre: produced tangent and fraction; the fibre'seshelbyis aneshelby_spheroidoreshelby_cylinderalong x₁ consuming the matrix Poisson's ratio — #128, #130). The composite consumes their properties and nothing else. Everything is formed once in the fibre frame — the dilute concentration T₁ = (I + S₁ : Cₘ⁻¹ : (C_f − Cₘ))⁻¹, the unidirectional stiffness and (C_f − Cₘ) : T₁ — and rotated onto the directions withotimesu(R, R)fixed per direction at construction. One rank-4 inverse per update instead of one per direction, and a transversely isotropic fibre tangent given in the fibre frame is rotated with the rest. Outputstangent,concentration_matrix,concentration_fibre; the stress is alinear_stresson the tangent. The two fractions must sum to one.Tests (
test_short_fibre_composite, 6): aligned fibres equal the unidirectionalmean_field_tangentto 1e-12 for both averagings (tangent and concentrations); the isotropic orientation gives an isotropic tangent; Σ c A = I and thelinear_stressgives C : ε; stiffness ordering aligned > mostly aligned > random along x₁; a wrong orientation trace, averaging and Lebedev degree are rejected; JSON.Report
docs/materials/short_fibre_composite/report.json: aligned, injection-moulded (0.7, 0.25, 0.05) and random orientation on one point, the aligned case checked against the unidirectional composite.889/889 tests pass (GCC 14, reports on).
JSON input
New material type:
short_fibre_composite. Ajson_modeldocument that loads (theFromJsontest of the PR):{"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": "Kf", "value": 60.0}, {"type": "constant_scalar", "name": "Gf", "value": 30.0}, {"type": "isotropic_tangent", "name": "Cm", "K_source": "Km", "G_source": "Gm"}, {"type": "isotropic_tangent", "name": "Cf", "K_source": "Kf", "G_source": "Gf"}, {"type": "isotropic_moduli", "name": "moduli", "tangent_source": "Cm"}, {"type": "eshelby_spheroid", "name": "shape", "nu_source": "moduli", "nu_property": "poisson_ratio", "aspect_ratio": 10.0}, {"type": "constant_scalar", "name": "c", "value": 0.2}, {"type": "constant_scalar", "name": "cm", "value": 0.8}, {"type": "phase", "name": "fibres", "tangent_source": "Cf", "eshelby_source": "shape", "fraction_source": "c"}, {"type": "phase", "name": "matrix", "tangent_source": "Cm", "fraction_source": "cm"}, {"type": "short_fibre_composite", "name": "sf", "matrix": "matrix", "fibre": "fibres", "orientation": [0.8, 0.1, 0.1, 0, 0, 0], "averaging": "concentration", "precision": 23}, {"type": "linear_stress", "name": "composite", "tangent_source": "sf", "strain_source": "strain"} ]}The fibre's Eshelby node lies along x₁ (the fibre frame; a transversely isotropic fibre tangent is given in that frame);
orientation= [a11, a22, a33, a12, a13, a23] of the second-order orientation tensor;averagingconcentration|stiffness;precisiona Lebedev degree (3 … 23). Outputstangent,concentration_matrix,concentration_fibre.