Repository navigation
hencky_elasticity: linear elasticity in the logarithmic strain - #141
Conversation
|
The cause behind Plan for this PR once tmech#38 is merged and tagged: bump the tmech pin, drop |
|
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. hencky_elasticity — needs changes
|
|
Review findings addressed in the last commit (tmech#38 is merged, pin → main 46d8fdd):
Not done here: a 2D runtime test — |
3d2fd8e to
4e92931
Compare
0a1f33c to
3506d30
Compare
4e92931 to
bf49f47
Compare
3506d30 to
1300c84
Compare
bf49f47 to
e5e56ce
Compare
1300c84 to
1d9084a
Compare
|
Producer/consumer pass: |
e5e56ce to
3693657
Compare
1d9084a to
cf75acb
Compare
3693657 to
d067a3e
Compare
cf75acb to
ec31ebe
Compare
d067a3e to
a586b3c
Compare
ec31ebe to
ebfb2d6
Compare
a586b3c to
6cd5670
Compare
ebfb2d6 to
df4dddb
Compare
6cd5670 to
8a28695
Compare
df4dddb to
a0b41e5
Compare
8a28695 to
11c29c7
Compare
a0b41e5 to
2e918d1
Compare
11c29c7 to
a5df503
Compare
2e918d1 to
d2a423f
Compare
load_driver runs one material point under mixed strain/stress control (uniaxial stress solves the five lateral strains with the material tangent) and records the Newton residuals; material_report runs the load cases of a case.json and writes CSV; reports/make_report.py turns them into figures and the results section of docs/materials/<material>/README.md.
The correction solves (P:C:P + Isym - P + Iskw) : d_eps = -P:(sigma - sigma*) with tmech::invf instead of a hand-written 6x6 elimination; Iskw makes the operator regular on the full 9x9 space. Strain, stress and tangent are tensors, converted to and from the evaluator buffers with tensor_conversion.
A report document holds the model graph, the material point, recorded
columns wired to any graph property ("material::property[i,j]"), the load
cases, the figures and the checks. Includes merge shared cases and figures;
"$name" strings take parameters. material_report writes resolved.json,
graph.json (materials, parameters, produced and consumed properties) and
CSV per case; make_report.py evaluates the checks against closed forms,
draws the figures and writes the results with the wiring diagram. Every
report is a ctest (checks only).
dz/dt = (k1 + k2 z^m) (1 - z)^n with Arrhenius rate constants, as a rate law for rk_integrator next to curing_rate (the autocatalytic term alone; nth order is curing_rate with m = 0).
inclusion takes a fraction_source ("material::property") so the volume
fraction can follow the degree of cure; the chemical shrinkage
beta xi I is thermal_eigenstrain with the cure state as its source.
Three propagation laws of uvwmaterial next to the linear and exponential ones (damage_exponential2 is the existing exponential law). Report of isotropic_damage with every law recorded; the report point takes stress_property and tangent_property; named entries of an include can be replaced, so the tangent check skips the steps on the damage surface.
…d the state-function parameters
The converter writes an eshelby_sphere / _cylinder / _spheroid node per
uvwmaterial eshelby_tensor, wired to the composite's matrix, and the inclusion
or short_fibre_composite names it. Its output is the report layout
{"model", "point"}: json_model rejects an unknown top-level key, so the
earlier {"materials", "point"} did not load. uvwmaterial's linear law
D = K kappa is the power law with m = 1 (linear_damage_law is the kappa_0 ..
kappa_f ramp); strain_energy_state_function gets tangent_source and
youngs_modulus, vector_strain_state_function the axis indices. The C++ cards
test holds the converter's actual output.
Every phase reads the composite strain; weighted_sum with constant_scalar fractions gives the Voigt stress and the consistent tangent. Tested with a J2 and an elastic phase under uniaxial stress against the weighted phase stresses and against rule_of_mixture while elastic.
a5df503 to
53d3c19
Compare
d2a423f to
72adaf0
Compare
…rain mean_field_strain and mean_field_stress: strain localisation around the phase materials (linear)
…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
…-elasticity # Conflicts: # include/numsim-materials/umat/deformation_gradient_driver.h # include/numsim-materials/umat/material_point_driver.h # tests/CMakeLists.txt
…genstrain # Conflicts: # tests/CMakeLists.txt
…-rate # Conflicts: # tests/CMakeLists.txt
…rain # Conflicts: # tests/CMakeLists.txt
# Conflicts: # include/numsim-materials/report/report_json.h # tests/CMakeLists.txt # tests/test_report_case.cpp
The report's "point" names them for materials that publish e.g. damaged_stress / damaged_tangent (isotropic_damage report).
# Conflicts: # reports/CMakeLists.txt # tests/CMakeLists.txt
# Conflicts: # tests/CMakeLists.txt
# Conflicts: # include/numsim-materials/report/case_runner.h # include/numsim-materials/report/report_json.h # tests/CMakeLists.txt
Closes #113. Part of the uvwmaterial port (#94); stacked on #140.
materials/hencky_elasticity.h(hencky_elasticity): ε = ln V = ½ ln b with b = FFᵀ, τ = C : (ε − ε_eig), P = τ F⁻ᵀ, dP/dF = (C : d ln V/dF)·F⁻ᵀ − P ⊠̄ F⁻¹ with d ln V/dF = ½ (d ln b/db) : (I⊠F + F⊠̄I); the stiffness a consumed property (tangent_source, e.g. anisotropic_tangentof produced K and G — so cure-dependent moduli are a wiring), optionaleigenstrain_source(thermal or chemical eigenstrain in the log strain), outputlog_strain. Dim generic. Replaceshencky_strains_linear_elasticand its thermo / thermo-chemo variants (the latter arehencky_elasticityplusthermal_eigenstrain).tmech pin → main
46d8fdd(tmech#38). The report of this PR found that tmech'slogandpolar_decompositionwere wrong at near-repeated eigenvalues (petlenz/tmech#37); the first version of this PR carried an interimcore/log_strain.hon Eigen. With the fix merged the material usestmech::log(b)and.derivative()directly, and the interim file, its tests and the Eigen include are gone. A tag would be preferable to the commit;FIND_PACKAGE_ARGS 1.2still accepts an installed 1.2.0, which lacks the fix — the next tmech release should raise it.Reports:
load_case::fd_stepisstd::optional; a case may set it, otherwise the driver default applies instead of being overwritten. The finite-strain standard'sfd_step: 1e-6workaround is dropped;report_hencky_elasticity,report_neo_hookeandreport_saint_venant_kirchhoffpass at 1e-7.docs/materials/hencky_elasticity/report.json: the finite-strain standard plus the uniaxial, volumetric and simple-shear closed forms.Tests (
test_hencky_elasticity, 7): dilatation P = 3K ln λ/λ exactly; the small-strain limit is linear elasticity; under uniaxial stress ln F₂₂ = −ν ln F₁₁ exactly and P₁₁ = E ln λ/λ, tangent against central differences at λ = 1.1, 1.5, 0.7 and in simple shear; the tangent at exactly and nearly repeated stretches (the tmech#37 symptom: (1.15, 1.15, 1), (1.2, 1.2, 1.2), (1.15, 1.15 + 1e-9, 1), (1.204, 0.9458, 0.9458)); objectivity P(RU) = R P(U) and P(R) = 0; constrained heating and free expansion with an eigenstrain; JSON.Docs:
docs/uvwmaterial-mapping.mdrow for the Hencky family; the card converter pointshencky_strains_linear_*athencky_elasticity(likesaint_venant_kirchhoff, a finite-strain card needs anexternal_deformation_gradient_sourcewritten by hand).907/907 tests pass (GCC 14, reports on).
JSON input
New material types:
hencky_elasticity. Ajson_modeldocument that loads (theFromJsontest of the PR):{"materials": [ {"type": "external_deformation_gradient_source", "name": "F"}, {"type": "constant_scalar", "name": "K", "value": 166.67}, {"type": "constant_scalar", "name": "G", "value": 76.92}, {"type": "isotropic_tangent", "name": "stiffness", "K_source": "K", "G_source": "G"}, {"type": "hencky_elasticity", "name": "h", "deformation_gradient_source": "F", "tangent_source": "stiffness"} ]}tangent_sourcea produced small-strain stiffness (cure-dependent moduli are a wiring); optionaleigenstrain_source(athermal_eigenstrain); outputsstress(P),tangent(dP/dF),log_strain.