ANYsolver 0.1.0__tar.gz → 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. anysolver-0.1.2/CHANGELOG.md +63 -0
  2. {anysolver-0.1.0 → anysolver-0.1.2}/MANIFEST.in +7 -7
  3. {anysolver-0.1.0 → anysolver-0.1.2}/PKG-INFO +57 -19
  4. {anysolver-0.1.0 → anysolver-0.1.2}/README.md +167 -129
  5. {anysolver-0.1.0 → anysolver-0.1.2}/docs/ARCHITECTURE.md +318 -238
  6. {anysolver-0.1.0 → anysolver-0.1.2}/docs/ARC_LENGTH.md +70 -18
  7. {anysolver-0.1.0 → anysolver-0.1.2}/docs/NONLINEAR_PERFORMANCE.md +36 -18
  8. anysolver-0.1.2/docs/QUALITY_CONTROL.md +248 -0
  9. {anysolver-0.1.0 → anysolver-0.1.2}/docs/THEORY.md +485 -282
  10. {anysolver-0.1.0 → anysolver-0.1.2}/pyproject.toml +2 -2
  11. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_beam_shell_verification.py +12 -1
  12. anysolver-0.1.2/scripts/run_external_references.py +63 -0
  13. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_fe_verification.py +238 -113
  14. {anysolver-0.1.0 → anysolver-0.1.2}/src/ANYsolver.egg-info/PKG-INFO +57 -19
  15. {anysolver-0.1.0 → anysolver-0.1.2}/src/ANYsolver.egg-info/SOURCES.txt +10 -2
  16. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/__init__.py +112 -67
  17. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/anystructure_fem_mode.py +32 -32
  18. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/arc_length.py +182 -19
  19. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/assembly.py +44 -44
  20. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/beam_shell_verification.py +3164 -2911
  21. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/boundary.py +156 -34
  22. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/buckling.py +149 -83
  23. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/corotational.py +476 -370
  24. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/elements.py +526 -110
  25. anysolver-0.1.2/src/anysolver/external_references.py +1370 -0
  26. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/fe_core.py +61 -36
  27. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/fracture.py +19 -2
  28. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/imperfections.py +42 -42
  29. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/linalg.py +71 -9
  30. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/mass_properties.py +16 -16
  31. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/material_curves.py +231 -231
  32. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/matrix_assembly.py +176 -47
  33. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/mesh_gen.py +166 -166
  34. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/mesh_load_bc_verification.py +608 -608
  35. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/nonlinear_performance.py +128 -58
  36. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/nonlinear_performance_batch_b.py +154 -22
  37. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/nonlinear_performance_batch_c.py +41 -7
  38. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/nonlinear_static.py +2363 -1413
  39. anysolver-0.1.2/src/anysolver/plasticity.py +1088 -0
  40. anysolver-0.1.2/src/anysolver/plasticity_qualification.py +758 -0
  41. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/production_readiness.py +308 -303
  42. anysolver-0.1.2/src/anysolver/recovery.py +2116 -0
  43. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/results.py +235 -181
  44. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/runtime.py +186 -295
  45. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/validation.py +332 -258
  46. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/vectorized_nonlinear.py +57 -57
  47. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_batch_b_activation.py +6 -6
  48. anysolver-0.1.2/tests/test_beam_shell_verification.py +286 -0
  49. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_corotational.py +392 -322
  50. anysolver-0.1.2/tests/test_external_references.py +318 -0
  51. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_buckling.py +116 -116
  52. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_element_qualification.py +37 -37
  53. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_infrastructure.py +138 -7
  54. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_mass_modal.py +162 -162
  55. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_nonlinear_dnv.py +335 -330
  56. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_plasticity_qualification.py +70 -70
  57. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_recovery_policy.py +26 -0
  58. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_reference_cases.py +49 -47
  59. anysolver-0.1.2/tests/test_fe_solver_triangular_shell_backend.py +356 -0
  60. anysolver-0.1.2/tests/test_follower_pressure.py +559 -0
  61. anysolver-0.1.2/tests/test_geometry_panel.py +114 -0
  62. anysolver-0.1.2/tests/test_initial_fields_and_staged_history.py +606 -0
  63. anysolver-0.1.2/tests/test_local_patch_transition.py +570 -0
  64. anysolver-0.1.2/tests/test_material_history_recovery.py +306 -0
  65. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_mesher_improvements.py +164 -164
  66. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_nodal_stress_recovery.py +106 -106
  67. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_nonlinear_performance.py +108 -108
  68. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_nonlinear_performance_batch_b.py +74 -6
  69. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_nonlinear_performance_batch_c.py +68 -5
  70. anysolver-0.1.2/tests/test_plane_stress_analytical_tangent.py +337 -0
  71. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_production_readiness.py +107 -103
  72. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_production_validation.py +127 -127
  73. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_quadratic_beam_nonlinear.py +147 -147
  74. anysolver-0.1.2/tests/test_recovery_qualification.py +463 -0
  75. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_runtime_api.py +43 -0
  76. anysolver-0.1.0/CHANGELOG.md +0 -22
  77. anysolver-0.1.0/docs/QUALITY_CONTROL.md +0 -128
  78. anysolver-0.1.0/scripts/run_external_references.py +0 -33
  79. anysolver-0.1.0/src/anysolver/external_references.py +0 -369
  80. anysolver-0.1.0/src/anysolver/plasticity.py +0 -419
  81. anysolver-0.1.0/src/anysolver/plasticity_qualification.py +0 -314
  82. anysolver-0.1.0/src/anysolver/recovery.py +0 -505
  83. anysolver-0.1.0/tests/reference_cases/README.md +0 -35
  84. anysolver-0.1.0/tests/test_beam_shell_verification.py +0 -135
  85. {anysolver-0.1.0 → anysolver-0.1.2}/LICENSE +0 -0
  86. {anysolver-0.1.0 → anysolver-0.1.2}/MIGRATION.md +0 -0
  87. {anysolver-0.1.0 → anysolver-0.1.2}/docs/reference_cases/README.md +0 -0
  88. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/benchmark_nonlinear_assembly.py +0 -0
  89. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/compare_fe_baselines.py +0 -0
  90. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/fetch_calculix_shell_reference.py +0 -0
  91. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/generate_fe_baselines.py +0 -0
  92. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_beam_validity.py +0 -0
  93. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_buckling_validity.py +0 -0
  94. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_capacity_workflow.py +0 -0
  95. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_cylinder_benchmark.py +0 -0
  96. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_element_qualification.py +0 -0
  97. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_fe_benchmarks.py +0 -0
  98. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_internal_shell_benchmark.py +0 -0
  99. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_mass_modal_validity.py +0 -0
  100. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_mesh_load_bc_verification.py +0 -0
  101. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_plasticity_qualification.py +0 -0
  102. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_recovery_policy.py +0 -0
  103. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/run_s4_validity.py +0 -0
  104. {anysolver-0.1.0 → anysolver-0.1.2}/scripts/write_production_readiness.py +0 -0
  105. {anysolver-0.1.0 → anysolver-0.1.2}/setup.cfg +0 -0
  106. {anysolver-0.1.0 → anysolver-0.1.2}/src/ANYsolver.egg-info/dependency_links.txt +0 -0
  107. {anysolver-0.1.0 → anysolver-0.1.2}/src/ANYsolver.egg-info/requires.txt +0 -0
  108. {anysolver-0.1.0 → anysolver-0.1.2}/src/ANYsolver.egg-info/top_level.txt +0 -0
  109. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/baselines.py +0 -0
  110. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/beam_validity.py +0 -0
  111. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/benchmarks.py +0 -0
  112. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/buckling_validity.py +0 -0
  113. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/capacity_workflow.py +0 -0
  114. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/cases.py +0 -0
  115. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/composite_strip_verification.py +0 -0
  116. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/contact.py +0 -0
  117. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/cylinder_benchmarks.py +0 -0
  118. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/dynamics.py +0 -0
  119. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/element_qualification.py +0 -0
  120. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/jit_compiler.py +0 -0
  121. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/kernel_warmup.py +0 -0
  122. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/modal.py +0 -0
  123. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/nonlinear.py +0 -0
  124. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/nonlinear_performance_bootstrap.py +0 -0
  125. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/nonlinear_reduced_assembly.py +0 -0
  126. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/quality_control.py +0 -0
  127. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/recovery_policy.py +0 -0
  128. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/reference_cases.py +0 -0
  129. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/s4_validity.py +0 -0
  130. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/__init__.py +0 -0
  131. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/__main__.py +0 -0
  132. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/diagnostics.py +0 -0
  133. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/document.py +0 -0
  134. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/exporter.py +0 -0
  135. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/importer.py +0 -0
  136. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/records.py +0 -0
  137. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/schema.py +0 -0
  138. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/sif_importer.py +0 -0
  139. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/sesam_fem/validation.py +0 -0
  140. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/shell_benchmarks.py +0 -0
  141. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/test_cases.py +0 -0
  142. {anysolver-0.1.0 → anysolver-0.1.2}/src/anysolver/vectorized_stiffness.py +0 -0
  143. {anysolver-0.1.0 → anysolver-0.1.2}/tests/conftest.py +0 -0
  144. {anysolver-0.1.0 → anysolver-0.1.2}/tests/fixtures/fe_baselines/baseline.json +0 -0
  145. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_arc_length.py +0 -0
  146. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_beam_axis_conventions.py +0 -0
  147. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_anystructure_fem_mode.py +0 -0
  148. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_architecture.py +0 -0
  149. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_capacity_workflow.py +0 -0
  150. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_contact.py +0 -0
  151. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_corotational_beam.py +0 -0
  152. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_cylinder_benchmarks.py +0 -0
  153. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_dynamics.py +0 -0
  154. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_element_quality.py +0 -0
  155. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_fracture.py +0 -0
  156. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_nonlinear_limit_point.py +0 -0
  157. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_nonlinear_static.py +0 -0
  158. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_s4_validity.py +0 -0
  159. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_shell_verification.py +0 -0
  160. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_theory.py +0 -0
  161. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_fe_solver_triangular_shell.py +0 -0
  162. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_hht_alpha.py +0 -0
  163. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_mesh_load_bc_verification.py +0 -0
  164. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_nonlinear_impact_plasticity.py +0 -0
  165. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_performance_improvements.py +0 -0
  166. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_phase2.py +0 -0
  167. {anysolver-0.1.0 → anysolver-0.1.2}/tests/test_sesam_fem.py +0 -0
