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,497 @@
1
+ """Finite, fixed-order element-local contractions (no BLAS dispatch).
2
+
3
+ Products are split on normalized binary64 mantissas with Dekker's transform;
4
+ both parts are accumulated with ``math.fsum`` in ascending index order.
5
+ No exact-rounding claim is made: scaling a residual into the subnormal range
6
+ can lose at most one minimum subnormal per product, and fsum has its documented
7
+ platform double-rounding limitation. Exact cancellation/empty sums give +0.
8
+ Nonfinite inputs and overflowing individual products or sums are refused,
9
+ even when a wider exact accumulator could cancel an intermediate overflow.
10
+ There is no precision option, persistent result cache or fallback that changes
11
+ a value. Optional compiled kernels (``_compensated_native``, Numba) execute the
12
+ same arithmetic bit for bit; they are enabled only when Numba is present and a
13
+ known-answer self-check at import reproduces the numpy path bitwise (it guards
14
+ against fused multiply-add contraction). Any refusal replays the numpy path so
15
+ the reference exception is raised.
16
+ """
17
+ from math import frexp as _frexp, fsum as _fsum, isfinite as _isfinite, ldexp as _ldexp
18
+
19
+ import os
20
+ from types import MappingProxyType as _MappingProxyType
21
+
22
+ import numpy as np
23
+
24
+ from . import _compensated_native as _native
25
+
26
+ # Compiled kernels run the identical arithmetic (see _compensated_native); a
27
+ # nonzero kernel status replays the vectorised path, which raises the reference
28
+ # exception. ANYSOLVER_NATIVE_CONTRACTIONS=0 forces the numpy path.
29
+ _USE_NATIVE = _native.AVAILABLE and os.environ.get("ANYSOLVER_NATIVE_CONTRACTIONS", "1") != "0"
30
+ # The fused element kernels additionally need their own known-answer match
31
+ # (checked at import below); ANYSOLVER_NATIVE_CONTRACTIONS=0 disables both.
32
+ _USE_FUSED = _USE_NATIVE
33
+
34
+
35
+ def _product_parts(a, b):
36
+ if not _isfinite(a) or not _isfinite(b):
37
+ raise ValueError("compensated contraction requires finite inputs")
38
+ product = a * b
39
+ if not _isfinite(product):
40
+ raise OverflowError("compensated product overflow")
41
+ if a == 0.0 or b == 0.0:
42
+ return product, 0.0
43
+ x, ex = _frexp(a)
44
+ y, ey = _frexp(b)
45
+ split = 134217729.0
46
+ cx, cy = split * x, split * y
47
+ xh, yh = cx - (cx - x), cy - (cy - y)
48
+ xl, yl = x - xh, y - yh
49
+ high = x * y
50
+ low = ((xh * yh - high) + xh * yl + xl * yh) + xl * yl
51
+ # In the normal range power-of-two scaling is exact. In the subnormal
52
+ # range the rounded product need not equal a doubly rounded scaled high;
53
+ # the contract allows that lost half-ulp and scaled-low rounding (<= one
54
+ # minimum subnormal together), rather than claiming an exact expansion.
55
+ return product, _ldexp(low, ex + ey)
56
+
57
+
58
+ _SPLIT = 134217729.0
59
+
60
+
61
+ def _vector_parts(a, b):
62
+ """Elementwise ``_product_parts`` for finite broadcastable arrays.
63
+
64
+ Same IEEE operations in the same order as the scalar routine, so the
65
+ (product, residual) pairs are bitwise identical. Refuses nonfinite inputs
66
+ and overflowing products with the scalar routine's exceptions.
67
+ """
68
+ with np.errstate(all="ignore"):
69
+ product = a * b
70
+ if not (np.all(np.isfinite(a)) and np.all(np.isfinite(b))
71
+ and np.all(np.isfinite(product))):
72
+ # Rare error path: reproduce the scalar first-failure semantics.
73
+ for x, y in zip(np.broadcast_to(a, product.shape).ravel().tolist(),
74
+ np.broadcast_to(b, product.shape).ravel().tolist()):
75
+ _product_parts(x, y)
76
+ x, ex = np.frexp(a)
77
+ y, ey = np.frexp(b)
78
+ cx, cy = _SPLIT * x, _SPLIT * y
79
+ xh, yh = cx - (cx - x), cy - (cy - y)
80
+ xl, yl = x - xh, y - yh
81
+ high = x * y
82
+ low = ((xh * yh - high) + xh * yl + xl * yh) + xl * yl
83
+ low = np.ldexp(low, ex + ey)
84
+ low = np.where((a == 0.0) | (b == 0.0), 0.0, low)
85
+ return product, low
86
+
87
+
88
+ def _interleave_sum(product, low):
89
+ """fsum of ``[p0, l0, p1, l1, ...]`` along the last axis, as the scalar dot."""
90
+ lead = product.shape[:-1]
91
+ count = product.shape[-1]
92
+ parts = np.empty((product.size // max(count, 1), 2 * count), dtype=float)
93
+ parts[:, 0::2] = product.reshape(-1, count)
94
+ parts[:, 1::2] = low.reshape(-1, count)
95
+ values = np.array(list(map(_fsum, parts.tolist())), dtype=float)
96
+ if not np.all(np.isfinite(values)):
97
+ raise OverflowError("compensated sum overflow")
98
+ return values.reshape(lead)
99
+
100
+
101
+ def dot(left, right):
102
+ if len(left) != len(right):
103
+ raise ValueError("compensated dot shape mismatch")
104
+ a = np.array([float(v) for v in left], dtype=float)
105
+ b = np.array([float(v) for v in right], dtype=float)
106
+ if a.size == 0:
107
+ return 0.0
108
+ product, low = _vector_parts(a, b)
109
+ return float(_interleave_sum(product, low))
110
+
111
+
112
+ def product(left, right):
113
+ """Matrix/matrix or matrix/vector product; each dot uses the same policy."""
114
+ a, b = np.asarray(left, dtype=float), np.asarray(right, dtype=float)
115
+ if a.ndim != 2 or b.ndim not in (1, 2) or a.shape[1] != b.shape[0]:
116
+ raise ValueError("compensated product shape mismatch")
117
+ vector = b.ndim == 1
118
+ columns = b.reshape((-1, 1)) if vector else b
119
+ if _USE_NATIVE:
120
+ # The kernel refuses nonfinite input itself; any refusal falls through
121
+ # to the checks below, which raise the reference exception.
122
+ native = np.empty((a.shape[0], columns.shape[1]), dtype=float)
123
+ if _native.contract_product(np.ascontiguousarray(a), np.ascontiguousarray(columns),
124
+ native, _native.POW2) == 0:
125
+ return native[:, 0] if vector else native
126
+ if not np.all(np.isfinite(a)) or not np.all(np.isfinite(b)):
127
+ raise ValueError("compensated product requires finite inputs")
128
+ result = np.zeros((a.shape[0], columns.shape[1]), dtype=float)
129
+ # Terms with an all-zero operand slice are exact zeros in every dot and
130
+ # cannot change an exactly rounded sum.
131
+ keep = np.any(a != 0.0, axis=0) & np.any(columns != 0.0, axis=1)
132
+ # Overflow in a pruned term would still be refused by the scalar policy
133
+ # only if both factors were nonzero, so pruning never hides an error.
134
+ if keep.any():
135
+ a, columns = a[:, keep], columns[keep]
136
+ prod, low = _vector_parts(a[:, None, :], columns.T[None, :, :])
137
+ result = _interleave_sum(prod, low)
138
+ return result[:, 0] if vector else result
139
+
140
+
141
+ def sum_arrays(terms):
142
+ """Fixed-order componentwise sum of already represented equal-shape terms."""
143
+ arrays = [np.asarray(term, dtype=float) for term in terms]
144
+ if not arrays or any(a.shape != arrays[0].shape for a in arrays):
145
+ raise ValueError("compensated array sum requires equal nonempty shapes")
146
+ shape = arrays[0].shape
147
+ if _USE_NATIVE:
148
+ # contract_sum refuses overflow only; nonfinite input is screened here
149
+ # on the single stacked array instead of once per term.
150
+ stack = np.ascontiguousarray(np.stack(arrays).reshape(len(arrays), -1))
151
+ if np.isfinite(stack).all():
152
+ native = np.empty(stack.shape[1], dtype=float)
153
+ if _native.contract_sum(stack, native) == 0:
154
+ return native.reshape(shape)
155
+ if any(not np.all(np.isfinite(a)) for a in arrays):
156
+ raise ValueError("compensated array sum requires finite inputs")
157
+ rows = np.stack(arrays).reshape(len(arrays), -1).T.tolist()
158
+ result = np.array(list(map(_fsum, rows)), dtype=float).reshape(shape)
159
+ if not np.all(np.isfinite(result)):
160
+ raise OverflowError("compensated array sum overflow")
161
+ return result
162
+
163
+
164
+ def weighted_sum(terms, weights):
165
+ """Quadrature reduction including compensation of each weight product."""
166
+ arrays = [np.asarray(term, dtype=float) for term in terms]
167
+ if not arrays or len(arrays) != len(weights) or any(a.shape != arrays[0].shape for a in arrays):
168
+ raise ValueError("compensated weighted sum shape mismatch")
169
+ shape = arrays[0].shape
170
+ try:
171
+ if _USE_NATIVE:
172
+ flat = np.ascontiguousarray(np.stack(arrays).reshape(len(arrays), -1))
173
+ w = np.array([float(v) for v in weights], dtype=float)
174
+ native = np.empty(flat.shape[1], dtype=float)
175
+ if _native.contract_weighted(flat, w, native, _native.POW2) == 0:
176
+ return native.reshape(shape)
177
+ stacked = np.stack(arrays).reshape(len(arrays), -1).T
178
+ w = np.array([float(v) for v in weights], dtype=float)
179
+ prod, low = _vector_parts(stacked, w[None, :])
180
+ return _interleave_sum(prod, low).reshape(shape)
181
+ except (ValueError, OverflowError):
182
+ # Refused input: replay index by index so the first failure (and its
183
+ # exception type) is the one the scalar policy reports.
184
+ result = np.empty(shape, dtype=float)
185
+ for index in np.ndindex(shape):
186
+ result[index] = _scalar_dot([a[index] for a in arrays], weights)
187
+ return result
188
+
189
+
190
+ def _scalar_dot(left, right):
191
+ parts = []
192
+ for a, b in zip(left, right):
193
+ parts.extend(_product_parts(float(a), float(b)))
194
+ result = _fsum(parts)
195
+ if not _isfinite(result):
196
+ raise OverflowError("compensated sum overflow")
197
+ return result
198
+
199
+
200
+ def _shell_zero_tangent_reference(geometry, membrane, bending, shear, drill):
201
+ """Contract independently supplied elastic coefficients on frozen geometry."""
202
+ terms, weights = [], []
203
+ for bm, bb, bd, weight in zip(geometry["B_m_all"], geometry["B_b_all"],
204
+ geometry["B_d_all"], geometry["detw_all"]):
205
+ terms.append(sum_arrays((product(product(bm.T, membrane), bm),
206
+ product(product(bb.T, bending), bb),
207
+ product(bd.T, drill * bd))))
208
+ weights.append(weight)
209
+ for bs, weight in zip(geometry["B_s_all"], geometry["detw_shear_all"]):
210
+ terms.append(product(product(bs.T, shear), bs))
211
+ weights.append(weight)
212
+ local = weighted_sum(terms, weights)
213
+ transform = geometry["T0"]
214
+ return product(product(transform.T, local), transform)
215
+
216
+
217
+ def _increment(u_elem, geometry, constitutive_factory, tangent, use_kernel):
218
+ """Elastic von-Karman increment: the reference evaluation order, optionally fused.
219
+
220
+ Order (identical for both routes): read ``T0``; the displacement product
221
+ (its result ``u`` is computed once and reused); one coefficient evaluation;
222
+ only then, at the moment of choosing, the numpy error policy is read and the
223
+ compiled kernel is tried with ``u`` and the cached coefficients. A policy
224
+ that is not default-or-ignore, non-conforming input or any kernel refusal
225
+ falls through to the reference loop below with the same ``u``/coefficients.
226
+ """
227
+ transform = geometry["T0"]
228
+ u = product(transform, u_elem)
229
+ constitutive = constitutive_factory()
230
+ if use_kernel and _fused_policy_allows():
231
+ fused = _increment_fused(transform, u, geometry, constitutive, tangent)
232
+ if fused is not None:
233
+ return fused
234
+ force = np.zeros(u.size, dtype=float)
235
+ material = np.zeros((u.size, u.size), dtype=float)
236
+ geometric = np.zeros((u.size, u.size), dtype=float)
237
+ forces, materials, geometrics = [], [], []
238
+ weights = []
239
+ for B, G, weight in zip(geometry["B_m_all"], geometry["Gw_all"],
240
+ geometry["detw_all"]):
241
+ theta = product(G, u)
242
+ eta = np.array((0.5 * theta[0]**2, 0.5 * theta[1]**2,
243
+ theta[0] * theta[1]), dtype=float)
244
+ H = np.vstack((theta[0] * G[0], theta[1] * G[1],
245
+ theta[0] * G[1] + theta[1] * G[0]))
246
+ linear_stress = product(constitutive, product(B, u))
247
+ nonlinear_stress = product(constitutive, eta)
248
+ forces.append(sum_arrays((product(B.T, nonlinear_stress),
249
+ product(H.T, linear_stress),
250
+ product(H.T, nonlinear_stress))))
251
+ weights.append(weight)
252
+ if tangent:
253
+ materials.append(sum_arrays((product(product(B.T, constitutive), H),
254
+ product(product(H.T, constitutive), B),
255
+ product(product(H.T, constitutive), H))))
256
+ stress = sum_arrays((linear_stress, nonlinear_stress))
257
+ geometrics.append(sum_arrays((stress[0] * np.outer(G[0], G[0]),
258
+ stress[1] * np.outer(G[1], G[1]),
259
+ stress[2] * np.outer(G[0], G[1]),
260
+ stress[2] * np.outer(G[1], G[0]))))
261
+ if forces:
262
+ force = weighted_sum(forces, weights)
263
+ if tangent and materials:
264
+ material = weighted_sum(materials, weights)
265
+ geometric = weighted_sum(geometrics, weights)
266
+ return (product(transform.T, force), product(product(transform.T, material), transform),
267
+ product(product(transform.T, geometric), transform))
268
+
269
+
270
+ def elastic_increment_reference(u_elem, geometry, constitutive_factory, tangent):
271
+ """Reference (numpy-level) elastic von-Karman increment; see vectorized_nonlinear."""
272
+ return _increment(u_elem, geometry, constitutive_factory, tangent, False)
273
+
274
+
275
+ def elastic_increment(u_elem, geometry, constitutive_factory, tangent):
276
+ """The same increment with the compiled kernel tried after the coefficient evaluation."""
277
+ return _increment(u_elem, geometry, constitutive_factory, tangent, True)
278
+
279
+
280
+ def _fused_array(value, shape_tail):
281
+ """Writable C float64 array of exactly ``1 + len(shape_tail)`` dims, or ``None``."""
282
+ if (type(value) is not np.ndarray or value.dtype != np.float64
283
+ or value.ndim != len(shape_tail) + 1 or value.shape[1:] != shape_tail):
284
+ return None
285
+ if value.flags.c_contiguous and value.flags.writeable:
286
+ return value
287
+ return np.array(value, dtype=np.float64, order="C")
288
+
289
+
290
+ # Exact mapping types the qualified route supplies (frozen geometry is a mappingproxy).
291
+ _GEOMETRY_TYPES = (dict, _MappingProxyType)
292
+
293
+
294
+ def _fused_matrix(value, shape):
295
+ """Writable C float64 copy-or-view of an exact ndarray with exactly ``shape``, or ``None``."""
296
+ if type(value) is not np.ndarray or value.dtype != np.float64 or value.shape != shape:
297
+ return None
298
+ if value.flags.c_contiguous and value.flags.writeable:
299
+ return value
300
+ return np.array(value, dtype=np.float64, order="C")
301
+
302
+
303
+ def _fused_scalar(value):
304
+ if type(value) in (float, np.float64):
305
+ return float(value)
306
+ return None
307
+
308
+
309
+ def _fused_policy_allows():
310
+ """Fused kernels run only under numpy's default-or-ignore floating-point policy.
311
+
312
+ The reference performs plain numpy multiplies (e.g. ``drill * bd``) for which
313
+ numpy may warn, raise or call back on underflow; the compiled multiplies
314
+ cannot. Overflow/invalid always make the kernel refuse (the nonfinite value
315
+ reaches a compensated product or sum), so the reference replays and reports
316
+ them itself. Any other policy runs the reference.
317
+ """
318
+ if not (_USE_NATIVE and _USE_FUSED):
319
+ return False
320
+ policy = np.geterr()
321
+ return (policy["under"] == "ignore"
322
+ and all(policy[kind] in ("ignore", "warn") for kind in ("over", "divide", "invalid")))
323
+
324
+
325
+ def _zero_tangent_args(geometry, membrane, bending, shear, drill):
326
+ """Kernel arguments for ``shell_zero_tangent``, or ``None`` for any non-conforming input."""
327
+ try:
328
+ if type(geometry) not in _GEOMETRY_TYPES:
329
+ return None
330
+ t0 = geometry["T0"]
331
+ n = t0.shape[0] if type(t0) is np.ndarray and t0.ndim == 2 else -1
332
+ if n <= 0:
333
+ return None
334
+ arrays = (_fused_array(geometry["B_m_all"], (3, n)), _fused_array(geometry["B_b_all"], (3, n)),
335
+ _fused_array(geometry["B_d_all"], (1, n)), _fused_array(geometry["detw_all"], ()),
336
+ _fused_array(geometry["B_s_all"], (2, n)), _fused_array(geometry["detw_shear_all"], ()),
337
+ _fused_matrix(t0, (n, n)), _fused_matrix(membrane, (3, 3)),
338
+ _fused_matrix(bending, (3, 3)), _fused_matrix(shear, (2, 2)))
339
+ drill_value = _fused_scalar(drill)
340
+ if (drill_value is None or any(a is None for a in arrays)
341
+ or not len(arrays[0]) == len(arrays[1]) == len(arrays[2]) == len(arrays[3])
342
+ or len(arrays[4]) != len(arrays[5]) or len(arrays[0]) + len(arrays[4]) == 0):
343
+ return None
344
+ return (arrays[0], arrays[1], arrays[2], arrays[3], arrays[4], arrays[5],
345
+ arrays[6], arrays[7], arrays[8], arrays[9], drill_value)
346
+ except Exception: # noqa: BLE001 - anything unexpected is the reference's to report
347
+ return None
348
+
349
+
350
+ def _zero_tangent_fused(geometry, membrane, bending, shear, drill):
351
+ """Run the compiled kernel; ``None`` when not applicable or refused."""
352
+ args = _zero_tangent_args(geometry, membrane, bending, shear, drill)
353
+ if args is None:
354
+ return None
355
+ out = np.empty((args[6].shape[0],) * 2, dtype=np.float64)
356
+ if _native.fused_shell_zero_tangent(*args, out, _native.POW2) != 0:
357
+ return None
358
+ return out
359
+
360
+
361
+ def shell_zero_tangent(geometry, membrane, bending, shear, drill):
362
+ """Contract independently supplied elastic coefficients on frozen geometry.
363
+
364
+ One compiled call per element when the inputs have the expected float64
365
+ layout; anything else, or any refusal, runs the reference implementation.
366
+ """
367
+ if _fused_policy_allows():
368
+ fused = _zero_tangent_fused(geometry, membrane, bending, shear, drill)
369
+ if fused is not None:
370
+ return fused
371
+ return _shell_zero_tangent_reference(geometry, membrane, bending, shear, drill)
372
+
373
+
374
+ def _increment_fused(transform, u, geometry, constitutive, tangent):
375
+ """Run the compiled increment kernel on the already computed ``u``; ``None`` if not applicable."""
376
+ try:
377
+ if type(geometry) not in _GEOMETRY_TYPES or type(tangent) is not bool:
378
+ return None
379
+ n = transform.shape[0] if type(transform) is np.ndarray and transform.ndim == 2 else -1
380
+ if n <= 0:
381
+ return None
382
+ arrays = (_fused_matrix(transform, (n, n)), _fused_matrix(u, (n,)),
383
+ _fused_matrix(constitutive, (3, 3)), _fused_array(geometry["B_m_all"], (3, n)),
384
+ _fused_array(geometry["Gw_all"], (2, n)), _fused_array(geometry["detw_all"], ()))
385
+ if (any(a is None for a in arrays)
386
+ or not len(arrays[3]) == len(arrays[4]) == len(arrays[5]) > 0):
387
+ return None
388
+ except Exception: # noqa: BLE001 - anything unexpected is the reference's to report
389
+ return None
390
+ force = np.empty(n, dtype=np.float64)
391
+ material = np.zeros((n, n), dtype=np.float64)
392
+ geometric = np.zeros((n, n), dtype=np.float64)
393
+ if _native.fused_elastic_increment(
394
+ arrays[0], arrays[1], arrays[2], arrays[3], arrays[4], arrays[5], tangent,
395
+ force, material, geometric, _native.POW2, 2.0) != 0:
396
+ return None
397
+ return force, material, geometric
398
+
399
+
400
+ def _native_known_answers_match():
401
+ """Disable the compiled kernels unless they reproduce the numpy path bitwise."""
402
+ global _USE_NATIVE
403
+ if not _USE_NATIVE:
404
+ return
405
+ rng = np.random.default_rng(20261022)
406
+ a = rng.standard_normal((7, 9)) * 2.0 ** rng.integers(-40, 40, (7, 9))
407
+ b = rng.standard_normal((9, 6)) * 2.0 ** rng.integers(-40, 40, (9, 6))
408
+ stack = rng.standard_normal((5, 11)) * 2.0 ** rng.integers(-40, 40, (5, 11)) * 1e8
409
+ stack[1] = -stack[0] * (1.0 + 2.0 ** -40)
410
+ weights = rng.standard_normal(5)
411
+ results = []
412
+ for use in (True, False):
413
+ _USE_NATIVE = use
414
+ try:
415
+ results.append((product(a, b).tobytes(), sum_arrays(list(stack)).tobytes(),
416
+ weighted_sum(list(stack), weights).tobytes()))
417
+ except Exception: # noqa: BLE001 - any failure disables the kernels
418
+ results.append(None)
419
+ _USE_NATIVE = results[0] is not None and results[0] == results[1]
420
+
421
+
422
+ _native_known_answers_match()
423
+
424
+
425
+ def _fused_cases():
426
+ """Deterministic known-answer inputs (also exercised by the tests)."""
427
+ rng = np.random.default_rng(20261023)
428
+ for case in range(3):
429
+ n, ng, ns = 24, 4, 4
430
+ scale = (1.0, 2.0 ** 20, 2.0 ** -30)[case]
431
+
432
+ def rnd(*shape):
433
+ return rng.standard_normal(shape) * 2.0 ** rng.integers(-3, 4, shape) * scale
434
+
435
+ geometry = {"B_m_all": rnd(ng, 3, n), "B_b_all": rnd(ng, 3, n), "B_d_all": rnd(ng, 1, n),
436
+ "Gw_all": rnd(ng, 2, n), "B_s_all": rnd(ns, 2, n), "T0": rnd(n, n),
437
+ "detw_all": np.abs(rnd(ng)) + 0.1, "detw_shear_all": np.abs(rnd(ns)) + 0.1}
438
+ yield (geometry, rnd(3, 3), rnd(3, 3), rnd(2, 2), float(rnd(1)[0]),
439
+ rnd(n) * 1e-2, rnd(3, 3) * 1e3)
440
+ # Squares where libm pow differs from x * x: for identity-like Gw rows theta
441
+ # equals u exactly, so the kernel's scalar square is exercised on them.
442
+ hits = [float(v) for v in np.random.default_rng(7).uniform(1.0, 2.0, 60000)
443
+ if np.float64(v) ** 2 != v * v][:4]
444
+ n = 6
445
+ geometry = {"B_m_all": np.ones((1, 3, n)), "B_b_all": np.ones((1, 3, n)), "B_d_all": np.ones((1, 1, n)),
446
+ "Gw_all": np.zeros((1, 2, n)), "B_s_all": np.ones((1, 2, n)), "T0": np.eye(n),
447
+ "detw_all": np.ones(1), "detw_shear_all": np.ones(1)}
448
+ geometry["Gw_all"][0, 0, 0] = geometry["Gw_all"][0, 1, 1] = 1.0
449
+ for x in hits or [1.5]:
450
+ u = np.zeros(n)
451
+ u[0], u[1] = x, x
452
+ yield geometry, np.eye(3), np.eye(3), np.eye(2), 0.5, u, np.eye(3) * 1e3
453
+
454
+
455
+ def _fused_check(zero_kernel, increment_kernel):
456
+ """True iff the given compiled kernels reproduce the reference bitwise *and run*.
457
+
458
+ Calls the kernels directly (never the fallback-capable wrappers), so a
459
+ kernel that always refuses fails the check.
460
+ """
461
+ try:
462
+ for geometry, membrane, bending, shear, drill, u_elem, constitutive in _fused_cases():
463
+ args = _zero_tangent_args(geometry, membrane, bending, shear, drill)
464
+ if args is None:
465
+ return False
466
+ out = np.empty((args[6].shape[0],) * 2)
467
+ if zero_kernel(*args, out, _native.POW2) != 0:
468
+ return False
469
+ if out.tobytes() != _shell_zero_tangent_reference(
470
+ geometry, membrane, bending, shear, drill).tobytes():
471
+ return False
472
+ u = product(geometry["T0"], u_elem)
473
+ for tangent in (True, False):
474
+ n = geometry["T0"].shape[0]
475
+ f, m, g = np.empty(n), np.zeros((n, n)), np.zeros((n, n))
476
+ if increment_kernel(geometry["T0"], u, constitutive, geometry["B_m_all"],
477
+ geometry["Gw_all"], geometry["detw_all"], tangent,
478
+ f, m, g, _native.POW2, 2.0) != 0:
479
+ return False
480
+ ref = elastic_increment_reference(u_elem, geometry, lambda: constitutive, tangent)
481
+ if any(x.tobytes() != y.tobytes() for x, y in zip((f, m, g), ref)):
482
+ return False
483
+ return True
484
+ except Exception: # noqa: BLE001 - any failure disables the fused kernels
485
+ return False
486
+
487
+
488
+ def _fused_known_answers_match():
489
+ """Disable the fused element kernels unless they reproduce the reference bitwise."""
490
+ global _USE_FUSED
491
+ if not _USE_FUSED:
492
+ return
493
+ with np.errstate(all="ignore"):
494
+ _USE_FUSED = _fused_check(_native.fused_shell_zero_tangent, _native.fused_elastic_increment)
495
+
496
+
497
+ _fused_known_answers_match()