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,497 @@
|
|
|
1
|
+
"""Finite, fixed-order element-local contractions (no BLAS dispatch).
|
|
2
|
+
|
|
3
|
+
Products are split on normalized binary64 mantissas with Dekker's transform;
|
|
4
|
+
both parts are accumulated with ``math.fsum`` in ascending index order.
|
|
5
|
+
No exact-rounding claim is made: scaling a residual into the subnormal range
|
|
6
|
+
can lose at most one minimum subnormal per product, and fsum has its documented
|
|
7
|
+
platform double-rounding limitation. Exact cancellation/empty sums give +0.
|
|
8
|
+
Nonfinite inputs and overflowing individual products or sums are refused,
|
|
9
|
+
even when a wider exact accumulator could cancel an intermediate overflow.
|
|
10
|
+
There is no precision option, persistent result cache or fallback that changes
|
|
11
|
+
a value. Optional compiled kernels (``_compensated_native``, Numba) execute the
|
|
12
|
+
same arithmetic bit for bit; they are enabled only when Numba is present and a
|
|
13
|
+
known-answer self-check at import reproduces the numpy path bitwise (it guards
|
|
14
|
+
against fused multiply-add contraction). Any refusal replays the numpy path so
|
|
15
|
+
the reference exception is raised.
|
|
16
|
+
"""
|
|
17
|
+
from math import frexp as _frexp, fsum as _fsum, isfinite as _isfinite, ldexp as _ldexp
|
|
18
|
+
|
|
19
|
+
import os
|
|
20
|
+
from types import MappingProxyType as _MappingProxyType
|
|
21
|
+
|
|
22
|
+
import numpy as np
|
|
23
|
+
|
|
24
|
+
from . import _compensated_native as _native
|
|
25
|
+
|
|
26
|
+
# Compiled kernels run the identical arithmetic (see _compensated_native); a
|
|
27
|
+
# nonzero kernel status replays the vectorised path, which raises the reference
|
|
28
|
+
# exception. ANYSOLVER_NATIVE_CONTRACTIONS=0 forces the numpy path.
|
|
29
|
+
_USE_NATIVE = _native.AVAILABLE and os.environ.get("ANYSOLVER_NATIVE_CONTRACTIONS", "1") != "0"
|
|
30
|
+
# The fused element kernels additionally need their own known-answer match
|
|
31
|
+
# (checked at import below); ANYSOLVER_NATIVE_CONTRACTIONS=0 disables both.
|
|
32
|
+
_USE_FUSED = _USE_NATIVE
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _product_parts(a, b):
|
|
36
|
+
if not _isfinite(a) or not _isfinite(b):
|
|
37
|
+
raise ValueError("compensated contraction requires finite inputs")
|
|
38
|
+
product = a * b
|
|
39
|
+
if not _isfinite(product):
|
|
40
|
+
raise OverflowError("compensated product overflow")
|
|
41
|
+
if a == 0.0 or b == 0.0:
|
|
42
|
+
return product, 0.0
|
|
43
|
+
x, ex = _frexp(a)
|
|
44
|
+
y, ey = _frexp(b)
|
|
45
|
+
split = 134217729.0
|
|
46
|
+
cx, cy = split * x, split * y
|
|
47
|
+
xh, yh = cx - (cx - x), cy - (cy - y)
|
|
48
|
+
xl, yl = x - xh, y - yh
|
|
49
|
+
high = x * y
|
|
50
|
+
low = ((xh * yh - high) + xh * yl + xl * yh) + xl * yl
|
|
51
|
+
# In the normal range power-of-two scaling is exact. In the subnormal
|
|
52
|
+
# range the rounded product need not equal a doubly rounded scaled high;
|
|
53
|
+
# the contract allows that lost half-ulp and scaled-low rounding (<= one
|
|
54
|
+
# minimum subnormal together), rather than claiming an exact expansion.
|
|
55
|
+
return product, _ldexp(low, ex + ey)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
_SPLIT = 134217729.0
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _vector_parts(a, b):
|
|
62
|
+
"""Elementwise ``_product_parts`` for finite broadcastable arrays.
|
|
63
|
+
|
|
64
|
+
Same IEEE operations in the same order as the scalar routine, so the
|
|
65
|
+
(product, residual) pairs are bitwise identical. Refuses nonfinite inputs
|
|
66
|
+
and overflowing products with the scalar routine's exceptions.
|
|
67
|
+
"""
|
|
68
|
+
with np.errstate(all="ignore"):
|
|
69
|
+
product = a * b
|
|
70
|
+
if not (np.all(np.isfinite(a)) and np.all(np.isfinite(b))
|
|
71
|
+
and np.all(np.isfinite(product))):
|
|
72
|
+
# Rare error path: reproduce the scalar first-failure semantics.
|
|
73
|
+
for x, y in zip(np.broadcast_to(a, product.shape).ravel().tolist(),
|
|
74
|
+
np.broadcast_to(b, product.shape).ravel().tolist()):
|
|
75
|
+
_product_parts(x, y)
|
|
76
|
+
x, ex = np.frexp(a)
|
|
77
|
+
y, ey = np.frexp(b)
|
|
78
|
+
cx, cy = _SPLIT * x, _SPLIT * y
|
|
79
|
+
xh, yh = cx - (cx - x), cy - (cy - y)
|
|
80
|
+
xl, yl = x - xh, y - yh
|
|
81
|
+
high = x * y
|
|
82
|
+
low = ((xh * yh - high) + xh * yl + xl * yh) + xl * yl
|
|
83
|
+
low = np.ldexp(low, ex + ey)
|
|
84
|
+
low = np.where((a == 0.0) | (b == 0.0), 0.0, low)
|
|
85
|
+
return product, low
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _interleave_sum(product, low):
|
|
89
|
+
"""fsum of ``[p0, l0, p1, l1, ...]`` along the last axis, as the scalar dot."""
|
|
90
|
+
lead = product.shape[:-1]
|
|
91
|
+
count = product.shape[-1]
|
|
92
|
+
parts = np.empty((product.size // max(count, 1), 2 * count), dtype=float)
|
|
93
|
+
parts[:, 0::2] = product.reshape(-1, count)
|
|
94
|
+
parts[:, 1::2] = low.reshape(-1, count)
|
|
95
|
+
values = np.array(list(map(_fsum, parts.tolist())), dtype=float)
|
|
96
|
+
if not np.all(np.isfinite(values)):
|
|
97
|
+
raise OverflowError("compensated sum overflow")
|
|
98
|
+
return values.reshape(lead)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def dot(left, right):
|
|
102
|
+
if len(left) != len(right):
|
|
103
|
+
raise ValueError("compensated dot shape mismatch")
|
|
104
|
+
a = np.array([float(v) for v in left], dtype=float)
|
|
105
|
+
b = np.array([float(v) for v in right], dtype=float)
|
|
106
|
+
if a.size == 0:
|
|
107
|
+
return 0.0
|
|
108
|
+
product, low = _vector_parts(a, b)
|
|
109
|
+
return float(_interleave_sum(product, low))
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def product(left, right):
|
|
113
|
+
"""Matrix/matrix or matrix/vector product; each dot uses the same policy."""
|
|
114
|
+
a, b = np.asarray(left, dtype=float), np.asarray(right, dtype=float)
|
|
115
|
+
if a.ndim != 2 or b.ndim not in (1, 2) or a.shape[1] != b.shape[0]:
|
|
116
|
+
raise ValueError("compensated product shape mismatch")
|
|
117
|
+
vector = b.ndim == 1
|
|
118
|
+
columns = b.reshape((-1, 1)) if vector else b
|
|
119
|
+
if _USE_NATIVE:
|
|
120
|
+
# The kernel refuses nonfinite input itself; any refusal falls through
|
|
121
|
+
# to the checks below, which raise the reference exception.
|
|
122
|
+
native = np.empty((a.shape[0], columns.shape[1]), dtype=float)
|
|
123
|
+
if _native.contract_product(np.ascontiguousarray(a), np.ascontiguousarray(columns),
|
|
124
|
+
native, _native.POW2) == 0:
|
|
125
|
+
return native[:, 0] if vector else native
|
|
126
|
+
if not np.all(np.isfinite(a)) or not np.all(np.isfinite(b)):
|
|
127
|
+
raise ValueError("compensated product requires finite inputs")
|
|
128
|
+
result = np.zeros((a.shape[0], columns.shape[1]), dtype=float)
|
|
129
|
+
# Terms with an all-zero operand slice are exact zeros in every dot and
|
|
130
|
+
# cannot change an exactly rounded sum.
|
|
131
|
+
keep = np.any(a != 0.0, axis=0) & np.any(columns != 0.0, axis=1)
|
|
132
|
+
# Overflow in a pruned term would still be refused by the scalar policy
|
|
133
|
+
# only if both factors were nonzero, so pruning never hides an error.
|
|
134
|
+
if keep.any():
|
|
135
|
+
a, columns = a[:, keep], columns[keep]
|
|
136
|
+
prod, low = _vector_parts(a[:, None, :], columns.T[None, :, :])
|
|
137
|
+
result = _interleave_sum(prod, low)
|
|
138
|
+
return result[:, 0] if vector else result
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def sum_arrays(terms):
|
|
142
|
+
"""Fixed-order componentwise sum of already represented equal-shape terms."""
|
|
143
|
+
arrays = [np.asarray(term, dtype=float) for term in terms]
|
|
144
|
+
if not arrays or any(a.shape != arrays[0].shape for a in arrays):
|
|
145
|
+
raise ValueError("compensated array sum requires equal nonempty shapes")
|
|
146
|
+
shape = arrays[0].shape
|
|
147
|
+
if _USE_NATIVE:
|
|
148
|
+
# contract_sum refuses overflow only; nonfinite input is screened here
|
|
149
|
+
# on the single stacked array instead of once per term.
|
|
150
|
+
stack = np.ascontiguousarray(np.stack(arrays).reshape(len(arrays), -1))
|
|
151
|
+
if np.isfinite(stack).all():
|
|
152
|
+
native = np.empty(stack.shape[1], dtype=float)
|
|
153
|
+
if _native.contract_sum(stack, native) == 0:
|
|
154
|
+
return native.reshape(shape)
|
|
155
|
+
if any(not np.all(np.isfinite(a)) for a in arrays):
|
|
156
|
+
raise ValueError("compensated array sum requires finite inputs")
|
|
157
|
+
rows = np.stack(arrays).reshape(len(arrays), -1).T.tolist()
|
|
158
|
+
result = np.array(list(map(_fsum, rows)), dtype=float).reshape(shape)
|
|
159
|
+
if not np.all(np.isfinite(result)):
|
|
160
|
+
raise OverflowError("compensated array sum overflow")
|
|
161
|
+
return result
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def weighted_sum(terms, weights):
|
|
165
|
+
"""Quadrature reduction including compensation of each weight product."""
|
|
166
|
+
arrays = [np.asarray(term, dtype=float) for term in terms]
|
|
167
|
+
if not arrays or len(arrays) != len(weights) or any(a.shape != arrays[0].shape for a in arrays):
|
|
168
|
+
raise ValueError("compensated weighted sum shape mismatch")
|
|
169
|
+
shape = arrays[0].shape
|
|
170
|
+
try:
|
|
171
|
+
if _USE_NATIVE:
|
|
172
|
+
flat = np.ascontiguousarray(np.stack(arrays).reshape(len(arrays), -1))
|
|
173
|
+
w = np.array([float(v) for v in weights], dtype=float)
|
|
174
|
+
native = np.empty(flat.shape[1], dtype=float)
|
|
175
|
+
if _native.contract_weighted(flat, w, native, _native.POW2) == 0:
|
|
176
|
+
return native.reshape(shape)
|
|
177
|
+
stacked = np.stack(arrays).reshape(len(arrays), -1).T
|
|
178
|
+
w = np.array([float(v) for v in weights], dtype=float)
|
|
179
|
+
prod, low = _vector_parts(stacked, w[None, :])
|
|
180
|
+
return _interleave_sum(prod, low).reshape(shape)
|
|
181
|
+
except (ValueError, OverflowError):
|
|
182
|
+
# Refused input: replay index by index so the first failure (and its
|
|
183
|
+
# exception type) is the one the scalar policy reports.
|
|
184
|
+
result = np.empty(shape, dtype=float)
|
|
185
|
+
for index in np.ndindex(shape):
|
|
186
|
+
result[index] = _scalar_dot([a[index] for a in arrays], weights)
|
|
187
|
+
return result
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _scalar_dot(left, right):
|
|
191
|
+
parts = []
|
|
192
|
+
for a, b in zip(left, right):
|
|
193
|
+
parts.extend(_product_parts(float(a), float(b)))
|
|
194
|
+
result = _fsum(parts)
|
|
195
|
+
if not _isfinite(result):
|
|
196
|
+
raise OverflowError("compensated sum overflow")
|
|
197
|
+
return result
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _shell_zero_tangent_reference(geometry, membrane, bending, shear, drill):
|
|
201
|
+
"""Contract independently supplied elastic coefficients on frozen geometry."""
|
|
202
|
+
terms, weights = [], []
|
|
203
|
+
for bm, bb, bd, weight in zip(geometry["B_m_all"], geometry["B_b_all"],
|
|
204
|
+
geometry["B_d_all"], geometry["detw_all"]):
|
|
205
|
+
terms.append(sum_arrays((product(product(bm.T, membrane), bm),
|
|
206
|
+
product(product(bb.T, bending), bb),
|
|
207
|
+
product(bd.T, drill * bd))))
|
|
208
|
+
weights.append(weight)
|
|
209
|
+
for bs, weight in zip(geometry["B_s_all"], geometry["detw_shear_all"]):
|
|
210
|
+
terms.append(product(product(bs.T, shear), bs))
|
|
211
|
+
weights.append(weight)
|
|
212
|
+
local = weighted_sum(terms, weights)
|
|
213
|
+
transform = geometry["T0"]
|
|
214
|
+
return product(product(transform.T, local), transform)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def _increment(u_elem, geometry, constitutive_factory, tangent, use_kernel):
|
|
218
|
+
"""Elastic von-Karman increment: the reference evaluation order, optionally fused.
|
|
219
|
+
|
|
220
|
+
Order (identical for both routes): read ``T0``; the displacement product
|
|
221
|
+
(its result ``u`` is computed once and reused); one coefficient evaluation;
|
|
222
|
+
only then, at the moment of choosing, the numpy error policy is read and the
|
|
223
|
+
compiled kernel is tried with ``u`` and the cached coefficients. A policy
|
|
224
|
+
that is not default-or-ignore, non-conforming input or any kernel refusal
|
|
225
|
+
falls through to the reference loop below with the same ``u``/coefficients.
|
|
226
|
+
"""
|
|
227
|
+
transform = geometry["T0"]
|
|
228
|
+
u = product(transform, u_elem)
|
|
229
|
+
constitutive = constitutive_factory()
|
|
230
|
+
if use_kernel and _fused_policy_allows():
|
|
231
|
+
fused = _increment_fused(transform, u, geometry, constitutive, tangent)
|
|
232
|
+
if fused is not None:
|
|
233
|
+
return fused
|
|
234
|
+
force = np.zeros(u.size, dtype=float)
|
|
235
|
+
material = np.zeros((u.size, u.size), dtype=float)
|
|
236
|
+
geometric = np.zeros((u.size, u.size), dtype=float)
|
|
237
|
+
forces, materials, geometrics = [], [], []
|
|
238
|
+
weights = []
|
|
239
|
+
for B, G, weight in zip(geometry["B_m_all"], geometry["Gw_all"],
|
|
240
|
+
geometry["detw_all"]):
|
|
241
|
+
theta = product(G, u)
|
|
242
|
+
eta = np.array((0.5 * theta[0]**2, 0.5 * theta[1]**2,
|
|
243
|
+
theta[0] * theta[1]), dtype=float)
|
|
244
|
+
H = np.vstack((theta[0] * G[0], theta[1] * G[1],
|
|
245
|
+
theta[0] * G[1] + theta[1] * G[0]))
|
|
246
|
+
linear_stress = product(constitutive, product(B, u))
|
|
247
|
+
nonlinear_stress = product(constitutive, eta)
|
|
248
|
+
forces.append(sum_arrays((product(B.T, nonlinear_stress),
|
|
249
|
+
product(H.T, linear_stress),
|
|
250
|
+
product(H.T, nonlinear_stress))))
|
|
251
|
+
weights.append(weight)
|
|
252
|
+
if tangent:
|
|
253
|
+
materials.append(sum_arrays((product(product(B.T, constitutive), H),
|
|
254
|
+
product(product(H.T, constitutive), B),
|
|
255
|
+
product(product(H.T, constitutive), H))))
|
|
256
|
+
stress = sum_arrays((linear_stress, nonlinear_stress))
|
|
257
|
+
geometrics.append(sum_arrays((stress[0] * np.outer(G[0], G[0]),
|
|
258
|
+
stress[1] * np.outer(G[1], G[1]),
|
|
259
|
+
stress[2] * np.outer(G[0], G[1]),
|
|
260
|
+
stress[2] * np.outer(G[1], G[0]))))
|
|
261
|
+
if forces:
|
|
262
|
+
force = weighted_sum(forces, weights)
|
|
263
|
+
if tangent and materials:
|
|
264
|
+
material = weighted_sum(materials, weights)
|
|
265
|
+
geometric = weighted_sum(geometrics, weights)
|
|
266
|
+
return (product(transform.T, force), product(product(transform.T, material), transform),
|
|
267
|
+
product(product(transform.T, geometric), transform))
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def elastic_increment_reference(u_elem, geometry, constitutive_factory, tangent):
|
|
271
|
+
"""Reference (numpy-level) elastic von-Karman increment; see vectorized_nonlinear."""
|
|
272
|
+
return _increment(u_elem, geometry, constitutive_factory, tangent, False)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def elastic_increment(u_elem, geometry, constitutive_factory, tangent):
|
|
276
|
+
"""The same increment with the compiled kernel tried after the coefficient evaluation."""
|
|
277
|
+
return _increment(u_elem, geometry, constitutive_factory, tangent, True)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def _fused_array(value, shape_tail):
|
|
281
|
+
"""Writable C float64 array of exactly ``1 + len(shape_tail)`` dims, or ``None``."""
|
|
282
|
+
if (type(value) is not np.ndarray or value.dtype != np.float64
|
|
283
|
+
or value.ndim != len(shape_tail) + 1 or value.shape[1:] != shape_tail):
|
|
284
|
+
return None
|
|
285
|
+
if value.flags.c_contiguous and value.flags.writeable:
|
|
286
|
+
return value
|
|
287
|
+
return np.array(value, dtype=np.float64, order="C")
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
# Exact mapping types the qualified route supplies (frozen geometry is a mappingproxy).
|
|
291
|
+
_GEOMETRY_TYPES = (dict, _MappingProxyType)
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def _fused_matrix(value, shape):
|
|
295
|
+
"""Writable C float64 copy-or-view of an exact ndarray with exactly ``shape``, or ``None``."""
|
|
296
|
+
if type(value) is not np.ndarray or value.dtype != np.float64 or value.shape != shape:
|
|
297
|
+
return None
|
|
298
|
+
if value.flags.c_contiguous and value.flags.writeable:
|
|
299
|
+
return value
|
|
300
|
+
return np.array(value, dtype=np.float64, order="C")
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def _fused_scalar(value):
|
|
304
|
+
if type(value) in (float, np.float64):
|
|
305
|
+
return float(value)
|
|
306
|
+
return None
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def _fused_policy_allows():
|
|
310
|
+
"""Fused kernels run only under numpy's default-or-ignore floating-point policy.
|
|
311
|
+
|
|
312
|
+
The reference performs plain numpy multiplies (e.g. ``drill * bd``) for which
|
|
313
|
+
numpy may warn, raise or call back on underflow; the compiled multiplies
|
|
314
|
+
cannot. Overflow/invalid always make the kernel refuse (the nonfinite value
|
|
315
|
+
reaches a compensated product or sum), so the reference replays and reports
|
|
316
|
+
them itself. Any other policy runs the reference.
|
|
317
|
+
"""
|
|
318
|
+
if not (_USE_NATIVE and _USE_FUSED):
|
|
319
|
+
return False
|
|
320
|
+
policy = np.geterr()
|
|
321
|
+
return (policy["under"] == "ignore"
|
|
322
|
+
and all(policy[kind] in ("ignore", "warn") for kind in ("over", "divide", "invalid")))
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def _zero_tangent_args(geometry, membrane, bending, shear, drill):
|
|
326
|
+
"""Kernel arguments for ``shell_zero_tangent``, or ``None`` for any non-conforming input."""
|
|
327
|
+
try:
|
|
328
|
+
if type(geometry) not in _GEOMETRY_TYPES:
|
|
329
|
+
return None
|
|
330
|
+
t0 = geometry["T0"]
|
|
331
|
+
n = t0.shape[0] if type(t0) is np.ndarray and t0.ndim == 2 else -1
|
|
332
|
+
if n <= 0:
|
|
333
|
+
return None
|
|
334
|
+
arrays = (_fused_array(geometry["B_m_all"], (3, n)), _fused_array(geometry["B_b_all"], (3, n)),
|
|
335
|
+
_fused_array(geometry["B_d_all"], (1, n)), _fused_array(geometry["detw_all"], ()),
|
|
336
|
+
_fused_array(geometry["B_s_all"], (2, n)), _fused_array(geometry["detw_shear_all"], ()),
|
|
337
|
+
_fused_matrix(t0, (n, n)), _fused_matrix(membrane, (3, 3)),
|
|
338
|
+
_fused_matrix(bending, (3, 3)), _fused_matrix(shear, (2, 2)))
|
|
339
|
+
drill_value = _fused_scalar(drill)
|
|
340
|
+
if (drill_value is None or any(a is None for a in arrays)
|
|
341
|
+
or not len(arrays[0]) == len(arrays[1]) == len(arrays[2]) == len(arrays[3])
|
|
342
|
+
or len(arrays[4]) != len(arrays[5]) or len(arrays[0]) + len(arrays[4]) == 0):
|
|
343
|
+
return None
|
|
344
|
+
return (arrays[0], arrays[1], arrays[2], arrays[3], arrays[4], arrays[5],
|
|
345
|
+
arrays[6], arrays[7], arrays[8], arrays[9], drill_value)
|
|
346
|
+
except Exception: # noqa: BLE001 - anything unexpected is the reference's to report
|
|
347
|
+
return None
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def _zero_tangent_fused(geometry, membrane, bending, shear, drill):
|
|
351
|
+
"""Run the compiled kernel; ``None`` when not applicable or refused."""
|
|
352
|
+
args = _zero_tangent_args(geometry, membrane, bending, shear, drill)
|
|
353
|
+
if args is None:
|
|
354
|
+
return None
|
|
355
|
+
out = np.empty((args[6].shape[0],) * 2, dtype=np.float64)
|
|
356
|
+
if _native.fused_shell_zero_tangent(*args, out, _native.POW2) != 0:
|
|
357
|
+
return None
|
|
358
|
+
return out
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def shell_zero_tangent(geometry, membrane, bending, shear, drill):
|
|
362
|
+
"""Contract independently supplied elastic coefficients on frozen geometry.
|
|
363
|
+
|
|
364
|
+
One compiled call per element when the inputs have the expected float64
|
|
365
|
+
layout; anything else, or any refusal, runs the reference implementation.
|
|
366
|
+
"""
|
|
367
|
+
if _fused_policy_allows():
|
|
368
|
+
fused = _zero_tangent_fused(geometry, membrane, bending, shear, drill)
|
|
369
|
+
if fused is not None:
|
|
370
|
+
return fused
|
|
371
|
+
return _shell_zero_tangent_reference(geometry, membrane, bending, shear, drill)
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def _increment_fused(transform, u, geometry, constitutive, tangent):
|
|
375
|
+
"""Run the compiled increment kernel on the already computed ``u``; ``None`` if not applicable."""
|
|
376
|
+
try:
|
|
377
|
+
if type(geometry) not in _GEOMETRY_TYPES or type(tangent) is not bool:
|
|
378
|
+
return None
|
|
379
|
+
n = transform.shape[0] if type(transform) is np.ndarray and transform.ndim == 2 else -1
|
|
380
|
+
if n <= 0:
|
|
381
|
+
return None
|
|
382
|
+
arrays = (_fused_matrix(transform, (n, n)), _fused_matrix(u, (n,)),
|
|
383
|
+
_fused_matrix(constitutive, (3, 3)), _fused_array(geometry["B_m_all"], (3, n)),
|
|
384
|
+
_fused_array(geometry["Gw_all"], (2, n)), _fused_array(geometry["detw_all"], ()))
|
|
385
|
+
if (any(a is None for a in arrays)
|
|
386
|
+
or not len(arrays[3]) == len(arrays[4]) == len(arrays[5]) > 0):
|
|
387
|
+
return None
|
|
388
|
+
except Exception: # noqa: BLE001 - anything unexpected is the reference's to report
|
|
389
|
+
return None
|
|
390
|
+
force = np.empty(n, dtype=np.float64)
|
|
391
|
+
material = np.zeros((n, n), dtype=np.float64)
|
|
392
|
+
geometric = np.zeros((n, n), dtype=np.float64)
|
|
393
|
+
if _native.fused_elastic_increment(
|
|
394
|
+
arrays[0], arrays[1], arrays[2], arrays[3], arrays[4], arrays[5], tangent,
|
|
395
|
+
force, material, geometric, _native.POW2, 2.0) != 0:
|
|
396
|
+
return None
|
|
397
|
+
return force, material, geometric
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def _native_known_answers_match():
|
|
401
|
+
"""Disable the compiled kernels unless they reproduce the numpy path bitwise."""
|
|
402
|
+
global _USE_NATIVE
|
|
403
|
+
if not _USE_NATIVE:
|
|
404
|
+
return
|
|
405
|
+
rng = np.random.default_rng(20261022)
|
|
406
|
+
a = rng.standard_normal((7, 9)) * 2.0 ** rng.integers(-40, 40, (7, 9))
|
|
407
|
+
b = rng.standard_normal((9, 6)) * 2.0 ** rng.integers(-40, 40, (9, 6))
|
|
408
|
+
stack = rng.standard_normal((5, 11)) * 2.0 ** rng.integers(-40, 40, (5, 11)) * 1e8
|
|
409
|
+
stack[1] = -stack[0] * (1.0 + 2.0 ** -40)
|
|
410
|
+
weights = rng.standard_normal(5)
|
|
411
|
+
results = []
|
|
412
|
+
for use in (True, False):
|
|
413
|
+
_USE_NATIVE = use
|
|
414
|
+
try:
|
|
415
|
+
results.append((product(a, b).tobytes(), sum_arrays(list(stack)).tobytes(),
|
|
416
|
+
weighted_sum(list(stack), weights).tobytes()))
|
|
417
|
+
except Exception: # noqa: BLE001 - any failure disables the kernels
|
|
418
|
+
results.append(None)
|
|
419
|
+
_USE_NATIVE = results[0] is not None and results[0] == results[1]
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
_native_known_answers_match()
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def _fused_cases():
|
|
426
|
+
"""Deterministic known-answer inputs (also exercised by the tests)."""
|
|
427
|
+
rng = np.random.default_rng(20261023)
|
|
428
|
+
for case in range(3):
|
|
429
|
+
n, ng, ns = 24, 4, 4
|
|
430
|
+
scale = (1.0, 2.0 ** 20, 2.0 ** -30)[case]
|
|
431
|
+
|
|
432
|
+
def rnd(*shape):
|
|
433
|
+
return rng.standard_normal(shape) * 2.0 ** rng.integers(-3, 4, shape) * scale
|
|
434
|
+
|
|
435
|
+
geometry = {"B_m_all": rnd(ng, 3, n), "B_b_all": rnd(ng, 3, n), "B_d_all": rnd(ng, 1, n),
|
|
436
|
+
"Gw_all": rnd(ng, 2, n), "B_s_all": rnd(ns, 2, n), "T0": rnd(n, n),
|
|
437
|
+
"detw_all": np.abs(rnd(ng)) + 0.1, "detw_shear_all": np.abs(rnd(ns)) + 0.1}
|
|
438
|
+
yield (geometry, rnd(3, 3), rnd(3, 3), rnd(2, 2), float(rnd(1)[0]),
|
|
439
|
+
rnd(n) * 1e-2, rnd(3, 3) * 1e3)
|
|
440
|
+
# Squares where libm pow differs from x * x: for identity-like Gw rows theta
|
|
441
|
+
# equals u exactly, so the kernel's scalar square is exercised on them.
|
|
442
|
+
hits = [float(v) for v in np.random.default_rng(7).uniform(1.0, 2.0, 60000)
|
|
443
|
+
if np.float64(v) ** 2 != v * v][:4]
|
|
444
|
+
n = 6
|
|
445
|
+
geometry = {"B_m_all": np.ones((1, 3, n)), "B_b_all": np.ones((1, 3, n)), "B_d_all": np.ones((1, 1, n)),
|
|
446
|
+
"Gw_all": np.zeros((1, 2, n)), "B_s_all": np.ones((1, 2, n)), "T0": np.eye(n),
|
|
447
|
+
"detw_all": np.ones(1), "detw_shear_all": np.ones(1)}
|
|
448
|
+
geometry["Gw_all"][0, 0, 0] = geometry["Gw_all"][0, 1, 1] = 1.0
|
|
449
|
+
for x in hits or [1.5]:
|
|
450
|
+
u = np.zeros(n)
|
|
451
|
+
u[0], u[1] = x, x
|
|
452
|
+
yield geometry, np.eye(3), np.eye(3), np.eye(2), 0.5, u, np.eye(3) * 1e3
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def _fused_check(zero_kernel, increment_kernel):
|
|
456
|
+
"""True iff the given compiled kernels reproduce the reference bitwise *and run*.
|
|
457
|
+
|
|
458
|
+
Calls the kernels directly (never the fallback-capable wrappers), so a
|
|
459
|
+
kernel that always refuses fails the check.
|
|
460
|
+
"""
|
|
461
|
+
try:
|
|
462
|
+
for geometry, membrane, bending, shear, drill, u_elem, constitutive in _fused_cases():
|
|
463
|
+
args = _zero_tangent_args(geometry, membrane, bending, shear, drill)
|
|
464
|
+
if args is None:
|
|
465
|
+
return False
|
|
466
|
+
out = np.empty((args[6].shape[0],) * 2)
|
|
467
|
+
if zero_kernel(*args, out, _native.POW2) != 0:
|
|
468
|
+
return False
|
|
469
|
+
if out.tobytes() != _shell_zero_tangent_reference(
|
|
470
|
+
geometry, membrane, bending, shear, drill).tobytes():
|
|
471
|
+
return False
|
|
472
|
+
u = product(geometry["T0"], u_elem)
|
|
473
|
+
for tangent in (True, False):
|
|
474
|
+
n = geometry["T0"].shape[0]
|
|
475
|
+
f, m, g = np.empty(n), np.zeros((n, n)), np.zeros((n, n))
|
|
476
|
+
if increment_kernel(geometry["T0"], u, constitutive, geometry["B_m_all"],
|
|
477
|
+
geometry["Gw_all"], geometry["detw_all"], tangent,
|
|
478
|
+
f, m, g, _native.POW2, 2.0) != 0:
|
|
479
|
+
return False
|
|
480
|
+
ref = elastic_increment_reference(u_elem, geometry, lambda: constitutive, tangent)
|
|
481
|
+
if any(x.tobytes() != y.tobytes() for x, y in zip((f, m, g), ref)):
|
|
482
|
+
return False
|
|
483
|
+
return True
|
|
484
|
+
except Exception: # noqa: BLE001 - any failure disables the fused kernels
|
|
485
|
+
return False
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
def _fused_known_answers_match():
|
|
489
|
+
"""Disable the fused element kernels unless they reproduce the reference bitwise."""
|
|
490
|
+
global _USE_FUSED
|
|
491
|
+
if not _USE_FUSED:
|
|
492
|
+
return
|
|
493
|
+
with np.errstate(all="ignore"):
|
|
494
|
+
_USE_FUSED = _fused_check(_native.fused_shell_zero_tangent, _native.fused_elastic_increment)
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
_fused_known_answers_match()
|