@@ -0,0 +1,63 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.1.2 - 2026-07-28
6
+
7
+ - Add opt-in executable CalculiX reference validation with isolated case runs,
8
+ stale-output protection, timeouts, solver version/hash provenance, ASCII
9
+ FRD/DAT parsing, tolerance-controlled comparisons, and preserved evidence
10
+ semantics. Deck-only generation remains explicitly `not_executed`; stale
11
+ non-executed legacy reports are regenerated deterministically, while invalid
12
+ executed evidence is preserved and rejected for diagnosis.
13
+ - Add current-area follower pressure and its exact, generally nonsymmetric
14
+ external-load tangent to nonlinear static and arc-length solves. Extend
15
+ shell initial-stress stiffness to the Mindlin translation/director field
16
+ using membrane, bending, and second stress moments, and add the qualified
17
+ thin-ring pressure-buckling gate.
18
+ - Add an opt-in consistent corotational tangent through the full
19
+ pull-back/frame/rotate-forward chain rule. `auto` retains the lower-cost
20
+ rotated tangent for ordinary loads and selects the consistent tangent for
21
+ follower pressure.
22
+ - Unify nonlinear stress recovery around committed shell-layer and beam-fiber
23
+ histories, matching solution displacements, objective corotational frames,
24
+ component-level provenance, and explicit elastic fallbacks. Add guarded
25
+ full-integration Q4/Q8 patch recovery that separates discontinuities and
26
+ labels its optional surface-stress L2 indicator as non-energy-norm.
27
+ - Add shell membrane/bending stress and prestrain fields plus beam-fiber
28
+ initial fields, with zero-load equilibration, immutable field provenance,
29
+ exact load-stage boundary commits, and persistent plastic history through
30
+ multi-stage displacement control.
31
+ - Replace the default finite-difference plane-stress algorithmic tangent with
32
+ the analytical consistent derivative of the discrete return map. Retain the
33
+ representable-step numerical tangent as a qualification oracle and guarded
34
+ invalid-row fallback, add a safeguarded local consistency solve with
35
+ fail-closed residual checks, and add constitutive and full-Newton
36
+ parity/performance evidence.
37
+
38
+ ## 0.1.1 - 2026-07-25
39
+
40
+ - Correct the layered-shell membrane/bending coupling tangent and keep the
41
+ accelerated plastic shell path consistent with the scalar return mapping.
42
+ - Fail closed for curved B3 members, experimental Q8R qualification, unsupported
43
+ DNV-RP-C208 thickness rows, and path-dependent staged displacement control.
44
+ - Include point masses in reported mass properties, make buckling constraints
45
+ call-order independent, and correct CalculiX gravity export.
46
+ - Remove quadratic model-construction and beam/shell coupling lookup scaling,
47
+ safely reset precomputed incoming elements, cache recovery operators and
48
+ topology signatures, defer optional acceleration imports, and use lower
49
+ PyPardiso thresholds only for compatible retained patterns.
50
+ - Preserve straight-sided B3 midpoint geometry through adaptive cylinder
51
+ refinement and reconstruct complete elastic layer states after accelerated
52
+ nonlinear solves.
53
+ - Add explicit runtime exports, generic generated-geometry API aliases, and
54
+ package-root arc-length exports.
55
+ - Adopt the pure-solver test files from ANYstructure (triangular shell
56
+ backend, local patch transition, geometry panel).
57
+
58
+ ## 0.1.0 - 2026-07-22
59
+
60
+ - Transfer the qualified beam/shell solver from ANYintelligent into its own package.
61
+ - Add the headless runtime meshing and analysis facade formerly embedded in ANYstructure.
62
+ - Publish the Python import namespace as `anysolver` without a legacy `fe_solver` shim.
63
+ - Preserve SESAM interchange, verification, qualification, benchmark, and baseline workflows.
@@ -1,7 +1,7 @@
1
- include LICENSE
2
- include README.md
3
- include CHANGELOG.md
4
- include MIGRATION.md
5
- recursive-include docs *.md
6
- recursive-include scripts *.py
7
- recursive-include tests *.py *.json *.md
1
+ include LICENSE
2
+ include README.md
3
+ include CHANGELOG.md
4
+ include MIGRATION.md
5
+ recursive-include docs *.md
6
+ recursive-include scripts *.py
7
+ recursive-include tests *.py *.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ANYsolver
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Qualified beam and shell finite-element solver
5
5
  Author-email: Audun Arnesen Nyhus <audunarn@gmail.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -82,21 +82,23 @@ changes before making release claims.
