ANYfeSolver 0.5.0a1__py3-none-any.whl

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 (751) hide show
  1. anyfesolver/__init__.py +1075 -0
  2. anyfesolver/_b2_attachment_elimination_dev.py +261 -0
  3. anyfesolver/_b2_f10_f11_point_attachment.py +163 -0
  4. anyfesolver/_b2_loaded_point_trace_dev.py +173 -0
  5. anyfesolver/_b2_physical_flexibility_linear.py +707 -0
  6. anyfesolver/_b2_physical_linear_batch_dev.py +491 -0
  7. anyfesolver/_b2_physical_linear_definition.py +415 -0
  8. anyfesolver/_b2_physical_load_bubbles.py +282 -0
  9. anyfesolver/_compensated_contractions.py +497 -0
  10. anyfesolver/_compensated_native.py +437 -0
  11. anyfesolver/_corotational_batch.py +219 -0
  12. anyfesolver/_director_trace.py +214 -0
  13. anyfesolver/_dyadic_bilinear.py +76 -0
  14. anyfesolver/_dyadic_factor_chain.py +25 -0
  15. anyfesolver/_ge_beam3_adaptive_arc_program.py +286 -0
  16. anyfesolver/_ge_beam3_analysis_combined.py +102 -0
  17. anyfesolver/_ge_beam3_analysis_fibre_translation.py +130 -0
  18. anyfesolver/_ge_beam3_analysis_modal_snapshot.py +27 -0
  19. anyfesolver/_ge_beam3_analysis_nodal_program.py +140 -0
  20. anyfesolver/_ge_beam3_analysis_translation.py +147 -0
  21. anyfesolver/_ge_beam3_analysis_translation_modal.py +84 -0
  22. anyfesolver/_ge_beam3_arc_geometry.py +89 -0
  23. anyfesolver/_ge_beam3_arc_program.py +304 -0
  24. anyfesolver/_ge_beam3_authoritative_cell_seed.py +25 -0
  25. anyfesolver/_ge_beam3_cell_identity.py +52 -0
  26. anyfesolver/_ge_beam3_centered_batched_finite_inertia.py +132 -0
  27. anyfesolver/_ge_beam3_centered_finite_inertia.py +171 -0
  28. anyfesolver/_ge_beam3_centered_mixed.py +104 -0
  29. anyfesolver/_ge_beam3_centered_reference.py +187 -0
  30. anyfesolver/_ge_beam3_centered_so3_strain.py +76 -0
  31. anyfesolver/_ge_beam3_complementary_section.py +122 -0
  32. anyfesolver/_ge_beam3_compliance_snapshot_guard.py +20 -0
  33. anyfesolver/_ge_beam3_connected_dynamic.py +486 -0
  34. anyfesolver/_ge_beam3_connected_trajectory.py +258 -0
  35. anyfesolver/_ge_beam3_conservative_backtrack.py +26 -0
  36. anyfesolver/_ge_beam3_controlled_fibre_modes.py +105 -0
  37. anyfesolver/_ge_beam3_coupled_beam_subdomain.py +128 -0
  38. anyfesolver/_ge_beam3_coupled_modes.py +256 -0
  39. anyfesolver/_ge_beam3_deterministic_reduction.py +264 -0
  40. anyfesolver/_ge_beam3_displacement_program.py +255 -0
  41. anyfesolver/_ge_beam3_durable_coupled.py +251 -0
  42. anyfesolver/_ge_beam3_dynamic_elastic_state.py +461 -0
  43. anyfesolver/_ge_beam3_effective_deadline.py +58 -0
  44. anyfesolver/_ge_beam3_elastic_seed_continuation.py +223 -0
  45. anyfesolver/_ge_beam3_elastic_seed_modal.py +139 -0
  46. anyfesolver/_ge_beam3_equilibrium_line_program.py +98 -0
  47. anyfesolver/_ge_beam3_equilibrium_schur_solver.py +96 -0
  48. anyfesolver/_ge_beam3_factor_chain_modes.py +103 -0
  49. anyfesolver/_ge_beam3_fibre_cell.py +408 -0
  50. anyfesolver/_ge_beam3_fibre_distributed_couples.py +191 -0
  51. anyfesolver/_ge_beam3_fibre_kinematic_cell.py +75 -0
  52. anyfesolver/_ge_beam3_fibre_line_program.py +157 -0
  53. anyfesolver/_ge_beam3_fibre_line_work.py +87 -0
  54. anyfesolver/_ge_beam3_fibre_reference_modal.py +104 -0
  55. anyfesolver/_ge_beam3_fibre_schur_solver.py +134 -0
  56. anyfesolver/_ge_beam3_fibre_section.py +286 -0
  57. anyfesolver/_ge_beam3_fibre_static_boundary.py +113 -0
  58. anyfesolver/_ge_beam3_g1_analysis.py +307 -0
  59. anyfesolver/_ge_beam3_g1_elastic.py +161 -0
  60. anyfesolver/_ge_beam3_g1_element.py +185 -0
  61. anyfesolver/_ge_beam3_g1_operator.py +137 -0
  62. anyfesolver/_ge_beam3_g2_analysis.py +176 -0
  63. anyfesolver/_ge_beam3_g2_constraints.py +162 -0
  64. anyfesolver/_ge_beam3_g3_analysis.py +385 -0
  65. anyfesolver/_ge_beam3_g3_constraints.py +168 -0
  66. anyfesolver/_ge_beam3_g3b_owner.py +296 -0
  67. anyfesolver/_ge_beam3_g3b_q4_reference.py +186 -0
  68. anyfesolver/_ge_beam3_g3b_reference.py +206 -0
  69. anyfesolver/_ge_beam3_g3b_result_schema.py +107 -0
  70. anyfesolver/_ge_beam3_g3b_s3_reference.py +185 -0
  71. anyfesolver/_ge_beam3_g3b_weighted_reference.py +193 -0
  72. anyfesolver/_ge_beam3_g3c_affine_q4_chart.py +58 -0
  73. anyfesolver/_ge_beam3_g3c_affine_q4_increment_chart.py +257 -0
  74. anyfesolver/_ge_beam3_g3c_affine_q4_recovery.py +434 -0
  75. anyfesolver/_ge_beam3_g3c_affine_q4_registry.py +127 -0
  76. anyfesolver/_ge_beam3_g3c_b2_physical.py +153 -0
  77. anyfesolver/_ge_beam3_g3c_b2_physical_adapter.py +160 -0
  78. anyfesolver/_ge_beam3_g3c_definition.py +117 -0
  79. anyfesolver/_ge_beam3_g3c_local_beam.py +188 -0
  80. anyfesolver/_ge_beam3_g3c_local_shell.py +371 -0
  81. anyfesolver/_ge_beam3_g3c_owner.py +400 -0
  82. anyfesolver/_ge_beam3_g3c_physical_authority.py +203 -0
  83. anyfesolver/_ge_beam3_g3c_physical_owner.py +556 -0
  84. anyfesolver/_ge_beam3_g3c_recovery.py +91 -0
  85. anyfesolver/_ge_beam3_g3c_so3_numerics.py +81 -0
  86. anyfesolver/_ge_beam3_g3c_stable/__init__.py +1 -0
  87. anyfesolver/_ge_beam3_g3c_stable/authority.py +152 -0
  88. anyfesolver/_ge_beam3_g3c_stable/beam.py +196 -0
  89. anyfesolver/_ge_beam3_g3c_stable/boundary.py +38 -0
  90. anyfesolver/_ge_beam3_g3c_stable/chart.py +23 -0
  91. anyfesolver/_ge_beam3_g3c_stable/compensated.py +46 -0
  92. anyfesolver/_ge_beam3_g3c_stable/element.py +190 -0
  93. anyfesolver/_ge_beam3_g3c_stable/fit.py +54 -0
  94. anyfesolver/_ge_beam3_g3c_stable/joint.py +255 -0
  95. anyfesolver/_ge_beam3_g3c_stable/line_work.py +92 -0
  96. anyfesolver/_ge_beam3_g3c_stable/operator.py +147 -0
  97. anyfesolver/_ge_beam3_g3c_stable/owner.py +415 -0
  98. anyfesolver/_ge_beam3_g3c_stable/shell.py +358 -0
  99. anyfesolver/_ge_beam3_g4_completion.py +186 -0
  100. anyfesolver/_ge_beam3_g4a_station_transaction.py +385 -0
  101. anyfesolver/_ge_beam3_g5_completion.py +68 -0
  102. anyfesolver/_ge_beam3_g6_domain.py +354 -0
  103. anyfesolver/_ge_beam3_generalized_cell.py +172 -0
  104. anyfesolver/_ge_beam3_generalized_ellipsoid_section.py +215 -0
  105. anyfesolver/_ge_beam3_generalized_static_boundary.py +233 -0
  106. anyfesolver/_ge_beam3_lifted_kinetic_factor.py +26 -0
  107. anyfesolver/_ge_beam3_line_fibre_modes.py +121 -0
  108. anyfesolver/_ge_beam3_load_program.py +275 -0
  109. anyfesolver/_ge_beam3_loaded_modal.py +225 -0
  110. anyfesolver/_ge_beam3_mixed_ad.py +286 -0
  111. anyfesolver/_ge_beam3_native_analysis.py +484 -0
  112. anyfesolver/_ge_beam3_native_arc.py +269 -0
  113. anyfesolver/_ge_beam3_native_arc_adaptive.py +251 -0
  114. anyfesolver/_ge_beam3_native_arc_restart.py +88 -0
  115. anyfesolver/_ge_beam3_native_arc_source.py +62 -0
  116. anyfesolver/_ge_beam3_native_buckling.py +206 -0
  117. anyfesolver/_ge_beam3_native_combined_couples.py +179 -0
  118. anyfesolver/_ge_beam3_native_combined_restart.py +205 -0
  119. anyfesolver/_ge_beam3_native_definition.py +238 -0
  120. anyfesolver/_ge_beam3_native_distributed_element.py +220 -0
  121. anyfesolver/_ge_beam3_native_distributed_loading.py +92 -0
  122. anyfesolver/_ge_beam3_native_distributed_program.py +165 -0
  123. anyfesolver/_ge_beam3_native_distributed_recovery.py +34 -0
  124. anyfesolver/_ge_beam3_native_distributed_restart.py +221 -0
  125. anyfesolver/_ge_beam3_native_dynamic_analysis.py +149 -0
  126. anyfesolver/_ge_beam3_native_dynamic_restart.py +261 -0
  127. anyfesolver/_ge_beam3_native_fibre_current_modal.py +104 -0
  128. anyfesolver/_ge_beam3_native_fibre_recovery.py +34 -0
  129. anyfesolver/_ge_beam3_native_fibre_restart.py +211 -0
  130. anyfesolver/_ge_beam3_native_fibre_static_element.py +193 -0
  131. anyfesolver/_ge_beam3_native_force_adaptation.py +56 -0
  132. anyfesolver/_ge_beam3_native_generalized_combined_couples.py +188 -0
  133. anyfesolver/_ge_beam3_native_generalized_combined_restart.py +207 -0
  134. anyfesolver/_ge_beam3_native_generalized_element.py +222 -0
  135. anyfesolver/_ge_beam3_native_generalized_factor_modal.py +122 -0
  136. anyfesolver/_ge_beam3_native_generalized_loading.py +92 -0
  137. anyfesolver/_ge_beam3_native_generalized_modal.py +274 -0
  138. anyfesolver/_ge_beam3_native_generalized_paired_modal.py +13 -0
  139. anyfesolver/_ge_beam3_native_generalized_parameter.py +89 -0
  140. anyfesolver/_ge_beam3_native_generalized_program.py +196 -0
  141. anyfesolver/_ge_beam3_native_generalized_recovery.py +34 -0
  142. anyfesolver/_ge_beam3_native_generalized_restart.py +243 -0
  143. anyfesolver/_ge_beam3_native_history_profile.py +53 -0
  144. anyfesolver/_ge_beam3_native_line_loading.py +93 -0
  145. anyfesolver/_ge_beam3_native_line_program.py +150 -0
  146. anyfesolver/_ge_beam3_native_line_recovery.py +34 -0
  147. anyfesolver/_ge_beam3_native_line_restart.py +197 -0
  148. anyfesolver/_ge_beam3_native_line_static_element.py +220 -0
  149. anyfesolver/_ge_beam3_native_load_admission.py +37 -0
  150. anyfesolver/_ge_beam3_native_midpoint.py +1004 -0
  151. anyfesolver/_ge_beam3_native_multi_shell_contact.py +539 -0
  152. anyfesolver/_ge_beam3_native_pair_contact.py +236 -0
  153. anyfesolver/_ge_beam3_native_shell_contact.py +357 -0
  154. anyfesolver/_ge_beam3_native_spatial_couples.py +176 -0
  155. anyfesolver/_ge_beam3_native_spatial_restart.py +204 -0
  156. anyfesolver/_ge_beam3_native_transient.py +467 -0
  157. anyfesolver/_ge_beam3_native_translation.py +225 -0
  158. anyfesolver/_ge_beam3_native_translation_restart.py +54 -0
  159. anyfesolver/_ge_beam3_operator_validation_scope.py +53 -0
  160. anyfesolver/_ge_beam3_p5/__init__.py +11 -0
  161. anyfesolver/_ge_beam3_p5/algebra.py +91 -0
  162. anyfesolver/_ge_beam3_p5/arrays.py +29 -0
  163. anyfesolver/_ge_beam3_p5/chart.py +45 -0
  164. anyfesolver/_ge_beam3_p5/codec.py +82 -0
  165. anyfesolver/_ge_beam3_p5/committed_modal.py +191 -0
  166. anyfesolver/_ge_beam3_p5/compensated.py +118 -0
  167. anyfesolver/_ge_beam3_p5/compensated_coordinates.py +44 -0
  168. anyfesolver/_ge_beam3_p5/core.py +159 -0
  169. anyfesolver/_ge_beam3_p5/element.py +207 -0
  170. anyfesolver/_ge_beam3_p5/factors.py +61 -0
  171. anyfesolver/_ge_beam3_p5/inertia.py +120 -0
  172. anyfesolver/_ge_beam3_p5/mass.py +70 -0
  173. anyfesolver/_ge_beam3_p5/mixed.py +256 -0
  174. anyfesolver/_ge_beam3_p5/reference_modal.py +73 -0
  175. anyfesolver/_ge_beam3_p5/section.py +139 -0
  176. anyfesolver/_ge_beam3_p5/typed_schema.py +111 -0
  177. anyfesolver/_ge_beam3_p5_centered/__init__.py +6 -0
  178. anyfesolver/_ge_beam3_p5_centered/codec.py +84 -0
  179. anyfesolver/_ge_beam3_p5_centered/committed_modal.py +192 -0
  180. anyfesolver/_ge_beam3_p5_centered/core.py +171 -0
  181. anyfesolver/_ge_beam3_p5_centered/element.py +216 -0
  182. anyfesolver/_ge_beam3_p5_centered/mass.py +99 -0
  183. anyfesolver/_ge_beam3_p5_centered/positions.py +34 -0
  184. anyfesolver/_ge_beam3_p5_centered/reference_modal.py +73 -0
  185. anyfesolver/_ge_beam3_p5_coordinates/__init__.py +6 -0
  186. anyfesolver/_ge_beam3_p5_coordinates/codec.py +84 -0
  187. anyfesolver/_ge_beam3_p5_coordinates/committed_modal.py +192 -0
  188. anyfesolver/_ge_beam3_p5_coordinates/core.py +163 -0
  189. anyfesolver/_ge_beam3_p5_coordinates/element.py +213 -0
  190. anyfesolver/_ge_beam3_p5_coordinates/positions.py +102 -0
  191. anyfesolver/_ge_beam3_p5_coordinates/reference_modal.py +73 -0
  192. anyfesolver/_ge_beam3_p5_loads/__init__.py +7 -0
  193. anyfesolver/_ge_beam3_p5_loads/codec.py +85 -0
  194. anyfesolver/_ge_beam3_p5_loads/core.py +192 -0
  195. anyfesolver/_ge_beam3_p5_loads/element.py +243 -0
  196. anyfesolver/_ge_beam3_p5_loads/state.py +120 -0
  197. anyfesolver/_ge_beam3_p5_loads/work.py +45 -0
  198. anyfesolver/_ge_beam3_p5_seeded/__init__.py +9 -0
  199. anyfesolver/_ge_beam3_p5_seeded/codec.py +87 -0
  200. anyfesolver/_ge_beam3_p5_seeded/core.py +197 -0
  201. anyfesolver/_ge_beam3_p5_seeded/element.py +245 -0
  202. anyfesolver/_ge_beam3_p5_seeded/state.py +122 -0
  203. anyfesolver/_ge_beam3_p5_seeded/work.py +47 -0
  204. anyfesolver/_ge_beam3_pose_joint.py +268 -0
  205. anyfesolver/_ge_beam3_precise_geometric_work.py +147 -0
  206. anyfesolver/_ge_beam3_reassembled_signed_modes.py +101 -0
  207. anyfesolver/_ge_beam3_reference_identity.py +92 -0
  208. anyfesolver/_ge_beam3_refined_fibre_schur_solver.py +104 -0
  209. anyfesolver/_ge_beam3_refinement_capacity.py +19 -0
  210. anyfesolver/_ge_beam3_relative_virgin_reference_modes.py +60 -0
  211. anyfesolver/_ge_beam3_retained_arc.py +350 -0
  212. anyfesolver/_ge_beam3_retained_arc_geometry.py +66 -0
  213. anyfesolver/_ge_beam3_retained_arc_modal.py +125 -0
  214. anyfesolver/_ge_beam3_retained_elastic.py +134 -0
  215. anyfesolver/_ge_beam3_retained_fibre.py +209 -0
  216. anyfesolver/_ge_beam3_retained_fibre_control.py +270 -0
  217. anyfesolver/_ge_beam3_retained_fibre_element.py +58 -0
  218. anyfesolver/_ge_beam3_retained_fibre_modal.py +155 -0
  219. anyfesolver/_ge_beam3_retained_fibre_modes.py +189 -0
  220. anyfesolver/_ge_beam3_retained_fibre_program.py +68 -0
  221. anyfesolver/_ge_beam3_retained_fibre_state.py +268 -0
  222. anyfesolver/_ge_beam3_retained_force_program.py +72 -0
  223. anyfesolver/_ge_beam3_retained_generalized.py +186 -0
  224. anyfesolver/_ge_beam3_retained_generalized_modal.py +171 -0
  225. anyfesolver/_ge_beam3_retained_generalized_program.py +63 -0
  226. anyfesolver/_ge_beam3_retained_generalized_state.py +281 -0
  227. anyfesolver/_ge_beam3_retained_nodal_loading.py +111 -0
  228. anyfesolver/_ge_beam3_retained_plastic.py +116 -0
  229. anyfesolver/_ge_beam3_retained_plastic_modes.py +144 -0
  230. anyfesolver/_ge_beam3_retained_plastic_program.py +69 -0
  231. anyfesolver/_ge_beam3_retained_plastic_state.py +165 -0
  232. anyfesolver/_ge_beam3_retained_state.py +194 -0
  233. anyfesolver/_ge_beam3_retained_translation_control.py +345 -0
  234. anyfesolver/_ge_beam3_retained_translation_modal.py +137 -0
  235. anyfesolver/_ge_beam3_schur_line_program.py +98 -0
  236. anyfesolver/_ge_beam3_seeded_fibre_control.py +175 -0
  237. anyfesolver/_ge_beam3_seeded_load_program.py +301 -0
  238. anyfesolver/_ge_beam3_seeded_loaded_modal.py +226 -0
  239. anyfesolver/_ge_beam3_seeded_signed_modes.py +150 -0
  240. anyfesolver/_ge_beam3_shared_kinematic_split.py +53 -0
  241. anyfesolver/_ge_beam3_shell_joint_state.py +396 -0
  242. anyfesolver/_ge_beam3_shell_joint_trial.py +217 -0
  243. anyfesolver/_ge_beam3_signed_loaded_modes.py +140 -0
  244. anyfesolver/_ge_beam3_spatial_fibre_program.py +113 -0
  245. anyfesolver/_ge_beam3_spatial_nodal_moments.py +38 -0
  246. anyfesolver/_ge_beam3_station_resultant_cell.py +235 -0
  247. anyfesolver/_ge_beam3_variational_shell.py +211 -0
  248. anyfesolver/_ge_beam3_virgin_reference_modes.py +60 -0
  249. anyfesolver/_impact_coupling.py +162 -0
  250. anyfesolver/_native_authority_dag.py +77 -0
  251. anyfesolver/_native_dyadic_interval_inertia.py +64 -0
  252. anyfesolver/_native_exact_shift_chain_modes.py +140 -0
  253. anyfesolver/_native_exact_shift_inertia.py +86 -0
  254. anyfesolver/_native_factor_chain_modes.py +192 -0
  255. anyfesolver/_native_guard.cpp +828 -0
  256. anyfesolver/_native_guard_dispatch.py +140 -0
  257. anyfesolver/_native_large_factor_chain.py +55 -0
  258. anyfesolver/_native_material_protocol.py +51 -0
  259. anyfesolver/_native_midpoint_controller.py +90 -0
  260. anyfesolver/_native_modal_capacity.py +26 -0
  261. anyfesolver/_native_paired_factor_chain_modes.py +244 -0
  262. anyfesolver/_native_reassembled_factor_modes.py +185 -0
  263. anyfesolver/_native_reference_factor_spectrum.py +102 -0
  264. anyfesolver/_native_reference_modal.py +180 -0
  265. anyfesolver/_native_relative_factor_chain_modes.py +204 -0
  266. anyfesolver/_native_relative_reference_factor_spectrum.py +110 -0
  267. anyfesolver/_native_retained_step.py +15 -0
  268. anyfesolver/_native_rotation_state.py +797 -0
  269. anyfesolver/_native_signed_factor_modes.py +257 -0
  270. anyfesolver/_native_signed_kinetic_factor_modes.py +279 -0
  271. anyfesolver/_native_stationary_spectrum.py +79 -0
  272. anyfesolver/_nonlinear_events.py +150 -0
  273. anyfesolver/_nonlinear_seed.py +80 -0
  274. anyfesolver/_paired_modal_arithmetic.py +71 -0
  275. anyfesolver/_plate_stability_continuation.py +171 -0
  276. anyfesolver/_q4_assumed_strain_plasticity.py +502 -0
  277. anyfesolver/_qualified_authority_epoch.py +561 -0
  278. anyfesolver/_relative_reference_svd.py +44 -0
  279. anyfesolver/_stiffened_shell_affine_endpoint.py +232 -0
  280. anyfesolver/_stiffened_shell_algorithmic_pullback.py +38 -0
  281. anyfesolver/_stiffened_shell_arc_checkpoint.py +422 -0
  282. anyfesolver/_stiffened_shell_arc_control.py +108 -0
  283. anyfesolver/_stiffened_shell_arc_metric.py +222 -0
  284. anyfesolver/_stiffened_shell_arc_publication.py +153 -0
  285. anyfesolver/_stiffened_shell_arc_trial.py +310 -0
  286. anyfesolver/_stiffened_shell_b2_affine_resolution.py +101 -0
  287. anyfesolver/_stiffened_shell_b2_assembly_diagnostics.py +172 -0
  288. anyfesolver/_stiffened_shell_b2_definition_ownership.py +189 -0
  289. anyfesolver/_stiffened_shell_b2_experimental.py +153 -0
  290. anyfesolver/_stiffened_shell_b2_nodal_footprint.py +273 -0
  291. anyfesolver/_stiffened_shell_b2_physical_rigid_footprint.py +237 -0
  292. anyfesolver/_stiffened_shell_b2_q4_panel_experimental.py +2447 -0
  293. anyfesolver/_stiffened_shell_b2_q4_point_experimental.py +251 -0
  294. anyfesolver/_stiffened_shell_b2_reference_buckling.py +413 -0
  295. anyfesolver/_stiffened_shell_b3_chart.py +70 -0
  296. anyfesolver/_stiffened_shell_b3_local_adapter.py +141 -0
  297. anyfesolver/_stiffened_shell_beam_history.py +107 -0
  298. anyfesolver/_stiffened_shell_bl5_local_experimental.py +173 -0
  299. anyfesolver/_stiffened_shell_bl5_native_elastic.py +28 -0
  300. anyfesolver/_stiffened_shell_branch_event_trial.py +58 -0
  301. anyfesolver/_stiffened_shell_consumer_capabilities.py +124 -0
  302. anyfesolver/_stiffened_shell_coordinate_support.py +110 -0
  303. anyfesolver/_stiffened_shell_displacement_adaptive.py +327 -0
  304. anyfesolver/_stiffened_shell_displacement_checkpoint.py +360 -0
  305. anyfesolver/_stiffened_shell_displacement_control.py +326 -0
  306. anyfesolver/_stiffened_shell_displacement_corrector.py +293 -0
  307. anyfesolver/_stiffened_shell_displacement_increment.py +121 -0
  308. anyfesolver/_stiffened_shell_distributing_footprint.py +354 -0
  309. anyfesolver/_stiffened_shell_distributing_pose.py +267 -0
  310. anyfesolver/_stiffened_shell_f06_increment_arithmetic.py +205 -0
  311. anyfesolver/_stiffened_shell_ge_body_load.py +300 -0
  312. anyfesolver/_stiffened_shell_ge_checkpoint_binary.py +472 -0
  313. anyfesolver/_stiffened_shell_ge_distributed_load.py +210 -0
  314. anyfesolver/_stiffened_shell_ge_distributed_programme.py +175 -0
  315. anyfesolver/_stiffened_shell_ge_distributing_finite.py +242 -0
  316. anyfesolver/_stiffened_shell_ge_distributing_reference.py +296 -0
  317. anyfesolver/_stiffened_shell_ge_experimental.py +2454 -0
  318. anyfesolver/_stiffened_shell_ge_finite_experimental.py +2714 -0
  319. anyfesolver/_stiffened_shell_ge_mixed_modal_mass.py +33 -0
  320. anyfesolver/_stiffened_shell_ge_point_buckling.py +723 -0
  321. anyfesolver/_stiffened_shell_ge_pressure_load.py +366 -0
  322. anyfesolver/_stiffened_shell_ge_reference_modal.py +580 -0
  323. anyfesolver/_stiffened_shell_generalized_recovery.py +150 -0
  324. anyfesolver/_stiffened_shell_increment_control.py +217 -0
  325. anyfesolver/_stiffened_shell_l1_assembly_experimental.py +420 -0
  326. anyfesolver/_stiffened_shell_l1_local_experimental.py +284 -0
  327. anyfesolver/_stiffened_shell_l1_supported_work_experimental.py +146 -0
  328. anyfesolver/_stiffened_shell_native_distributed_load.py +120 -0
  329. anyfesolver/_stiffened_shell_native_gravity.py +236 -0
  330. anyfesolver/_stiffened_shell_nodal_footprint.py +255 -0
  331. anyfesolver/_stiffened_shell_physical_q4_mass.py +98 -0
  332. anyfesolver/_stiffened_shell_physical_s3_mass.py +53 -0
  333. anyfesolver/_stiffened_shell_point_recovery.py +49 -0
  334. anyfesolver/_stiffened_shell_q4_algorithmic_pullback.py +88 -0
  335. anyfesolver/_stiffened_shell_q4_material_event.py +114 -0
  336. anyfesolver/_stiffened_shell_q4_reference.py +65 -0
  337. anyfesolver/_stiffened_shell_rotation_charts.py +58 -0
  338. anyfesolver/_stiffened_shell_s3_algorithmic_pullback.py +59 -0
  339. anyfesolver/_stiffened_shell_s3_conservative_buckling.py +28 -0
  340. anyfesolver/_stiffened_shell_s3_dead_work_candidate.py +107 -0
  341. anyfesolver/_stiffened_shell_s3_material_event.py +30 -0
  342. anyfesolver/_stiffened_shell_same_parent_trial.py +224 -0
  343. anyfesolver/_stiffened_shell_selected_recovery.py +113 -0
  344. anyfesolver/_stiffened_shell_staged_load_experimental.py +392 -0
  345. anyfesolver/_stiffened_shell_stress_free_reference.py +204 -0
  346. anyfesolver/_wire_types.py +17 -0
  347. anyfesolver/activity.py +1537 -0
  348. anyfesolver/algebraic_dynamics.py +2864 -0
  349. anyfesolver/analysis_session.py +897 -0
  350. anyfesolver/anystructure_fem_mode.py +1637 -0
  351. anyfesolver/arc_length.py +2587 -0
  352. anyfesolver/assembly.py +1830 -0
  353. anyfesolver/b3_ge.py +179 -0
  354. anyfesolver/baselines.py +303 -0
  355. anyfesolver/beam_sections.py +292 -0
  356. anyfesolver/beam_shell_verification.py +4685 -0
  357. anyfesolver/beam_validity.py +110 -0
  358. anyfesolver/benchmarks.py +495 -0
  359. anyfesolver/boundary.py +1680 -0
  360. anyfesolver/buckling.py +2136 -0
  361. anyfesolver/buckling_validity.py +91 -0
  362. anyfesolver/capacity_workflow.py +431 -0
  363. anyfesolver/capsule_runtime_guard.py +99 -0
  364. anyfesolver/cases.py +173 -0
  365. anyfesolver/composite_strip_verification.py +297 -0
  366. anyfesolver/concentrated_mass.py +84 -0
  367. anyfesolver/constraint_audit.py +553 -0
  368. anyfesolver/contact.py +4785 -0
  369. anyfesolver/contact_performance.py +301 -0
  370. anyfesolver/control.py +206 -0
  371. anyfesolver/corotational.py +1935 -0
  372. anyfesolver/corotational_performance.py +157 -0
  373. anyfesolver/current_state_tangent.py +2780 -0
  374. anyfesolver/cylinder_benchmarks.py +369 -0
  375. anyfesolver/damage_matrix_performance.py +617 -0
  376. anyfesolver/dynamics.py +2833 -0
  377. anyfesolver/e4_pl_element.py +8265 -0
  378. anyfesolver/e4_pl_enriched.py +194 -0
  379. anyfesolver/e4_pl_enriched_nonlinear.py +159 -0
  380. anyfesolver/e4_pl_s3_element.py +9752 -0
  381. anyfesolver/e4_pl_s3_initial_fields.py +101 -0
  382. anyfesolver/e4_pl_s3_state.py +4723 -0
  383. anyfesolver/e4_pl_s3_v2_element.py +1844 -0
  384. anyfesolver/e4_pl_s3_v2b_element.py +1936 -0
  385. anyfesolver/e4_pl_s3_v2c_element.py +2196 -0
  386. anyfesolver/e4_pl_s3_v2d_element.py +2621 -0
  387. anyfesolver/e4_pl_s3_v2d_state.py +376 -0
  388. anyfesolver/element_capabilities.py +159 -0
  389. anyfesolver/element_qualification.py +432 -0
  390. anyfesolver/elements.py +6327 -0
  391. anyfesolver/experimental_csr_assembly.py +238 -0
  392. anyfesolver/external_references.py +1253 -0
  393. anyfesolver/fe_core.py +832 -0
  394. anyfesolver/floating_pressure_regions.py +119 -0
  395. anyfesolver/floating_response.py +486 -0
  396. anyfesolver/floating_transient.py +1281 -0
  397. anyfesolver/fracture.py +621 -0
  398. anyfesolver/ge_beam3_curved_reference.py +725 -0
  399. anyfesolver/ge_beam3_element.py +885 -0
  400. anyfesolver/ge_beam3_mixed_element.py +1216 -0
  401. anyfesolver/ge_beam3_mixed_state.py +814 -0
  402. anyfesolver/ge_beam3_native.py +129 -0
  403. anyfesolver/ge_beam3_native_connected_dynamics.py +24 -0
  404. anyfesolver/ge_beam3_native_dynamics.py +70 -0
  405. anyfesolver/ge_beam3_state.py +672 -0
  406. anyfesolver/general_contact/__init__.py +151 -0
  407. anyfesolver/general_contact/_enriched_multitarget_empty.py +202 -0
  408. anyfesolver/general_contact/_enriched_multitarget_trial.py +183 -0
  409. anyfesolver/general_contact/_results_archive_common.py +65 -0
  410. anyfesolver/general_contact/algebraic_path.py +206 -0
  411. anyfesolver/general_contact/arc_contact.py +237 -0
  412. anyfesolver/general_contact/arc_results_archive.py +158 -0
  413. anyfesolver/general_contact/augmentation.py +157 -0
  414. anyfesolver/general_contact/automatic_domain.py +621 -0
  415. anyfesolver/general_contact/beam_chain_consistent.py +357 -0
  416. anyfesolver/general_contact/beam_chain_end_geometry.py +237 -0
  417. anyfesolver/general_contact/beam_chain_ends.py +220 -0
  418. anyfesolver/general_contact/beam_chain_pair.py +416 -0
  419. anyfesolver/general_contact/beam_curve_end_geometry.py +254 -0
  420. anyfesolver/general_contact/beam_curve_ends.py +237 -0
  421. anyfesolver/general_contact/beam_curve_pair.py +794 -0
  422. anyfesolver/general_contact/beam_curve_pair_static.py +303 -0
  423. anyfesolver/general_contact/beam_end_radial_geometry.py +221 -0
  424. anyfesolver/general_contact/beam_end_topology.py +15 -0
  425. anyfesolver/general_contact/beam_hemisphere_coupled_tool.py +61 -0
  426. anyfesolver/general_contact/beam_hemisphere_cylinder.py +134 -0
  427. anyfesolver/general_contact/beam_hemisphere_cylinder_motion.py +89 -0
  428. anyfesolver/general_contact/beam_hemisphere_cylinder_work.py +216 -0
  429. anyfesolver/general_contact/beam_hemisphere_plane.py +175 -0
  430. anyfesolver/general_contact/beam_hemisphere_s3_support.py +152 -0
  431. anyfesolver/general_contact/beam_hemisphere_sphere.py +135 -0
  432. anyfesolver/general_contact/beam_hemisphere_sphere_work.py +114 -0
  433. anyfesolver/general_contact/beam_hemisphere_support.py +211 -0
  434. anyfesolver/general_contact/beam_pair.py +523 -0
  435. anyfesolver/general_contact/beam_pair_end_geometry.py +269 -0
  436. anyfesolver/general_contact/beam_pair_ends.py +222 -0
  437. anyfesolver/general_contact/beam_plane.py +425 -0
  438. anyfesolver/general_contact/beam_radial.py +500 -0
  439. anyfesolver/general_contact/beam_radial_ends.py +223 -0
  440. anyfesolver/general_contact/beam_s3_directional_rates.py +196 -0
  441. anyfesolver/general_contact/beam_s3_rotational_transient.py +126 -0
  442. anyfesolver/general_contact/beam_s3_transient.py +139 -0
  443. anyfesolver/general_contact/beam_shell.py +648 -0
  444. anyfesolver/general_contact/beam_shell_patch.py +395 -0
  445. anyfesolver/general_contact/beam_temporal_bounds.py +230 -0
  446. anyfesolver/general_contact/capability.py +101 -0
  447. anyfesolver/general_contact/capped_cylinder.py +618 -0
  448. anyfesolver/general_contact/contact_search.py +95 -0
  449. anyfesolver/general_contact/core.py +1769 -0
  450. anyfesolver/general_contact/curved_s3_q4_work.py +238 -0
  451. anyfesolver/general_contact/curved_shell_skin.py +520 -0
  452. anyfesolver/general_contact/d1_interior_profile.py +427 -0
  453. anyfesolver/general_contact/deformable_beam_s3_caps.py +143 -0
  454. anyfesolver/general_contact/deformable_beam_s3_line.py +211 -0
  455. anyfesolver/general_contact/deformable_beam_s3_static.py +152 -0
  456. anyfesolver/general_contact/descriptor_rates.py +61 -0
  457. anyfesolver/general_contact/enriched_cold_predictor.py +161 -0
  458. anyfesolver/general_contact/enriched_moment_batch.py +337 -0
  459. anyfesolver/general_contact/enriched_multitarget.py +308 -0
  460. anyfesolver/general_contact/enriched_multitarget_gap.py +156 -0
  461. anyfesolver/general_contact/enriched_multitarget_moments.py +194 -0
  462. anyfesolver/general_contact/enriched_multitarget_topology.py +171 -0
  463. anyfesolver/general_contact/enriched_nonlinear.py +440 -0
  464. anyfesolver/general_contact/enriched_overlap.py +299 -0
  465. anyfesolver/general_contact/enriched_path.py +253 -0
  466. anyfesolver/general_contact/enriched_small_cut.py +310 -0
  467. anyfesolver/general_contact/enriched_static.py +481 -0
  468. anyfesolver/general_contact/enriched_union.py +320 -0
  469. anyfesolver/general_contact/equilibrated_pressure_pivot.py +140 -0
  470. anyfesolver/general_contact/event_subdivision.py +273 -0
  471. anyfesolver/general_contact/finite_mixed_state.py +133 -0
  472. anyfesolver/general_contact/finite_rigid_patch.py +196 -0
  473. anyfesolver/general_contact/finite_rigid_support.py +129 -0
  474. anyfesolver/general_contact/finite_rigid_sweep.py +53 -0
  475. anyfesolver/general_contact/finite_rotation_predictor.py +171 -0
  476. anyfesolver/general_contact/finite_rotation_skin.py +212 -0
  477. anyfesolver/general_contact/finite_rotation_state.py +106 -0
  478. anyfesolver/general_contact/finite_rotation_sweep.py +161 -0
  479. anyfesolver/general_contact/finite_v2d_state.py +104 -0
  480. anyfesolver/general_contact/fixed_projection_graph.py +205 -0
  481. anyfesolver/general_contact/fixed_projection_s3_events.py +235 -0
  482. anyfesolver/general_contact/free_rigid.py +134 -0
  483. anyfesolver/general_contact/friction_point.py +378 -0
  484. anyfesolver/general_contact/gap_extrema.py +119 -0
  485. anyfesolver/general_contact/guided_pair_transient_geometry.py +138 -0
  486. anyfesolver/general_contact/initial_contact_seed.py +368 -0
  487. anyfesolver/general_contact/linearized_pivot.py +595 -0
  488. anyfesolver/general_contact/material_work_diagnostics.py +159 -0
  489. anyfesolver/general_contact/moment_batch_ad.py +129 -0
  490. anyfesolver/general_contact/moment_batch_points.py +75 -0
  491. anyfesolver/general_contact/moving.py +1031 -0
  492. anyfesolver/general_contact/multiple_beam_rigid.py +248 -0
  493. anyfesolver/general_contact/multiple_beam_s3_caps.py +199 -0
  494. anyfesolver/general_contact/multiple_beam_s3_transient.py +223 -0
  495. anyfesolver/general_contact/multiple_projected_pairs.py +196 -0
  496. anyfesolver/general_contact/multiple_shell_planes.py +226 -0
  497. anyfesolver/general_contact/native_activation_static.py +143 -0
  498. anyfesolver/general_contact/native_checkpoint_results.py +213 -0
  499. anyfesolver/general_contact/native_curve_union.py +268 -0
  500. anyfesolver/general_contact/native_curved_geometry.py +374 -0
  501. anyfesolver/general_contact/native_curved_pair_partition.py +590 -0
  502. anyfesolver/general_contact/native_curved_plane_work.py +864 -0
  503. anyfesolver/general_contact/native_curved_s3_work.py +472 -0
  504. anyfesolver/general_contact/native_event_polynomial.py +164 -0
  505. anyfesolver/general_contact/native_fibre_context.py +173 -0
  506. anyfesolver/general_contact/native_fibre_results.py +74 -0
  507. anyfesolver/general_contact/native_initial_guess.py +122 -0
  508. anyfesolver/general_contact/native_material_activation.py +108 -0
  509. anyfesolver/general_contact/native_material_plane.py +111 -0
  510. anyfesolver/general_contact/native_material_s3.py +209 -0
  511. anyfesolver/general_contact/native_multi_s3_static.py +722 -0
  512. anyfesolver/general_contact/native_normal_angles.py +233 -0
  513. anyfesolver/general_contact/native_pair_error_budget.py +49 -0
  514. anyfesolver/general_contact/native_replay_arithmetic.py +103 -0
  515. anyfesolver/general_contact/native_replay_diagnostics.py +90 -0
  516. anyfesolver/general_contact/native_retained_body_junction.py +99 -0
  517. anyfesolver/general_contact/native_retained_body_pair.py +220 -0
  518. anyfesolver/general_contact/native_retained_body_projection.py +160 -0
  519. anyfesolver/general_contact/native_retained_body_static.py +62 -0
  520. anyfesolver/general_contact/native_retained_cell_pair.py +185 -0
  521. anyfesolver/general_contact/native_retained_curve_cell.py +102 -0
  522. anyfesolver/general_contact/native_retained_line_plane.py +210 -0
  523. anyfesolver/general_contact/native_retained_line_s3.py +440 -0
  524. anyfesolver/general_contact/native_retained_line_s3_work.py +91 -0
  525. anyfesolver/general_contact/native_retained_pair_static.py +845 -0
  526. anyfesolver/general_contact/native_retained_s3_static.py +554 -0
  527. anyfesolver/general_contact/native_retained_static.py +478 -0
  528. anyfesolver/general_contact/native_retained_station.py +222 -0
  529. anyfesolver/general_contact/native_retained_whole_pair.py +2120 -0
  530. anyfesolver/general_contact/native_s3_swept.py +149 -0
  531. anyfesolver/general_contact/native_shell_static_driver.py +144 -0
  532. anyfesolver/general_contact/native_surface_activation.py +391 -0
  533. anyfesolver/general_contact/native_surface_bounds.py +198 -0
  534. anyfesolver/general_contact/native_surface_contributor.py +121 -0
  535. anyfesolver/general_contact/native_surface_crossing.py +81 -0
  536. anyfesolver/general_contact/native_surface_event_sequence.py +320 -0
  537. anyfesolver/general_contact/native_surface_extrema.py +72 -0
  538. anyfesolver/general_contact/native_surface_friction_integral.py +1724 -0
  539. anyfesolver/general_contact/native_surface_front.py +742 -0
  540. anyfesolver/general_contact/native_surface_front_boundary.py +160 -0
  541. anyfesolver/general_contact/native_surface_front_precision.py +78 -0
  542. anyfesolver/general_contact/native_surface_front_work.py +118 -0
  543. anyfesolver/general_contact/native_surface_history.py +334 -0
  544. anyfesolver/general_contact/native_surface_normal.py +324 -0
  545. anyfesolver/general_contact/native_surface_patch.py +213 -0
  546. anyfesolver/general_contact/native_surface_path.py +348 -0
  547. anyfesolver/general_contact/native_surface_quadrature.py +212 -0
  548. anyfesolver/general_contact/native_surface_s3_friction.py +340 -0
  549. anyfesolver/general_contact/native_surface_support.py +776 -0
  550. anyfesolver/general_contact/native_surface_transaction.py +198 -0
  551. anyfesolver/general_contact/native_transient_multi_shell.py +108 -0
  552. anyfesolver/general_contact/native_transient_pair.py +61 -0
  553. anyfesolver/general_contact/native_transient_shell.py +44 -0
  554. anyfesolver/general_contact/normal_s3_skin_path.py +163 -0
  555. anyfesolver/general_contact/overlap.py +443 -0
  556. anyfesolver/general_contact/pair.py +466 -0
  557. anyfesolver/general_contact/patch_broadphase.py +111 -0
  558. anyfesolver/general_contact/patch_mortar.py +593 -0
  559. anyfesolver/general_contact/patch_sliding.py +644 -0
  560. anyfesolver/general_contact/plane_newmark_events.py +278 -0
  561. anyfesolver/general_contact/pointwise_patch.py +288 -0
  562. anyfesolver/general_contact/polynomial_roots.py +312 -0
  563. anyfesolver/general_contact/pressure_basis.py +241 -0
  564. anyfesolver/general_contact/pressure_diagnostics.py +155 -0
  565. anyfesolver/general_contact/pressure_overlay.py +182 -0
  566. anyfesolver/general_contact/pressure_space.py +51 -0
  567. anyfesolver/general_contact/q4_material_checkpoint.py +276 -0
  568. anyfesolver/general_contact/q4_overlap_local_bound.py +1111 -0
  569. anyfesolver/general_contact/q4_q4_overlap_derivatives.py +234 -0
  570. anyfesolver/general_contact/q4_q4_swept_bound.py +58 -0
  571. anyfesolver/general_contact/q4_s3_overlap_derivatives.py +1159 -0
  572. anyfesolver/general_contact/q4_s3_tiny_wedge.py +180 -0
  573. anyfesolver/general_contact/q4_skin_work.py +87 -0
  574. anyfesolver/general_contact/q4_source_mortar_energy.py +181 -0
  575. anyfesolver/general_contact/q4_source_overlap.py +401 -0
  576. anyfesolver/general_contact/q4_target_overlap.py +181 -0
  577. anyfesolver/general_contact/request_identity.py +192 -0
  578. anyfesolver/general_contact/rigid_translation.py +199 -0
  579. anyfesolver/general_contact/runtime.py +27 -0
  580. anyfesolver/general_contact/s3_friction_chart_interval.py +104 -0
  581. anyfesolver/general_contact/s3_friction_coverage.py +165 -0
  582. anyfesolver/general_contact/s3_friction_dyadic_interval.py +39 -0
  583. anyfesolver/general_contact/s3_friction_history_path.py +111 -0
  584. anyfesolver/general_contact/s3_friction_mesh_coverage.py +145 -0
  585. anyfesolver/general_contact/s3_friction_mesh_gap.py +74 -0
  586. anyfesolver/general_contact/s3_friction_mesh_monolithic.py +150 -0
  587. anyfesolver/general_contact/s3_friction_monolithic.py +121 -0
  588. anyfesolver/general_contact/s3_friction_moving_coverage.py +114 -0
  589. anyfesolver/general_contact/s3_friction_pair.py +237 -0
  590. anyfesolver/general_contact/s3_friction_point.py +129 -0
  591. anyfesolver/general_contact/s3_friction_prepared_path.py +254 -0
  592. anyfesolver/general_contact/s3_friction_replay.py +1094 -0
  593. anyfesolver/general_contact/s3_friction_rim_path.py +69 -0
  594. anyfesolver/general_contact/s3_friction_rim_transaction.py +23 -0
  595. anyfesolver/general_contact/s3_friction_static.py +267 -0
  596. anyfesolver/general_contact/s3_friction_swept_gap.py +112 -0
  597. anyfesolver/general_contact/s3_friction_touch.py +94 -0
  598. anyfesolver/general_contact/s3_friction_weak_pressure.py +66 -0
  599. anyfesolver/general_contact/s3_overlap_derivatives.py +220 -0
  600. anyfesolver/general_contact/s3_overlap_hermite_gap.py +180 -0
  601. anyfesolver/general_contact/s3_pair_static.py +343 -0
  602. anyfesolver/general_contact/s3_patch_augmented.py +2056 -0
  603. anyfesolver/general_contact/s3_patch_mortar_energy.py +545 -0
  604. anyfesolver/general_contact/s3_patch_static.py +1725 -0
  605. anyfesolver/general_contact/s3_pressure_hermite_bounds.py +395 -0
  606. anyfesolver/general_contact/s3_pressure_polygon_bounds.py +73 -0
  607. anyfesolver/general_contact/s3_q4_gap_resolution.py +191 -0
  608. anyfesolver/general_contact/s3_q4_overlap_derivatives.py +252 -0
  609. anyfesolver/general_contact/s3_q4_swept.py +56 -0
  610. anyfesolver/general_contact/s3_skin_work.py +101 -0
  611. anyfesolver/general_contact/s3_sliding_friction.py +640 -0
  612. anyfesolver/general_contact/s3_stable_plane_gap.py +43 -0
  613. anyfesolver/general_contact/seed_path_vertex_interval.py +323 -0
  614. anyfesolver/general_contact/semismooth.py +133 -0
  615. anyfesolver/general_contact/semismooth_block.py +147 -0
  616. anyfesolver/general_contact/semismooth_path.py +871 -0
  617. anyfesolver/general_contact/shell_pair_hermite_sweep.py +336 -0
  618. anyfesolver/general_contact/shell_sphere_temporal_bounds.py +305 -0
  619. anyfesolver/general_contact/skin_geometry.py +106 -0
  620. anyfesolver/general_contact/sliding.py +349 -0
  621. anyfesolver/general_contact/sphere.py +691 -0
  622. anyfesolver/general_contact/sphere_temporal_bounds.py +241 -0
  623. anyfesolver/general_contact/static_path.py +2608 -0
  624. anyfesolver/general_contact/static_results_archive.py +140 -0
  625. anyfesolver/general_contact/structural_state_bridge.py +196 -0
  626. anyfesolver/general_contact/supported_schur.py +594 -0
  627. anyfesolver/general_contact/swept_patch_broadphase.py +160 -0
  628. anyfesolver/general_contact/transient.py +2921 -0
  629. anyfesolver/general_contact/transient_results_archive.py +491 -0
  630. anyfesolver/general_contact/triangle_mortar_energy.py +280 -0
  631. anyfesolver/general_contact/triangle_pair_energy.py +211 -0
  632. anyfesolver/general_contact/triangulated_rigid.py +94 -0
  633. anyfesolver/general_contact/triangulated_rigid_static.py +399 -0
  634. anyfesolver/general_contact/warped_q4_plane.py +185 -0
  635. anyfesolver/general_contact/warped_q4_skin.py +302 -0
  636. anyfesolver/general_contact/warped_q4_static.py +331 -0
  637. anyfesolver/impact_performance.py +273 -0
  638. anyfesolver/impact_reduced_assembly.py +294 -0
  639. anyfesolver/imperfections.py +397 -0
  640. anyfesolver/inertia_relief.py +676 -0
  641. anyfesolver/initial_field_state.py +54 -0
  642. anyfesolver/jit_compiler.py +135 -0
  643. anyfesolver/kernel_warmup.py +228 -0
  644. anyfesolver/linalg.py +1002 -0
  645. anyfesolver/marine_contributions.py +634 -0
  646. anyfesolver/marine_coupled_equilibrium.py +292 -0
  647. anyfesolver/marine_equilibrium.py +405 -0
  648. anyfesolver/marine_hydro_coordinates.py +346 -0
  649. anyfesolver/marine_linear.py +549 -0
  650. anyfesolver/marine_link.py +306 -0
  651. anyfesolver/marine_mechanical.py +923 -0
  652. anyfesolver/marine_mooring.py +533 -0
  653. anyfesolver/marine_morison.py +331 -0
  654. anyfesolver/marine_potential_flow.py +403 -0
  655. anyfesolver/marine_rigid.py +397 -0
  656. anyfesolver/marine_seabed.py +122 -0
  657. anyfesolver/mass_properties.py +352 -0
  658. anyfesolver/material_curves.py +52 -0
  659. anyfesolver/materials.py +43 -0
  660. anyfesolver/matrix_assembly.py +7330 -0
  661. anyfesolver/mesh_gen.py +904 -0
  662. anyfesolver/mesh_load_bc_verification.py +612 -0
  663. anyfesolver/modal.py +2494 -0
  664. anyfesolver/nonlinear.py +341 -0
  665. anyfesolver/nonlinear_analysis_diagnostics.py +466 -0
  666. anyfesolver/nonlinear_element_evaluation.py +126 -0
  667. anyfesolver/nonlinear_performance.py +2094 -0
  668. anyfesolver/nonlinear_performance_batch_b.py +1173 -0
  669. anyfesolver/nonlinear_performance_batch_c.py +850 -0
  670. anyfesolver/nonlinear_performance_bootstrap.py +164 -0
  671. anyfesolver/nonlinear_reduced_assembly.py +806 -0
  672. anyfesolver/nonlinear_restart.py +1708 -0
  673. anyfesolver/nonlinear_state.py +2800 -0
  674. anyfesolver/nonlinear_static.py +9407 -0
  675. anyfesolver/outcomes.py +694 -0
  676. anyfesolver/plasticity.py +2087 -0
  677. anyfesolver/plasticity_qualification.py +758 -0
  678. anyfesolver/prepared_static.py +1129 -0
  679. anyfesolver/prepared_static_envelopes.py +389 -0
  680. anyfesolver/prepared_static_loads.py +1180 -0
  681. anyfesolver/prepared_static_measures.py +18 -0
  682. anyfesolver/prepared_static_numeric.py +247 -0
  683. anyfesolver/prepared_static_q4.py +297 -0
  684. anyfesolver/prepared_static_recovery.py +2068 -0
  685. anyfesolver/prepared_static_response.py +1013 -0
  686. anyfesolver/prepared_static_shared.py +226 -0
  687. anyfesolver/prepared_static_snapshot.py +323 -0
  688. anyfesolver/prepared_static_vectorized.py +866 -0
  689. anyfesolver/pressure_regions.py +287 -0
  690. anyfesolver/production_readiness.py +343 -0
  691. anyfesolver/quality_control.py +1487 -0
  692. anyfesolver/quantities.py +1289 -0
  693. anyfesolver/recovery.py +4217 -0
  694. anyfesolver/recovery_batches.py +1985 -0
  695. anyfesolver/recovery_policy.py +205 -0
  696. anyfesolver/recovery_s4.py +289 -0
  697. anyfesolver/recovery_shell_frames.py +102 -0
  698. anyfesolver/reference_cases.py +366 -0
  699. anyfesolver/result_capsule.py +2175 -0
  700. anyfesolver/results.py +752 -0
  701. anyfesolver/runtime.py +9819 -0
  702. anyfesolver/s3_reference_batch.py +1338 -0
  703. anyfesolver/s3_v2c_fast_assembly.py +544 -0
  704. anyfesolver/s3_v2d_fast_assembly.py +447 -0
  705. anyfesolver/s4_validity.py +354 -0
  706. anyfesolver/sections.py +67 -0
  707. anyfesolver/sesam_fem/__init__.py +55 -0
  708. anyfesolver/sesam_fem/__main__.py +80 -0
  709. anyfesolver/sesam_fem/diagnostics.py +5 -0
  710. anyfesolver/sesam_fem/document.py +39 -0
  711. anyfesolver/sesam_fem/exporter.py +9 -0
  712. anyfesolver/sesam_fem/importer.py +228 -0
  713. anyfesolver/sesam_fem/records.py +21 -0
  714. anyfesolver/sesam_fem/schema.py +35 -0
  715. anyfesolver/sesam_fem/sif_importer.py +9 -0
  716. anyfesolver/sesam_fem/validation.py +5 -0
  717. anyfesolver/sestra_deep_diagnostics.py +173 -0
  718. anyfesolver/sestra_mixed_verification.py +146 -0
  719. anyfesolver/sestra_structure_benchmarks.py +270 -0
  720. anyfesolver/sestra_three_case.py +215 -0
  721. anyfesolver/sestra_verification.py +523 -0
  722. anyfesolver/shell_benchmarks.py +367 -0
  723. anyfesolver/shell_formulations/director_field.py +799 -0
  724. anyfesolver/shell_formulations/geometry_provenance.py +921 -0
  725. anyfesolver/shell_formulations/mitc4_plus_d_quality.py +318 -0
  726. anyfesolver/shell_formulations/mitc4_plus_d_reference.py +837 -0
  727. anyfesolver/shell_formulations/mitc4_plus_d_scalar.py +209 -0
  728. anyfesolver/shell_formulations/protocol.py +222 -0
  729. anyfesolver/shell_formulations/q4_common.py +271 -0
  730. anyfesolver/shell_formulations/s4_restricted_policy.py +78 -0
  731. anyfesolver/shell_sections.py +394 -0
  732. anyfesolver/solid_submodel.py +930 -0
  733. anyfesolver/static_batch.py +662 -0
  734. anyfesolver/static_envelopes.py +250 -0
  735. anyfesolver/stiffened_shell.py +388 -0
  736. anyfesolver/submodel_transfer.py +1306 -0
  737. anyfesolver/test_cases.py +610 -0
  738. anyfesolver/threading_policy.py +431 -0
  739. anyfesolver/validation.py +719 -0
  740. anyfesolver/vectorized_beam.py +139 -0
  741. anyfesolver/vectorized_generalized_shell.py +448 -0
  742. anyfesolver/vectorized_hill48.py +956 -0
  743. anyfesolver/vectorized_nonlinear.py +360 -0
  744. anyfesolver/vectorized_stiffness.py +694 -0
  745. anyfesolver-0.5.0a1.dist-info/METADATA +374 -0
  746. anyfesolver-0.5.0a1.dist-info/RECORD +751 -0
  747. anyfesolver-0.5.0a1.dist-info/WHEEL +5 -0
  748. anyfesolver-0.5.0a1.dist-info/licenses/COPYRIGHT +1 -0
  749. anyfesolver-0.5.0a1.dist-info/licenses/LICENSE +373 -0
  750. anyfesolver-0.5.0a1.dist-info/licenses/THIRD_PARTY_NOTICES.md +32 -0
  751. anyfesolver-0.5.0a1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,556 @@
