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,707 @@
1
+ """Experimental straight-reference B2 elastic force-flexibility operator.
2
+
3
+ This local operator makes no qualification claim. Its reference-linear consumers
4
+ admit operations separately. Coordinates are local [u,v,w,rx,ry,rz] at each node;
5
+ section resultants/strains are [N,Vy,Vz,T,My,Mz]. Exact rational arithmetic
6
+ retains weak shear modes until the requested binary64 output is rounded.
7
+ """
8
+
9
+ from dataclasses import dataclass
10
+ from fractions import Fraction
11
+ import math
12
+
13
+ import numpy as np
14
+
15
+
16
+ OPERATOR_ID = "B2_PHYSICAL_FLEXIBILITY_LINEAR_V1"
17
+ OUTPUT_REPRESENTATION_ID = "B2_BOUNDED_OUTPUT_REPRESENTATION_V1"
18
+ _ENERGY_LIMIT = Fraction(1, 10**8)
19
+ _RIGID_LIMIT = Fraction(1, 10**9)
20
+
21
+
22
+ class RepresentabilityError(ValueError):
23
+ """A nonzero physical result cannot be represented in binary64."""
24
+
25
+
26
+ class ConditioningAdmissionError(ValueError):
27
+ """Local numerical output cannot meet its declared representation limits."""
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ class OutputRepresentationCertificate:
32
+ """Basic energies and separate bounded rigid/cross work, not graph stability.
33
+
34
+ Errors are exact rational ratios. This certifies rounding of the implemented
35
+ law, whose physical correctness still needs independent mechanics oracles.
36
+ """
37
+
38
+ basic_energy_preserved: bool
39
+ rigid_work_preserved: bool
40
+ cross_work_preserved: bool
41
+ rigid_wrench_error: Fraction
42
+ rigid_work_error: Fraction
43
+ cross_work_error: Fraction
44
+ identity: str = OUTPUT_REPRESENTATION_ID
45
+
46
+ @property
47
+ def passed(self):
48
+ return (self.basic_energy_preserved and self.rigid_work_preserved and
49
+ self.cross_work_preserved)
50
+
51
+
52
+ class OutputRepresentationError(ConditioningAdmissionError):
53
+ """The emitted binary64 tangent failed its bounded local work certificate."""
54
+
55
+ def __init__(self, certificate):
56
+ self.certificate = certificate
57
+ failed = [name for name, passed in (
58
+ ("basic energy", certificate.basic_energy_preserved),
59
+ ("rigid work", certificate.rigid_work_preserved),
60
+ ("cross work", certificate.cross_work_preserved)) if not passed]
61
+ super().__init__("physical B2 tangent output representation failed: " +
62
+ ", ".join(failed))
63
+
64
+
65
+ def _positive(value):
66
+ if type(value) not in (int, float) or not math.isfinite(value) or value <= 0:
67
+ raise ValueError("positive finite nonboolean physical input required")
68
+ return Fraction(float(value))
69
+
70
+
71
+ def _float(value):
72
+ try:
73
+ result = float(value)
74
+ except OverflowError as exc:
75
+ raise RepresentabilityError("physical B2 output overflow") from exc
76
+ if not math.isfinite(result) or (value != 0 and result == 0):
77
+ raise RepresentabilityError("physical B2 output overflow or underflow")
78
+ # A nonzero subnormal can still be a poor representation of an exact
79
+ # physical result. Compare as rationals so the check itself does not
80
+ # underflow or round away the error. Normal binary64 rounding satisfies
81
+ # this bound. This checks the declared numerical output units (public
82
+ # physical definitions use SI); it is not a physical or unit-covariant
83
+ # constitutive tolerance near binary64 underflow.
84
+ if value != 0:
85
+ exact = Fraction(value)
86
+ if abs(Fraction(result) - exact) > abs(exact) / (1 << 52):
87
+ raise RepresentabilityError("physical B2 output loses binary64 relative precision")
88
+ return result
89
+
90
+
91
+ def _array(value):
92
+ array = np.asarray(value, dtype=object)
93
+ return np.array([_float(item) for item in array.flat], dtype=float).reshape(array.shape)
94
+
95
+
96
+ def _inverse_spd(matrix):
97
+ """Exact LDL and inverse of the supplied law; no floating pivot heuristic.
98
+
99
+ SPD is an input-law check. Emitted numerical tangents receive a separate
100
+ output certificate, and assembled solves retain their equilibrium checks.
101
+ """
102
+ n = len(matrix)
103
+ diagonal = [matrix[i][i] for i in range(n)]
104
+ if any(d <= 0 for d in diagonal):
105
+ raise ValueError("positive-definite physical section/flexibility required")
106
+ lower = [[Fraction(int(i == j)) for j in range(n)] for i in range(n)]
107
+ pivots = []
108
+ for j in range(n):
109
+ pivot = matrix[j][j] - sum(lower[j][k]**2 * pivots[k] for k in range(j))
110
+ if pivot <= 0:
111
+ raise ValueError("positive-definite physical section/flexibility required")
112
+ pivots.append(pivot)
113
+ for i in range(j + 1, n):
114
+ lower[i][j] = (matrix[i][j] - sum(
115
+ lower[i][k] * pivots[k] * lower[j][k] for k in range(j)
116
+ )) / pivot
117
+ columns = []
118
+ for column in range(n):
119
+ y = []
120
+ for i in range(n):
121
+ y.append(Fraction(int(i == column)) - sum(lower[i][k] * y[k] for k in range(i)))
122
+ z = [y[i] / pivots[i] for i in range(n)]
123
+ x = [Fraction(0)] * n
124
+ for i in range(n - 1, -1, -1):
125
+ x[i] = z[i] - sum(lower[k][i] * x[k] for k in range(i + 1, n))
126
+ columns.append(x)
127
+ return [[columns[j][i] for j in range(n)] for i in range(n)]
128
+
129
+
130
+ def _basic(length):
131
+ B = [[Fraction(0) for _ in range(12)] for _ in range(6)]
132
+ B[0][0], B[0][6] = -1, 1
133
+ B[1][3], B[1][9] = -1, 1
134
+ for row, rotation in ((2, 4), (3, 10)):
135
+ B[row][2], B[row][8], B[row][rotation] = -1 / length, 1 / length, 1
136
+ for row, rotation in ((4, 5), (5, 11)):
137
+ B[row][1], B[row][7], B[row][rotation] = 1 / length, -1 / length, 1
138
+ return B
139
+
140
+
141
+ def _interpolation(length, station):
142
+ t = station / length
143
+ H = [[Fraction(0) for _ in range(6)] for _ in range(6)]
144
+ H[0][0] = H[3][1] = 1
145
+ H[2][2] = H[2][3] = 1 / length
146
+ H[4][2], H[4][3] = t - 1, t
147
+ H[1][4] = H[1][5] = -1 / length
148
+ H[5][4], H[5][5] = t - 1, t
149
+ return H
150
+
151
+
152
+ def _multiply(matrix, vector):
153
+ return [sum(a * b for a, b in zip(row, vector)) for row in matrix]
154
+
155
+
156
+ def _transpose(matrix):
157
+ return list(map(list, zip(*matrix)))
158
+
159
+
160
+ def _matmul(a, b):
161
+ return [[sum((x*y for x, y in zip(row, column)), Fraction(0))
162
+ for column in zip(*b)] for row in a]
163
+
164
+
165
+ def _positive_semidefinite(matrix):
166
+ """Exact symmetric Schur test; zero pivots require a zero residual column."""
167
+ work = [list(row) for row in matrix]
168
+ if work != _transpose(work):
169
+ raise ValueError("symmetric physical work certificate required")
170
+ for j in range(len(work)):
171
+ pivot = work[j][j]
172
+ if pivot < 0:
173
+ return False
174
+ if not pivot:
175
+ if any(work[i][j] for i in range(j+1, len(work))):
176
+ return False
177
+ continue
178
+ for i in range(j+1, len(work)):
179
+ for k in range(j+1, len(work)):
180
+ work[i][k] -= work[i][j]*work[j][k]/pivot
181
+ return True
182
+
183
+
184
+ def _nodal_tangent(operator):
185
+ # One exact action per nodal column; all returned coefficients retain the
186
+ # previous exact formulas before binary64 rounding.
187
+ columns = [operator._basic_action([row[column] for row in operator._B])
188
+ for column in range(12)]
189
+ return tuple(tuple(_float(sum(operator._B[j][i]*columns[column][j]
190
+ for j in range(6)))
191
+ for column in range(12)) for i in range(12))
192
+
193
+
194
+ def _certify_output_tangent(operator, tangent):
195
+ """Certify the emitted tangent with the reviewed bounded physical norms.
196
+
197
+ The basic-energy inequalities hold for all basic directions. Separate rigid
198
+ and cross limits apply to normalized amplitude cubes, not an all-amplitude
199
+ relative energy bound or one combined total-energy estimate. No matrix is
200
+ symmetrized. Assembled graph/affine solve checks remain mandatory.
201
+ """
202
+ emitted = np.asarray(tangent, dtype=float)
203
+ if (emitted.shape != (12, 12) or not np.isfinite(emitted).all() or
204
+ not np.array_equal(emitted, emitted.T)):
205
+ raise RepresentabilityError("finite symmetric physical B2 tangent required")
206
+ length = operator.length
207
+ B = operator._B
208
+ A = _transpose([operator._basic_action(
209
+ [Fraction(i == j) for i in range(6)]) for j in range(6)])
210
+ # Canonical right inverse: first node fixed, B[:, 6:] inverted exactly.
211
+ R = [[Fraction(0)]*6 for _ in range(12)]
212
+ R[6][0] = R[9][1] = 1
213
+ R[8][2], R[10][2], R[10][3] = length, -1, 1
214
+ R[7][4], R[11][4], R[11][5] = -length, -1, 1
215
+ if _matmul(B, R) != [[Fraction(i == j) for j in range(6)] for i in range(6)]:
216
+ raise RuntimeError("physical B2 basic/right-inverse contract mismatch")
217
+ Z = [[Fraction(0)]*6 for _ in range(12)]
218
+ for end, x in ((0, -length/2), (6, length/2)):
219
+ for axis in range(3):
220
+ Z[end+axis][axis] = length
221
+ Z[end+3+axis][3+axis] = 1
222
+ Z[end+2][4], Z[end+1][5] = -x, x
223
+ if any(v for row in _matmul(B, Z) for v in row):
224
+ raise RuntimeError("physical B2 basic/rigid-kernel contract mismatch")
225
+ K = [[Fraction(float(v)) for v in row] for row in emitted]
226
+ pulled = _matmul(_matmul(_transpose(R), K), R)
227
+ delta = [[pulled[i][j]-A[i][j] for j in range(6)] for i in range(6)]
228
+ energy_ok = all(_positive_semidefinite([
229
+ [_ENERGY_LIMIT*A[i][j]+sign*delta[i][j] for j in range(6)]
230
+ for i in range(6)]) for sign in (-1, 1))
231
+ S = operator._stiffness
232
+ force = max([S[i][i] for i in range(3)] +
233
+ [S[i][i]/length**2 for i in range(3, 6)])
234
+ energy = force*length
235
+ wrench_scales = [force]*3+[force*length]*3
236
+ KZ = _matmul(K, Z)
237
+ rigid_wrench = max(sum(abs(v) for v in row)/wrench_scales[i % 6]
238
+ for i, row in enumerate(KZ))
239
+ rigid_work = sum(abs(v) for row in _matmul(_transpose(Z), KZ)
240
+ for v in row)/energy
241
+ R_scaled = [[v*(length if j == 0 else 1) for j, v in enumerate(row)]
242
+ for row in R]
243
+ cross_work = sum(abs(v) for row in _matmul(
244
+ _matmul(_transpose(Z), K), R_scaled) for v in row)/energy
245
+ certificate = OutputRepresentationCertificate(
246
+ energy_ok, rigid_wrench <= _RIGID_LIMIT and rigid_work <= _ENERGY_LIMIT,
247
+ cross_work <= _ENERGY_LIMIT, rigid_wrench, rigid_work, cross_work)
248
+ if not certificate.passed:
249
+ raise OutputRepresentationError(certificate)
250
+ return certificate
251
+
252
+
253
+ def _flexibility(length, compliance):
254
+ # H(t) is affine: the exact integral uses endpoint values and their cross terms.
255
+ h0, h1 = _interpolation(length, Fraction(0)), _interpolation(length, length)
256
+ result = [[Fraction(0) for _ in range(6)] for _ in range(6)]
257
+ for i in range(6):
258
+ for j in range(6):
259
+ result[i][j] = length * sum(
260
+ compliance[a][b] * (
261
+ h0[a][i]*h0[b][j]*Fraction(1, 3)
262
+ + h1[a][i]*h1[b][j]*Fraction(1, 3)
263
+ + (h0[a][i]*h1[b][j] + h1[a][i]*h0[b][j])*Fraction(1, 6)
264
+ ) for a in range(6) for b in range(6)
265
+ )
266
+ return result
267
+
268
+
269
+ def _separated_basic_inverse(length, flexibility):
270
+ """Invert in a fixed midpoint shear/moment basis, return original q rows.
271
+
272
+ The exact congruence changes only the inversion coordinates. Section
273
+ resultants, basic displacements and station traces retain their original
274
+ physical conventions.
275
+ """
276
+ change = [[Fraction(0) for _ in range(6)] for _ in range(6)]
277
+ change[0][0], change[1][1] = 1, length
278
+ change[2][2] = change[3][2] = length/2
279
+ change[2][3], change[3][3] = -length, length
280
+ change[4][4] = change[5][4] = -length/2
281
+ change[4][5], change[5][5] = -length, length
282
+ separated = [[sum(change[a][i]*flexibility[a][b]*change[b][j]
283
+ for a in range(6) for b in range(6))
284
+ for j in range(6)] for i in range(6)]
285
+ inverse = _inverse_spd(separated)
286
+ return [[sum(change[i][a]*inverse[a][b]*change[j][b]
287
+ for a in range(6) for b in range(6))
288
+ for j in range(6)] for i in range(6)]
289
+
290
+
291
+ @dataclass(frozen=True)
292
+ class LinearSection:
293
+ stiffness: tuple[tuple[float, ...], ...]
294
+ kind: str
295
+ operator_id: str = OPERATOR_ID
296
+ # E, nu, area, Iy, Iz, J, ky, kz; absent for a generalized 6x6 law.
297
+ scalar_parameters: tuple[float, ...] | None = None
298
+
299
+ def __post_init__(self):
300
+ if self.operator_id != OPERATOR_ID or self.kind not in ("isotropic_scalar", "elastic_generalized"):
301
+ raise ValueError("explicit physical linear B2 section identity required")
302
+ try:
303
+ data = np.asarray(self.stiffness, dtype=float)
304
+ except (TypeError, ValueError) as exc:
305
+ raise ValueError("finite 6x6 physical section required") from exc
306
+ if data.shape != (6, 6) or not np.isfinite(data).all() or not np.array_equal(data, data.T):
307
+ raise ValueError("finite symmetric 6x6 physical section required")
308
+ if self.kind == "isotropic_scalar" and np.count_nonzero(data - np.diag(np.diag(data))):
309
+ raise ValueError("isotropic scalar section cannot contain coupling")
310
+ if self.kind == "isotropic_scalar":
311
+ values = self.scalar_parameters
312
+ if values is None or len(values) != 8:
313
+ raise ValueError("isotropic scalar source parameters required")
314
+ E, nu, area, Iy, Iz, J, ky, kz = values
315
+ e, a, iy, iz, j, y, z = map(_positive, (E, area, Iy, Iz, J, ky, kz))
316
+ if type(nu) not in (int, float) or not math.isfinite(nu) or not -1 < nu < .5:
317
+ raise ValueError("physical isotropic Poisson ratio required")
318
+ g = e / (2 * (1 + Fraction(float(nu))))
319
+ expected = [_float(value) for value in
320
+ (e*a, g*a*y, g*a*z, g*j, e*iy, e*iz)]
321
+ if not np.array_equal(np.diag(data), expected):
322
+ raise ValueError("scalar stiffness does not match source parameters")
323
+ object.__setattr__(self, "scalar_parameters", tuple(float(v) for v in values))
324
+ elif self.scalar_parameters is not None:
325
+ raise ValueError("generalized stiffness has no scalar source parameters")
326
+ _inverse_spd([[Fraction(v) for v in row] for row in data])
327
+ # Own the descriptor even when a caller supplied mutable nested lists.
328
+ object.__setattr__(self, "stiffness", tuple(tuple(float(v) for v in row) for row in data))
329
+
330
+ @classmethod
331
+ def isotropic(cls, *, E, nu, area, Iy, Iz, J, ky, kz):
332
+ e, a, iy, iz, j, y, z = map(_positive, (E, area, Iy, Iz, J, ky, kz))
333
+ if type(nu) not in (int, float) or not math.isfinite(nu) or not -1 < nu < .5:
334
+ raise ValueError("physical isotropic Poisson ratio required")
335
+ g = e / (2 * (1 + Fraction(float(nu))))
336
+ values = [e*a, g*a*y, g*a*z, g*j, e*iy, e*iz]
337
+ # Do not hide unrepresentable physical section data behind a floor.
338
+ diagonal = [_float(value) for value in values]
339
+ return cls(tuple(tuple(diagonal[i] if i == j else 0.0 for j in range(6))
340
+ for i in range(6)), "isotropic_scalar",
341
+ scalar_parameters=(E, nu, area, Iy, Iz, J, ky, kz))
342
+
343
+ @classmethod
344
+ def generalized(cls, stiffness):
345
+ try:
346
+ data = np.asarray(stiffness, dtype=float)
347
+ except (TypeError, ValueError) as exc:
348
+ raise ValueError("finite 6x6 generalized section required") from exc
349
+ if data.shape != (6, 6) or not np.isfinite(data).all() or not np.array_equal(data, data.T):
350
+ raise ValueError("finite symmetric 6x6 generalized section required")
351
+ return cls(tuple(tuple(float(v) for v in row) for row in data), "elastic_generalized")
352
+
353
+
354
+ @dataclass(frozen=True)
355
+ class LocalResponse:
356
+ energy: float
357
+ force: np.ndarray
358
+ tangent: np.ndarray
359
+ basic_force: np.ndarray
360
+ resultants: np.ndarray
361
+ strains: np.ndarray
362
+ stations: np.ndarray
363
+ operator_id: str = OPERATOR_ID
364
+ production_qualified: bool = False
365
+
366
+
367
+ @dataclass(frozen=True)
368
+ class LocalSectionRecovery:
369
+ """Selected station quantities without a force/tangent evaluation."""
370
+
371
+ resultants: np.ndarray
372
+ strains: np.ndarray
373
+ stations: np.ndarray
374
+ operator_id: str = OPERATOR_ID
375
+ production_qualified: bool = False
376
+
377
+
378
+ @dataclass(frozen=True)
379
+ class EquilibratedSectionRecovery:
380
+ """Static admissible fields, distinct from the nodal interpolation strain.
381
+
382
+ Interior concentrated actions have explicit left/right traces. At member
383
+ endpoints both columns are the inward trace. No loaded interior pose or
384
+ attachment compatibility is implied by these reconstructed fields.
385
+ """
386
+
387
+ stations: np.ndarray
388
+ resultants_left: np.ndarray
389
+ resultants_right: np.ndarray
390
+ strains_left: np.ndarray
391
+ strains_right: np.ndarray
392
+ endpoint_tractions: np.ndarray
393
+ operator_id: str = OPERATOR_ID
394
+ production_qualified: bool = False
395
+
396
+ def __post_init__(self):
397
+ n = len(self.stations)
398
+ for name, shape in (("stations", (n,)), ("resultants_left", (n, 6)),
399
+ ("resultants_right", (n, 6)), ("strains_left", (n, 6)),
400
+ ("strains_right", (n, 6)), ("endpoint_tractions", (12,))):
401
+ value = np.asarray(getattr(self, name), dtype=float)
402
+ if value.shape != shape or not np.isfinite(value).all():
403
+ raise RepresentabilityError("equilibrated section field is not representable")
404
+ object.__setattr__(self, name, np.frombuffer(value.tobytes(), dtype=float).reshape(shape))
405
+
406
+
407
+ @dataclass(frozen=True)
408
+ class LinearTrace:
409
+ """Owned local reference points, offset poses, and their nodal derivatives."""
410
+
411
+ stations: np.ndarray
412
+ reference_points: np.ndarray
413
+ pose: np.ndarray
414
+ jacobian: np.ndarray
415
+ operator_id: str = OPERATOR_ID
416
+ production_qualified: bool = False
417
+
418
+
419
+ def _pose_polynomials(length, e0, e1, nodal):
420
+ """Exact coefficients in normalized station t, ordered [u,v,w,rx,ry,rz]."""
421
+ zero = Fraction(0)
422
+ result = [[zero]*4 for _ in range(6)]
423
+ result[0] = [nodal[0], length*e0[0], length*e1[0]/2, zero]
424
+ for row, strain in ((3, 3), (4, 4), (5, 5)):
425
+ result[row] = [nodal[row], length*e0[strain], length*e1[strain]/2, zero]
426
+ result[1] = [nodal[1], length*(e0[1]+nodal[5]),
427
+ length*(e1[1]+length*e0[5])/2, length**2*e1[5]/6]
428
+ result[2] = [nodal[2], length*(e0[2]-nodal[4]),
429
+ length*(e1[2]-length*e0[4])/2, -length**2*e1[4]/6]
430
+ return result
431
+
432
+
433
+ class LinearOperator:
434
+ """Physical local tangent and station response; independent of public B2."""
435
+
436
+ __slots__ = ("length", "section", "_stiffness", "_compliance", "_B",
437
+ "_modal", "_basic_inverse", "_trace_polynomials", "_sealed",
438
+ "_tangent", "_output_certificate", "_uniform_load_map")
439
+
440
+ def __setattr__(self, name, value):
441
+ if getattr(self, "_sealed", False):
442
+ raise AttributeError("physical B2 operator is immutable")
443
+ object.__setattr__(self, name, value)
444
+
445
+ def __delattr__(self, name):
446
+ if getattr(self, "_sealed", False):
447
+ raise AttributeError("physical B2 operator is immutable")
448
+ object.__delattr__(self, name)
449
+
450
+ def __init__(self, length, section: LinearSection):
451
+ self.length = _positive(length)
452
+ if not isinstance(section, LinearSection) or section.operator_id != OPERATOR_ID:
453
+ raise ValueError("explicit physical linear B2 section required")
454
+ self.section = section
455
+ self._stiffness = tuple(tuple(Fraction(value) for value in row) for row in section.stiffness)
456
+ self._compliance = tuple(tuple(row) for row in _inverse_spd(self._stiffness))
457
+ self._B = tuple(tuple(row) for row in _basic(self.length))
458
+ if section.kind == "isotropic_scalar":
459
+ s = [self._stiffness[i][i] for i in range(6)]
460
+ kp_y = 1 / (self.length/(6*s[4]) + 2/(s[2]*self.length))
461
+ kp_z = 1 / (self.length/(6*s[5]) + 2/(s[1]*self.length))
462
+ self._modal = (s[0]/self.length, s[3]/self.length,
463
+ kp_y, 2*s[4]/self.length, kp_z, 2*s[5]/self.length)
464
+ for value in self._modal:
465
+ _float(value)
466
+ else:
467
+ self._basic_inverse = tuple(tuple(row) for row in
468
+ _separated_basic_inverse(self.length,
469
+ _flexibility(self.length, self._compliance)))
470
+ h0 = _interpolation(self.length, Fraction(0))
471
+ h1 = _interpolation(self.length, self.length)
472
+ coefficients = [[[Fraction(0) for _ in range(4)] for _ in range(12)]
473
+ for _ in range(6)]
474
+ for column in range(12):
475
+ nodal = [Fraction(int(i == column)) for i in range(12)]
476
+ q = self._basic_action(_multiply(self._B, nodal))
477
+ e0 = _multiply(self._compliance, _multiply(h0, q))
478
+ e1 = _multiply(self._compliance, _multiply(
479
+ [[h1[i][j]-h0[i][j] for j in range(6)] for i in range(6)], q))
480
+ pose = _pose_polynomials(self.length, e0, e1, nodal)
481
+ for row in range(6):
482
+ coefficients[row][column] = pose[row]
483
+ self._trace_polynomials = tuple(tuple(tuple(poly) for poly in row)
484
+ for row in coefficients)
485
+ self._uniform_load_map = tuple(tuple(self.length*sum(
486
+ coefficient/Fraction(degree+1) for degree, coefficient in
487
+ enumerate(self._trace_polynomials[row][column])) for row in range(6))
488
+ for column in range(12))
489
+ self._tangent = _nodal_tangent(self)
490
+ self._output_certificate = _certify_output_tangent(self, self._tangent)
491
+ self._sealed = True
492
+
493
+ @property
494
+ def output_certificate(self):
495
+ """Immutable bounded local certificate; not production qualification."""
496
+ return self._output_certificate
497
+
498
+ @property
499
+ def basic_matrix(self):
500
+ return _array(self._B)
501
+
502
+ @property
503
+ def modal_stiffness(self):
504
+ return None if self.section.kind != "isotropic_scalar" else _array(self._modal)
505
+
506
+ def _basic_action(self, basic):
507
+ if self.section.kind != "isotropic_scalar":
508
+ return _multiply(self._basic_inverse, basic)
509
+ ka, kt, kp_y, km_y, kp_z, km_z = self._modal
510
+ q = [ka*basic[0], kt*basic[1]]
511
+ for i, kp, km in ((2, kp_y, km_y), (4, kp_z, km_z)):
512
+ plus = kp*(basic[i]+basic[i+1])/2
513
+ minus = km*(basic[i]-basic[i+1])/2
514
+ q.extend((plus+minus, plus-minus))
515
+ return q
516
+
517
+ def trace(self, displacement, *, stations=(0.0, 0.5, 1.0),
518
+ offset_local_m=(0.0, 0.0, 0.0)):
519
+ """Private small-rotation physical pose and exact offset-point pullback."""
520
+ try:
521
+ u = np.asarray(displacement, dtype=float)
522
+ x = np.asarray(stations, dtype=float)
523
+ offset = np.asarray(offset_local_m, dtype=float)
524
+ except (TypeError, ValueError, OverflowError) as exc:
525
+ raise ValueError("finite local coordinates, stations and offset required") from exc
526
+ if u.shape != (12,) or not np.isfinite(u).all():
527
+ raise ValueError("twelve finite local coordinates required")
528
+ if x.ndim != 1 or not np.isfinite(x).all() or np.any((x < 0) | (x > 1)):
529
+ raise ValueError("stations must be finite normalized coordinates in [0,1]")
530
+ if offset.shape != (3,) or not np.isfinite(offset).all():
531
+ raise ValueError("three finite local offset coordinates required")
532
+ d = [Fraction(float(value)) for value in offset]
533
+ nodal = [Fraction(float(value)) for value in u]
534
+ points, poses, maps = [], [], []
535
+ for station in x:
536
+ t = Fraction(float(station))
537
+ center = [[sum(coefficient*t**degree for degree, coefficient in enumerate(poly))
538
+ for poly in row] for row in self._trace_polynomials]
539
+ # The point displacement is r + theta cross d. Its force
540
+ # pullback therefore includes the offset's d cross F moment.
541
+ for row, rotational, sign in ((0, (4, 5), (d[2], -d[1])),
542
+ (1, (5, 3), (d[0], -d[2])),
543
+ (2, (3, 4), (d[1], -d[0]))):
544
+ center[row] = [value + sign[0]*center[rotational[0]][col]
545
+ + sign[1]*center[rotational[1]][col]
546
+ for col, value in enumerate(center[row])]
547
+ maps.append(center)
548
+ poses.append(_multiply(center, nodal))
549
+ points.append([self.length*t+d[0], d[1], d[2]])
550
+ n = len(x)
551
+ return LinearTrace(np.array(x, dtype=float, copy=True),
552
+ _array(np.asarray(points, dtype=object).reshape(n, 3)),
553
+ _array(np.asarray(poses, dtype=object).reshape(n, 6)),
554
+ _array(np.asarray(maps, dtype=object).reshape(n, 6, 12)))
555
+
556
+ def _section_response(self, basic_force, stations):
557
+ resultants, strains = [], []
558
+ for t in stations:
559
+ resultant = _multiply(
560
+ _interpolation(self.length, self.length*Fraction(float(t))),
561
+ basic_force)
562
+ resultants.append(resultant)
563
+ strains.append(_multiply(self._compliance, resultant))
564
+ return _array(resultants), _array(strains)
565
+
566
+ def recover_sections(self, displacement, *, stations=(0.0, 0.5, 1.0)):
567
+ """Recover only requested local resultants and strains from a state."""
568
+ try:
569
+ u = np.asarray(displacement, dtype=float)
570
+ x = np.asarray(stations, dtype=float)
571
+ except (TypeError, ValueError) as exc:
572
+ raise ValueError("finite local coordinates and stations required") from exc
573
+ if u.shape != (12,) or not np.isfinite(u).all():
574
+ raise ValueError("twelve finite local coordinates required")
575
+ if x.ndim != 1 or not np.isfinite(x).all() or np.any((x < 0) | (x > 1)):
576
+ raise ValueError("stations must be finite normalized coordinates in [0,1]")
577
+ basic = _multiply(self._B, [Fraction(float(v)) for v in u])
578
+ q = self._basic_action(basic)
579
+ resultants, strains = self._section_response(q, x)
580
+ return LocalSectionRecovery(
581
+ resultants, strains, np.array(x, dtype=float, copy=True))
582
+
583
+ def recover_equilibrated_sections(self, displacement, *, uniform_wrench=(0.,)*6,
584
+ point_actions=(), stations=(0., .5, 1.)):
585
+ """Reconstruct equilibrium under force/couple per reference length.
586
+
587
+ Point actions are (normalized interior station, external local wrench
588
+ about the reference axis). Endpoint actions remain nodal tractions.
589
+ Existing trace/element equations and nodal recovery are unchanged.
590
+ """
591
+ try:
592
+ u = np.asarray(displacement, dtype=float)
593
+ w = np.asarray(uniform_wrench, dtype=float)
594
+ x = np.asarray(stations, dtype=float)
595
+ submitted = tuple(point_actions)
596
+ except (TypeError, ValueError, OverflowError) as exc:
597
+ raise ValueError("finite local state and physical section actions required") from exc
598
+ if (u.shape != (12,) or w.shape != (6,) or x.ndim != 1 or
599
+ not np.isfinite(u).all() or not np.isfinite(w).all() or
600
+ not np.isfinite(x).all() or np.any((x < 0.) | (x > 1.))):
601
+ raise ValueError("finite local state, wrench and normalized stations required")
602
+ actions = []
603
+ for action in submitted:
604
+ try:
605
+ station, wrench = action
606
+ values = np.asarray(wrench, dtype=float)
607
+ except (TypeError, ValueError, OverflowError) as exc:
608
+ raise ValueError("interior physical point action required") from exc
609
+ if (isinstance(station, (bool, np.bool_)) or not isinstance(station, (int, float)) or
610
+ not math.isfinite(station) or not 0. < station < 1. or
611
+ values.shape != (6,) or not np.isfinite(values).all()):
612
+ raise ValueError("finite strictly interior physical point action required")
613
+ actions.append((Fraction(float(station)), [Fraction(float(v)) for v in values]))
614
+ nodal = [Fraction(float(v)) for v in u]
615
+ distributed = [Fraction(float(v)) for v in w]
616
+ basic = self._basic_action(_multiply(self._B, nodal))
617
+ internal = _multiply(_transpose(self._B), basic)
618
+ # Integrate the existing polynomial trace exactly. No new stiffness,
619
+ # internal coordinate, numerical quadrature or dense global operation.
620
+ equivalent = _multiply(self._uniform_load_map, distributed)
621
+ for station, wrench in actions:
622
+ for column in range(12):
623
+ equivalent[column] += sum(wrench[row]*sum(
624
+ coefficient*station**degree for degree, coefficient in
625
+ enumerate(self._trace_polynomials[row][column])) for row in range(6))
626
+ tractions = [a-b for a,b in zip(internal, equivalent)]
627
+ left = [-v for v in tractions[:6]]
628
+
629
+ def cross_axis(vector):
630
+ return (Fraction(0), -vector[2], vector[1])
631
+
632
+ def section(station, right):
633
+ distance = self.length*station
634
+ n = [left[i]-distance*distributed[i] for i in range(3)]
635
+ hn, wp = cross_axis(left), cross_axis(distributed)
636
+ m = [left[i+3]-distance*hn[i]-distance*distributed[i+3]+distance**2*wp[i]/2
637
+ for i in range(3)]
638
+ for at, wrench in actions:
639
+ if station > at or (right and station == at):
640
+ lever = self.length*(station-at)
641
+ turn = cross_axis(wrench)
642
+ n = [n[i]-wrench[i] for i in range(3)]
643
+ m = [m[i]-wrench[i+3]+lever*turn[i] for i in range(3)]
644
+ return n+m
645
+
646
+ # Exact stored-input work maps must give force and moment closure.
647
+ if section(Fraction(1), True) != tractions[6:]:
648
+ raise RepresentabilityError("equilibrated endpoint traction closure failed")
649
+ low, high, strain_low, strain_high = [], [], [], []
650
+ for value in x:
651
+ station = Fraction(float(value))
652
+ a, b = section(station, False), section(station, True)
653
+ low.append(a); high.append(b)
654
+ strain_low.append(_multiply(self._compliance, a))
655
+ strain_high.append(_multiply(self._compliance, b))
656
+ shape = (len(x), 6)
657
+ return EquilibratedSectionRecovery(np.array(x, copy=True),
658
+ _array(low).reshape(shape), _array(high).reshape(shape),
659
+ _array(strain_low).reshape(shape), _array(strain_high).reshape(shape), _array(tractions))
660
+
661
+ def candidate_constant_axial_geometric_stiffness(self, axial_force):
662
+ """Private centerline-stretch Hessian for constant conservative N.
663
+
664
+ Positive ``axial_force`` denotes tension. This is a member-only
665
+ candidate, without attachment, load or support curvature.
666
+ """
667
+ if (type(axial_force) not in (int, float)
668
+ or not math.isfinite(axial_force)):
669
+ raise ValueError("finite constant physical axial force required")
670
+ force = Fraction(float(axial_force))
671
+ matrix = [[Fraction(0) for _ in range(12)] for _ in range(12)]
672
+ for position_row in (1, 2):
673
+ derivatives = [
674
+ tuple(degree*poly[degree]/self.length for degree in range(1, 4))
675
+ for poly in self._trace_polynomials[position_row]
676
+ ]
677
+ for i in range(12):
678
+ for j in range(i, 12):
679
+ integral = sum(
680
+ a*b/Fraction(p+q+1)
681
+ for p, a in enumerate(derivatives[i])
682
+ for q, b in enumerate(derivatives[j]))
683
+ matrix[i][j] += force*self.length*integral
684
+ for i in range(12):
685
+ for j in range(i):
686
+ matrix[i][j] = matrix[j][i]
687
+ return _array(matrix)
688
+
689
+ def evaluate(self, displacement, *, stations=(0.0, 0.5, 1.0)):
690
+ try:
691
+ u = np.asarray(displacement, dtype=float)
692
+ x = np.asarray(stations, dtype=float)
693
+ except (TypeError, ValueError) as exc:
694
+ raise ValueError("finite local coordinates and stations required") from exc
695
+ if u.shape != (12,) or not np.isfinite(u).all():
696
+ raise ValueError("twelve finite local coordinates required")
697
+ if x.ndim != 1 or not np.isfinite(x).all() or np.any((x < 0) | (x > 1)):
698
+ raise ValueError("stations must be finite normalized coordinates in [0,1]")
699
+ basic = _multiply(self._B, [Fraction(float(v)) for v in u])
700
+ q = self._basic_action(basic)
701
+ force = [sum(self._B[j][i]*q[j] for j in range(6)) for i in range(12)]
702
+ resultants, strains = self._section_response(q, x)
703
+ return LocalResponse(
704
+ _float(sum(b*v for b, v in zip(basic, q))/2), _array(force),
705
+ np.array(self._tangent, dtype=float, copy=True),
706
+ _array(q), resultants, strains, np.array(x, dtype=float, copy=True),
707
+ )