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,415 @@
|
|
|
1
|
+
"""Private, owned physical B2 reference definition; no public dispatch.
|
|
2
|
+
|
|
3
|
+
The optional inertia and geometric records are independent of stiffness.
|
|
4
|
+
This module performs definition admission only; it does not claim mass,
|
|
5
|
+
prestress, attachment, graph, or F09 qualification.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from fractions import Fraction
|
|
12
|
+
import math
|
|
13
|
+
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
16
|
+
from ._b2_physical_flexibility_linear import (
|
|
17
|
+
LinearOperator, LinearSection, RepresentabilityError,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
# Keep type admission independent of the construction factory (which can be
|
|
21
|
+
# instrumented without changing the canonical numerical operator).
|
|
22
|
+
_CANONICAL_LINEAR_OPERATOR = LinearOperator
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
PROFILE_ID = "B2_E4_PL_FAST_LINEAR_V1"
|
|
26
|
+
SCHEMA_ID = "B2_PHYSICAL_LINEAR_DEFINITION_V1"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _identifier(value, label):
|
|
30
|
+
if not isinstance(value, str) or not value.strip() or value != value.strip():
|
|
31
|
+
raise ValueError(f"nonempty canonical {label} required")
|
|
32
|
+
return value
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _vector(value, label):
|
|
36
|
+
try:
|
|
37
|
+
vector = np.asarray(value, dtype=float)
|
|
38
|
+
except (TypeError, ValueError) as exc:
|
|
39
|
+
raise ValueError(f"finite three-component {label} required") from exc
|
|
40
|
+
if vector.shape != (3,) or not np.isfinite(vector).all():
|
|
41
|
+
raise ValueError(f"finite three-component {label} required")
|
|
42
|
+
return tuple(float(v) for v in vector)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _exact_psd(matrix):
|
|
46
|
+
"""Check the owned binary64 matrix as exact rational input, no floor."""
|
|
47
|
+
a = [[Fraction(float(value)) for value in row] for row in matrix]
|
|
48
|
+
if not any(a[i][i] > 0 for i in range(6)):
|
|
49
|
+
raise ValueError("nonzero positive-semidefinite sectional inertia required")
|
|
50
|
+
for k in range(6):
|
|
51
|
+
pivot = a[k][k]
|
|
52
|
+
if pivot < 0 or (pivot == 0 and any(a[k][j] != 0 for j in range(k+1,6))):
|
|
53
|
+
raise ValueError("positive-semidefinite sectional inertia required")
|
|
54
|
+
if pivot == 0:
|
|
55
|
+
continue
|
|
56
|
+
for i in range(k+1,6):
|
|
57
|
+
for j in range(i,6):
|
|
58
|
+
a[i][j] -= a[i][k]*a[k][j]/pivot
|
|
59
|
+
a[j][i] = a[i][j]
|
|
60
|
+
for i in range(k+1,6):
|
|
61
|
+
a[k][i] = a[i][k] = Fraction(0)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _physical_rigid_inertia(matrix):
|
|
65
|
+
"""Admit kinetic inertia of a rigid section about its declared origin."""
|
|
66
|
+
eps = np.finfo(float).eps
|
|
67
|
+
translational = matrix[:3, :3]
|
|
68
|
+
mass = float(np.trace(translational)/3.)
|
|
69
|
+
if (mass <= 0. or not math.isfinite(mass) or
|
|
70
|
+
np.max(np.abs(translational-mass*np.eye(3))) > 64.*eps*mass):
|
|
71
|
+
raise ValueError("physical rigid-section translational mass required")
|
|
72
|
+
first_moment = matrix[:3, 3:]
|
|
73
|
+
scale = float(np.max(np.abs(first_moment)))
|
|
74
|
+
if np.max(np.abs(first_moment+first_moment.T)) > 64.*eps*scale:
|
|
75
|
+
raise ValueError("physical rigid-section first mass moment required")
|
|
76
|
+
# Compute the central covariance from the supplied binary64 entries
|
|
77
|
+
# exactly. Subtracting a distant-origin parallel-axis term in binary64
|
|
78
|
+
# can conceal a genuinely negative central moment.
|
|
79
|
+
m = Fraction(float(translational[0, 0]))
|
|
80
|
+
center = (Fraction(float(first_moment[1, 2]))/m,
|
|
81
|
+
Fraction(float(first_moment[2, 0]))/m,
|
|
82
|
+
Fraction(float(first_moment[0, 1]))/m)
|
|
83
|
+
radius2 = sum((value*value for value in center), Fraction(0))
|
|
84
|
+
central = [[Fraction(float(matrix[3+i, 3+j]))-
|
|
85
|
+
m*((radius2 if i == j else 0)-center[i]*center[j])
|
|
86
|
+
for j in range(3)] for i in range(3)]
|
|
87
|
+
trace = sum((central[i][i] for i in range(3)), Fraction(0))
|
|
88
|
+
second = [[(trace/2 if i == j else 0)-central[i][j]
|
|
89
|
+
for j in range(3)] for i in range(3)]
|
|
90
|
+
try:
|
|
91
|
+
central_float = np.array([[float(value) for value in row]
|
|
92
|
+
for row in central])
|
|
93
|
+
second_float = np.array([[float(value) for value in row]
|
|
94
|
+
for row in second])
|
|
95
|
+
except OverflowError as exc:
|
|
96
|
+
raise ValueError("physical rigid-section central inertia required") from exc
|
|
97
|
+
central_scale = max(float(np.max(np.abs(central_float))),
|
|
98
|
+
float(np.max(np.abs(second_float))))
|
|
99
|
+
if (not np.isfinite(central_float).all() or
|
|
100
|
+
not np.isfinite(second_float).all() or
|
|
101
|
+
np.linalg.eigvalsh(second_float)[0] < -16.*eps*central_scale):
|
|
102
|
+
raise ValueError("physical rigid-section central inertia required")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@dataclass(frozen=True)
|
|
106
|
+
class MassMetadata:
|
|
107
|
+
"""Explicit velocity-order sectional inertia per unit length.
|
|
108
|
+
|
|
109
|
+
Entries are in local [vx, vy, vz, wx, wy, wz] coordinates, with velocity
|
|
110
|
+
evaluated at ``origin_local_m`` relative to the member reference axis.
|
|
111
|
+
The matrix must represent a nonnegative rigid mass distribution. No
|
|
112
|
+
density or geometry is inferred; generalized or added mass requires a
|
|
113
|
+
separate contract.
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
source_id: str
|
|
117
|
+
origin_local_m: tuple[float, float, float]
|
|
118
|
+
matrix_per_m: tuple[tuple[float, ...], ...]
|
|
119
|
+
|
|
120
|
+
def __post_init__(self):
|
|
121
|
+
_identifier(self.source_id, "mass source ID")
|
|
122
|
+
object.__setattr__(self, "origin_local_m", _vector(self.origin_local_m, "mass origin"))
|
|
123
|
+
try:
|
|
124
|
+
matrix = np.asarray(self.matrix_per_m, dtype=float)
|
|
125
|
+
except (TypeError, ValueError) as exc:
|
|
126
|
+
raise ValueError("finite symmetric 6x6 mass per length required") from exc
|
|
127
|
+
if (matrix.shape != (6, 6) or not np.isfinite(matrix).all()
|
|
128
|
+
or not np.array_equal(matrix, matrix.T)):
|
|
129
|
+
raise ValueError("finite symmetric 6x6 mass per length required")
|
|
130
|
+
_exact_psd(matrix)
|
|
131
|
+
_physical_rigid_inertia(matrix)
|
|
132
|
+
object.__setattr__(self, "matrix_per_m", tuple(
|
|
133
|
+
tuple(float(v) for v in row) for row in matrix))
|
|
134
|
+
|
|
135
|
+
def matrix_at_reference_axis(self) -> np.ndarray:
|
|
136
|
+
"""Pull sectional kinetic work back to the member reference axis.
|
|
137
|
+
|
|
138
|
+
For the declared origin r, v_origin = v_axis + omega cross r. The
|
|
139
|
+
returned owned array has velocity order [v_axis, omega]. This is a
|
|
140
|
+
kinematic transformation of supplied inertia, not inertia inferred
|
|
141
|
+
from the section stiffness or geometry.
|
|
142
|
+
"""
|
|
143
|
+
x, y, z = self.origin_local_m
|
|
144
|
+
pullback = np.eye(6)
|
|
145
|
+
pullback[:3, 3:] = ((0., z, -y), (-z, 0., x), (y, -x, 0.))
|
|
146
|
+
with np.errstate(over="ignore", invalid="ignore"):
|
|
147
|
+
matrix = pullback.T @ np.asarray(self.matrix_per_m) @ pullback
|
|
148
|
+
if not np.isfinite(matrix).all():
|
|
149
|
+
raise RepresentabilityError("B2 mass-origin pullback is not representable")
|
|
150
|
+
return matrix
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@dataclass(frozen=True)
|
|
154
|
+
class GeometricMetadata:
|
|
155
|
+
"""Explicit local section positions and optional polar datum, independent of S."""
|
|
156
|
+
|
|
157
|
+
source_id: str
|
|
158
|
+
section_origin_local_m: tuple[float, float, float]
|
|
159
|
+
centroid_local_m: tuple[float, float, float]
|
|
160
|
+
shear_center_local_m: tuple[float, float, float]
|
|
161
|
+
geometric_polar_radius_squared_m2: float | None = None
|
|
162
|
+
|
|
163
|
+
def __post_init__(self):
|
|
164
|
+
_identifier(self.source_id, "geometry source ID")
|
|
165
|
+
for label in ("section_origin_local_m", "centroid_local_m",
|
|
166
|
+
"shear_center_local_m"):
|
|
167
|
+
object.__setattr__(self, label, _vector(getattr(self, label), label))
|
|
168
|
+
radius = self.geometric_polar_radius_squared_m2
|
|
169
|
+
if radius is None:
|
|
170
|
+
return
|
|
171
|
+
if type(radius) not in (int, float) or not math.isfinite(radius) or radius <= 0:
|
|
172
|
+
raise ValueError("explicit positive geometric polar radius squared required")
|
|
173
|
+
object.__setattr__(self, "geometric_polar_radius_squared_m2", float(radius))
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
@dataclass(frozen=True)
|
|
177
|
+
class GlobalLinearTrace:
|
|
178
|
+
"""Owned global point reference, pose, and global-coordinate pullback."""
|
|
179
|
+
|
|
180
|
+
stations: np.ndarray
|
|
181
|
+
reference_points_m: np.ndarray
|
|
182
|
+
pose: np.ndarray
|
|
183
|
+
jacobian: np.ndarray
|
|
184
|
+
profile_id: str = PROFILE_ID
|
|
185
|
+
production_qualified: bool = False
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
@dataclass(frozen=True)
|
|
189
|
+
class PhysicalB2Member:
|
|
190
|
+
"""A straight, explicitly oriented member with owned source identity."""
|
|
191
|
+
|
|
192
|
+
member_id: str
|
|
193
|
+
source_id: str
|
|
194
|
+
node_ids: tuple[int, int]
|
|
195
|
+
reference_points_m: tuple[tuple[float, float, float], ...]
|
|
196
|
+
local_y_global: tuple[float, float, float]
|
|
197
|
+
section_id: str
|
|
198
|
+
section: LinearSection
|
|
199
|
+
mass: MassMetadata | None = None
|
|
200
|
+
geometric: GeometricMetadata | None = None
|
|
201
|
+
profile_id: str = PROFILE_ID
|
|
202
|
+
schema_id: str = SCHEMA_ID
|
|
203
|
+
unit_system: str = "SI"
|
|
204
|
+
|
|
205
|
+
def __post_init__(self):
|
|
206
|
+
for label in ("member_id", "source_id", "section_id"):
|
|
207
|
+
_identifier(getattr(self, label), label)
|
|
208
|
+
if self.profile_id != PROFILE_ID or self.schema_id != SCHEMA_ID:
|
|
209
|
+
raise ValueError("explicit physical B2 profile/schema identity required")
|
|
210
|
+
if self.unit_system != "SI":
|
|
211
|
+
raise ValueError("explicit SI unit convention required")
|
|
212
|
+
if (not isinstance(self.node_ids, (tuple, list)) or len(self.node_ids) != 2
|
|
213
|
+
or any(type(v) is not int for v in self.node_ids)
|
|
214
|
+
or self.node_ids[0] == self.node_ids[1]):
|
|
215
|
+
raise ValueError("two distinct integer model node IDs required")
|
|
216
|
+
object.__setattr__(self, "node_ids", tuple(self.node_ids))
|
|
217
|
+
if (not isinstance(self.reference_points_m, (tuple, list, np.ndarray))
|
|
218
|
+
or len(self.reference_points_m) != 2):
|
|
219
|
+
raise ValueError("two reference positions required")
|
|
220
|
+
points = tuple(_vector(p, "reference point") for p in self.reference_points_m)
|
|
221
|
+
direction = np.subtract(points[1], points[0])
|
|
222
|
+
length = float(np.linalg.norm(direction))
|
|
223
|
+
if not math.isfinite(length) or length <= 0:
|
|
224
|
+
raise ValueError("nondegenerate finite straight member required")
|
|
225
|
+
tangent = direction/length
|
|
226
|
+
y = np.asarray(_vector(self.local_y_global, "physical local y axis"))
|
|
227
|
+
if abs(float(np.linalg.norm(y))-1.) > 1e-10 or abs(float(tangent@y)) > 1e-10:
|
|
228
|
+
raise ValueError("unit local y axis perpendicular to member required")
|
|
229
|
+
# Canonicalize admitted roundoff so the execution map is orthonormal.
|
|
230
|
+
y = y-tangent*float(tangent@y)
|
|
231
|
+
y = y/np.linalg.norm(y)
|
|
232
|
+
if not isinstance(self.section, LinearSection):
|
|
233
|
+
raise ValueError("physical linear B2 section required")
|
|
234
|
+
if self.mass is not None and not isinstance(self.mass, MassMetadata):
|
|
235
|
+
raise ValueError("explicit mass metadata required")
|
|
236
|
+
if self.geometric is not None and not isinstance(self.geometric, GeometricMetadata):
|
|
237
|
+
raise ValueError("explicit geometric metadata required")
|
|
238
|
+
object.__setattr__(self, "reference_points_m", points)
|
|
239
|
+
object.__setattr__(self, "local_y_global", tuple(float(v) for v in y))
|
|
240
|
+
|
|
241
|
+
@property
|
|
242
|
+
def length_m(self) -> float:
|
|
243
|
+
p0, p1 = self.reference_points_m
|
|
244
|
+
return float(np.linalg.norm(np.subtract(p1, p0)))
|
|
245
|
+
|
|
246
|
+
def local_frame_rows(self) -> np.ndarray:
|
|
247
|
+
x = np.subtract(self.reference_points_m[1], self.reference_points_m[0])
|
|
248
|
+
x = x/np.linalg.norm(x)
|
|
249
|
+
y = np.asarray(self.local_y_global)
|
|
250
|
+
z = np.cross(x, y)
|
|
251
|
+
return np.array((x, y, z), dtype=float, copy=True)
|
|
252
|
+
|
|
253
|
+
def local_dof_map(self) -> np.ndarray:
|
|
254
|
+
"""Return a fresh 12x12 global-to-local translation/rotation map."""
|
|
255
|
+
return np.kron(np.eye(4), self.local_frame_rows())
|
|
256
|
+
|
|
257
|
+
def local_operator(self) -> LinearOperator:
|
|
258
|
+
return LinearOperator(self.length_m, self.section)
|
|
259
|
+
|
|
260
|
+
def compile_local(self, *, operator_cache: PhysicalB2OperatorCache | None = None
|
|
261
|
+
) -> CompiledPhysicalB2Member:
|
|
262
|
+
"""Build one private, definition-bound local operator and frame map."""
|
|
263
|
+
if operator_cache is not None and not isinstance(
|
|
264
|
+
operator_cache, PhysicalB2OperatorCache):
|
|
265
|
+
raise TypeError("physical B2 operator cache required")
|
|
266
|
+
frame = self.local_frame_rows()
|
|
267
|
+
return CompiledPhysicalB2Member(
|
|
268
|
+
self, (self.local_operator() if operator_cache is None
|
|
269
|
+
else operator_cache.for_member(self)), frame.tobytes(),
|
|
270
|
+
np.kron(np.eye(4), frame).tobytes())
|
|
271
|
+
|
|
272
|
+
def local_candidate_mass_matrix(self) -> np.ndarray:
|
|
273
|
+
"""Integrate explicit sectional inertia through the static station trace.
|
|
274
|
+
|
|
275
|
+
This private candidate retains the supplied mass origin and the
|
|
276
|
+
physical B2 station kinematics. It does not admit coupled dynamics.
|
|
277
|
+
"""
|
|
278
|
+
return _candidate_mass_matrix(self, self.local_operator())
|
|
279
|
+
|
|
280
|
+
def trace_global(self, displacement, *, stations=(0.0, 0.5, 1.0),
|
|
281
|
+
offset_local_m=(0.0, 0.0, 0.0)) -> GlobalLinearTrace:
|
|
282
|
+
"""Private physical station port in the declared global nodal basis."""
|
|
283
|
+
return _global_trace(self.local_operator(), self.local_frame_rows(),
|
|
284
|
+
self.local_dof_map(), self.reference_points_m[0],
|
|
285
|
+
displacement, stations, offset_local_m)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
@dataclass(frozen=True)
|
|
289
|
+
class CompiledPhysicalB2Member:
|
|
290
|
+
"""Private operator reuse bound to one immutable physical B2 definition."""
|
|
291
|
+
|
|
292
|
+
definition: PhysicalB2Member
|
|
293
|
+
operator: LinearOperator
|
|
294
|
+
_frame_bytes: bytes
|
|
295
|
+
_transform_bytes: bytes
|
|
296
|
+
production_qualified: bool = False
|
|
297
|
+
|
|
298
|
+
def __post_init__(self):
|
|
299
|
+
if (not isinstance(self.definition, PhysicalB2Member)
|
|
300
|
+
or type(self.operator) is not _CANONICAL_LINEAR_OPERATOR
|
|
301
|
+
or self.operator.section is not self.definition.section
|
|
302
|
+
or self.operator.length != Fraction(self.definition.length_m)
|
|
303
|
+
or type(self._frame_bytes) is not bytes
|
|
304
|
+
or type(self._transform_bytes) is not bytes
|
|
305
|
+
or len(self._frame_bytes) != 9*8
|
|
306
|
+
or len(self._transform_bytes) != 144*8):
|
|
307
|
+
raise ValueError("compiled physical B2 operator/definition mismatch")
|
|
308
|
+
frame = np.frombuffer(self._frame_bytes, dtype=float).reshape(3, 3)
|
|
309
|
+
transform = np.frombuffer(self._transform_bytes, dtype=float).reshape(12, 12)
|
|
310
|
+
if (not np.array_equal(frame, self.definition.local_frame_rows())
|
|
311
|
+
or not np.array_equal(transform, self.definition.local_dof_map())):
|
|
312
|
+
raise ValueError("compiled physical B2 frame/definition mismatch")
|
|
313
|
+
|
|
314
|
+
def local_frame_rows(self) -> np.ndarray:
|
|
315
|
+
return np.frombuffer(self._frame_bytes, dtype=float).reshape(3, 3).copy()
|
|
316
|
+
|
|
317
|
+
def local_dof_map(self) -> np.ndarray:
|
|
318
|
+
return np.frombuffer(self._transform_bytes, dtype=float).reshape(12, 12).copy()
|
|
319
|
+
|
|
320
|
+
def trace_global(self, displacement, *, stations=(0.0, 0.5, 1.0),
|
|
321
|
+
offset_local_m=(0.0, 0.0, 0.0)) -> GlobalLinearTrace:
|
|
322
|
+
return _global_trace(self.operator,
|
|
323
|
+
np.frombuffer(self._frame_bytes, dtype=float).reshape(3, 3),
|
|
324
|
+
np.frombuffer(self._transform_bytes, dtype=float).reshape(12, 12),
|
|
325
|
+
self.definition.reference_points_m[0], displacement,
|
|
326
|
+
stations, offset_local_m)
|
|
327
|
+
|
|
328
|
+
def local_candidate_mass_matrix(self) -> np.ndarray:
|
|
329
|
+
return _candidate_mass_matrix(self.definition, self.operator)
|
|
330
|
+
|
|
331
|
+
def global_candidate_constant_axial_geometric_stiffness(
|
|
332
|
+
self, axial_force: float) -> np.ndarray:
|
|
333
|
+
"""Private constant reference-axis N term in global nodal coordinates."""
|
|
334
|
+
transform = self.local_dof_map()
|
|
335
|
+
local = self.operator.candidate_constant_axial_geometric_stiffness(
|
|
336
|
+
axial_force)
|
|
337
|
+
with np.errstate(over="ignore", invalid="ignore"):
|
|
338
|
+
global_matrix = transform.T @ local @ transform
|
|
339
|
+
if not np.isfinite(global_matrix).all():
|
|
340
|
+
raise RepresentabilityError(
|
|
341
|
+
"global physical B2 prestress term is not representable")
|
|
342
|
+
return global_matrix
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
class PhysicalB2OperatorCache:
|
|
346
|
+
"""Caller-owned reuse of immutable private operators for one compilation."""
|
|
347
|
+
|
|
348
|
+
__slots__ = ("_operators", "hits", "misses")
|
|
349
|
+
|
|
350
|
+
def __init__(self):
|
|
351
|
+
self._operators: dict[tuple[int, Fraction], LinearOperator] = {}
|
|
352
|
+
self.hits = 0
|
|
353
|
+
self.misses = 0
|
|
354
|
+
|
|
355
|
+
def for_member(self, member: PhysicalB2Member) -> LinearOperator:
|
|
356
|
+
if not isinstance(member, PhysicalB2Member):
|
|
357
|
+
raise TypeError("physical B2 member required")
|
|
358
|
+
# Keeping the operator alive also keeps its section alive, so an id
|
|
359
|
+
# cannot be recycled while this cache owns the corresponding entry.
|
|
360
|
+
key = (id(member.section), Fraction(member.length_m))
|
|
361
|
+
operator = self._operators.get(key)
|
|
362
|
+
if operator is not None:
|
|
363
|
+
if operator.section is not member.section:
|
|
364
|
+
raise RuntimeError("physical B2 section identity collision")
|
|
365
|
+
self.hits += 1
|
|
366
|
+
return operator
|
|
367
|
+
operator = LinearOperator(member.length_m, member.section)
|
|
368
|
+
self._operators[key] = operator
|
|
369
|
+
self.misses += 1
|
|
370
|
+
return operator
|
|
371
|
+
|
|
372
|
+
def clear(self) -> None:
|
|
373
|
+
self._operators.clear()
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def _candidate_mass_matrix(member: PhysicalB2Member,
|
|
377
|
+
operator: LinearOperator) -> np.ndarray:
|
|
378
|
+
if member.mass is None:
|
|
379
|
+
raise ValueError("explicit B2 mass metadata required")
|
|
380
|
+
mass_per_m = member.mass.matrix_at_reference_axis()
|
|
381
|
+
abscissae, weights = np.polynomial.legendre.leggauss(4)
|
|
382
|
+
stations = tuple(float((x+1.)/2.) for x in abscissae)
|
|
383
|
+
trace = operator.trace(np.zeros(12), stations=stations)
|
|
384
|
+
matrix = np.zeros((12, 12))
|
|
385
|
+
with np.errstate(over="ignore", invalid="ignore"):
|
|
386
|
+
for weight, jacobian in zip(weights, trace.jacobian):
|
|
387
|
+
matrix += (member.length_m*weight/2.) * (
|
|
388
|
+
jacobian.T @ mass_per_m @ jacobian)
|
|
389
|
+
if not np.isfinite(matrix).all():
|
|
390
|
+
raise RepresentabilityError("physical B2 candidate mass is not representable")
|
|
391
|
+
return matrix
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
def _global_trace(operator: LinearOperator, frame: np.ndarray,
|
|
395
|
+
transform: np.ndarray, start, displacement,
|
|
396
|
+
stations, offset_local_m) -> GlobalLinearTrace:
|
|
397
|
+
"""Shared physical trace mapping for ephemeral and compiled operators."""
|
|
398
|
+
try:
|
|
399
|
+
u = np.asarray(displacement, dtype=float)
|
|
400
|
+
except (TypeError, ValueError, OverflowError) as exc:
|
|
401
|
+
raise ValueError("twelve finite global coordinates required") from exc
|
|
402
|
+
if u.shape != (12,) or not np.isfinite(u).all():
|
|
403
|
+
raise ValueError("twelve finite global coordinates required")
|
|
404
|
+
local = operator.trace(
|
|
405
|
+
transform@u, stations=stations, offset_local_m=offset_local_m)
|
|
406
|
+
six = np.zeros((6, 6))
|
|
407
|
+
six[:3, :3] = six[3:, 3:] = frame.T
|
|
408
|
+
with np.errstate(over="ignore", invalid="ignore", under="ignore"):
|
|
409
|
+
points = local.reference_points@frame + np.asarray(start)
|
|
410
|
+
pose = local.pose@six.T
|
|
411
|
+
jacobian = np.einsum("ab,nbc,cd->nad", six, local.jacobian, transform)
|
|
412
|
+
if not all(np.isfinite(v).all() for v in (points, pose, jacobian)):
|
|
413
|
+
raise RepresentabilityError("global physical B2 trace is not representable")
|
|
414
|
+
return GlobalLinearTrace(local.stations.copy(), points.copy(), pose.copy(),
|
|
415
|
+
jacobian.copy())
|