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,391 @@
|
|
|
1
|
+
"""Single transverse first touch on the declared native/S3 material path.
|
|
2
|
+
|
|
3
|
+
Local development: the instantaneous force map holds the event fixed, while
|
|
4
|
+
algorithmic derivatives include its sensitivity. No event is physically committed.
|
|
5
|
+
"""
|
|
6
|
+
from dataclasses import dataclass, replace
|
|
7
|
+
from math import fsum
|
|
8
|
+
from functools import lru_cache
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
from scipy.optimize import brentq
|
|
12
|
+
from anyfesolver._ge_beam3_p5_seeded.core import sha
|
|
13
|
+
|
|
14
|
+
from anyfesolver._ge_beam3_mixed_ad import Jet2, so3_exp, so3_log, matmul, matvec, constant_matrix, dot, rotation_exponential
|
|
15
|
+
from .native_retained_station import _readonly
|
|
16
|
+
from .native_surface_path import material_path_pose, certify_material_ownership, affine_gap_polynomial
|
|
17
|
+
from .native_surface_s3_friction import _unit, _cross
|
|
18
|
+
from .friction_point import FrictionPointState, trial_coulomb_point, objective_relative_tangent_increment
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(frozen=True)
|
|
22
|
+
class NativeS3ActivationResult:
|
|
23
|
+
residual: np.ndarray
|
|
24
|
+
tangent: np.ndarray
|
|
25
|
+
trial: object
|
|
26
|
+
normal_gap_m: float
|
|
27
|
+
normal_pressure_Pa: float
|
|
28
|
+
normal_storage_j: float
|
|
29
|
+
event_fraction: float
|
|
30
|
+
event_gradient_local: np.ndarray
|
|
31
|
+
path_sha256: str
|
|
32
|
+
ownership_intervals: int
|
|
33
|
+
normal_residual: np.ndarray
|
|
34
|
+
normal_tangent: np.ndarray
|
|
35
|
+
profile: str = 'NATIVE_S3_TRANSVERSE_FIRST_TOUCH_POINT_DEV_V1'
|
|
36
|
+
|
|
37
|
+
def spatial_tangent(self):
|
|
38
|
+
# Mixed virtual/algorithmic rotations already give spatial covectors.
|
|
39
|
+
return self.tangent
|
|
40
|
+
|
|
41
|
+
def normal_spatial_tangent(self):
|
|
42
|
+
return self.normal_tangent
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass(frozen=True)
|
|
46
|
+
class NativeS3ClosedSequenceResult(NativeS3ActivationResult):
|
|
47
|
+
event_fractions: tuple = ()
|
|
48
|
+
history_evaluations: int = 0
|
|
49
|
+
profile: str = 'NATIVE_S3_CLOSED_EVENT_SEQUENCE_POINT_DEV_V1'
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _frame(corners):
|
|
53
|
+
a=[corners[1][i]-corners[0][i] for i in range(3)]
|
|
54
|
+
b=[corners[2][i]-corners[0][i] for i in range(3)]
|
|
55
|
+
first=_unit(a); normal=_unit(_cross(a,b)); second=_cross(normal,first)
|
|
56
|
+
return [[first[i],second[i],normal[i]] for i in range(3)]
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _point(corners, weights):
|
|
60
|
+
return [sum(weights[a]*corners[a][i] for a in range(3)) for i in range(3)]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _freeze_jets(values):
|
|
64
|
+
for value in values:
|
|
65
|
+
value.gradient.setflags(write=False);value.hessian.setflags(write=False)
|
|
66
|
+
return tuple(values)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@lru_cache(maxsize=32)
|
|
70
|
+
def _event_rotation_chart(rotation_entries,size):
|
|
71
|
+
"""Pure endpoint rotation derivatives; no geometry/history is cached."""
|
|
72
|
+
q=[Jet2.constant(0.,0) if size==0 else Jet2.variable(0.,3+i,size) for i in range(3)]
|
|
73
|
+
rotation=matmul(so3_exp(q),constant_matrix(np.asarray(rotation_entries).reshape(3,3),size))
|
|
74
|
+
return _freeze_jets(so3_log(rotation))
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@lru_cache(maxsize=1)
|
|
78
|
+
def _endpoint_virtual_rotation():
|
|
79
|
+
q=[Jet2.variable(0.,3+i,30) for i in range(3)]
|
|
80
|
+
v=[Jet2.variable(0.,18+i,30) for i in range(3)]
|
|
81
|
+
return tuple(_freeze_jets(row) for row in matmul(so3_exp(v),so3_exp(q)))
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@lru_cache(maxsize=32)
|
|
85
|
+
def _endpoint_frame_jets(corner_bytes):
|
|
86
|
+
"""Immutable endpoint geometry jets, shared across material coordinates."""
|
|
87
|
+
corners=np.frombuffer(corner_bytes,dtype=np.float64).reshape(3,3)
|
|
88
|
+
y=[[Jet2.constant(corners[a,i],30)+Jet2.variable(0.,6+3*a+i,30)
|
|
89
|
+
+Jet2.variable(0.,21+3*a+i,30) for i in range(3)] for a in range(3)]
|
|
90
|
+
return tuple(_freeze_jets(row) for row in _frame(y))
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def evaluate_first_touch(pair, start, history, translations, angular, shell_increment,
|
|
94
|
+
*, maximum_intervals=256):
|
|
95
|
+
return _evaluate_transverse_event(pair,start,history,translations,angular,shell_increment,
|
|
96
|
+
maximum_intervals=maximum_intervals,opening=False)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def evaluate_release(pair,start,history,translations,angular,shell_increment,*,maximum_intervals=256):
|
|
100
|
+
return _evaluate_transverse_event(pair,start,history,translations,angular,shell_increment,
|
|
101
|
+
maximum_intervals=maximum_intervals,opening=True)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _evaluate_transverse_event(pair, start, history, translations, angular, shell_increment,
|
|
105
|
+
*, maximum_intervals, opening):
|
|
106
|
+
"""Actual-gap first-touch traction and complete spatial endpoint tangent.
|
|
107
|
+
|
|
108
|
+
A global second-derivative bound proves strict gap decrease, hence unique
|
|
109
|
+
first-root ownership. Unresolved/nonmonotone paths fail rather than dropping
|
|
110
|
+
crossings. This initial branch requires an open physical history.
|
|
111
|
+
"""
|
|
112
|
+
if sha(pair._definition()) != pair.definition_sha256:
|
|
113
|
+
raise ValueError('native/S3 material-point definition changed')
|
|
114
|
+
if opening and (type(history) is not FrictionPointState or history.partner_key!=pair.partner_key):
|
|
115
|
+
raise ValueError('release candidate requires matching active physical history')
|
|
116
|
+
if not opening and (type(history) is not FrictionPointState or history.partner_key is not None):
|
|
117
|
+
raise ValueError('first-touch candidate requires released physical history')
|
|
118
|
+
end=material_path_pose(start,translations,angular,shell_increment,1.)
|
|
119
|
+
ownership=certify_material_ownership(pair,start,translations,angular,shell_increment,
|
|
120
|
+
maximum_intervals=maximum_intervals)
|
|
121
|
+
if not ownership.certified:
|
|
122
|
+
raise ValueError('first-touch physical ownership unresolved: '+ownership.reason)
|
|
123
|
+
source,target=pair.source,pair.target
|
|
124
|
+
old=source.surface_variations(start.positions,start.position_low,start.cell_rotations)
|
|
125
|
+
new=source.surface_variations(end.positions,end.position_low,end.cell_rotations)
|
|
126
|
+
y0=target.adapter.current_positions(start.shell_displacement)
|
|
127
|
+
y1=target.adapter.current_positions(end.shell_displacement)
|
|
128
|
+
base0=old.station.surface_position-old.surface_arm
|
|
129
|
+
base1=new.station.surface_position-new.surface_arm
|
|
130
|
+
omega=np.asarray(angular)[source.cell]
|
|
131
|
+
a,b=y0[1]-y0[0],y0[2]-y0[0]
|
|
132
|
+
da=(y1[1]-y1[0])-a; db=(y1[2]-y1[0])-b
|
|
133
|
+
c0=np.cross(a,b); c2=np.cross(a+da,b+db)
|
|
134
|
+
c1=.5*(np.cross(a,b+db)+np.cross(a+da,b))
|
|
135
|
+
normal0=c0/np.linalg.norm(c0)
|
|
136
|
+
lower=min(float(normal0@c) for c in (c0,c1,c2))
|
|
137
|
+
if lower<=0:raise ValueError('first-touch target area bound unresolved')
|
|
138
|
+
cp0=np.cross(da,b)+np.cross(a,db)
|
|
139
|
+
cp1=np.cross(da,b+db)+np.cross(a+da,db)
|
|
140
|
+
m1=max(np.linalg.norm(cp0),np.linalg.norm(cp1)); m2=2*np.linalg.norm(np.cross(da,db))
|
|
141
|
+
n1=m1/lower; n2=m2/lower+3*m1*m1/(lower*lower)
|
|
142
|
+
velocity=base1-base0-(y1[0]-y0[0])
|
|
143
|
+
arm=np.linalg.norm(old.surface_arm); angle=np.linalg.norm(omega)
|
|
144
|
+
radius=max(np.linalg.norm(base0-y0[0]),np.linalg.norm(base1-y1[0]))+arm
|
|
145
|
+
speed=np.linalg.norm(velocity)+angle*arm
|
|
146
|
+
second_bound=n2*radius+2*n1*speed+angle*angle*arm
|
|
147
|
+
normal_derivative=(cp0-normal0*(normal0@cp0))/np.linalg.norm(c0)
|
|
148
|
+
derivative0=float(normal_derivative@(old.station.surface_position-y0[0])
|
|
149
|
+
+normal0@(velocity+np.cross(omega,old.surface_arm)))
|
|
150
|
+
padding=512*np.finfo(float).eps*max(1.,radius,speed,second_bound)
|
|
151
|
+
if ((not opening and derivative0+second_bound>=-padding) or
|
|
152
|
+
(opening and derivative0-second_bound<=padding)):
|
|
153
|
+
raise ValueError('first-touch transverse monotone path unresolved')
|
|
154
|
+
|
|
155
|
+
def gap(alpha):
|
|
156
|
+
pose=material_path_pose(start,translations,angular,shell_increment,alpha)
|
|
157
|
+
x=source.evaluate(pose.positions,pose.position_low,pose.cell_rotations).surface_position
|
|
158
|
+
t=target.physical_pose(pose.shell_displacement)
|
|
159
|
+
return float((x-np.asarray(t.position))@np.asarray(t.material_frame)[:,2])
|
|
160
|
+
|
|
161
|
+
g0,g1=gap(0.),gap(1.)
|
|
162
|
+
prepared_translations=np.asarray(translations,dtype=float)
|
|
163
|
+
weights=(1.-source.t,source.t)
|
|
164
|
+
base_terms=tuple(tuple((weights[j]*float(start.positions[source.cell+j,i]),
|
|
165
|
+
weights[j]*float(start.position_low[source.cell+j,i])) for j in range(2))
|
|
166
|
+
for i in range(3))
|
|
167
|
+
base_velocity=np.array([fsum(weights[j]*float(prepared_translations[source.cell+j,i]) for j in range(2))
|
|
168
|
+
for i in range(3)])
|
|
169
|
+
def root_gap(alpha):
|
|
170
|
+
# Prepared scalar geometry for root iterations only. Endpoint and final
|
|
171
|
+
# root checks still use the authoritative adapters above/below. Native
|
|
172
|
+
# base motion is affine; the material arm follows the declared Exp path.
|
|
173
|
+
if alpha==0.:return g0
|
|
174
|
+
if alpha==1.:return g1
|
|
175
|
+
base=np.array([fsum((*base_terms[i][0],*base_terms[i][1],alpha*base_velocity[i])) for i in range(3)])
|
|
176
|
+
x=base+rotation_exponential(alpha*omega)@old.surface_arm
|
|
177
|
+
y=y0+alpha*(y1-y0)
|
|
178
|
+
normal=np.cross(y[1]-y[0],y[2]-y[0]);normal/=np.linalg.norm(normal)
|
|
179
|
+
point=np.asarray(target.barycentric)@y
|
|
180
|
+
return float((x-point)@normal)
|
|
181
|
+
exact_release_endpoint=False
|
|
182
|
+
if opening and g1==0.:
|
|
183
|
+
polynomial=affine_gap_polynomial(pair,start,np.asarray(translations),angular,shell_increment)
|
|
184
|
+
exact_release_endpoint=polynomial is not None and sum(polynomial)==0
|
|
185
|
+
if ((not opening and (not g0>padding or not g1<-padding)) or
|
|
186
|
+
(opening and (not g0<-padding or not (g1>padding or exact_release_endpoint)))):
|
|
187
|
+
raise ValueError('first-touch needs resolved open and closed endpoints')
|
|
188
|
+
alpha=brentq(root_gap,0.,1.,xtol=4*np.finfo(float).eps,rtol=4*np.finfo(float).eps,maxiter=64)
|
|
189
|
+
if abs(gap(alpha))>padding:
|
|
190
|
+
raise ValueError('first-touch root residual unresolved')
|
|
191
|
+
if opening:
|
|
192
|
+
return _release_history(pair,start,end,history,translations,angular,shell_increment,
|
|
193
|
+
alpha,g1,ownership)
|
|
194
|
+
|
|
195
|
+
return _closing_event_endpoint(pair,start,end,history,alpha,g1,padding,ownership)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _certified_endpoint_primal(g,padding,certified_gap):
|
|
199
|
+
"""Validate a private certified endpoint gap; correct only the Jet2 primal.
|
|
200
|
+
|
|
201
|
+
The certified exact gap is admitted only when finite, strictly closed, and
|
|
202
|
+
in agreement with the endpoint law's own binary64 evaluation within the
|
|
203
|
+
existing work-map mismatch padding. Inside the coordinate padding that
|
|
204
|
+
evaluation cannot resolve the contact sign; the certified magnitude then
|
|
205
|
+
replaces only the primal, preserving the declared chart's gradient/Hessian.
|
|
206
|
+
Exact touches, out-of-profile open gaps, nonfinite values, and
|
|
207
|
+
above-padding contradictions refuse.
|
|
208
|
+
"""
|
|
209
|
+
if not np.isfinite(certified_gap):
|
|
210
|
+
raise ValueError('certified endpoint gap must be finite')
|
|
211
|
+
if certified_gap==0.:
|
|
212
|
+
raise ValueError('certified endpoint gap exact touch unresolved')
|
|
213
|
+
if certified_gap>0.:
|
|
214
|
+
raise ValueError('certified endpoint gap contradicts closed endpoint profile')
|
|
215
|
+
if abs(g.value-certified_gap)>padding:
|
|
216
|
+
raise ValueError('certified endpoint gap contradicts endpoint work geometry')
|
|
217
|
+
if abs(g.value)>padding:
|
|
218
|
+
# Agreement with a strictly closed certified gap beyond the padding
|
|
219
|
+
# means the binary64 evaluation resolved a clearly closed endpoint.
|
|
220
|
+
return g
|
|
221
|
+
return Jet2(certified_gap,g.gradient,g.hessian)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def _closing_event_endpoint(pair,start,end,history,alpha,g1,padding,ownership,*,certified_gap=None):
|
|
225
|
+
"""Closing-root force map differentiated from the original physical path.
|
|
226
|
+
|
|
227
|
+
Caller certifies the root and event schedule. Earlier released windows may
|
|
228
|
+
contribute cumulative history, but must leave zero elastic traction.
|
|
229
|
+
The optional certified_gap is the exact signed endpoint gap from the
|
|
230
|
+
precise coefficient schedule (native_event_polynomial), admitted only for
|
|
231
|
+
endpoints whose binary64 evaluation lies inside the coordinate padding;
|
|
232
|
+
it corrects only the primal above, leaving the declared derivative chart
|
|
233
|
+
and both-body work maps untouched.
|
|
234
|
+
"""
|
|
235
|
+
if type(history) is not FrictionPointState or history.partner_key is not None:
|
|
236
|
+
raise ValueError('closing event requires released physical history')
|
|
237
|
+
source,target=pair.source,pair.target
|
|
238
|
+
old=source.surface_variations(start.positions,start.position_low,start.cell_rotations)
|
|
239
|
+
new=source.surface_variations(end.positions,end.position_low,end.cell_rotations)
|
|
240
|
+
y0=target.adapter.current_positions(start.shell_displacement)
|
|
241
|
+
y1=target.adapter.current_positions(end.shell_displacement)
|
|
242
|
+
base0=old.station.surface_position-old.surface_arm
|
|
243
|
+
base1=new.station.surface_position-new.surface_arm
|
|
244
|
+
|
|
245
|
+
def event_geometry(q, fraction, size):
|
|
246
|
+
# q is an endpoint spatial perturbation. The algorithmic path is the
|
|
247
|
+
# principal declared spatial chart from the fixed physical origin.
|
|
248
|
+
relative_rotation=end.cell_rotations[source.cell]@start.cell_rotations[source.cell].T
|
|
249
|
+
logarithm=_event_rotation_chart(tuple(relative_rotation.ravel()),size)
|
|
250
|
+
rotated=matvec(so3_exp([fraction*v for v in logarithm]),
|
|
251
|
+
[Jet2.constant(v,size) for v in old.surface_arm])
|
|
252
|
+
x=[base0[i]+fraction*(base1[i]+q[i]-base0[i])+rotated[i] for i in range(3)]
|
|
253
|
+
y=[[y0[a,i]+fraction*(y1[a,i]+q[6+3*a+i]-y0[a,i]) for i in range(3)] for a in range(3)]
|
|
254
|
+
frame=_frame(y); point=_point(y,target.barycentric)
|
|
255
|
+
relative=[x[i]-point[i] for i in range(3)]
|
|
256
|
+
return frame,relative
|
|
257
|
+
|
|
258
|
+
# Implicit first-root gradient. No alpha Hessian is needed for the mixed
|
|
259
|
+
# virtual/algorithmic blocks below (alpha has no virtual dependence).
|
|
260
|
+
q=[Jet2.variable(0.,i,16) for i in range(15)]
|
|
261
|
+
f,r=event_geometry(q,Jet2.variable(alpha,15,16),16)
|
|
262
|
+
G=dot([row[2] for row in f],r)
|
|
263
|
+
if abs(G.value)>padding:raise ValueError('first-touch differentiated root mismatch')
|
|
264
|
+
if G.gradient[15]>=-padding:raise ValueError('first-touch derivative lost transversality')
|
|
265
|
+
alpha_gradient=-G.gradient[:15]/G.gradient[15]
|
|
266
|
+
state_only=getattr(pair,'_history_state_only',False)
|
|
267
|
+
size=0 if state_only else 30
|
|
268
|
+
gradient=np.zeros(size)
|
|
269
|
+
if not state_only:gradient[:15]=alpha_gradient
|
|
270
|
+
event_alpha=Jet2(alpha,gradient,np.zeros((size,size)))
|
|
271
|
+
q=[Jet2.constant(0.,size) if state_only else Jet2.variable(0.,i,size) for i in range(15)]
|
|
272
|
+
v=[Jet2.constant(0.,size) if state_only else Jet2.variable(0.,15+i,size) for i in range(15)]
|
|
273
|
+
event_frame,event_relative=event_geometry(q,event_alpha,size)
|
|
274
|
+
event_components=[sum(event_frame[j][i]*event_relative[j] for j in range(3)) for i in range(3)]
|
|
275
|
+
rotated=matvec(constant_matrix(np.eye(3),0) if state_only else _endpoint_virtual_rotation(),
|
|
276
|
+
[Jet2.constant(x,size) for x in new.surface_arm])
|
|
277
|
+
x=[base1[i]+q[i]+v[i]+rotated[i] for i in range(3)]
|
|
278
|
+
y=[[y1[a,i]+q[6+3*a+i]+v[6+3*a+i] for i in range(3)] for a in range(3)]
|
|
279
|
+
frame=(_frame(y) if state_only else _endpoint_frame_jets(np.asarray(y1,dtype=np.float64).tobytes()))
|
|
280
|
+
normal=[row[2] for row in frame];point=_point(y,target.barycentric)
|
|
281
|
+
relative=[x[i]-point[i] for i in range(3)]
|
|
282
|
+
transported=matvec(frame,event_components)
|
|
283
|
+
slip=[relative[i]-transported[i] for i in range(3)]
|
|
284
|
+
normal_slip=dot(normal,slip)
|
|
285
|
+
elastic=[slip[i]-normal[i]*normal_slip for i in range(3)]
|
|
286
|
+
g=dot(normal,relative)
|
|
287
|
+
if abs(g.value-g1)>padding:raise ValueError('first-touch endpoint work geometry mismatch')
|
|
288
|
+
if certified_gap is not None:
|
|
289
|
+
g=_certified_endpoint_primal(g,padding,certified_gap)
|
|
290
|
+
pressure=-pair.normal_stiffness_Pa_per_m*g.value
|
|
291
|
+
trial=trial_coulomb_point(history,material_frame=np.array([[j.value for j in row] for row in frame]),
|
|
292
|
+
relative_increment=np.array([j.value for j in elastic]),normal_pressure=pressure,
|
|
293
|
+
friction_coefficient=pair.friction_coefficient,tangential_stiffness=pair.tangential_stiffness_Pa_per_m,
|
|
294
|
+
partner_key=pair.partner_key)
|
|
295
|
+
energy=.5*pair.normal_stiffness_Pa_per_m*g*g
|
|
296
|
+
if state_only:
|
|
297
|
+
count=42+target.adapter.work_map.shape[1]
|
|
298
|
+
zero=_readonly(np.zeros(count));matrix=_readonly(np.zeros((count,count)))
|
|
299
|
+
return NativeS3ActivationResult(zero,matrix,trial,g.value,pressure,
|
|
300
|
+
pair.reference_weight_m2*energy.value,float(alpha),_readonly(alpha_gradient),
|
|
301
|
+
ownership.path_sha256,ownership.intervals,zero,matrix)
|
|
302
|
+
residual=energy.gradient[15:].copy(); tangent=energy.hessian[15:,:15].copy()
|
|
303
|
+
W=np.array([j.gradient[15:] for j in elastic]); D=np.array([j.gradient[:15] for j in elastic])
|
|
304
|
+
H=np.array([j.hessian[15:,:15] for j in elastic]); traction=np.asarray(trial.traction)
|
|
305
|
+
if trial.branch=='stick':
|
|
306
|
+
dt=-pair.tangential_stiffness_Pa_per_m*D
|
|
307
|
+
else:
|
|
308
|
+
e=np.array([j.value for j in elastic]);norm=np.linalg.norm(e);direction=e/norm
|
|
309
|
+
dp=-pair.normal_stiffness_Pa_per_m*g.gradient[:15]
|
|
310
|
+
dt=(-pair.friction_coefficient*pressure/norm*(np.eye(3)-np.outer(direction,direction))@D
|
|
311
|
+
-pair.friction_coefficient*np.outer(direction,dp))
|
|
312
|
+
residual-=W.T@traction
|
|
313
|
+
tangent-=np.einsum('i,ijk->jk',traction,H)+W.T@dt
|
|
314
|
+
count=42+target.adapter.work_map.shape[1]; mapping=np.zeros((15,count))
|
|
315
|
+
for node,weight in ((source.cell,1-source.t),(source.cell+1,source.t)):
|
|
316
|
+
mapping[:3,6*node:6*node+3]=weight*np.eye(3)
|
|
317
|
+
mapping[3:6,18+3*source.cell:21+3*source.cell]=np.eye(3)
|
|
318
|
+
mapping[6:,42:]=target.adapter.work_map.toarray()
|
|
319
|
+
residual=pair.reference_weight_m2*(mapping.T@residual)
|
|
320
|
+
tangent=pair.reference_weight_m2*(mapping.T@tangent@mapping)
|
|
321
|
+
if not np.all(np.isfinite(residual)) or not np.all(np.isfinite(tangent)):
|
|
322
|
+
raise ValueError('nonfinite first-touch material contribution')
|
|
323
|
+
return NativeS3ActivationResult(_readonly(residual),_readonly(tangent),trial,g.value,pressure,
|
|
324
|
+
pair.reference_weight_m2*energy.value,float(alpha),_readonly(alpha_gradient),ownership.path_sha256,
|
|
325
|
+
ownership.intervals,_readonly(pair.reference_weight_m2*(mapping.T@energy.gradient[15:])),
|
|
326
|
+
_readonly(pair.reference_weight_m2*(mapping.T@energy.hessian[15:,:15]@mapping)))
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
@dataclass(frozen=True)
|
|
330
|
+
class NativeS3ReleaseResult:
|
|
331
|
+
residual: np.ndarray
|
|
332
|
+
tangent: np.ndarray
|
|
333
|
+
trial: object
|
|
334
|
+
normal_gap_m: float
|
|
335
|
+
normal_pressure_Pa: float
|
|
336
|
+
normal_storage_j: float
|
|
337
|
+
event_fraction: float
|
|
338
|
+
path_sha256: str
|
|
339
|
+
ownership_intervals: int
|
|
340
|
+
history_evaluations: int
|
|
341
|
+
profile: str='NATIVE_S3_TRANSVERSE_RELEASE_POINT_DEV_V1'
|
|
342
|
+
|
|
343
|
+
def spatial_tangent(self):
|
|
344
|
+
return self.tangent
|
|
345
|
+
|
|
346
|
+
@property
|
|
347
|
+
def normal_residual(self):
|
|
348
|
+
return self.residual
|
|
349
|
+
|
|
350
|
+
def normal_spatial_tangent(self):
|
|
351
|
+
return self.tangent
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def _release_history(pair,start,end,history,translations,angular,shell_increment,alpha,gap,ownership):
|
|
355
|
+
"""Disposable path return maps before opening; endpoint force/tangent zero.
|
|
356
|
+
|
|
357
|
+
Fixed substeps are a bound definition, not an accuracy certificate. Preserve
|
|
358
|
+
dissipation and separately report the final vanishing storage release.
|
|
359
|
+
"""
|
|
360
|
+
previous=start; state=history; released=0.; plastic_material=np.zeros(3); dissipations=[]
|
|
361
|
+
old_source=pair.source.evaluate(previous.positions,previous.position_low,previous.cell_rotations)
|
|
362
|
+
old_target=pair.target.physical_pose(previous.shell_displacement)
|
|
363
|
+
for fraction in np.linspace(0.,alpha,pair.event_history_substeps+1)[1:]:
|
|
364
|
+
current=material_path_pose(start,translations,angular,shell_increment,float(fraction))
|
|
365
|
+
source=pair.source.evaluate(current.positions,current.position_low,current.cell_rotations)
|
|
366
|
+
target=pair.target.physical_pose(current.shell_displacement)
|
|
367
|
+
increment=objective_relative_tangent_increment(source_committed=old_source.surface_position,
|
|
368
|
+
target_committed=old_target.position,source_candidate=source.surface_position,
|
|
369
|
+
target_candidate=target.position,target_frame_committed=old_target.material_frame,
|
|
370
|
+
target_frame_candidate=target.material_frame)
|
|
371
|
+
normal=np.asarray(target.material_frame)[:,2]
|
|
372
|
+
pressure=max(0.,-pair.normal_stiffness_Pa_per_m*float((source.surface_position-np.asarray(target.position))@normal))
|
|
373
|
+
# Root residual is already bounded. The event is the zero-pressure stage.
|
|
374
|
+
if fraction==alpha:pressure=0.
|
|
375
|
+
trial=trial_coulomb_point(state,material_frame=target.material_frame,relative_increment=increment,
|
|
376
|
+
normal_pressure=pressure,friction_coefficient=pair.friction_coefficient,
|
|
377
|
+
tangential_stiffness=pair.tangential_stiffness_Pa_per_m,partner_key=pair.partner_key)
|
|
378
|
+
plastic_material+=np.asarray(target.material_frame).T@np.asarray(trial.plastic_slip_increment)
|
|
379
|
+
dissipations.append(trial.dissipated_increment_density)
|
|
380
|
+
state=trial.candidate_state; released+=trial.released_storage_density; previous=current
|
|
381
|
+
old_source=source; old_target=target
|
|
382
|
+
target=pair.target.physical_pose(end.shell_displacement)
|
|
383
|
+
trial=trial_coulomb_point(state,material_frame=target.material_frame,relative_increment=(0.,0.,0.),
|
|
384
|
+
normal_pressure=0.,friction_coefficient=pair.friction_coefficient,
|
|
385
|
+
tangential_stiffness=pair.tangential_stiffness_Pa_per_m,partner_key=None)
|
|
386
|
+
trial=replace(trial,dissipated_increment_density=fsum(dissipations),
|
|
387
|
+
released_storage_density=released,
|
|
388
|
+
plastic_slip_increment=tuple(np.asarray(target.material_frame)@plastic_material))
|
|
389
|
+
count=42+pair.target.adapter.work_map.shape[1]
|
|
390
|
+
return NativeS3ReleaseResult(_readonly(np.zeros(count)),_readonly(np.zeros((count,count))),trial,
|
|
391
|
+
gap,0.,0.,alpha,ownership.path_sha256,ownership.intervals,pair.event_history_substeps+1)
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""Conservative current boxes for native round material patches.
|
|
2
|
+
|
|
3
|
+
The bound contains the whole declared arc and both half-cell traces, independently
|
|
4
|
+
of quadrature. A circumscribed full round section is used for search only: this
|
|
5
|
+
does not replace the material surface, certify orientation, prove gap or sweep.
|
|
6
|
+
"""
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from fractions import Fraction
|
|
9
|
+
from math import cos, pi, sqrt
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
|
|
13
|
+
from anyfesolver._ge_beam3_deterministic_reduction import deterministic_norm
|
|
14
|
+
from anyfesolver._ge_beam3_p5.arrays import _array, _frames
|
|
15
|
+
from .native_retained_station import _readonly
|
|
16
|
+
from .native_surface_quadrature import NativeRoundSurfaceRule
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _restrict_q2(lanes, left, right):
|
|
20
|
+
"""Quadratic blossom at exact rational material parameters."""
|
|
21
|
+
l,r=left,right
|
|
22
|
+
return tuple(((1-l)**2*a+2*l*(1-l)*b+l*l*c,
|
|
23
|
+
(1-l)*(1-r)*a+(l*(1-r)+r*(1-l))*b+l*r*c,
|
|
24
|
+
(1-r)**2*a+2*r*(1-r)*b+r*r*c) for a,b,c in lanes)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _rotation_gain(frame):
|
|
28
|
+
"""Upper spectral norm from the Gram residual, including its arithmetic."""
|
|
29
|
+
eps = np.finfo(float).eps
|
|
30
|
+
residual = float(deterministic_norm(frame.T@frame-np.eye(3)))
|
|
31
|
+
residual += 128*eps*(1+deterministic_norm(frame)**2)
|
|
32
|
+
gain = sqrt(1+residual)*(1+128*eps)
|
|
33
|
+
if not np.isfinite(gain):
|
|
34
|
+
raise ValueError('native material frame bound overflow')
|
|
35
|
+
return gain
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _reference_radial_gain(reference):
|
|
39
|
+
"""Include admitted nodal nonorthogonality in shortest transport.
|
|
40
|
+
|
|
41
|
+
For Q=I+K+K²/(1+c), on the cross plane ||Q||²=1+
|
|
42
|
+
s²*(||a||²||b||²-1)/(1+c)² for unclipped c. The conservative
|
|
43
|
+
factor4 also covers clipping at c=1. The source rejects denominators
|
|
44
|
+
below 1+cos(0.9*pi). Roll uses the normalized reference tangent.
|
|
45
|
+
"""
|
|
46
|
+
eps=np.finfo(float).eps
|
|
47
|
+
margin=1+cos(.9*pi)
|
|
48
|
+
gains=[]
|
|
49
|
+
for frame in reference.nodal_triads:
|
|
50
|
+
e=float(np.linalg.norm(frame.T@frame-np.eye(3)))
|
|
51
|
+
e+=128*eps*(1+float(np.linalg.norm(frame))**2)
|
|
52
|
+
transport=sqrt(1+4*(1+e+128*eps)*(e+128*eps)/margin**2)
|
|
53
|
+
gains.append(_rotation_gain(frame)*transport*(1+1024*eps/margin**2))
|
|
54
|
+
gain=max(gains)
|
|
55
|
+
if not np.isfinite(gain):
|
|
56
|
+
raise ValueError('native material reference frame bound overflow')
|
|
57
|
+
return gain
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass(frozen=True)
|
|
61
|
+
class NativeRoundPatchBounds:
|
|
62
|
+
lower: np.ndarray
|
|
63
|
+
upper: np.ndarray
|
|
64
|
+
cells: tuple[int, ...]
|
|
65
|
+
roundoff_padding_m: float
|
|
66
|
+
profile: str = 'NATIVE_Q2_RETAINED_CURRENT_BERNSTEIN_ROUND_ENVELOPE_DEV_V1'
|
|
67
|
+
|
|
68
|
+
def as_search_box(self):
|
|
69
|
+
return _readonly(np.r_[self.lower, self.upper])
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def native_round_patch_bounds(rule, positions, position_low, cell_rotations):
|
|
73
|
+
"""Reference-owned Q2 lift + current chord + circumscribed section.
|
|
74
|
+
|
|
75
|
+
For each cell, x_c(t)=(1-t)p_L+t p_R+Uc*b*t*(t-1)/2.
|
|
76
|
+
Its Bernstein control is (p_L,(p_L+p_R)/2-Uc*b/4,p_R).
|
|
77
|
+
Restriction is exact rational arithmetic on the supplied binary coordinates;
|
|
78
|
+
b=X0-2X1+X2 comes from that same centered reference. Bounds use the hull,
|
|
79
|
+
not quadrature or endpoints alone. The material radial part has norm at most
|
|
80
|
+
r*||Uc|| times the reference-frame gain, including admitted nodal Gram
|
|
81
|
+
residuals amplified by shortest transport; roll arithmetic is also bounded.
|
|
82
|
+
|
|
83
|
+
Padding covers bounded floating evaluation of the admitted frame transport
|
|
84
|
+
(half-cell turn<0.9*pi), lift and position. Overflow rejects. Not an exact
|
|
85
|
+
collision certificate or dynamic path enclosure.
|
|
86
|
+
"""
|
|
87
|
+
if type(rule) is not NativeRoundSurfaceRule:
|
|
88
|
+
raise TypeError('exact native round surface rule required')
|
|
89
|
+
high = _array(positions, (3, 3), 'native bounds nodal positions')
|
|
90
|
+
low = _array(position_low, (3, 3), 'native bounds nodal low parts')
|
|
91
|
+
rotations = _frames(cell_rotations, 2, 'native bounds cell rotations')
|
|
92
|
+
# Bind the same definitions, normalized coordinate pairs and owned geometry.
|
|
93
|
+
# Search bounds never infer validity from finite sample containment.
|
|
94
|
+
rule.evaluate(high, low, rotations)
|
|
95
|
+
reference = rule.samples[0].station.reference
|
|
96
|
+
X = [[Fraction(float(v)) for v in row] for row in reference.coordinates]
|
|
97
|
+
b = [X[0][j]-2*X[1][j]+X[2][j] for j in range(3)]
|
|
98
|
+
p = [[Fraction(float(h))+Fraction(float(l)) for h,l in zip(hr,lr)]
|
|
99
|
+
for hr,lr in zip(high,low)]
|
|
100
|
+
radius = float(rule.definition['radius'])
|
|
101
|
+
xi_lo, xi_hi = rule.definition['xi_range']
|
|
102
|
+
controls = []
|
|
103
|
+
cells = []
|
|
104
|
+
# Frobenius residual bounds the spectral norm without an SVD rounding claim.
|
|
105
|
+
eps = np.finfo(float).eps
|
|
106
|
+
radial_gain = _reference_radial_gain(reference)
|
|
107
|
+
scale = max(1., radius, float(np.max(np.abs(high))),
|
|
108
|
+
float(np.max(np.abs(low))), float(np.max(np.abs(reference.coordinates))))
|
|
109
|
+
padding = 4096*eps*scale
|
|
110
|
+
for cell, left, right in ((0,max(xi_lo,-1.),min(xi_hi,0.)),
|
|
111
|
+
(1,max(xi_lo,0.),min(xi_hi,1.))):
|
|
112
|
+
if right <= left:
|
|
113
|
+
continue
|
|
114
|
+
cells.append(cell)
|
|
115
|
+
U = [[Fraction(float(v)) for v in row] for row in rotations[cell]]
|
|
116
|
+
turn = [sum(U[i][j]*b[j] for j in range(3)) for i in range(3)]
|
|
117
|
+
lanes = [(p[cell][i],(p[cell][i]+p[cell+1][i])/2-turn[i]/4,
|
|
118
|
+
p[cell+1][i]) for i in range(3)]
|
|
119
|
+
l=Fraction(float(left))+(1 if cell==0 else 0)
|
|
120
|
+
r=Fraction(float(right))+(1 if cell==0 else 0)
|
|
121
|
+
restricted = _restrict_q2(lanes, l, r)
|
|
122
|
+
gain = _rotation_gain(rotations[cell])
|
|
123
|
+
extent = Fraction(radius*radial_gain*gain)+Fraction(padding)
|
|
124
|
+
controls.append(([min(row)-extent for row in restricted],
|
|
125
|
+
[max(row)+extent for row in restricted]))
|
|
126
|
+
try:
|
|
127
|
+
lower = np.array([np.nextafter(float(min(c[0][i] for c in controls)), -np.inf)
|
|
128
|
+
for i in range(3)])
|
|
129
|
+
upper = np.array([np.nextafter(float(max(c[1][i] for c in controls)), np.inf)
|
|
130
|
+
for i in range(3)])
|
|
131
|
+
except (OverflowError, ValueError) as exc:
|
|
132
|
+
raise ValueError('native material search bound overflow') from exc
|
|
133
|
+
if not np.all(np.isfinite(np.r_[lower,upper])):
|
|
134
|
+
raise ValueError('native material search bound overflow')
|
|
135
|
+
return NativeRoundPatchBounds(_readonly(lower),_readonly(upper),tuple(cells),padding)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def native_round_patch_swept_bounds(rule, positions, position_low, cell_rotations,
|
|
139
|
+
translations, angular):
|
|
140
|
+
"""Whole patch on the existing affine/Exp path, for search only.
|
|
141
|
+
|
|
142
|
+
Translation is affine in alpha; half-cell lift and radial section rotate.
|
|
143
|
+
A circumsphere of their summed reference radii encloses every spatial
|
|
144
|
+
exponential rotation, not just endpoints. Angular increments obey the
|
|
145
|
+
same <0.9*pi limit as material_path_pose. No collision-time, orientation,
|
|
146
|
+
normal-side or physical-gap certificate is supplied.
|
|
147
|
+
"""
|
|
148
|
+
current = native_round_patch_bounds(rule,positions,position_low,cell_rotations)
|
|
149
|
+
move = _array(translations,(3,3),'native bounds translations')
|
|
150
|
+
spin = _array(angular,(2,3),'native bounds angular increments')
|
|
151
|
+
if np.max(np.linalg.norm(spin,axis=1)) >= .9*pi:
|
|
152
|
+
raise ValueError('native material path requires subdivision: angular increment')
|
|
153
|
+
high = np.asarray(positions); low = np.asarray(position_low)
|
|
154
|
+
reference = rule.samples[0].station.reference
|
|
155
|
+
X = [[Fraction(float(v)) for v in row] for row in reference.coordinates]
|
|
156
|
+
b = [X[0][j]-2*X[1][j]+X[2][j] for j in range(3)]
|
|
157
|
+
p = [[Fraction(float(h))+Fraction(float(l)) for h,l in zip(hr,lr)]
|
|
158
|
+
for hr,lr in zip(high,low)]
|
|
159
|
+
delta = [[Fraction(float(v)) for v in row] for row in move]
|
|
160
|
+
from .capped_cylinder import _sqrt_bound
|
|
161
|
+
bnorm = _sqrt_bound(sum(v*v for v in b),upper=True)
|
|
162
|
+
eps = np.finfo(float).eps
|
|
163
|
+
radial = Fraction(float(rule.definition['radius'])*_reference_radial_gain(reference))
|
|
164
|
+
# Same current rotation residual; Exp path evaluation adds floating padding.
|
|
165
|
+
gain = max(_rotation_gain(f) for f in np.asarray(cell_rotations))*(1+128*eps)
|
|
166
|
+
end_scale = max(1.,float(np.max(np.abs(move))),float(np.max(np.abs(high))),
|
|
167
|
+
float(np.max(np.abs(low))),float(np.max(np.abs(reference.coordinates))))
|
|
168
|
+
padding = max(current.roundoff_padding_m,8192*eps*end_scale)
|
|
169
|
+
xi_lo,xi_hi=rule.definition['xi_range']
|
|
170
|
+
hulls=[]
|
|
171
|
+
for cell,left,right in ((0,max(xi_lo,-1.),min(xi_hi,0.)),
|
|
172
|
+
(1,max(xi_lo,0.),min(xi_hi,1.))):
|
|
173
|
+
if right<=left:continue
|
|
174
|
+
l = Fraction(float(left))+(1 if cell==0 else 0)
|
|
175
|
+
r = Fraction(float(right))+(1 if cell==0 else 0)
|
|
176
|
+
extrema = [l*(1-l),r*(1-r)]
|
|
177
|
+
if l<=Fraction(1,2)<=r:extrema.append(Fraction(1,4))
|
|
178
|
+
lift = max(extrema)*bnorm/2
|
|
179
|
+
extent = Fraction(gain)*(lift+radial)+Fraction(padding)
|
|
180
|
+
limits=[[],[]]
|
|
181
|
+
for i in range(3):
|
|
182
|
+
vals = [(1-t)*(p[cell][i]+a*delta[cell][i])+
|
|
183
|
+
t*(p[cell+1][i]+a*delta[cell+1][i])
|
|
184
|
+
for a in (0,1) for t in (l,r)]
|
|
185
|
+
limits[0].append(min(vals)-extent)
|
|
186
|
+
limits[1].append(max(vals)+extent)
|
|
187
|
+
hulls.append(limits)
|
|
188
|
+
try:
|
|
189
|
+
lower=np.array([np.nextafter(float(min(h[0][i] for h in hulls)),-np.inf)
|
|
190
|
+
for i in range(3)])
|
|
191
|
+
upper=np.array([np.nextafter(float(max(h[1][i] for h in hulls)),np.inf)
|
|
192
|
+
for i in range(3)])
|
|
193
|
+
except (OverflowError,ValueError) as exc:
|
|
194
|
+
raise ValueError('native material swept bound overflow') from exc
|
|
195
|
+
if not np.all(np.isfinite(np.r_[lower,upper])):
|
|
196
|
+
raise ValueError('native material swept bound overflow')
|
|
197
|
+
return NativeRoundPatchBounds(_readonly(lower),_readonly(upper),current.cells,padding,
|
|
198
|
+
'NATIVE_Q2_RETAINED_AFFINE_EXP_SPHERE_SWEEP_DEV_V1')
|