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,556 @@
|
|
|
1
|
+
"""Private G3c finite mixed-graph development owner; NOT qualification.
|
|
2
|
+
|
|
3
|
+
One immutable graph generation; actual native material transactions are confined
|
|
4
|
+
to disposable sandboxes. No public factory or checkpoint-import admission.
|
|
5
|
+
"""
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from hashlib import sha256
|
|
8
|
+
import inspect
|
|
9
|
+
import json
|
|
10
|
+
import sys
|
|
11
|
+
import threading
|
|
12
|
+
from time import monotonic
|
|
13
|
+
import numpy as np
|
|
14
|
+
import anyfesolver._ge_beam3_g3c_stable.element as native_module
|
|
15
|
+
import anyfesolver._ge_beam3_g3c_stable.operator as operator_module
|
|
16
|
+
import anyfesolver._ge_beam3_g3c_stable.beam as beam_module
|
|
17
|
+
import anyfesolver._ge_beam3_g3c_stable.shell as shell_module
|
|
18
|
+
import anyfesolver._ge_beam3_g3c_stable.joint as joint_module
|
|
19
|
+
import anyfesolver._ge_beam3_g3c_b2_physical_adapter as physical_b2
|
|
20
|
+
import anyfesolver._ge_beam3_g3c_affine_q4_recovery as physical_q4
|
|
21
|
+
import anyfesolver._ge_beam3_g3c_affine_q4_registry as q4_registry
|
|
22
|
+
import anyfesolver.nonlinear_state as state_module
|
|
23
|
+
import anyfesolver.elements as legacy_module
|
|
24
|
+
import anyfesolver._native_rotation_state as rotation_module
|
|
25
|
+
import anyfesolver._ge_beam3_g3c_physical_authority as definition_module
|
|
26
|
+
from anyfesolver._ge_beam3_g3c_physical_authority import expand
|
|
27
|
+
from anyfesolver._ge_beam3_g3c_physical_authority import command
|
|
28
|
+
from anyfesolver._ge_beam3_g3c_physical_authority import CONTRACT_SHA
|
|
29
|
+
from anyfesolver._ge_beam3_g3c_physical_authority import U
|
|
30
|
+
from anyfesolver._ge_beam3_g3c_physical_authority import SHIFT
|
|
31
|
+
from anyfesolver._ge_beam3_g1_analysis import runtime_digest
|
|
32
|
+
from anyfesolver._ge_beam3_g1_elastic import ElasticSection
|
|
33
|
+
from anyfesolver._ge_beam3_g1_elastic import canonical
|
|
34
|
+
from anyfesolver._ge_beam3_g1_elastic import owned
|
|
35
|
+
from anyfesolver._ge_beam3_g1_elastic import sha
|
|
36
|
+
from anyfesolver._ge_beam3_g1_elastic import solve
|
|
37
|
+
from anyfesolver._ge_beam3_centered_reference import CenteredCurvedBeam3ReferenceGeometry as Reference
|
|
38
|
+
from anyfesolver._ge_beam3_mixed_ad import Jet2
|
|
39
|
+
from anyfesolver._ge_beam3_mixed_ad import constant_matrix
|
|
40
|
+
from anyfesolver._ge_beam3_mixed_ad import matmul
|
|
41
|
+
from anyfesolver._ge_beam3_g3c_so3_numerics import so3_exp
|
|
42
|
+
from anyfesolver._ge_beam3_g3c_so3_numerics import so3_log
|
|
43
|
+
from anyfesolver._ge_beam3_mixed_ad import rotation_log
|
|
44
|
+
from anyfesolver.fe_core import FEModel
|
|
45
|
+
|
|
46
|
+
POLICY='GE_BEAM3_G3C_PHYSICAL_MIXED_ELASTIC_OWNER_V1'
|
|
47
|
+
SCHEMA='GE_BEAM3_G3C_PHYSICAL_MIXED_ELASTIC_STATE_V1'
|
|
48
|
+
ENVIRONMENT='2ce154b866565e1d03019651b1ae7fdd070e5554f38d72adf21d8080558b6756'
|
|
49
|
+
|
|
50
|
+
def progress(stage):
|
|
51
|
+
print('G3C CHECKPOINT '+stage,flush=True)
|
|
52
|
+
|
|
53
|
+
def dispatch():
|
|
54
|
+
modules=(native_module,operator_module,beam_module,shell_module,joint_module,
|
|
55
|
+
state_module,legacy_module,rotation_module,physical_b2,physical_q4,q4_registry,
|
|
56
|
+
*definition_module.runtime_modules(),sys.modules[__name__])
|
|
57
|
+
found=[]
|
|
58
|
+
def functions(name,value):
|
|
59
|
+
if isinstance(value,property):
|
|
60
|
+
return [(name+'.'+k,fn) for k,fn in (('get',value.fget),('set',value.fset),('del',value.fdel)) if fn is not None]
|
|
61
|
+
if isinstance(value,(staticmethod,classmethod)): value=value.__func__
|
|
62
|
+
return [(name,value)] if inspect.isfunction(value) else []
|
|
63
|
+
for module in modules:
|
|
64
|
+
for name,value in sorted(vars(module).items()):
|
|
65
|
+
made=functions(name,value)
|
|
66
|
+
if inspect.isclass(value):
|
|
67
|
+
# Include imported classes and inherited methods/properties,
|
|
68
|
+
# notably Reference and ElasticSection, not just local classes.
|
|
69
|
+
for base in value.__mro__:
|
|
70
|
+
for method,fn in sorted(vars(base).items()):
|
|
71
|
+
made.extend(functions(name+'.'+base.__module__+'.'+base.__qualname__+'.'+method,fn))
|
|
72
|
+
for name,fn in made:
|
|
73
|
+
# Code objects are immutable; replacing __code__ changes this
|
|
74
|
+
# identity. marshal encodings are not an identity primitive.
|
|
75
|
+
found.append((module.__name__,name,fn,id(fn.__code__)))
|
|
76
|
+
found.extend(definition_module.runtime_constants())
|
|
77
|
+
return tuple(found)
|
|
78
|
+
|
|
79
|
+
def close(a,b,label):
|
|
80
|
+
a,b=np.asarray(a),np.asarray(b)
|
|
81
|
+
if not np.isfinite(a).all() or not np.isfinite(b).all() or np.linalg.norm(a-b)>1e-11*max(1.,np.linalg.norm(a),np.linalg.norm(b)):
|
|
82
|
+
raise ValueError(label)
|
|
83
|
+
|
|
84
|
+
def physical_equal(a,b,label):
|
|
85
|
+
a,b=np.asarray(a),np.asarray(b)
|
|
86
|
+
scale=np.linalg.norm(a)+np.linalg.norm(b)
|
|
87
|
+
error=np.linalg.norm(a-b)
|
|
88
|
+
if not np.isfinite(a).all() or not np.isfinite(b).all() or (error>1e-11*scale if scale else error!=0):
|
|
89
|
+
raise ValueError(label)
|
|
90
|
+
|
|
91
|
+
def recovery_witness(family,trial):
|
|
92
|
+
"""Bind actual detached recovery, never a claimed recovery-complete flag."""
|
|
93
|
+
if family=='B2':
|
|
94
|
+
force=np.einsum('i,ijk,ij->k',trial.weights,trial.chart_strain_differential,trial.resultants)
|
|
95
|
+
physical_equal(force,trial.chart_force,'B2 physical station work')
|
|
96
|
+
energy=.5*float(np.einsum('i,ij,ij->',trial.weights,trial.strains,trial.resultants))
|
|
97
|
+
physical_equal(energy,trial.energy,'B2 physical energy')
|
|
98
|
+
witness=(trial.strains,trial.resultants,trial.chart_strain_differential,
|
|
99
|
+
trial.weights,trial.reference_frame,trial.current_frame,trial.energy)
|
|
100
|
+
elif family=='Q4':
|
|
101
|
+
force=sum(st.weight*st.chart_first.T@st.resultant for st in trial.stations)
|
|
102
|
+
hessian=sum(st.weight*(st.chart_first.T@st.constitutive@st.chart_first+
|
|
103
|
+
np.einsum('i,ijk->jk',st.resultant,st.chart_second)) for st in trial.stations)
|
|
104
|
+
physical_equal(force,trial.physical_chart_force,'Q4 physical station work')
|
|
105
|
+
physical_equal(hessian,trial.physical_chart_hessian,'Q4 physical station Hessian')
|
|
106
|
+
condensed=(trial.direct_chart_hessian
|
|
107
|
+
-trial.internal_coupling64.T@trial.internal_inverse64@trial.internal_coupling64)
|
|
108
|
+
physical_equal(condensed,trial.schur_chart_hessian,'Q4 full64 Schur')
|
|
109
|
+
physical_equal(trial.schur_chart_hessian,trial.physical_chart_hessian,
|
|
110
|
+
'Q4 condensed/physical Hessian')
|
|
111
|
+
physical_equal(trial.source_stationary_matrix@trial.source_solution,
|
|
112
|
+
trial.source_coupling.T,'Q4 source35 stationarity')
|
|
113
|
+
physical_equal(trial.internal_block64@trial.internal_inverse64,np.eye(64),'Q4 right inverse')
|
|
114
|
+
physical_equal(trial.internal_inverse64@trial.internal_block64,np.eye(64),'Q4 left inverse')
|
|
115
|
+
for st in trial.stations:
|
|
116
|
+
physical_equal(st.constitutive@st.strain,st.resultant,'Q4 constitutive recovery')
|
|
117
|
+
witness=(trial.stations,trial.internal_block64,trial.internal_inverse64,
|
|
118
|
+
trial.internal_coupling64,trial.direct_chart_hessian,
|
|
119
|
+
trial.schur_chart_hessian,trial.internal_residual64,trial.physical_energy)
|
|
120
|
+
elif family=='B3':
|
|
121
|
+
witness=trial.station_diagnostics
|
|
122
|
+
if witness is None: raise ValueError('missing B3 physical recovery')
|
|
123
|
+
elif family=='S3':
|
|
124
|
+
witness=trial.channels
|
|
125
|
+
if not witness: raise ValueError('missing S3 recovery channels')
|
|
126
|
+
else: raise ValueError('foreign recovery family')
|
|
127
|
+
return physical_q4._fingerprint(witness)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def native_payload(body):
|
|
131
|
+
# Only called on bytes already owned by this generation, never an import.
|
|
132
|
+
value=json.loads(canonical(body))
|
|
133
|
+
value['history']=(); value['response']['history']=()
|
|
134
|
+
return value
|
|
135
|
+
|
|
136
|
+
@dataclass(frozen=True)
|
|
137
|
+
class Generation:
|
|
138
|
+
state: bytes
|
|
139
|
+
history: bytes
|
|
140
|
+
state_sha256: str
|
|
141
|
+
history_sha256: str
|
|
142
|
+
|
|
143
|
+
def generation(state,history):
|
|
144
|
+
raw=canonical(state); journal=canonical(history)
|
|
145
|
+
if len(raw)+len(journal)>8388608: raise ValueError('generation byte bound')
|
|
146
|
+
return Generation(raw,journal,sha256(raw).hexdigest(),sha256(journal).hexdigest())
|
|
147
|
+
|
|
148
|
+
class MixedGraphOwner:
|
|
149
|
+
__slots__=('_definition','_expanded','_programs','_seal','_runtime','_dispatch',
|
|
150
|
+
'_published','_initial','_initial_generation','_fixture_identity',
|
|
151
|
+
'_q4_cache','_owned_q4_cache','_lock','_owned_lock','_active','_serial','_poisoned')
|
|
152
|
+
def __setattr__(self,name,value): raise AttributeError('owned graph attributes are immutable')
|
|
153
|
+
def __delattr__(self,name): raise AttributeError('owned graph attributes are immutable')
|
|
154
|
+
|
|
155
|
+
def __init__(self,fixture_id='J_B2_PAIR',variant='BASE',common_motion='NONE',*,
|
|
156
|
+
policy=POLICY,operator_graph_id='GE_BEAM3_G3C_PHYSICAL_OPERATOR_GRAPH_V1',
|
|
157
|
+
state_schema=SCHEMA):
|
|
158
|
+
if type(self) is not MixedGraphOwner: raise ValueError('exact owner required')
|
|
159
|
+
if (type(policy) is not str or policy!=POLICY or type(state_schema) is not str
|
|
160
|
+
or state_schema!=SCHEMA or type(operator_graph_id) is not str
|
|
161
|
+
or operator_graph_id!='GE_BEAM3_G3C_PHYSICAL_OPERATOR_GRAPH_V1'):
|
|
162
|
+
raise ValueError('historical or foreign physical owner identity')
|
|
163
|
+
definition,expanded,programs=expand(fixture_id,variant,common_motion)
|
|
164
|
+
for name,value in dict(_definition=canonical(definition),_expanded=canonical(expanded),
|
|
165
|
+
_programs=canonical(programs),_runtime=sha(dict(source=runtime_digest(),environment=ENVIRONMENT,physical=definition_module.runtime_identity())),
|
|
166
|
+
_dispatch=dispatch(),_lock=threading.Lock(),_active=None,_serial=0,_poisoned=False).items():
|
|
167
|
+
object.__setattr__(self,name,value)
|
|
168
|
+
object.__setattr__(self,'_owned_lock',self._lock)
|
|
169
|
+
object.__setattr__(self,'_fixture_identity',(fixture_id,variant,common_motion))
|
|
170
|
+
object.__setattr__(self,'_seal',sha((self._definition.hex(),self._expanded.hex(),self._programs.hex())))
|
|
171
|
+
# Cache only accepted immutable reference operators, never states or replay answers.
|
|
172
|
+
cache=tuple((e['id'],physical_q4.AffineQ4PhysicalRecovery(fixture_id+'::'+variant))
|
|
173
|
+
for e in expanded['graph']['elements'] if e['family']=='Q4')
|
|
174
|
+
object.__setattr__(self,'_q4_cache',cache)
|
|
175
|
+
object.__setattr__(self,'_owned_q4_cache',cache)
|
|
176
|
+
self._check_q4_registry()
|
|
177
|
+
progress('initialization')
|
|
178
|
+
g=expanded['graph']; n=len(g['nodes']); zero=np.zeros(6*n); q=np.tile(np.eye(3),(n,1,1))
|
|
179
|
+
model,elements,states=self._native_model(None)
|
|
180
|
+
rows=self._adapter_rows(zero,q,q,epoch=0,previous=None,check=lambda stage:None)[2]
|
|
181
|
+
initial=dict(schema=SCHEMA,epoch=0,definition_sha256=sha(definition),previous_sha256=None,
|
|
182
|
+
total_u=zero,rotations=q,native_rows=[dict(element_id=e.element_id,payload=states[e.element_id]) for e in elements],
|
|
183
|
+
adapter_rows=rows,multipliers=np.zeros(6*(len(g['fixed_nodes'])+len(g['joints']))))
|
|
184
|
+
made=generation(initial,[])
|
|
185
|
+
object.__setattr__(self,'_published',made); object.__setattr__(self,'_initial',made.state_sha256)
|
|
186
|
+
object.__setattr__(self,'_initial_generation',made)
|
|
187
|
+
self._guard(full=True)
|
|
188
|
+
# Analytical component rigid spaces, not a stiffness eigenvalue cutoff.
|
|
189
|
+
rows,H=self._constraints(zero,q,np.zeros(len(initial['multipliers'])),None)
|
|
190
|
+
J=H[len(zero):,:len(zero)]
|
|
191
|
+
components=[]
|
|
192
|
+
for e in g['elements']:
|
|
193
|
+
touching=[c for c in components if set(e['nodes']) & c]
|
|
194
|
+
merged=set(e['nodes'])
|
|
195
|
+
for c in touching: merged.update(c); components.remove(c)
|
|
196
|
+
components.append(merged)
|
|
197
|
+
ids=[r[0] for r in g['nodes']]; X=np.array([r[1] for r in g['nodes']],dtype=float)
|
|
198
|
+
R=np.zeros((6*n,6*len(components)))
|
|
199
|
+
for c,nodes in enumerate(components):
|
|
200
|
+
origin=X[ids.index(min(nodes))]
|
|
201
|
+
for node in nodes:
|
|
202
|
+
i=ids.index(node); R[6*i:6*i+3,6*c:6*c+3]=np.eye(3)
|
|
203
|
+
R[6*i:6*i+3,6*c+3:6*c+6]=np.column_stack([np.cross(a,X[i]-origin) for a in np.eye(3)])
|
|
204
|
+
R[6*i+3:6*i+6,6*c+3:6*c+6]=np.eye(3)
|
|
205
|
+
JR=J@R; singular=np.linalg.svd(JR,compute_uv=False)
|
|
206
|
+
floor=64*np.finfo(float).eps*max(JR.shape)*max(1.,singular[0])
|
|
207
|
+
if len(singular)<R.shape[1] or singular[-1]<=floor: raise ValueError('unsupported component rigid space')
|
|
208
|
+
|
|
209
|
+
def _guard(self,origin=None,*,full=False,lock=None,nonce=None):
|
|
210
|
+
try:
|
|
211
|
+
current=dispatch()
|
|
212
|
+
if current!=self._dispatch:
|
|
213
|
+
before={(m,n):(f,c) for m,n,f,c in self._dispatch}
|
|
214
|
+
after={(m,n):(f,c) for m,n,f,c in current}
|
|
215
|
+
names=sorted(k for k in before.keys()|after.keys() if before.get(k)!=after.get(k))
|
|
216
|
+
raise ValueError('runtime dispatch changed: '+repr(names[:5]))
|
|
217
|
+
definition=json.loads(self._definition); journal=json.loads(self._published.history)
|
|
218
|
+
initial=self._initial_generation
|
|
219
|
+
initial_link=self._published.state_sha256 if not journal else journal[0].get('origin_sha256')
|
|
220
|
+
if (type(self) is not MixedGraphOwner or self._poisoned or
|
|
221
|
+
self._lock is not self._owned_lock or self._q4_cache is not self._owned_q4_cache or
|
|
222
|
+
(lock is not None and (self._lock is not lock or not lock.locked())) or
|
|
223
|
+
(nonce is not None and self._active is not nonce) or
|
|
224
|
+
U!=((0,-1,0),(1,0,0),(0,0,1)) or SHIFT!=(2,-3,1) or
|
|
225
|
+
definition_module.U!=U or definition_module.SHIFT!=SHIFT or
|
|
226
|
+
sha((self._definition.hex(),self._expanded.hex(),self._programs.hex()))!=self._seal or
|
|
227
|
+
tuple(definition.get(k) for k in ('fixture_id','variant','common_motion'))!=self._fixture_identity or
|
|
228
|
+
(origin is not None and self._published is not origin) or
|
|
229
|
+
type(initial) is not Generation or self._initial!=initial.state_sha256 or
|
|
230
|
+
sha256(initial.state).hexdigest()!=initial.state_sha256 or
|
|
231
|
+
sha256(initial.history).hexdigest()!=initial.history_sha256 or initial.history!=b'[]\n' or
|
|
232
|
+
initial_link!=self._initial or
|
|
233
|
+
sha256(self._published.state).hexdigest()!=self._published.state_sha256 or
|
|
234
|
+
sha256(self._published.history).hexdigest()!=self._published.history_sha256):
|
|
235
|
+
raise ValueError('captured graph/runtime/generation changed')
|
|
236
|
+
self._check_q4_registry()
|
|
237
|
+
if full:
|
|
238
|
+
definition,expanded,programs=expand(**{k:json.loads(self._definition)[k] for k in ('fixture_id','variant','common_motion')})
|
|
239
|
+
if (canonical(definition)!=self._definition or canonical(expanded)!=self._expanded or
|
|
240
|
+
canonical(programs)!=self._programs or sha(dict(source=runtime_digest(),environment=ENVIRONMENT,physical=definition_module.runtime_identity()))!=self._runtime):
|
|
241
|
+
raise ValueError('frozen source or definition changed')
|
|
242
|
+
# Registry/authority/dispatch observations are fallible. Validate
|
|
243
|
+
# capabilities AGAIN after them; an observer cannot replace the
|
|
244
|
+
# nonce or release/replace the acquired lock in the last window.
|
|
245
|
+
if dispatch()!=self._dispatch:
|
|
246
|
+
raise ValueError('runtime dispatch changed during guard')
|
|
247
|
+
if (self._poisoned or self._lock is not self._owned_lock
|
|
248
|
+
or self._q4_cache is not self._owned_q4_cache
|
|
249
|
+
or (lock is not None and (self._lock is not lock or not lock.locked()))
|
|
250
|
+
or (nonce is not None and self._active is not nonce)
|
|
251
|
+
or (origin is not None and self._published is not origin)):
|
|
252
|
+
raise ValueError('captured capability changed during guard')
|
|
253
|
+
except BaseException:
|
|
254
|
+
object.__setattr__(self,'_poisoned',True)
|
|
255
|
+
raise
|
|
256
|
+
|
|
257
|
+
@property
|
|
258
|
+
def size(self): return 6*len(json.loads(self._expanded)['graph']['nodes'])
|
|
259
|
+
|
|
260
|
+
def snapshot_bytes(self):
|
|
261
|
+
# Diagnostic snapshot only; no import/restart API until full preflight gate.
|
|
262
|
+
lock=self._owned_lock
|
|
263
|
+
if not lock.acquire(False): raise RuntimeError('owner in use')
|
|
264
|
+
try:
|
|
265
|
+
self._guard(full=True,lock=lock)
|
|
266
|
+
return canonical(dict(kind='UNQUALIFIED_G3C_GENERATION_DIAGNOSTIC',
|
|
267
|
+
state=json.loads(self._published.state),history=json.loads(self._published.history),
|
|
268
|
+
state_sha256=self._published.state_sha256,history_sha256=self._published.history_sha256))
|
|
269
|
+
finally: lock.release()
|
|
270
|
+
|
|
271
|
+
def _native_model(self,state):
|
|
272
|
+
data=json.loads(self._expanded); g=data['graph']; ids=[r[0] for r in g['nodes']]
|
|
273
|
+
points={n:np.asarray(x,dtype=float) for n,x in g['nodes']}; model=FEModel('private G3c sandbox')
|
|
274
|
+
for n in ids: model.add_node(n,*points[n])
|
|
275
|
+
elements=[]
|
|
276
|
+
for row in g['elements']:
|
|
277
|
+
if row['family']!='NATIVE': continue
|
|
278
|
+
x=np.array([points[n] for n in row['nodes']]); axis=x[2]-x[0]; axis/=np.linalg.norm(axis)
|
|
279
|
+
direction=np.array(row['orientation'],dtype=float); direction-=axis*(axis@direction); direction/=np.linalg.norm(direction)
|
|
280
|
+
frame=np.column_stack((axis,direction,np.cross(axis,direction)))
|
|
281
|
+
if row['roll_radians']!=0: raise ValueError('unregistered fixture roll')
|
|
282
|
+
e=native_module.ElasticElement(row['id'],tuple(row['nodes']),Reference(x,np.tile(frame,(3,1,1))),
|
|
283
|
+
ElasticSection.isotropic(**data['definitions']['native']),order=4)
|
|
284
|
+
model.add_element(e.element_id,e); model.materials[e.material_name]=e.section; elements.append(e)
|
|
285
|
+
from anyfesolver.matrix_assembly import _get_cached_sparsity_pattern
|
|
286
|
+
_get_cached_sparsity_pattern(model.mesh,'tangent_stiffness')
|
|
287
|
+
if model.mesh.dof_manager.total_dofs!=6*len(ids): raise ValueError('global DOF allocation changed')
|
|
288
|
+
states=({e.element_id:e.init_model_bound_nonlinear_state(model.mesh,e.section,1) for e in elements}
|
|
289
|
+
if state is None else {r['element_id']:native_payload(r['payload']) for r in state['native_rows']})
|
|
290
|
+
return model,tuple(elements),states
|
|
291
|
+
|
|
292
|
+
def _check_q4_registry(self):
|
|
293
|
+
data=json.loads(self._expanded); definition=json.loads(self._definition)
|
|
294
|
+
points=dict(data['graph']['nodes'])
|
|
295
|
+
expected=[e for e in data['graph']['elements'] if e['family']=='Q4']
|
|
296
|
+
if tuple(e['id'] for e in expected)!=tuple(i for i,_ in self._q4_cache):
|
|
297
|
+
raise ValueError('foreign Q4 cache membership')
|
|
298
|
+
direction=[1.,0.,0.] if definition['variant']!='PROPER_GLOBAL_TRANSFORM' else [0.,1.,0.]
|
|
299
|
+
for row,(eid,local) in zip(expected,self._q4_cache):
|
|
300
|
+
desc=local.descriptor()
|
|
301
|
+
if (type(local) is not physical_q4.AffineQ4PhysicalRecovery
|
|
302
|
+
or desc['construction_id']!=definition['fixture_id']+'::'+definition['variant']
|
|
303
|
+
or tuple(desc['node_ids'])!=tuple(row['nodes'])
|
|
304
|
+
or desc['coordinates']!=[points[n] for n in row['nodes']]
|
|
305
|
+
or desc['normal']!=data['definitions']['shell']['reference_normal']
|
|
306
|
+
or desc['material_direction']!=direction):
|
|
307
|
+
raise ValueError('graph and registered Q4 definition disagree')
|
|
308
|
+
|
|
309
|
+
def _adapter_rows(self,total,qa,q,*,epoch,previous,check):
|
|
310
|
+
data=json.loads(self._expanded); g=data['graph']; ids=[r[0] for r in g['nodes']]
|
|
311
|
+
points={n:np.array(x,dtype=float) for n,x in g['nodes']}; size=6*len(ids)
|
|
312
|
+
force=np.zeros(size); H=np.zeros((size,size)); envelopes=[]; diagnostics={}
|
|
313
|
+
previous_rows={} if previous is None else {r['element_id']:r for r in previous['adapter_rows']}
|
|
314
|
+
anchors={r['element_id']:r['anchor_node'] for r in data['anchors']}
|
|
315
|
+
origin=None if previous is None else sha(previous)
|
|
316
|
+
for row in g['elements']:
|
|
317
|
+
if row['family']=='NATIVE': continue
|
|
318
|
+
indices=[ids.index(n) for n in row['nodes']]; dofs=np.array([6*i+j for i in indices for j in range(6)])
|
|
319
|
+
x=np.array([points[n] for n in row['nodes']]); u=total[dofs].copy()
|
|
320
|
+
if previous is not None:
|
|
321
|
+
u.reshape(-1,6)[:,3:]-=np.asarray(previous['total_u'])[dofs].reshape(-1,6)[:,3:]
|
|
322
|
+
if row['family'] in ('B2','B3'):
|
|
323
|
+
d=data['definitions']['legacy']
|
|
324
|
+
section={k:d[k] for k in ('area','Iy','Iz','J','shear_factor_y','shear_factor_z','orientation')}
|
|
325
|
+
local=(physical_b2.PhysicalB2Adapter(tuple(row['nodes']),x,anchors[row['id']],d['E'],d['nu'],section)
|
|
326
|
+
if row['family']=='B2' else
|
|
327
|
+
beam_module.LocalBeam('B3',tuple(row['nodes']),x,anchors[row['id']],d['E'],d['nu'],section))
|
|
328
|
+
trial=local.evaluate(u,owned(qa[indices])); diagnostic_hash=None
|
|
329
|
+
elif row['family']=='Q4':
|
|
330
|
+
self._check_q4_registry()
|
|
331
|
+
local=dict(self._q4_cache)[row['id']]
|
|
332
|
+
trial=local.evaluate(u,owned(qa[indices]))
|
|
333
|
+
diagnostic_hash=sha256(trial.candidate).hexdigest()
|
|
334
|
+
else:
|
|
335
|
+
direction=np.array([1.,0.,0.])
|
|
336
|
+
if json.loads(self._definition)['variant']=='PROPER_GLOBAL_TRANSFORM': direction=np.asarray(U)@direction
|
|
337
|
+
local=shell_module.LocalShell('S3-V2D',tuple(row['nodes']),x,
|
|
338
|
+
np.array(data['definitions']['shell']['reference_normal'],dtype=float),direction)
|
|
339
|
+
trial=local.evaluate(u,owned(qa[indices])); diagnostic_hash=sha256(trial.candidate).hexdigest()
|
|
340
|
+
close(trial.kinematics.rotations,q[indices],'local physical pose mismatch')
|
|
341
|
+
force[dofs]+=trial.chart_force; H[np.ix_(dofs,dofs)]+=trial.chart_hessian
|
|
342
|
+
envelopes.append(dict(**definition_module.envelope_identities(row['family']),
|
|
343
|
+
recovery_witness_sha256=recovery_witness(row['family'],trial),
|
|
344
|
+
element_id=row['id'],policy=data['local_policies'][row['family']],
|
|
345
|
+
definition_sha256=trial.definition_sha256,epoch=epoch,
|
|
346
|
+
previous_sha256=None if previous is None else sha(previous_rows[row['id']]),
|
|
347
|
+
origin_sha256=origin,pose_sha256=sha(dict(node_ids=row['nodes'],
|
|
348
|
+
total_translations=total[dofs].reshape(-1,6)[:,:3],rotations=q[indices])),
|
|
349
|
+
deformation=trial.kinematics.deformation,diagnostic_sha256=diagnostic_hash,
|
|
350
|
+
source_material_committed=False,physical_recovery_complete=False))
|
|
351
|
+
diagnostics[row['id']]=trial
|
|
352
|
+
check('family:'+str(row['id']))
|
|
353
|
+
return owned(force),owned(H),envelopes,diagnostics
|
|
354
|
+
|
|
355
|
+
def _targets(self,cmd):
|
|
356
|
+
definition=json.loads(self._definition); programs=json.loads(self._programs)
|
|
357
|
+
motion=definition['common_motion']; W=np.eye(3); t=np.zeros(3)
|
|
358
|
+
if motion!='NONE' and cmd is not None:
|
|
359
|
+
s=cmd['step']/4 if cmd['kind']=='PREPARE_COMMON_MOTION' else 1.
|
|
360
|
+
W=rotation_module.rotation_exponential(s*np.array(programs['common_rotation_vectors'][int(motion[-1])]))
|
|
361
|
+
t=s*np.array(SHIFT,dtype=float)
|
|
362
|
+
if definition['variant']=='PROPER_GLOBAL_TRANSFORM':
|
|
363
|
+
transform=np.array(U,dtype=float); W=transform@W@transform.T
|
|
364
|
+
t=transform@t+np.array(SHIFT)-W@np.array(SHIFT)
|
|
365
|
+
root=np.eye(3); force=np.zeros(3)
|
|
366
|
+
if cmd is not None and cmd['kind']=='LOAD_STAGE':
|
|
367
|
+
v1,v2=np.array(programs['root_increment_vectors'],dtype=float)
|
|
368
|
+
if definition['variant']=='PROPER_GLOBAL_TRANSFORM': v1=np.asarray(U)@v1; v2=np.asarray(U)@v2
|
|
369
|
+
r1=rotation_module.rotation_exponential(v1); r2=rotation_module.rotation_exponential(v2)
|
|
370
|
+
root=[np.eye(3),r1,r2@r1,r1,np.eye(3)][cmd['root_stage']]
|
|
371
|
+
force=cmd['load_factor']*cmd['force_scale']*np.asarray(programs['force'])
|
|
372
|
+
if definition['variant']=='PROPER_GLOBAL_TRANSFORM': force=np.asarray(U)@force
|
|
373
|
+
force=W@force
|
|
374
|
+
return W,t,root,force
|
|
375
|
+
|
|
376
|
+
def _constraints(self,total,qa,mu,cmd):
|
|
377
|
+
g=json.loads(self._expanded)['graph']; ids=[r[0] for r in g['nodes']]; X=np.array([r[1] for r in g['nodes']],dtype=float)
|
|
378
|
+
size=6*len(ids); count=6*(len(g['fixed_nodes'])+len(g['joints']))
|
|
379
|
+
residual=np.zeros(size+count); tangent=np.zeros((size+count,size+count))
|
|
380
|
+
previous=np.asarray(json.loads(self._published.state)['total_u'])
|
|
381
|
+
eta=(total-previous).reshape(-1,6)[:,3:]; W,t,root,_=self._targets(cmd)
|
|
382
|
+
for k,node in enumerate(g['fixed_nodes']):
|
|
383
|
+
i=ids.index(node); target=W@(root if k==0 else np.eye(3)); xtarget=W@X[i]+t
|
|
384
|
+
z=[Jet2.variable(float(total[6*i+j]),j,6) for j in range(6)]
|
|
385
|
+
dq=[z[j+3]-float(previous[6*i+j+3]) for j in range(3)]
|
|
386
|
+
made=matmul(constant_matrix(target.T,6),matmul(so3_exp(dq),constant_matrix(qa[i],6)))
|
|
387
|
+
rows=[z[j]+float(X[i,j])-float(xtarget[j]) for j in range(3)]+so3_log(made)
|
|
388
|
+
J=np.array([v.gradient for v in rows]); h=np.einsum('i,ijk->jk',mu[6*k:6*k+6],np.array([v.hessian for v in rows]))
|
|
389
|
+
idx=np.arange(6*i,6*i+6); m=np.arange(size+6*k,size+6*k+6)
|
|
390
|
+
residual[idx]+=J.T@mu[6*k:6*k+6]; residual[m]=[v.value for v in rows]
|
|
391
|
+
tangent[np.ix_(idx,idx)]+=h; tangent[np.ix_(idx,m)]+=J.T; tangent[np.ix_(m,idx)]+=J
|
|
392
|
+
for j,row in enumerate(g['joints']):
|
|
393
|
+
ij=[ids.index(row['master']),ids.index(row['slave'])]; k=len(g['fixed_nodes'])+j
|
|
394
|
+
d0=np.array([row['master_frame'],row['slave_frame']],dtype=float)
|
|
395
|
+
joint=joint_module.RigidPoseJoint(X[ij],d0)
|
|
396
|
+
result=joint.evaluate_ports(X[ij]+total.reshape(-1,6)[ij,:3],qa[ij]@d0,
|
|
397
|
+
owned(mu[6*k:6*k+6]),rotation_coordinates=owned(eta[ij]),charted_ports=(True,True))
|
|
398
|
+
idx=np.array([6*i+l for i in ij for l in range(6)]+list(range(size+6*k,size+6*k+6)))
|
|
399
|
+
residual[idx]+=result.residual; tangent[np.ix_(idx,idx)]+=result.tangent
|
|
400
|
+
return owned(residual),owned(tangent)
|
|
401
|
+
|
|
402
|
+
def _evaluate(self,total,mu,cmd,origin,check):
|
|
403
|
+
self._guard(origin); state=json.loads(origin.state); total=owned(total,(self.size,))
|
|
404
|
+
qa=owned(state['rotations']); previous=owned(state['total_u']); delta=(total-previous).reshape(-1,6)[:,3:]
|
|
405
|
+
if np.any(np.linalg.norm(delta,axis=1)>=.9*np.pi): raise ValueError('trial chart requires cutback')
|
|
406
|
+
q=owned([rotation_module.rotation_exponential(v)@a for v,a in zip(delta,qa)])
|
|
407
|
+
model,elements,states=self._native_model(state); g=json.loads(self._expanded)['graph']; ids=[r[0] for r in g['nodes']]
|
|
408
|
+
X=np.array([r[1] for r in g['nodes']],dtype=float); coordinates=X+total.reshape(-1,6)[:,:3]
|
|
409
|
+
store=state_module.NonlinearStateStore.from_shell_layouts((),states)
|
|
410
|
+
store.attach_native_rotation_store(state_module.create_model_native_rotation_store(model,states,previous))
|
|
411
|
+
token=store.begin_trial(full_displacement=total,full_coordinates=coordinates)
|
|
412
|
+
force=np.zeros(self.size); H=np.zeros((self.size,self.size))
|
|
413
|
+
try:
|
|
414
|
+
for e in elements:
|
|
415
|
+
mapping=e.get_dof_mapping(model.mesh); indices=[ids.index(n) for n in e.node_ids]
|
|
416
|
+
e._load=(store,owned(np.zeros(3)),owned(np.zeros(3)))
|
|
417
|
+
def guard(e=e):
|
|
418
|
+
self._guard(origin)
|
|
419
|
+
if e._load is None or e._load[0] is not store or np.any(e._load[1]) or np.any(e._load[2]):
|
|
420
|
+
raise ValueError('sandbox native load authority')
|
|
421
|
+
e._owner_guard=guard
|
|
422
|
+
view=store.native_element_rotation_view(token,e.element_id,e.node_ids,e.native_reference_directors(model.mesh))
|
|
423
|
+
if not np.array_equal(view.trial_rotation_matrices,q[indices]): raise ValueError('native subset pose differs')
|
|
424
|
+
f,K,candidate=e.compute_nonlinear_response(model.mesh,e.section,total[mapping],states[e.element_id],1,True,
|
|
425
|
+
native_rotation_trial=view,native_material_context=store.native_material_context(token,e.element_id))
|
|
426
|
+
if candidate['epoch']!=state['epoch']+1: raise ValueError('material epoch reset')
|
|
427
|
+
store.set_trial_state(token,e.element_id,candidate)
|
|
428
|
+
force[mapping]+=f; H[np.ix_(mapping,mapping)]+=K; check('native:'+str(e.element_id))
|
|
429
|
+
f,K,rows,diagnostics=self._adapter_rows(total,qa,q,epoch=state['epoch']+1,previous=state,check=check)
|
|
430
|
+
force+=f; H+=K
|
|
431
|
+
_,_,_,load=self._targets(cmd); i=ids.index(g['load_node']); force[6*i:6*i+3]-=load
|
|
432
|
+
r,A=self._constraints(total,qa,mu,cmd); r=r.copy(); A=A.copy()
|
|
433
|
+
r[:self.size]+=force; A[:self.size,:self.size]+=H
|
|
434
|
+
check('assembly')
|
|
435
|
+
next_state=dict(schema=SCHEMA,epoch=state['epoch']+1,definition_sha256=sha(json.loads(self._definition)),
|
|
436
|
+
previous_sha256=origin.state_sha256,total_u=total,rotations=q,
|
|
437
|
+
native_rows=[dict(element_id=e.element_id,payload=store.materialize(trial_token=token)[e.element_id]) for e in elements],
|
|
438
|
+
adapter_rows=rows,multipliers=mu)
|
|
439
|
+
return owned(r),owned(A),next_state,(store,token,coordinates),diagnostics
|
|
440
|
+
except BaseException:
|
|
441
|
+
if store.has_active_trial: store.discard_trial(token)
|
|
442
|
+
raise
|
|
443
|
+
|
|
444
|
+
@staticmethod
|
|
445
|
+
def _discard(sandbox):
|
|
446
|
+
store,token,_=sandbox
|
|
447
|
+
if store.has_active_trial: store.discard_trial(token)
|
|
448
|
+
|
|
449
|
+
def trial(self,total,multipliers,cmd,*,hook=None):
|
|
450
|
+
"""Nonpublishing diagnostic; no caller origin or candidate-state import."""
|
|
451
|
+
return self._run(cmd,total,multipliers,hook=hook,solve_graph=False)
|
|
452
|
+
|
|
453
|
+
def solve(self,cmd,*,hook=None):
|
|
454
|
+
return self._run(cmd,None,None,hook=hook,solve_graph=True)
|
|
455
|
+
|
|
456
|
+
def _run(self,cmd,total,mu,*,hook,solve_graph):
|
|
457
|
+
if type(self) is not MixedGraphOwner or (hook is not None and not callable(hook)): raise ValueError('exact owner/callback')
|
|
458
|
+
lock=self._owned_lock
|
|
459
|
+
if not lock.acquire(False): raise RuntimeError('owner already in use')
|
|
460
|
+
sandbox=None; start=monotonic(); origin=self._published
|
|
461
|
+
try:
|
|
462
|
+
self._guard(origin,full=True,lock=lock)
|
|
463
|
+
history=json.loads(origin.history); state=json.loads(origin.state)
|
|
464
|
+
cmd=command(cmd,history,json.loads(self._definition)['common_motion'])
|
|
465
|
+
total=owned(state['total_u'] if total is None else total,(self.size,)).copy()
|
|
466
|
+
count=len(state['multipliers']); mu=owned(np.zeros(count) if mu is None else mu,(count,)).copy()
|
|
467
|
+
nonce=object(); object.__setattr__(self,'_active',nonce); object.__setattr__(self,'_serial',self._serial+1)
|
|
468
|
+
def check(stage):
|
|
469
|
+
if monotonic()-start>=600: raise TimeoutError('graph child deadline')
|
|
470
|
+
if self._active is not nonce: raise ValueError('foreign/stale graph trial capability')
|
|
471
|
+
self._guard(origin,lock=lock,nonce=nonce)
|
|
472
|
+
if hook is not None:
|
|
473
|
+
hook(stage)
|
|
474
|
+
self._guard(origin,full=True,lock=lock,nonce=nonce)
|
|
475
|
+
if self._active is not nonce: raise ValueError('changed graph trial capability')
|
|
476
|
+
progress(stage)
|
|
477
|
+
self._guard(origin,lock=lock,nonce=nonce)
|
|
478
|
+
check('pose')
|
|
479
|
+
if solve_graph and cmd['kind']=='PREPARE_COMMON_MOTION':
|
|
480
|
+
W,t,_,_=self._targets(cmd); X=np.asarray([r[1] for r in json.loads(self._expanded)['graph']['nodes']],dtype=float)
|
|
481
|
+
total.reshape(-1,6)[:,:3]=(X@W.T+t)-X
|
|
482
|
+
for i,qa in enumerate(np.asarray(state['rotations'])):
|
|
483
|
+
total[6*i+3:6*i+6]+=rotation_log(W@qa.T)
|
|
484
|
+
# A successful line-search evaluation is already the exact trial
|
|
485
|
+
# needed by the next Newton iteration. Keep that one owned
|
|
486
|
+
# sandbox locally until it is either committed or discarded;
|
|
487
|
+
# recomputing it used to repeat every element, joint and recovery
|
|
488
|
+
# evaluation without adding an observation or safety boundary.
|
|
489
|
+
pending_evaluation=None
|
|
490
|
+
for iteration in range(25):
|
|
491
|
+
if pending_evaluation is None:
|
|
492
|
+
r,A,next_state,sandbox,diagnostics=self._evaluate(total,mu,cmd,origin,check)
|
|
493
|
+
else:
|
|
494
|
+
r,A,next_state,sandbox,diagnostics=pending_evaluation
|
|
495
|
+
pending_evaluation=None
|
|
496
|
+
if not solve_graph:
|
|
497
|
+
result=dict(residual=r,tangent=A,candidate=canonical(next_state),
|
|
498
|
+
diagnostics=diagnostics,production_qualified=False,state_committed=False)
|
|
499
|
+
return result
|
|
500
|
+
error=float(np.linalg.norm(r))
|
|
501
|
+
if error<=1e-11:
|
|
502
|
+
check('prepare')
|
|
503
|
+
pending={r['element_id']:native_payload(r['payload']) for r in next_state['native_rows']}
|
|
504
|
+
store,token,coordinates=sandbox
|
|
505
|
+
store.commit(token,accepted_full_displacement=total,accepted_full_coordinates=coordinates)
|
|
506
|
+
check('native_committed')
|
|
507
|
+
if canonical(store.materialize())!=canonical(pending): raise ValueError('native commit changed prepared state')
|
|
508
|
+
entry=dict(epoch=next_state['epoch'],previous_entry_sha256=None if not history else sha(history[-1]),
|
|
509
|
+
origin_sha256=origin.state_sha256,command=cmd,accepted_state_sha256=sha(next_state))
|
|
510
|
+
made=generation(next_state,history+[entry])
|
|
511
|
+
result=dict(total_u=owned(total),rotations=owned(next_state['rotations']),multipliers=owned(mu),
|
|
512
|
+
residual=r,iterations=iteration,state_sha256=made.state_sha256,epoch=next_state['epoch'],
|
|
513
|
+
production_qualified=False,physical_recovery_complete=False)
|
|
514
|
+
check('before_publish'); self._guard(origin,full=True,lock=lock,nonce=nonce)
|
|
515
|
+
# All sandbox work is terminal before the sole publication.
|
|
516
|
+
# The finally path now only clears an owned nonce/releases
|
|
517
|
+
# the already-held primitive lock; no family dispatch remains.
|
|
518
|
+
sandbox=None
|
|
519
|
+
object.__setattr__(self,'_active',None)
|
|
520
|
+
object.__setattr__(self,'_published',made)
|
|
521
|
+
return result
|
|
522
|
+
self._discard(sandbox); sandbox=None
|
|
523
|
+
if iteration==24: raise ValueError('graph iteration limit')
|
|
524
|
+
step=solve(A,-r)
|
|
525
|
+
# Sixteen binary reductions retain the registered Newton
|
|
526
|
+
# direction while allowing a large KKT step to enter the
|
|
527
|
+
# admissible rotation chart before testing residual descent.
|
|
528
|
+
# This is still bounded (at most sixteen trial evaluations).
|
|
529
|
+
for cut in range(16):
|
|
530
|
+
check('line_search'); fraction=.5**cut
|
|
531
|
+
trial=total+fraction*step[:self.size]; multipliers=mu+fraction*step[self.size:]
|
|
532
|
+
try:
|
|
533
|
+
changed,trial_A,trial_state,sandbox,trial_diagnostics=self._evaluate(
|
|
534
|
+
trial,multipliers,cmd,origin,check)
|
|
535
|
+
except ValueError as exc:
|
|
536
|
+
# The chart ceiling is a trial-admissibility boundary,
|
|
537
|
+
# not a failure of the accepted state. Backtracking is
|
|
538
|
+
# the registered cutback mechanism. Catch only this
|
|
539
|
+
# exact typed diagnostic; every mechanics, state, and
|
|
540
|
+
# authority error remains fatal.
|
|
541
|
+
if str(exc)!='trial chart requires cutback': raise
|
|
542
|
+
sandbox=None
|
|
543
|
+
continue
|
|
544
|
+
trial_error=float(np.linalg.norm(changed))
|
|
545
|
+
if trial_error<error:
|
|
546
|
+
pending_evaluation=(changed,trial_A,trial_state,sandbox,trial_diagnostics)
|
|
547
|
+
total=trial; mu=multipliers; break
|
|
548
|
+
self._discard(sandbox); sandbox=None
|
|
549
|
+
else: raise ValueError('graph line search failed')
|
|
550
|
+
raise ValueError('unreachable graph solve')
|
|
551
|
+
finally:
|
|
552
|
+
if sandbox is not None: self._discard(sandbox)
|
|
553
|
+
object.__setattr__(self,'_active',None)
|
|
554
|
+
# A hostile observer may already have released this primitive.
|
|
555
|
+
# Never release a replacement read back from the owner.
|
|
556
|
+
if lock.locked(): lock.release()
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""Private source-native scalar recovery diagnostics; not qualification."""
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
from ._ge_beam3_g3c_local_beam import owned
|
|
6
|
+
|
|
7
|
+
POLICY = 'GE_BEAM3_G3C_SCALAR_LOCAL_RECOVERY_V1'
|
|
8
|
+
ORDER = ('eps_x', 'gamma_xy', 'gamma_xz', 'kappa_x', 'kappa_y', 'kappa_z')
|
|
9
|
+
RESULTANT_ORDER = ('N', 'Vy', 'Vz', 'T', 'My', 'Mz')
|
|
10
|
+
|
|
11
|
+
class PhysicalRecoveryBlocked(ValueError):
|
|
12
|
+
"""The unchanged operator cannot support the claimed physical recovery."""
|
|
13
|
+
code = 'BLOCKED_G3C_B2_PHYSICAL_RECOVERY_SHEAR_CLAMP'
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class StationDiagnostics:
|
|
17
|
+
stations: np.ndarray
|
|
18
|
+
weights: np.ndarray
|
|
19
|
+
strains: np.ndarray
|
|
20
|
+
resultants: np.ndarray
|
|
21
|
+
strain_differential: np.ndarray
|
|
22
|
+
reference_frame: np.ndarray
|
|
23
|
+
current_frame: np.ndarray
|
|
24
|
+
energy: float
|
|
25
|
+
definition_sha256: str
|
|
26
|
+
policy: str = POLICY
|
|
27
|
+
strain_order: tuple = ORDER
|
|
28
|
+
resultant_order: tuple = RESULTANT_ORDER
|
|
29
|
+
|
|
30
|
+
def recover(definition, kin, transform, element, material, seal):
|
|
31
|
+
"""Recover the scalar potential, never the legacy linear stress envelope.
|
|
32
|
+
|
|
33
|
+
Called only with a fresh, already evaluated local element. Differential
|
|
34
|
+
columns refer to local deformation in reference-global coordinates, not
|
|
35
|
+
global spatial nodal wrenches. The caller applies the complete pose map.
|
|
36
|
+
"""
|
|
37
|
+
ref=np.array(definition['coordinates']); n=len(ref)
|
|
38
|
+
L=float(np.linalg.norm(ref[-1]-ref[0])); section=definition['section']
|
|
39
|
+
E=definition['E']; G=E/(2*(1+definition['nu']))
|
|
40
|
+
S=owned([E*section['area'],G*section['area']*section['shear_factor_y'],
|
|
41
|
+
G*section['area']*section['shear_factor_z'],G*section['J'],
|
|
42
|
+
E*section['Iy'],E*section['Iz']])
|
|
43
|
+
if np.any(S<=0): raise ValueError('nonpositive computed section rigidity')
|
|
44
|
+
points=np.array([-np.sqrt(3/5),0.,np.sqrt(3/5)])
|
|
45
|
+
weights=np.array([5/9,8/9,5/9])*L/2
|
|
46
|
+
local=transform@kin.deformation; rows=[]; jacobians=[]
|
|
47
|
+
if n==2:
|
|
48
|
+
if min(S[1],S[2])*L**2<1e-12:
|
|
49
|
+
raise PhysicalRecoveryBlocked(PhysicalRecoveryBlocked.code)
|
|
50
|
+
# The fresh actual scalar evaluation owns this cache. Do not invent
|
|
51
|
+
# an effective physical section to absorb its historical shear floor.
|
|
52
|
+
K=element._nl_cache['K_noax']; f0=K@local
|
|
53
|
+
slope=(local[6:9]-local[:3])/L
|
|
54
|
+
eps=slope[0]+.5*(slope[1]**2+slope[2]**2)
|
|
55
|
+
deps=np.zeros(12)
|
|
56
|
+
deps[:3]=-np.array([1.,slope[1],slope[2]])/L; deps[6:9]=-deps[:3]
|
|
57
|
+
indices=[9,4,10,5,11]
|
|
58
|
+
q=np.r_[S[0]*eps,f0[indices]]
|
|
59
|
+
dq=np.vstack((S[0]*deps,K[indices]))
|
|
60
|
+
energy=.5*float(local@K@local)+.5*S[0]*L*eps**2
|
|
61
|
+
for xi in points:
|
|
62
|
+
t=(xi+1)/2; H=np.zeros((6,6)); H[0,0]=H[3,1]=1
|
|
63
|
+
H[1,4:6]=-1/L; H[2,2:4]=1/L
|
|
64
|
+
H[4,2:4]=[t-1,t]; H[5,4:6]=[t-1,t]
|
|
65
|
+
rows.append((H@q)/S)
|
|
66
|
+
jacobians.append(((H@dq)/S[:,None])@transform)
|
|
67
|
+
elif n==3:
|
|
68
|
+
values=local.reshape(3,6)
|
|
69
|
+
for xi in points:
|
|
70
|
+
shape=np.array([xi*(xi-1)/2,1-xi**2,xi*(xi+1)/2])
|
|
71
|
+
derivative=np.array([xi-.5,-2*xi,xi+.5])*2/L
|
|
72
|
+
grad=derivative@values; interp=shape@values
|
|
73
|
+
rows.append([grad[0]+.5*(grad[1]**2+grad[2]**2),
|
|
74
|
+
grad[1]-interp[5],grad[2]+interp[4],*grad[3:]])
|
|
75
|
+
B=np.zeros((6,18))
|
|
76
|
+
for i,(Ni,Di) in enumerate(zip(shape,derivative)):
|
|
77
|
+
b=6*i
|
|
78
|
+
B[0,b:b+3]=Di*np.array([1.,grad[1],grad[2]])
|
|
79
|
+
B[1,b+1]=Di; B[1,b+5]=-Ni
|
|
80
|
+
B[2,b+2]=Di; B[2,b+4]=Ni
|
|
81
|
+
B[3,b+3]=B[4,b+4]=B[5,b+5]=Di
|
|
82
|
+
jacobians.append(B@transform)
|
|
83
|
+
energy=.5*float(np.einsum('i,ij,j,ij->',weights,rows,S,rows))
|
|
84
|
+
else: raise ValueError('unregistered scalar recovery family')
|
|
85
|
+
strain=owned(rows); resultant=owned(strain*S); differential=owned(jacobians)
|
|
86
|
+
integrated=.5*float(np.einsum('i,ij,ij->',weights,strain,resultant))
|
|
87
|
+
if not np.isfinite(energy) or not np.isfinite(integrated) or energy<0 or abs(integrated-energy)>1e-11*max(1.,abs(energy),abs(integrated)):
|
|
88
|
+
raise ValueError('station and actual local potential disagree')
|
|
89
|
+
frame=transform[:3,:3].T
|
|
90
|
+
return StationDiagnostics(owned(points),owned(weights),strain,resultant,
|
|
91
|
+
differential,owned(frame),owned(kin.frame@frame),float(energy),seal)
|