82
82
  | Area | Implemented functionality |
83
83
  | --- | --- |
84
84
  | Model | Six DOFs per node; SI units; materials, density, nodal mass, shell/beam topology, supports, and MPC constraints. |
85
- | Shells | 3- and 6-node triangles; 4-node MITC-style and 8-node Mindlin-Reissner quadrilaterals; stiffness, mass, pressure, geometric stiffness, and stress recovery. Q8R reduced integration is experimental and outside the qualified thin-bending/nonlinear-batch scope. |
85
+ | Shells | 3- and 6-node triangles; 4-node MITC-style and 8-node Mindlin-Reissner quadrilaterals; stiffness, mass, pressure, and stress recovery. The shell initial-stress operator includes membrane, bending, and second stress moments acting through the implemented Mindlin translation/director field. Q8R reduced integration is experimental and outside the qualified thin-bending/nonlinear-batch scope. |
86
86
  | Beams | 2-node and straight-sided 3-node Timoshenko beams with axial, biaxial bending, shear, torsion, consistent/lumped mass options, geometric stiffness, and optional fiber-section plasticity. |
87
87
  | Coupling | Coincident or eccentric beam-shell kinematics through explicit interpolated MPC transformations. |
88
- | Loads | Nodal force/moment, shell pressure, in-plane edge loads, acceleration/gravity, prescribed displacement, load combinations, proportional and staged nonlinear loads. |
88
+ | Loads | Nodal force/moment, dead or current-area follower shell pressure, in-plane edge loads, acceleration/gravity, prescribed displacement, load combinations, proportional and staged nonlinear loads. Follower pressure includes its exact, generally nonsymmetric external-load tangent. |
89
89
  | Linear analysis | Static single- and multiple-RHS solves, reactions and MPC-force diagnostics, free-free rigid-body nullspace handling, and sparse factorization reuse. |
