Bounded history-material plane stress¶
Decision and ownership¶
Extend the material-only workflow, not the material law or a project solver.
Study declares plane stress, PlaneStressReduction declares reflection
symmetry and local controls, the neutral provider returns a full 3D response,
and the existing Procedure/State owns global acceptance and restart.
The scalar unknown is positive thickness stretch, represented by log(F33).
The local residual is P33 and its logarithmic derivative is A3333 times F33.
All local candidates reuse the same accepted F/state and physical time step.
The accepted full material response remains unchanged. A separate 4×4 Schur
complement supplies in-plane assembly; it is not relabeled as a full dP/dF.
Cauchy-to-Piola conversion uses the effective 3D F and determinant.
Accepted F33 is stored alongside F and response arrays in the existing
transaction and checkpoint. Loading a checkpoint does not call the material.
The effective gradient is also a raw quadrature result and a recovered
F_CELL visualization field. No project-managed thickness cache is required.
Admission and exclusions¶
- Serial homogeneous 2D, strong constraints and reference dead loads, as in the parent workflow; no new contact/MPC/MPI/thermal-history admission.
- Explicit reflection-symmetric 3D material and compatible history, planar F, checked transverse shear/coupling and positive transverse stiffness.
- Unit reference thickness; no shell/director, general anisotropic reduction, mixed incompressibility, automatic multiaxial inference or localization fix.
- The first reduction uses scalar local updates inside the bounded quadrature driver. It is not a new array-batch optimization or a performance promise.
- Local relative tolerance scales with physical stress/stiffness, without a unit-sized floor. Absolute tolerance has stress units. Both enter identity.
- Existing specialized StVK/Neo-Hookean reductions remain independent routes.
Independent checks¶
tests/test_history_plane_stress.py includes:
- Closed Green-strain transverse solutions through loading, hold and reversal for two educational history laws; original request history remains intact.
- Condensed algorithmic tangent versus independently perturbed reduced responses, on both smooth damage/history branches.
- Separate specialized Neo-Hookean thickness/stress solution; actual 3D Cauchy/Piola conversion and stress-unit rescaling.
- Positive-thickness local safeguarding; incompatible shear/coupling, singular stiffness and local nonconvergence rejected explicitly.
- Degree-one/two structural patches and nonuniform assembled tangent checks.
- Traction-controlled structure versus independently solved scalar equilibrium and analytical history recurrences, not the reduction's own output as oracle.
- Nonuniform damage manufacture: u=(axx,0), analytically differentiated reference body force, quadratic transverse Green-strain elimination; linear-element spatial refinement and quadratic-element exactness.
- Viscous time refinement against independently integrated continuous-time coupled transverse/history ODEs, rather than a finer call to the same update.
- Failed trials, material-requested cutback, continuous/restarted equality, identity changes and corrupt effective-gradient atomic rejection.
- Real VTK time selection and Warp: one grid retains stress, state and
thickness; the ordinary four-file project tests both material choices and
both plane assumptions through
agentfem check/run. - Interrupted field output is readable before restarting. A zero-copy joined continuation view matches every saved field at every accepted time of an uninterrupted run for both educational laws.
- Built-in finite-strain J2 local reduction agrees with an independent uniaxial logarithmic return through loading, hold, unloading and reverse plastic flow, including Fp and accumulated plastic strain. This local check does not change its specialized global Step admission.
The public check_plane_stress_tangent reports the separate reduced 4×4
derivative, component order and reduction policy. Wrong derivatives are
detected; old history is not mutated. It supplements, not replaces, the full
3D check_material_tangent and independent material validation.
Extreme stress-unit tests exposed an avoidable numerical issue in the first Schur implementation: forming the product of two stiffnesses before dividing could overflow or silently underflow. The implementation now forms the dimensionless ratio first and evaluates dimensional norms after normalization. Equivalent scales from 1e-200 through 1e200 preserve the reduced response. This is a representability regression test, not a useful physical unit range or a change in constitutive equations or numerical tolerances.
The follow-up audit reproduced the same dimensional-norm hazard in the pre-existing full 3D tangent checker: a deliberately 20% wrong tangent passed at scale 1e-200 because both norms underflowed, while scale 1e200 produced NaN. The full and reduced checkers now share normalized error arithmetic. Correct and wrong derivatives retain their verdicts across the tested scales. The existing one-sided fallback at the positive-determinant boundary is explicitly reported as mixed difference with named components; ordinary central evidence retains its existing summary shape. Unrepresentable gradient perturbations are rejected. These checks validate the checker, not a material calibration.
These laws are synthetic educational fixtures, not hydrogel calibration or general fracture/thermodynamic verification. The damage tangent must be tested away from its nonsmooth maximum-history switch; a centered difference across that switch is not either smooth branch's derivative. The test explicitly asserts which branch it occupies instead of weakening tolerances.
Integration regression caught by full CI¶
Parent PR #134's initial Linux full test run completed with 5413 passed,
428 skipped and one failure. The generic provider could catch a built-in J2
request after its specialized provider rejected an unsupported linear-solver
policy, producing a wrong option error. Commit 295bfa80 excludes that built-in
material from generic fallback; 93 targeted tests passed and one MPI-only
test was skipped. The fix was pushed to #134 independently of this reduction.
The failed full run is not relabeled as a passing release gate.
The subsequent parent run 40844625630 at 295bfa80 completed successfully,
including FEniCSx and macOS installed-wheel acceptance. That result applies to
the parent workflow, not automatically to this stacked plane-stress change.
The initial plane-stress commit 64fbd5a5 then passed all applicable CI checks
in run 40848734377, including FEniCSx and macOS installed-wheel acceptance.
Later audit commits require their own CI; the earlier green result is not
silently reassigned to a new HEAD.
Accepted-state ownership audit¶
After the initial reduction commit, eight new failing regressions exposed two ownership gaps in the shared history Step: modified live increment/constraint targets could retain an obsolete checkpoint identity, and changes to accepted material fields or a final observer's displacement could escape continuation checks. The fix compares the existing input identity and uses a compact hash of the contiguous accepted material/response buffers at transaction boundaries. It does not call the material, retain a second field snapshot, or add checks inside the Newton/material-point loop. Time and live loading values are checked alongside the fields. Rejected external mutations cannot be published or saved as accepted data; restoring into a fresh Step remains available.
Thirteen targeted ownership cases cover policy/target changes, history, stress/tangent, time/loading/boundary edits, final observers, reporting before publication, and failed-restore laundering. The guard detects accidental live edits, not malicious archive modification; no new cryptographic archive promise or performance benefit is claimed. Hashing remains proportional to accepted field bytes and occurs only at these lifecycle boundaries.
Ordinary pause and continuation¶
The four-file project now exposes --until through the Step's solve_result
interface. A planned pause returns a partial result with explicit equilibrium,
full-path completion, normalized coordinate and physical-time metadata, plus
an accepted checkpoint. It does not require a project output or Newton loop.
Ten additional tests cover two-law CLI pause/restart/whole-run equality,
zero-copy segment joining, invalid requests before writer creation, and
publishing current accepted state without constitutive reintegration. The
comparison pauses at an existing increment station; no identity claim is made
when a new station changes the time discretization. Unexpected failure still
requires explicit checkpoint cadence; saved visualization frames remain usable.
Installed-use and output evidence¶
The initial targeted source selection passed 418 tests; after the ownership
audit, ordinary pause workflow and tangent-check hardening, the same selection
passed 453 tests. The final expanded selection below passed 777 tests,
with 4 skipped
because their tests require two MPI ranks. It ran in the real fenicsx-env
with PYTHONPATH=src and OpenMP/OpenBLAS threads limited to one:
python -m pytest -q \
tests/test_history_plane_stress.py tests/test_finite_strain_material_step.py \
tests/test_affine_adaptive_preconditioner.py tests/test_user_material.py \
tests/test_material_batch_evidence.py tests/test_finite_strain_j2_material_map.py \
tests/test_documentation.py tests/test_architecture_contract.py \
tests/test_constitutive_models.py tests/test_extension_upgrade_context.py \
tests/test_live_xdmf.py tests/test_xdmf_layout.py tests/test_common_workflows.py \
tests/test_quadrature_physical_recovery.py tests/test_quadrature_snapshot_ownership.py \
tests/test_verification.py tests/test_results.py tests/test_project_cli.py \
tests/test_project_execution.py tests/test_solvers.py \
tests/test_workflow_usability.py tests/test_progress_display.py
Correctness lint, generated API/knowledge checks and strict documentation build also passed. Existing unreduced checkpoint identity/summary shape is preserved; only the new reduction has its additional identity and schema. This is targeted evidence, not a full-repository or MPI release certificate.
Those four skipped cases were subsequently run with the verified
agentfem mpi-run -n 2 --timeout 120 launcher and one numerical thread per
rank. All four distinct tests passed on both ranks: rejected unsupported
distributed linear reuse, two physical-recovery/empty-rank cases and
collective invalid-measure rejection. This protects existing distributed
contracts; the new history-material structural route remains serial-only.
A disposable pure-Python wheel was installed into a separate system-site- packages venv sharing the already available numerical runtime. With no source PYTHONPATH, imports resolved to that venv. The ordinary four-file project completed 16 accepted increments on 64 quadrilateral cells for each plane- stress material choice. All 32 frames were independently read and warped through VTK, checking Cauchy S33, positive thickness, physical AGE and retained cell fields. Visualization occupied 696,475 bytes for the viscous law and 686,479 bytes for damage. These small fixtures are workflow checks, not performance measurements or Windows/fresh-dependency installation evidence.
A second isolated install at source fbfc249c exercised ordinary CLI pause,
restart and uninterrupted runs for both laws. Every joined field at all 16
times and every numeric final checkpoint array matched the uninterrupted
reference exactly on this machine. Maximum absolute Cauchy S33 was 5.323e-9
for the viscous fixture and 8.828e-10 for damage; positive thickness, AGE and
post-Warp fields were checked through VTK. The two complete visualization
sets occupied 696,658 and 686,738 bytes. These are synthetic 64-cell examples.
Installed-use review caught a presentation mismatch: the shared default trust
fallback called a partial result uncomputed. The Step now attaches the
existing computed-but-not-full-convergence report for this accepted segment.
It does not invent another trust grade or promote partial output to independent
verification. Source tests require that verified acceptance still fails.
The updated installed pause smoke confirms status=partial, trust=computed
and no complete-path convergence. A subsequent shared presentation refinement
uses the declared physical coordinate for pause messages and distinguishes
empty/unassessed evidence from an actual failed claim or required quality gate.
All 137 solver/progress/workflow usability tests passed; machine status columns
and verification decisions are unchanged by this human-facing wording.
The project requires both mechanics.FiniteStrainMaterialStep and
constitutive.PlaneStressReduction by API identity. A matching development
version string alone is not enough. No release installer or public binary
distribution is produced by this check.
References¶
- LAPACK scaled sum-of-squares: normalize dimensional values before forming norms to avoid overflow/underflow. The tangent checker uses that scaling principle, not a new LAPACK dependency or copied performance claim.
- Ahmadi et al., plane stress in finite deformation hyperelasticity: local transverse equilibrium and consistent condensation.
- Sierra/SM plane stress rate-dependent plasticity: specialized constitutive reduction with transverse conditions; not a generic history-provider validation.
- Existing AgentFEM neutral
UserMaterial, quadrature transactions and shared Newton attempt remain the implementation contracts; no new solver runtime.
Release boundary¶
This is an experimental source change stacked on the material-only workflow, not a new released version. Wider scientific validation and separate composition gates remain on the product roadmap. This work makes no claim about composite full-run speed, Windows native acceptance or arbitrary UMATs.