1
+ """Private G3c finite mixed-graph development owner; NOT qualification.
2
+
3
+ One immutable graph generation; actual native material transactions are confined
4
+ to disposable sandboxes. No public factory or checkpoint-import admission.
5
+ """
6
+ from dataclasses import dataclass
7
+ from hashlib import sha256
8
+ import inspect
9
+ import json
10
+ import sys
11
+ import threading
12
+ from time import monotonic
13
+ import numpy as np
14
+ import anyfesolver._ge_beam3_g3c_stable.element as native_module
15
+ import anyfesolver._ge_beam3_g3c_stable.operator as operator_module
16
+ import anyfesolver._ge_beam3_g3c_stable.beam as beam_module
17
+ import anyfesolver._ge_beam3_g3c_stable.shell as shell_module
18
+ import anyfesolver._ge_beam3_g3c_stable.joint as joint_module
19
+ import anyfesolver._ge_beam3_g3c_b2_physical_adapter as physical_b2
20
+ import anyfesolver._ge_beam3_g3c_affine_q4_recovery as physical_q4
21
+ import anyfesolver._ge_beam3_g3c_affine_q4_registry as q4_registry
22
+ import anyfesolver.nonlinear_state as state_module
23
+ import anyfesolver.elements as legacy_module
24
+ import anyfesolver._native_rotation_state as rotation_module
25
+ import anyfesolver._ge_beam3_g3c_physical_authority as definition_module
26
+ from anyfesolver._ge_beam3_g3c_physical_authority import expand
27
+ from anyfesolver._ge_beam3_g3c_physical_authority import command
28
+ from anyfesolver._ge_beam3_g3c_physical_authority import CONTRACT_SHA
29
+ from anyfesolver._ge_beam3_g3c_physical_authority import U
30
+ from anyfesolver._ge_beam3_g3c_physical_authority import SHIFT
31
+ from anyfesolver._ge_beam3_g1_analysis import runtime_digest
32
+ from anyfesolver._ge_beam3_g1_elastic import ElasticSection
33
+ from anyfesolver._ge_beam3_g1_elastic import canonical
34
+ from anyfesolver._ge_beam3_g1_elastic import owned
35
+ from anyfesolver._ge_beam3_g1_elastic import sha
36
+ from anyfesolver._ge_beam3_g1_elastic import solve
37
+ from anyfesolver._ge_beam3_centered_reference import CenteredCurvedBeam3ReferenceGeometry as Reference
38
+ from anyfesolver._ge_beam3_mixed_ad import Jet2
39
+ from anyfesolver._ge_beam3_mixed_ad import constant_matrix
40
+ from anyfesolver._ge_beam3_mixed_ad import matmul
41
+ from anyfesolver._ge_beam3_g3c_so3_numerics import so3_exp
42
+ from anyfesolver._ge_beam3_g3c_so3_numerics import so3_log
43
+ from anyfesolver._ge_beam3_mixed_ad import rotation_log
44
+ from anyfesolver.fe_core import FEModel
45
+
46
+ POLICY='GE_BEAM3_G3C_PHYSICAL_MIXED_ELASTIC_OWNER_V1'
47
+ SCHEMA='GE_BEAM3_G3C_PHYSICAL_MIXED_ELASTIC_STATE_V1'
48
+ ENVIRONMENT='2ce154b866565e1d03019651b1ae7fdd070e5554f38d72adf21d8080558b6756'
49
+
50
+ def progress(stage):
51
+ print('G3C CHECKPOINT '+stage,flush=True)
52
+
53
+ def dispatch():
54
+ modules=(native_module,operator_module,beam_module,shell_module,joint_module,
55
+ state_module,legacy_module,rotation_module,physical_b2,physical_q4,q4_registry,
56
+ *definition_module.runtime_modules(),sys.modules[__name__])
57
+ found=[]
58
+ def functions(name,value):
59
+ if isinstance(value,property):
60
+ return [(name+'.'+k,fn) for k,fn in (('get',value.fget),('set',value.fset),('del',value.fdel)) if fn is not None]
61
+ if isinstance(value,(staticmethod,classmethod)): value=value.__func__
62
+ return [(name,value)] if inspect.isfunction(value) else []
63
+ for module in modules:
64
+ for name,value in sorted(vars(module).items()):
65
+ made=functions(name,value)
66
+ if inspect.isclass(value):
67
+ # Include imported classes and inherited methods/properties,
68
+ # notably Reference and ElasticSection, not just local classes.
69
+ for base in value.__mro__:
70
+ for method,fn in sorted(vars(base).items()):
71
+ made.extend(functions(name+'.'+base.__module__+'.'+base.__qualname__+'.'+method,fn))
72
+ for name,fn in made:
73
+ # Code objects are immutable; replacing __code__ changes this
74
+ # identity. marshal encodings are not an identity primitive.
75
+ found.append((module.__name__,name,fn,id(fn.__code__)))
76
+ found.extend(definition_module.runtime_constants())
77
+ return tuple(found)
78
+
79
+ def close(a,b,label):
80
+ a,b=np.asarray(a),np.asarray(b)
81
+ if not np.isfinite(a).all() or not np.isfinite(b).all() or np.linalg.norm(a-b)>1e-11*max(1.,np.linalg.norm(a),np.linalg.norm(b)):
82
+ raise ValueError(label)
83
+
84
+ def physical_equal(a,b,label):
85
+ a,b=np.asarray(a),np.asarray(b)
86
+ scale=np.linalg.norm(a)+np.linalg.norm(b)
87
+ error=np.linalg.norm(a-b)
88
+ if not np.isfinite(a).all() or not np.isfinite(b).all() or (error>1e-11*scale if scale else error!=0):
89
+ raise ValueError(label)
90
+
91
+ def recovery_witness(family,trial):
92
+ """Bind actual detached recovery, never a claimed recovery-complete flag."""
93
+ if family=='B2':
94
+ force=np.einsum('i,ijk,ij->k',trial.weights,trial.chart_strain_differential,trial.resultants)
95
+ physical_equal(force,trial.chart_force,'B2 physical station work')
96
+ energy=.5*float(np.einsum('i,ij,ij->',trial.weights,trial.strains,trial.resultants))
97
+ physical_equal(energy,trial.energy,'B2 physical energy')
98
+ witness=(trial.strains,trial.resultants,trial.chart_strain_differential,
99
+ trial.weights,trial.reference_frame,trial.current_frame,trial.energy)
100
+ elif family=='Q4':
101
+ force=sum(st.weight*st.chart_first.T@st.resultant for st in trial.stations)
102
+ hessian=sum(st.weight*(st.chart_first.T@st.constitutive@st.chart_first+
103
+ np.einsum('i,ijk->jk',st.resultant,st.chart_second)) for st in trial.stations)
104
+ physical_equal(force,trial.physical_chart_force,'Q4 physical station work')
105
+ physical_equal(hessian,trial.physical_chart_hessian,'Q4 physical station Hessian')
106
+ condensed=(trial.direct_chart_hessian
107
+ -trial.internal_coupling64.T@trial.internal_inverse64@trial.internal_coupling64)
108
+ physical_equal(condensed,trial.schur_chart_hessian,'Q4 full64 Schur')
109
+ physical_equal(trial.schur_chart_hessian,trial.physical_chart_hessian,
110
+ 'Q4 condensed/physical Hessian')
111
+ physical_equal(trial.source_stationary_matrix@trial.source_solution,
112
+ trial.source_coupling.T,'Q4 source35 stationarity')
113
+ physical_equal(trial.internal_block64@trial.internal_inverse64,np.eye(64),'Q4 right inverse')
114
+ physical_equal(trial.internal_inverse64@trial.internal_block64,np.eye(64),'Q4 left inverse')
115
+ for st in trial.stations:
116
+ physical_equal(st.constitutive@st.strain,st.resultant,'Q4 constitutive recovery')
117
+ witness=(trial.stations,trial.internal_block64,trial.internal_inverse64,
118
+ trial.internal_coupling64,trial.direct_chart_hessian,
119
+ trial.schur_chart_hessian,trial.internal_residual64,trial.physical_energy)
120
+ elif family=='B3':
121
+ witness=trial.station_diagnostics
122
+ if witness is None: raise ValueError('missing B3 physical recovery')
123
+ elif family=='S3':
124
+ witness=trial.channels
125
+ if not witness: raise ValueError('missing S3 recovery channels')
126
+ else: raise ValueError('foreign recovery family')
127
+ return physical_q4._fingerprint(witness)
128
+
129
+
130
+ def native_payload(body):
131
+ # Only called on bytes already owned by this generation, never an import.
132
+ value=json.loads(canonical(body))
133
+ value['history']=(); value['response']['history']=()
134
+ return value
135
+
136
+ @dataclass(frozen=True)
137
+ class Generation:
138
+ state: bytes
139
+ history: bytes
140
+ state_sha256: str
141
+ history_sha256: str
142
+
143
+ def generation(state,history):
144
+ raw=canonical(state); journal=canonical(history)
145
+ if len(raw)+len(journal)>8388608: raise ValueError('generation byte bound')
146
+ return Generation(raw,journal,sha256(raw).hexdigest(),sha256(journal).hexdigest())
147
+
148
+ class MixedGraphOwner:
149
+ __slots__=('_definition','_expanded','_programs','_seal','_runtime','_dispatch',
150
+ '_published','_initial','_initial_generation','_fixture_identity',
151
+ '_q4_cache','_owned_q4_cache','_lock','_owned_lock','_active','_serial','_poisoned')
152
+ def __setattr__(self,name,value): raise AttributeError('owned graph attributes are immutable')
153
+ def __delattr__(self,name): raise AttributeError('owned graph attributes are immutable')
154
+
155
+ def __init__(self,fixture_id='J_B2_PAIR',variant='BASE',common_motion='NONE',*,
156
+ policy=POLICY,operator_graph_id='GE_BEAM3_G3C_PHYSICAL_OPERATOR_GRAPH_V1',
157
+ state_schema=SCHEMA):
158
+ if type(self) is not MixedGraphOwner: raise ValueError('exact owner required')
159
+ if (type(policy) is not str or policy!=POLICY or type(state_schema) is not str
160
+ or state_schema!=SCHEMA or type(operator_graph_id) is not str
161
+ or operator_graph_id!='GE_BEAM3_G3C_PHYSICAL_OPERATOR_GRAPH_V1'):
162
+ raise ValueError('historical or foreign physical owner identity')
163
+ definition,expanded,programs=expand(fixture_id,variant,common_motion)
164
+ for name,value in dict(_definition=canonical(definition),_expanded=canonical(expanded),
165
+ _programs=canonical(programs),_runtime=sha(dict(source=runtime_digest(),environment=ENVIRONMENT,physical=definition_module.runtime_identity())),
166
+ _dispatch=dispatch(),_lock=threading.Lock(),_active=None,_serial=0,_poisoned=False).items():
167
+ object.__setattr__(self,name,value)
168
+ object.__setattr__(self,'_owned_lock',self._lock)
169
+ object.__setattr__(self,'_fixture_identity',(fixture_id,variant,common_motion))
170
+ object.__setattr__(self,'_seal',sha((self._definition.hex(),self._expanded.hex(),self._programs.hex())))
171
+ # Cache only accepted immutable reference operators, never states or replay answers.
172
+ cache=tuple((e['id'],physical_q4.AffineQ4PhysicalRecovery(fixture_id+'::'+variant))
173
+ for e in expanded['graph']['elements'] if e['family']=='Q4')
174
+ object.__setattr__(self,'_q4_cache',cache)
175
+ object.__setattr__(self,'_owned_q4_cache',cache)
176
+ self._check_q4_registry()
177
+ progress('initialization')
178
+ g=expanded['graph']; n=len(g['nodes']); zero=np.zeros(6*n); q=np.tile(np.eye(3),(n,1,1))
179
+ model,elements,states=self._native_model(None)
180
+ rows=self._adapter_rows(zero,q,q,epoch=0,previous=None,check=lambda stage:None)[2]
181
+ initial=dict(schema=SCHEMA,epoch=0,definition_sha256=sha(definition),previous_sha256=None,
182
+ total_u=zero,rotations=q,native_rows=[dict(element_id=e.element_id,payload=states[e.element_id]) for e in elements],
183
+ adapter_rows=rows,multipliers=np.zeros(6*(len(g['fixed_nodes'])+len(g['joints']))))
184
+ made=generation(initial,[])
185
+ object.__setattr__(self,'_published',made); object.__setattr__(self,'_initial',made.state_sha256)
186
+ object.__setattr__(self,'_initial_generation',made)
187
+ self._guard(full=True)
188
+ # Analytical component rigid spaces, not a stiffness eigenvalue cutoff.
189
+ rows,H=self._constraints(zero,q,np.zeros(len(initial['multipliers'])),None)
190
+ J=H[len(zero):,:len(zero)]
191
+ components=[]
192
+ for e in g['elements']:
193
+ touching=[c for c in components if set(e['nodes']) & c]
194
+ merged=set(e['nodes'])
195
+ for c in touching: merged.update(c); components.remove(c)
196
+ components.append(merged)
197
+ ids=[r[0] for r in g['nodes']]; X=np.array([r[1] for r in g['nodes']],dtype=float)
198
+ R=np.zeros((6*n,6*len(components)))
199
+ for c,nodes in enumerate(components):
200
+ origin=X[ids.index(min(nodes))]
201
+ for node in nodes:
202
+ i=ids.index(node); R[6*i:6*i+3,6*c:6*c+3]=np.eye(3)
203
+ R[6*i:6*i+3,6*c+3:6*c+6]=np.column_stack([np.cross(a,X[i]-origin) for a in np.eye(3)])
204
+ R[6*i+3:6*i+6,6*c+3:6*c+6]=np.eye(3)
205
+ JR=J@R; singular=np.linalg.svd(JR,compute_uv=False)
206
+ floor=64*np.finfo(float).eps*max(JR.shape)*max(1.,singular[0])
207
+ if len(singular)<R.shape[1] or singular[-1]<=floor: raise ValueError('unsupported component rigid space')
208
+
209
+ def _guard(self,origin=None,*,full=False,lock=None,nonce=None):
210
+ try:
211
+ current=dispatch()
212
+ if current!=self._dispatch:
213
+ before={(m,n):(f,c) for m,n,f,c in self._dispatch}
214
+ after={(m,n):(f,c) for m,n,f,c in current}
215
+ names=sorted(k for k in before.keys()|after.keys() if before.get(k)!=after.get(k))
216
+ raise ValueError('runtime dispatch changed: '+repr(names[:5]))
217
+ definition=json.loads(self._definition); journal=json.loads(self._published.history)
218
+ initial=self._initial_generation
219
+ initial_link=self._published.state_sha256 if not journal else journal[0].get('origin_sha256')
220
+ if (type(self) is not MixedGraphOwner or self._poisoned or
221
+ self._lock is not self._owned_lock or self._q4_cache is not self._owned_q4_cache or
222
+ (lock is not None and (self._lock is not lock or not lock.locked())) or
223
+ (nonce is not None and self._active is not nonce) or
224
+ U!=((0,-1,0),(1,0,0),(0,0,1)) or SHIFT!=(2,-3,1) or
225
+ definition_module.U!=U or definition_module.SHIFT!=SHIFT or
226
+ sha((self._definition.hex(),self._expanded.hex(),self._programs.hex()))!=self._seal or
227
+ tuple(definition.get(k) for k in ('fixture_id','variant','common_motion'))!=self._fixture_identity or
228
+ (origin is not None and self._published is not origin) or
229
+ type(initial) is not Generation or self._initial!=initial.state_sha256 or
230
+ sha256(initial.state).hexdigest()!=initial.state_sha256 or
231
+ sha256(initial.history).hexdigest()!=initial.history_sha256 or initial.history!=b'[]\n' or
232
+ initial_link!=self._initial or
233
+ sha256(self._published.state).hexdigest()!=self._published.state_sha256 or
234
+ sha256(self._published.history).hexdigest()!=self._published.history_sha256):
235
+ raise ValueError('captured graph/runtime/generation changed')
236
+ self._check_q4_registry()
237
+ if full:
238
+ definition,expanded,programs=expand(**{k:json.loads(self._definition)[k] for k in ('fixture_id','variant','common_motion')})
239
+ if (canonical(definition)!=self._definition or canonical(expanded)!=self._expanded or
240
+ canonical(programs)!=self._programs or sha(dict(source=runtime_digest(),environment=ENVIRONMENT,physical=definition_module.runtime_identity()))!=self._runtime):
241
+ raise ValueError('frozen source or definition changed')
242
+ # Registry/authority/dispatch observations are fallible. Validate
243
+ # capabilities AGAIN after them; an observer cannot replace the
244
+ # nonce or release/replace the acquired lock in the last window.
245
+ if dispatch()!=self._dispatch:
246
+ raise ValueError('runtime dispatch changed during guard')
247
+ if (self._poisoned or self._lock is not self._owned_lock
248
+ or self._q4_cache is not self._owned_q4_cache
249
+ or (lock is not None and (self._lock is not lock or not lock.locked()))
250
+ or (nonce is not None and self._active is not nonce)
251
+ or (origin is not None and self._published is not origin)):
252
+ raise ValueError('captured capability changed during guard')
253
+ except BaseException:
254
+ object.__setattr__(self,'_poisoned',True)
255
+ raise
256
+
257
+ @property
258
+ def size(self): return 6*len(json.loads(self._expanded)['graph']['nodes'])
259
+
260
+ def snapshot_bytes(self):
261
+ # Diagnostic snapshot only; no import/restart API until full preflight gate.
262
+ lock=self._owned_lock
263
+ if not lock.acquire(False): raise RuntimeError('owner in use')
264
+ try:
265
+ self._guard(full=True,lock=lock)
266
+ return canonical(dict(kind='UNQUALIFIED_G3C_GENERATION_DIAGNOSTIC',
267
+ state=json.loads(self._published.state),history=json.loads(self._published.history),
268
+ state_sha256=self._published.state_sha256,history_sha256=self._published.history_sha256))
269
+ finally: lock.release()
270
+
271
+ def _native_model(self,state):
272
+ data=json.loads(self._expanded); g=data['graph']; ids=[r[0] for r in g['nodes']]
273
+ points={n:np.asarray(x,dtype=float) for n,x in g['nodes']}; model=FEModel('private G3c sandbox')
274
+ for n in ids: model.add_node(n,*points[n])
275
+ elements=[]
276
+ for row in g['elements']:
277
+ if row['family']!='NATIVE': continue
278
+ x=np.array([points[n] for n in row['nodes']]); axis=x[2]-x[0]; axis/=np.linalg.norm(axis)
279
+ direction=np.array(row['orientation'],dtype=float); direction-=axis*(axis@direction); direction/=np.linalg.norm(direction)
280
+ frame=np.column_stack((axis,direction,np.cross(axis,direction)))
281
+ if row['roll_radians']!=0: raise ValueError('unregistered fixture roll')
282
+ e=native_module.ElasticElement(row['id'],tuple(row['nodes']),Reference(x,np.tile(frame,(3,1,1))),
283
+ ElasticSection.isotropic(**data['definitions']['native']),order=4)
284
+ model.add_element(e.element_id,e); model.materials[e.material_name]=e.section; elements.append(e)
285
+ from anyfesolver.matrix_assembly import _get_cached_sparsity_pattern
286
+ _get_cached_sparsity_pattern(model.mesh,'tangent_stiffness')
287
+ if model.mesh.dof_manager.total_dofs!=6*len(ids): raise ValueError('global DOF allocation changed')
288
+ states=({e.element_id:e.init_model_bound_nonlinear_state(model.mesh,e.section,1) for e in elements}
289
+ if state is None else {r['element_id']:native_payload(r['payload']) for r in state['native_rows']})
290
+ return model,tuple(elements),states
291
+
292
+ def _check_q4_registry(self):
293
+ data=json.loads(self._expanded); definition=json.loads(self._definition)
294
+ points=dict(data['graph']['nodes'])
295
+ expected=[e for e in data['graph']['elements'] if e['family']=='Q4']
296
+ if tuple(e['id'] for e in expected)!=tuple(i for i,_ in self._q4_cache):
297
+ raise ValueError('foreign Q4 cache membership')
298
+ direction=[1.,0.,0.] if definition['variant']!='PROPER_GLOBAL_TRANSFORM' else [0.,1.,0.]
299
+ for row,(eid,local) in zip(expected,self._q4_cache):
300
+ desc=local.descriptor()
301
+ if (type(local) is not physical_q4.AffineQ4PhysicalRecovery
302
+ or desc['construction_id']!=definition['fixture_id']+'::'+definition['variant']
303
+ or tuple(desc['node_ids'])!=tuple(row['nodes'])
304
+ or desc['coordinates']!=[points[n] for n in row['nodes']]
305
+ or desc['normal']!=data['definitions']['shell']['reference_normal']
306
+ or desc['material_direction']!=direction):
307
+ raise ValueError('graph and registered Q4 definition disagree')
308
+
309
+ def _adapter_rows(self,total,qa,q,*,epoch,previous,check):
310
+ data=json.loads(self._expanded); g=data['graph']; ids=[r[0] for r in g['nodes']]
311
+ points={n:np.array(x,dtype=float) for n,x in g['nodes']}; size=6*len(ids)
312
+ force=np.zeros(size); H=np.zeros((size,size)); envelopes=[]; diagnostics={}
313
+ previous_rows={} if previous is None else {r['element_id']:r for r in previous['adapter_rows']}
314
+ anchors={r['element_id']:r['anchor_node'] for r in data['anchors']}
315
+ origin=None if previous is None else sha(previous)
316
+ for row in g['elements']:
317
+ if row['family']=='NATIVE': continue
318
+ indices=[ids.index(n) for n in row['nodes']]; dofs=np.array([6*i+j for i in indices for j in range(6)])
319
+ x=np.array([points[n] for n in row['nodes']]); u=total[dofs].copy()
320
+ if previous is not None:
321
+ u.reshape(-1,6)[:,3:]-=np.asarray(previous['total_u'])[dofs].reshape(-1,6)[:,3:]
322
+ if row['family'] in ('B2','B3'):
323
+ d=data['definitions']['legacy']
324
+ section={k:d[k] for k in ('area','Iy','Iz','J','shear_factor_y','shear_factor_z','orientation')}
325
+ local=(physical_b2.PhysicalB2Adapter(tuple(row['nodes']),x,anchors[row['id']],d['E'],d['nu'],section)
326
+ if row['family']=='B2' else
327
+ beam_module.LocalBeam('B3',tuple(row['nodes']),x,anchors[row['id']],d['E'],d['nu'],section))
328
+ trial=local.evaluate(u,owned(qa[indices])); diagnostic_hash=None
329
+ elif row['family']=='Q4':
330
+ self._check_q4_registry()
331
+ local=dict(self._q4_cache)[row['id']]
332
+ trial=local.evaluate(u,owned(qa[indices]))
333
+ diagnostic_hash=sha256(trial.candidate).hexdigest()
334
+ else:
335
+ direction=np.array([1.,0.,0.])
336
+ if json.loads(self._definition)['variant']=='PROPER_GLOBAL_TRANSFORM': direction=np.asarray(U)@direction
337
+ local=shell_module.LocalShell('S3-V2D',tuple(row['nodes']),x,
338
+ np.array(data['definitions']['shell']['reference_normal'],dtype=float),direction)
339
+ trial=local.evaluate(u,owned(qa[indices])); diagnostic_hash=sha256(trial.candidate).hexdigest()
340
+ close(trial.kinematics.rotations,q[indices],'local physical pose mismatch')
341
+ force[dofs]+=trial.chart_force; H[np.ix_(dofs,dofs)]+=trial.chart_hessian
342
+ envelopes.append(dict(**definition_module.envelope_identities(row['family']),
343
+ recovery_witness_sha256=recovery_witness(row['family'],trial),
344
+ element_id=row['id'],policy=data['local_policies'][row['family']],
345
+ definition_sha256=trial.definition_sha256,epoch=epoch,
346
+ previous_sha256=None if previous is None else sha(previous_rows[row['id']]),
347
+ origin_sha256=origin,pose_sha256=sha(dict(node_ids=row['nodes'],
348
+ total_translations=total[dofs].reshape(-1,6)[:,:3],rotations=q[indices])),
349
+ deformation=trial.kinematics.deformation,diagnostic_sha256=diagnostic_hash,
350
+ source_material_committed=False,physical_recovery_complete=False))
351
+ diagnostics[row['id']]=trial
352
+ check('family:'+str(row['id']))
353
+ return owned(force),owned(H),envelopes,diagnostics
354
+
355
+ def _targets(self,cmd):
356
+ definition=json.loads(self._definition); programs=json.loads(self._programs)
357
+ motion=definition['common_motion']; W=np.eye(3); t=np.zeros(3)
358
+ if motion!='NONE' and cmd is not None:
359
+ s=cmd['step']/4 if cmd['kind']=='PREPARE_COMMON_MOTION' else 1.
360
+ W=rotation_module.rotation_exponential(s*np.array(programs['common_rotation_vectors'][int(motion[-1])]))
361
+ t=s*np.array(SHIFT,dtype=float)
362
+ if definition['variant']=='PROPER_GLOBAL_TRANSFORM':
363
+ transform=np.array(U,dtype=float); W=transform@W@transform.T
364
+ t=transform@t+np.array(SHIFT)-W@np.array(SHIFT)
365
+ root=np.eye(3); force=np.zeros(3)
366
+ if cmd is not None and cmd['kind']=='LOAD_STAGE':
367
+ v1,v2=np.array(programs['root_increment_vectors'],dtype=float)
368
+ if definition['variant']=='PROPER_GLOBAL_TRANSFORM': v1=np.asarray(U)@v1; v2=np.asarray(U)@v2
369
+ r1=rotation_module.rotation_exponential(v1); r2=rotation_module.rotation_exponential(v2)
370
+ root=[np.eye(3),r1,r2@r1,r1,np.eye(3)][cmd['root_stage']]
371
+ force=cmd['load_factor']*cmd['force_scale']*np.asarray(programs['force'])
372
+ if definition['variant']=='PROPER_GLOBAL_TRANSFORM': force=np.asarray(U)@force
373
+ force=W@force
374
+ return W,t,root,force
375
+
376
+ def _constraints(self,total,qa,mu,cmd):
377
+ g=json.loads(self._expanded)['graph']; ids=[r[0] for r in g['nodes']]; X=np.array([r[1] for r in g['nodes']],dtype=float)
378
+ size=6*len(ids); count=6*(len(g['fixed_nodes'])+len(g['joints']))
379
+ residual=np.zeros(size+count); tangent=np.zeros((size+count,size+count))
380
+ previous=np.asarray(json.loads(self._published.state)['total_u'])
381
+ eta=(total-previous).reshape(-1,6)[:,3:]; W,t,root,_=self._targets(cmd)
382
+ for k,node in enumerate(g['fixed_nodes']):
383
+ i=ids.index(node); target=W@(root if k==0 else np.eye(3)); xtarget=W@X[i]+t
384
+ z=[Jet2.variable(float(total[6*i+j]),j,6) for j in range(6)]
385
+ dq=[z[j+3]-float(previous[6*i+j+3]) for j in range(3)]
386
+ made=matmul(constant_matrix(target.T,6),matmul(so3_exp(dq),constant_matrix(qa[i],6)))
387
+ rows=[z[j]+float(X[i,j])-float(xtarget[j]) for j in range(3)]+so3_log(made)
388
+ J=np.array([v.gradient for v in rows]); h=np.einsum('i,ijk->jk',mu[6*k:6*k+6],np.array([v.hessian for v in rows]))
389
+ idx=np.arange(6*i,6*i+6); m=np.arange(size+6*k,size+6*k+6)
390
+ residual[idx]+=J.T@mu[6*k:6*k+6]; residual[m]=[v.value for v in rows]
391
+ tangent[np.ix_(idx,idx)]+=h; tangent[np.ix_(idx,m)]+=J.T; tangent[np.ix_(m,idx)]+=J
392
+ for j,row in enumerate(g['joints']):
393
+ ij=[ids.index(row['master']),ids.index(row['slave'])]; k=len(g['fixed_nodes'])+j
394
+ d0=np.array([row['master_frame'],row['slave_frame']],dtype=float)
395
+ joint=joint_module.RigidPoseJoint(X[ij],d0)
396
+ result=joint.evaluate_ports(X[ij]+total.reshape(-1,6)[ij,:3],qa[ij]@d0,
397
+ owned(mu[6*k:6*k+6]),rotation_coordinates=owned(eta[ij]),charted_ports=(True,True))
398
+ idx=np.array([6*i+l for i in ij for l in range(6)]+list(range(size+6*k,size+6*k+6)))
399
+ residual[idx]+=result.residual; tangent[np.ix_(idx,idx)]+=result.tangent
400
+ return owned(residual),owned(tangent)
401
+
402
+ def _evaluate(self,total,mu,cmd,origin,check):
403
+ self._guard(origin); state=json.loads(origin.state); total=owned(total,(self.size,))
404
+ qa=owned(state['rotations']); previous=owned(state['total_u']); delta=(total-previous).reshape(-1,6)[:,3:]
405
+ if np.any(np.linalg.norm(delta,axis=1)>=.9*np.pi): raise ValueError('trial chart requires cutback')
406
+ q=owned([rotation_module.rotation_exponential(v)@a for v,a in zip(delta,qa)])
407
+ model,elements,states=self._native_model(state); g=json.loads(self._expanded)['graph']; ids=[r[0] for r in g['nodes']]
408
+ X=np.array([r[1] for r in g['nodes']],dtype=float); coordinates=X+total.reshape(-1,6)[:,:3]
409
+ store=state_module.NonlinearStateStore.from_shell_layouts((),states)
410
+ store.attach_native_rotation_store(state_module.create_model_native_rotation_store(model,states,previous))
411
+ token=store.begin_trial(full_displacement=total,full_coordinates=coordinates)
412
+ force=np.zeros(self.size); H=np.zeros((self.size,self.size))
413
+ try:
414
+ for e in elements:
415
+ mapping=e.get_dof_mapping(model.mesh); indices=[ids.index(n) for n in e.node_ids]
416
+ e._load=(store,owned(np.zeros(3)),owned(np.zeros(3)))
417
+ def guard(e=e):
418
+ self._guard(origin)
419
+ if e._load is None or e._load[0] is not store or np.any(e._load[1]) or np.any(e._load[2]):
420
+ raise ValueError('sandbox native load authority')
421
+ e._owner_guard=guard
422
+ view=store.native_element_rotation_view(token,e.element_id,e.node_ids,e.native_reference_directors(model.mesh))
423
+ if not np.array_equal(view.trial_rotation_matrices,q[indices]): raise ValueError('native subset pose differs')
424
+ f,K,candidate=e.compute_nonlinear_response(model.mesh,e.section,total[mapping],states[e.element_id],1,True,
425
+ native_rotation_trial=view,native_material_context=store.native_material_context(token,e.element_id))
426
+ if candidate['epoch']!=state['epoch']+1: raise ValueError('material epoch reset')
427
+ store.set_trial_state(token,e.element_id,candidate)
428
+ force[mapping]+=f; H[np.ix_(mapping,mapping)]+=K; check('native:'+str(e.element_id))
429
+ f,K,rows,diagnostics=self._adapter_rows(total,qa,q,epoch=state['epoch']+1,previous=state,check=check)
430
+ force+=f; H+=K
431
+ _,_,_,load=self._targets(cmd); i=ids.index(g['load_node']); force[6*i:6*i+3]-=load
432
+ r,A=self._constraints(total,qa,mu,cmd); r=r.copy(); A=A.copy()
433
+ r[:self.size]+=force; A[:self.size,:self.size]+=H
434
+ check('assembly')
435
+ next_state=dict(schema=SCHEMA,epoch=state['epoch']+1,definition_sha256=sha(json.loads(self._definition)),
436
+ previous_sha256=origin.state_sha256,total_u=total,rotations=q,
437
+ native_rows=[dict(element_id=e.element_id,payload=store.materialize(trial_token=token)[e.element_id]) for e in elements],
438
+ adapter_rows=rows,multipliers=mu)
439
+ return owned(r),owned(A),next_state,(store,token,coordinates),diagnostics
440
+ except BaseException:
441
+ if store.has_active_trial: store.discard_trial(token)
442
+ raise
443
+
444
+ @staticmethod
445
+ def _discard(sandbox):
446
+ store,token,_=sandbox
447
+ if store.has_active_trial: store.discard_trial(token)
448
+
449
+ def trial(self,total,multipliers,cmd,*,hook=None):
450
+ """Nonpublishing diagnostic; no caller origin or candidate-state import."""
451
+ return self._run(cmd,total,multipliers,hook=hook,solve_graph=False)
452
+
453
+ def solve(self,cmd,*,hook=None):
454
+ return self._run(cmd,None,None,hook=hook,solve_graph=True)
455
+
456
+ def _run(self,cmd,total,mu,*,hook,solve_graph):
457
+ if type(self) is not MixedGraphOwner or (hook is not None and not callable(hook)): raise ValueError('exact owner/callback')
458
+ lock=self._owned_lock
459
+ if not lock.acquire(False): raise RuntimeError('owner already in use')
460
+ sandbox=None; start=monotonic(); origin=self._published
461
+ try:
462
+ self._guard(origin,full=True,lock=lock)
463
+ history=json.loads(origin.history); state=json.loads(origin.state)
464
+ cmd=command(cmd,history,json.loads(self._definition)['common_motion'])
465
+ total=owned(state['total_u'] if total is None else total,(self.size,)).copy()
466
+ count=len(state['multipliers']); mu=owned(np.zeros(count) if mu is None else mu,(count,)).copy()
467
+ nonce=object(); object.__setattr__(self,'_active',nonce); object.__setattr__(self,'_serial',self._serial+1)
468
+ def check(stage):
469
+ if monotonic()-start>=600: raise TimeoutError('graph child deadline')
470
+ if self._active is not nonce: raise ValueError('foreign/stale graph trial capability')
471
+ self._guard(origin,lock=lock,nonce=nonce)
472
+ if hook is not None:
473
+ hook(stage)
474
+ self._guard(origin,full=True,lock=lock,nonce=nonce)
475
+ if self._active is not nonce: raise ValueError('changed graph trial capability')
476
+ progress(stage)
477
+ self._guard(origin,lock=lock,nonce=nonce)
478
+ check('pose')
479
+ if solve_graph and cmd['kind']=='PREPARE_COMMON_MOTION':
480
+ W,t,_,_=self._targets(cmd); X=np.asarray([r[1] for r in json.loads(self._expanded)['graph']['nodes']],dtype=float)
481
+ total.reshape(-1,6)[:,:3]=(X@W.T+t)-X
482
+ for i,qa in enumerate(np.asarray(state['rotations'])):
483
+ total[6*i+3:6*i+6]+=rotation_log(W@qa.T)
484
+ # A successful line-search evaluation is already the exact trial
485
+ # needed by the next Newton iteration. Keep that one owned
486
+ # sandbox locally until it is either committed or discarded;
487
+ # recomputing it used to repeat every element, joint and recovery
488
+ # evaluation without adding an observation or safety boundary.
489
+ pending_evaluation=None
490
+ for iteration in range(25):
491
+ if pending_evaluation is None:
492
+ r,A,next_state,sandbox,diagnostics=self._evaluate(total,mu,cmd,origin,check)
493
+ else:
494
+ r,A,next_state,sandbox,diagnostics=pending_evaluation
495
+ pending_evaluation=None
496
+ if not solve_graph:
497
+ result=dict(residual=r,tangent=A,candidate=canonical(next_state),
498
+ diagnostics=diagnostics,production_qualified=False,state_committed=False)
499
+ return result
500
+ error=float(np.linalg.norm(r))
501
+ if error<=1e-11:
502
+ check('prepare')
503
+ pending={r['element_id']:native_payload(r['payload']) for r in next_state['native_rows']}
504
+ store,token,coordinates=sandbox
505
+ store.commit(token,accepted_full_displacement=total,accepted_full_coordinates=coordinates)
506
+ check('native_committed')
507
+ if canonical(store.materialize())!=canonical(pending): raise ValueError('native commit changed prepared state')
508
+ entry=dict(epoch=next_state['epoch'],previous_entry_sha256=None if not history else sha(history[-1]),
509
+ origin_sha256=origin.state_sha256,command=cmd,accepted_state_sha256=sha(next_state))
510
+ made=generation(next_state,history+[entry])
511
+ result=dict(total_u=owned(total),rotations=owned(next_state['rotations']),multipliers=owned(mu),
512
+ residual=r,iterations=iteration,state_sha256=made.state_sha256,epoch=next_state['epoch'],
513
+ production_qualified=False,physical_recovery_complete=False)
514
+ check('before_publish'); self._guard(origin,full=True,lock=lock,nonce=nonce)
515
+ # All sandbox work is terminal before the sole publication.
516
+ # The finally path now only clears an owned nonce/releases
517
+ # the already-held primitive lock; no family dispatch remains.
518
+ sandbox=None
519
+ object.__setattr__(self,'_active',None)
520
+ object.__setattr__(self,'_published',made)
521
+ return result
522
+ self._discard(sandbox); sandbox=None
523
+ if iteration==24: raise ValueError('graph iteration limit')
524
+ step=solve(A,-r)
525
+ # Sixteen binary reductions retain the registered Newton
526
+ # direction while allowing a large KKT step to enter the
527
+ # admissible rotation chart before testing residual descent.
528
+ # This is still bounded (at most sixteen trial evaluations).
529
+ for cut in range(16):
530
+ check('line_search'); fraction=.5**cut
531
+ trial=total+fraction*step[:self.size]; multipliers=mu+fraction*step[self.size:]
532
+ try:
533
+ changed,trial_A,trial_state,sandbox,trial_diagnostics=self._evaluate(
534
+ trial,multipliers,cmd,origin,check)
535
+ except ValueError as exc:
536
+ # The chart ceiling is a trial-admissibility boundary,
537
+ # not a failure of the accepted state. Backtracking is
538
+ # the registered cutback mechanism. Catch only this
539
+ # exact typed diagnostic; every mechanics, state, and
540
+ # authority error remains fatal.
541
+ if str(exc)!='trial chart requires cutback': raise
542
+ sandbox=None
543
+ continue
544
+ trial_error=float(np.linalg.norm(changed))
545
+ if trial_error<error:
546
+ pending_evaluation=(changed,trial_A,trial_state,sandbox,trial_diagnostics)
547
+ total=trial; mu=multipliers; break
548
+ self._discard(sandbox); sandbox=None
549
+ else: raise ValueError('graph line search failed')
550
+ raise ValueError('unreachable graph solve')
551
+ finally:
552
+ if sandbox is not None: self._discard(sandbox)
553
+ object.__setattr__(self,'_active',None)
554
+ # A hostile observer may already have released this primitive.
555
+ # Never release a replacement read back from the owner.
556
+ if lock.locked(): lock.release()
@@ -0,0 +1,91 @@
1
+ """Private source-native scalar recovery diagnostics; not qualification."""
2
+ from dataclasses import dataclass
3
+ import numpy as np
4
+
5
+ from ._ge_beam3_g3c_local_beam import owned
6
+
7
+ POLICY = 'GE_BEAM3_G3C_SCALAR_LOCAL_RECOVERY_V1'
8
+ ORDER = ('eps_x', 'gamma_xy', 'gamma_xz', 'kappa_x', 'kappa_y', 'kappa_z')
9
+ RESULTANT_ORDER = ('N', 'Vy', 'Vz', 'T', 'My', 'Mz')
10
+
11
+ class PhysicalRecoveryBlocked(ValueError):
12
+ """The unchanged operator cannot support the claimed physical recovery."""
13
+ code = 'BLOCKED_G3C_B2_PHYSICAL_RECOVERY_SHEAR_CLAMP'
14
+
15
+ @dataclass(frozen=True)
16
+ class StationDiagnostics:
17
+ stations: np.ndarray
18
+ weights: np.ndarray
19
+ strains: np.ndarray
20
+ resultants: np.ndarray
21
+ strain_differential: np.ndarray
22
+ reference_frame: np.ndarray
23
+ current_frame: np.ndarray
24
+ energy: float
25
+ definition_sha256: str
26
+ policy: str = POLICY
27
+ strain_order: tuple = ORDER
28
+ resultant_order: tuple = RESULTANT_ORDER
29
+
30
+ def recover(definition, kin, transform, element, material, seal):
31
+ """Recover the scalar potential, never the legacy linear stress envelope.
32
+
33
+ Called only with a fresh, already evaluated local element. Differential
34
+ columns refer to local deformation in reference-global coordinates, not
35
+ global spatial nodal wrenches. The caller applies the complete pose map.
36
+ """
37
+ ref=np.array(definition['coordinates']); n=len(ref)
38
+ L=float(np.linalg.norm(ref[-1]-ref[0])); section=definition['section']
39
+ E=definition['E']; G=E/(2*(1+definition['nu']))
40
+ S=owned([E*section['area'],G*section['area']*section['shear_factor_y'],
41
+ G*section['area']*section['shear_factor_z'],G*section['J'],
42
+ E*section['Iy'],E*section['Iz']])
43
+ if np.any(S<=0): raise ValueError('nonpositive computed section rigidity')
44
+ points=np.array([-np.sqrt(3/5),0.,np.sqrt(3/5)])
45
+ weights=np.array([5/9,8/9,5/9])*L/2
46
+ local=transform@kin.deformation; rows=[]; jacobians=[]
47
+ if n==2:
48
+ if min(S[1],S[2])*L**2<1e-12:
49
+ raise PhysicalRecoveryBlocked(PhysicalRecoveryBlocked.code)
50
+ # The fresh actual scalar evaluation owns this cache. Do not invent
51
+ # an effective physical section to absorb its historical shear floor.
52
+ K=element._nl_cache['K_noax']; f0=K@local
53
+ slope=(local[6:9]-local[:3])/L
54
+ eps=slope[0]+.5*(slope[1]**2+slope[2]**2)
55
+ deps=np.zeros(12)
56
+ deps[:3]=-np.array([1.,slope[1],slope[2]])/L; deps[6:9]=-deps[:3]
57
+ indices=[9,4,10,5,11]
58
+ q=np.r_[S[0]*eps,f0[indices]]
59
+ dq=np.vstack((S[0]*deps,K[indices]))
60
+ energy=.5*float(local@K@local)+.5*S[0]*L*eps**2
61
+ for xi in points:
62
+ t=(xi+1)/2; H=np.zeros((6,6)); H[0,0]=H[3,1]=1
63
+ H[1,4:6]=-1/L; H[2,2:4]=1/L
64
+ H[4,2:4]=[t-1,t]; H[5,4:6]=[t-1,t]
65
+ rows.append((H@q)/S)
66
+ jacobians.append(((H@dq)/S[:,None])@transform)
67
+ elif n==3:
68
+ values=local.reshape(3,6)
69
+ for xi in points:
70
+ shape=np.array([xi*(xi-1)/2,1-xi**2,xi*(xi+1)/2])
71
+ derivative=np.array([xi-.5,-2*xi,xi+.5])*2/L
72
+ grad=derivative@values; interp=shape@values
73
+ rows.append([grad[0]+.5*(grad[1]**2+grad[2]**2),
74
+ grad[1]-interp[5],grad[2]+interp[4],*grad[3:]])
75
+ B=np.zeros((6,18))
76
+ for i,(Ni,Di) in enumerate(zip(shape,derivative)):
77
+ b=6*i
78
+ B[0,b:b+3]=Di*np.array([1.,grad[1],grad[2]])
79
+ B[1,b+1]=Di; B[1,b+5]=-Ni
80
+ B[2,b+2]=Di; B[2,b+4]=Ni
81
+ B[3,b+3]=B[4,b+4]=B[5,b+5]=Di
82
+ jacobians.append(B@transform)
83
+ energy=.5*float(np.einsum('i,ij,j,ij->',weights,rows,S,rows))
84
+ else: raise ValueError('unregistered scalar recovery family')
85
+ strain=owned(rows); resultant=owned(strain*S); differential=owned(jacobians)
86
+ integrated=.5*float(np.einsum('i,ij,ij->',weights,strain,resultant))
87
+ if not np.isfinite(energy) or not np.isfinite(integrated) or energy<0 or abs(integrated-energy)>1e-11*max(1.,abs(energy),abs(integrated)):
88
+ raise ValueError('station and actual local potential disagree')
89
+ frame=transform[:3,:3].T
90
+ return StationDiagnostics(owned(points),owned(weights),strain,resultant,
91
+ differential,owned(frame),owned(kin.frame@frame),float(energy),seal)