90
90
  | Modal and mass | Consistent mass assembly, point masses, model mass/inertia properties, constrained and free-free vibration modes. |
91
- | Buckling | Linear eigenvalue buckling for beam axial force and shell membrane-resultant prestress, including sparse shift-invert and repeated-mode diagnostics. |
92
- | Nonlinear static | Incremental Newton solution, adaptive stepping, force or displacement control, von Karman or opt-in corotational kinematics, layered shell J2 plasticity, beam fiber plasticity, staged loads, and simplified element erosion. |
93
- | Continuation | Bounded Crisfield-style spherical arc-length tracing through a first limit point and a guarded descending branch. |
91
+ | Buckling | Linear eigenvalue buckling for beam axial force and shell Mindlin initial-stress resultants, including sparse shift-invert and repeated-mode diagnostics. A follower-load stiffness can be included when its constrained tangent is symmetric; a general nonsymmetric follower eigenproblem is outside scope. |
92
+ | Nonlinear static | Incremental Newton solution, adaptive stepping, force or displacement control, dead or follower pressure, von Karman or opt-in corotational kinematics, rotated or consistent corotational tangent, layered shell J2 plasticity with a safeguarded local solve and analytical consistent tangent, beam fiber plasticity, stage-boundary commits, true preload/restart displacement control, and simplified element erosion. |
93
+ | Continuation | Bounded Crisfield-style spherical arc-length tracing through a first limit point and a guarded descending branch, including current-area follower pressure and its load tangent. |
94
94
  | Dynamics | Newmark or HHT-alpha implicit transient response, Rayleigh damping, prescribed shell pressure patches, selected/envelope history storage, and memory preflight. |
95
95
  | Impact/contact | One rigid sphere with frictionless penalty contact against shells and opt-in beam-axis segments; event substepping, Aitken relaxation, nonlinear material response, and engineering damage/erosion options. |
96
96
  | Imperfections | Stress-free eigenmode, member-bow, plate-wave, flange-twist, explicit, and composite imperfection fields. |
97
+ | Initial fields | Element-local shell membrane/bending stress or membrane/curvature prestrain, arbitrary configured beam-fiber stress/prestrain distributions, zero-external-load equilibration, admissibility checks, and provenance kept separate from geometric imperfections. |
97
98
  | Workflows | Normalized generated geometry to static/prestress/buckling; traceable static-to-buckling-to-imperfect nonlinear-capacity workflow. |
98
99
  | Interchange | Pure-Python SESAM formatted FEM record/document parsing, guarded round-trip writing, supported semantic import to `FEModel`, coordinate transforms, beam orientation, and SIF shell-stress reading by load case. |
99
- | Results | Result provenance, element and nodal stress recovery, selected recovery, reaction filtering, validation diagnostics, deterministic baselines, benchmarks, and generated qualification reports. |
100
+ | Results | Result provenance; unified elastic or committed shell-layer/beam-fiber stress recovery; guarded Zienkiewicz-Zhu-style patch recovery for qualified shell neighborhoods; selected recovery; reaction filtering; validation diagnostics; deterministic baselines; benchmarks; and generated qualification reports. |
101
+ | External verification | Reproducible CalculiX input generation plus opt-in isolated execution, FRD/DAT parsing, solver provenance, and tolerance-controlled analytical comparison. Deck-only reports remain explicitly `not_executed` and make no numerical-agreement claim. |
100
102
 
101
103
  Implemented does not automatically mean qualified for every geometry or load
102
104
  regime. The live capability matrix is produced by
@@ -116,21 +118,46 @@ Important limits:
116
118
  - the 3-node quadratic beam is straight-sided; curved members must be
117
119
  represented by straight beam segments until a true curved formulation is
118
120
  implemented;
119
- - shell buckling uses the implemented membrane-resultant geometric stiffness,
120
- not a complete finite-rotation shell geometric stiffness;
121
- - no follower-pressure load or tangent;
121
+ - the shell initial-stress operator covers the in-plane `N`, `M`, and `H`
122
+ stress moments acting on Mindlin midsurface translations and director
123
+ gradients; it does not add drilling, transverse-normal-stress, or a
124
+ geometrically exact finite-rotation shell/director formulation;
125
+ - current-area follower pressure is supported in nonlinear static and
126
+ arc-length analyses, with its exact load tangent. Linear/dead pressure
127
+ remains the default. Linear buckling rejects a constrained nonsymmetric
128
+ follower-pressure pencil because general complex nonconservative
129
+ eigenanalysis is not implemented;
122
130
  - no general shell-shell, body-body, frictional, rolling, or self-contact;
123
131
  - no fluid-structure interaction, cavitation, or water-entry model;
124
132
  - no cohesive cracks, remeshing, material separation, or fracture-mechanics
125
133
  claim—the erosion models are engineering screens;
126
134
  - no unrestricted deep post-buckling or automatic bifurcation branch switching;
