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,254 @@
1
+ """Exact affine-path certificates for physical B3 endpoint projection.
2
+
3
+ This developmental sufficient condition requires globally positive F_t for
4
+ F(t)=(r(t)-p).r_t(t). It deliberately leaves nonconvex distance profiles
5
+ unresolved. Full physical-curve regularity, common time subdivision, topology,
6
+ reciprocity and analytic work (b3_distance_jet) remain caller-owned.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from dataclasses import dataclass
11
+ from fractions import Fraction
12
+ import heapq
13
+ import math
14
+ from numbers import Integral
15
+
16
+ from .beam_curve_pair import CurvePairGapCertificate
17
+ from .beam_temporal_bounds import _split
18
+ from .capped_cylinder import _restrict, _sqrt_bound
19
+ from .sphere_temporal_bounds import _axis, _squared_bounds, _squared_controls
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class EndpointInterval:
24
+ """Fixed closest branch and strict source ownership on the entire path.
25
+
26
+ Negative ownership means source-cap ownership; positive means side
27
+ ownership. Open certificates use zero ownership and bounds [0,1].
28
+ Target endpoint indices use B3 nodal order [start,mid,end]: 0 or 2.
29
+ Parameter bounds are exact rational target coordinates in [0,1].
30
+ """
31
+ open: bool
32
+ ownership: int
33
+ target_endpoint: int | None
34
+ parameter_lower: Fraction
35
+ parameter_upper: Fraction
36
+
37
+
38
+ def _rational(value):
39
+ if isinstance(value, Fraction):
40
+ return value
41
+ if isinstance(value, Integral):
42
+ return Fraction(int(value))
43
+ value = float(value)
44
+ if not math.isfinite(value):
45
+ raise ValueError('B3 endpoint geometry must be finite')
46
+ return Fraction.from_float(value)
47
+
48
+
49
+ def _positions(values):
50
+ result = tuple(tuple(_rational(value) for value in row) for row in values)
51
+ if len(result) != 3 or any(len(row) != 3 for row in result):
52
+ raise ValueError('B3 endpoint geometry requires three 3D nodal positions')
53
+ return result
54
+
55
+
56
+ def _curve_controls(positions):
57
+ # Exact Q2 nodal-to-Bernstein conversion; never discard curvature modes.
58
+ return tuple((a, 2*b-(a+c)/2, c) for a, b, c in zip(*positions))
59
+
60
+
61
+ def _outward_float(value, direction):
62
+ result = float(value)
63
+ if not math.isfinite(result):
64
+ raise ArithmeticError('B3 curve gap bound is not representable')
65
+ result = math.nextafter(result, direction)
66
+ if not math.isfinite(result):
67
+ raise ArithmeticError('B3 outward curve gap bound is not representable')
68
+ return result
69
+
70
+
71
+ def certify_curve_pair_gap(a, b, radius, *, accuracy, maximum_cells,
72
+ maximum_depth):
73
+ """Bound the complete two-Q2-curve minimum gap with exact tensor controls.
74
+
75
+ Relative controls A(s)-B(t) have degree (2,2); squared distance has degree
76
+ (4,4). Every patch lower bound is the maximum of the exact coordinate-box
77
+ lower bound, its squared-distance Bernstein minimum and zero. Actual
78
+ corners and centre supply only an upper bound. Best-first refinement ends
79
+ when all remaining patch lower distances are within the dimensional
80
+ accuracy of the best sampled upper distance. Pruning requires a proved
81
+ inability to improve that sampled minimum, never a sampled lower bound.
82
+ The certificate's minimum_sampled_gap is rounded outward upwards and its
83
+ conservative_lower_gap downwards. Their reported width is <= accuracy.
84
+ Complete curve regularity and scientific acceptance remain caller-owned.
85
+ """
86
+ first, second = map(_curve_controls, map(_positions, (a, b)))
87
+ radius, accuracy = _rational(radius), _rational(accuracy)
88
+ if radius <= 0 or accuracy <= 0:
89
+ raise ValueError('B3 curve gap radius and accuracy must be positive')
90
+ if (type(maximum_cells) is not int or maximum_cells < 1
91
+ or type(maximum_depth) is not int or maximum_depth < 0):
92
+ raise ValueError('B3 curve gap cell/depth budgets are invalid')
93
+ controls = tuple(tuple(tuple(x-y for y in other) for x in lane)
94
+ for lane, other in zip(first, second))
95
+ squared = _squared_controls(controls)
96
+ lower, upper = _squared_bounds(controls, squared)
97
+ heap = [(lower, 0, 0, controls, squared)]
98
+ checked, serial = 1, 0
99
+ while True:
100
+ lower = min(heap[0][0], upper) if heap else upper
101
+ lower_root, upper_root = _sqrt_bound(lower), _sqrt_bound(upper, True)
102
+ if upper_root-lower_root <= accuracy:
103
+ lo = _outward_float(lower_root-radius, -math.inf)
104
+ hi = _outward_float(upper_root-radius, math.inf)
105
+ if _rational(hi)-_rational(lo) <= accuracy:
106
+ return CurvePairGapCertificate(hi, lo, checked, float(accuracy))
107
+ if not heap or lower == upper:
108
+ raise MemoryError('B3 curve gap accuracy is below report precision')
109
+ if checked+2 > maximum_cells:
110
+ raise MemoryError('B3 exact curve gap cell budget exhausted')
111
+ _, _, depth, controls, squared = heapq.heappop(heap)
112
+ if depth >= maximum_depth:
113
+ raise MemoryError('B3 exact curve gap depth budget exhausted')
114
+ axis = _axis(controls)
115
+ pairs = tuple(_split(lane, axis) for lane in controls)
116
+ squared_pair = _split(squared, axis)
117
+ for side in (0, 1):
118
+ child = tuple(pair[side] for pair in pairs)
119
+ child_squared = squared_pair[side]
120
+ child_lower, candidate = _squared_bounds(child, child_squared)
121
+ checked += 1
122
+ upper = min(upper, candidate)
123
+ # Discarded support cannot lower the actual global minimum.
124
+ if child_lower < upper:
125
+ serial += 1
126
+ heapq.heappush(heap, (child_lower, serial, depth+1,
127
+ child, child_squared))
128
+
129
+
130
+ def _values(tensor):
131
+ return tuple(value for row in tensor for value in row)
132
+
133
+
134
+ def _space_derivative(tensor):
135
+ degree = len(tensor)-1
136
+ return tuple(tuple(degree*(b-a) for a, b in zip(first, last))
137
+ for first, last in zip(tensor, tensor[1:]))
138
+
139
+
140
+ def _dot_tensor(first, second):
141
+ # Polarization reuses the existing exact tensor multiplication engine.
142
+ plus = tuple(tuple(tuple(a+b for a, b in zip(row, other))
143
+ for row, other in zip(lane, target))
144
+ for lane, target in zip(first, second))
145
+ minus = tuple(tuple(tuple(a-b for a, b in zip(row, other))
146
+ for row, other in zip(lane, target))
147
+ for lane, target in zip(first, second))
148
+ a, b = _squared_controls(plus), _squared_controls(minus)
149
+ return tuple(tuple((x-y)/4 for x, y in zip(row, other))
150
+ for row, other in zip(a, b))
151
+
152
+
153
+ def _interior_bracket(stationarity):
154
+ """Enclose all temporal roots using strict exact Bernstein sign bounds.
155
+
156
+ Each search refines target coordinate only. A midpoint whose time hull
157
+ crosses zero cannot move the certified edge. Twelve steps are a finite
158
+ developmental bound; inability to resolve ownership is returned to caller.
159
+ """
160
+ bounds = []
161
+ for lower in (True, False):
162
+ left, right = Fraction(0), Fraction(1)
163
+ current = stationarity
164
+ certified = left if lower else right
165
+ for _ in range(12):
166
+ first, last = _split(current, 0)
167
+ middle = (left+right)/2
168
+ values = first[-1]
169
+ sign_proved = max(values) < 0 if lower else min(values) > 0
170
+ if lower:
171
+ if sign_proved:
172
+ certified, left, current = middle, middle, last
173
+ else:
174
+ right, current = middle, first
175
+ else:
176
+ if sign_proved:
177
+ certified, right, current = middle, middle, first
178
+ else:
179
+ left, current = middle, last
180
+ bounds.append(certified)
181
+ return tuple(bounds)
182
+
183
+
184
+ def _restrict_space(vector, left, right):
185
+ # All spatial lanes have degree two. The bracket is dyadic, so _restrict's
186
+ # scalar conversion is exact; geometry controls themselves stay rational.
187
+ return tuple(tuple(zip(*_restrict(tuple(zip(*lane)), left, right)))
188
+ for lane in vector)
189
+
190
+
191
+ def endpoint_interval(source0, source1, target0, target1, endpoint, radius):
192
+ """Return a whole affine-path certificate, or None when unresolved.
193
+
194
+ Distance squared has exact tensor degree (4,2) in target coordinate and
195
+ time. Its first derivative divided by two is F; its second derivative
196
+ divided by two is F_t. Positive controls for F_t prove strict convexity
197
+ over the full target, making strict endpoint signs a unique branch proof.
198
+ Ownership uses (p-r).outward_actual_B3_tangent on time x root bracket.
199
+ No path samples establish admission. Active projection/ownership ties
200
+ fail closed; a globally open distance certificate may bypass such ties.
201
+ """
202
+ if endpoint not in (0, 2):
203
+ raise ValueError('B3 endpoint index must be 0 or 2')
204
+ source0, source1, target0, target1 = map(
205
+ _positions, (source0, source1, target0, target1))
206
+ radius = _rational(radius)
207
+ if radius < 0:
208
+ raise ValueError('combined radius must be nonnegative')
209
+ first, last = _curve_controls(target0), _curve_controls(target1)
210
+ # r(t,time)-p(time), spatial-major tensor controls per Cartesian lane.
211
+ relative = tuple(tuple((a-source0[endpoint][axis],
212
+ b-source1[endpoint][axis])
213
+ for a, b in zip(first[axis], last[axis]))
214
+ for axis in range(3))
215
+ near = []
216
+ for lane in relative:
217
+ low, high = min(_values(lane)), max(_values(lane))
218
+ near.append(low if low > 0 else -high if high < 0 else Fraction(0))
219
+ if sum(value*value for value in near) >= radius*radius:
220
+ return EndpointInterval(True, 0, None, Fraction(0), Fraction(1))
221
+ squared = _squared_controls(relative)
222
+ if min(_values(squared)) >= radius*radius:
223
+ return EndpointInterval(True, 0, None, Fraction(0), Fraction(1))
224
+ stationarity = tuple(tuple(value/2 for value in row)
225
+ for row in _space_derivative(squared))
226
+ curvature = _space_derivative(stationarity)
227
+ if min(_values(curvature)) <= 0:
228
+ return None
229
+ if min(stationarity[0]) > 0:
230
+ target_endpoint, left, right = 0, Fraction(0), Fraction(0)
231
+ elif max(stationarity[-1]) < 0:
232
+ target_endpoint, left, right = 2, Fraction(1), Fraction(1)
233
+ elif max(stationarity[0]) < 0 and min(stationarity[-1]) > 0:
234
+ target_endpoint = None
235
+ left, right = _interior_bracket(stationarity)
236
+ else:
237
+ return None
238
+ source_first, source_last = map(_curve_controls, (source0, source1))
239
+ direction = -1 if endpoint == 0 else 1
240
+ index = 0 if endpoint == 0 else 1
241
+ outward = tuple((direction*2*(a[index+1]-a[index]),
242
+ direction*2*(b[index+1]-b[index]))
243
+ for a, b in zip(source_first, source_last))
244
+ separation = tuple(tuple(tuple(-value for value in row) for row in lane)
245
+ for lane in _restrict_space(relative, left, right))
246
+ tangent = tuple((lane, lane, lane) for lane in outward)
247
+ ownership = _values(_dot_tensor(separation, tangent))
248
+ if min(ownership) > 0:
249
+ sign = 1
250
+ elif max(ownership) < 0:
251
+ sign = -1
252
+ else:
253
+ return None
254
+ return EndpointInterval(False, sign, target_endpoint, left, right)
@@ -0,0 +1,237 @@
1
+ """Physical-end point work on classical quadratic curves, opt-in development.
2
+
3
+ Distributed work and its curvature-dependent distance Hessian remain owned by
4
+ beam_curve_pair. Closed ambiguous projections/ownership are explicit non-success.
5
+ """
6
+ from dataclasses import dataclass
7
+ from fractions import Fraction
8
+ from types import SimpleNamespace
9
+
10
+ import numpy as np
11
+ from scipy import sparse
12
+
13
+ from .beam_curve_pair_static import B3PairManager, validate_b3_pair_contact
14
+ from .beam_curve_pair import b3_distance_jet, closest_on_b3
15
+ from .beam_pair_ends import _line_definition, _EndPairResults
16
+ from .beam_end_topology import physical_beam_ends
17
+ from .beam_plane import _beam_types
18
+ from .beam_end_radial_geometry import regular_curve_path
19
+ from .capped_cylinder import _sqrt_bound
20
+ from .core import ContactSolverSettings, ContactValidationReport
21
+
22
+ PROFILE = 'CLASSICAL_B2_B3_ROUND_TUBE_QUADRATIC_PHYSICAL_ENDS_STATIC_DEV_V1'
23
+
24
+
25
+ def validate_curve_beam_ends(model, definition, settings=None):
26
+ if tuple(map(len, (definition.surfaces, definition.rigid_bodies,
27
+ definition.interactions))) != (2, 0, 1):
28
+ return ContactValidationReport('invalid', ('two single-cell beam surfaces required',), PROFILE)
29
+ if any(s.beam_end_caps != 'hemisphere' for s in definition.surfaces) or (
30
+ definition.interactions[0].endpoint_stiffness is None):
31
+ return ContactValidationReport('invalid', ('hemisphere ends need explicit endpoint_stiffness N/m',), PROFILE)
32
+ report = validate_b3_pair_contact(model, _line_definition(definition), settings)
33
+ return ContactValidationReport(report.status, report.issues, PROFILE)
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class _CurveEndResults(_EndPairResults):
38
+ def to_dict(self):
39
+ return {**super().to_dict(),
40
+ 'minimum_gap_kind': 'conservative_full_quadratic_curve_lower_bound',
41
+ 'geometry_kinematics': 'quadratic_curve_unique_convex_endpoint_projection_v1'}
42
+
43
+
44
+ class BeamCurveEndManager(B3PairManager):
45
+ def __init__(self, model, definition, settings=None, initial_displacement=None):
46
+ controls = ContactSolverSettings() if settings is None else settings
47
+ report = validate_curve_beam_ends(model, definition, controls)
48
+ if not report.valid:
49
+ raise ValueError('unsupported quadratic physical ends: ' + '; '.join(report.issues))
50
+ super().__init__(model, _line_definition(definition), controls, initial_displacement)
51
+ self.definition = definition
52
+ self.profile = PROFILE
53
+ self.end_caps = 'hemisphere'
54
+ self.endpoint_stiffness = definition.interactions[0].endpoint_stiffness
55
+ self.elements = tuple(model.mesh.elements[s.element_ids[0]] for s in definition.surfaces)
56
+ self.ends = []
57
+ for surface, element in zip(definition.surfaces, self.elements):
58
+ cell = SimpleNamespace(element_id=surface.element_ids[0], node_ids=element.node_ids)
59
+ local = physical_beam_ends(model, (cell,), _beam_types()).values()
60
+ self.ends.append(tuple(sorted(0 if i == 0 else 2 for _, i, _ in local)))
61
+ self.ends = tuple(self.ends)
62
+
63
+ def _endpoint_work(self, positions):
64
+ from .beam_curve_end_geometry import endpoint_interval
65
+ E = 0.; f = np.zeros(18); K = np.zeros((18, 18)); fields = []; seen = set()
66
+ certificates = {(side, endpoint): endpoint_interval(
67
+ positions[side], positions[side], positions[1-side], positions[1-side],
68
+ endpoint, self.radius) for side in (0, 1) for endpoint in self.ends[side]}
69
+ for side in (0, 1):
70
+ source, target = positions[side], positions[1-side]
71
+ for endpoint in self.ends[side]:
72
+ proof = certificates[side, endpoint]
73
+ if proof is None:
74
+ raise ValueError('quadratic physical-end projection/ownership is unresolved')
75
+ node = self.elements[side].node_ids[0 if endpoint == 0 else -1]
76
+ row = {'source_surface': self.definition.surfaces[side].name,
77
+ 'source_element_id': self.definition.surfaces[side].element_ids[0],
78
+ 'source_node_id': int(node), 'state': 'open'}
79
+ if proof.open:
80
+ projection = closest_on_b3(source[endpoint], target)
81
+ row['gap'] = projection.distance-self.radius
82
+ fields.append(row); continue
83
+ station = b3_distance_jet(source, target, endpoint/2, self.radius,
84
+ source_is_a=side == 0)
85
+ t = station.target_parameter
86
+ if not float(proof.parameter_lower) <= t <= float(proof.parameter_upper):
87
+ raise ValueError('quadratic numerical projection leaves its certified bracket')
88
+ if proof.target_endpoint is not None:
89
+ # Literal IEEE geometry, cancellation-resistant activation.
90
+ separation = tuple(Fraction.from_float(float(x))-Fraction.from_float(float(y))
91
+ for x, y in zip(source[endpoint], target[proof.target_endpoint]))
92
+ squared = sum(value*value for value in separation)
93
+ radius = Fraction.from_float(self.radius)
94
+ root = _sqrt_bound(squared, upper=True)
95
+ difference = squared-radius*radius
96
+ gap = float(difference/(root+radius))
97
+ if gap == 0 and difference != 0:
98
+ raise ValueError('quadratic endpoint activation conversion underflows')
99
+ else:
100
+ gap = station.gap
101
+ scale = max(self.radius, np.max(np.abs(source)), np.max(np.abs(target)), 1.)
102
+ if abs(gap) <= 256*np.finfo(float).eps*scale:
103
+ raise ValueError('quadratic interior activation sign is unresolved at roundoff')
104
+ row.update(gap=gap, target_coordinate=t,
105
+ target_element_id=self.definition.surfaces[1-side].element_ids[0])
106
+ if gap >= 0:
107
+ fields.append(row); continue
108
+ if proof.ownership > 0:
109
+ row['state'] = 'side_owned'; fields.append(row); continue
110
+ other = proof.target_endpoint
111
+ if other is not None:
112
+ if other not in self.ends[1-side]:
113
+ raise ValueError('quadratic cap projects to a nonphysical selected target end')
114
+ reverse = certificates[1-side, other]
115
+ if reverse is None or reverse.open or reverse.ownership >= 0 or (
116
+ reverse.target_endpoint != endpoint):
117
+ raise ValueError('quadratic active cap/cap partner is not reciprocal')
118
+ key = tuple(sorted(((side, endpoint), (1-side, other))))
119
+ row.update(feature_kind='end_end', target_node_id=int(
120
+ self.elements[1-side].node_ids[0 if other == 0 else -1]))
121
+ else:
122
+ key = (side, endpoint, 'interior')
123
+ row['feature_kind'] = 'end_interior'
124
+ if key in seen:
125
+ row['state'] = 'reciprocal_owned_once'; fields.append(row); continue
126
+ seen.add(key)
127
+ ke = self.endpoint_stiffness
128
+ E += .5*ke*gap*gap
129
+ f += ke*gap*station.gradient
130
+ K += ke*(np.outer(station.gradient, station.gradient)+gap*station.hessian)
131
+ row.update(state='active', endpoint_force_N=-ke*gap)
132
+ fields.append(row)
133
+ return E, f, K, tuple(fields), len(seen)
134
+
135
+ def evaluate(self, displacement, *, tangent=True):
136
+ positions = self._positions(displacement)
137
+ if not all(regular_curve_path(p, p, self.settings.maximum_swept_subdivisions)
138
+ for p in positions):
139
+ raise ValueError('quadratic physical-end curve regularity is unresolved')
140
+ endpoint, ef, eK, fields, active = self._endpoint_work(positions)
141
+ force, K, line = super().evaluate(displacement, tangent=tangent)
142
+ dofs = np.r_[self.dofs[0].reshape(-1), self.dofs[1].reshape(-1)]
143
+ np.add.at(force, dofs, self.assembly_map.T@ef)
144
+ if tangent:
145
+ rows, cols = np.meshgrid(dofs, dofs, indexing='ij')
146
+ local = self.assembly_map.T@eK@self.assembly_map
147
+ K += sparse.coo_matrix((local.ravel(), (rows.ravel(), cols.ravel())),
148
+ shape=(self.n_dof, self.n_dof)).tocsr()
149
+ forces = tuple(-ef[i*9:(i+1)*9].reshape(3, 3) for i in (0, 1))
150
+ wrench = [tuple(np.asarray(old)+np.sum(values, axis=0)) for old, values in
151
+ zip((line.beam_a_force, line.beam_b_force), forces)]
152
+ moments = [tuple(np.asarray(old)+np.sum(np.cross(p, values), axis=0)) for old, p, values
153
+ in zip((line.beam_a_moment, line.beam_b_moment), positions, forces)]
154
+ result = _CurveEndResults(self.profile, line.minimum_gap, line.contact_energy+endpoint,
155
+ line.active_source_intervals, line.integration_points, line.maximum_integration_relative_error,
156
+ *wrench, *moments, line.gap_tolerance_met, self.stiffness,
157
+ line.contact_energy, endpoint, self.endpoint_stiffness,
158
+ sum(map(len, self.ends)), active, fields)
159
+ return force, K, result
160
+
161
+ def _endpoint_path_admissible(self, first, last):
162
+ from .beam_curve_end_geometry import endpoint_interval
163
+ def rational(poses):
164
+ return tuple(np.array([[Fraction.from_float(float(x)) for x in row]
165
+ for row in p], dtype=object) for p in poses)
166
+ def certify(a, b, depth):
167
+ proofs = {(side, endpoint): endpoint_interval(a[side], b[side],
168
+ a[1-side], b[1-side], endpoint, self.radius)
169
+ for side in (0, 1) for endpoint in self.ends[side]}
170
+ fixed = all(proof is not None for proof in proofs.values())
171
+ if fixed:
172
+ for (side, endpoint), proof in proofs.items():
173
+ if proof.open or proof.ownership > 0 or proof.target_endpoint is None:
174
+ continue
175
+ other = proof.target_endpoint
176
+ reverse = proofs.get((1-side, other))
177
+ if reverse is None or reverse.open or reverse.ownership >= 0 or (
178
+ reverse.target_endpoint != endpoint):
179
+ fixed = False; break
180
+ if fixed:
181
+ return True
182
+ if depth >= self.settings.maximum_swept_subdivisions:
183
+ return False
184
+ mid = tuple((x+y)/2 for x, y in zip(a, b))
185
+ return certify(a, mid, depth+1) and certify(mid, b, depth+1)
186
+ return certify(rational(first), rational(last), 0)
187
+
188
+ def _gap_certificate(self, positions):
189
+ from .beam_curve_end_geometry import certify_curve_pair_gap
190
+ return certify_curve_pair_gap(*positions, self.radius,
191
+ accuracy=self.settings.beam_pair_gap_accuracy,
192
+ maximum_cells=self.settings.maximum_beam_pair_gap_cells,
193
+ maximum_depth=self.settings.maximum_beam_pair_gap_depth)
194
+
195
+ def _certificate(self, displacement):
196
+ return self._gap_certificate(self._positions(displacement))
197
+
198
+ def _swept_admissible(self, start, end):
199
+ first, last = self._positions(start), self._positions(end)
200
+ if not all(regular_curve_path(a, b, self.settings.maximum_swept_subdivisions)
201
+ for a, b in zip(first, last)):
202
+ return False
203
+ from .beam_curve_end_geometry import _curve_controls
204
+ q0, q1 = [tuple(np.array([[Fraction.from_float(float(x)) for x in row]
205
+ for row in p], dtype=object) for p in poses)
206
+ for poses in (first, last)]
207
+ delta = tuple(b-a for a, b in zip(q0, q1))
208
+ velocities = tuple(np.array(_curve_controls(p), dtype=object).T for p in delta)
209
+ speed = max(_sqrt_bound(sum((x-y)**2 for x, y in zip(a, b)), upper=True)
210
+ for a in velocities[0] for b in velocities[1])
211
+ tol = Fraction.from_float(self.gap_tolerance)
212
+ def gap(t):
213
+ return self._gap_certificate(tuple(a+t*d for a, d in zip(q0, delta))).conservative_lower_gap
214
+ g0, g1 = gap(Fraction(0)), gap(Fraction(1))
215
+ if g0 < -self.gap_tolerance:
216
+ raise ValueError('committed quadratic physical-end gap exceeds tolerance')
217
+ if g1 < -self.gap_tolerance:
218
+ return False
219
+ def certify(left, right, gl, gr, depth):
220
+ if min(Fraction.from_float(gl), Fraction.from_float(gr))-speed*(right-left)/2 >= -tol:
221
+ return True
222
+ if depth >= self.settings.maximum_swept_subdivisions:
223
+ return False
224
+ middle = (left+right)/2; gm = gap(middle)
225
+ if gm < -self.gap_tolerance:
226
+ return False
227
+ return (certify(left, middle, gl, gm, depth+1)
228
+ and certify(middle, right, gm, gr, depth+1))
229
+ return certify(Fraction(0), Fraction(1), g0, g1, 0) and self._endpoint_path_admissible(first, last)
230
+
231
+ def restart_contract(self):
232
+ return {**super().restart_contract(),
233
+ 'endpoint_stiffness': self.endpoint_stiffness,
234
+ 'physical_ends': [[int(e.node_ids[0 if i == 0 else -1]) for i in ends]
235
+ for e, ends in zip(self.elements, self.ends)],
236
+ 'point_law': 'unique_quadratic_owned_end_end_or_end_interior_v1',
237
+ 'geometry_revision': 'exact_tensor_gap_convex_projection_ownership_affine_path_v1'}