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,707 @@
|
|
|
1
|
+
"""Experimental straight-reference B2 elastic force-flexibility operator.
|
|
2
|
+
|
|
3
|
+
This local operator makes no qualification claim. Its reference-linear consumers
|
|
4
|
+
admit operations separately. Coordinates are local [u,v,w,rx,ry,rz] at each node;
|
|
5
|
+
section resultants/strains are [N,Vy,Vz,T,My,Mz]. Exact rational arithmetic
|
|
6
|
+
retains weak shear modes until the requested binary64 output is rounded.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from fractions import Fraction
|
|
11
|
+
import math
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
OPERATOR_ID = "B2_PHYSICAL_FLEXIBILITY_LINEAR_V1"
|
|
17
|
+
OUTPUT_REPRESENTATION_ID = "B2_BOUNDED_OUTPUT_REPRESENTATION_V1"
|
|
18
|
+
_ENERGY_LIMIT = Fraction(1, 10**8)
|
|
19
|
+
_RIGID_LIMIT = Fraction(1, 10**9)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class RepresentabilityError(ValueError):
|
|
23
|
+
"""A nonzero physical result cannot be represented in binary64."""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ConditioningAdmissionError(ValueError):
|
|
27
|
+
"""Local numerical output cannot meet its declared representation limits."""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True)
|
|
31
|
+
class OutputRepresentationCertificate:
|
|
32
|
+
"""Basic energies and separate bounded rigid/cross work, not graph stability.
|
|
33
|
+
|
|
34
|
+
Errors are exact rational ratios. This certifies rounding of the implemented
|
|
35
|
+
law, whose physical correctness still needs independent mechanics oracles.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
basic_energy_preserved: bool
|
|
39
|
+
rigid_work_preserved: bool
|
|
40
|
+
cross_work_preserved: bool
|
|
41
|
+
rigid_wrench_error: Fraction
|
|
42
|
+
rigid_work_error: Fraction
|
|
43
|
+
cross_work_error: Fraction
|
|
44
|
+
identity: str = OUTPUT_REPRESENTATION_ID
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def passed(self):
|
|
48
|
+
return (self.basic_energy_preserved and self.rigid_work_preserved and
|
|
49
|
+
self.cross_work_preserved)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class OutputRepresentationError(ConditioningAdmissionError):
|
|
53
|
+
"""The emitted binary64 tangent failed its bounded local work certificate."""
|
|
54
|
+
|
|
55
|
+
def __init__(self, certificate):
|
|
56
|
+
self.certificate = certificate
|
|
57
|
+
failed = [name for name, passed in (
|
|
58
|
+
("basic energy", certificate.basic_energy_preserved),
|
|
59
|
+
("rigid work", certificate.rigid_work_preserved),
|
|
60
|
+
("cross work", certificate.cross_work_preserved)) if not passed]
|
|
61
|
+
super().__init__("physical B2 tangent output representation failed: " +
|
|
62
|
+
", ".join(failed))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _positive(value):
|
|
66
|
+
if type(value) not in (int, float) or not math.isfinite(value) or value <= 0:
|
|
67
|
+
raise ValueError("positive finite nonboolean physical input required")
|
|
68
|
+
return Fraction(float(value))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _float(value):
|
|
72
|
+
try:
|
|
73
|
+
result = float(value)
|
|
74
|
+
except OverflowError as exc:
|
|
75
|
+
raise RepresentabilityError("physical B2 output overflow") from exc
|
|
76
|
+
if not math.isfinite(result) or (value != 0 and result == 0):
|
|
77
|
+
raise RepresentabilityError("physical B2 output overflow or underflow")
|
|
78
|
+
# A nonzero subnormal can still be a poor representation of an exact
|
|
79
|
+
# physical result. Compare as rationals so the check itself does not
|
|
80
|
+
# underflow or round away the error. Normal binary64 rounding satisfies
|
|
81
|
+
# this bound. This checks the declared numerical output units (public
|
|
82
|
+
# physical definitions use SI); it is not a physical or unit-covariant
|
|
83
|
+
# constitutive tolerance near binary64 underflow.
|
|
84
|
+
if value != 0:
|
|
85
|
+
exact = Fraction(value)
|
|
86
|
+
if abs(Fraction(result) - exact) > abs(exact) / (1 << 52):
|
|
87
|
+
raise RepresentabilityError("physical B2 output loses binary64 relative precision")
|
|
88
|
+
return result
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _array(value):
|
|
92
|
+
array = np.asarray(value, dtype=object)
|
|
93
|
+
return np.array([_float(item) for item in array.flat], dtype=float).reshape(array.shape)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _inverse_spd(matrix):
|
|
97
|
+
"""Exact LDL and inverse of the supplied law; no floating pivot heuristic.
|
|
98
|
+
|
|
99
|
+
SPD is an input-law check. Emitted numerical tangents receive a separate
|
|
100
|
+
output certificate, and assembled solves retain their equilibrium checks.
|
|
101
|
+
"""
|
|
102
|
+
n = len(matrix)
|
|
103
|
+
diagonal = [matrix[i][i] for i in range(n)]
|
|
104
|
+
if any(d <= 0 for d in diagonal):
|
|
105
|
+
raise ValueError("positive-definite physical section/flexibility required")
|
|
106
|
+
lower = [[Fraction(int(i == j)) for j in range(n)] for i in range(n)]
|
|
107
|
+
pivots = []
|
|
108
|
+
for j in range(n):
|
|
109
|
+
pivot = matrix[j][j] - sum(lower[j][k]**2 * pivots[k] for k in range(j))
|
|
110
|
+
if pivot <= 0:
|
|
111
|
+
raise ValueError("positive-definite physical section/flexibility required")
|
|
112
|
+
pivots.append(pivot)
|
|
113
|
+
for i in range(j + 1, n):
|
|
114
|
+
lower[i][j] = (matrix[i][j] - sum(
|
|
115
|
+
lower[i][k] * pivots[k] * lower[j][k] for k in range(j)
|
|
116
|
+
)) / pivot
|
|
117
|
+
columns = []
|
|
118
|
+
for column in range(n):
|
|
119
|
+
y = []
|
|
120
|
+
for i in range(n):
|
|
121
|
+
y.append(Fraction(int(i == column)) - sum(lower[i][k] * y[k] for k in range(i)))
|
|
122
|
+
z = [y[i] / pivots[i] for i in range(n)]
|
|
123
|
+
x = [Fraction(0)] * n
|
|
124
|
+
for i in range(n - 1, -1, -1):
|
|
125
|
+
x[i] = z[i] - sum(lower[k][i] * x[k] for k in range(i + 1, n))
|
|
126
|
+
columns.append(x)
|
|
127
|
+
return [[columns[j][i] for j in range(n)] for i in range(n)]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _basic(length):
|
|
131
|
+
B = [[Fraction(0) for _ in range(12)] for _ in range(6)]
|
|
132
|
+
B[0][0], B[0][6] = -1, 1
|
|
133
|
+
B[1][3], B[1][9] = -1, 1
|
|
134
|
+
for row, rotation in ((2, 4), (3, 10)):
|
|
135
|
+
B[row][2], B[row][8], B[row][rotation] = -1 / length, 1 / length, 1
|
|
136
|
+
for row, rotation in ((4, 5), (5, 11)):
|
|
137
|
+
B[row][1], B[row][7], B[row][rotation] = 1 / length, -1 / length, 1
|
|
138
|
+
return B
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _interpolation(length, station):
|
|
142
|
+
t = station / length
|
|
143
|
+
H = [[Fraction(0) for _ in range(6)] for _ in range(6)]
|
|
144
|
+
H[0][0] = H[3][1] = 1
|
|
145
|
+
H[2][2] = H[2][3] = 1 / length
|
|
146
|
+
H[4][2], H[4][3] = t - 1, t
|
|
147
|
+
H[1][4] = H[1][5] = -1 / length
|
|
148
|
+
H[5][4], H[5][5] = t - 1, t
|
|
149
|
+
return H
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _multiply(matrix, vector):
|
|
153
|
+
return [sum(a * b for a, b in zip(row, vector)) for row in matrix]
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _transpose(matrix):
|
|
157
|
+
return list(map(list, zip(*matrix)))
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _matmul(a, b):
|
|
161
|
+
return [[sum((x*y for x, y in zip(row, column)), Fraction(0))
|
|
162
|
+
for column in zip(*b)] for row in a]
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _positive_semidefinite(matrix):
|
|
166
|
+
"""Exact symmetric Schur test; zero pivots require a zero residual column."""
|
|
167
|
+
work = [list(row) for row in matrix]
|
|
168
|
+
if work != _transpose(work):
|
|
169
|
+
raise ValueError("symmetric physical work certificate required")
|
|
170
|
+
for j in range(len(work)):
|
|
171
|
+
pivot = work[j][j]
|
|
172
|
+
if pivot < 0:
|
|
173
|
+
return False
|
|
174
|
+
if not pivot:
|
|
175
|
+
if any(work[i][j] for i in range(j+1, len(work))):
|
|
176
|
+
return False
|
|
177
|
+
continue
|
|
178
|
+
for i in range(j+1, len(work)):
|
|
179
|
+
for k in range(j+1, len(work)):
|
|
180
|
+
work[i][k] -= work[i][j]*work[j][k]/pivot
|
|
181
|
+
return True
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _nodal_tangent(operator):
|
|
185
|
+
# One exact action per nodal column; all returned coefficients retain the
|
|
186
|
+
# previous exact formulas before binary64 rounding.
|
|
187
|
+
columns = [operator._basic_action([row[column] for row in operator._B])
|
|
188
|
+
for column in range(12)]
|
|
189
|
+
return tuple(tuple(_float(sum(operator._B[j][i]*columns[column][j]
|
|
190
|
+
for j in range(6)))
|
|
191
|
+
for column in range(12)) for i in range(12))
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _certify_output_tangent(operator, tangent):
|
|
195
|
+
"""Certify the emitted tangent with the reviewed bounded physical norms.
|
|
196
|
+
|
|
197
|
+
The basic-energy inequalities hold for all basic directions. Separate rigid
|
|
198
|
+
and cross limits apply to normalized amplitude cubes, not an all-amplitude
|
|
199
|
+
relative energy bound or one combined total-energy estimate. No matrix is
|
|
200
|
+
symmetrized. Assembled graph/affine solve checks remain mandatory.
|
|
201
|
+
"""
|
|
202
|
+
emitted = np.asarray(tangent, dtype=float)
|
|
203
|
+
if (emitted.shape != (12, 12) or not np.isfinite(emitted).all() or
|
|
204
|
+
not np.array_equal(emitted, emitted.T)):
|
|
205
|
+
raise RepresentabilityError("finite symmetric physical B2 tangent required")
|
|
206
|
+
length = operator.length
|
|
207
|
+
B = operator._B
|
|
208
|
+
A = _transpose([operator._basic_action(
|
|
209
|
+
[Fraction(i == j) for i in range(6)]) for j in range(6)])
|
|
210
|
+
# Canonical right inverse: first node fixed, B[:, 6:] inverted exactly.
|
|
211
|
+
R = [[Fraction(0)]*6 for _ in range(12)]
|
|
212
|
+
R[6][0] = R[9][1] = 1
|
|
213
|
+
R[8][2], R[10][2], R[10][3] = length, -1, 1
|
|
214
|
+
R[7][4], R[11][4], R[11][5] = -length, -1, 1
|
|
215
|
+
if _matmul(B, R) != [[Fraction(i == j) for j in range(6)] for i in range(6)]:
|
|
216
|
+
raise RuntimeError("physical B2 basic/right-inverse contract mismatch")
|
|
217
|
+
Z = [[Fraction(0)]*6 for _ in range(12)]
|
|
218
|
+
for end, x in ((0, -length/2), (6, length/2)):
|
|
219
|
+
for axis in range(3):
|
|
220
|
+
Z[end+axis][axis] = length
|
|
221
|
+
Z[end+3+axis][3+axis] = 1
|
|
222
|
+
Z[end+2][4], Z[end+1][5] = -x, x
|
|
223
|
+
if any(v for row in _matmul(B, Z) for v in row):
|
|
224
|
+
raise RuntimeError("physical B2 basic/rigid-kernel contract mismatch")
|
|
225
|
+
K = [[Fraction(float(v)) for v in row] for row in emitted]
|
|
226
|
+
pulled = _matmul(_matmul(_transpose(R), K), R)
|
|
227
|
+
delta = [[pulled[i][j]-A[i][j] for j in range(6)] for i in range(6)]
|
|
228
|
+
energy_ok = all(_positive_semidefinite([
|
|
229
|
+
[_ENERGY_LIMIT*A[i][j]+sign*delta[i][j] for j in range(6)]
|
|
230
|
+
for i in range(6)]) for sign in (-1, 1))
|
|
231
|
+
S = operator._stiffness
|
|
232
|
+
force = max([S[i][i] for i in range(3)] +
|
|
233
|
+
[S[i][i]/length**2 for i in range(3, 6)])
|
|
234
|
+
energy = force*length
|
|
235
|
+
wrench_scales = [force]*3+[force*length]*3
|
|
236
|
+
KZ = _matmul(K, Z)
|
|
237
|
+
rigid_wrench = max(sum(abs(v) for v in row)/wrench_scales[i % 6]
|
|
238
|
+
for i, row in enumerate(KZ))
|
|
239
|
+
rigid_work = sum(abs(v) for row in _matmul(_transpose(Z), KZ)
|
|
240
|
+
for v in row)/energy
|
|
241
|
+
R_scaled = [[v*(length if j == 0 else 1) for j, v in enumerate(row)]
|
|
242
|
+
for row in R]
|
|
243
|
+
cross_work = sum(abs(v) for row in _matmul(
|
|
244
|
+
_matmul(_transpose(Z), K), R_scaled) for v in row)/energy
|
|
245
|
+
certificate = OutputRepresentationCertificate(
|
|
246
|
+
energy_ok, rigid_wrench <= _RIGID_LIMIT and rigid_work <= _ENERGY_LIMIT,
|
|
247
|
+
cross_work <= _ENERGY_LIMIT, rigid_wrench, rigid_work, cross_work)
|
|
248
|
+
if not certificate.passed:
|
|
249
|
+
raise OutputRepresentationError(certificate)
|
|
250
|
+
return certificate
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def _flexibility(length, compliance):
|
|
254
|
+
# H(t) is affine: the exact integral uses endpoint values and their cross terms.
|
|
255
|
+
h0, h1 = _interpolation(length, Fraction(0)), _interpolation(length, length)
|
|
256
|
+
result = [[Fraction(0) for _ in range(6)] for _ in range(6)]
|
|
257
|
+
for i in range(6):
|
|
258
|
+
for j in range(6):
|
|
259
|
+
result[i][j] = length * sum(
|
|
260
|
+
compliance[a][b] * (
|
|
261
|
+
h0[a][i]*h0[b][j]*Fraction(1, 3)
|
|
262
|
+
+ h1[a][i]*h1[b][j]*Fraction(1, 3)
|
|
263
|
+
+ (h0[a][i]*h1[b][j] + h1[a][i]*h0[b][j])*Fraction(1, 6)
|
|
264
|
+
) for a in range(6) for b in range(6)
|
|
265
|
+
)
|
|
266
|
+
return result
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def _separated_basic_inverse(length, flexibility):
|
|
270
|
+
"""Invert in a fixed midpoint shear/moment basis, return original q rows.
|
|
271
|
+
|
|
272
|
+
The exact congruence changes only the inversion coordinates. Section
|
|
273
|
+
resultants, basic displacements and station traces retain their original
|
|
274
|
+
physical conventions.
|
|
275
|
+
"""
|
|
276
|
+
change = [[Fraction(0) for _ in range(6)] for _ in range(6)]
|
|
277
|
+
change[0][0], change[1][1] = 1, length
|
|
278
|
+
change[2][2] = change[3][2] = length/2
|
|
279
|
+
change[2][3], change[3][3] = -length, length
|
|
280
|
+
change[4][4] = change[5][4] = -length/2
|
|
281
|
+
change[4][5], change[5][5] = -length, length
|
|
282
|
+
separated = [[sum(change[a][i]*flexibility[a][b]*change[b][j]
|
|
283
|
+
for a in range(6) for b in range(6))
|
|
284
|
+
for j in range(6)] for i in range(6)]
|
|
285
|
+
inverse = _inverse_spd(separated)
|
|
286
|
+
return [[sum(change[i][a]*inverse[a][b]*change[j][b]
|
|
287
|
+
for a in range(6) for b in range(6))
|
|
288
|
+
for j in range(6)] for i in range(6)]
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
@dataclass(frozen=True)
|
|
292
|
+
class LinearSection:
|
|
293
|
+
stiffness: tuple[tuple[float, ...], ...]
|
|
294
|
+
kind: str
|
|
295
|
+
operator_id: str = OPERATOR_ID
|
|
296
|
+
# E, nu, area, Iy, Iz, J, ky, kz; absent for a generalized 6x6 law.
|
|
297
|
+
scalar_parameters: tuple[float, ...] | None = None
|
|
298
|
+
|
|
299
|
+
def __post_init__(self):
|
|
300
|
+
if self.operator_id != OPERATOR_ID or self.kind not in ("isotropic_scalar", "elastic_generalized"):
|
|
301
|
+
raise ValueError("explicit physical linear B2 section identity required")
|
|
302
|
+
try:
|
|
303
|
+
data = np.asarray(self.stiffness, dtype=float)
|
|
304
|
+
except (TypeError, ValueError) as exc:
|
|
305
|
+
raise ValueError("finite 6x6 physical section required") from exc
|
|
306
|
+
if data.shape != (6, 6) or not np.isfinite(data).all() or not np.array_equal(data, data.T):
|
|
307
|
+
raise ValueError("finite symmetric 6x6 physical section required")
|
|
308
|
+
if self.kind == "isotropic_scalar" and np.count_nonzero(data - np.diag(np.diag(data))):
|
|
309
|
+
raise ValueError("isotropic scalar section cannot contain coupling")
|
|
310
|
+
if self.kind == "isotropic_scalar":
|
|
311
|
+
values = self.scalar_parameters
|
|
312
|
+
if values is None or len(values) != 8:
|
|
313
|
+
raise ValueError("isotropic scalar source parameters required")
|
|
314
|
+
E, nu, area, Iy, Iz, J, ky, kz = values
|
|
315
|
+
e, a, iy, iz, j, y, z = map(_positive, (E, area, Iy, Iz, J, ky, kz))
|
|
316
|
+
if type(nu) not in (int, float) or not math.isfinite(nu) or not -1 < nu < .5:
|
|
317
|
+
raise ValueError("physical isotropic Poisson ratio required")
|
|
318
|
+
g = e / (2 * (1 + Fraction(float(nu))))
|
|
319
|
+
expected = [_float(value) for value in
|
|
320
|
+
(e*a, g*a*y, g*a*z, g*j, e*iy, e*iz)]
|
|
321
|
+
if not np.array_equal(np.diag(data), expected):
|
|
322
|
+
raise ValueError("scalar stiffness does not match source parameters")
|
|
323
|
+
object.__setattr__(self, "scalar_parameters", tuple(float(v) for v in values))
|
|
324
|
+
elif self.scalar_parameters is not None:
|
|
325
|
+
raise ValueError("generalized stiffness has no scalar source parameters")
|
|
326
|
+
_inverse_spd([[Fraction(v) for v in row] for row in data])
|
|
327
|
+
# Own the descriptor even when a caller supplied mutable nested lists.
|
|
328
|
+
object.__setattr__(self, "stiffness", tuple(tuple(float(v) for v in row) for row in data))
|
|
329
|
+
|
|
330
|
+
@classmethod
|
|
331
|
+
def isotropic(cls, *, E, nu, area, Iy, Iz, J, ky, kz):
|
|
332
|
+
e, a, iy, iz, j, y, z = map(_positive, (E, area, Iy, Iz, J, ky, kz))
|
|
333
|
+
if type(nu) not in (int, float) or not math.isfinite(nu) or not -1 < nu < .5:
|
|
334
|
+
raise ValueError("physical isotropic Poisson ratio required")
|
|
335
|
+
g = e / (2 * (1 + Fraction(float(nu))))
|
|
336
|
+
values = [e*a, g*a*y, g*a*z, g*j, e*iy, e*iz]
|
|
337
|
+
# Do not hide unrepresentable physical section data behind a floor.
|
|
338
|
+
diagonal = [_float(value) for value in values]
|
|
339
|
+
return cls(tuple(tuple(diagonal[i] if i == j else 0.0 for j in range(6))
|
|
340
|
+
for i in range(6)), "isotropic_scalar",
|
|
341
|
+
scalar_parameters=(E, nu, area, Iy, Iz, J, ky, kz))
|
|
342
|
+
|
|
343
|
+
@classmethod
|
|
344
|
+
def generalized(cls, stiffness):
|
|
345
|
+
try:
|
|
346
|
+
data = np.asarray(stiffness, dtype=float)
|
|
347
|
+
except (TypeError, ValueError) as exc:
|
|
348
|
+
raise ValueError("finite 6x6 generalized section required") from exc
|
|
349
|
+
if data.shape != (6, 6) or not np.isfinite(data).all() or not np.array_equal(data, data.T):
|
|
350
|
+
raise ValueError("finite symmetric 6x6 generalized section required")
|
|
351
|
+
return cls(tuple(tuple(float(v) for v in row) for row in data), "elastic_generalized")
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
@dataclass(frozen=True)
|
|
355
|
+
class LocalResponse:
|
|
356
|
+
energy: float
|
|
357
|
+
force: np.ndarray
|
|
358
|
+
tangent: np.ndarray
|
|
359
|
+
basic_force: np.ndarray
|
|
360
|
+
resultants: np.ndarray
|
|
361
|
+
strains: np.ndarray
|
|
362
|
+
stations: np.ndarray
|
|
363
|
+
operator_id: str = OPERATOR_ID
|
|
364
|
+
production_qualified: bool = False
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
@dataclass(frozen=True)
|
|
368
|
+
class LocalSectionRecovery:
|
|
369
|
+
"""Selected station quantities without a force/tangent evaluation."""
|
|
370
|
+
|
|
371
|
+
resultants: np.ndarray
|
|
372
|
+
strains: np.ndarray
|
|
373
|
+
stations: np.ndarray
|
|
374
|
+
operator_id: str = OPERATOR_ID
|
|
375
|
+
production_qualified: bool = False
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
@dataclass(frozen=True)
|
|
379
|
+
class EquilibratedSectionRecovery:
|
|
380
|
+
"""Static admissible fields, distinct from the nodal interpolation strain.
|
|
381
|
+
|
|
382
|
+
Interior concentrated actions have explicit left/right traces. At member
|
|
383
|
+
endpoints both columns are the inward trace. No loaded interior pose or
|
|
384
|
+
attachment compatibility is implied by these reconstructed fields.
|
|
385
|
+
"""
|
|
386
|
+
|
|
387
|
+
stations: np.ndarray
|
|
388
|
+
resultants_left: np.ndarray
|
|
389
|
+
resultants_right: np.ndarray
|
|
390
|
+
strains_left: np.ndarray
|
|
391
|
+
strains_right: np.ndarray
|
|
392
|
+
endpoint_tractions: np.ndarray
|
|
393
|
+
operator_id: str = OPERATOR_ID
|
|
394
|
+
production_qualified: bool = False
|
|
395
|
+
|
|
396
|
+
def __post_init__(self):
|
|
397
|
+
n = len(self.stations)
|
|
398
|
+
for name, shape in (("stations", (n,)), ("resultants_left", (n, 6)),
|
|
399
|
+
("resultants_right", (n, 6)), ("strains_left", (n, 6)),
|
|
400
|
+
("strains_right", (n, 6)), ("endpoint_tractions", (12,))):
|
|
401
|
+
value = np.asarray(getattr(self, name), dtype=float)
|
|
402
|
+
if value.shape != shape or not np.isfinite(value).all():
|
|
403
|
+
raise RepresentabilityError("equilibrated section field is not representable")
|
|
404
|
+
object.__setattr__(self, name, np.frombuffer(value.tobytes(), dtype=float).reshape(shape))
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
@dataclass(frozen=True)
|
|
408
|
+
class LinearTrace:
|
|
409
|
+
"""Owned local reference points, offset poses, and their nodal derivatives."""
|
|
410
|
+
|
|
411
|
+
stations: np.ndarray
|
|
412
|
+
reference_points: np.ndarray
|
|
413
|
+
pose: np.ndarray
|
|
414
|
+
jacobian: np.ndarray
|
|
415
|
+
operator_id: str = OPERATOR_ID
|
|
416
|
+
production_qualified: bool = False
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def _pose_polynomials(length, e0, e1, nodal):
|
|
420
|
+
"""Exact coefficients in normalized station t, ordered [u,v,w,rx,ry,rz]."""
|
|
421
|
+
zero = Fraction(0)
|
|
422
|
+
result = [[zero]*4 for _ in range(6)]
|
|
423
|
+
result[0] = [nodal[0], length*e0[0], length*e1[0]/2, zero]
|
|
424
|
+
for row, strain in ((3, 3), (4, 4), (5, 5)):
|
|
425
|
+
result[row] = [nodal[row], length*e0[strain], length*e1[strain]/2, zero]
|
|
426
|
+
result[1] = [nodal[1], length*(e0[1]+nodal[5]),
|
|
427
|
+
length*(e1[1]+length*e0[5])/2, length**2*e1[5]/6]
|
|
428
|
+
result[2] = [nodal[2], length*(e0[2]-nodal[4]),
|
|
429
|
+
length*(e1[2]-length*e0[4])/2, -length**2*e1[4]/6]
|
|
430
|
+
return result
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
class LinearOperator:
|
|
434
|
+
"""Physical local tangent and station response; independent of public B2."""
|
|
435
|
+
|
|
436
|
+
__slots__ = ("length", "section", "_stiffness", "_compliance", "_B",
|
|
437
|
+
"_modal", "_basic_inverse", "_trace_polynomials", "_sealed",
|
|
438
|
+
"_tangent", "_output_certificate", "_uniform_load_map")
|
|
439
|
+
|
|
440
|
+
def __setattr__(self, name, value):
|
|
441
|
+
if getattr(self, "_sealed", False):
|
|
442
|
+
raise AttributeError("physical B2 operator is immutable")
|
|
443
|
+
object.__setattr__(self, name, value)
|
|
444
|
+
|
|
445
|
+
def __delattr__(self, name):
|
|
446
|
+
if getattr(self, "_sealed", False):
|
|
447
|
+
raise AttributeError("physical B2 operator is immutable")
|
|
448
|
+
object.__delattr__(self, name)
|
|
449
|
+
|
|
450
|
+
def __init__(self, length, section: LinearSection):
|
|
451
|
+
self.length = _positive(length)
|
|
452
|
+
if not isinstance(section, LinearSection) or section.operator_id != OPERATOR_ID:
|
|
453
|
+
raise ValueError("explicit physical linear B2 section required")
|
|
454
|
+
self.section = section
|
|
455
|
+
self._stiffness = tuple(tuple(Fraction(value) for value in row) for row in section.stiffness)
|
|
456
|
+
self._compliance = tuple(tuple(row) for row in _inverse_spd(self._stiffness))
|
|
457
|
+
self._B = tuple(tuple(row) for row in _basic(self.length))
|
|
458
|
+
if section.kind == "isotropic_scalar":
|
|
459
|
+
s = [self._stiffness[i][i] for i in range(6)]
|
|
460
|
+
kp_y = 1 / (self.length/(6*s[4]) + 2/(s[2]*self.length))
|
|
461
|
+
kp_z = 1 / (self.length/(6*s[5]) + 2/(s[1]*self.length))
|
|
462
|
+
self._modal = (s[0]/self.length, s[3]/self.length,
|
|
463
|
+
kp_y, 2*s[4]/self.length, kp_z, 2*s[5]/self.length)
|
|
464
|
+
for value in self._modal:
|
|
465
|
+
_float(value)
|
|
466
|
+
else:
|
|
467
|
+
self._basic_inverse = tuple(tuple(row) for row in
|
|
468
|
+
_separated_basic_inverse(self.length,
|
|
469
|
+
_flexibility(self.length, self._compliance)))
|
|
470
|
+
h0 = _interpolation(self.length, Fraction(0))
|
|
471
|
+
h1 = _interpolation(self.length, self.length)
|
|
472
|
+
coefficients = [[[Fraction(0) for _ in range(4)] for _ in range(12)]
|
|
473
|
+
for _ in range(6)]
|
|
474
|
+
for column in range(12):
|
|
475
|
+
nodal = [Fraction(int(i == column)) for i in range(12)]
|
|
476
|
+
q = self._basic_action(_multiply(self._B, nodal))
|
|
477
|
+
e0 = _multiply(self._compliance, _multiply(h0, q))
|
|
478
|
+
e1 = _multiply(self._compliance, _multiply(
|
|
479
|
+
[[h1[i][j]-h0[i][j] for j in range(6)] for i in range(6)], q))
|
|
480
|
+
pose = _pose_polynomials(self.length, e0, e1, nodal)
|
|
481
|
+
for row in range(6):
|
|
482
|
+
coefficients[row][column] = pose[row]
|
|
483
|
+
self._trace_polynomials = tuple(tuple(tuple(poly) for poly in row)
|
|
484
|
+
for row in coefficients)
|
|
485
|
+
self._uniform_load_map = tuple(tuple(self.length*sum(
|
|
486
|
+
coefficient/Fraction(degree+1) for degree, coefficient in
|
|
487
|
+
enumerate(self._trace_polynomials[row][column])) for row in range(6))
|
|
488
|
+
for column in range(12))
|
|
489
|
+
self._tangent = _nodal_tangent(self)
|
|
490
|
+
self._output_certificate = _certify_output_tangent(self, self._tangent)
|
|
491
|
+
self._sealed = True
|
|
492
|
+
|
|
493
|
+
@property
|
|
494
|
+
def output_certificate(self):
|
|
495
|
+
"""Immutable bounded local certificate; not production qualification."""
|
|
496
|
+
return self._output_certificate
|
|
497
|
+
|
|
498
|
+
@property
|
|
499
|
+
def basic_matrix(self):
|
|
500
|
+
return _array(self._B)
|
|
501
|
+
|
|
502
|
+
@property
|
|
503
|
+
def modal_stiffness(self):
|
|
504
|
+
return None if self.section.kind != "isotropic_scalar" else _array(self._modal)
|
|
505
|
+
|
|
506
|
+
def _basic_action(self, basic):
|
|
507
|
+
if self.section.kind != "isotropic_scalar":
|
|
508
|
+
return _multiply(self._basic_inverse, basic)
|
|
509
|
+
ka, kt, kp_y, km_y, kp_z, km_z = self._modal
|
|
510
|
+
q = [ka*basic[0], kt*basic[1]]
|
|
511
|
+
for i, kp, km in ((2, kp_y, km_y), (4, kp_z, km_z)):
|
|
512
|
+
plus = kp*(basic[i]+basic[i+1])/2
|
|
513
|
+
minus = km*(basic[i]-basic[i+1])/2
|
|
514
|
+
q.extend((plus+minus, plus-minus))
|
|
515
|
+
return q
|
|
516
|
+
|
|
517
|
+
def trace(self, displacement, *, stations=(0.0, 0.5, 1.0),
|
|
518
|
+
offset_local_m=(0.0, 0.0, 0.0)):
|
|
519
|
+
"""Private small-rotation physical pose and exact offset-point pullback."""
|
|
520
|
+
try:
|
|
521
|
+
u = np.asarray(displacement, dtype=float)
|
|
522
|
+
x = np.asarray(stations, dtype=float)
|
|
523
|
+
offset = np.asarray(offset_local_m, dtype=float)
|
|
524
|
+
except (TypeError, ValueError, OverflowError) as exc:
|
|
525
|
+
raise ValueError("finite local coordinates, stations and offset required") from exc
|
|
526
|
+
if u.shape != (12,) or not np.isfinite(u).all():
|
|
527
|
+
raise ValueError("twelve finite local coordinates required")
|
|
528
|
+
if x.ndim != 1 or not np.isfinite(x).all() or np.any((x < 0) | (x > 1)):
|
|
529
|
+
raise ValueError("stations must be finite normalized coordinates in [0,1]")
|
|
530
|
+
if offset.shape != (3,) or not np.isfinite(offset).all():
|
|
531
|
+
raise ValueError("three finite local offset coordinates required")
|
|
532
|
+
d = [Fraction(float(value)) for value in offset]
|
|
533
|
+
nodal = [Fraction(float(value)) for value in u]
|
|
534
|
+
points, poses, maps = [], [], []
|
|
535
|
+
for station in x:
|
|
536
|
+
t = Fraction(float(station))
|
|
537
|
+
center = [[sum(coefficient*t**degree for degree, coefficient in enumerate(poly))
|
|
538
|
+
for poly in row] for row in self._trace_polynomials]
|
|
539
|
+
# The point displacement is r + theta cross d. Its force
|
|
540
|
+
# pullback therefore includes the offset's d cross F moment.
|
|
541
|
+
for row, rotational, sign in ((0, (4, 5), (d[2], -d[1])),
|
|
542
|
+
(1, (5, 3), (d[0], -d[2])),
|
|
543
|
+
(2, (3, 4), (d[1], -d[0]))):
|
|
544
|
+
center[row] = [value + sign[0]*center[rotational[0]][col]
|
|
545
|
+
+ sign[1]*center[rotational[1]][col]
|
|
546
|
+
for col, value in enumerate(center[row])]
|
|
547
|
+
maps.append(center)
|
|
548
|
+
poses.append(_multiply(center, nodal))
|
|
549
|
+
points.append([self.length*t+d[0], d[1], d[2]])
|
|
550
|
+
n = len(x)
|
|
551
|
+
return LinearTrace(np.array(x, dtype=float, copy=True),
|
|
552
|
+
_array(np.asarray(points, dtype=object).reshape(n, 3)),
|
|
553
|
+
_array(np.asarray(poses, dtype=object).reshape(n, 6)),
|
|
554
|
+
_array(np.asarray(maps, dtype=object).reshape(n, 6, 12)))
|
|
555
|
+
|
|
556
|
+
def _section_response(self, basic_force, stations):
|
|
557
|
+
resultants, strains = [], []
|
|
558
|
+
for t in stations:
|
|
559
|
+
resultant = _multiply(
|
|
560
|
+
_interpolation(self.length, self.length*Fraction(float(t))),
|
|
561
|
+
basic_force)
|
|
562
|
+
resultants.append(resultant)
|
|
563
|
+
strains.append(_multiply(self._compliance, resultant))
|
|
564
|
+
return _array(resultants), _array(strains)
|
|
565
|
+
|
|
566
|
+
def recover_sections(self, displacement, *, stations=(0.0, 0.5, 1.0)):
|
|
567
|
+
"""Recover only requested local resultants and strains from a state."""
|
|
568
|
+
try:
|
|
569
|
+
u = np.asarray(displacement, dtype=float)
|
|
570
|
+
x = np.asarray(stations, dtype=float)
|
|
571
|
+
except (TypeError, ValueError) as exc:
|
|
572
|
+
raise ValueError("finite local coordinates and stations required") from exc
|
|
573
|
+
if u.shape != (12,) or not np.isfinite(u).all():
|
|
574
|
+
raise ValueError("twelve finite local coordinates required")
|
|
575
|
+
if x.ndim != 1 or not np.isfinite(x).all() or np.any((x < 0) | (x > 1)):
|
|
576
|
+
raise ValueError("stations must be finite normalized coordinates in [0,1]")
|
|
577
|
+
basic = _multiply(self._B, [Fraction(float(v)) for v in u])
|
|
578
|
+
q = self._basic_action(basic)
|
|
579
|
+
resultants, strains = self._section_response(q, x)
|
|
580
|
+
return LocalSectionRecovery(
|
|
581
|
+
resultants, strains, np.array(x, dtype=float, copy=True))
|
|
582
|
+
|
|
583
|
+
def recover_equilibrated_sections(self, displacement, *, uniform_wrench=(0.,)*6,
|
|
584
|
+
point_actions=(), stations=(0., .5, 1.)):
|
|
585
|
+
"""Reconstruct equilibrium under force/couple per reference length.
|
|
586
|
+
|
|
587
|
+
Point actions are (normalized interior station, external local wrench
|
|
588
|
+
about the reference axis). Endpoint actions remain nodal tractions.
|
|
589
|
+
Existing trace/element equations and nodal recovery are unchanged.
|
|
590
|
+
"""
|
|
591
|
+
try:
|
|
592
|
+
u = np.asarray(displacement, dtype=float)
|
|
593
|
+
w = np.asarray(uniform_wrench, dtype=float)
|
|
594
|
+
x = np.asarray(stations, dtype=float)
|
|
595
|
+
submitted = tuple(point_actions)
|
|
596
|
+
except (TypeError, ValueError, OverflowError) as exc:
|
|
597
|
+
raise ValueError("finite local state and physical section actions required") from exc
|
|
598
|
+
if (u.shape != (12,) or w.shape != (6,) or x.ndim != 1 or
|
|
599
|
+
not np.isfinite(u).all() or not np.isfinite(w).all() or
|
|
600
|
+
not np.isfinite(x).all() or np.any((x < 0.) | (x > 1.))):
|
|
601
|
+
raise ValueError("finite local state, wrench and normalized stations required")
|
|
602
|
+
actions = []
|
|
603
|
+
for action in submitted:
|
|
604
|
+
try:
|
|
605
|
+
station, wrench = action
|
|
606
|
+
values = np.asarray(wrench, dtype=float)
|
|
607
|
+
except (TypeError, ValueError, OverflowError) as exc:
|
|
608
|
+
raise ValueError("interior physical point action required") from exc
|
|
609
|
+
if (isinstance(station, (bool, np.bool_)) or not isinstance(station, (int, float)) or
|
|
610
|
+
not math.isfinite(station) or not 0. < station < 1. or
|
|
611
|
+
values.shape != (6,) or not np.isfinite(values).all()):
|
|
612
|
+
raise ValueError("finite strictly interior physical point action required")
|
|
613
|
+
actions.append((Fraction(float(station)), [Fraction(float(v)) for v in values]))
|
|
614
|
+
nodal = [Fraction(float(v)) for v in u]
|
|
615
|
+
distributed = [Fraction(float(v)) for v in w]
|
|
616
|
+
basic = self._basic_action(_multiply(self._B, nodal))
|
|
617
|
+
internal = _multiply(_transpose(self._B), basic)
|
|
618
|
+
# Integrate the existing polynomial trace exactly. No new stiffness,
|
|
619
|
+
# internal coordinate, numerical quadrature or dense global operation.
|
|
620
|
+
equivalent = _multiply(self._uniform_load_map, distributed)
|
|
621
|
+
for station, wrench in actions:
|
|
622
|
+
for column in range(12):
|
|
623
|
+
equivalent[column] += sum(wrench[row]*sum(
|
|
624
|
+
coefficient*station**degree for degree, coefficient in
|
|
625
|
+
enumerate(self._trace_polynomials[row][column])) for row in range(6))
|
|
626
|
+
tractions = [a-b for a,b in zip(internal, equivalent)]
|
|
627
|
+
left = [-v for v in tractions[:6]]
|
|
628
|
+
|
|
629
|
+
def cross_axis(vector):
|
|
630
|
+
return (Fraction(0), -vector[2], vector[1])
|
|
631
|
+
|
|
632
|
+
def section(station, right):
|
|
633
|
+
distance = self.length*station
|
|
634
|
+
n = [left[i]-distance*distributed[i] for i in range(3)]
|
|
635
|
+
hn, wp = cross_axis(left), cross_axis(distributed)
|
|
636
|
+
m = [left[i+3]-distance*hn[i]-distance*distributed[i+3]+distance**2*wp[i]/2
|
|
637
|
+
for i in range(3)]
|
|
638
|
+
for at, wrench in actions:
|
|
639
|
+
if station > at or (right and station == at):
|
|
640
|
+
lever = self.length*(station-at)
|
|
641
|
+
turn = cross_axis(wrench)
|
|
642
|
+
n = [n[i]-wrench[i] for i in range(3)]
|
|
643
|
+
m = [m[i]-wrench[i+3]+lever*turn[i] for i in range(3)]
|
|
644
|
+
return n+m
|
|
645
|
+
|
|
646
|
+
# Exact stored-input work maps must give force and moment closure.
|
|
647
|
+
if section(Fraction(1), True) != tractions[6:]:
|
|
648
|
+
raise RepresentabilityError("equilibrated endpoint traction closure failed")
|
|
649
|
+
low, high, strain_low, strain_high = [], [], [], []
|
|
650
|
+
for value in x:
|
|
651
|
+
station = Fraction(float(value))
|
|
652
|
+
a, b = section(station, False), section(station, True)
|
|
653
|
+
low.append(a); high.append(b)
|
|
654
|
+
strain_low.append(_multiply(self._compliance, a))
|
|
655
|
+
strain_high.append(_multiply(self._compliance, b))
|
|
656
|
+
shape = (len(x), 6)
|
|
657
|
+
return EquilibratedSectionRecovery(np.array(x, copy=True),
|
|
658
|
+
_array(low).reshape(shape), _array(high).reshape(shape),
|
|
659
|
+
_array(strain_low).reshape(shape), _array(strain_high).reshape(shape), _array(tractions))
|
|
660
|
+
|
|
661
|
+
def candidate_constant_axial_geometric_stiffness(self, axial_force):
|
|
662
|
+
"""Private centerline-stretch Hessian for constant conservative N.
|
|
663
|
+
|
|
664
|
+
Positive ``axial_force`` denotes tension. This is a member-only
|
|
665
|
+
candidate, without attachment, load or support curvature.
|
|
666
|
+
"""
|
|
667
|
+
if (type(axial_force) not in (int, float)
|
|
668
|
+
or not math.isfinite(axial_force)):
|
|
669
|
+
raise ValueError("finite constant physical axial force required")
|
|
670
|
+
force = Fraction(float(axial_force))
|
|
671
|
+
matrix = [[Fraction(0) for _ in range(12)] for _ in range(12)]
|
|
672
|
+
for position_row in (1, 2):
|
|
673
|
+
derivatives = [
|
|
674
|
+
tuple(degree*poly[degree]/self.length for degree in range(1, 4))
|
|
675
|
+
for poly in self._trace_polynomials[position_row]
|
|
676
|
+
]
|
|
677
|
+
for i in range(12):
|
|
678
|
+
for j in range(i, 12):
|
|
679
|
+
integral = sum(
|
|
680
|
+
a*b/Fraction(p+q+1)
|
|
681
|
+
for p, a in enumerate(derivatives[i])
|
|
682
|
+
for q, b in enumerate(derivatives[j]))
|
|
683
|
+
matrix[i][j] += force*self.length*integral
|
|
684
|
+
for i in range(12):
|
|
685
|
+
for j in range(i):
|
|
686
|
+
matrix[i][j] = matrix[j][i]
|
|
687
|
+
return _array(matrix)
|
|
688
|
+
|
|
689
|
+
def evaluate(self, displacement, *, stations=(0.0, 0.5, 1.0)):
|
|
690
|
+
try:
|
|
691
|
+
u = np.asarray(displacement, dtype=float)
|
|
692
|
+
x = np.asarray(stations, dtype=float)
|
|
693
|
+
except (TypeError, ValueError) as exc:
|
|
694
|
+
raise ValueError("finite local coordinates and stations required") from exc
|
|
695
|
+
if u.shape != (12,) or not np.isfinite(u).all():
|
|
696
|
+
raise ValueError("twelve finite local coordinates required")
|
|
697
|
+
if x.ndim != 1 or not np.isfinite(x).all() or np.any((x < 0) | (x > 1)):
|
|
698
|
+
raise ValueError("stations must be finite normalized coordinates in [0,1]")
|
|
699
|
+
basic = _multiply(self._B, [Fraction(float(v)) for v in u])
|
|
700
|
+
q = self._basic_action(basic)
|
|
701
|
+
force = [sum(self._B[j][i]*q[j] for j in range(6)) for i in range(12)]
|
|
702
|
+
resultants, strains = self._section_response(q, x)
|
|
703
|
+
return LocalResponse(
|
|
704
|
+
_float(sum(b*v for b, v in zip(basic, q))/2), _array(force),
|
|
705
|
+
np.array(self._tangent, dtype=float, copy=True),
|
|
706
|
+
_array(q), resultants, strains, np.array(x, dtype=float, copy=True),
|
|
707
|
+
)
|