127
- - no consistent frame-derivative tangent for the corotational formulation;
128
- - no general material-aware stress reconstruction when committed nonlinear
129
- layer/fiber state is unavailable;
130
- - no true multi-stage plastic preload followed by displacement control;
131
- - no unverified material laws, residual-stress fields, or distortion ranges;
132
- - SESAM `FEModel` export and external-solver execution/comparison remain outside
133
- the supported interchange gate.
135
+ - the consistent corotational tangent includes frame derivatives and is
136
+ selected automatically for follower pressure, but its numerical
137
+ frame-sensitivity evaluation is costlier than the rotated tangent used by
138
+ default for ordinary corotational solves;
139
+ - material-history-aware recovery requires retained, matching committed
140
+ nonlinear layer/fiber states; missing or invalid state is reported and the
141
+ affected components fall back explicitly to elastic reconstruction;
142
+ - the guarded patch-recovery fit is qualified only for locally planar,
143
+ consistently oriented, homogeneous, full-integration Q4 or Q8 shell
144
+ neighborhoods. Discontinuities remain separate, and the optional normalized
145
+ stress-L2 discrepancy is a diagnostic—not an energy-norm error estimate;
146
+ - initial stress/prestrain fields are qualified only in element-local reference
147
+ coordinates with `kinematics="von_karman"`. Shell fields use the documented
148
+ membrane/positive-face-bending convention, and beam fields require a
149
+ configured fiber section. Input stress must be admissible for the supplied
150
+ hardening state; equilibration may redistribute it and does not reconstruct
151
+ the manufacturing history. A field-bearing restart also requires its
152
+ matching converged displacement vector;
153
+ - the analytical plane-stress tangent is branch-consistent. The numerical
154
+ derivative remains an oracle and automatic invalid-row fallback; local
155
+ yield-residual nonconvergence fails closed;
156
+ - no unverified material laws or distortion ranges;
157
+ - SESAM `FEModel` export remains outside the supported interchange gate;
158
+ - CalculiX comparison requires a compatible local executable and an explicit
159
+ execution request. Deck generation alone is a reproducibility handoff, not
160
+ external numerical evidence.
134
161
 
135
162
  Use `validate_production_model()`, the analysis-specific preflight checks, and
136
163
  the generated production-scope artifacts before production use.
