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,261 @@
1
+ """Bounded physical-patch attachment elimination of the actual stored KKT.
2
+
3
+ Five-row physical laws remain unchanged. Six beam coordinates can be removed
4
+ only when existing grouped patch rows give independent local right/left blocks.
5
+ No global nullspace/inverse, symmetrization, new solver or physical threshold.
6
+ """
7
+ from fractions import Fraction
8
+ from hashlib import sha256
9
+ import numpy as np
10
+ from scipy import sparse
11
+ from .linalg import MatrixClass, factorize_cached
12
+
13
+ MAX_PATCH_NODES = 16
14
+ MAX_LOCAL_SUPPORT = 6*MAX_PATCH_NODES
15
+ MAX_PREPARED_BYTES = 512*1024**2 # Eligibility/storage screen; legacy fallback.
16
+
17
+
18
+ def _independent_rows(block):
19
+ """Exact represented local rank proof only, at most 80x6 coefficients."""
20
+ basis, selected = {}, []
21
+ for index, values in enumerate(block):
22
+ row = [Fraction(float(value)) for value in values]
23
+ for pivot in sorted(basis):
24
+ value = row[pivot]
25
+ if value:
26
+ row = [a-value*b for a, b in zip(row, basis[pivot])]
27
+ pivot = next((i for i, value in enumerate(row) if value), None)
28
+ if pivot is not None:
29
+ value = row[pivot]
30
+ basis[pivot] = [entry/value for entry in row]
31
+ selected.append(index)
32
+ if len(selected) == 6:
33
+ return tuple(selected)
34
+ return ()
35
+
36
+
37
+ def _bytes(matrix):
38
+ return matrix.data.nbytes+matrix.indices.nbytes+matrix.indptr.nbytes
39
+
40
+
41
+ def _row_product_upper(matrix, right_row_counts):
42
+ return [sum(right_row_counts[int(j)] for j in matrix.indices[first:last])
43
+ for first, last in zip(matrix.indptr[:-1], matrix.indptr[1:])]
44
+
45
+
46
+ def _reduced_operator(left, k, right, jbeta, cbeta):
47
+ # The storage screen bounds K@P, not L@K. Keep this association explicit:
48
+ # raw nonsymmetric J/C can give L and P different sparse supports.
49
+ kp = k @ right
50
+ return sparse.bmat(((left @ kp, left @ jbeta), (cbeta @ right, None)), format="csc")
51
+
52
+
53
+ class AttachmentElimination:
54
+ """Immutable owner-local maps, with one reused existing global factor."""
55
+ def __init__(self, k, j, c, primal_free, beam_columns, remaining_rows,
56
+ anchor_rows, right, left, inverse_right, inverse_left,
57
+ reduced, diagnostics):
58
+ self.k, self.j, self.c = k, j, c
59
+ self.free, self.beam = primal_free, beam_columns
60
+ self.beta, self.alpha = remaining_rows, anchor_rows
61
+ self.right, self.left = right, left
62
+ self.inverse_right, self.inverse_left = inverse_right, inverse_left
63
+ self.reduced, self.info = reduced, diagnostics
64
+ self.primal_count, self.constraint_count = k.shape[0], c.shape[0]
65
+ for array in (self.free, self.beam, self.beta, self.alpha,
66
+ *self.inverse_right, *self.inverse_left):
67
+ array.setflags(write=False)
68
+
69
+ def factorize(self):
70
+ handle = factorize_cached(self.reduced, MatrixClass.GENERAL)
71
+ return EliminatedHandle(self, handle)
72
+
73
+ def _local_action(self, inverses, values):
74
+ result = np.empty_like(values)
75
+ for group, inverse in enumerate(inverses):
76
+ rows = slice(6*group, 6*group+6)
77
+ result[rows] = inverse @ values[rows]
78
+ return result
79
+
80
+ def solve(self, handle, rhs):
81
+ rhs = np.asarray(rhs, dtype=float)
82
+ total = self.primal_count+self.constraint_count
83
+ if rhs.ndim not in (1, 2) or rhs.shape[0] != total or not np.isfinite(rhs).all():
84
+ raise RuntimeError("finite full attachment right-hand side required")
85
+ single = rhs.ndim == 1
86
+ values = rhs[:, None] if single else rhs
87
+ f, d = values[:self.primal_count], values[self.primal_count:]
88
+ lift = np.zeros_like(f)
89
+ lift[self.beam] = self._local_action(self.inverse_right, d[self.alpha])
90
+ reduced_rhs = np.vstack((self.left @ (f-self.k @ lift),
91
+ d[self.beta]-self.c[self.beta] @ lift))
92
+ if not np.isfinite(lift).all() or not np.isfinite(reduced_rhs).all():
93
+ raise RuntimeError("attachment affine elimination is not representable")
94
+ solved = handle.solve(reduced_rhs[:, 0] if single else reduced_rhs)
95
+ solved = np.asarray(solved, dtype=float)
96
+ solved = solved[:, None] if single else solved
97
+ primal = self.right @ solved[:len(self.free)]+lift
98
+ multipliers = np.empty((self.constraint_count, values.shape[1]))
99
+ multipliers[self.beta] = solved[len(self.free):]
100
+ anchor_rhs = f[self.beam]-(self.k @ primal)[self.beam]-(self.j[:, self.beta] @ multipliers[self.beta])[self.beam]
101
+ multipliers[self.alpha] = self._local_action(self.inverse_left, anchor_rhs)
102
+ result = np.vstack((primal, multipliers))
103
+ if not np.isfinite(result).all():
104
+ raise RuntimeError("attachment recovery is not representable")
105
+ return result[:, 0] if single else result
106
+
107
+
108
+ class EliminatedHandle:
109
+ def __init__(self, maps, handle):
110
+ self.maps, self.handle = maps, handle
111
+
112
+ def __getattr__(self, name):
113
+ return getattr(self.handle, name)
114
+
115
+ def solve(self, rhs):
116
+ return self.maps.solve(self.handle, rhs)
117
+
118
+ def solve_many(self, rhs):
119
+ return self.solve(rhs)
120
+
121
+ def diagnostics(self):
122
+ return {**self.handle.diagnostics(), "attachment_elimination": dict(self.maps.info),
123
+ "restored_shape": [self.maps.primal_count+self.maps.constraint_count]*2}
124
+
125
+
126
+ def prepare_attachment_elimination(matrix, primal_count, transformation, incidences):
127
+ """Return maps/reason; ineligibility never narrows existing model admission.
128
+
129
+ Caller admits only physical static, no points/H/body/spectral. Input bytes
130
+ are copied and the operator/support signature is fixed once, never per load.
131
+ Arbitrary constraint RHS, including original-target correction, is retained.
132
+ """
133
+ a = matrix.tocsr(copy=True)
134
+ t = transformation.tocsr(copy=True)
135
+ a.eliminate_zeros(); t.eliminate_zeros()
136
+ a.sort_indices(); t.sort_indices()
137
+ n, m = primal_count, a.shape[0]-primal_count
138
+ if n <= 0 or a.shape != (n+m, n+m) or m <= 0 or t.shape[1] != n or not np.isfinite(a.data).all():
139
+ return None, "invalid_local_layout"
140
+ if np.any(a[n:, n:].data != 0.):
141
+ return None, "nonzero_multiplier_compliance"
142
+ groups = {}
143
+ for item in incidences:
144
+ if item.row_count != 5:
145
+ return None, "not_five_row_physical_incidence"
146
+ groups.setdefault(item.footprint_id, []).append(item)
147
+ if not groups or sum(5*len(items) for items in groups.values()) != m:
148
+ return None, "incomplete_physical_incidence"
149
+ inventory = [i.row_start+v for items in groups.values() for i in items for v in range(5)]
150
+ if set(inventory) != set(range(m)) or len(inventory) != len(set(inventory)):
151
+ return None, "invalid_physical_row_inventory"
152
+ k, j, c = a[:n, :n].tocsr(), a[:n, n:].tocsr(), a[n:, :n].tocsr()
153
+ tc = t.tocsc()
154
+ selected_beam, selected_rows, used_shell, used_beam = [], [], set(), set()
155
+ inverses_b, inverses_d, local = [], [], []
156
+ for items in groups.values():
157
+ if len(items) > MAX_PATCH_NODES or len({i.shell_node for i in items}) != len(items):
158
+ return None, "bounded_patch_incidence_required"
159
+ shell_slots = {int(v) for i in items for v in i.shell_slots}
160
+ beam_slots = tuple(map(int, items[0].beam_slots))
161
+ if (len(beam_slots) != 6 or any(tuple(i.beam_slots) != beam_slots for i in items) or
162
+ used_shell.intersection(shell_slots) or used_beam.intersection(beam_slots)):
163
+ return None, "overlapping_attachment_blocks"
164
+ columns = []
165
+ for slot in beam_slots:
166
+ if slot < 0 or slot >= t.shape[0]:
167
+ return None, "invalid_beam_coordinate_inventory"
168
+ start, stop = t.indptr[slot:slot+2]
169
+ if stop-start != 1 or t.data[start] != 1.:
170
+ return None, "fully_free_beam_selector_required"
171
+ column = int(t.indices[start])
172
+ if tc.indptr[column+1]-tc.indptr[column] != 1:
173
+ return None, "beam_coordinate_shared_by_affine_map"
174
+ columns.append(column)
175
+ if len(set(columns)) != 6:
176
+ return None, "distinct_beam_coordinates_required"
177
+ rows = np.array([i.row_start+v for i in items for v in range(5)], dtype=int)
178
+ if np.any(rows < 0) or np.any(rows >= m):
179
+ return None, "invalid_physical_row_inventory"
180
+ rank_rows = _independent_rows(c[rows][:, columns].toarray())
181
+ if not rank_rows:
182
+ return None, "local_position_director_rank_deficient"
183
+ alpha = rows[np.array(rank_rows)]
184
+ b = c[alpha][:, columns].toarray()
185
+ d = j[columns][:, alpha].toarray()
186
+ if not _independent_rows(d):
187
+ return None, "local_left_block_rank_deficient"
188
+ outside = np.setdiff1d(np.arange(m), rows, assume_unique=True)
189
+ if c[outside][:, columns].nnz:
190
+ return None, "foreign_right_attachment_coupling"
191
+ if j[columns][:, outside].nnz:
192
+ return None, "foreign_left_attachment_coupling"
193
+ try:
194
+ ib, id_ = np.linalg.solve(b, np.eye(6)), np.linalg.solve(d, np.eye(6))
195
+ except np.linalg.LinAlgError:
196
+ return None, "local_binary64_solve_unresolved"
197
+ if not np.isfinite(ib).all() or not np.isfinite(id_).all():
198
+ return None, "local_elimination_unrepresentable"
199
+ selected_beam.extend(columns); selected_rows.extend(map(int, alpha))
200
+ used_shell.update(shell_slots); used_beam.update(beam_slots)
201
+ inverses_b.append(ib); inverses_d.append(id_)
202
+ local.append((np.array(columns), alpha, rows))
203
+ beam, alpha = np.array(selected_beam), np.array(selected_rows)
204
+ if len(set(alpha)) != len(alpha):
205
+ return None, "overlapping_constraint_rows"
206
+ free = np.setdiff1d(np.arange(n), beam, assume_unique=True)
207
+ beta = np.setdiff1d(np.arange(m), alpha, assume_unique=True)
208
+ pr, pc, pv = list(map(int, free)), list(range(len(free))), [1.]*len(free)
209
+ lr, lc, lv = list(range(len(free))), list(map(int, free)), [1.]*len(free)
210
+ used_support = set()
211
+ for (columns, anchors, rows), ib, id_ in zip(local, inverses_b, inverses_d):
212
+ right_part = c[anchors][:, free].tocsr()
213
+ touched_right = np.unique(right_part.indices)
214
+ left_part = j[free][:, anchors].tocsr()
215
+ touched_left = np.unique(left_part.tocoo().row)
216
+ support = set(map(int, touched_right)) | set(map(int, touched_left))
217
+ all_constraint_support = set(map(int, c[rows][:, free].indices))
218
+ if len(support | all_constraint_support) > MAX_LOCAL_SUPPORT or used_support.intersection(support | all_constraint_support):
219
+ return None, "overlapping_or_unbounded_affine_patch_support"
220
+ used_support.update(support | all_constraint_support)
221
+ z = -ib @ right_part[:, touched_right].toarray()
222
+ y = -left_part[touched_left].toarray() @ id_
223
+ for i, column in enumerate(columns):
224
+ for at, value in zip(touched_right, z[i]):
225
+ if value != 0.:
226
+ pr.append(int(column)); pc.append(int(at)); pv.append(float(value))
227
+ for i, at in enumerate(touched_left):
228
+ for column, value in zip(columns, y[i]):
229
+ if value != 0.:
230
+ lr.append(int(at)); lc.append(int(column)); lv.append(float(value))
231
+ right = sparse.coo_matrix((pv, (pr, pc)), shape=(n, len(free))).tocsr()
232
+ left = sparse.coo_matrix((lv, (lr, lc)), shape=(len(free), n)).tocsr()
233
+ if not np.isfinite(right.data).all() or not np.isfinite(left.data).all():
234
+ return None, "affine_maps_unrepresentable"
235
+ kp_rows = _row_product_upper(k, list(map(int, np.diff(right.indptr))))
236
+ kk_upper = min(len(free)**2, sum(_row_product_upper(left, kp_rows)))
237
+ jbeta = j[:, beta].tocsr(); cbeta = c[beta].tocsr()
238
+ jj_upper = min(len(free)*len(beta), sum(_row_product_upper(left, list(map(int, np.diff(jbeta.indptr))))))
239
+ cc_upper = min(len(free)*len(beta), sum(_row_product_upper(cbeta, list(map(int, np.diff(right.indptr))))))
240
+ estimated_bytes = sum(map(_bytes, (a, k, j, c, right, left)))+24*(kk_upper+jj_upper+cc_upper+sum(kp_rows))
241
+ if estimated_bytes > MAX_PREPARED_BYTES:
242
+ return None, "bounded_sparse_preparation_storage_exceeded"
243
+ reduced = _reduced_operator(left, k, right, jbeta, cbeta)
244
+ reduced.eliminate_zeros(); reduced.sort_indices()
245
+ if not np.isfinite(reduced.data).all():
246
+ return None, "reduced_operator_unrepresentable"
247
+ signature = sha256()
248
+ for operand in (a, t):
249
+ signature.update(repr(operand.shape).encode())
250
+ for values in (operand.data, operand.indices, operand.indptr):
251
+ signature.update(values.tobytes())
252
+ info = {"groups": len(groups), "eliminated_primal": len(beam), "eliminated_multipliers": len(alpha),
253
+ "retained_constraints": len(beta), "full_shape": a.shape, "reduced_shape": reduced.shape,
254
+ "full_nnz": a.nnz, "reduced_nnz": reduced.nnz, "right_map_nnz": right.nnz,
255
+ "left_map_nnz": left.nnz, "estimated_sparse_array_bytes_with_product_nnz_bound": estimated_bytes,
256
+ "prepared_operator_bytes": sum(map(_bytes, (k, j, c, right, left, reduced))),
257
+ "storage_scope": "sparse arrays/product nnz screen; excludes Python containers, allocator temporaries and factor fill; not a process RSS upper bound",
258
+ "operator_support_signature": signature.hexdigest(), "raw_left_right_distinct": True,
259
+ "factor_fill_bytes": "not estimated or measured", "qualification": False}
260
+ return AttachmentElimination(k, j, c, free, beam, beta, alpha, right, left,
261
+ tuple(inverses_b), tuple(inverses_d), reduced, info), "eligible"
@@ -0,0 +1,163 @@
1
+ """Private reference-linearized B2/finite-shell-support point experiment.
2
+
3
+ The shell port is the least-squares rigid motion of three or four *physical* vertex
4
+ translations. Its finite support, coordinates and weights are explicit; no
5
+ isolated drilling rotation, penalty, shell stiffness or public MPC is inferred.
6
+ The beam port uses the physical B2 member's sectional station trace. The
7
+ constraint differential comes from the existing objective master-frame joint
8
+ at its stress-free reference. This is a G0 development operator only.
9
+ """
10
+
11
+ from dataclasses import dataclass
12
+
13
+ import numpy as np
14
+
15
+ from ._b2_physical_linear_definition import PhysicalB2Member
16
+ from ._ge_beam3_pose_joint import RigidPoseJoint
17
+
18
+
19
+ LAW_ID = "B2_FINITE_Q4_POINT_REFERENCE_LINEAR_V1_DEV"
20
+ S3_LAW_ID = "B2_FINITE_S3_POINT_REFERENCE_LINEAR_V1_DEV"
21
+
22
+
23
+ def _skew(v):
24
+ return np.array([[0., -v[2], v[1]], [v[2], 0., -v[0]],
25
+ [-v[1], v[0], 0.]])
26
+
27
+
28
+ def _finite(value, shape, label):
29
+ a = np.asarray(value, dtype=float)
30
+ if a.shape != shape or not np.isfinite(a).all():
31
+ raise ValueError(f"finite {label} with shape {shape} required")
32
+ return a.copy()
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class ReferencePointLaw:
37
+ shell_reference_m: np.ndarray
38
+ beam_reference_m: np.ndarray
39
+ shell_port: np.ndarray
40
+ beam_port: np.ndarray
41
+ constraint: np.ndarray
42
+ reference_frames: np.ndarray
43
+ law_id: str = ""
44
+ production_qualified: bool = False
45
+ beam_constraint_differential: np.ndarray | None = None
46
+
47
+ def __post_init__(self):
48
+ port_shape = np.asarray(self.shell_port).shape
49
+ if (len(port_shape) != 2 or port_shape[0] != 6 or
50
+ port_shape[1] not in (18, 24)):
51
+ raise ValueError("three- or four-vertex physical shell port required")
52
+ shell_width = port_shape[1]
53
+ expected_id = S3_LAW_ID if shell_width == 18 else LAW_ID
54
+ if self.law_id and self.law_id != expected_id:
55
+ raise ValueError("point law identity does not match shell support")
56
+ object.__setattr__(self, "law_id", expected_id)
57
+ for name, shape in (("shell_reference_m", (3,)),
58
+ ("beam_reference_m", (3,)),
59
+ ("shell_port", (6, shell_width)),
60
+ ("beam_port", (6, 12)),
61
+ ("constraint", (6, shell_width+12)),
62
+ ("reference_frames", (2, 3, 3))):
63
+ owned = _finite(getattr(self, name), shape, name)
64
+ # A bytes-backed view cannot be made writable by a caller, so
65
+ # the reference curvature cannot drift from its stored rows.
66
+ sealed = np.frombuffer(owned.tobytes(), dtype=np.float64).reshape(shape)
67
+ object.__setattr__(self, name, sealed)
68
+ if self.beam_constraint_differential is not None:
69
+ owned = _finite(self.beam_constraint_differential, (6, 6), "beam pose differential")
70
+ object.__setattr__(self, "beam_constraint_differential",
71
+ np.frombuffer(owned.tobytes(), dtype=float).reshape(6, 6))
72
+
73
+ def gap(self, shell_displacement, beam_displacement):
74
+ shell = _finite(shell_displacement, (self.shell_port.shape[1],),
75
+ "shell displacement")
76
+ beam = _finite(beam_displacement, (12,), "beam displacement")
77
+ return self.constraint @ np.r_[shell, beam]
78
+
79
+ def multiplier_work(self, shell_displacement, beam_displacement, multiplier):
80
+ lam = _finite(multiplier, (6,), "point multiplier")
81
+ return float(lam @ self.gap(shell_displacement, beam_displacement))
82
+
83
+ def forces(self, multiplier):
84
+ lam = _finite(multiplier, (6,), "point multiplier")
85
+ action = self.constraint.T @ lam
86
+ shell_width = self.shell_port.shape[1]
87
+ return action[:shell_width], action[shell_width:]
88
+
89
+ def candidate_prestress_curvature(self, multiplier):
90
+ """Reference Hessian of objective multiplier work through affine ports.
91
+
92
+ This is a private conservative spectral candidate. The ordinary
93
+ reference-linear static gap and stiffness remain affine.
94
+ """
95
+ lam = _finite(multiplier, (6,), "point multiplier")
96
+ positions = np.stack((self.shell_reference_m, self.beam_reference_m))
97
+ joint = RigidPoseJoint(positions, self.reference_frames)
98
+ pose = joint.evaluate(positions, self.reference_frames, lam)
99
+ shell_width = self.shell_port.shape[1]
100
+ port = np.zeros((12, shell_width+12))
101
+ port[:6, :shell_width] = self.shell_port
102
+ port[6:, shell_width:] = self.beam_port
103
+ return np.array(port.T @ pose.chart_hessian[:12, :12] @ port,
104
+ copy=True)
105
+
106
+
107
+ def compile_reference_point(member: PhysicalB2Member, shell_vertices_m, *,
108
+ station: float, offset_local_m=(0., 0., 0.)):
109
+ """Return six affine rows for one finite shell support and B2 station.
110
+
111
+ Shell DOFs are three or four [ux,uy,uz,rx,ry,rz] tuples. The shell port's rigid
112
+ translation/rotation is the equal-vertex-weight fit of the *nodal
113
+ translations*. Rotational shell DOFs still enter the actual shell stiffness;
114
+ they are deliberately not identified with an unsupported nodal drill.
115
+ """
116
+ if not isinstance(member, PhysicalB2Member):
117
+ raise ValueError("owned physical B2 member required")
118
+ shape = np.asarray(shell_vertices_m).shape
119
+ if shape not in ((3, 3), (4, 3)):
120
+ raise ValueError("three or four shell vertices required")
121
+ x = _finite(shell_vertices_m, shape, "shell vertices")
122
+ if type(station) not in (int, float) or not np.isfinite(station) or not 0. <= station <= 1.:
123
+ raise ValueError("normalized B2 station in [0,1] required")
124
+ origin = x.mean(axis=0)
125
+ radius = x-origin
126
+ fit = np.zeros((3*len(x), 6))
127
+ for i, r in enumerate(radius):
128
+ fit[3*i:3*i+3, :3] = np.eye(3)
129
+ fit[3*i:3*i+3, 3:] = -_skew(r)
130
+ if np.linalg.matrix_rank(fit) != 6:
131
+ raise ValueError("finite noncollinear shell point support required")
132
+ # Equal weights identify the actual support vertices. A least-squares
133
+ # fit is a kinematic port; shell constitutive stiffness is supplied outside.
134
+ left = np.linalg.solve(fit.T @ fit, fit.T)
135
+ shell_port = np.zeros((6, 6*len(x)))
136
+ for i in range(len(x)):
137
+ shell_port[:, 6*i:6*i+3] = left[:, 3*i:3*i+3]
138
+ trace = member.trace_global(np.zeros(12), stations=(float(station),),
139
+ offset_local_m=offset_local_m)
140
+ beam_port = trace.jacobian[0].copy()
141
+ point = trace.reference_points_m[0].copy()
142
+ normal = np.cross(x[1]-x[0], x[-1]-x[0])
143
+ area_scale = np.linalg.norm(normal)
144
+ diameter = max(np.linalg.norm(a-b) for a in x for b in x)
145
+ if area_scale <= 1e-12*diameter**2:
146
+ raise ValueError("nondegenerate shell reference plane required")
147
+ normal /= area_scale
148
+ if max(abs((vertex-origin)@normal) for vertex in x) > 1e-10*diameter:
149
+ raise ValueError("planar shell point support required")
150
+ tangent = x[1]-x[0]
151
+ tangent /= np.linalg.norm(tangent)
152
+ side = np.cross(normal, tangent)
153
+ shell_frame = np.column_stack((tangent, side, normal))
154
+ beam_frame = member.local_frame_rows().T
155
+ reference_positions = np.array((origin, point))
156
+ reference_frames = np.array((shell_frame, beam_frame))
157
+ joint = RigidPoseJoint(reference_positions, reference_frames)
158
+ derivative = joint.evaluate(reference_positions, reference_frames,
159
+ np.zeros(6)).constraint_jacobian
160
+ constraint = np.column_stack((derivative[:, :6] @ shell_port,
161
+ derivative[:, 6:] @ beam_port))
162
+ return ReferencePointLaw(origin, point, shell_port, beam_port, constraint,
163
+ reference_frames, beam_constraint_differential=derivative[:, 6:])
@@ -0,0 +1,173 @@
1
+ """Member-local compilation for the explicit fixed-end loaded-point policy.
2
+
3
+ B maps local PORT pose to constraint channels, without an offset shift. External
4
+ port wrench is -B.T*lambda. FixedEndLoadBubbleMaps owns the offset work maps;
5
+ section actions shift port moment to the axis once. Green blocks are B_i G_ij
6
+ B_j.T, including every same-member pair. No global dense operator is created.
7
+ Energy uses compiled, segmented polynomial pose samples, not recovered strains.
8
+ """
9
+ from fractions import Fraction
10
+
11
+ import numpy as np
12
+
13
+ from ._b2_physical_flexibility_linear import (
14
+ RepresentabilityError, _array, _float, _matmul, _multiply, _transpose,
15
+ )
16
+ from ._b2_physical_load_bubbles import (
17
+ FixedEndLoadBubbleMaps, _axis_bubble, _axis_wrench, _poly_value,
18
+ )
19
+
20
+
21
+ def _rational(matrix):
22
+ return tuple(tuple(Fraction(float(v)) for v in row) for row in matrix)
23
+
24
+
25
+ def _owned(array):
26
+ value = np.asarray(array, dtype=float)
27
+ if not np.isfinite(value).all():
28
+ raise RepresentabilityError("loaded-point map is not representable")
29
+ return np.frombuffer(value.tobytes(), dtype=float).reshape(value.shape)
30
+
31
+
32
+ def checked_sparse_action(matrix, values):
33
+ """Retain actual stored contribution sums without an absolute unit floor."""
34
+ rational = tuple(Fraction(float(v)) for v in values)
35
+ result, scale = [], []
36
+ for row in range(matrix.shape[0]):
37
+ low, high = matrix.indptr[row:row+2]
38
+ products = tuple(Fraction(float(coefficient))*rational[index]
39
+ for coefficient, index in zip(matrix.data[low:high], matrix.indices[low:high]))
40
+ result.append(sum(products)); scale.append(sum(abs(v) for v in products))
41
+ return _array(result), _array(scale)
42
+
43
+
44
+ class LoadedPointMember:
45
+ """Compile once for one member; cache only requested observation maps."""
46
+
47
+ def __init__(self, member, entries, *, body_enabled):
48
+ self.member = member
49
+ self.entries = tuple(entries)
50
+ self.point_indices = tuple(entry[0] for entry in entries)
51
+ self.stations = tuple(float(entry[1]) for entry in entries)
52
+ self.offsets = tuple(tuple(float(v) for v in entry[2]) for entry in entries)
53
+ self.port_constraints = tuple(_owned(entry[3]) for entry in entries)
54
+ self._constraints = tuple(_rational(value) for value in self.port_constraints)
55
+ self._recovery_maps = {}
56
+ knots = (0.,) + tuple(sorted({s for s in self.stations if 0. < s < 1.})) + (1.,)
57
+ nodes, weights = np.polynomial.legendre.leggauss(4)
58
+ quadrature, measure = [], []
59
+ for left, right in zip(knots, knots[1:]):
60
+ quadrature.extend(left+(right-left)*(nodes+1.)/2.)
61
+ measure.extend(float(member.operator.length)*(right-left)*weights/2.)
62
+ self.quadrature_stations = tuple(map(float, quadrature))
63
+ self.quadrature_weights = _owned(measure)
64
+ self.maps = FixedEndLoadBubbleMaps(member.operator,
65
+ stations=self.stations+self.quadrature_stations,
66
+ point_stations=self.stations,
67
+ observation_offsets_local_m=self.offsets+((0., 0., 0.),)*len(quadrature),
68
+ point_offsets_local_m=self.offsets)
69
+ count = len(entries)
70
+ compliance = np.zeros((6*count, 6*count))
71
+ for i in range(count):
72
+ for j in range(i, count):
73
+ green = _rational(self.maps.point_compliance[6*i:6*i+6, 6*j:6*j+6])
74
+ block = _array(_matmul(_matmul(self._constraints[i], green),
75
+ _transpose(self._constraints[j])))
76
+ compliance[6*i:6*i+6, 6*j:6*j+6] = block
77
+ compliance[6*j:6*j+6, 6*i:6*i+6] = block.T
78
+ self.constraint_compliance = _owned(compliance)
79
+ body = np.zeros((6, 3))
80
+ if body_enabled:
81
+ with np.errstate(over="ignore", invalid="ignore"):
82
+ body = (member.definition.mass.matrix_at_reference_axis()[:, :3]
83
+ @ member.definition.local_frame_rows())
84
+ self.body_wrench_map = _owned(body)
85
+ self._body_wrench = _rational(body)
86
+ constraint_body = []
87
+ for i in range(count):
88
+ pose = _rational(self.maps.uniform_pose_map[i])
89
+ constraint_body.extend(_matmul(_matmul(self._constraints[i], pose), self._body_wrench))
90
+ self._body_constraint = tuple(tuple(row) for row in constraint_body)
91
+ self.body_constraint_map = _owned(_array(constraint_body).reshape(6*count, 3))
92
+
93
+ def body_uniform(self, acceleration):
94
+ if acceleration is None:
95
+ return np.zeros(6)
96
+ return _array(_multiply(self._body_wrench, tuple(Fraction(float(v)) for v in acceleration)))
97
+
98
+ def body_constraint(self, acceleration):
99
+ if acceleration is None:
100
+ return np.zeros(6*len(self.entries)), np.zeros(6*len(self.entries))
101
+ values = tuple(Fraction(float(v)) for v in acceleration)
102
+ result = _array(_multiply(self._body_constraint, values))
103
+ scale = _array(tuple(sum(abs(a*b) for a, b in zip(row, values))
104
+ for row in self._body_constraint))
105
+ return result, scale
106
+
107
+ def port_wrenches(self, multipliers):
108
+ return np.asarray(tuple(-_array(_multiply(_transpose(matrix),
109
+ tuple(Fraction(float(v)) for v in multipliers[6*index:6*index+6])))
110
+ for matrix, index in zip(self._constraints, self.point_indices))).reshape(-1, 6)
111
+
112
+ def section_actions(self, point_wrenches):
113
+ result = []
114
+ for station, offset, wrench in zip(self.stations, self.offsets, point_wrenches):
115
+ if 0. < station < 1.:
116
+ shifted = _axis_wrench(tuple(Fraction(float(v)) for v in wrench),
117
+ tuple(Fraction(v) for v in offset))
118
+ result.append((station, _array(shifted)))
119
+ return tuple(result)
120
+
121
+ def bubble_state(self, acceleration, multipliers):
122
+ uniform = self.body_uniform(acceleration)
123
+ points = self.port_wrenches(multipliers)
124
+ response = self.maps.evaluate(uniform, point_wrenches=points)
125
+ work = Fraction(0)
126
+ count = len(self.entries)
127
+ for wrench, pose in zip(points, response.pose[:count]):
128
+ work += sum(Fraction(float(a))*Fraction(float(b)) for a, b in zip(wrench, pose))
129
+ for weight, pose in zip(self.quadrature_weights, response.pose[count:]):
130
+ work += Fraction(float(weight))*sum(Fraction(float(a))*Fraction(float(b))
131
+ for a, b in zip(uniform, pose))
132
+ energy = _float(work/2)
133
+ if energy < 0.:
134
+ raise RepresentabilityError("loaded-point bubble energy is negative")
135
+ return uniform, points, energy
136
+
137
+ def recover_pose(self, local, stations, uniform, point_wrenches):
138
+ stations = tuple(float(v) for v in stations)
139
+ operator = self.member.operator
140
+ if stations not in self._recovery_maps:
141
+ # Use the canonical exact bubble kernel; do not compile another Green
142
+ # matrix or integrate the final recovered section strains each case.
143
+ basis = tuple(tuple(Fraction(int(i == j)) for i in range(6)) for j in range(6))
144
+ zero = (Fraction(0),)*6
145
+ uniform_maps, point_maps = [], []
146
+ for value in stations:
147
+ at = Fraction(value)
148
+ columns = tuple(_axis_bubble(operator.length, operator._compliance,
149
+ _multiply(operator._uniform_load_map, unit), unit, at) for unit in basis)
150
+ uniform_maps.append(tuple(tuple(columns[c][r] for c in range(6)) for r in range(6)))
151
+ sources = []
152
+ for j, source in enumerate(self.stations):
153
+ columns = tuple(_axis_bubble(operator.length, operator._compliance,
154
+ tuple(self.maps._point_equivalent_exact[r][j][c] for r in range(12)),
155
+ zero, at, Fraction(source),
156
+ _axis_wrench(unit, tuple(Fraction(v) for v in self.offsets[j])))
157
+ for c, unit in enumerate(basis))
158
+ sources.append(tuple(tuple(columns[c][r] for c in range(6)) for r in range(6)))
159
+ point_maps.append(tuple(sources))
160
+ self._recovery_maps[stations] = (tuple(uniform_maps), tuple(point_maps))
161
+ uniform_maps, point_maps = self._recovery_maps[stations]
162
+ w = tuple(Fraction(float(v)) for v in uniform)
163
+ points = tuple(tuple(Fraction(float(v)) for v in row) for row in point_wrenches)
164
+ nodal = tuple(Fraction(float(v)) for v in local)
165
+ poses = []
166
+ for at, body, ports in zip(stations, uniform_maps, point_maps):
167
+ homogeneous = tuple(sum(_poly_value(poly, Fraction(at))*value for poly, value in zip(row, nodal))
168
+ for row in operator._trace_polynomials)
169
+ loaded = _multiply(body, w)
170
+ for matrix, wrench in zip(ports, points):
171
+ loaded = [a+b for a, b in zip(loaded, _multiply(matrix, wrench))]
172
+ poses.append(tuple(a+b for a, b in zip(homogeneous, loaded)))
173
+ return _array(poses).reshape(len(stations), 6)