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,212 @@
|
|
|
1
|
+
"""Reference-area quadrature for the actual retained round material surface.
|
|
2
|
+
|
|
3
|
+
Development geometry only. Cell interfaces are integration breaks; this rule
|
|
4
|
+
does not create end caps, resolve target overlap, or certify between-point gap.
|
|
5
|
+
"""
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from math import cos, sin, tau
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
from numpy.polynomial.legendre import leggauss
|
|
11
|
+
|
|
12
|
+
from anyfesolver._ge_beam3_deterministic_reduction import deterministic_dot, deterministic_norm
|
|
13
|
+
from anyfesolver._ge_beam3_p5_seeded.core import sha
|
|
14
|
+
from .native_retained_station import NativeRetainedRoundStation, _readonly
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class NativeRoundSurfaceSample:
|
|
19
|
+
station: NativeRetainedRoundStation
|
|
20
|
+
reference_weight_m2: float
|
|
21
|
+
parametric_weight: float
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(frozen=True)
|
|
25
|
+
class NativeRoundSurfaceGeometry:
|
|
26
|
+
station_state: object
|
|
27
|
+
xi_tangent: np.ndarray
|
|
28
|
+
angle_tangent: np.ndarray
|
|
29
|
+
outward_normal: np.ndarray
|
|
30
|
+
area_jacobian: float
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _oriented_measure(xi, angle, radial):
|
|
34
|
+
cross=np.cross(angle,xi)
|
|
35
|
+
jacobian=float(deterministic_norm(cross))
|
|
36
|
+
if not np.isfinite(jacobian) or jacobian<=0 or deterministic_dot(cross,radial)<=0:
|
|
37
|
+
raise ValueError('native round surface singular or reversed at sample')
|
|
38
|
+
return cross,jacobian
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass(frozen=True)
|
|
42
|
+
class _ReferenceRoundArea:
|
|
43
|
+
"""Candidate-local preparation for an already validated reference station.
|
|
44
|
+
|
|
45
|
+
Uses the same lift, parameter derivatives and outward check as
|
|
46
|
+
surface_geometry. No current geometry or contact law is cached here.
|
|
47
|
+
"""
|
|
48
|
+
frame: np.ndarray
|
|
49
|
+
derivative: np.ndarray
|
|
50
|
+
chord: np.ndarray
|
|
51
|
+
lift_derivative: np.ndarray
|
|
52
|
+
radius: float
|
|
53
|
+
|
|
54
|
+
def area_jacobian(self, angle):
|
|
55
|
+
radial=self.radius*np.array((0.,cos(angle),sin(angle)))
|
|
56
|
+
angular=self.radius*np.array((0.,-sin(angle),cos(angle)))
|
|
57
|
+
# Retain the reference lift/chord arithmetic of surface_geometry.
|
|
58
|
+
xi=self.chord+(self.lift_derivative+self.derivative@radial)
|
|
59
|
+
_,jacobian=_oriented_measure(xi,self.frame@angular,self.frame@radial)
|
|
60
|
+
return jacobian
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _prepare_reference_area(reference, xi, radius):
|
|
64
|
+
"""Prepare only after the caller validates its immutable rule identity."""
|
|
65
|
+
cell=0 if xi<0 else 1
|
|
66
|
+
chord=reference.coordinates[cell+1]-reference.coordinates[cell]
|
|
67
|
+
return _ReferenceRoundArea(_readonly(reference.frame(xi)),
|
|
68
|
+
_readonly(reference.frame_derivative(xi)),_readonly(chord),
|
|
69
|
+
_readonly(reference.derivative(xi)-chord),float(radius))
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def surface_geometry(station, positions, position_low, cell_rotations):
|
|
73
|
+
"""Exact within-cell parameter derivatives, including reference frame turn."""
|
|
74
|
+
if type(station) is not NativeRetainedRoundStation:
|
|
75
|
+
raise TypeError('exact retained round station required')
|
|
76
|
+
bound=NativeRetainedRoundStation(station.element_id,station.reference,
|
|
77
|
+
station.xi,station.radius,station.angle)
|
|
78
|
+
if bound.identity!=station.identity or (bound.cell,bound.t)!=(station.cell,station.t):
|
|
79
|
+
raise ValueError('native surface station definition changed')
|
|
80
|
+
state=station.evaluate(positions,position_low,cell_rotations)
|
|
81
|
+
reference=station.reference; cell=station.cell
|
|
82
|
+
frame=reference.frame(station.xi)
|
|
83
|
+
derivative=reference.frame_derivative(station.xi)
|
|
84
|
+
radial=station.radius*np.array((0.,cos(station.angle),sin(station.angle)))
|
|
85
|
+
angular=station.radius*np.array((0.,-sin(station.angle),cos(station.angle)))
|
|
86
|
+
# r0 minus its half-cell chord is the reference lift. Differentiate that
|
|
87
|
+
# same lift; changing this to a centreline tangent loses curved arm work.
|
|
88
|
+
chord=reference.coordinates[cell+1]-reference.coordinates[cell]
|
|
89
|
+
lift_derivative=reference.derivative(station.xi)-chord
|
|
90
|
+
rotation=np.asarray(cell_rotations)[cell]
|
|
91
|
+
current_chord=(np.asarray(positions)[cell+1]-np.asarray(positions)[cell]
|
|
92
|
+
+np.asarray(position_low)[cell+1]-np.asarray(position_low)[cell])
|
|
93
|
+
xi=current_chord+rotation@(lift_derivative+derivative@radial)
|
|
94
|
+
angle=rotation@frame@angular
|
|
95
|
+
# Preserve the declared outward side. Taking only an absolute area would
|
|
96
|
+
# conceal inversion on a thick curved surface or a deformed cell.
|
|
97
|
+
cross,jacobian=_oriented_measure(xi,angle,rotation@frame@radial)
|
|
98
|
+
return NativeRoundSurfaceGeometry(state,_readonly(xi),_readonly(angle),
|
|
99
|
+
_readonly(cross/jacobian),jacobian)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class NativeRoundSurfaceRule:
|
|
103
|
+
"""Fixed material quadrature, split at native half-cell interfaces.
|
|
104
|
+
|
|
105
|
+
Reference weights never follow current area. Refinement creates a new rule
|
|
106
|
+
identity and cannot silently change the physical history discretization.
|
|
107
|
+
"""
|
|
108
|
+
def __init__(self, element_id, reference, radius, *, xi_range=(-1.,1.),
|
|
109
|
+
angle_range=(0.,tau), axial_order=4, angular_order=8,
|
|
110
|
+
maximum_points=256):
|
|
111
|
+
for name,value in (('axial_order',axial_order),('angular_order',angular_order),
|
|
112
|
+
('maximum_points',maximum_points)):
|
|
113
|
+
if type(value) is not int or value<1:
|
|
114
|
+
raise ValueError(name+' must be a positive integer')
|
|
115
|
+
limits=[]
|
|
116
|
+
for bounds,lower,upper in ((xi_range,-1.,1.),(angle_range,0.,tau)):
|
|
117
|
+
values=np.asarray(bounds,dtype=float)
|
|
118
|
+
if values.shape!=(2,) or not np.all(np.isfinite(values)) or not lower<=values[0]<values[1]<=upper:
|
|
119
|
+
raise ValueError('invalid material surface parameter interval')
|
|
120
|
+
limits.append(tuple(map(float,values)))
|
|
121
|
+
lo,hi=limits[0]; alo,ahi=limits[1]
|
|
122
|
+
breaks=[lo]+([0.] if lo<0.<hi else [])+[hi]
|
|
123
|
+
count=(len(breaks)-1)*axial_order*angular_order
|
|
124
|
+
if count>maximum_points:
|
|
125
|
+
raise MemoryError('native surface quadrature point cap exceeded')
|
|
126
|
+
# Validate the exact structural geometry before any quadrature allocation.
|
|
127
|
+
NativeRetainedRoundStation(element_id,reference,float((breaks[0]+breaks[1])/2),radius,float((alo+ahi)/2))
|
|
128
|
+
x,w=leggauss(axial_order); a,v=leggauss(angular_order)
|
|
129
|
+
samples=[]; rotations=np.tile(np.eye(3),(2,1,1))
|
|
130
|
+
for left,right in zip(breaks[:-1],breaks[1:]):
|
|
131
|
+
for q,weight_x in zip(x,w):
|
|
132
|
+
xi=float((left+right)/2+(right-left)*q/2)
|
|
133
|
+
for angle,weight_a in zip(a,v):
|
|
134
|
+
alpha=float((alo+ahi)/2+(ahi-alo)*angle/2)
|
|
135
|
+
station=NativeRetainedRoundStation(element_id,reference,xi,radius,alpha)
|
|
136
|
+
geometry=surface_geometry(station,reference.coordinates,
|
|
137
|
+
np.zeros((3,3)),rotations)
|
|
138
|
+
weight=float(weight_x*weight_a*(right-left)*(ahi-alo)/4)
|
|
139
|
+
samples.append(NativeRoundSurfaceSample(station,weight*geometry.area_jacobian,weight))
|
|
140
|
+
self.samples=tuple(samples)
|
|
141
|
+
self.definition=dict(profile='NATIVE_ROUND_REFERENCE_SURFACE_RULE_DEV_V1',
|
|
142
|
+
element=element_id,reference=reference.canonical_data(),radius=float(radius),
|
|
143
|
+
xi_range=limits[0],angle_range=limits[1],axial_order=axial_order,
|
|
144
|
+
angular_order=angular_order,maximum_points=maximum_points,
|
|
145
|
+
samples=[(s.station.identity,s.reference_weight_m2,s.parametric_weight) for s in samples])
|
|
146
|
+
self.identity=sha(self.definition)
|
|
147
|
+
|
|
148
|
+
def evaluate(self,positions,position_low,cell_rotations):
|
|
149
|
+
if sha(self.definition)!=self.identity:
|
|
150
|
+
raise ValueError('native surface quadrature definition changed')
|
|
151
|
+
if tuple((s.station.identity,s.reference_weight_m2,s.parametric_weight) for s in self.samples)!=tuple(self.definition['samples']):
|
|
152
|
+
raise ValueError('native surface quadrature samples changed')
|
|
153
|
+
return tuple(surface_geometry(s.station,positions,position_low,cell_rotations) for s in self.samples)
|
|
154
|
+
|
|
155
|
+
def current_bounds(self, positions, position_low, cell_rotations):
|
|
156
|
+
"""Whole-patch current search box; not a gap or swept certificate."""
|
|
157
|
+
from .native_surface_bounds import native_round_patch_bounds
|
|
158
|
+
return native_round_patch_bounds(self, positions, position_low, cell_rotations)
|
|
159
|
+
|
|
160
|
+
def swept_bounds(self, positions, position_low, cell_rotations, translations, angular):
|
|
161
|
+
"""Whole affine/Exp material path search box; no event/gap certificate."""
|
|
162
|
+
from .native_surface_bounds import native_round_patch_swept_bounds
|
|
163
|
+
return native_round_patch_swept_bounds(self, positions, position_low,
|
|
164
|
+
cell_rotations, translations, angular)
|
|
165
|
+
|
|
166
|
+
def certify_orientation_path(self,start,translations,angular,shell_increment,*,maximum_intervals=256):
|
|
167
|
+
"""Positive signed surface area throughout the actual exponential path.
|
|
168
|
+
|
|
169
|
+
At a fixed material sample, signed area divided by radius squared is
|
|
170
|
+
c(alpha).dot(R(alpha)e1) + (lift' + R0' rho).dot(e1).
|
|
171
|
+
The second term is constant. A chord/rotation Lipschitz bound encloses
|
|
172
|
+
the first term on every interval; sampled positivity alone is not used.
|
|
173
|
+
"""
|
|
174
|
+
return sum(certify_station_orientation_path(sample.station,start,translations,angular,
|
|
175
|
+
shell_increment,maximum_intervals=maximum_intervals) for sample in self.samples)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def certify_station_orientation_path(station,start,translations,angular,shell_increment,*,maximum_intervals=256):
|
|
179
|
+
"""Same conservative orientation bound for existing or newly queried points."""
|
|
180
|
+
from .native_surface_path import material_path_pose
|
|
181
|
+
if type(station) is not NativeRetainedRoundStation:
|
|
182
|
+
raise TypeError('exact native material station required')
|
|
183
|
+
if type(maximum_intervals) is not int or maximum_intervals<1:
|
|
184
|
+
raise ValueError('positive surface orientation interval cap required')
|
|
185
|
+
end=material_path_pose(start,translations,angular,shell_increment,1.)
|
|
186
|
+
visited=0
|
|
187
|
+
cell=station.cell; reference=station.reference
|
|
188
|
+
frame=reference.frame(station.xi); director=frame[:,0]
|
|
189
|
+
radial=station.radius*np.array((0.,cos(station.angle),sin(station.angle)))
|
|
190
|
+
lift=reference.derivative(station.xi)-(reference.coordinates[cell+1]-reference.coordinates[cell])
|
|
191
|
+
constant=float((lift+reference.frame_derivative(station.xi)@radial)@director)
|
|
192
|
+
def chord(pose):
|
|
193
|
+
return pose.positions[cell+1]-pose.positions[cell]+pose.position_low[cell+1]-pose.position_low[cell]
|
|
194
|
+
c0,c1=chord(start),chord(end)
|
|
195
|
+
rate=np.linalg.norm(c1-c0)+max(np.linalg.norm(c0),np.linalg.norm(c1))*np.linalg.norm(np.asarray(angular)[cell])
|
|
196
|
+
padding=512*np.finfo(float).eps*max(1.,np.linalg.norm(c0),np.linalg.norm(c1),abs(constant))
|
|
197
|
+
pending=[(0.,1.)]; point_visits=0
|
|
198
|
+
while pending:
|
|
199
|
+
if point_visits>=maximum_intervals:
|
|
200
|
+
raise ValueError('native/S3 material history path requires subdivision: source orientation budget')
|
|
201
|
+
left,right=pending.pop(); middle=(left+right)/2
|
|
202
|
+
pose=material_path_pose(start,translations,angular,shell_increment,middle)
|
|
203
|
+
value=float(chord(pose)@(pose.cell_rotations[cell]@director))+constant
|
|
204
|
+
visited+=1; point_visits+=1
|
|
205
|
+
if value<=padding:
|
|
206
|
+
raise ValueError('native/S3 material history path requires subdivision: source surface orientation')
|
|
207
|
+
if value-rate*(right-left)/2>padding:
|
|
208
|
+
continue
|
|
209
|
+
if middle==left or middle==right:
|
|
210
|
+
raise ValueError('native/S3 material history path requires subdivision: source parameter resolution')
|
|
211
|
+
pending.extend(((left,middle),(middle,right)))
|
|
212
|
+
return visited
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"""Local retained round-surface/S3 material-pair work; no analysis admission.
|
|
2
|
+
|
|
3
|
+
Actual surface-point gap, explicit reference-area weight and persistent material
|
|
4
|
+
labels. No centreline normal surrogate, partner transfer or surface quadrature is
|
|
5
|
+
invented here. Native second derivatives use its spatial multiplicative chart.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from functools import lru_cache
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from .native_surface_activation import NativeS3ActivationResult
|
|
15
|
+
|
|
16
|
+
import numpy as np
|
|
17
|
+
|
|
18
|
+
from anyfesolver._ge_beam3_mixed_ad import Jet2, so3_exp, matvec, dot, sqrt
|
|
19
|
+
from anyfesolver._ge_beam3_p5.arrays import _array, _frames
|
|
20
|
+
from anyfesolver._ge_beam3_generalized_static_boundary import spatial_jacobian
|
|
21
|
+
from anyfesolver._ge_beam3_p5_seeded.core import sha
|
|
22
|
+
from .native_retained_station import NativeRetainedRoundStation, _readonly
|
|
23
|
+
from .s3_friction_point import S3SkinMaterialPoint
|
|
24
|
+
from .friction_point import (
|
|
25
|
+
FrictionPointState, FrictionPointTrial, objective_relative_tangent_increment,
|
|
26
|
+
trial_coulomb_point,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
PROFILE='NATIVE_RETAINED_ROUND_S3_MATERIAL_POINT_FRICTION_DEV_V1'
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass(frozen=True)
|
|
33
|
+
class NativeS3MaterialConfiguration:
|
|
34
|
+
positions: np.ndarray
|
|
35
|
+
position_low: np.ndarray
|
|
36
|
+
cell_rotations: np.ndarray
|
|
37
|
+
shell_displacement: np.ndarray
|
|
38
|
+
|
|
39
|
+
def __post_init__(self):
|
|
40
|
+
for name in ('positions','position_low'):
|
|
41
|
+
object.__setattr__(self,name,_readonly(_array(getattr(self,name),(3,3),name)))
|
|
42
|
+
object.__setattr__(self,'cell_rotations',_readonly(_frames(self.cell_rotations,2,'cell rotations')))
|
|
43
|
+
u=np.asarray(self.shell_displacement,dtype=float)
|
|
44
|
+
if u.ndim!=1 or not np.all(np.isfinite(u)):raise ValueError('finite shell displacement vector required')
|
|
45
|
+
object.__setattr__(self,'shell_displacement',_readonly(u))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass(frozen=True)
|
|
49
|
+
class NativeS3MaterialPointResult:
|
|
50
|
+
residual: np.ndarray
|
|
51
|
+
chart_tangent: np.ndarray
|
|
52
|
+
trial: FrictionPointTrial
|
|
53
|
+
normal_gap_m: float
|
|
54
|
+
normal_pressure_Pa: float
|
|
55
|
+
normal_storage_j: float
|
|
56
|
+
normal_residual: np.ndarray
|
|
57
|
+
normal_chart_tangent: np.ndarray
|
|
58
|
+
profile: str=PROFILE
|
|
59
|
+
|
|
60
|
+
def spatial_tangent(self):
|
|
61
|
+
result=self.chart_tangent.copy()
|
|
62
|
+
result[:42,:42]=spatial_jacobian(self.residual[:42],result[:42,:42])
|
|
63
|
+
return _readonly(result)
|
|
64
|
+
|
|
65
|
+
def normal_spatial_tangent(self):
|
|
66
|
+
result=self.normal_chart_tangent.copy()
|
|
67
|
+
result[:42,:42]=spatial_jacobian(self.normal_residual[:42],result[:42,:42])
|
|
68
|
+
return _readonly(result)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass(frozen=True)
|
|
72
|
+
class NativeS3MaterialPathResult:
|
|
73
|
+
"""Disposable certified contribution; structural equilibrium still required."""
|
|
74
|
+
configuration: NativeS3MaterialConfiguration
|
|
75
|
+
contribution: NativeS3MaterialPointResult | NativeS3ActivationResult
|
|
76
|
+
path_sha256: str
|
|
77
|
+
certified_intervals: int
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _cross(a,b):
|
|
81
|
+
return [a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _unit(v):
|
|
85
|
+
length=sqrt(dot(v,v))
|
|
86
|
+
return [a/length for a in v]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _rotated_arm_jet(variations):
|
|
90
|
+
"""Exact spatial Exp(delta) arm jet at delta=0, in the local 15 chart."""
|
|
91
|
+
arm = variations.surface_arm
|
|
92
|
+
generators = np.array(((0., 0., 0.), (0., 0., -1.), (0., 1., 0.),
|
|
93
|
+
(0., 0., 1.), (0., 0., 0.), (-1., 0., 0.),
|
|
94
|
+
(0., -1., 0.), (1., 0., 0.), (0., 0., 0.))).reshape(3, 3, 3)
|
|
95
|
+
gradient = np.einsum('iab,b->ai', generators, arm)
|
|
96
|
+
result = []
|
|
97
|
+
for axis in range(3):
|
|
98
|
+
g = np.zeros(15); h = np.zeros((15, 15))
|
|
99
|
+
g[3:6] = gradient[axis]
|
|
100
|
+
h[3:6, 3:6] = variations.surface_rotation_hessian[axis]
|
|
101
|
+
result.append(Jet2(arm[axis], g, h))
|
|
102
|
+
return result
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@lru_cache(maxsize=32)
|
|
106
|
+
def _skin_frame_jet(corner_bytes):
|
|
107
|
+
"""Bounded immutable geometry-only memo; never stores material response.
|
|
108
|
+
|
|
109
|
+
The exact binary64 physical corners determine the frame and its vertex
|
|
110
|
+
derivatives in this fixed local chart. Candidate geometry/polarity checks
|
|
111
|
+
precede this helper on every evaluation, including memo hits.
|
|
112
|
+
"""
|
|
113
|
+
corners = np.frombuffer(corner_bytes, dtype=np.float64).reshape(3, 3)
|
|
114
|
+
y = [[Jet2.variable(corners[a, i], 6+3*a+i, 15)
|
|
115
|
+
for i in range(3)] for a in range(3)]
|
|
116
|
+
first = [y[1][i]-y[0][i] for i in range(3)]
|
|
117
|
+
second = [y[2][i]-y[0][i] for i in range(3)]
|
|
118
|
+
t1 = _unit(first); n = _unit(_cross(first, second)); t2 = _cross(n, t1)
|
|
119
|
+
frame = tuple(tuple(row) for row in zip(t1, t2, n))
|
|
120
|
+
for row in frame:
|
|
121
|
+
for entry in row:
|
|
122
|
+
entry.gradient.setflags(write=False); entry.hessian.setflags(write=False)
|
|
123
|
+
return frame
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _local_contact_jets(new, corners, barycentric, old_target, old, history, partner_key):
|
|
127
|
+
"""Batch the existing local Jet2 sum/product rules; no new work law."""
|
|
128
|
+
rotated = _rotated_arm_jet(new)
|
|
129
|
+
separation = np.array([j.value + new.station.surface_position[i]-new.surface_arm[i]
|
|
130
|
+
for i,j in enumerate(rotated)]) - np.asarray(barycentric) @ corners
|
|
131
|
+
B = np.array([j.gradient for j in rotated]); H = np.array([j.hessian for j in rotated])
|
|
132
|
+
B[:, :3] += np.eye(3)
|
|
133
|
+
for a,w in enumerate(barycentric): B[:,6+3*a:9+3*a] -= w*np.eye(3)
|
|
134
|
+
frame = _skin_frame_jet(np.asarray(corners,dtype=np.float64).tobytes())
|
|
135
|
+
F = np.array([[j.value for j in row] for row in frame])
|
|
136
|
+
FB = np.array([[j.gradient for j in row] for row in frame])
|
|
137
|
+
FH = np.array([[j.hessian for j in row] for row in frame])
|
|
138
|
+
n, nB, nH = F[:,2], FB[:,2], FH[:,2]
|
|
139
|
+
components = np.asarray(old_target.material_frame).T @ (old.surface_position-np.asarray(old_target.position))
|
|
140
|
+
d = separation - F @ components
|
|
141
|
+
dB = B - np.einsum('aci,c->ai',FB,components)
|
|
142
|
+
dH = H - np.einsum('acij,c->aij',FH,components)
|
|
143
|
+
def scalar_product(v, vB, vH):
|
|
144
|
+
value = float(n @ v)
|
|
145
|
+
gradient = n @ vB + v @ nB
|
|
146
|
+
cross = nB.T @ vB
|
|
147
|
+
hessian = np.einsum('a,aij->ij',n,vH)+np.einsum('a,aij->ij',v,nH)+cross+cross.T
|
|
148
|
+
return Jet2(value,gradient,hessian)
|
|
149
|
+
q = scalar_product(d,dB,dH)
|
|
150
|
+
retained = np.asarray(history.elastic_slip) if history.partner_key==partner_key else np.zeros(3)
|
|
151
|
+
old_elastic = np.asarray(history.material_frame).T @ retained
|
|
152
|
+
e = d-n*q.value+F@old_elastic
|
|
153
|
+
eB = dB-n[:,None]*q.gradient-nB*q.value+np.einsum('aci,c->ai',FB,old_elastic)
|
|
154
|
+
eH = (dH-n[:,None,None]*q.hessian-nH*q.value
|
|
155
|
+
-nB[:,:,None]*q.gradient[None,None,:]-nB[:,None,:]*q.gradient[None,:,None]
|
|
156
|
+
+np.einsum('acij,c->aij',FH,old_elastic))
|
|
157
|
+
return scalar_product(separation,B,H), [Jet2(e[i],eB[i],eH[i]) for i in range(3)]
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class NativeS3MaterialPointFriction:
|
|
161
|
+
def __init__(self,source,target,*,reference_weight_m2,normal_stiffness_Pa_per_m,
|
|
162
|
+
friction_coefficient,tangential_stiffness_Pa_per_m,maximum_coupled_dofs=60,
|
|
163
|
+
activation_policy='reject', event_history_substeps=32):
|
|
164
|
+
if type(source) is not NativeRetainedRoundStation or type(target) is not S3SkinMaterialPoint:
|
|
165
|
+
raise TypeError('exact native round station and S3 material point required')
|
|
166
|
+
if target.adapter.side!='top':raise ValueError('initial native/S3 material profile requires target top skin')
|
|
167
|
+
self.source,self.target=source,target
|
|
168
|
+
if activation_policy not in ('reject','transverse_first_touch','transverse_events','transverse_event_sequence'):
|
|
169
|
+
raise ValueError('explicit supported native material activation policy required')
|
|
170
|
+
self.activation_policy=activation_policy
|
|
171
|
+
if type(event_history_substeps) is not int or not 2<=event_history_substeps<=1024:
|
|
172
|
+
raise ValueError('event history substeps must be an integer from 2 to 1024')
|
|
173
|
+
self.event_history_substeps=event_history_substeps
|
|
174
|
+
if type(maximum_coupled_dofs) is not int or maximum_coupled_dofs<1:
|
|
175
|
+
raise ValueError('positive coupled-coordinate resource cap required')
|
|
176
|
+
self.maximum_coupled_dofs=maximum_coupled_dofs
|
|
177
|
+
if 42+target.adapter.work_map.shape[1]>maximum_coupled_dofs:
|
|
178
|
+
raise MemoryError('native/S3 material-point coordinate cap exceeded')
|
|
179
|
+
for name,value,positive in (
|
|
180
|
+
('reference_weight_m2',reference_weight_m2,True),
|
|
181
|
+
('normal_stiffness_Pa_per_m',normal_stiffness_Pa_per_m,True),
|
|
182
|
+
('friction_coefficient',friction_coefficient,False),
|
|
183
|
+
('tangential_stiffness_Pa_per_m',tangential_stiffness_Pa_per_m,True)):
|
|
184
|
+
value=float(value)
|
|
185
|
+
if not np.isfinite(value) or value<0 or (positive and value==0):
|
|
186
|
+
raise ValueError(f'{name} has invalid dimensions/value')
|
|
187
|
+
setattr(self,name,value)
|
|
188
|
+
self.partner_key=(f'{source.identity}|s3:{target.adapter.body_id}:'
|
|
189
|
+
f'{target.adapter.element_id}:{target.adapter.side}:{target.barycentric!r}')
|
|
190
|
+
self.definition_sha256=sha(self._definition())
|
|
191
|
+
|
|
192
|
+
def _definition(self):
|
|
193
|
+
source=self.source;target=self.target;mapping=target.adapter.work_map
|
|
194
|
+
result=dict(profile=PROFILE,source=dict(identity=source.identity,
|
|
195
|
+
reference=source.reference.canonical_data(),element=source.element_id,
|
|
196
|
+
xi=source.xi,radius=source.radius,angle=source.angle,cell=source.cell,t=source.t),
|
|
197
|
+
target=dict(body=target.adapter.body_id,element=target.adapter.element_id,
|
|
198
|
+
side=target.adapter.side,barycentric=target.barycentric,
|
|
199
|
+
reference=target.adapter.reference_positions.tolist(),shape=mapping.shape,
|
|
200
|
+
indptr=mapping.indptr.tolist(),indices=mapping.indices.tolist(),data=mapping.data.tolist()),
|
|
201
|
+
weight=self.reference_weight_m2,normal=self.normal_stiffness_Pa_per_m,
|
|
202
|
+
mu=self.friction_coefficient,tangent=self.tangential_stiffness_Pa_per_m,
|
|
203
|
+
maximum_coupled_dofs=self.maximum_coupled_dofs)
|
|
204
|
+
if self.activation_policy!='reject':result['activation_policy']=self.activation_policy
|
|
205
|
+
if self.activation_policy in ('transverse_events','transverse_event_sequence'):
|
|
206
|
+
result['event_history_substeps']=self.event_history_substeps
|
|
207
|
+
if self.activation_policy=='transverse_event_sequence':
|
|
208
|
+
result['sequence_profile']='NATIVE_S3_OPEN_CLOSED_EVENT_SEQUENCE_POINT_DEV_V2'
|
|
209
|
+
return result
|
|
210
|
+
|
|
211
|
+
def evaluate_path(self, committed, history, translations, angular, shell_increment,
|
|
212
|
+
*, maximum_intervals=256):
|
|
213
|
+
"""Evaluate from one physical origin only after path admission.
|
|
214
|
+
|
|
215
|
+
Newton candidates never become history origins here. Normal transitions
|
|
216
|
+
require an equilibrated event subdivision; an endpoint law alone cannot
|
|
217
|
+
bypass that boundary. Returned tangent is the endpoint law's complete
|
|
218
|
+
spatial tangent, valid on its admitted smooth persistence branch.
|
|
219
|
+
"""
|
|
220
|
+
from .native_surface_path import material_path_pose, certify_material_path, affine_gap_polynomial
|
|
221
|
+
|
|
222
|
+
candidate = material_path_pose(committed, translations, angular, shell_increment, 1.)
|
|
223
|
+
point = self.source.evaluate(committed.positions, committed.position_low,
|
|
224
|
+
committed.cell_rotations).surface_position
|
|
225
|
+
target = self.target.physical_pose(committed.shell_displacement)
|
|
226
|
+
gap = float((point-np.asarray(target.position)) @ np.asarray(target.material_frame)[:, 2])
|
|
227
|
+
if self.activation_policy in ('transverse_first_touch','transverse_events','transverse_event_sequence'):
|
|
228
|
+
next_point=self.source.evaluate(candidate.positions,candidate.position_low,candidate.cell_rotations).surface_position
|
|
229
|
+
next_target=self.target.physical_pose(candidate.shell_displacement)
|
|
230
|
+
next_gap=float((next_point-np.asarray(next_target.position))@np.asarray(next_target.material_frame)[:,2])
|
|
231
|
+
if self.activation_policy=='transverse_event_sequence' and gap!=0. and next_gap>0.:
|
|
232
|
+
from .native_surface_event_sequence import evaluate_open_event_sequence
|
|
233
|
+
contribution=evaluate_open_event_sequence(self,committed,history,translations,angular,
|
|
234
|
+
shell_increment,maximum_intervals=maximum_intervals)
|
|
235
|
+
return NativeS3MaterialPathResult(candidate,contribution,contribution.path_sha256,
|
|
236
|
+
contribution.ownership_intervals)
|
|
237
|
+
if self.activation_policy=='transverse_event_sequence' and gap!=0. and next_gap<0.:
|
|
238
|
+
from .native_surface_event_sequence import evaluate_closed_or_persistent_sequence
|
|
239
|
+
contribution,sequence=evaluate_closed_or_persistent_sequence(self,committed,history,
|
|
240
|
+
translations,angular,shell_increment,maximum_intervals=maximum_intervals)
|
|
241
|
+
return NativeS3MaterialPathResult(candidate,contribution,sequence.path_sha256,sequence.intervals)
|
|
242
|
+
if gap>0. and next_gap<0.:
|
|
243
|
+
from .native_surface_activation import evaluate_first_touch
|
|
244
|
+
contribution=evaluate_first_touch(self,committed,history,translations,angular,shell_increment,
|
|
245
|
+
maximum_intervals=maximum_intervals)
|
|
246
|
+
return NativeS3MaterialPathResult(candidate,contribution,contribution.path_sha256,
|
|
247
|
+
contribution.ownership_intervals)
|
|
248
|
+
if self.activation_policy in ('transverse_events','transverse_event_sequence') and gap<0. and next_gap>=0.:
|
|
249
|
+
from .native_surface_activation import evaluate_release
|
|
250
|
+
contribution=evaluate_release(self,committed,history,translations,angular,shell_increment,
|
|
251
|
+
maximum_intervals=maximum_intervals)
|
|
252
|
+
return NativeS3MaterialPathResult(candidate,contribution,contribution.path_sha256,
|
|
253
|
+
contribution.ownership_intervals)
|
|
254
|
+
polynomial = affine_gap_polynomial(self, committed, np.asarray(translations), angular, shell_increment)
|
|
255
|
+
if polynomial is not None:
|
|
256
|
+
gap = polynomial[0] if polynomial[0] != 0 else polynomial[1]
|
|
257
|
+
elif gap == 0.:
|
|
258
|
+
next_point = self.source.evaluate(candidate.positions, candidate.position_low,
|
|
259
|
+
candidate.cell_rotations).surface_position
|
|
260
|
+
next_target = self.target.physical_pose(candidate.shell_displacement)
|
|
261
|
+
gap = float((next_point-np.asarray(next_target.position))
|
|
262
|
+
@ np.asarray(next_target.material_frame)[:, 2])
|
|
263
|
+
certificate = certify_material_path(self, committed, translations, angular,
|
|
264
|
+
shell_increment, closed=gap <= 0., maximum_intervals=maximum_intervals)
|
|
265
|
+
if not certificate.certified:
|
|
266
|
+
raise ValueError('native/S3 material history path requires subdivision: '+certificate.reason)
|
|
267
|
+
contribution = self.evaluate(committed, candidate, history)
|
|
268
|
+
return NativeS3MaterialPathResult(candidate, contribution, certificate.path_sha256,
|
|
269
|
+
certificate.intervals)
|
|
270
|
+
|
|
271
|
+
def evaluate(self,committed,candidate,history):
|
|
272
|
+
if sha(self._definition())!=self.definition_sha256:
|
|
273
|
+
raise ValueError('native/S3 material-point definition changed')
|
|
274
|
+
if type(committed) is not NativeS3MaterialConfiguration or type(candidate) is not NativeS3MaterialConfiguration:
|
|
275
|
+
raise TypeError('native/S3 material configurations required')
|
|
276
|
+
if type(history) is not FrictionPointState:raise TypeError('committed friction history required')
|
|
277
|
+
if history.partner_key not in (None,self.partner_key):
|
|
278
|
+
raise ValueError('native/S3 material-point partner history transfer is unsupported')
|
|
279
|
+
old=self.source.evaluate(committed.positions,committed.position_low,committed.cell_rotations)
|
|
280
|
+
new=self.source.surface_variations(candidate.positions,candidate.position_low,candidate.cell_rotations)
|
|
281
|
+
old_target=self.target.physical_pose(committed.shell_displacement)
|
|
282
|
+
target=self.target.physical_pose(candidate.shell_displacement)
|
|
283
|
+
corners=self.target.adapter.current_positions(candidate.shell_displacement)
|
|
284
|
+
frame=np.asarray(target.material_frame);normal=frame[:,2]
|
|
285
|
+
relative=new.station.surface_position-np.asarray(target.position)
|
|
286
|
+
gap=float(relative@normal)
|
|
287
|
+
# Physical closest projection must remain in this owned target facet.
|
|
288
|
+
edges=np.column_stack((corners[1]-corners[0],corners[2]-corners[0]))
|
|
289
|
+
uv=np.linalg.lstsq(edges,new.station.surface_position-corners[0]-gap*normal,rcond=None)[0]
|
|
290
|
+
if min(uv[0],uv[1],1-uv.sum())<=1e-12:
|
|
291
|
+
raise ValueError('native/S3 material point projection requires interior target ownership')
|
|
292
|
+
increment=objective_relative_tangent_increment(source_committed=old.surface_position,
|
|
293
|
+
target_committed=old_target.position,source_candidate=new.station.surface_position,
|
|
294
|
+
target_candidate=target.position,target_frame_committed=old_target.material_frame,
|
|
295
|
+
target_frame_candidate=target.material_frame)
|
|
296
|
+
old_gap=float((old.surface_position-np.asarray(old_target.position))@np.asarray(old_target.material_frame)[:,2])
|
|
297
|
+
if gap<0 and old_gap>0 and np.linalg.norm(increment)>1e-14:
|
|
298
|
+
raise ValueError('native/S3 material activation needs first-touch path subdivision')
|
|
299
|
+
pressure=max(0.,-self.normal_stiffness_Pa_per_m*gap)
|
|
300
|
+
trial=trial_coulomb_point(history,material_frame=frame,relative_increment=increment,
|
|
301
|
+
normal_pressure=pressure,friction_coefficient=self.friction_coefficient,
|
|
302
|
+
tangential_stiffness=self.tangential_stiffness_Pa_per_m,partner_key=self.partner_key)
|
|
303
|
+
if getattr(self,'_history_state_only',False):
|
|
304
|
+
count=42+self.target.adapter.work_map.shape[1]
|
|
305
|
+
zero=_readonly(np.zeros(count));matrix=_readonly(np.zeros((count,count)))
|
|
306
|
+
return NativeS3MaterialPointResult(zero,matrix,trial,gap,pressure,
|
|
307
|
+
self.reference_weight_m2*.5*self.normal_stiffness_Pa_per_m*min(gap,0.)**2,
|
|
308
|
+
zero,matrix)
|
|
309
|
+
# Fifteen local coordinates: base translation, cell spatial rotation,
|
|
310
|
+
# and three physical S3 vertices. Pull back once to authoritative DOFs.
|
|
311
|
+
g,elastic=_local_contact_jets(new,corners,self.target.barycentric,
|
|
312
|
+
old_target,old,history,self.partner_key)
|
|
313
|
+
E=(.5*self.normal_stiffness_Pa_per_m*g*g if gap<0 else Jet2.constant(0.,15))
|
|
314
|
+
residual=E.gradient.copy();tangent=E.hessian.copy()
|
|
315
|
+
if pressure>0:
|
|
316
|
+
e=np.array([v.value for v in elastic]);B=np.array([v.gradient for v in elastic])
|
|
317
|
+
H=np.array([v.hessian for v in elastic]);traction=np.asarray(trial.traction)
|
|
318
|
+
if trial.branch=='stick':
|
|
319
|
+
dt=-self.tangential_stiffness_Pa_per_m*B
|
|
320
|
+
else:
|
|
321
|
+
magnitude=np.linalg.norm(e);direction=e/magnitude
|
|
322
|
+
dp=-self.normal_stiffness_Pa_per_m*g.gradient
|
|
323
|
+
dt=(-self.friction_coefficient*pressure/magnitude*(np.eye(3)-np.outer(direction,direction))@B
|
|
324
|
+
-self.friction_coefficient*np.outer(direction,dp))
|
|
325
|
+
residual-=B.T@traction
|
|
326
|
+
tangent-=np.einsum('i,ijk->jk',traction,H)+B.T@dt
|
|
327
|
+
count=42+self.target.adapter.work_map.shape[1]
|
|
328
|
+
mapping=np.zeros((15,count))
|
|
329
|
+
for node,weight in ((self.source.cell,1-self.source.t),(self.source.cell+1,self.source.t)):
|
|
330
|
+
mapping[:3,6*node:6*node+3]=weight*np.eye(3)
|
|
331
|
+
mapping[3:6,18+3*self.source.cell:21+3*self.source.cell]=np.eye(3)
|
|
332
|
+
mapping[6:,42:]=self.target.adapter.work_map.toarray()
|
|
333
|
+
residual=self.reference_weight_m2*(mapping.T@residual)
|
|
334
|
+
tangent=self.reference_weight_m2*(mapping.T@tangent@mapping)
|
|
335
|
+
if not np.all(np.isfinite(residual)) or not np.all(np.isfinite(tangent)):
|
|
336
|
+
raise ValueError('nonfinite native/S3 material-point response')
|
|
337
|
+
return NativeS3MaterialPointResult(_readonly(residual),_readonly(tangent),trial,gap,
|
|
338
|
+
pressure,self.reference_weight_m2*E.value,
|
|
339
|
+
_readonly(self.reference_weight_m2*(mapping.T@E.gradient)),
|
|
340
|
+
_readonly(self.reference_weight_m2*(mapping.T@E.hessian@mapping)))
|