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,491 @@
|
|
|
1
|
+
"""Private B2 sparse affine batch feasibility; no public mixed-profile dispatch."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from fractions import Fraction
|
|
7
|
+
from hashlib import sha256
|
|
8
|
+
import math
|
|
9
|
+
from threading import Lock
|
|
10
|
+
from typing import Callable, Mapping, Sequence
|
|
11
|
+
|
|
12
|
+
import numpy as np
|
|
13
|
+
from scipy import sparse
|
|
14
|
+
|
|
15
|
+
from ._b2_physical_linear_definition import CompiledPhysicalB2Member
|
|
16
|
+
from .control import CancellationToken
|
|
17
|
+
from .linalg import FactorizationCache, MatrixClass, factorize_cached
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class B2NumericalSolveFailure(RuntimeError):
|
|
21
|
+
"""A compiled B2 factorization or solve failed numerically."""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _checked_affine_projection(rows, multi, singles, values: np.ndarray, *,
|
|
25
|
+
failure_type=B2NumericalSolveFailure,
|
|
26
|
+
label="physical B2") -> np.ndarray:
|
|
27
|
+
"""Preserve affine work, using exact stored-input dots on cancellation.
|
|
28
|
+
|
|
29
|
+
Selection columns retain sparse multiplication. Only uncertain rows use
|
|
30
|
+
exact binary64 products; a nonrepresentable result fails explicitly.
|
|
31
|
+
"""
|
|
32
|
+
if not np.isfinite(values).all():
|
|
33
|
+
raise failure_type(f"finite {label} affine projection required")
|
|
34
|
+
result = np.asarray(rows @ values).reshape(-1)
|
|
35
|
+
eps = np.finfo(float).eps
|
|
36
|
+
for row in multi:
|
|
37
|
+
start, stop = rows.indptr[row:row+2]
|
|
38
|
+
terms = [(float(a), float(values[j])) for a, j in zip(
|
|
39
|
+
rows.data[start:stop], rows.indices[start:stop])]
|
|
40
|
+
magnitude = sum(abs(a*v) for a, v in terms)
|
|
41
|
+
uncertainty = (2*len(terms)+2)*eps*magnitude
|
|
42
|
+
if (not math.isfinite(float(result[row])) or
|
|
43
|
+
not math.isfinite(magnitude) or
|
|
44
|
+
(result[row] == 0. and
|
|
45
|
+
any(a != 0. and v != 0. for a, v in terms)) or
|
|
46
|
+
uncertainty > 1e-9*abs(float(result[row]))):
|
|
47
|
+
exact = sum((Fraction(a)*Fraction(v) for a, v in terms),
|
|
48
|
+
Fraction(0))
|
|
49
|
+
try:
|
|
50
|
+
result[row] = float(exact)
|
|
51
|
+
except OverflowError as exc:
|
|
52
|
+
raise failure_type(
|
|
53
|
+
f"{label} affine projection is not representable") from exc
|
|
54
|
+
if exact != 0 and result[row] == 0.:
|
|
55
|
+
raise failure_type(f"{label} affine projection is not representable")
|
|
56
|
+
for row in singles[result[singles] == 0.]:
|
|
57
|
+
slot = rows.indptr[row]
|
|
58
|
+
a = float(rows.data[slot])
|
|
59
|
+
v = float(values[rows.indices[slot]])
|
|
60
|
+
if a != 0. and v != 0.:
|
|
61
|
+
raise failure_type(f"{label} affine projection is not representable")
|
|
62
|
+
if np.any((result != 0.) & (np.abs(result) < np.finfo(float).tiny)):
|
|
63
|
+
raise failure_type(f"{label} affine projection is not representable")
|
|
64
|
+
if not np.isfinite(result).all():
|
|
65
|
+
raise failure_type(f"finite {label} affine projection required")
|
|
66
|
+
return result
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass(frozen=True)
|
|
70
|
+
class SelectedMemberRecovery:
|
|
71
|
+
member_id: str
|
|
72
|
+
stations: tuple[float, ...]
|
|
73
|
+
resultants_local: tuple[tuple[float, ...], ...]
|
|
74
|
+
strains_local: tuple[tuple[float, ...], ...]
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@dataclass(frozen=True)
|
|
78
|
+
class SelectedCase:
|
|
79
|
+
case_id: str
|
|
80
|
+
values: tuple[float, ...]
|
|
81
|
+
members: tuple[SelectedMemberRecovery, ...] = ()
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclass(frozen=True)
|
|
85
|
+
class BatchResult:
|
|
86
|
+
status: str
|
|
87
|
+
cases: tuple[SelectedCase, ...]
|
|
88
|
+
factorization_count: int
|
|
89
|
+
solve_count: int
|
|
90
|
+
maximum_rhs_chunk: int
|
|
91
|
+
production_qualified: bool = False
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _load_value_snapshot(value: np.ndarray, shape: tuple[int, ...]
|
|
95
|
+
) -> tuple[np.ndarray, bytes]:
|
|
96
|
+
"""Copy one submitted load and fingerprint its finite binary64 values."""
|
|
97
|
+
try:
|
|
98
|
+
load = np.array(value, dtype=np.float64, order="C", copy=True)
|
|
99
|
+
except (TypeError, ValueError, OverflowError) as exc:
|
|
100
|
+
raise ValueError("finite B2 load vector required") from exc
|
|
101
|
+
if load.shape != shape or not np.isfinite(load).all():
|
|
102
|
+
raise ValueError("finite B2 load vector required")
|
|
103
|
+
return load, sha256(memoryview(load).cast("B")).digest()
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _accurate_sparse_residual(matrix: sparse.spmatrix, solution: np.ndarray,
|
|
107
|
+
rhs: np.ndarray, *, exact_products: bool = False) -> np.ndarray:
|
|
108
|
+
"""Residual of binary64 inputs with compensated products, on failure only.
|
|
109
|
+
|
|
110
|
+
``exact_products`` selects the existing rational path even where FMA is
|
|
111
|
+
available, for the exceptional active-row resolution certificate.
|
|
112
|
+
"""
|
|
113
|
+
rows = matrix.tocsr()
|
|
114
|
+
result = np.empty_like(rhs)
|
|
115
|
+
fused = None if exact_products else getattr(math, "fma", None)
|
|
116
|
+
for column in range(rhs.shape[1]):
|
|
117
|
+
for row in range(rows.shape[0]):
|
|
118
|
+
start, stop = rows.indptr[row:row+2]
|
|
119
|
+
terms = [-float(rhs[row, column])]
|
|
120
|
+
exact = -Fraction(float(rhs[row, column])) if fused is None else None
|
|
121
|
+
try:
|
|
122
|
+
for a, k in zip(rows.data[start:stop], rows.indices[start:stop]):
|
|
123
|
+
x = float(solution[k, column])
|
|
124
|
+
product = float(a)*x
|
|
125
|
+
if not math.isfinite(product):
|
|
126
|
+
raise B2NumericalSolveFailure("physical B2 residual is not representable")
|
|
127
|
+
if fused is None:
|
|
128
|
+
exact += Fraction(float(a))*Fraction(x)
|
|
129
|
+
else:
|
|
130
|
+
terms.extend((product, fused(float(a), x, -product)))
|
|
131
|
+
value = float(exact) if fused is None else math.fsum(terms)
|
|
132
|
+
except (OverflowError, ValueError) as exc:
|
|
133
|
+
raise B2NumericalSolveFailure(
|
|
134
|
+
"physical B2 residual is not representable") from exc
|
|
135
|
+
result[row, column] = value
|
|
136
|
+
if not np.isfinite(result).all():
|
|
137
|
+
raise B2NumericalSolveFailure("physical B2 residual is not representable")
|
|
138
|
+
return result
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _normalized_backward_limit(row_scale: np.ndarray,
|
|
142
|
+
equilibrium_scale: np.ndarray) -> np.ndarray:
|
|
143
|
+
"""Per-case backward bound in each reduced row's own physical units."""
|
|
144
|
+
relative = np.zeros_like(row_scale)
|
|
145
|
+
with np.errstate(divide="ignore", over="ignore", invalid="ignore"):
|
|
146
|
+
np.divide(row_scale, equilibrium_scale, out=relative,
|
|
147
|
+
where=equilibrium_scale > 0.)
|
|
148
|
+
return (1e-9*np.max(relative, axis=0, keepdims=True)
|
|
149
|
+
* equilibrium_scale)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _fast_residual_within_margin(defect: np.ndarray, row_scale: np.ndarray,
|
|
153
|
+
equilibrium_scale: np.ndarray,
|
|
154
|
+
row_nnz: np.ndarray) -> bool:
|
|
155
|
+
"""Screen a rounded sparse dot against a conservative rowwise error bound.
|
|
156
|
+
|
|
157
|
+
A row with ``n`` entries has at most ``2*n+2`` product/sum/subtraction
|
|
158
|
+
roundings. The factor also accounts for rounding in the computed absolute
|
|
159
|
+
row scale. Rows outside that bound take the accurate-product path.
|
|
160
|
+
"""
|
|
161
|
+
if (not np.isfinite(defect).all() or not np.isfinite(row_scale).all() or
|
|
162
|
+
not np.isfinite(equilibrium_scale).all() or
|
|
163
|
+
np.any(row_scale <= np.finfo(float).tiny*1e9) or
|
|
164
|
+
np.any(equilibrium_scale <= np.finfo(float).tiny*1e9)):
|
|
165
|
+
return False
|
|
166
|
+
unit_roundoff = np.finfo(float).eps/2
|
|
167
|
+
mu = (2.*row_nnz+2.)*unit_roundoff
|
|
168
|
+
if np.any(mu >= .25):
|
|
169
|
+
return False
|
|
170
|
+
# gamma_(2n+2)/(1-gamma_(2n+2)) = mu/(1-2*mu).
|
|
171
|
+
# Fourfold allowance covers rounding of the bound arithmetic itself;
|
|
172
|
+
# near-subnormal scales always use accurate products instead.
|
|
173
|
+
factor = 4.*mu/(1.-2.*mu)
|
|
174
|
+
smallest = np.nextafter(0., 1.)
|
|
175
|
+
with np.errstate(over="ignore", invalid="ignore"):
|
|
176
|
+
uncertainty = np.nextafter(factor[:, None]*row_scale, np.inf)
|
|
177
|
+
uncertainty += (2.*row_nnz[:, None]+2.)*smallest
|
|
178
|
+
margin = np.nextafter(np.abs(defect)+uncertainty, np.inf)
|
|
179
|
+
backward_limit = _normalized_backward_limit(
|
|
180
|
+
row_scale, equilibrium_scale)
|
|
181
|
+
return bool(np.isfinite(margin).all() and
|
|
182
|
+
np.isfinite(backward_limit).all() and
|
|
183
|
+
np.all(margin <= backward_limit) and
|
|
184
|
+
np.all(margin <= 1e-9*equilibrium_scale))
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class CompiledB2AffineBatch:
|
|
188
|
+
"""Bounded graph/affine prototype with one owned sparse factorization."""
|
|
189
|
+
|
|
190
|
+
def __init__(self, members: Sequence[CompiledPhysicalB2Member],
|
|
191
|
+
transformation: sparse.spmatrix, prescribed_offset,
|
|
192
|
+
selected_dofs, *, max_chunk: int = 8,
|
|
193
|
+
factorization_cache: FactorizationCache | None = None):
|
|
194
|
+
compiled = tuple(members)
|
|
195
|
+
if not compiled or any(not isinstance(m, CompiledPhysicalB2Member)
|
|
196
|
+
for m in compiled):
|
|
197
|
+
raise ValueError("compiled physical B2 members required")
|
|
198
|
+
if type(max_chunk) is not int or max_chunk <= 0:
|
|
199
|
+
raise ValueError("positive bounded RHS chunk required")
|
|
200
|
+
if factorization_cache is not None and not isinstance(
|
|
201
|
+
factorization_cache, FactorizationCache):
|
|
202
|
+
raise ValueError("local factorization cache required")
|
|
203
|
+
ids = [m.definition.member_id for m in compiled]
|
|
204
|
+
if len(set(ids)) != len(ids):
|
|
205
|
+
raise ValueError("unique physical B2 member IDs required")
|
|
206
|
+
points = {}
|
|
207
|
+
for member in compiled:
|
|
208
|
+
for node_id, point in zip(member.definition.node_ids,
|
|
209
|
+
member.definition.reference_points_m):
|
|
210
|
+
old = points.setdefault(node_id, point)
|
|
211
|
+
if old != point:
|
|
212
|
+
raise ValueError("shared B2 node has inconsistent position")
|
|
213
|
+
ordered = tuple(sorted(points))
|
|
214
|
+
node_index = {node_id: i for i, node_id in enumerate(ordered)}
|
|
215
|
+
size = 6*len(ordered)
|
|
216
|
+
try:
|
|
217
|
+
T = transformation.tocsr(copy=True)
|
|
218
|
+
u0 = np.asarray(prescribed_offset, dtype=float).copy()
|
|
219
|
+
selected_input = np.asarray(selected_dofs)
|
|
220
|
+
except (AttributeError, TypeError, ValueError) as exc:
|
|
221
|
+
raise ValueError("finite sparse affine plan and selection required") from exc
|
|
222
|
+
if selected_input.dtype.kind not in "iu":
|
|
223
|
+
raise ValueError("integer selected DOFs required")
|
|
224
|
+
selected = selected_input.astype(int, copy=True)
|
|
225
|
+
if (T.shape[0] != size or T.shape[1] == 0 or
|
|
226
|
+
u0.shape != (size,) or selected.ndim != 1 or
|
|
227
|
+
np.any(selected < 0) or np.any(selected >= size) or
|
|
228
|
+
not np.isfinite(T.data).all() or not np.isfinite(u0).all()):
|
|
229
|
+
raise ValueError("finite sparse affine plan and selection required")
|
|
230
|
+
rows, cols, values = [], [], []
|
|
231
|
+
for member in compiled:
|
|
232
|
+
local = member.operator.evaluate(np.zeros(12)).tangent
|
|
233
|
+
frame = member.local_dof_map()
|
|
234
|
+
stiffness = frame.T@local@frame
|
|
235
|
+
dofs = [6*node_index[node]+j for node in member.definition.node_ids
|
|
236
|
+
for j in range(6)]
|
|
237
|
+
for i, row in enumerate(dofs):
|
|
238
|
+
for j, col in enumerate(dofs):
|
|
239
|
+
rows.append(row); cols.append(col); values.append(stiffness[i, j])
|
|
240
|
+
K = sparse.coo_matrix((values, (rows, cols)),
|
|
241
|
+
shape=(size, size)).tocsr()
|
|
242
|
+
reduced = (T.T@K@T).tocsc()
|
|
243
|
+
row_nnz = np.diff(reduced.tocsr().indptr).astype(float)
|
|
244
|
+
diagonal = reduced.diagonal()
|
|
245
|
+
if not np.isfinite(diagonal).all() or np.any(diagonal <= 0.):
|
|
246
|
+
raise B2NumericalSolveFailure(
|
|
247
|
+
"physical B2 batch factorization failed: positive finite diagonal required")
|
|
248
|
+
with np.errstate(over="ignore", under="ignore", divide="ignore",
|
|
249
|
+
invalid="ignore"):
|
|
250
|
+
scaling = 1./np.sqrt(diagonal)
|
|
251
|
+
scaled = (sparse.diags(scaling)@reduced@sparse.diags(scaling)).tocsc()
|
|
252
|
+
if (not np.isfinite(scaling).all() or np.any(scaling == 0.) or
|
|
253
|
+
not np.isfinite(scaled.data).all() or
|
|
254
|
+
np.any(scaled.diagonal() <= 0.)):
|
|
255
|
+
raise B2NumericalSolveFailure(
|
|
256
|
+
"physical B2 batch factorization failed: diagonal scaling is not representable")
|
|
257
|
+
handle = factorize_cached(
|
|
258
|
+
scaled, MatrixClass.SPD, cache=factorization_cache)
|
|
259
|
+
if handle.status != "ok":
|
|
260
|
+
raise B2NumericalSolveFailure("physical B2 batch factorization failed: " +
|
|
261
|
+
str(handle.failure_reason))
|
|
262
|
+
self._K = K
|
|
263
|
+
self._reduced = reduced
|
|
264
|
+
row_nnz.setflags(write=False)
|
|
265
|
+
self._row_nnz = row_nnz
|
|
266
|
+
self._T = T
|
|
267
|
+
# Compile the work map once; graph execution never imports a shell owner.
|
|
268
|
+
self._work_rows = T.T.tocsr(copy=True)
|
|
269
|
+
self._work_rows.eliminate_zeros()
|
|
270
|
+
work_nnz = np.diff(self._work_rows.indptr)
|
|
271
|
+
self._work_multi = np.flatnonzero(work_nnz > 1)
|
|
272
|
+
self._work_singles = np.flatnonzero(work_nnz == 1)
|
|
273
|
+
self._u0 = u0
|
|
274
|
+
self._ku0 = np.asarray(K@u0).reshape(-1)
|
|
275
|
+
self._length_scale = max(member.definition.length_m for member in compiled)
|
|
276
|
+
self._selected = selected
|
|
277
|
+
self._handle = handle
|
|
278
|
+
scaling.setflags(write=False)
|
|
279
|
+
self._scaling = scaling
|
|
280
|
+
self._max_chunk = max_chunk
|
|
281
|
+
self._closed = False
|
|
282
|
+
self._operation_lock = Lock()
|
|
283
|
+
self.node_ids = ordered
|
|
284
|
+
self.members = compiled
|
|
285
|
+
self._member_layout = {
|
|
286
|
+
member.definition.member_id: (
|
|
287
|
+
member,
|
|
288
|
+
np.array([6*node_index[node]+j
|
|
289
|
+
for node in member.definition.node_ids
|
|
290
|
+
for j in range(6)], dtype=int),
|
|
291
|
+
member.local_dof_map(),
|
|
292
|
+
) for member in compiled
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
@property
|
|
296
|
+
def full_stiffness(self) -> sparse.csr_matrix:
|
|
297
|
+
if self._closed:
|
|
298
|
+
raise RuntimeError("physical B2 batch is closed")
|
|
299
|
+
return self._K.copy()
|
|
300
|
+
|
|
301
|
+
def close(self) -> None:
|
|
302
|
+
if not self._operation_lock.acquire(blocking=False):
|
|
303
|
+
raise RuntimeError("physical B2 batch operation is active")
|
|
304
|
+
try:
|
|
305
|
+
self._closed = True
|
|
306
|
+
self._handle = None
|
|
307
|
+
finally:
|
|
308
|
+
self._operation_lock.release()
|
|
309
|
+
|
|
310
|
+
def solve_many(self, cases: Sequence[tuple[str, np.ndarray]], *,
|
|
311
|
+
cancellation_token: CancellationToken | None = None,
|
|
312
|
+
on_case: Callable[[str], None] | None = None,
|
|
313
|
+
recover_members: Mapping[str, Sequence[float]] | None = None,
|
|
314
|
+
) -> BatchResult:
|
|
315
|
+
if not self._operation_lock.acquire(blocking=False):
|
|
316
|
+
raise RuntimeError("physical B2 batch operation is active")
|
|
317
|
+
try:
|
|
318
|
+
return self._solve_many_locked(
|
|
319
|
+
cases, cancellation_token=cancellation_token,
|
|
320
|
+
on_case=on_case, recover_members=recover_members)
|
|
321
|
+
finally:
|
|
322
|
+
self._operation_lock.release()
|
|
323
|
+
|
|
324
|
+
def _solve_many_locked(self, cases: Sequence[tuple[str, np.ndarray]], *,
|
|
325
|
+
cancellation_token: CancellationToken | None,
|
|
326
|
+
on_case: Callable[[str], None] | None,
|
|
327
|
+
recover_members: Mapping[str, Sequence[float]] | None,
|
|
328
|
+
) -> BatchResult:
|
|
329
|
+
if self._closed:
|
|
330
|
+
raise RuntimeError("physical B2 batch is closed")
|
|
331
|
+
# Freeze the case inventory before callbacks can change the caller's
|
|
332
|
+
# sequence. Fingerprint each load without retaining an unbounded RHS
|
|
333
|
+
# batch; each numerical load is copied again when its chunk begins.
|
|
334
|
+
submitted = tuple((identity, value) for identity, value in cases)
|
|
335
|
+
ids = [identity for identity, _ in submitted]
|
|
336
|
+
if (any(not isinstance(identity, str) or not identity.strip()
|
|
337
|
+
for identity in ids) or len(set(ids)) != len(ids)):
|
|
338
|
+
raise ValueError("unique nonempty ordered B2 case IDs required")
|
|
339
|
+
recovery = []
|
|
340
|
+
if recover_members is not None:
|
|
341
|
+
if not isinstance(recover_members, Mapping):
|
|
342
|
+
raise ValueError("selected B2 recovery mapping required")
|
|
343
|
+
for member_id, requested in recover_members.items():
|
|
344
|
+
if member_id not in self._member_layout:
|
|
345
|
+
raise ValueError("selected B2 member ID is not compiled")
|
|
346
|
+
try:
|
|
347
|
+
stations = np.asarray(requested, dtype=float).copy()
|
|
348
|
+
except (TypeError, ValueError, OverflowError) as exc:
|
|
349
|
+
raise ValueError("finite normalized B2 recovery stations required") from exc
|
|
350
|
+
if (stations.ndim != 1 or stations.size == 0 or
|
|
351
|
+
not np.isfinite(stations).all() or
|
|
352
|
+
np.any(stations < 0.) or np.any(stations > 1.)):
|
|
353
|
+
raise ValueError("finite normalized B2 recovery stations required")
|
|
354
|
+
recovery.append((member_id, tuple(float(x) for x in stations)))
|
|
355
|
+
fingerprints = []
|
|
356
|
+
for _identity, value in submitted:
|
|
357
|
+
if cancellation_token is not None and cancellation_token.is_cancelled:
|
|
358
|
+
break
|
|
359
|
+
snapshot, fingerprint = _load_value_snapshot(value, self._u0.shape)
|
|
360
|
+
fingerprints.append(fingerprint)
|
|
361
|
+
del snapshot
|
|
362
|
+
completed = []
|
|
363
|
+
largest = 0
|
|
364
|
+
for start in range(0, len(submitted), self._max_chunk):
|
|
365
|
+
if cancellation_token is not None and cancellation_token.is_cancelled:
|
|
366
|
+
break
|
|
367
|
+
block = submitted[start:start+self._max_chunk]
|
|
368
|
+
loads = []
|
|
369
|
+
for j, (_identity, value) in enumerate(block):
|
|
370
|
+
load, fingerprint = _load_value_snapshot(value, self._u0.shape)
|
|
371
|
+
if fingerprint != fingerprints[start+j]:
|
|
372
|
+
raise ValueError("B2 load case changed after submission")
|
|
373
|
+
loads.append(load)
|
|
374
|
+
largest = max(largest, len(loads))
|
|
375
|
+
driving = np.column_stack(loads)-self._ku0[:, None]
|
|
376
|
+
rhs = np.column_stack([
|
|
377
|
+
_checked_affine_projection(
|
|
378
|
+
self._work_rows, self._work_multi, self._work_singles,
|
|
379
|
+
driving[:, column])
|
|
380
|
+
for column in range(len(loads))])
|
|
381
|
+
# A small backward error can still conceal an unacceptable
|
|
382
|
+
# physical imbalance when a weak section creates huge motions.
|
|
383
|
+
# Scale force and moment rows from the applied generalized loads,
|
|
384
|
+
# then pull those work-conjugate scales through the affine map.
|
|
385
|
+
nodal_wrenches = np.abs(driving).reshape(-1, 6, len(loads))
|
|
386
|
+
force_scale = np.max(nodal_wrenches[:, :3, :], axis=(0, 1))
|
|
387
|
+
moment_scale = np.maximum(
|
|
388
|
+
np.max(nodal_wrenches[:, 3:, :], axis=(0, 1)),
|
|
389
|
+
self._length_scale*force_scale)
|
|
390
|
+
force_scale = np.maximum(force_scale,
|
|
391
|
+
moment_scale/self._length_scale)
|
|
392
|
+
physical_scale = np.empty_like(driving)
|
|
393
|
+
for component in range(6):
|
|
394
|
+
physical_scale[component::6, :] = (
|
|
395
|
+
force_scale if component < 3 else moment_scale)
|
|
396
|
+
equilibrium_scale = np.asarray(abs(self._T).T@physical_scale)
|
|
397
|
+
if not np.isfinite(equilibrium_scale).all():
|
|
398
|
+
raise B2NumericalSolveFailure("physical B2 equilibrium scale is not representable")
|
|
399
|
+
with np.errstate(over="ignore", invalid="ignore"):
|
|
400
|
+
scaled_rhs = self._scaling[:, None]*rhs
|
|
401
|
+
if (not np.isfinite(scaled_rhs).all() or
|
|
402
|
+
np.any((rhs != 0.) & (scaled_rhs == 0.))):
|
|
403
|
+
raise B2NumericalSolveFailure("physical B2 scaled load is not representable")
|
|
404
|
+
try:
|
|
405
|
+
solved = np.asarray(self._handle.solve_many(scaled_rhs), dtype=float)
|
|
406
|
+
except RuntimeError as exc:
|
|
407
|
+
raise B2NumericalSolveFailure(
|
|
408
|
+
"physical B2 sparse solve failed: " + str(exc)) from exc
|
|
409
|
+
with np.errstate(over="ignore", invalid="ignore"):
|
|
410
|
+
solved = self._scaling[:, None]*solved
|
|
411
|
+
if not np.isfinite(solved).all():
|
|
412
|
+
raise B2NumericalSolveFailure("physical B2 solution is not representable")
|
|
413
|
+
with np.errstate(over="ignore", invalid="ignore"):
|
|
414
|
+
defect = np.asarray(self._reduced@solved-rhs)
|
|
415
|
+
row_scale = (np.abs(self._reduced)@np.abs(solved) +
|
|
416
|
+
np.abs(rhs))
|
|
417
|
+
def acceptable(error, backward_scale):
|
|
418
|
+
backward_limit = _normalized_backward_limit(
|
|
419
|
+
backward_scale, equilibrium_scale)
|
|
420
|
+
return (np.isfinite(error).all() and
|
|
421
|
+
np.isfinite(backward_scale).all() and
|
|
422
|
+
np.isfinite(backward_limit).all() and
|
|
423
|
+
np.all(np.abs(error) <= backward_limit) and
|
|
424
|
+
np.all(np.abs(error) <= 1e-9*equilibrium_scale))
|
|
425
|
+
|
|
426
|
+
# A rounded sparse dot can hide many small terms. Trust it only
|
|
427
|
+
# when a row-length bound fits below both acceptance margins.
|
|
428
|
+
if not _fast_residual_within_margin(
|
|
429
|
+
defect, row_scale, equilibrium_scale, self._row_nnz):
|
|
430
|
+
if not np.isfinite(row_scale).all():
|
|
431
|
+
raise B2NumericalSolveFailure("physical B2 batch solve residual failed")
|
|
432
|
+
for _ in range(2):
|
|
433
|
+
defect = _accurate_sparse_residual(self._reduced, solved, rhs)
|
|
434
|
+
row_scale = (np.abs(self._reduced)@np.abs(solved) +
|
|
435
|
+
np.abs(rhs))
|
|
436
|
+
if acceptable(defect, row_scale):
|
|
437
|
+
break
|
|
438
|
+
correction_rhs = self._scaling[:, None]*defect
|
|
439
|
+
if not np.isfinite(correction_rhs).all():
|
|
440
|
+
raise B2NumericalSolveFailure("physical B2 batch solve residual failed")
|
|
441
|
+
try:
|
|
442
|
+
correction = np.asarray(self._handle.solve_many(
|
|
443
|
+
correction_rhs), dtype=float)
|
|
444
|
+
except RuntimeError as exc:
|
|
445
|
+
raise B2NumericalSolveFailure(
|
|
446
|
+
"physical B2 sparse correction failed: " + str(exc)) from exc
|
|
447
|
+
solved -= self._scaling[:, None]*correction
|
|
448
|
+
if not np.isfinite(solved).all():
|
|
449
|
+
raise B2NumericalSolveFailure("physical B2 batch solve residual failed")
|
|
450
|
+
else:
|
|
451
|
+
defect = _accurate_sparse_residual(self._reduced, solved, rhs)
|
|
452
|
+
row_scale = (np.abs(self._reduced)@np.abs(solved) +
|
|
453
|
+
np.abs(rhs))
|
|
454
|
+
if not acceptable(defect, row_scale):
|
|
455
|
+
raise B2NumericalSolveFailure("physical B2 batch solve residual failed")
|
|
456
|
+
selected = self._T[self._selected]@solved
|
|
457
|
+
selected = np.asarray(selected)+self._u0[self._selected, None]
|
|
458
|
+
if not np.isfinite(selected).all():
|
|
459
|
+
raise B2NumericalSolveFailure("physical B2 selected solution is not finite")
|
|
460
|
+
for j, (identity, _value) in enumerate(block):
|
|
461
|
+
if cancellation_token is not None and cancellation_token.is_cancelled:
|
|
462
|
+
break
|
|
463
|
+
member_results = []
|
|
464
|
+
for member_id, stations in recovery:
|
|
465
|
+
member, dofs, frame = self._member_layout[member_id]
|
|
466
|
+
physical = np.asarray(self._T[dofs]@solved[:, j]).reshape(-1)
|
|
467
|
+
physical += self._u0[dofs]
|
|
468
|
+
response = member.operator.recover_sections(
|
|
469
|
+
frame@physical, stations=stations)
|
|
470
|
+
member_results.append(SelectedMemberRecovery(
|
|
471
|
+
member_id, stations,
|
|
472
|
+
tuple(tuple(float(value) for value in row)
|
|
473
|
+
for row in response.resultants),
|
|
474
|
+
tuple(tuple(float(value) for value in row)
|
|
475
|
+
for row in response.strains)))
|
|
476
|
+
if cancellation_token is not None and cancellation_token.is_cancelled:
|
|
477
|
+
break
|
|
478
|
+
if cancellation_token is not None and cancellation_token.is_cancelled:
|
|
479
|
+
break
|
|
480
|
+
completed.append(SelectedCase(
|
|
481
|
+
identity, tuple(float(v) for v in selected[:, j]),
|
|
482
|
+
tuple(member_results)))
|
|
483
|
+
if on_case is not None:
|
|
484
|
+
on_case(identity)
|
|
485
|
+
if cancellation_token is not None and cancellation_token.is_cancelled:
|
|
486
|
+
break
|
|
487
|
+
return BatchResult(
|
|
488
|
+
"cancelled" if cancellation_token is not None and
|
|
489
|
+
cancellation_token.is_cancelled else "completed",
|
|
490
|
+
tuple(completed), self._handle.factorization_count,
|
|
491
|
+
self._handle.solve_count, largest)
|