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.
- anyfesolver/__init__.py +1075 -0
- anyfesolver/_b2_attachment_elimination_dev.py +261 -0
- anyfesolver/_b2_f10_f11_point_attachment.py +163 -0
- anyfesolver/_b2_loaded_point_trace_dev.py +173 -0
- anyfesolver/_b2_physical_flexibility_linear.py +707 -0
- anyfesolver/_b2_physical_linear_batch_dev.py +491 -0
- anyfesolver/_b2_physical_linear_definition.py +415 -0
- anyfesolver/_b2_physical_load_bubbles.py +282 -0
- anyfesolver/_compensated_contractions.py +497 -0
- anyfesolver/_compensated_native.py +437 -0
- anyfesolver/_corotational_batch.py +219 -0
- anyfesolver/_director_trace.py +214 -0
- anyfesolver/_dyadic_bilinear.py +76 -0
- anyfesolver/_dyadic_factor_chain.py +25 -0
- anyfesolver/_ge_beam3_adaptive_arc_program.py +286 -0
- anyfesolver/_ge_beam3_analysis_combined.py +102 -0
- anyfesolver/_ge_beam3_analysis_fibre_translation.py +130 -0
- anyfesolver/_ge_beam3_analysis_modal_snapshot.py +27 -0
- anyfesolver/_ge_beam3_analysis_nodal_program.py +140 -0
- anyfesolver/_ge_beam3_analysis_translation.py +147 -0
- anyfesolver/_ge_beam3_analysis_translation_modal.py +84 -0
- anyfesolver/_ge_beam3_arc_geometry.py +89 -0
- anyfesolver/_ge_beam3_arc_program.py +304 -0
- anyfesolver/_ge_beam3_authoritative_cell_seed.py +25 -0
- anyfesolver/_ge_beam3_cell_identity.py +52 -0
- anyfesolver/_ge_beam3_centered_batched_finite_inertia.py +132 -0
- anyfesolver/_ge_beam3_centered_finite_inertia.py +171 -0
- anyfesolver/_ge_beam3_centered_mixed.py +104 -0
- anyfesolver/_ge_beam3_centered_reference.py +187 -0
- anyfesolver/_ge_beam3_centered_so3_strain.py +76 -0
- anyfesolver/_ge_beam3_complementary_section.py +122 -0
- anyfesolver/_ge_beam3_compliance_snapshot_guard.py +20 -0
- anyfesolver/_ge_beam3_connected_dynamic.py +486 -0
- anyfesolver/_ge_beam3_connected_trajectory.py +258 -0
- anyfesolver/_ge_beam3_conservative_backtrack.py +26 -0
- anyfesolver/_ge_beam3_controlled_fibre_modes.py +105 -0
- anyfesolver/_ge_beam3_coupled_beam_subdomain.py +128 -0
- anyfesolver/_ge_beam3_coupled_modes.py +256 -0
- anyfesolver/_ge_beam3_deterministic_reduction.py +264 -0
- anyfesolver/_ge_beam3_displacement_program.py +255 -0
- anyfesolver/_ge_beam3_durable_coupled.py +251 -0
- anyfesolver/_ge_beam3_dynamic_elastic_state.py +461 -0
- anyfesolver/_ge_beam3_effective_deadline.py +58 -0
- anyfesolver/_ge_beam3_elastic_seed_continuation.py +223 -0
- anyfesolver/_ge_beam3_elastic_seed_modal.py +139 -0
- anyfesolver/_ge_beam3_equilibrium_line_program.py +98 -0
- anyfesolver/_ge_beam3_equilibrium_schur_solver.py +96 -0
- anyfesolver/_ge_beam3_factor_chain_modes.py +103 -0
- anyfesolver/_ge_beam3_fibre_cell.py +408 -0
- anyfesolver/_ge_beam3_fibre_distributed_couples.py +191 -0
- anyfesolver/_ge_beam3_fibre_kinematic_cell.py +75 -0
- anyfesolver/_ge_beam3_fibre_line_program.py +157 -0
- anyfesolver/_ge_beam3_fibre_line_work.py +87 -0
- anyfesolver/_ge_beam3_fibre_reference_modal.py +104 -0
- anyfesolver/_ge_beam3_fibre_schur_solver.py +134 -0
- anyfesolver/_ge_beam3_fibre_section.py +286 -0
- anyfesolver/_ge_beam3_fibre_static_boundary.py +113 -0
- anyfesolver/_ge_beam3_g1_analysis.py +307 -0
- anyfesolver/_ge_beam3_g1_elastic.py +161 -0
- anyfesolver/_ge_beam3_g1_element.py +185 -0
- anyfesolver/_ge_beam3_g1_operator.py +137 -0
- anyfesolver/_ge_beam3_g2_analysis.py +176 -0
- anyfesolver/_ge_beam3_g2_constraints.py +162 -0
- anyfesolver/_ge_beam3_g3_analysis.py +385 -0
- anyfesolver/_ge_beam3_g3_constraints.py +168 -0
- anyfesolver/_ge_beam3_g3b_owner.py +296 -0
- anyfesolver/_ge_beam3_g3b_q4_reference.py +186 -0
- anyfesolver/_ge_beam3_g3b_reference.py +206 -0
- anyfesolver/_ge_beam3_g3b_result_schema.py +107 -0
- anyfesolver/_ge_beam3_g3b_s3_reference.py +185 -0
- anyfesolver/_ge_beam3_g3b_weighted_reference.py +193 -0
- anyfesolver/_ge_beam3_g3c_affine_q4_chart.py +58 -0
- anyfesolver/_ge_beam3_g3c_affine_q4_increment_chart.py +257 -0
- anyfesolver/_ge_beam3_g3c_affine_q4_recovery.py +434 -0
- anyfesolver/_ge_beam3_g3c_affine_q4_registry.py +127 -0
- anyfesolver/_ge_beam3_g3c_b2_physical.py +153 -0
- anyfesolver/_ge_beam3_g3c_b2_physical_adapter.py +160 -0
- anyfesolver/_ge_beam3_g3c_definition.py +117 -0
- anyfesolver/_ge_beam3_g3c_local_beam.py +188 -0
- anyfesolver/_ge_beam3_g3c_local_shell.py +371 -0
- anyfesolver/_ge_beam3_g3c_owner.py +400 -0
- anyfesolver/_ge_beam3_g3c_physical_authority.py +203 -0
- anyfesolver/_ge_beam3_g3c_physical_owner.py +556 -0
- anyfesolver/_ge_beam3_g3c_recovery.py +91 -0
- anyfesolver/_ge_beam3_g3c_so3_numerics.py +81 -0
- anyfesolver/_ge_beam3_g3c_stable/__init__.py +1 -0
- anyfesolver/_ge_beam3_g3c_stable/authority.py +152 -0
- anyfesolver/_ge_beam3_g3c_stable/beam.py +196 -0
- anyfesolver/_ge_beam3_g3c_stable/boundary.py +38 -0
- anyfesolver/_ge_beam3_g3c_stable/chart.py +23 -0
- anyfesolver/_ge_beam3_g3c_stable/compensated.py +46 -0
- anyfesolver/_ge_beam3_g3c_stable/element.py +190 -0
- anyfesolver/_ge_beam3_g3c_stable/fit.py +54 -0
- anyfesolver/_ge_beam3_g3c_stable/joint.py +255 -0
- anyfesolver/_ge_beam3_g3c_stable/line_work.py +92 -0
- anyfesolver/_ge_beam3_g3c_stable/operator.py +147 -0
- anyfesolver/_ge_beam3_g3c_stable/owner.py +415 -0
- anyfesolver/_ge_beam3_g3c_stable/shell.py +358 -0
- anyfesolver/_ge_beam3_g4_completion.py +186 -0
- anyfesolver/_ge_beam3_g4a_station_transaction.py +385 -0
- anyfesolver/_ge_beam3_g5_completion.py +68 -0
- anyfesolver/_ge_beam3_g6_domain.py +354 -0
- anyfesolver/_ge_beam3_generalized_cell.py +172 -0
- anyfesolver/_ge_beam3_generalized_ellipsoid_section.py +215 -0
- anyfesolver/_ge_beam3_generalized_static_boundary.py +233 -0
- anyfesolver/_ge_beam3_lifted_kinetic_factor.py +26 -0
- anyfesolver/_ge_beam3_line_fibre_modes.py +121 -0
- anyfesolver/_ge_beam3_load_program.py +275 -0
- anyfesolver/_ge_beam3_loaded_modal.py +225 -0
- anyfesolver/_ge_beam3_mixed_ad.py +286 -0
- anyfesolver/_ge_beam3_native_analysis.py +484 -0
- anyfesolver/_ge_beam3_native_arc.py +269 -0
- anyfesolver/_ge_beam3_native_arc_adaptive.py +251 -0
- anyfesolver/_ge_beam3_native_arc_restart.py +88 -0
- anyfesolver/_ge_beam3_native_arc_source.py +62 -0
- anyfesolver/_ge_beam3_native_buckling.py +206 -0
- anyfesolver/_ge_beam3_native_combined_couples.py +179 -0
- anyfesolver/_ge_beam3_native_combined_restart.py +205 -0
- anyfesolver/_ge_beam3_native_definition.py +238 -0
- anyfesolver/_ge_beam3_native_distributed_element.py +220 -0
- anyfesolver/_ge_beam3_native_distributed_loading.py +92 -0
- anyfesolver/_ge_beam3_native_distributed_program.py +165 -0
- anyfesolver/_ge_beam3_native_distributed_recovery.py +34 -0
- anyfesolver/_ge_beam3_native_distributed_restart.py +221 -0
- anyfesolver/_ge_beam3_native_dynamic_analysis.py +149 -0
- anyfesolver/_ge_beam3_native_dynamic_restart.py +261 -0
- anyfesolver/_ge_beam3_native_fibre_current_modal.py +104 -0
- anyfesolver/_ge_beam3_native_fibre_recovery.py +34 -0
- anyfesolver/_ge_beam3_native_fibre_restart.py +211 -0
- anyfesolver/_ge_beam3_native_fibre_static_element.py +193 -0
- anyfesolver/_ge_beam3_native_force_adaptation.py +56 -0
- anyfesolver/_ge_beam3_native_generalized_combined_couples.py +188 -0
- anyfesolver/_ge_beam3_native_generalized_combined_restart.py +207 -0
- anyfesolver/_ge_beam3_native_generalized_element.py +222 -0
- anyfesolver/_ge_beam3_native_generalized_factor_modal.py +122 -0
- anyfesolver/_ge_beam3_native_generalized_loading.py +92 -0
- anyfesolver/_ge_beam3_native_generalized_modal.py +274 -0
- anyfesolver/_ge_beam3_native_generalized_paired_modal.py +13 -0
- anyfesolver/_ge_beam3_native_generalized_parameter.py +89 -0
- anyfesolver/_ge_beam3_native_generalized_program.py +196 -0
- anyfesolver/_ge_beam3_native_generalized_recovery.py +34 -0
- anyfesolver/_ge_beam3_native_generalized_restart.py +243 -0
- anyfesolver/_ge_beam3_native_history_profile.py +53 -0
- anyfesolver/_ge_beam3_native_line_loading.py +93 -0
- anyfesolver/_ge_beam3_native_line_program.py +150 -0
- anyfesolver/_ge_beam3_native_line_recovery.py +34 -0
- anyfesolver/_ge_beam3_native_line_restart.py +197 -0
- anyfesolver/_ge_beam3_native_line_static_element.py +220 -0
- anyfesolver/_ge_beam3_native_load_admission.py +37 -0
- anyfesolver/_ge_beam3_native_midpoint.py +1004 -0
- anyfesolver/_ge_beam3_native_multi_shell_contact.py +539 -0
- anyfesolver/_ge_beam3_native_pair_contact.py +236 -0
- anyfesolver/_ge_beam3_native_shell_contact.py +357 -0
- anyfesolver/_ge_beam3_native_spatial_couples.py +176 -0
- anyfesolver/_ge_beam3_native_spatial_restart.py +204 -0
- anyfesolver/_ge_beam3_native_transient.py +467 -0
- anyfesolver/_ge_beam3_native_translation.py +225 -0
- anyfesolver/_ge_beam3_native_translation_restart.py +54 -0
- anyfesolver/_ge_beam3_operator_validation_scope.py +53 -0
- anyfesolver/_ge_beam3_p5/__init__.py +11 -0
- anyfesolver/_ge_beam3_p5/algebra.py +91 -0
- anyfesolver/_ge_beam3_p5/arrays.py +29 -0
- anyfesolver/_ge_beam3_p5/chart.py +45 -0
- anyfesolver/_ge_beam3_p5/codec.py +82 -0
- anyfesolver/_ge_beam3_p5/committed_modal.py +191 -0
- anyfesolver/_ge_beam3_p5/compensated.py +118 -0
- anyfesolver/_ge_beam3_p5/compensated_coordinates.py +44 -0
- anyfesolver/_ge_beam3_p5/core.py +159 -0
- anyfesolver/_ge_beam3_p5/element.py +207 -0
- anyfesolver/_ge_beam3_p5/factors.py +61 -0
- anyfesolver/_ge_beam3_p5/inertia.py +120 -0
- anyfesolver/_ge_beam3_p5/mass.py +70 -0
- anyfesolver/_ge_beam3_p5/mixed.py +256 -0
- anyfesolver/_ge_beam3_p5/reference_modal.py +73 -0
- anyfesolver/_ge_beam3_p5/section.py +139 -0
- anyfesolver/_ge_beam3_p5/typed_schema.py +111 -0
- anyfesolver/_ge_beam3_p5_centered/__init__.py +6 -0
- anyfesolver/_ge_beam3_p5_centered/codec.py +84 -0
- anyfesolver/_ge_beam3_p5_centered/committed_modal.py +192 -0
- anyfesolver/_ge_beam3_p5_centered/core.py +171 -0
- anyfesolver/_ge_beam3_p5_centered/element.py +216 -0
- anyfesolver/_ge_beam3_p5_centered/mass.py +99 -0
- anyfesolver/_ge_beam3_p5_centered/positions.py +34 -0
- anyfesolver/_ge_beam3_p5_centered/reference_modal.py +73 -0
- anyfesolver/_ge_beam3_p5_coordinates/__init__.py +6 -0
- anyfesolver/_ge_beam3_p5_coordinates/codec.py +84 -0
- anyfesolver/_ge_beam3_p5_coordinates/committed_modal.py +192 -0
- anyfesolver/_ge_beam3_p5_coordinates/core.py +163 -0
- anyfesolver/_ge_beam3_p5_coordinates/element.py +213 -0
- anyfesolver/_ge_beam3_p5_coordinates/positions.py +102 -0
- anyfesolver/_ge_beam3_p5_coordinates/reference_modal.py +73 -0
- anyfesolver/_ge_beam3_p5_loads/__init__.py +7 -0
- anyfesolver/_ge_beam3_p5_loads/codec.py +85 -0
- anyfesolver/_ge_beam3_p5_loads/core.py +192 -0
- anyfesolver/_ge_beam3_p5_loads/element.py +243 -0
- anyfesolver/_ge_beam3_p5_loads/state.py +120 -0
- anyfesolver/_ge_beam3_p5_loads/work.py +45 -0
- anyfesolver/_ge_beam3_p5_seeded/__init__.py +9 -0
- anyfesolver/_ge_beam3_p5_seeded/codec.py +87 -0
- anyfesolver/_ge_beam3_p5_seeded/core.py +197 -0
- anyfesolver/_ge_beam3_p5_seeded/element.py +245 -0
- anyfesolver/_ge_beam3_p5_seeded/state.py +122 -0
- anyfesolver/_ge_beam3_p5_seeded/work.py +47 -0
- anyfesolver/_ge_beam3_pose_joint.py +268 -0
- anyfesolver/_ge_beam3_precise_geometric_work.py +147 -0
- anyfesolver/_ge_beam3_reassembled_signed_modes.py +101 -0
- anyfesolver/_ge_beam3_reference_identity.py +92 -0
- anyfesolver/_ge_beam3_refined_fibre_schur_solver.py +104 -0
- anyfesolver/_ge_beam3_refinement_capacity.py +19 -0
- anyfesolver/_ge_beam3_relative_virgin_reference_modes.py +60 -0
- anyfesolver/_ge_beam3_retained_arc.py +350 -0
- anyfesolver/_ge_beam3_retained_arc_geometry.py +66 -0
- anyfesolver/_ge_beam3_retained_arc_modal.py +125 -0
- anyfesolver/_ge_beam3_retained_elastic.py +134 -0
- anyfesolver/_ge_beam3_retained_fibre.py +209 -0
- anyfesolver/_ge_beam3_retained_fibre_control.py +270 -0
- anyfesolver/_ge_beam3_retained_fibre_element.py +58 -0
- anyfesolver/_ge_beam3_retained_fibre_modal.py +155 -0
- anyfesolver/_ge_beam3_retained_fibre_modes.py +189 -0
- anyfesolver/_ge_beam3_retained_fibre_program.py +68 -0
- anyfesolver/_ge_beam3_retained_fibre_state.py +268 -0
- anyfesolver/_ge_beam3_retained_force_program.py +72 -0
- anyfesolver/_ge_beam3_retained_generalized.py +186 -0
- anyfesolver/_ge_beam3_retained_generalized_modal.py +171 -0
- anyfesolver/_ge_beam3_retained_generalized_program.py +63 -0
- anyfesolver/_ge_beam3_retained_generalized_state.py +281 -0
- anyfesolver/_ge_beam3_retained_nodal_loading.py +111 -0
- anyfesolver/_ge_beam3_retained_plastic.py +116 -0
- anyfesolver/_ge_beam3_retained_plastic_modes.py +144 -0
- anyfesolver/_ge_beam3_retained_plastic_program.py +69 -0
- anyfesolver/_ge_beam3_retained_plastic_state.py +165 -0
- anyfesolver/_ge_beam3_retained_state.py +194 -0
- anyfesolver/_ge_beam3_retained_translation_control.py +345 -0
- anyfesolver/_ge_beam3_retained_translation_modal.py +137 -0
- anyfesolver/_ge_beam3_schur_line_program.py +98 -0
- anyfesolver/_ge_beam3_seeded_fibre_control.py +175 -0
- anyfesolver/_ge_beam3_seeded_load_program.py +301 -0
- anyfesolver/_ge_beam3_seeded_loaded_modal.py +226 -0
- anyfesolver/_ge_beam3_seeded_signed_modes.py +150 -0
- anyfesolver/_ge_beam3_shared_kinematic_split.py +53 -0
- anyfesolver/_ge_beam3_shell_joint_state.py +396 -0
- anyfesolver/_ge_beam3_shell_joint_trial.py +217 -0
- anyfesolver/_ge_beam3_signed_loaded_modes.py +140 -0
- anyfesolver/_ge_beam3_spatial_fibre_program.py +113 -0
- anyfesolver/_ge_beam3_spatial_nodal_moments.py +38 -0
- anyfesolver/_ge_beam3_station_resultant_cell.py +235 -0
- anyfesolver/_ge_beam3_variational_shell.py +211 -0
- anyfesolver/_ge_beam3_virgin_reference_modes.py +60 -0
- anyfesolver/_impact_coupling.py +162 -0
- anyfesolver/_native_authority_dag.py +77 -0
- anyfesolver/_native_dyadic_interval_inertia.py +64 -0
- anyfesolver/_native_exact_shift_chain_modes.py +140 -0
- anyfesolver/_native_exact_shift_inertia.py +86 -0
- anyfesolver/_native_factor_chain_modes.py +192 -0
- anyfesolver/_native_guard.cpp +828 -0
- anyfesolver/_native_guard_dispatch.py +140 -0
- anyfesolver/_native_large_factor_chain.py +55 -0
- anyfesolver/_native_material_protocol.py +51 -0
- anyfesolver/_native_midpoint_controller.py +90 -0
- anyfesolver/_native_modal_capacity.py +26 -0
- anyfesolver/_native_paired_factor_chain_modes.py +244 -0
- anyfesolver/_native_reassembled_factor_modes.py +185 -0
- anyfesolver/_native_reference_factor_spectrum.py +102 -0
- anyfesolver/_native_reference_modal.py +180 -0
- anyfesolver/_native_relative_factor_chain_modes.py +204 -0
- anyfesolver/_native_relative_reference_factor_spectrum.py +110 -0
- anyfesolver/_native_retained_step.py +15 -0
- anyfesolver/_native_rotation_state.py +797 -0
- anyfesolver/_native_signed_factor_modes.py +257 -0
- anyfesolver/_native_signed_kinetic_factor_modes.py +279 -0
- anyfesolver/_native_stationary_spectrum.py +79 -0
- anyfesolver/_nonlinear_events.py +150 -0
- anyfesolver/_nonlinear_seed.py +80 -0
- anyfesolver/_paired_modal_arithmetic.py +71 -0
- anyfesolver/_plate_stability_continuation.py +171 -0
- anyfesolver/_q4_assumed_strain_plasticity.py +502 -0
- anyfesolver/_qualified_authority_epoch.py +561 -0
- anyfesolver/_relative_reference_svd.py +44 -0
- anyfesolver/_stiffened_shell_affine_endpoint.py +232 -0
- anyfesolver/_stiffened_shell_algorithmic_pullback.py +38 -0
- anyfesolver/_stiffened_shell_arc_checkpoint.py +422 -0
- anyfesolver/_stiffened_shell_arc_control.py +108 -0
- anyfesolver/_stiffened_shell_arc_metric.py +222 -0
- anyfesolver/_stiffened_shell_arc_publication.py +153 -0
- anyfesolver/_stiffened_shell_arc_trial.py +310 -0
- anyfesolver/_stiffened_shell_b2_affine_resolution.py +101 -0
- anyfesolver/_stiffened_shell_b2_assembly_diagnostics.py +172 -0
- anyfesolver/_stiffened_shell_b2_definition_ownership.py +189 -0
- anyfesolver/_stiffened_shell_b2_experimental.py +153 -0
- anyfesolver/_stiffened_shell_b2_nodal_footprint.py +273 -0
- anyfesolver/_stiffened_shell_b2_physical_rigid_footprint.py +237 -0
- anyfesolver/_stiffened_shell_b2_q4_panel_experimental.py +2447 -0
- anyfesolver/_stiffened_shell_b2_q4_point_experimental.py +251 -0
- anyfesolver/_stiffened_shell_b2_reference_buckling.py +413 -0
- anyfesolver/_stiffened_shell_b3_chart.py +70 -0
- anyfesolver/_stiffened_shell_b3_local_adapter.py +141 -0
- anyfesolver/_stiffened_shell_beam_history.py +107 -0
- anyfesolver/_stiffened_shell_bl5_local_experimental.py +173 -0
- anyfesolver/_stiffened_shell_bl5_native_elastic.py +28 -0
- anyfesolver/_stiffened_shell_branch_event_trial.py +58 -0
- anyfesolver/_stiffened_shell_consumer_capabilities.py +124 -0
- anyfesolver/_stiffened_shell_coordinate_support.py +110 -0
- anyfesolver/_stiffened_shell_displacement_adaptive.py +327 -0
- anyfesolver/_stiffened_shell_displacement_checkpoint.py +360 -0
- anyfesolver/_stiffened_shell_displacement_control.py +326 -0
- anyfesolver/_stiffened_shell_displacement_corrector.py +293 -0
- anyfesolver/_stiffened_shell_displacement_increment.py +121 -0
- anyfesolver/_stiffened_shell_distributing_footprint.py +354 -0
- anyfesolver/_stiffened_shell_distributing_pose.py +267 -0
- anyfesolver/_stiffened_shell_f06_increment_arithmetic.py +205 -0
- anyfesolver/_stiffened_shell_ge_body_load.py +300 -0
- anyfesolver/_stiffened_shell_ge_checkpoint_binary.py +472 -0
- anyfesolver/_stiffened_shell_ge_distributed_load.py +210 -0
- anyfesolver/_stiffened_shell_ge_distributed_programme.py +175 -0
- anyfesolver/_stiffened_shell_ge_distributing_finite.py +242 -0
- anyfesolver/_stiffened_shell_ge_distributing_reference.py +296 -0
- anyfesolver/_stiffened_shell_ge_experimental.py +2454 -0
- anyfesolver/_stiffened_shell_ge_finite_experimental.py +2714 -0
- anyfesolver/_stiffened_shell_ge_mixed_modal_mass.py +33 -0
- anyfesolver/_stiffened_shell_ge_point_buckling.py +723 -0
- anyfesolver/_stiffened_shell_ge_pressure_load.py +366 -0
- anyfesolver/_stiffened_shell_ge_reference_modal.py +580 -0
- anyfesolver/_stiffened_shell_generalized_recovery.py +150 -0
- anyfesolver/_stiffened_shell_increment_control.py +217 -0
- anyfesolver/_stiffened_shell_l1_assembly_experimental.py +420 -0
- anyfesolver/_stiffened_shell_l1_local_experimental.py +284 -0
- anyfesolver/_stiffened_shell_l1_supported_work_experimental.py +146 -0
- anyfesolver/_stiffened_shell_native_distributed_load.py +120 -0
- anyfesolver/_stiffened_shell_native_gravity.py +236 -0
- anyfesolver/_stiffened_shell_nodal_footprint.py +255 -0
- anyfesolver/_stiffened_shell_physical_q4_mass.py +98 -0
- anyfesolver/_stiffened_shell_physical_s3_mass.py +53 -0
- anyfesolver/_stiffened_shell_point_recovery.py +49 -0
- anyfesolver/_stiffened_shell_q4_algorithmic_pullback.py +88 -0
- anyfesolver/_stiffened_shell_q4_material_event.py +114 -0
- anyfesolver/_stiffened_shell_q4_reference.py +65 -0
- anyfesolver/_stiffened_shell_rotation_charts.py +58 -0
- anyfesolver/_stiffened_shell_s3_algorithmic_pullback.py +59 -0
- anyfesolver/_stiffened_shell_s3_conservative_buckling.py +28 -0
- anyfesolver/_stiffened_shell_s3_dead_work_candidate.py +107 -0
- anyfesolver/_stiffened_shell_s3_material_event.py +30 -0
- anyfesolver/_stiffened_shell_same_parent_trial.py +224 -0
- anyfesolver/_stiffened_shell_selected_recovery.py +113 -0
- anyfesolver/_stiffened_shell_staged_load_experimental.py +392 -0
- anyfesolver/_stiffened_shell_stress_free_reference.py +204 -0
- anyfesolver/_wire_types.py +17 -0
- anyfesolver/activity.py +1537 -0
- anyfesolver/algebraic_dynamics.py +2864 -0
- anyfesolver/analysis_session.py +897 -0
- anyfesolver/anystructure_fem_mode.py +1637 -0
- anyfesolver/arc_length.py +2587 -0
- anyfesolver/assembly.py +1830 -0
- anyfesolver/b3_ge.py +179 -0
- anyfesolver/baselines.py +303 -0
- anyfesolver/beam_sections.py +292 -0
- anyfesolver/beam_shell_verification.py +4685 -0
- anyfesolver/beam_validity.py +110 -0
- anyfesolver/benchmarks.py +495 -0
- anyfesolver/boundary.py +1680 -0
- anyfesolver/buckling.py +2136 -0
- anyfesolver/buckling_validity.py +91 -0
- anyfesolver/capacity_workflow.py +431 -0
- anyfesolver/capsule_runtime_guard.py +99 -0
- anyfesolver/cases.py +173 -0
- anyfesolver/composite_strip_verification.py +297 -0
- anyfesolver/concentrated_mass.py +84 -0
- anyfesolver/constraint_audit.py +553 -0
- anyfesolver/contact.py +4785 -0
- anyfesolver/contact_performance.py +301 -0
- anyfesolver/control.py +206 -0
- anyfesolver/corotational.py +1935 -0
- anyfesolver/corotational_performance.py +157 -0
- anyfesolver/current_state_tangent.py +2780 -0
- anyfesolver/cylinder_benchmarks.py +369 -0
- anyfesolver/damage_matrix_performance.py +617 -0
- anyfesolver/dynamics.py +2833 -0
- anyfesolver/e4_pl_element.py +8265 -0
- anyfesolver/e4_pl_enriched.py +194 -0
- anyfesolver/e4_pl_enriched_nonlinear.py +159 -0
- anyfesolver/e4_pl_s3_element.py +9752 -0
- anyfesolver/e4_pl_s3_initial_fields.py +101 -0
- anyfesolver/e4_pl_s3_state.py +4723 -0
- anyfesolver/e4_pl_s3_v2_element.py +1844 -0
- anyfesolver/e4_pl_s3_v2b_element.py +1936 -0
- anyfesolver/e4_pl_s3_v2c_element.py +2196 -0
- anyfesolver/e4_pl_s3_v2d_element.py +2621 -0
- anyfesolver/e4_pl_s3_v2d_state.py +376 -0
- anyfesolver/element_capabilities.py +159 -0
- anyfesolver/element_qualification.py +432 -0
- anyfesolver/elements.py +6327 -0
- anyfesolver/experimental_csr_assembly.py +238 -0
- anyfesolver/external_references.py +1253 -0
- anyfesolver/fe_core.py +832 -0
- anyfesolver/floating_pressure_regions.py +119 -0
- anyfesolver/floating_response.py +486 -0
- anyfesolver/floating_transient.py +1281 -0
- anyfesolver/fracture.py +621 -0
- anyfesolver/ge_beam3_curved_reference.py +725 -0
- anyfesolver/ge_beam3_element.py +885 -0
- anyfesolver/ge_beam3_mixed_element.py +1216 -0
- anyfesolver/ge_beam3_mixed_state.py +814 -0
- anyfesolver/ge_beam3_native.py +129 -0
- anyfesolver/ge_beam3_native_connected_dynamics.py +24 -0
- anyfesolver/ge_beam3_native_dynamics.py +70 -0
- anyfesolver/ge_beam3_state.py +672 -0
- anyfesolver/general_contact/__init__.py +151 -0
- anyfesolver/general_contact/_enriched_multitarget_empty.py +202 -0
- anyfesolver/general_contact/_enriched_multitarget_trial.py +183 -0
- anyfesolver/general_contact/_results_archive_common.py +65 -0
- anyfesolver/general_contact/algebraic_path.py +206 -0
- anyfesolver/general_contact/arc_contact.py +237 -0
- anyfesolver/general_contact/arc_results_archive.py +158 -0
- anyfesolver/general_contact/augmentation.py +157 -0
- anyfesolver/general_contact/automatic_domain.py +621 -0
- anyfesolver/general_contact/beam_chain_consistent.py +357 -0
- anyfesolver/general_contact/beam_chain_end_geometry.py +237 -0
- anyfesolver/general_contact/beam_chain_ends.py +220 -0
- anyfesolver/general_contact/beam_chain_pair.py +416 -0
- anyfesolver/general_contact/beam_curve_end_geometry.py +254 -0
- anyfesolver/general_contact/beam_curve_ends.py +237 -0
- anyfesolver/general_contact/beam_curve_pair.py +794 -0
- anyfesolver/general_contact/beam_curve_pair_static.py +303 -0
- anyfesolver/general_contact/beam_end_radial_geometry.py +221 -0
- anyfesolver/general_contact/beam_end_topology.py +15 -0
- anyfesolver/general_contact/beam_hemisphere_coupled_tool.py +61 -0
- anyfesolver/general_contact/beam_hemisphere_cylinder.py +134 -0
- anyfesolver/general_contact/beam_hemisphere_cylinder_motion.py +89 -0
- anyfesolver/general_contact/beam_hemisphere_cylinder_work.py +216 -0
- anyfesolver/general_contact/beam_hemisphere_plane.py +175 -0
- anyfesolver/general_contact/beam_hemisphere_s3_support.py +152 -0
- anyfesolver/general_contact/beam_hemisphere_sphere.py +135 -0
- anyfesolver/general_contact/beam_hemisphere_sphere_work.py +114 -0
- anyfesolver/general_contact/beam_hemisphere_support.py +211 -0
- anyfesolver/general_contact/beam_pair.py +523 -0
- anyfesolver/general_contact/beam_pair_end_geometry.py +269 -0
- anyfesolver/general_contact/beam_pair_ends.py +222 -0
- anyfesolver/general_contact/beam_plane.py +425 -0
- anyfesolver/general_contact/beam_radial.py +500 -0
- anyfesolver/general_contact/beam_radial_ends.py +223 -0
- anyfesolver/general_contact/beam_s3_directional_rates.py +196 -0
- anyfesolver/general_contact/beam_s3_rotational_transient.py +126 -0
- anyfesolver/general_contact/beam_s3_transient.py +139 -0
- anyfesolver/general_contact/beam_shell.py +648 -0
- anyfesolver/general_contact/beam_shell_patch.py +395 -0
- anyfesolver/general_contact/beam_temporal_bounds.py +230 -0
- anyfesolver/general_contact/capability.py +101 -0
- anyfesolver/general_contact/capped_cylinder.py +618 -0
- anyfesolver/general_contact/contact_search.py +95 -0
- anyfesolver/general_contact/core.py +1769 -0
- anyfesolver/general_contact/curved_s3_q4_work.py +238 -0
- anyfesolver/general_contact/curved_shell_skin.py +520 -0
- anyfesolver/general_contact/d1_interior_profile.py +427 -0
- anyfesolver/general_contact/deformable_beam_s3_caps.py +143 -0
- anyfesolver/general_contact/deformable_beam_s3_line.py +211 -0
- anyfesolver/general_contact/deformable_beam_s3_static.py +152 -0
- anyfesolver/general_contact/descriptor_rates.py +61 -0
- anyfesolver/general_contact/enriched_cold_predictor.py +161 -0
- anyfesolver/general_contact/enriched_moment_batch.py +337 -0
- anyfesolver/general_contact/enriched_multitarget.py +308 -0
- anyfesolver/general_contact/enriched_multitarget_gap.py +156 -0
- anyfesolver/general_contact/enriched_multitarget_moments.py +194 -0
- anyfesolver/general_contact/enriched_multitarget_topology.py +171 -0
- anyfesolver/general_contact/enriched_nonlinear.py +440 -0
- anyfesolver/general_contact/enriched_overlap.py +299 -0
- anyfesolver/general_contact/enriched_path.py +253 -0
- anyfesolver/general_contact/enriched_small_cut.py +310 -0
- anyfesolver/general_contact/enriched_static.py +481 -0
- anyfesolver/general_contact/enriched_union.py +320 -0
- anyfesolver/general_contact/equilibrated_pressure_pivot.py +140 -0
- anyfesolver/general_contact/event_subdivision.py +273 -0
- anyfesolver/general_contact/finite_mixed_state.py +133 -0
- anyfesolver/general_contact/finite_rigid_patch.py +196 -0
- anyfesolver/general_contact/finite_rigid_support.py +129 -0
- anyfesolver/general_contact/finite_rigid_sweep.py +53 -0
- anyfesolver/general_contact/finite_rotation_predictor.py +171 -0
- anyfesolver/general_contact/finite_rotation_skin.py +212 -0
- anyfesolver/general_contact/finite_rotation_state.py +106 -0
- anyfesolver/general_contact/finite_rotation_sweep.py +161 -0
- anyfesolver/general_contact/finite_v2d_state.py +104 -0
- anyfesolver/general_contact/fixed_projection_graph.py +205 -0
- anyfesolver/general_contact/fixed_projection_s3_events.py +235 -0
- anyfesolver/general_contact/free_rigid.py +134 -0
- anyfesolver/general_contact/friction_point.py +378 -0
- anyfesolver/general_contact/gap_extrema.py +119 -0
- anyfesolver/general_contact/guided_pair_transient_geometry.py +138 -0
- anyfesolver/general_contact/initial_contact_seed.py +368 -0
- anyfesolver/general_contact/linearized_pivot.py +595 -0
- anyfesolver/general_contact/material_work_diagnostics.py +159 -0
- anyfesolver/general_contact/moment_batch_ad.py +129 -0
- anyfesolver/general_contact/moment_batch_points.py +75 -0
- anyfesolver/general_contact/moving.py +1031 -0
- anyfesolver/general_contact/multiple_beam_rigid.py +248 -0
- anyfesolver/general_contact/multiple_beam_s3_caps.py +199 -0
- anyfesolver/general_contact/multiple_beam_s3_transient.py +223 -0
- anyfesolver/general_contact/multiple_projected_pairs.py +196 -0
- anyfesolver/general_contact/multiple_shell_planes.py +226 -0
- anyfesolver/general_contact/native_activation_static.py +143 -0
- anyfesolver/general_contact/native_checkpoint_results.py +213 -0
- anyfesolver/general_contact/native_curve_union.py +268 -0
- anyfesolver/general_contact/native_curved_geometry.py +374 -0
- anyfesolver/general_contact/native_curved_pair_partition.py +590 -0
- anyfesolver/general_contact/native_curved_plane_work.py +864 -0
- anyfesolver/general_contact/native_curved_s3_work.py +472 -0
- anyfesolver/general_contact/native_event_polynomial.py +164 -0
- anyfesolver/general_contact/native_fibre_context.py +173 -0
- anyfesolver/general_contact/native_fibre_results.py +74 -0
- anyfesolver/general_contact/native_initial_guess.py +122 -0
- anyfesolver/general_contact/native_material_activation.py +108 -0
- anyfesolver/general_contact/native_material_plane.py +111 -0
- anyfesolver/general_contact/native_material_s3.py +209 -0
- anyfesolver/general_contact/native_multi_s3_static.py +722 -0
- anyfesolver/general_contact/native_normal_angles.py +233 -0
- anyfesolver/general_contact/native_pair_error_budget.py +49 -0
- anyfesolver/general_contact/native_replay_arithmetic.py +103 -0
- anyfesolver/general_contact/native_replay_diagnostics.py +90 -0
- anyfesolver/general_contact/native_retained_body_junction.py +99 -0
- anyfesolver/general_contact/native_retained_body_pair.py +220 -0
- anyfesolver/general_contact/native_retained_body_projection.py +160 -0
- anyfesolver/general_contact/native_retained_body_static.py +62 -0
- anyfesolver/general_contact/native_retained_cell_pair.py +185 -0
- anyfesolver/general_contact/native_retained_curve_cell.py +102 -0
- anyfesolver/general_contact/native_retained_line_plane.py +210 -0
- anyfesolver/general_contact/native_retained_line_s3.py +440 -0
- anyfesolver/general_contact/native_retained_line_s3_work.py +91 -0
- anyfesolver/general_contact/native_retained_pair_static.py +845 -0
- anyfesolver/general_contact/native_retained_s3_static.py +554 -0
- anyfesolver/general_contact/native_retained_static.py +478 -0
- anyfesolver/general_contact/native_retained_station.py +222 -0
- anyfesolver/general_contact/native_retained_whole_pair.py +2120 -0
- anyfesolver/general_contact/native_s3_swept.py +149 -0
- anyfesolver/general_contact/native_shell_static_driver.py +144 -0
- anyfesolver/general_contact/native_surface_activation.py +391 -0
- anyfesolver/general_contact/native_surface_bounds.py +198 -0
- anyfesolver/general_contact/native_surface_contributor.py +121 -0
- anyfesolver/general_contact/native_surface_crossing.py +81 -0
- anyfesolver/general_contact/native_surface_event_sequence.py +320 -0
- anyfesolver/general_contact/native_surface_extrema.py +72 -0
- anyfesolver/general_contact/native_surface_friction_integral.py +1724 -0
- anyfesolver/general_contact/native_surface_front.py +742 -0
- anyfesolver/general_contact/native_surface_front_boundary.py +160 -0
- anyfesolver/general_contact/native_surface_front_precision.py +78 -0
- anyfesolver/general_contact/native_surface_front_work.py +118 -0
- anyfesolver/general_contact/native_surface_history.py +334 -0
- anyfesolver/general_contact/native_surface_normal.py +324 -0
- anyfesolver/general_contact/native_surface_patch.py +213 -0
- anyfesolver/general_contact/native_surface_path.py +348 -0
- anyfesolver/general_contact/native_surface_quadrature.py +212 -0
- anyfesolver/general_contact/native_surface_s3_friction.py +340 -0
- anyfesolver/general_contact/native_surface_support.py +776 -0
- anyfesolver/general_contact/native_surface_transaction.py +198 -0
- anyfesolver/general_contact/native_transient_multi_shell.py +108 -0
- anyfesolver/general_contact/native_transient_pair.py +61 -0
- anyfesolver/general_contact/native_transient_shell.py +44 -0
- anyfesolver/general_contact/normal_s3_skin_path.py +163 -0
- anyfesolver/general_contact/overlap.py +443 -0
- anyfesolver/general_contact/pair.py +466 -0
- anyfesolver/general_contact/patch_broadphase.py +111 -0
- anyfesolver/general_contact/patch_mortar.py +593 -0
- anyfesolver/general_contact/patch_sliding.py +644 -0
- anyfesolver/general_contact/plane_newmark_events.py +278 -0
- anyfesolver/general_contact/pointwise_patch.py +288 -0
- anyfesolver/general_contact/polynomial_roots.py +312 -0
- anyfesolver/general_contact/pressure_basis.py +241 -0
- anyfesolver/general_contact/pressure_diagnostics.py +155 -0
- anyfesolver/general_contact/pressure_overlay.py +182 -0
- anyfesolver/general_contact/pressure_space.py +51 -0
- anyfesolver/general_contact/q4_material_checkpoint.py +276 -0
- anyfesolver/general_contact/q4_overlap_local_bound.py +1111 -0
- anyfesolver/general_contact/q4_q4_overlap_derivatives.py +234 -0
- anyfesolver/general_contact/q4_q4_swept_bound.py +58 -0
- anyfesolver/general_contact/q4_s3_overlap_derivatives.py +1159 -0
- anyfesolver/general_contact/q4_s3_tiny_wedge.py +180 -0
- anyfesolver/general_contact/q4_skin_work.py +87 -0
- anyfesolver/general_contact/q4_source_mortar_energy.py +181 -0
- anyfesolver/general_contact/q4_source_overlap.py +401 -0
- anyfesolver/general_contact/q4_target_overlap.py +181 -0
- anyfesolver/general_contact/request_identity.py +192 -0
- anyfesolver/general_contact/rigid_translation.py +199 -0
- anyfesolver/general_contact/runtime.py +27 -0
- anyfesolver/general_contact/s3_friction_chart_interval.py +104 -0
- anyfesolver/general_contact/s3_friction_coverage.py +165 -0
- anyfesolver/general_contact/s3_friction_dyadic_interval.py +39 -0
- anyfesolver/general_contact/s3_friction_history_path.py +111 -0
- anyfesolver/general_contact/s3_friction_mesh_coverage.py +145 -0
- anyfesolver/general_contact/s3_friction_mesh_gap.py +74 -0
- anyfesolver/general_contact/s3_friction_mesh_monolithic.py +150 -0
- anyfesolver/general_contact/s3_friction_monolithic.py +121 -0
- anyfesolver/general_contact/s3_friction_moving_coverage.py +114 -0
- anyfesolver/general_contact/s3_friction_pair.py +237 -0
- anyfesolver/general_contact/s3_friction_point.py +129 -0
- anyfesolver/general_contact/s3_friction_prepared_path.py +254 -0
- anyfesolver/general_contact/s3_friction_replay.py +1094 -0
- anyfesolver/general_contact/s3_friction_rim_path.py +69 -0
- anyfesolver/general_contact/s3_friction_rim_transaction.py +23 -0
- anyfesolver/general_contact/s3_friction_static.py +267 -0
- anyfesolver/general_contact/s3_friction_swept_gap.py +112 -0
- anyfesolver/general_contact/s3_friction_touch.py +94 -0
- anyfesolver/general_contact/s3_friction_weak_pressure.py +66 -0
- anyfesolver/general_contact/s3_overlap_derivatives.py +220 -0
- anyfesolver/general_contact/s3_overlap_hermite_gap.py +180 -0
- anyfesolver/general_contact/s3_pair_static.py +343 -0
- anyfesolver/general_contact/s3_patch_augmented.py +2056 -0
- anyfesolver/general_contact/s3_patch_mortar_energy.py +545 -0
- anyfesolver/general_contact/s3_patch_static.py +1725 -0
- anyfesolver/general_contact/s3_pressure_hermite_bounds.py +395 -0
- anyfesolver/general_contact/s3_pressure_polygon_bounds.py +73 -0
- anyfesolver/general_contact/s3_q4_gap_resolution.py +191 -0
- anyfesolver/general_contact/s3_q4_overlap_derivatives.py +252 -0
- anyfesolver/general_contact/s3_q4_swept.py +56 -0
- anyfesolver/general_contact/s3_skin_work.py +101 -0
- anyfesolver/general_contact/s3_sliding_friction.py +640 -0
- anyfesolver/general_contact/s3_stable_plane_gap.py +43 -0
- anyfesolver/general_contact/seed_path_vertex_interval.py +323 -0
- anyfesolver/general_contact/semismooth.py +133 -0
- anyfesolver/general_contact/semismooth_block.py +147 -0
- anyfesolver/general_contact/semismooth_path.py +871 -0
- anyfesolver/general_contact/shell_pair_hermite_sweep.py +336 -0
- anyfesolver/general_contact/shell_sphere_temporal_bounds.py +305 -0
- anyfesolver/general_contact/skin_geometry.py +106 -0
- anyfesolver/general_contact/sliding.py +349 -0
- anyfesolver/general_contact/sphere.py +691 -0
- anyfesolver/general_contact/sphere_temporal_bounds.py +241 -0
- anyfesolver/general_contact/static_path.py +2608 -0
- anyfesolver/general_contact/static_results_archive.py +140 -0
- anyfesolver/general_contact/structural_state_bridge.py +196 -0
- anyfesolver/general_contact/supported_schur.py +594 -0
- anyfesolver/general_contact/swept_patch_broadphase.py +160 -0
- anyfesolver/general_contact/transient.py +2921 -0
- anyfesolver/general_contact/transient_results_archive.py +491 -0
- anyfesolver/general_contact/triangle_mortar_energy.py +280 -0
- anyfesolver/general_contact/triangle_pair_energy.py +211 -0
- anyfesolver/general_contact/triangulated_rigid.py +94 -0
- anyfesolver/general_contact/triangulated_rigid_static.py +399 -0
- anyfesolver/general_contact/warped_q4_plane.py +185 -0
- anyfesolver/general_contact/warped_q4_skin.py +302 -0
- anyfesolver/general_contact/warped_q4_static.py +331 -0
- anyfesolver/impact_performance.py +273 -0
- anyfesolver/impact_reduced_assembly.py +294 -0
- anyfesolver/imperfections.py +397 -0
- anyfesolver/inertia_relief.py +676 -0
- anyfesolver/initial_field_state.py +54 -0
- anyfesolver/jit_compiler.py +135 -0
- anyfesolver/kernel_warmup.py +228 -0
- anyfesolver/linalg.py +1002 -0
- anyfesolver/marine_contributions.py +634 -0
- anyfesolver/marine_coupled_equilibrium.py +292 -0
- anyfesolver/marine_equilibrium.py +405 -0
- anyfesolver/marine_hydro_coordinates.py +346 -0
- anyfesolver/marine_linear.py +549 -0
- anyfesolver/marine_link.py +306 -0
- anyfesolver/marine_mechanical.py +923 -0
- anyfesolver/marine_mooring.py +533 -0
- anyfesolver/marine_morison.py +331 -0
- anyfesolver/marine_potential_flow.py +403 -0
- anyfesolver/marine_rigid.py +397 -0
- anyfesolver/marine_seabed.py +122 -0
- anyfesolver/mass_properties.py +352 -0
- anyfesolver/material_curves.py +52 -0
- anyfesolver/materials.py +43 -0
- anyfesolver/matrix_assembly.py +7330 -0
- anyfesolver/mesh_gen.py +904 -0
- anyfesolver/mesh_load_bc_verification.py +612 -0
- anyfesolver/modal.py +2494 -0
- anyfesolver/nonlinear.py +341 -0
- anyfesolver/nonlinear_analysis_diagnostics.py +466 -0
- anyfesolver/nonlinear_element_evaluation.py +126 -0
- anyfesolver/nonlinear_performance.py +2094 -0
- anyfesolver/nonlinear_performance_batch_b.py +1173 -0
- anyfesolver/nonlinear_performance_batch_c.py +850 -0
- anyfesolver/nonlinear_performance_bootstrap.py +164 -0
- anyfesolver/nonlinear_reduced_assembly.py +806 -0
- anyfesolver/nonlinear_restart.py +1708 -0
- anyfesolver/nonlinear_state.py +2800 -0
- anyfesolver/nonlinear_static.py +9407 -0
- anyfesolver/outcomes.py +694 -0
- anyfesolver/plasticity.py +2087 -0
- anyfesolver/plasticity_qualification.py +758 -0
- anyfesolver/prepared_static.py +1129 -0
- anyfesolver/prepared_static_envelopes.py +389 -0
- anyfesolver/prepared_static_loads.py +1180 -0
- anyfesolver/prepared_static_measures.py +18 -0
- anyfesolver/prepared_static_numeric.py +247 -0
- anyfesolver/prepared_static_q4.py +297 -0
- anyfesolver/prepared_static_recovery.py +2068 -0
- anyfesolver/prepared_static_response.py +1013 -0
- anyfesolver/prepared_static_shared.py +226 -0
- anyfesolver/prepared_static_snapshot.py +323 -0
- anyfesolver/prepared_static_vectorized.py +866 -0
- anyfesolver/pressure_regions.py +287 -0
- anyfesolver/production_readiness.py +343 -0
- anyfesolver/quality_control.py +1487 -0
- anyfesolver/quantities.py +1289 -0
- anyfesolver/recovery.py +4217 -0
- anyfesolver/recovery_batches.py +1985 -0
- anyfesolver/recovery_policy.py +205 -0
- anyfesolver/recovery_s4.py +289 -0
- anyfesolver/recovery_shell_frames.py +102 -0
- anyfesolver/reference_cases.py +366 -0
- anyfesolver/result_capsule.py +2175 -0
- anyfesolver/results.py +752 -0
- anyfesolver/runtime.py +9819 -0
- anyfesolver/s3_reference_batch.py +1338 -0
- anyfesolver/s3_v2c_fast_assembly.py +544 -0
- anyfesolver/s3_v2d_fast_assembly.py +447 -0
- anyfesolver/s4_validity.py +354 -0
- anyfesolver/sections.py +67 -0
- anyfesolver/sesam_fem/__init__.py +55 -0
- anyfesolver/sesam_fem/__main__.py +80 -0
- anyfesolver/sesam_fem/diagnostics.py +5 -0
- anyfesolver/sesam_fem/document.py +39 -0
- anyfesolver/sesam_fem/exporter.py +9 -0
- anyfesolver/sesam_fem/importer.py +228 -0
- anyfesolver/sesam_fem/records.py +21 -0
- anyfesolver/sesam_fem/schema.py +35 -0
- anyfesolver/sesam_fem/sif_importer.py +9 -0
- anyfesolver/sesam_fem/validation.py +5 -0
- anyfesolver/sestra_deep_diagnostics.py +173 -0
- anyfesolver/sestra_mixed_verification.py +146 -0
- anyfesolver/sestra_structure_benchmarks.py +270 -0
- anyfesolver/sestra_three_case.py +215 -0
- anyfesolver/sestra_verification.py +523 -0
- anyfesolver/shell_benchmarks.py +367 -0
- anyfesolver/shell_formulations/director_field.py +799 -0
- anyfesolver/shell_formulations/geometry_provenance.py +921 -0
- anyfesolver/shell_formulations/mitc4_plus_d_quality.py +318 -0
- anyfesolver/shell_formulations/mitc4_plus_d_reference.py +837 -0
- anyfesolver/shell_formulations/mitc4_plus_d_scalar.py +209 -0
- anyfesolver/shell_formulations/protocol.py +222 -0
- anyfesolver/shell_formulations/q4_common.py +271 -0
- anyfesolver/shell_formulations/s4_restricted_policy.py +78 -0
- anyfesolver/shell_sections.py +394 -0
- anyfesolver/solid_submodel.py +930 -0
- anyfesolver/static_batch.py +662 -0
- anyfesolver/static_envelopes.py +250 -0
- anyfesolver/stiffened_shell.py +388 -0
- anyfesolver/submodel_transfer.py +1306 -0
- anyfesolver/test_cases.py +610 -0
- anyfesolver/threading_policy.py +431 -0
- anyfesolver/validation.py +719 -0
- anyfesolver/vectorized_beam.py +139 -0
- anyfesolver/vectorized_generalized_shell.py +448 -0
- anyfesolver/vectorized_hill48.py +956 -0
- anyfesolver/vectorized_nonlinear.py +360 -0
- anyfesolver/vectorized_stiffness.py +694 -0
- anyfesolver-0.5.0a1.dist-info/METADATA +374 -0
- anyfesolver-0.5.0a1.dist-info/RECORD +751 -0
- anyfesolver-0.5.0a1.dist-info/WHEEL +5 -0
- anyfesolver-0.5.0a1.dist-info/licenses/COPYRIGHT +1 -0
- anyfesolver-0.5.0a1.dist-info/licenses/LICENSE +373 -0
- anyfesolver-0.5.0a1.dist-info/licenses/THIRD_PARTY_NOTICES.md +32 -0
- 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'}
|