@@ -161,5 +188,16 @@ python scripts/run_fe_verification.py
161
188
  ```
162
189
 
163
190
  The last command regenerates the canonical JSON and Markdown evidence under
164
- `reports/verification/`. External-reference decks are handoff artifacts unless
165
- matching external-solver results have actually been executed and compared.
191
+ `reports/verification/`. Its default external-reference mode generates
192
+ handoff decks with status `not_executed`; that status is not a pass or a claim
193
+ of numerical agreement. To execute the comparisons, provide a compatible
194
+ CalculiX executable on `PATH`, through `ANYSOLVER_CALCULIX_EXECUTABLE`, or with
195
+ `--calculix`, and run:
196
+
197
+ ```powershell
198
+ python scripts/run_fe_verification.py --execute-calculix
199
+ ```
200
+
201
+ An external case becomes passing evidence only after isolated execution,
202
+ successful FRD/DAT parsing, and every declared comparison meeting its
203
+ tolerance.
@@ -1,130 +1,168 @@
1
- # ANYsolver finite-element solver
2
-
3
- `anysolver` is a headless structural FE solver for beam,
4
- shell, stiffened-panel, and cylindrical-shell analysis. It is an engineering
5
- solver with an explicit qualification scope, not a general-purpose CAD,
6
- contact, or fracture platform.
7
-
8
- Install the released package with:
9
-
10
- ```powershell
11
- python -m pip install ANYsolver
12
- ```
13
-
14
- For coordinated local development with ANYstructure:
15
-
16
- ```powershell
17
- python -m pip install -e C:\Github\ANYsolver
18
- ```
19
-
20
- Core analyses and the solver-owned generated-geometry workflow are available
21
- directly from `anysolver`; the lightweight normalized flat-panel and cylinder
22
- facade is exposed through `anysolver.runtime`:
23
-
24
- ```python
25
- from anysolver import (
26
- FEModel,
27
- GeneratedGeometryFEMConfig,
28
- LoadCase,
29
- run_generated_geometry_fem,
30
- solve_linear,
31
- )
32
- from anysolver.runtime import LightweightFEMConfig, run_production_fem
33
- ```
34
-
35
- The generic `GeneratedGeometryFEM*` names are the preferred workflow API.
36
- Historical `AnyStructureFEM*` aliases remain available only for downstream
37
- compatibility. Material selection is centralized in
38
- `dnv_c208_steel_properties()` and `dnv_c208_steel_curve()`; the runtime facade
39
- uses the same canonical table and validation.
40
-
41
- The source code and tests are authoritative. Generated reports under
42
- `reports/` are dated evidence snapshots and must be regenerated after solver
43
- changes before making release claims.
44
-
45
- ## Functional overview
46
-
47
- | Area | Implemented functionality |
48
- | --- | --- |
49
- | Model | Six DOFs per node; SI units; materials, density, nodal mass, shell/beam topology, supports, and MPC constraints. |
50
- | Shells | 3- and 6-node triangles; 4-node MITC-style and 8-node Mindlin-Reissner quadrilaterals; stiffness, mass, pressure, geometric stiffness, and stress recovery. Q8R reduced integration is experimental and outside the qualified thin-bending/nonlinear-batch scope. |
51
- | Beams | 2-node and straight-sided 3-node Timoshenko beams with axial, biaxial bending, shear, torsion, consistent/lumped mass options, geometric stiffness, and optional fiber-section plasticity. |
52
- | Coupling | Coincident or eccentric beam-shell kinematics through explicit interpolated MPC transformations. |
53
- | Loads | Nodal force/moment, shell pressure, in-plane edge loads, acceleration/gravity, prescribed displacement, load combinations, proportional and staged nonlinear loads. |
54
- | Linear analysis | Static single- and multiple-RHS solves, reactions and MPC-force diagnostics, free-free rigid-body nullspace handling, and sparse factorization reuse. |
55
- | Modal and mass | Consistent mass assembly, point masses, model mass/inertia properties, constrained and free-free vibration modes. |
56
- | Buckling | Linear eigenvalue buckling for beam axial force and shell membrane-resultant prestress, including sparse shift-invert and repeated-mode diagnostics. |
57
- | Nonlinear static | Incremental Newton solution, adaptive stepping, force or displacement control, von Karman or opt-in corotational kinematics, layered shell J2 plasticity, beam fiber plasticity, staged loads, and simplified element erosion. |
58
- | Continuation | Bounded Crisfield-style spherical arc-length tracing through a first limit point and a guarded descending branch. |
59
- | Dynamics | Newmark or HHT-alpha implicit transient response, Rayleigh damping, prescribed shell pressure patches, selected/envelope history storage, and memory preflight. |
60
- | Impact/contact | One rigid sphere with frictionless penalty contact against shells and opt-in beam-axis segments; event substepping, Aitken relaxation, nonlinear material response, and engineering damage/erosion options. |
1
+ # ANYsolver finite-element solver
2
+
3
+ `anysolver` is a headless structural FE solver for beam,
4
+ shell, stiffened-panel, and cylindrical-shell analysis. It is an engineering
5
+ solver with an explicit qualification scope, not a general-purpose CAD,
6
+ contact, or fracture platform.
7
+
8
+ Install the released package with:
9
+
10
+ ```powershell
11
+ python -m pip install ANYsolver
12
+ ```
13
+
14
+ For coordinated local development with ANYstructure:
15
+
16
+ ```powershell
17
+ python -m pip install -e C:\Github\ANYsolver
18
+ ```
19
+
20
+ Core analyses and the solver-owned generated-geometry workflow are available
21
+ directly from `anysolver`; the lightweight normalized flat-panel and cylinder
22
+ facade is exposed through `anysolver.runtime`:
23
+
24
+ ```python
25
+ from anysolver import (
26
+ FEModel,
27
+ GeneratedGeometryFEMConfig,
28
+ LoadCase,
29
+ run_generated_geometry_fem,
30
+ solve_linear,
31
+ )
32
+ from anysolver.runtime import LightweightFEMConfig, run_production_fem
33
+ ```
34
+
35
+ The generic `GeneratedGeometryFEM*` names are the preferred workflow API.
36
+ Historical `AnyStructureFEM*` aliases remain available only for downstream
37
+ compatibility. Material selection is centralized in
38
+ `dnv_c208_steel_properties()` and `dnv_c208_steel_curve()`; the runtime facade
39
+ uses the same canonical table and validation.
40
+
41
+ The source code and tests are authoritative. Generated reports under
42
+ `reports/` are dated evidence snapshots and must be regenerated after solver
43
+ changes before making release claims.
44
+
45
+ ## Functional overview
46
+
47
+ | Area | Implemented functionality |
48
+ | --- | --- |
49
+ | Model | Six DOFs per node; SI units; materials, density, nodal mass, shell/beam topology, supports, and MPC constraints. |
50
+ | Shells | 3- and 6-node triangles; 4-node MITC-style and 8-node Mindlin-Reissner quadrilaterals; stiffness, mass, pressure, and stress recovery. The shell initial-stress operator includes membrane, bending, and second stress moments acting through the implemented Mindlin translation/director field. Q8R reduced integration is experimental and outside the qualified thin-bending/nonlinear-batch scope. |
51
+ | Beams | 2-node and straight-sided 3-node Timoshenko beams with axial, biaxial bending, shear, torsion, consistent/lumped mass options, geometric stiffness, and optional fiber-section plasticity. |
52
+ | Coupling | Coincident or eccentric beam-shell kinematics through explicit interpolated MPC transformations. |
53
+ | Loads | Nodal force/moment, dead or current-area follower shell pressure, in-plane edge loads, acceleration/gravity, prescribed displacement, load combinations, proportional and staged nonlinear loads. Follower pressure includes its exact, generally nonsymmetric external-load tangent. |
54
+ | Linear analysis | Static single- and multiple-RHS solves, reactions and MPC-force diagnostics, free-free rigid-body nullspace handling, and sparse factorization reuse. |
55
+ | Modal and mass | Consistent mass assembly, point masses, model mass/inertia properties, constrained and free-free vibration modes. |
56
+ | Buckling | Linear eigenvalue buckling for beam axial force and shell Mindlin initial-stress resultants, including sparse shift-invert and repeated-mode diagnostics. A follower-load stiffness can be included when its constrained tangent is symmetric; a general nonsymmetric follower eigenproblem is outside scope. |
57
+ | Nonlinear static | Incremental Newton solution, adaptive stepping, force or displacement control, dead or follower pressure, von Karman or opt-in corotational kinematics, rotated or consistent corotational tangent, layered shell J2 plasticity with a safeguarded local solve and analytical consistent tangent, beam fiber plasticity, stage-boundary commits, true preload/restart displacement control, and simplified element erosion. |
58
+ | Continuation | Bounded Crisfield-style spherical arc-length tracing through a first limit point and a guarded descending branch, including current-area follower pressure and its load tangent. |
59
+ | Dynamics | Newmark or HHT-alpha implicit transient response, Rayleigh damping, prescribed shell pressure patches, selected/envelope history storage, and memory preflight. |
60
+ | Impact/contact | One rigid sphere with frictionless penalty contact against shells and opt-in beam-axis segments; event substepping, Aitken relaxation, nonlinear material response, and engineering damage/erosion options. |
61
61
  | Imperfections | Stress-free eigenmode, member-bow, plate-wave, flange-twist, explicit, and composite imperfection fields. |
62
- | Workflows | Normalized generated geometry to static/prestress/buckling; traceable static-to-buckling-to-imperfect nonlinear-capacity workflow. |
63
- | Interchange | Pure-Python SESAM formatted FEM record/document parsing, guarded round-trip writing, supported semantic import to `FEModel`, coordinate transforms, beam orientation, and SIF shell-stress reading by load case. |
64
- | Results | Result provenance, element and nodal stress recovery, selected recovery, reaction filtering, validation diagnostics, deterministic baselines, benchmarks, and generated qualification reports. |
65
-
66
- Implemented does not automatically mean qualified for every geometry or load
67
- regime. The live capability matrix is produced by
68
- `write_production_readiness_artifacts()` and the verification manifest.
69
-
70
- ## Production scope
71
-
72
- The qualified target is thin flat or cylindrical shell structure, with beam
73
- stiffeners/girders represented through the documented coupling, inside the
74
- verified mesh, material, distortion, eccentricity, and load ranges.
75
-
76
- Important limits:
77
-
78
- - no arbitrary CAD topology or automatic general-purpose meshing;
79
- - Q8R is experimental: its hourglass stabilization is not qualified for thin
80
- bending and it is deliberately excluded from nonlinear batch acceleration;
81
- - the 3-node quadratic beam is straight-sided; curved members must be
82
- represented by straight beam segments until a true curved formulation is
83
- implemented;
84
- - shell buckling uses the implemented membrane-resultant geometric stiffness,
85
- not a complete finite-rotation shell geometric stiffness;
86
- - no follower-pressure load or tangent;
87
- - no general shell-shell, body-body, frictional, rolling, or self-contact;
88
- - no fluid-structure interaction, cavitation, or water-entry model;
89
- - no cohesive cracks, remeshing, material separation, or fracture-mechanics
90
- claim—the erosion models are engineering screens;
91
- - no unrestricted deep post-buckling or automatic bifurcation branch switching;
92
- - no consistent frame-derivative tangent for the corotational formulation;
93
- - no general material-aware stress reconstruction when committed nonlinear
94
- layer/fiber state is unavailable;
95
- - no true multi-stage plastic preload followed by displacement control;
96
- - no unverified material laws, residual-stress fields, or distortion ranges;
97
- - SESAM `FEModel` export and external-solver execution/comparison remain outside
98
- the supported interchange gate.
99
-
100
- Use `validate_production_model()`, the analysis-specific preflight checks, and
101
- the generated production-scope artifacts before production use.
102
-
103
- ## Documentation map
104
-
105
- - [`ARCHITECTURE.md`](docs/ARCHITECTURE.md): package boundaries, analysis flow, and
106
- invariants.
107
- - [`THEORY.md`](docs/THEORY.md): implemented formulations and validity limits.
108
- - [`ARC_LENGTH.md`](docs/ARC_LENGTH.md): continuation controls and use.
109
- - [`NONLINEAR_PERFORMANCE.md`](docs/NONLINEAR_PERFORMANCE.md): nonlinear assembly,
110
- sparse backend, threading, and diagnostics.
111
- - [`QUALITY_CONTROL.md`](docs/QUALITY_CONTROL.md): verification commands, evidence
112
- hierarchy, and current checked status.
113
- - [`reference_cases/README.md`](docs/reference_cases/README.md):
114
- local CalculiX/PrePoMax reference-case layout.
115
- - [`MIGRATION.md`](MIGRATION.md): source provenance, inclusion boundary, and
116
- import changes.
117
-
118
- ## Basic verification
119
-
120
- From the repository root:
121
-
122
- ```powershell
123
- python -m pytest tests -q -p no:cacheprovider
124
- python run_qc.py --no-save
125
- python scripts/run_fe_verification.py
126
- ```
127
-
128
- The last command regenerates the canonical JSON and Markdown evidence under
129
- `reports/verification/`. External-reference decks are handoff artifacts unless
130
- matching external-solver results have actually been executed and compared.
62
+ | Initial fields | Element-local shell membrane/bending stress or membrane/curvature prestrain, arbitrary configured beam-fiber stress/prestrain distributions, zero-external-load equilibration, admissibility checks, and provenance kept separate from geometric imperfections. |
63
+ | Workflows | Normalized generated geometry to static/prestress/buckling; traceable static-to-buckling-to-imperfect nonlinear-capacity workflow. |
64
+ | Interchange | Pure-Python SESAM formatted FEM record/document parsing, guarded round-trip writing, supported semantic import to `FEModel`, coordinate transforms, beam orientation, and SIF shell-stress reading by load case. |
65
+ | Results | Result provenance; unified elastic or committed shell-layer/beam-fiber stress recovery; guarded Zienkiewicz-Zhu-style patch recovery for qualified shell neighborhoods; selected recovery; reaction filtering; validation diagnostics; deterministic baselines; benchmarks; and generated qualification reports. |
66
+ | External verification | Reproducible CalculiX input generation plus opt-in isolated execution, FRD/DAT parsing, solver provenance, and tolerance-controlled analytical comparison. Deck-only reports remain explicitly `not_executed` and make no numerical-agreement claim. |
67
+
68
+ Implemented does not automatically mean qualified for every geometry or load
69
+ regime. The live capability matrix is produced by
70
+ `write_production_readiness_artifacts()` and the verification manifest.
71
+
72
+ ## Production scope
73
+
74
+ The qualified target is thin flat or cylindrical shell structure, with beam
75
+ stiffeners/girders represented through the documented coupling, inside the
76
+ verified mesh, material, distortion, eccentricity, and load ranges.
77
+
78
+ Important limits:
79
+
80
+ - no arbitrary CAD topology or automatic general-purpose meshing;
81
+ - Q8R is experimental: its hourglass stabilization is not qualified for thin
82
+ bending and it is deliberately excluded from nonlinear batch acceleration;
83
+ - the 3-node quadratic beam is straight-sided; curved members must be
84
+ represented by straight beam segments until a true curved formulation is
85
+ implemented;
86
+ - the shell initial-stress operator covers the in-plane `N`, `M`, and `H`
87
+ stress moments acting on Mindlin midsurface translations and director
88
+ gradients; it does not add drilling, transverse-normal-stress, or a
89
+ geometrically exact finite-rotation shell/director formulation;
90
+ - current-area follower pressure is supported in nonlinear static and
91
+ arc-length analyses, with its exact load tangent. Linear/dead pressure
92
+ remains the default. Linear buckling rejects a constrained nonsymmetric
93
+ follower-pressure pencil because general complex nonconservative
94
+ eigenanalysis is not implemented;
95
+ - no general shell-shell, body-body, frictional, rolling, or self-contact;
96
+ - no fluid-structure interaction, cavitation, or water-entry model;
97
+ - no cohesive cracks, remeshing, material separation, or fracture-mechanics
98
+ claim—the erosion models are engineering screens;
99
+ - no unrestricted deep post-buckling or automatic bifurcation branch switching;
100
+ - the consistent corotational tangent includes frame derivatives and is
101
+ selected automatically for follower pressure, but its numerical
102
+ frame-sensitivity evaluation is costlier than the rotated tangent used by
103
+ default for ordinary corotational solves;
104
+ - material-history-aware recovery requires retained, matching committed
105
+ nonlinear layer/fiber states; missing or invalid state is reported and the
106
+ affected components fall back explicitly to elastic reconstruction;
107
+ - the guarded patch-recovery fit is qualified only for locally planar,
108
+ consistently oriented, homogeneous, full-integration Q4 or Q8 shell
109
+ neighborhoods. Discontinuities remain separate, and the optional normalized
110
+ stress-L2 discrepancy is a diagnostic—not an energy-norm error estimate;
111
+ - initial stress/prestrain fields are qualified only in element-local reference
112
+ coordinates with `kinematics="von_karman"`. Shell fields use the documented
113
+ membrane/positive-face-bending convention, and beam fields require a
114
+ configured fiber section. Input stress must be admissible for the supplied
115
+ hardening state; equilibration may redistribute it and does not reconstruct
116
+ the manufacturing history. A field-bearing restart also requires its
117
+ matching converged displacement vector;
118
+ - the analytical plane-stress tangent is branch-consistent. The numerical
119
+ derivative remains an oracle and automatic invalid-row fallback; local
120
+ yield-residual nonconvergence fails closed;
121
+ - no unverified material laws or distortion ranges;
122
+ - SESAM `FEModel` export remains outside the supported interchange gate;
123
+ - CalculiX comparison requires a compatible local executable and an explicit
124
+ execution request. Deck generation alone is a reproducibility handoff, not
125
+ external numerical evidence.
126
+
127
+ Use `validate_production_model()`, the analysis-specific preflight checks, and
128
+ the generated production-scope artifacts before production use.
129
+
130
+ ## Documentation map
131
+
132
+ - [`ARCHITECTURE.md`](docs/ARCHITECTURE.md): package boundaries, analysis flow, and
133
+ invariants.
134
+ - [`THEORY.md`](docs/THEORY.md): implemented formulations and validity limits.
135
+ - [`ARC_LENGTH.md`](docs/ARC_LENGTH.md): continuation controls and use.
136
+ - [`NONLINEAR_PERFORMANCE.md`](docs/NONLINEAR_PERFORMANCE.md): nonlinear assembly,
137
+ sparse backend, threading, and diagnostics.
138
+ - [`QUALITY_CONTROL.md`](docs/QUALITY_CONTROL.md): verification commands, evidence
139
+ hierarchy, and current checked status.
140
+ - [`reference_cases/README.md`](docs/reference_cases/README.md):
141
+ local CalculiX/PrePoMax reference-case layout.
142
+ - [`MIGRATION.md`](MIGRATION.md): source provenance, inclusion boundary, and
143
+ import changes.
144
+
145
+ ## Basic verification
146
+
147
+ From the repository root:
148
+
149
+ ```powershell
150
+ python -m pytest tests -q -p no:cacheprovider
151
+ python run_qc.py --no-save
152
+ python scripts/run_fe_verification.py
153
+ ```
154
+
155
+ The last command regenerates the canonical JSON and Markdown evidence under
156
+ `reports/verification/`. Its default external-reference mode generates
157
+ handoff decks with status `not_executed`; that status is not a pass or a claim
158
+ of numerical agreement. To execute the comparisons, provide a compatible
159
+ CalculiX executable on `PATH`, through `ANYSOLVER_CALCULIX_EXECUTABLE`, or with
160
+ `--calculix`, and run:
161
+
162
+ ```powershell
163
+ python scripts/run_fe_verification.py --execute-calculix
164
+ ```
165
+
166
+ An external case becomes passing evidence only after isolated execution,
167
+ successful FRD/DAT parsing, and every declared comparison meeting its
168
+ tolerance.