├── .github └── workflows │ ├── docker.yml │ ├── main.yml │ ├── pages.yml │ └── publish-to-test-pypi.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── MANIFEST.in ├── README.rst ├── docs ├── Makefile ├── make.bat └── source │ ├── _static │ └── custom.css │ ├── _templates │ ├── custom-class-template.rst │ ├── custom-module-template.rst │ └── footer.html │ ├── bibliography.rst │ ├── conf.py │ ├── example_problems │ ├── airplane_modal_test.rst │ ├── assets │ │ ├── a.inp │ │ ├── ab.inp │ │ ├── abc.inp │ │ ├── b.inp │ │ ├── bc.inp │ │ ├── block_1.inp │ │ ├── block_2.inp │ │ ├── block_all.inp │ │ ├── c.inp │ │ ├── create_models.py │ │ └── cubit_input_file.py │ ├── craig_bampton_substructuring.rst │ ├── figures │ │ ├── Airplane_Random_Excitation.png │ │ ├── EFI_vs_DoF.png │ │ ├── Sine_Force_Signal.png │ │ ├── airplane_candidate_sensor_locations.png │ │ ├── airplane_coordinate_system_closeup.png │ │ ├── airplane_coordinate_systems.gif │ │ ├── airplane_global_coordinate_system_closeup.png │ │ ├── airplane_gui_plot.png │ │ ├── airplane_modal_drive_points.png │ │ ├── airplane_mode_right_cs.gif │ │ ├── airplane_mode_wrong_cs.gif │ │ ├── airplane_polypy_stabilization.png │ │ ├── airplane_polypy_stabilization_resynthesis.png │ │ ├── airplane_polypy_stabilization_selection.png │ │ ├── airplane_serep_expansion.gif │ │ ├── airplane_serep_expansion_overlay.gif │ │ ├── airplane_shape_overlay_fem.gif │ │ ├── airplane_shape_overlay_test.gif │ │ ├── airplane_test_vs_fem_mac.png │ │ ├── beam_airplane_buzz_control.png │ │ ├── beam_airplane_buzz_inputs.png │ │ ├── beam_airplane_buzz_prediction_vs_simulation.png │ │ ├── beam_airplane_buzz_spec_modification.png │ │ ├── beam_airplane_control_dofs.png │ │ ├── beam_airplane_control_dofs_mac.png │ │ ├── beam_airplane_environment_frfs.png │ │ ├── beam_airplane_environment_inputs.png │ │ ├── beam_airplane_mimo_shaker_locations.png │ │ ├── beam_airplane_pseudoinverse_control.png │ │ ├── beam_airplane_pseudoinverse_inputs.png │ │ ├── beam_airplane_response_weighting_matrix.png │ │ ├── beam_airplane_shaker_weighting.png │ │ ├── beam_airplane_shaker_weighting_control.png │ │ ├── beam_airplane_shaker_weighting_inputs.png │ │ ├── beam_airplane_tikhonov_control.png │ │ ├── beam_airplane_tikhonov_inputs.png │ │ ├── beam_airplane_time_history_generation.png │ │ ├── beam_airplane_weighted_response_control.png │ │ ├── beam_airplane_weighted_response_inputs.png │ │ ├── corrected_rigid_shape.gif │ │ ├── error_rigid_shape.gif │ │ ├── example_rigid_body_test.png │ │ ├── geometry_corrected.png │ │ ├── geometry_error.png │ │ ├── geometry_truth.png │ │ ├── modal_system_spy.png │ │ ├── rigid_body_check_complex_plane.png │ │ ├── rigid_body_check_residual.png │ │ ├── sdynpy_demo_expanded_mode_1.gif │ │ ├── sdynpy_demo_fem_geometry.png │ │ ├── sdynpy_demo_frfs.png │ │ ├── sdynpy_demo_guiplot.png │ │ ├── sdynpy_demo_latex_figures.png │ │ ├── sdynpy_demo_latex_modeshapes.png │ │ ├── sdynpy_demo_latex_title.png │ │ ├── sdynpy_demo_mac_test_fem.png │ │ ├── sdynpy_demo_mode_1.gif │ │ ├── sdynpy_demo_polypy_resynthesize.png │ │ ├── sdynpy_demo_polypy_setup.png │ │ ├── sdynpy_demo_polypy_stability_plot.png │ │ ├── sdynpy_demo_reference_coordinates.png │ │ ├── sdynpy_demo_references_and_responses.png │ │ ├── sdynpy_demo_response_coordinates.png │ │ ├── sdynpy_demo_slide_geometry.png │ │ ├── sdynpy_demo_slide_mode_1.png │ │ ├── sdynpy_demo_slide_mode_parameters.png │ │ ├── sdynpy_demo_slide_title.png │ │ ├── sdynpy_demo_smac_autofit.png │ │ ├── sdynpy_demo_smac_cmif_resynthesis.png │ │ ├── sdynpy_demo_smac_corrcoef.png │ │ ├── sdynpy_demo_smac_frf_resynthesis.png │ │ ├── sdynpy_demo_smac_initial_rootlist.png │ │ ├── sdynpy_demo_smac_mac.png │ │ ├── sdynpy_demo_smac_pseudoinverse.png │ │ ├── sdynpy_demo_smac_shape_and_eval.png │ │ ├── sdynpy_demo_test_geometry.png │ │ ├── sdynpy_demo_test_node_geometry.png │ │ ├── sdynpy_demo_time_data.png │ │ ├── sdynpy_demo_vis_paraview.png │ │ ├── spaceship_assembled_mode_shape.gif │ │ ├── spaceship_block_1_mac.png │ │ ├── spaceship_block_1_modeshape_comparison_large_errors.gif │ │ ├── spaceship_block_1_modeshape_comparison_perfect.gif │ │ ├── spaceship_block_1_modeshape_comparison_small_errors.gif │ │ ├── spaceship_block_2_mac.png │ │ ├── spaceship_block_2_modeshape_comparison_large_errors.gif │ │ ├── spaceship_block_2_modeshape_comparison_perfect.gif │ │ ├── spaceship_block_2_modeshape_comparison_small_errors.gif │ │ ├── spaceship_mesh.png │ │ ├── spaceship_substructuring_mac.png │ │ ├── spaceship_substructuring_truth_comparison.gif │ │ ├── test_dofs_on_fem.png │ │ ├── test_geometry_labeled.png │ │ ├── test_geometry_with_tracelines_labeled.png │ │ ├── test_mac.png │ │ ├── test_shape.gif │ │ ├── transmission_simulator_ABC_mode_example.gif │ │ ├── transmission_simulator_ABC_mode_reduced_example.gif │ │ ├── transmission_simulator_AB_mode_example.gif │ │ ├── transmission_simulator_AB_mode_reduced_example.gif │ │ ├── transmission_simulator_A_mode_example.gif │ │ ├── transmission_simulator_A_mode_reduced_example.gif │ │ ├── transmission_simulator_BC_mode_example.gif │ │ ├── transmission_simulator_BC_mode_reduced_example.gif │ │ ├── transmission_simulator_B_mode_example.gif │ │ ├── transmission_simulator_B_mode_reduced_example.gif │ │ ├── transmission_simulator_C_mode_example.gif │ │ ├── transmission_simulator_C_mode_reduced_example.gif │ │ ├── transmission_simulator_concatenated_AB_mode.gif │ │ ├── transmission_simulator_concatenated_BC_mode.gif │ │ ├── transmission_simulator_concatenated_B_mode.gif │ │ ├── transmission_simulator_concatenated_systems.png │ │ ├── transmission_simulator_math.png │ │ ├── transmission_simulator_setup.png │ │ ├── transmission_simulator_substructured_mode_shape.gif │ │ ├── transmission_simulator_truth_mode_shape.gif │ │ ├── tuning_fork_analyze_menu.png │ │ ├── tuning_fork_analyze_setup.png │ │ ├── tuning_fork_cmif_fits.png │ │ ├── tuning_fork_coh_guifrf.png │ │ ├── tuning_fork_compute_guifrf.png │ │ ├── tuning_fork_deflection_shape_plot.png │ │ ├── tuning_fork_deflection_shape_plot_menu.png │ │ ├── tuning_fork_displacement.png │ │ ├── tuning_fork_displacement_animation.gif │ │ ├── tuning_fork_frf_fits.png │ │ ├── tuning_fork_frf_guifrf.png │ │ ├── tuning_fork_geometry.png │ │ ├── tuning_fork_initial_guifrf.png │ │ ├── tuning_fork_mode_animation.gif │ │ ├── tuning_fork_pseudorandom_signal.png │ │ ├── tuning_fork_pseudorandom_signal_zoom.png │ │ ├── tuning_fork_random_cmif_fit.png │ │ ├── tuning_fork_random_coherence.png │ │ ├── tuning_fork_random_coherence_no_window.png │ │ ├── tuning_fork_random_frfs.png │ │ ├── tuning_fork_random_guifrf.png │ │ ├── tuning_fork_random_polypy_setup.png │ │ ├── tuning_fork_random_polypy_stability.png │ │ ├── tuning_fork_random_polypy_stability_zoom.png │ │ ├── tuning_fork_random_signal.png │ │ ├── tuning_fork_random_signal_zoom.png │ │ ├── tuning_fork_reject_frame_guifrf.png │ │ ├── tuning_fork_root_hover.png │ │ ├── tuning_fork_selected_roots.png │ │ ├── tuning_fork_setup.png │ │ ├── tuning_fork_sm_mac.png │ │ └── tuning_fork_sm_sd_mac.png │ ├── mimo_random_vibration_control.rst │ ├── model_reduction │ │ └── model_reduction.ipynb │ ├── rattlesnake_demonstration.rst │ ├── transient_fem_analysis.rst │ └── transmission_simulator.rst │ ├── examples.rst │ ├── images │ ├── Showcase_Beam_CMIF.png │ ├── Showcase_Beam_Combined_Coordinates.png │ ├── Showcase_Beam_Combined_System_Matrices.png │ ├── Showcase_Beam_Constrained_FRF.png │ ├── Showcase_Beam_Coordinates.png │ ├── Showcase_Beam_Coordinates_Zoomed.png │ ├── Showcase_Beam_Deflection_Shape_Plotter_1.png │ ├── Showcase_Beam_Deflection_Shape_Plotter_2.png │ ├── Showcase_Beam_Drive_FRFs.png │ ├── Showcase_Beam_Drive_FRFs_Closeup.png │ ├── Showcase_Beam_Excitation_DoFs.png │ ├── Showcase_Beam_FBS_Results.png │ ├── Showcase_Beam_GUIPlot_FRFs.png │ ├── Showcase_Beam_Geometry.png │ ├── Showcase_Beam_Geometry_2.png │ ├── Showcase_Beam_Initial_SPGUI.png │ ├── Showcase_Beam_Initial_SPGUI_Computed.png │ ├── Showcase_Beam_Initial_SPGUI_Functions.png │ ├── Showcase_Beam_Initial_SPGUI_Overlap.png │ ├── Showcase_Beam_Initial_SPGUI_References_Selected.png │ ├── Showcase_Beam_Initial_SPGUI_Sampling_Set.png │ ├── Showcase_Beam_Initial_SPGUI_Start_Time.png │ ├── Showcase_Beam_Initial_SPGUI_Window.png │ ├── Showcase_Beam_Labelled_Coordinates.png │ ├── Showcase_Beam_MAC.png │ ├── Showcase_Beam_MMIF.png │ ├── Showcase_Beam_Modal_System_Matrices.png │ ├── Showcase_Beam_Mode_Animation.gif │ ├── Showcase_Beam_Mode_Animation_From_Polypy.gif │ ├── Showcase_Beam_Mode_Combined_Unconstrained_Animation_1.gif │ ├── Showcase_Beam_Mode_Combined_Unconstrained_Animation_2.gif │ ├── Showcase_Beam_Mode_Comparison_Animation.gif │ ├── Showcase_Beam_Mode_Constrained_Animation.gif │ ├── Showcase_Beam_NMIF.png │ ├── Showcase_Beam_Plot_Transient.png │ ├── Showcase_Beam_PolyPy_Initial.png │ ├── Showcase_Beam_PolyPy_Region_1.png │ ├── Showcase_Beam_PolyPy_Region_1_Initial_Stability.png │ ├── Showcase_Beam_PolyPy_Region_1_Resynth.png │ ├── Showcase_Beam_PolyPy_Region_1_Stability.png │ ├── Showcase_Beam_PolyPy_Region_2.png │ ├── Showcase_Beam_PolyPy_Region_2_Resynth.png │ ├── Showcase_Beam_PolyPy_Region_2_Stability.png │ ├── Showcase_Beam_Random_Excitation.png │ ├── Showcase_Beam_Response_DoFs.png │ ├── Showcase_Beam_Response_GUIPlot.png │ ├── Showcase_Beam_SMAC_AddRoot_Converged.png │ ├── Showcase_Beam_SMAC_AddRoot_FreqRange_Lin.png │ ├── Showcase_Beam_SMAC_AddRoot_FreqRange_Log.png │ ├── Showcase_Beam_SMAC_AddRoot_Initial.png │ ├── Showcase_Beam_SMAC_AddedRoot.png │ ├── Showcase_Beam_SMAC_AutofitRoots.png │ ├── Showcase_Beam_SMAC_CorrCoef.png │ ├── Showcase_Beam_SMAC_InitialRootlist.png │ ├── Showcase_Beam_SMAC_Pseudoinverse.png │ ├── Showcase_Beam_SMAC_Resynth.png │ ├── Showcase_Beam_SMAC_ShapesEval.png │ ├── Showcase_Beam_Shape_Plotter_Overview.png │ ├── Showcase_Beam_System_Matrices.png │ ├── Showcase_Beam_Transformation.png │ ├── Showcase_Time_History_Demo.png │ ├── logo_horizontal.svg │ ├── logo_horizontal_light.svg │ └── snl.jpg │ ├── index.rst │ ├── main.bib │ ├── modal_tutorials.rst │ ├── modal_tutorials │ ├── Modal_01_What_is_Modal_Analysis │ │ ├── Modal_01_What_is_Modal_Analysis.ipynb │ │ └── figures │ │ │ ├── beam_airplane_deflection_shape.png │ │ │ ├── beam_airplane_excitation_locations.png │ │ │ ├── deflection_shape_1.png │ │ │ ├── deflection_shape_2.png │ │ │ ├── deflection_shape_3.png │ │ │ ├── deflection_shape_4.png │ │ │ ├── deflection_shape_5.png │ │ │ ├── deflection_shape_6.png │ │ │ └── wingtip_frequency_demonstration.png │ ├── Modal_02_Basics_of_Vibrations │ │ └── Modal_02_Basics_of_Vibrations.ipynb │ ├── Modal_03_Multi_DoF_Vibrations │ │ ├── Modal_03_Multi_DoF_Vibrations.ipynb │ │ └── figures │ │ │ ├── spring_mass_2.svg │ │ │ └── spring_mass_3.svg │ ├── Modal_04_Modal_Analysis │ │ ├── Modal_04_Modal_Analysis.ipynb │ │ └── figures │ │ │ ├── plate_mode_11.gif │ │ │ ├── plate_mode_22.gif │ │ │ ├── plate_mode_3.gif │ │ │ ├── plate_mode_7.gif │ │ │ ├── plate_mode_8.gif │ │ │ └── plate_mode_9.gif │ ├── Modal_05_Experimental_Modal_Analysis │ │ ├── Modal_05_Experimental_Modal_Analysis.rst │ │ ├── Modal_05a_Computing_FRF_from_Time_Data.ipynb │ │ ├── Modal_05b_Types_of_Excitation.ipynb │ │ ├── Modal_05c_Selecting_Response_and_Measurement_DoFs.ipynb │ │ ├── Modal_05d_Data_Quality_Checks.ipynb │ │ ├── Modal_05e_Fitting_Modes_to_FRF.ipynb │ │ ├── Modal_05f_Comparing_Test_and_Analysis.ipynb │ │ └── figures │ │ │ ├── coherence_br.png │ │ │ ├── coherence_chirp.png │ │ │ ├── coherence_impact.png │ │ │ ├── coherence_pr.png │ │ │ ├── coherence_random.png │ │ │ ├── coherence_random_nowindow.png │ │ │ ├── coherence_simo_pr.png │ │ │ ├── deflection_shape_60_hz.gif │ │ │ ├── frf_br.png │ │ │ ├── frf_chirp.png │ │ │ ├── frf_impact.png │ │ │ ├── frf_pr.png │ │ │ ├── frf_random.png │ │ │ ├── frf_random_nowindow.png │ │ │ ├── frf_simo_pr.png │ │ │ ├── impact_spgui.png │ │ │ ├── mimo_br_spgui.png │ │ │ ├── mimo_pr_spgui.png │ │ │ ├── plate_excitation_locations.gif │ │ │ ├── random_spgui.png │ │ │ ├── simo_chirp_spgui.png │ │ │ ├── simo_pr_spgui.png │ │ │ ├── sine_deflection_multiline_animation.gif │ │ │ └── windowed_time_random.png │ └── Modal_06_Complex_Modes │ │ └── Modal_06_Complex_Modes.ipynb │ ├── modules.rst │ ├── sdynpy_showcase.rst │ └── usage.rst ├── pyproject.toml ├── run_tests.bat ├── setup.cfg ├── setup.py ├── src └── sdynpy │ ├── __init__.py │ ├── core │ ├── GUIPlot.ui │ ├── __init__.py │ ├── sdynpy_array.py │ ├── sdynpy_colors.py │ ├── sdynpy_coordinate.py │ ├── sdynpy_data.py │ ├── sdynpy_geometry.py │ ├── sdynpy_matrix.py │ ├── sdynpy_shape.py │ └── sdynpy_system.py │ ├── demo │ ├── __init__.py │ ├── beam_airplane.py │ └── beam_plate.py │ ├── doc │ ├── __init__.py │ ├── sdynpy_latex.py │ └── sdynpy_ppt.py │ ├── fem │ ├── __init__.py │ ├── sdynpy_beam.py │ ├── sdynpy_dof.py │ ├── sdynpy_exodus.py │ └── sdynpy_shaker.py │ ├── fileio │ ├── __init__.py │ ├── sdynpy_rattlesnake.py │ ├── sdynpy_tshaker.py │ ├── sdynpy_uff.py │ ├── sdynpy_uff_datasets │ │ ├── __init__.py │ │ ├── sdynpy_uff_dataset_151.py │ │ ├── sdynpy_uff_dataset_164.py │ │ ├── sdynpy_uff_dataset_1858.py │ │ ├── sdynpy_uff_dataset_2400.py │ │ ├── sdynpy_uff_dataset_2411.py │ │ ├── sdynpy_uff_dataset_2412.py │ │ ├── sdynpy_uff_dataset_2420.py │ │ ├── sdynpy_uff_dataset_55.py │ │ ├── sdynpy_uff_dataset_58.py │ │ └── sdynpy_uff_dataset_82.py │ └── sdynpy_vic.py │ ├── modal │ ├── __init__.py │ ├── colored_cmif.ui │ ├── mode_properties.ui │ ├── polypy.ui │ ├── polypy_stability_diagram.ui │ ├── sdynpy_ccmif.py │ ├── sdynpy_modal_test.py │ ├── sdynpy_modeshape.py │ ├── sdynpy_polypy.py │ ├── sdynpy_signal_processing_gui.py │ ├── sdynpy_smac.py │ ├── signal_processing.ui │ ├── smac.ui │ └── smac_add_root.ui │ └── signal_processing │ ├── __init__.py │ ├── sdynpy_camera.py │ ├── sdynpy_complex.py │ ├── sdynpy_correlation.py │ ├── sdynpy_cpsd.py │ ├── sdynpy_frf.py │ ├── sdynpy_frf_inverse.py │ ├── sdynpy_generator.py │ ├── sdynpy_geometry_fitting.py │ ├── sdynpy_harmonic.py │ ├── sdynpy_integration.py │ ├── sdynpy_lrm.py │ ├── sdynpy_rotation.py │ └── sdynpy_srs.py └── tests ├── coordinate_test.py ├── data_test.py ├── geometry_test.py ├── shape_test.py └── test_data └── cellstr_test.mat /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Docker 2 | on: 3 | push: 4 | branches: [ "main" ] 5 | pull_request: 6 | branches: [ "main" ] 7 | release: 8 | types: [ "published" ] 9 | jobs: 10 | test: 11 | if: github.event_name == 'pull_request' 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: checkout 15 | uses: actions/checkout@v3 16 | - name: build 17 | uses: docker/build-push-action@v3.2.0 18 | with: 19 | push: false 20 | tags: dprohe/sdynpy:test 21 | latest: 22 | if: github.event_name == 'push' 23 | runs-on: ubuntu-latest 24 | steps: 25 | - name: checkout 26 | uses: actions/checkout@v3 27 | - name: login 28 | uses: docker/login-action@v2.1.0 29 | with: 30 | username: dprohe 31 | password: ${{ secrets.DOCKERHUB_TOKEN }} 32 | - name: login 33 | uses: docker/login-action@v2 34 | with: 35 | registry: ghcr.io 36 | username: ${{ github.actor }} 37 | password: ${{ secrets.GITHUB_TOKEN }} 38 | - name: build-push 39 | uses: docker/build-push-action@v3.2.0 40 | with: 41 | push: true 42 | tags: | 43 | dprohe/sdynpy:latest 44 | ghcr.io/sandialabs/sdynpy:latest 45 | versioned: 46 | if: github.event_name == 'release' 47 | runs-on: ubuntu-latest 48 | steps: 49 | - name: tag 50 | id: tag 51 | uses: dawidd6/action-get-tag@v1 52 | with: 53 | strip_v: true 54 | - name: checkout 55 | uses: actions/checkout@v3 56 | - name: login 57 | uses: docker/login-action@v2.1.0 58 | with: 59 | username: dprohe 60 | password: ${{ secrets.DOCKERHUB_TOKEN }} 61 | - name: login 62 | uses: docker/login-action@v2 63 | with: 64 | registry: ghcr.io 65 | username: ${{ github.actor }} 66 | password: ${{ secrets.GITHUB_TOKEN }} 67 | - name: build-push 68 | uses: docker/build-push-action@v3.2.0 69 | with: 70 | push: true 71 | tags: | 72 | dprohe/sdynpy:${{steps.tag.outputs.tag}} 73 | dprohe/sdynpy:latest 74 | ghcr.io/sandialabs/sdynpy:${{steps.tag.outputs.tag}} 75 | ghcr.io/sandialabs/sdynpy:latest 76 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: main 2 | on: 3 | push: 4 | branches: [ main ] 5 | pull_request: 6 | branches: [ main ] 7 | workflow_dispatch: 8 | jobs: 9 | test: 10 | runs-on: ubuntu-22.04 11 | strategy: 12 | fail-fast: false 13 | matrix: 14 | python-version: ['3.8', '3.9', '3.10'] 15 | steps: 16 | - uses: actions/checkout@v2 17 | - name: python ${{ matrix.python-version }} 18 | uses: actions/setup-python@v2 19 | with: 20 | python-version: ${{ matrix.python-version }} 21 | - name: install 22 | run: pip install .[testing] 23 | - name: pylint 24 | run: python -m pylint --output-format=text src/sdynpy | tee lint.log || pylint-exit $? 25 | - name: pytest 26 | run: python -m pytest --verbose --cov=src/sdynpy --cov-report xml 27 | - name: coveralls 28 | run: | 29 | python -m pip install coveralls 30 | coveralls --service=github 31 | env: 32 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 33 | - name: codecov 34 | uses: codecov/codecov-action@v2 35 | with: 36 | name: codecov-umbrella 37 | verbose: true 38 | -------------------------------------------------------------------------------- /.github/workflows/pages.yml: -------------------------------------------------------------------------------- 1 | name: pages 2 | on: 3 | push: 4 | branches: [ "main" ] 5 | pull_request: 6 | branches: [ "main" ] 7 | jobs: 8 | build: 9 | runs-on: ubuntu-22.04 10 | steps: 11 | - uses: actions/checkout@v2 12 | - name: install package 13 | run: pip install .[all] 14 | - name: pylint badge 15 | run: | 16 | python -m pylint --disable=C0103 --output-format=text src/sdynpy | tee pylint.log || pylint-exit $? 17 | PYLINT_SCORE=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' pylint.log) 18 | if (( $(echo "${PYLINT_SCORE} >= 8.0" | bc -l) )); then 19 | COLOR=brightgreen 20 | elif (( $(echo "${PYLINT_SCORE} >= 4.0" | bc -l) )); then 21 | COLOR=yellow 22 | elif (( $(echo "${PYLINT_SCORE} >= 2.0" | bc -l) )); then 23 | COLOR=orange 24 | else 25 | COLOR=red 26 | fi 27 | curl "https://img.shields.io/badge/Pylint-${PYLINT_SCORE}-${COLOR}?logo=python&logoColor=FBE072" -o pylint.svg 28 | - name: build docs 29 | run: | 30 | sudo apt-get install pandoc 31 | sphinx-build -b html docs/source/ docs/build/html/ 32 | sed -i -e "s/ module./d' docs/build/html/*.html 34 | mv docs/build/html/ public/ 35 | mv pylint.svg public/ 36 | - name: deploy docs to gh-pages 37 | if: github.event_name != 'pull_request' 38 | uses: peaceiris/actions-gh-pages@v3 39 | with: 40 | github_token: ${{ secrets.GITHUB_TOKEN }} 41 | publish_dir: public/ 42 | -------------------------------------------------------------------------------- /.github/workflows/publish-to-test-pypi.yml: -------------------------------------------------------------------------------- 1 | name: Publish Python Distributions to PyPi and TestPyPi 2 | 3 | on: push 4 | 5 | jobs: 6 | build-n-publish: 7 | name: Publish Python Distributions to PyPi and TestPyPi 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@master 12 | - name: Set up Python 3.10 13 | uses: actions/setup-python@v3 14 | with: 15 | python-version: "3.10" 16 | - name: Install pypa/build 17 | run: >- 18 | python -m 19 | pip install 20 | build 21 | --user 22 | - name: Build a binary wheel and a source tarball 23 | run: >- 24 | python -m 25 | build 26 | --sdist 27 | --wheel 28 | --outdir dist/ 29 | . 30 | - name: Publish distribution to Test PyPI 31 | uses: pypa/gh-action-pypi-publish@release/v1 32 | if: ${{ !startsWith(github.ref, 'refs/tags') }} 33 | with: 34 | password: ${{ secrets.TEST_PYPI_API_TOKEN }} 35 | repository_url: https://test.pypi.org/legacy/ 36 | - name: Publish distribution to PyPI 37 | if: startsWith(github.ref, 'refs/tags') 38 | uses: pypa/gh-action-pypi-publish@release/v1 39 | with: 40 | password: ${{ secrets.PYPI_API_TOKEN }} 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .spyproject/** 2 | **/__pycache__/** 3 | **/old*/** 4 | **/*.dll 5 | **/~$* 6 | **/*.aux 7 | **/*.bbl 8 | **/*.blg 9 | **/*.log 10 | **/*.out 11 | **/*.lof 12 | **/*.lot 13 | **/*.toc 14 | **/*.synctex.gz 15 | **/*.pdf 16 | **/MATLAB_REFERENCE/** 17 | **/_autosummary/** 18 | doc/** 19 | test_scripts/** 20 | src/sdynpy.egg-info/** 21 | report.xml 22 | .coverage 23 | docs/build/** 24 | build/** 25 | dist/** 26 | reports/** 27 | **/.ipynb_checkpoints/** 28 | **.vscode/ 29 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.10 2 | RUN git clone --depth 1 https://github.com/sandialabs/sdynpy.git && \ 3 | cd sdynpy/ && \ 4 | pip install .[all] 5 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | recursive-include src/sdynpy *.ui -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | #################################### 2 | Structural Dynamics Python Libraries 3 | #################################### 4 | 5 | |documentation| |build| |codecov| |coveralls| |codefactor| |pylint| |docker| 6 | 7 | This repository houses SDynPy, a Python module built for doing structural dynamics analysis using Python. 8 | It contains core objects that define test geometry and data. It contains readers and writers for common data formats. 9 | It also contains various structural dynamics and signal processing tools. 10 | 11 | *********** 12 | Information 13 | *********** 14 | 15 | - `Documentation `_ 16 | - `Project `_ 17 | - `Releases `_ 18 | - `Tutorial `_ 19 | 20 | .. 21 | Badges ======================================================================== 22 | 23 | .. |documentation| image:: https://img.shields.io/github/actions/workflow/status/sandialabs/sdynpy/pages.yml?branch=main&label=Documentation 24 | :target: https://sandialabs.github.io/sdynpy/ 25 | 26 | .. |build| image:: https://img.shields.io/github/actions/workflow/status/sandialabs/sdynpy/main.yml?branch=main&label=GitHub&logo=github 27 | :target: https://github.com/sandialabs/sdynpy 28 | 29 | .. |pylint| image:: https://raw.githubusercontent.com/sandialabs/sdynpy/gh-pages/pylint.svg 30 | :target: https://github.com/sandialabs/sdynpy 31 | 32 | .. |coveralls| image:: https://img.shields.io/coveralls/github/sandialabs/sdynpy?logo=coveralls&label=Coveralls 33 | :target: https://coveralls.io/github/sandialabs/sdynpy?branch=main 34 | 35 | .. |codecov| image:: https://img.shields.io/codecov/c/github/sandialabs/sdynpy?label=Codecov&logo=codecov 36 | :target: https://codecov.io/gh/sandialabs/sdynpy 37 | 38 | .. |codefactor| image:: https://img.shields.io/codefactor/grade/github/sandialabs/sdynpy?label=Codefactor&logo=codefactor 39 | :target: https://www.codefactor.io/repository/github/sandialabs/sdynpy 40 | 41 | .. |docker| image:: https://img.shields.io/docker/v/dprohe/sdynpy?color=0db7ed&label=Docker%20Hub&logo=docker&logoColor=0db7ed 42 | :target: https://hub.docker.com/r/dprohe/sdynpy 43 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=source 11 | set BUILDDIR=build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/source/_static/custom.css: -------------------------------------------------------------------------------- 1 | a:visited {color: #3091d1;} 2 | .wy-menu a:visited {color: #d9d9d9;} 3 | .wy-side-nav-search a:visited {color: #fcfcfc;} -------------------------------------------------------------------------------- /docs/source/_templates/custom-class-template.rst: -------------------------------------------------------------------------------- 1 | {{ fullname | escape | underline}} 2 | 3 | .. currentmodule:: {{ module }} 4 | 5 | .. autoclass:: {{ objname }} 6 | :members: 7 | :undoc-members: 8 | :show-inheritance: 9 | {% block methods %} 10 | .. automethod:: __init__ 11 | 12 | {% if methods %} 13 | .. rubric:: {{ _('Methods') }} 14 | 15 | .. autosummary:: 16 | {% for item in methods %} 17 | {%- if item not in inherited_members %} 18 | ~{{ name }}.{{ item }} 19 | {%- endif %} 20 | {%- endfor %} 21 | {% endif %} 22 | {% endblock %} 23 | 24 | {% block attributes %} 25 | {% if attributes %} 26 | .. rubric:: {{ _('Attributes') }} 27 | 28 | .. autosummary:: 29 | {% for item in attributes %} 30 | {%- if item not in inherited_members %} 31 | ~{{ name }}.{{ item }} 32 | {%- endif %} 33 | {%- endfor %} 34 | {% endif %} 35 | {% endblock %} 36 | -------------------------------------------------------------------------------- /docs/source/_templates/custom-module-template.rst: -------------------------------------------------------------------------------- 1 | {{ fullname | escape | underline}} 2 | 3 | .. automodule:: {{ fullname }} 4 | 5 | {% block attributes %} 6 | {% if attributes %} 7 | .. rubric:: {{ _('Module Attributes') }} 8 | 9 | .. autosummary:: 10 | :toctree: 11 | {% for item in attributes %} 12 | {{ item }} 13 | {%- endfor %} 14 | {% endif %} 15 | {% endblock %} 16 | 17 | {% block functions %} 18 | {% if functions %} 19 | .. rubric:: {{ _('Functions') }} 20 | 21 | .. autosummary:: 22 | :toctree: 23 | {% for item in functions %} 24 | {{ item }} 25 | {%- endfor %} 26 | {% endif %} 27 | {% endblock %} 28 | 29 | {% block classes %} 30 | {% if classes %} 31 | .. rubric:: {{ _('Classes') }} 32 | 33 | .. autosummary:: 34 | :toctree: 35 | :template: custom-class-template.rst 36 | {% for item in classes %} 37 | {{ item }} 38 | {%- endfor %} 39 | {% endif %} 40 | {% endblock %} 41 | 42 | {% block exceptions %} 43 | {% if exceptions %} 44 | .. rubric:: {{ _('Exceptions') }} 45 | 46 | .. autosummary:: 47 | :toctree: 48 | {% for item in exceptions %} 49 | {{ item }} 50 | {%- endfor %} 51 | {% endif %} 52 | {% endblock %} 53 | 54 | {% block modules %} 55 | {% if modules %} 56 | .. rubric:: Modules 57 | 58 | .. autosummary:: 59 | :toctree: 60 | :template: custom-module-template.rst 61 | :recursive: 62 | {% for item in modules %} 63 | {{ item }} 64 | {%- endfor %} 65 | {% endif %} 66 | {% endblock %} 67 | -------------------------------------------------------------------------------- /docs/source/_templates/footer.html: -------------------------------------------------------------------------------- 1 | {% extends "!footer.html" %} 2 | {%- block contentinfo %} 3 | {{ super }} 4 | Sandia National Laboratories 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /docs/source/bibliography.rst: -------------------------------------------------------------------------------- 1 | Bibliography 2 | ============ 3 | 4 | .. bibliography:: -------------------------------------------------------------------------------- /docs/source/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | # 13 | import os 14 | import re 15 | import sys 16 | sys.path.insert(0, os.path.abspath('../src')) 17 | sys.path.insert(0, os.path.abspath('../../src')) 18 | 19 | 20 | def get_version(): 21 | VERSIONFILE = os.path.join('..', '..', 'src', 'sdynpy', '__init__.py') 22 | with open(VERSIONFILE, 'rt') as f: 23 | lines = f.readlines() 24 | vgx = '^__version__ = \"[0-9+.0-9+.0-9+]*[a-zA-Z0-9]*\"' 25 | for line in lines: 26 | mo = re.search(vgx, line, re.M) 27 | if mo: 28 | return mo.group().split('"')[1] 29 | raise RuntimeError('Unable to find version in %s.' % (VERSIONFILE,)) 30 | 31 | 32 | project = 'SDynPy' 33 | copyright = '2022, Sandia National Laboratories' 34 | author = 'Daniel P. Rohe' 35 | 36 | # The full version, including alpha/beta/rc tags 37 | release = get_version() 38 | version = release 39 | print(release) 40 | 41 | 42 | templates_path = ['_templates'] 43 | html_static_path = ['_static'] 44 | html_css_files = ['custom.css'] 45 | html_theme = 'sphinx_rtd_theme' 46 | html_theme_options = {'navigation_depth': 8, 47 | 'logo_only': True, 48 | 'display_version':False} 49 | html_logo = 'images/logo_horizontal_light.svg' 50 | extensions = [ 51 | 'sphinx.ext.autodoc', 52 | 'sphinx.ext.napoleon', 53 | 'sphinx.ext.viewcode', 54 | 'sphinx.ext.autosummary', 55 | 'matplotlib.sphinxext.plot_directive', 56 | 'sphinxcontrib.bibtex', 57 | 'nbsphinx', 58 | 'sphinx_copybutton' 59 | ] 60 | # autodoc_mock_imports = ["sdynpy"] 61 | latex_engine = 'xelatex' 62 | bibtex_bibfiles = ['main.bib'] 63 | bibtex_default_style = 'plain' 64 | plot_html_show_formats = False 65 | plot_html_show_source_link = False 66 | plot_include_source = True 67 | add_module_names = False 68 | plot_rcparams = {'font.size': 10} 69 | plot_formats = [('png', 300)] 70 | -------------------------------------------------------------------------------- /docs/source/example_problems/assets/a.inp: -------------------------------------------------------------------------------- 1 | // Salinas Input File 2 | // A 3 | // Dan Rohe 4 | // 5/4/2022 5 | 6 | SOLUTION 7 | eigen 8 | nmodes = 200 9 | title 'A Modal Solution' 10 | END 11 | 12 | FILE 13 | geometry_file 'a.exo' 14 | END 15 | 16 | OUTPUTS 17 | maa 18 | kaa 19 | displacement 20 | END 21 | 22 | ECHO 23 | materials 24 | mass 25 | END 26 | 27 | BLOCK 1 28 | material 2 29 | END 30 | 31 | MATERIAL 1 32 | E 212e9 33 | nu .3 34 | density 8000 35 | END 36 | 37 | MATERIAL 2 38 | E 68.9e9 39 | nu .33 40 | density 2700 41 | END 42 | -------------------------------------------------------------------------------- /docs/source/example_problems/assets/ab.inp: -------------------------------------------------------------------------------- 1 | // Salinas Input File 2 | // A+B 3 | // Dan Rohe 4 | // 5/4/2022 5 | 6 | SOLUTION 7 | eigen 8 | nmodes = 200 9 | title 'A+B Modal Solution' 10 | END 11 | 12 | FILE 13 | geometry_file 'ab.exo' 14 | END 15 | 16 | OUTPUTS 17 | maa 18 | kaa 19 | displacement 20 | END 21 | 22 | ECHO 23 | materials 24 | mass 25 | END 26 | 27 | BLOCK 1 28 | material 2 29 | END 30 | 31 | BLOCK 2 32 | material 2 33 | END 34 | 35 | MATERIAL 1 36 | E 212e9 37 | nu .3 38 | density 8000 39 | END 40 | 41 | MATERIAL 2 42 | E 68.9e9 43 | nu .33 44 | density 2700 45 | END 46 | -------------------------------------------------------------------------------- /docs/source/example_problems/assets/abc.inp: -------------------------------------------------------------------------------- 1 | // Salinas Input File 2 | // A+B+C 3 | // Dan Rohe 4 | // 5/4/2022 5 | 6 | SOLUTION 7 | eigen 8 | nmodes = 200 9 | title 'A+B+C Modal Solution' 10 | END 11 | 12 | FILE 13 | geometry_file 'abc.exo' 14 | END 15 | 16 | OUTPUTS 17 | maa 18 | kaa 19 | displacement 20 | END 21 | 22 | ECHO 23 | materials 24 | mass 25 | END 26 | 27 | BLOCK 1 28 | material 2 29 | END 30 | 31 | BLOCK 2 32 | material 2 33 | END 34 | 35 | BLOCK 3 36 | material 1 37 | END 38 | 39 | MATERIAL 1 40 | E 212e9 41 | nu .3 42 | density 8000 43 | END 44 | 45 | MATERIAL 2 46 | E 68.9e9 47 | nu .33 48 | density 2700 49 | END 50 | -------------------------------------------------------------------------------- /docs/source/example_problems/assets/b.inp: -------------------------------------------------------------------------------- 1 | // Salinas Input File 2 | // B 3 | // Dan Rohe 4 | // 5/4/2022 5 | 6 | SOLUTION 7 | eigen 8 | nmodes = 200 9 | title 'B Modal Solution' 10 | END 11 | 12 | FILE 13 | geometry_file 'b.exo' 14 | END 15 | 16 | OUTPUTS 17 | maa 18 | kaa 19 | displacement 20 | END 21 | 22 | ECHO 23 | materials 24 | mass 25 | END 26 | 27 | BLOCK 2 28 | material 2 29 | END 30 | 31 | MATERIAL 1 32 | E 212e9 33 | nu .3 34 | density 8000 35 | END 36 | 37 | MATERIAL 2 38 | E 68.9e9 39 | nu .33 40 | density 2700 41 | END 42 | -------------------------------------------------------------------------------- /docs/source/example_problems/assets/bc.inp: -------------------------------------------------------------------------------- 1 | // Salinas Input File 2 | // B+C 3 | // Dan Rohe 4 | // 5/4/2022 5 | 6 | SOLUTION 7 | eigen 8 | nmodes = 200 9 | title 'B+C Modal Solution' 10 | END 11 | 12 | FILE 13 | geometry_file 'bc.exo' 14 | END 15 | 16 | OUTPUTS 17 | maa 18 | kaa 19 | displacement 20 | END 21 | 22 | ECHO 23 | materials 24 | mass 25 | END 26 | 27 | BLOCK 2 28 | material 2 29 | END 30 | 31 | BLOCK 3 32 | material 1 33 | END 34 | 35 | MATERIAL 1 36 | E 212e9 37 | nu .3 38 | density 8000 39 | END 40 | 41 | MATERIAL 2 42 | E 68.9e9 43 | nu .33 44 | density 2700 45 | END 46 | -------------------------------------------------------------------------------- /docs/source/example_problems/assets/block_1.inp: -------------------------------------------------------------------------------- 1 | SOLUTION 2 | case 'eig' 3 | eigen 4 | nmodes = 50 5 | shift = -1e6 6 | case 'cbr' 7 | cbr 8 | nmodes = 30 9 | shift = -1e6 10 | correction = vectors 11 | rbmdof = '123' 12 | END 13 | 14 | FILE 15 | geometry_file 'block_1.exo' 16 | END 17 | 18 | OUTPUTS 19 | DISP 20 | END 21 | 22 | ECHO 23 | mass=block 24 | END 25 | 26 | CBMODEL 27 | nodeset = 1 28 | format = netcdf 29 | file = 'block_1-cbr.nc4' 30 | globalsolution = yes 31 | END 32 | 33 | 34 | BLOCK 1 35 | MATERIAL 1 36 | END 37 | 38 | MATERIAL 1 39 | // Aluminum 40 | E= 70.33e9 // Pa 41 | nu = 0.33 42 | density 2704.32669 // kg/m^3 43 | END -------------------------------------------------------------------------------- /docs/source/example_problems/assets/block_2.inp: -------------------------------------------------------------------------------- 1 | SOLUTION 2 | case 'eig' 3 | eigen 4 | nmodes = 50 5 | shift = -1e6 6 | case 'cbr' 7 | cbr 8 | nmodes = 30 9 | shift = -1e6 10 | correction = vectors 11 | rbmdof = '123' 12 | END 13 | 14 | FILE 15 | geometry_file 'block_2.exo' 16 | END 17 | 18 | OUTPUTS 19 | DISP 20 | END 21 | 22 | ECHO 23 | mass=block 24 | END 25 | 26 | CBMODEL 27 | nodeset = 1 28 | format = netcdf 29 | file = 'block_2-cbr.nc4' 30 | globalsolution = yes 31 | END 32 | 33 | 34 | BLOCK 2 35 | MATERIAL 1 36 | END 37 | 38 | MATERIAL 1 39 | // Aluminum 40 | E= 70.33e9 // Pa 41 | nu = 0.33 42 | density 2704.32669 // kg/m^3 43 | END -------------------------------------------------------------------------------- /docs/source/example_problems/assets/block_all.inp: -------------------------------------------------------------------------------- 1 | SOLUTION 2 | case 'eig' 3 | eigen 4 | nmodes = 50 5 | shift = -1e6 6 | END 7 | 8 | FILE 9 | geometry_file 'block_all.exo' 10 | END 11 | 12 | OUTPUTS 13 | DISP 14 | END 15 | 16 | ECHO 17 | mass=block 18 | END 19 | 20 | BLOCK 1 21 | MATERIAL 1 22 | END 23 | 24 | BLOCK 2 25 | MATERIAL 1 26 | END 27 | 28 | MATERIAL 1 29 | // Aluminum 30 | E= 70.33e9 // Pa 31 | nu = 0.33 32 | density 2704.32669 // kg/m^3 33 | END -------------------------------------------------------------------------------- /docs/source/example_problems/assets/c.inp: -------------------------------------------------------------------------------- 1 | // Salinas Input File 2 | // C 3 | // Dan Rohe 4 | // 5/4/2022 5 | 6 | SOLUTION 7 | eigen 8 | nmodes = 200 9 | title 'C Modal Solution' 10 | END 11 | 12 | FILE 13 | geometry_file 'c.exo' 14 | END 15 | 16 | OUTPUTS 17 | maa 18 | kaa 19 | displacement 20 | END 21 | 22 | ECHO 23 | materials 24 | mass 25 | END 26 | 27 | BLOCK 3 28 | material 1 29 | END 30 | 31 | MATERIAL 1 32 | E 212e9 33 | nu .3 34 | density 8000 35 | END 36 | 37 | MATERIAL 2 38 | E 68.9e9 39 | nu .33 40 | density 2700 41 | END 42 | -------------------------------------------------------------------------------- /docs/source/example_problems/assets/create_models.py: -------------------------------------------------------------------------------- 1 | cubit.reset() 2 | cmd = cubit.cmd 3 | 4 | cube_size = [1.0,1.2,1.5] 5 | cube_thickness = 0.1 6 | lid_depth = 0.15 7 | 8 | component_size = [0.4,0.4,0.7] 9 | 10 | # Create the box 11 | cmd('brick x {:} y {:} z {:}'.format(*cube_size)) 12 | cmd('brick x {:} y {:} z {:}'.format(*[v-cube_thickness*2 for v in cube_size])) 13 | cmd('subtract volume 2 from volume 1') 14 | cmd('compress ids') 15 | cmd('webcut volume 1 with plane zplane offset {:}'.format(cube_size[-1]/2-lid_depth)) 16 | 17 | # Create the component on the lid of the box 18 | cmd('brick x {:} y {:} z {:}'.format(*component_size)) 19 | cmd('move Volume 3 z {:} include_merged '.format(cube_size[-1]/2-cube_thickness-component_size[-1]/2)) 20 | 21 | cmd('imprint all') 22 | cmd('merge all') 23 | 24 | cmd('volume all size {:}'.format(cube_thickness/3)) 25 | cmd('mesh volume all') 26 | 27 | cmd('block 1 volume 2') 28 | cmd('block 2 volume 1') 29 | cmd('block 3 volume 3') 30 | 31 | cmd('export mesh "a.exo" block 1 overwrite') 32 | cmd('export mesh "b.exo" block 2 overwrite') 33 | cmd('export mesh "c.exo" block 3 overwrite') 34 | cmd('export mesh "ab.exo" block 1 2 overwrite') 35 | cmd('export mesh "bc.exo" block 2 3 overwrite') 36 | cmd('export mesh "abc.exo" block 1 2 3 overwrite') -------------------------------------------------------------------------------- /docs/source/example_problems/assets/cubit_input_file.py: -------------------------------------------------------------------------------- 1 | import cubit 2 | cubit.reset() 3 | 4 | nose_length = 0.5 5 | nose_height = 0.1 6 | wingspan = 0.5 7 | wing_width = 0.125 8 | depth = 0.1 9 | winglet_length = 0.2 10 | winglet_width = 0.1 11 | 12 | mesh_spacing = 4 13 | 14 | cubit.brick(nose_length,nose_height,depth) 15 | cubit.cmd('move Volume 1 x {:} y 0 z 0'.format(nose_length/2.0+wing_width/2.0)) 16 | 17 | cubit.brick(wing_width,wingspan,depth) 18 | 19 | for i in range(2): 20 | cubit.brick(winglet_length,winglet_width,depth) 21 | cubit.cmd('move volume {:} x {:} y {:} z 0'.format(3+i,-winglet_length/2.0-wing_width/2.0,-wingspan/2.0 + winglet_width/2 + i*(wingspan - winglet_width))) 22 | 23 | # Do webcuts 24 | webcut_distances = [-wingspan/2.0+winglet_width,-nose_height/2.0,wingspan/2.0-winglet_width,nose_height/2.0] 25 | for distance in webcut_distances: 26 | cubit.cmd('webcut volume all with general plane y offset {:}'.format(distance)) 27 | 28 | cubit.cmd('merge all') 29 | 30 | # Set mesh spacing 31 | cubit.cmd('volume all size {:}'.format(min([nose_length,nose_height,wingspan,wing_width,depth,winglet_length,winglet_width])/mesh_spacing)) 32 | cubit.cmd('mesh volume all') 33 | 34 | # Set up boundary conditions 35 | cubit.cmd('block 1 volume 1') 36 | cubit.cmd('block 2 volume all except volume in block 1') 37 | 38 | cubit.cmd('nodeset 1 surface 4') 39 | cubit.cmd('draw block all nodeset all') 40 | 41 | # Export 42 | for block in [1,2,'all']: 43 | cubit.cmd('export mesh "Z:/python_utilities/sdynpy/test_scripts/CB_Substructuring/block_{:}.exo" block {:} overwrite '.format(block,block)) 44 | 45 | print('Finished!') -------------------------------------------------------------------------------- /docs/source/example_problems/figures/Airplane_Random_Excitation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/Airplane_Random_Excitation.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/EFI_vs_DoF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/EFI_vs_DoF.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/Sine_Force_Signal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/Sine_Force_Signal.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_candidate_sensor_locations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_candidate_sensor_locations.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_coordinate_system_closeup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_coordinate_system_closeup.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_coordinate_systems.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_coordinate_systems.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_global_coordinate_system_closeup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_global_coordinate_system_closeup.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_gui_plot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_gui_plot.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_modal_drive_points.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_modal_drive_points.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_mode_right_cs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_mode_right_cs.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_mode_wrong_cs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_mode_wrong_cs.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_polypy_stabilization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_polypy_stabilization.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_polypy_stabilization_resynthesis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_polypy_stabilization_resynthesis.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_polypy_stabilization_selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_polypy_stabilization_selection.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_serep_expansion.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_serep_expansion.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_serep_expansion_overlay.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_serep_expansion_overlay.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_shape_overlay_fem.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_shape_overlay_fem.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_shape_overlay_test.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_shape_overlay_test.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/airplane_test_vs_fem_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/airplane_test_vs_fem_mac.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_buzz_control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_buzz_control.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_buzz_inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_buzz_inputs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_buzz_prediction_vs_simulation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_buzz_prediction_vs_simulation.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_buzz_spec_modification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_buzz_spec_modification.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_control_dofs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_control_dofs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_control_dofs_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_control_dofs_mac.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_environment_frfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_environment_frfs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_environment_inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_environment_inputs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_mimo_shaker_locations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_mimo_shaker_locations.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_pseudoinverse_control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_pseudoinverse_control.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_pseudoinverse_inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_pseudoinverse_inputs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_response_weighting_matrix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_response_weighting_matrix.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_shaker_weighting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_shaker_weighting.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_shaker_weighting_control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_shaker_weighting_control.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_shaker_weighting_inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_shaker_weighting_inputs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_tikhonov_control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_tikhonov_control.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_tikhonov_inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_tikhonov_inputs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_time_history_generation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_time_history_generation.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_weighted_response_control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_weighted_response_control.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/beam_airplane_weighted_response_inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/beam_airplane_weighted_response_inputs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/corrected_rigid_shape.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/corrected_rigid_shape.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/error_rigid_shape.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/error_rigid_shape.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/example_rigid_body_test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/example_rigid_body_test.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/geometry_corrected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/geometry_corrected.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/geometry_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/geometry_error.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/geometry_truth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/geometry_truth.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/modal_system_spy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/modal_system_spy.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/rigid_body_check_complex_plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/rigid_body_check_complex_plane.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/rigid_body_check_residual.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/rigid_body_check_residual.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_expanded_mode_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_expanded_mode_1.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_fem_geometry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_fem_geometry.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_frfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_frfs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_guiplot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_guiplot.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_latex_figures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_latex_figures.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_latex_modeshapes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_latex_modeshapes.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_latex_title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_latex_title.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_mac_test_fem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_mac_test_fem.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_mode_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_mode_1.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_polypy_resynthesize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_polypy_resynthesize.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_polypy_setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_polypy_setup.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_polypy_stability_plot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_polypy_stability_plot.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_reference_coordinates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_reference_coordinates.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_references_and_responses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_references_and_responses.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_response_coordinates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_response_coordinates.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_slide_geometry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_slide_geometry.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_slide_mode_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_slide_mode_1.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_slide_mode_parameters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_slide_mode_parameters.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_slide_title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_slide_title.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_smac_autofit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_smac_autofit.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_smac_cmif_resynthesis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_smac_cmif_resynthesis.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_smac_corrcoef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_smac_corrcoef.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_smac_frf_resynthesis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_smac_frf_resynthesis.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_smac_initial_rootlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_smac_initial_rootlist.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_smac_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_smac_mac.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_smac_pseudoinverse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_smac_pseudoinverse.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_smac_shape_and_eval.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_smac_shape_and_eval.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_test_geometry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_test_geometry.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_test_node_geometry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_test_node_geometry.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_time_data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_time_data.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/sdynpy_demo_vis_paraview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/sdynpy_demo_vis_paraview.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_assembled_mode_shape.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_assembled_mode_shape.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_block_1_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_block_1_mac.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_block_1_modeshape_comparison_large_errors.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_block_1_modeshape_comparison_large_errors.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_block_1_modeshape_comparison_perfect.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_block_1_modeshape_comparison_perfect.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_block_1_modeshape_comparison_small_errors.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_block_1_modeshape_comparison_small_errors.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_block_2_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_block_2_mac.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_block_2_modeshape_comparison_large_errors.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_block_2_modeshape_comparison_large_errors.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_block_2_modeshape_comparison_perfect.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_block_2_modeshape_comparison_perfect.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_block_2_modeshape_comparison_small_errors.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_block_2_modeshape_comparison_small_errors.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_mesh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_mesh.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_substructuring_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_substructuring_mac.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/spaceship_substructuring_truth_comparison.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/spaceship_substructuring_truth_comparison.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/test_dofs_on_fem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/test_dofs_on_fem.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/test_geometry_labeled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/test_geometry_labeled.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/test_geometry_with_tracelines_labeled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/test_geometry_with_tracelines_labeled.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/test_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/test_mac.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/test_shape.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/test_shape.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_ABC_mode_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_ABC_mode_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_ABC_mode_reduced_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_ABC_mode_reduced_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_AB_mode_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_AB_mode_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_AB_mode_reduced_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_AB_mode_reduced_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_A_mode_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_A_mode_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_A_mode_reduced_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_A_mode_reduced_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_BC_mode_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_BC_mode_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_BC_mode_reduced_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_BC_mode_reduced_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_B_mode_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_B_mode_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_B_mode_reduced_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_B_mode_reduced_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_C_mode_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_C_mode_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_C_mode_reduced_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_C_mode_reduced_example.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_concatenated_AB_mode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_concatenated_AB_mode.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_concatenated_BC_mode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_concatenated_BC_mode.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_concatenated_B_mode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_concatenated_B_mode.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_concatenated_systems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_concatenated_systems.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_math.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_math.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_setup.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_substructured_mode_shape.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_substructured_mode_shape.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/transmission_simulator_truth_mode_shape.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/transmission_simulator_truth_mode_shape.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_analyze_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_analyze_menu.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_analyze_setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_analyze_setup.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_cmif_fits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_cmif_fits.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_coh_guifrf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_coh_guifrf.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_compute_guifrf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_compute_guifrf.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_deflection_shape_plot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_deflection_shape_plot.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_deflection_shape_plot_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_deflection_shape_plot_menu.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_displacement.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_displacement.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_displacement_animation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_displacement_animation.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_frf_fits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_frf_fits.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_frf_guifrf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_frf_guifrf.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_geometry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_geometry.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_initial_guifrf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_initial_guifrf.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_mode_animation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_mode_animation.gif -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_pseudorandom_signal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_pseudorandom_signal.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_pseudorandom_signal_zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_pseudorandom_signal_zoom.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_cmif_fit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_cmif_fit.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_coherence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_coherence.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_coherence_no_window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_coherence_no_window.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_frfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_frfs.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_guifrf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_guifrf.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_polypy_setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_polypy_setup.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_polypy_stability.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_polypy_stability.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_polypy_stability_zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_polypy_stability_zoom.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_signal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_signal.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_random_signal_zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_random_signal_zoom.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_reject_frame_guifrf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_reject_frame_guifrf.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_root_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_root_hover.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_selected_roots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_selected_roots.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_setup.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_sm_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_sm_mac.png -------------------------------------------------------------------------------- /docs/source/example_problems/figures/tuning_fork_sm_sd_mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/example_problems/figures/tuning_fork_sm_sd_mac.png -------------------------------------------------------------------------------- /docs/source/examples.rst: -------------------------------------------------------------------------------- 1 | SDynpy Examples 2 | =============== 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | :caption: Contents: 7 | 8 | example_problems/airplane_modal_test 9 | example_problems/rattlesnake_demonstration 10 | example_problems/transient_fem_analysis 11 | example_problems/model_reduction/model_reduction 12 | example_problems/craig_bampton_substructuring 13 | example_problems/transmission_simulator 14 | example_problems/mimo_random_vibration_control -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_CMIF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_CMIF.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Combined_Coordinates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Combined_Coordinates.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Combined_System_Matrices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Combined_System_Matrices.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Constrained_FRF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Constrained_FRF.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Coordinates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Coordinates.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Coordinates_Zoomed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Coordinates_Zoomed.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Deflection_Shape_Plotter_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Deflection_Shape_Plotter_1.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Deflection_Shape_Plotter_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Deflection_Shape_Plotter_2.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Drive_FRFs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Drive_FRFs.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Drive_FRFs_Closeup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Drive_FRFs_Closeup.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Excitation_DoFs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Excitation_DoFs.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_FBS_Results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_FBS_Results.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_GUIPlot_FRFs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_GUIPlot_FRFs.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Geometry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Geometry.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Geometry_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Geometry_2.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Initial_SPGUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Initial_SPGUI.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Initial_SPGUI_Computed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Initial_SPGUI_Computed.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Initial_SPGUI_Functions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Initial_SPGUI_Functions.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Initial_SPGUI_Overlap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Initial_SPGUI_Overlap.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Initial_SPGUI_References_Selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Initial_SPGUI_References_Selected.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Initial_SPGUI_Sampling_Set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Initial_SPGUI_Sampling_Set.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Initial_SPGUI_Start_Time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Initial_SPGUI_Start_Time.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Initial_SPGUI_Window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Initial_SPGUI_Window.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Labelled_Coordinates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Labelled_Coordinates.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_MAC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_MAC.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_MMIF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_MMIF.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Modal_System_Matrices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Modal_System_Matrices.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Mode_Animation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Mode_Animation.gif -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Mode_Animation_From_Polypy.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Mode_Animation_From_Polypy.gif -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Mode_Combined_Unconstrained_Animation_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Mode_Combined_Unconstrained_Animation_1.gif -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Mode_Combined_Unconstrained_Animation_2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Mode_Combined_Unconstrained_Animation_2.gif -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Mode_Comparison_Animation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Mode_Comparison_Animation.gif -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Mode_Constrained_Animation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Mode_Constrained_Animation.gif -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_NMIF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_NMIF.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Plot_Transient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Plot_Transient.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_PolyPy_Initial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_PolyPy_Initial.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_PolyPy_Region_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_PolyPy_Region_1.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_PolyPy_Region_1_Initial_Stability.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_PolyPy_Region_1_Initial_Stability.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_PolyPy_Region_1_Resynth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_PolyPy_Region_1_Resynth.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_PolyPy_Region_1_Stability.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_PolyPy_Region_1_Stability.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_PolyPy_Region_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_PolyPy_Region_2.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_PolyPy_Region_2_Resynth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_PolyPy_Region_2_Resynth.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_PolyPy_Region_2_Stability.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_PolyPy_Region_2_Stability.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Random_Excitation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Random_Excitation.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Response_DoFs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Response_DoFs.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Response_GUIPlot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Response_GUIPlot.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_AddRoot_Converged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_AddRoot_Converged.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_AddRoot_FreqRange_Lin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_AddRoot_FreqRange_Lin.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_AddRoot_FreqRange_Log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_AddRoot_FreqRange_Log.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_AddRoot_Initial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_AddRoot_Initial.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_AddedRoot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_AddedRoot.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_AutofitRoots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_AutofitRoots.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_CorrCoef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_CorrCoef.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_InitialRootlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_InitialRootlist.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_Pseudoinverse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_Pseudoinverse.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_Resynth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_Resynth.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_SMAC_ShapesEval.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_SMAC_ShapesEval.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Shape_Plotter_Overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Shape_Plotter_Overview.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_System_Matrices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_System_Matrices.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Beam_Transformation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Beam_Transformation.png -------------------------------------------------------------------------------- /docs/source/images/Showcase_Time_History_Demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/Showcase_Time_History_Demo.png -------------------------------------------------------------------------------- /docs/source/images/snl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/images/snl.jpg -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | .. SDynPy documentation master file, created by 2 | sphinx-quickstart on Mon Jan 31 10:42:59 2022. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | .. image:: /images/logo_horizontal.svg 7 | :width: 550 8 | :alt: SDynPy Logo 9 | :align: center 10 | 11 | | 12 | 13 | Welcome to SDynPy's documentation! 14 | ================================== 15 | 16 | |documentation| |build| |codecov| |coveralls| |codefactor| |pylint| |docker| 17 | 18 | **SDynPy** is a package for performing structural dynamic analyses using Python. 19 | It contains several objects that represent various structural dynamics data 20 | types (shapes, data, geometry, etc.) as well as various functions and methods 21 | to make working with these objects easy! 22 | 23 | Check out the :doc:`usage` section for further information on how to use the package, 24 | including how to :ref:`install ` the package. 25 | 26 | To quickly get running with SDynPy, check out the out the :doc:`examples` for 27 | an overview of recommended workflows and a summary of current functionality. 28 | 29 | *********** 30 | Information 31 | *********** 32 | 33 | - `Documentation `_ 34 | - `Project `_ 35 | - `Releases `_ 36 | - `Tutorial `_ 37 | 38 | .. toctree:: 39 | :maxdepth: 2 40 | :caption: Contents: 41 | 42 | usage 43 | sdynpy_showcase 44 | examples 45 | modal_tutorials 46 | modules 47 | bibliography 48 | 49 | Indices and tables 50 | ================== 51 | 52 | * :ref:`genindex` 53 | * :ref:`modindex` 54 | * :ref:`search` 55 | 56 | .. 57 | Badges ======================================================================== 58 | 59 | .. |documentation| image:: https://img.shields.io/github/actions/workflow/status/sandialabs/sdynpy/pages.yml?branch=main&label=Documentation 60 | :target: https://sandialabs.github.io/sdynpy/ 61 | 62 | .. |build| image:: https://img.shields.io/github/actions/workflow/status/sandialabs/sdynpy/main.yml?branch=main&label=GitHub&logo=github 63 | :target: https://github.com/sandialabs/sdynpy 64 | 65 | .. |pylint| image:: https://raw.githubusercontent.com/sandialabs/sdynpy/gh-pages/pylint.svg 66 | :target: https://github.com/sandialabs/sdynpy 67 | 68 | .. |coveralls| image:: https://img.shields.io/coveralls/github/sandialabs/sdynpy?logo=coveralls&label=Coveralls 69 | :target: https://coveralls.io/github/sandialabs/sdynpy?branch=main 70 | 71 | .. |codecov| image:: https://img.shields.io/codecov/c/github/sandialabs/sdynpy?label=Codecov&logo=codecov 72 | :target: https://codecov.io/gh/sandialabs/sdynpy 73 | 74 | .. |codefactor| image:: https://img.shields.io/codefactor/grade/github/sandialabs/sdynpy?label=Codefactor&logo=codefactor 75 | :target: https://www.codefactor.io/repository/github/sandialabs/sdynpy 76 | 77 | .. |docker| image:: https://img.shields.io/docker/v/dprohe/sdynpy?color=0db7ed&label=Docker%20Hub&logo=docker&logoColor=0db7ed 78 | :target: https://hub.docker.com/r/dprohe/sdynpy 79 | -------------------------------------------------------------------------------- /docs/source/main.bib: -------------------------------------------------------------------------------- 1 | @Article{peeters2004_polymax_frequency_domain_method_new_standard_modal_parameter_estimation, 2 | author = {Peeters, Bart and Van der Auweraer, Herman and Guillaume, Patrick and Leuridan, Jan}, 3 | journal = {Shock and Vibration}, 4 | title = {The PolyMAX Frequency-Domain Method: A New Standard for Modal Parameter Estimation?}, 5 | year = {2004}, 6 | issn = {1070-9622}, 7 | month = jan, 8 | pages = {523692}, 9 | volume = {11}, 10 | publisher = {IOS Press}, 11 | url = {https://doi.org/10.1155/2004/523692}, 12 | } 13 | @InProceedings{hensley2006_SMAC, 14 | author = {Daniel P. Hensley and Randy L. Mayes}, 15 | booktitle = {Proceedings of the 24th {I}nternational {M}odal {A}nalysis {C}onference}, 16 | title = {Extending {SMAC} to Multiple Reference {FRF}s}, 17 | year = {2006}, 18 | address = {St. Louis, Missouri}, 19 | month = jan, 20 | pages = {220-230}, 21 | sandnumber = {SAND2005-6575C}, 22 | timestamp = {2019.03.07}, 23 | } -------------------------------------------------------------------------------- /docs/source/modal_tutorials.rst: -------------------------------------------------------------------------------- 1 | Modal Tutorials 2 | =============== 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | :caption: Contents: 7 | 8 | modal_tutorials/Modal_01_What_is_Modal_Analysis/Modal_01_What_is_Modal_Analysis 9 | modal_tutorials/Modal_02_Basics_of_Vibrations/Modal_02_Basics_of_Vibrations 10 | modal_tutorials/Modal_03_Multi_DoF_Vibrations/Modal_03_Multi_DoF_Vibrations 11 | modal_tutorials/Modal_04_Modal_Analysis/Modal_04_Modal_Analysis 12 | modal_tutorials/Modal_05_Experimental_Modal_Analysis/Modal_05_Experimental_Modal_Analysis 13 | modal_tutorials/Modal_06_Complex_Modes/Modal_06_Complex_Modes -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/beam_airplane_deflection_shape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/beam_airplane_deflection_shape.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/beam_airplane_excitation_locations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/beam_airplane_excitation_locations.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_1.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_2.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_3.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_4.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_5.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/deflection_shape_6.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/wingtip_frequency_demonstration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_01_What_is_Modal_Analysis/figures/wingtip_frequency_demonstration.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_03_Multi_DoF_Vibrations/figures/spring_mass_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 42 | 44 | 45 | 47 | image/svg+xml 48 | 50 | 51 | 52 | 53 | 54 | 59 | 66 | m1 79 | 86 | m2 99 | 103 | 107 | 111 | k1 124 | k2 137 | 138 | 139 | -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_11.gif -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_22.gif -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_3.gif -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_7.gif -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_8.gif -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_04_Modal_Analysis/figures/plate_mode_9.gif -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/Modal_05_Experimental_Modal_Analysis.rst: -------------------------------------------------------------------------------- 1 | Modal Tutorial 05: Experimental Modal Analysis 2 | ============================================== 3 | 4 | In the previous tutorial we saw how we could compute 5 | modal properties of a system from its mass, stiffness, 6 | and damping matrices. Unfortunately, real dynamic 7 | systems do not have mass, stiffness, and damping 8 | matrices readily available. Therefore, modes of the 9 | system must be derived experimentally, generally from 10 | the time histories of the excitation force applied to the 11 | system and the responses to that excitation measured 12 | from the system. 13 | 14 | The sub-tutorials in this section will walk through 15 | various parts of this process to demonstrate how 16 | experimental modal analysis is performed. 17 | 18 | .. toctree:: 19 | :maxdepth: 2 20 | :caption: Contents: 21 | 22 | Modal_05a_Computing_FRF_from_Time_Data 23 | Modal_05b_Types_of_Excitation 24 | Modal_05c_Selecting_Response_and_Measurement_DoFs 25 | Modal_05d_Data_Quality_Checks 26 | Modal_05e_Fitting_Modes_to_FRF 27 | Modal_05f_Comparing_Test_and_Analysis -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/Modal_05d_Data_Quality_Checks.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "610dffb4", 6 | "metadata": {}, 7 | "source": [ 8 | "# Modal Tutorial 05 Part D: Data Quality Checks\n" 9 | ] 10 | }, 11 | { 12 | "cell_type": "code", 13 | "execution_count": null, 14 | "id": "bee5fffa", 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [] 18 | } 19 | ], 20 | "metadata": { 21 | "kernelspec": { 22 | "display_name": "Python 3", 23 | "language": "python", 24 | "name": "python3" 25 | }, 26 | "language_info": { 27 | "codemirror_mode": { 28 | "name": "ipython", 29 | "version": 3 30 | }, 31 | "file_extension": ".py", 32 | "mimetype": "text/x-python", 33 | "name": "python", 34 | "nbconvert_exporter": "python", 35 | "pygments_lexer": "ipython3", 36 | "version": "3.8.10" 37 | } 38 | }, 39 | "nbformat": 4, 40 | "nbformat_minor": 5 41 | } 42 | -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/Modal_05e_Fitting_Modes_to_FRF.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "610dffb4", 6 | "metadata": {}, 7 | "source": [ 8 | "# Modal Tutorial 05 Part E: Fitting Modes to Data\n" 9 | ] 10 | }, 11 | { 12 | "cell_type": "code", 13 | "execution_count": null, 14 | "id": "bee5fffa", 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [] 18 | } 19 | ], 20 | "metadata": { 21 | "kernelspec": { 22 | "display_name": "Python 3", 23 | "language": "python", 24 | "name": "python3" 25 | }, 26 | "language_info": { 27 | "codemirror_mode": { 28 | "name": "ipython", 29 | "version": 3 30 | }, 31 | "file_extension": ".py", 32 | "mimetype": "text/x-python", 33 | "name": "python", 34 | "nbconvert_exporter": "python", 35 | "pygments_lexer": "ipython3", 36 | "version": "3.8.10" 37 | } 38 | }, 39 | "nbformat": 4, 40 | "nbformat_minor": 5 41 | } 42 | -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/Modal_05f_Comparing_Test_and_Analysis.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "610dffb4", 6 | "metadata": {}, 7 | "source": [ 8 | "# Modal Tutorial 05 Part F: Comparing Test and Analysis" 9 | ] 10 | }, 11 | { 12 | "cell_type": "code", 13 | "execution_count": null, 14 | "id": "bee5fffa", 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [] 18 | } 19 | ], 20 | "metadata": { 21 | "kernelspec": { 22 | "display_name": "Python 3", 23 | "language": "python", 24 | "name": "python3" 25 | }, 26 | "language_info": { 27 | "codemirror_mode": { 28 | "name": "ipython", 29 | "version": 3 30 | }, 31 | "file_extension": ".py", 32 | "mimetype": "text/x-python", 33 | "name": "python", 34 | "nbconvert_exporter": "python", 35 | "pygments_lexer": "ipython3", 36 | "version": "3.8.10" 37 | } 38 | }, 39 | "nbformat": 4, 40 | "nbformat_minor": 5 41 | } 42 | -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_br.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_chirp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_chirp.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_impact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_impact.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_pr.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_random.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_random.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_random_nowindow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_random_nowindow.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_simo_pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/coherence_simo_pr.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/deflection_shape_60_hz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/deflection_shape_60_hz.gif -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_br.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_chirp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_chirp.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_impact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_impact.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_pr.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_random.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_random.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_random_nowindow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_random_nowindow.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_simo_pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/frf_simo_pr.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/impact_spgui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/impact_spgui.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/mimo_br_spgui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/mimo_br_spgui.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/mimo_pr_spgui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/mimo_pr_spgui.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/plate_excitation_locations.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/plate_excitation_locations.gif -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/random_spgui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/random_spgui.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/simo_chirp_spgui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/simo_chirp_spgui.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/simo_pr_spgui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/simo_pr_spgui.png -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/sine_deflection_multiline_animation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/sine_deflection_multiline_animation.gif -------------------------------------------------------------------------------- /docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/windowed_time_random.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/docs/source/modal_tutorials/Modal_05_Experimental_Modal_Analysis/figures/windowed_time_random.png -------------------------------------------------------------------------------- /docs/source/modules.rst: -------------------------------------------------------------------------------- 1 | SDynPy Programming Interface 2 | ============================ 3 | 4 | .. autosummary:: 5 | :toctree: _autosummary 6 | :template: custom-module-template.rst 7 | :recursive: 8 | 9 | sdynpy 10 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = [ 3 | "setuptools>=42", 4 | "wheel" 5 | ] 6 | build-backend = "setuptools.build_meta" -------------------------------------------------------------------------------- /run_tests.bat: -------------------------------------------------------------------------------- 1 | python -m pytest tests -ra --cov=sdynpy --cov-report=term-missing 2 | pause -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 100 3 | 4 | [tool:pytest] 5 | junit_family=xunit2 6 | addopts = --verbose --junitxml=report.xml 7 | 8 | [pycodestyle] 9 | count = True 10 | max-line-length = 160 11 | statistics = True 12 | 13 | [coverage:run] 14 | omit = 15 | setup.py 16 | *__main__.py 17 | 18 | [coverage:report] 19 | exclude_lines = 20 | pragma: no coverage 21 | if __name__ == '__main__' 22 | def main 23 | def __repr__ 24 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | import os 3 | import re 4 | 5 | 6 | def read(fname): 7 | with open(fname) as fp: 8 | content = fp.read() 9 | return content 10 | 11 | 12 | def get_version(): 13 | VERSIONFILE = os.path.join('src', 'sdynpy', '__init__.py') 14 | with open(VERSIONFILE, 'rt') as f: 15 | lines = f.readlines() 16 | vgx = '^__version__ = \"[0-9+.0-9+.0-9+]*[a-zA-Z0-9]*\"' 17 | for line in lines: 18 | mo = re.search(vgx, line, re.M) 19 | if mo: 20 | return mo.group().split('"')[1] 21 | raise RuntimeError('Unable to find version in %s.' % (VERSIONFILE,)) 22 | 23 | def get_ui_files(directory): 24 | paths = [] 25 | for (path,directories,filenames) in os.walk(directory): 26 | for filename in filenames: 27 | if filename[-3:] == '.ui': 28 | paths.append(os.path.join(path,filename)) 29 | return paths 30 | 31 | setup( 32 | name='sdynpy', 33 | version=get_version(), 34 | description=('A Structural Dynamics Library for Python'), 35 | long_description=read("README.rst"), 36 | url='https://github.com/sandialabs/sdynpy', 37 | author='Daniel P. Rohe', 38 | author_email='dprohe@sandia.gov', 39 | license='GPLv3', 40 | package_dir={'': 'src'}, 41 | packages=find_packages(where='src'), 42 | zip_safe=False, 43 | package_data={'': get_ui_files('src/sdynpy')}, 44 | include_package_data=True, 45 | install_requires=[ 46 | "numpy", 47 | "scipy", 48 | "matplotlib", 49 | "npTDMS", 50 | "qtpy", 51 | "PyQt5", 52 | "pyqtgraph", 53 | "netCDF4", 54 | "pandas", 55 | "python-pptx", 56 | "Pillow", 57 | "pyvista", 58 | "pyvistaqt", 59 | "openpyxl", 60 | "vtk", 61 | "joblib", 62 | "psutil" 63 | ], 64 | python_requires='>=3.8', 65 | extras_require={ 66 | 'docs': ['docutils<0.18,>=0.14', 'ipykernel', 'ipython', 67 | 'jinja2>=3.0', 'nbsphinx', 68 | 'sphinx', 'sphinx-rtd-theme', 'sphinxcontrib-bibtex', 69 | 'sphinx-copybutton'], 70 | 'testing': ['pycodestyle', 'pylint', 'pytest', 'pytest-cov'], 71 | 'all': ['docutils<0.18,>=0.14', 'ipykernel', 'ipython', 'jinja2>=3.0', 72 | 'nbsphinx', 'pycodestyle', 'pylint', 'pytest', 'pytest-cov', 73 | 'sphinx', 'sphinx-copybutton', 74 | 'sphinx-rtd-theme', 'sphinxcontrib-bibtex']}, 75 | classifiers=['Natural Language :: English', 76 | 'Operating System :: Microsoft :: Windows :: Windows 10', 77 | 'Operating System :: Microsoft :: Windows :: Windows 11', 78 | 'Operating System :: MacOS :: MacOS X', 79 | 'Operating System :: POSIX :: Linux', 80 | 'Programming Language :: Python :: 3.8', 81 | 'Programming Language :: Python :: 3.9', 82 | 'Programming Language :: Python :: 3.10', 83 | 'Programming Language :: Python :: 3.11', 84 | 'Framework :: Pytest', 85 | 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)' 86 | ] 87 | ) 88 | -------------------------------------------------------------------------------- /src/sdynpy/__init__.py: -------------------------------------------------------------------------------- 1 | """SDynPy: A Structural Dynamics Library for Python 2 | 3 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 4 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 5 | Government retains certain rights in this software. 6 | 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 3 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see . 19 | """ 20 | from .core import coordinate, colors, array, geometry, shape, data, system, matrix_mod 21 | from .fileio import unv, uff, rattlesnake, vic, tshaker 22 | from .fem.sdynpy_exodus import Exodus, ExodusInMemory 23 | from .fem import sdynpy_beam as beam 24 | from .fem import sdynpy_shaker as shaker 25 | from .fem import sdynpy_dof as dof 26 | from .signal_processing import (frf, cpsd, integration, correlation, complex, 27 | rotation, generator, camera, harmonic, 28 | geometry_fitting, srs, lrm) 29 | from .modal import (PolyPy, SMAC, PolyPy_GUI, SMAC_GUI, compute_residues, 30 | compute_shapes, SignalProcessingGUI, ColoredCMIF, 31 | read_modal_fit_data, ModalTest) 32 | from . import doc 33 | 34 | __version__ = "0.14.2" 35 | 36 | # Pull things in for easier access 37 | SdynpyArray = array.SdynpyArray 38 | coordinate_array = coordinate.coordinate_array 39 | CoordinateArray = coordinate.CoordinateArray 40 | coordinate_system_array = geometry.coordinate_system_array 41 | CoordinateSystemArray = geometry.CoordinateSystemArray 42 | node_array = geometry.node_array 43 | NodeArray = geometry.NodeArray 44 | traceline_array = geometry.traceline_array 45 | TracelineArray = geometry.TracelineArray 46 | element_array = geometry.element_array 47 | ElementArray = geometry.ElementArray 48 | Geometry = geometry.Geometry 49 | shape_array = shape.shape_array 50 | ShapeArray = shape.ShapeArray 51 | data_array = data.data_array 52 | NDDataArray = data.NDDataArray 53 | TimeHistoryArray = data.TimeHistoryArray 54 | TransferFunctionArray = data.TransferFunctionArray 55 | CoherenceArray = data.CoherenceArray 56 | MultipleCoherenceArray = data.MultipleCoherenceArray 57 | PowerSpectralDensityArray = data.PowerSpectralDensityArray 58 | SpectrumArray = data.SpectrumArray 59 | GUIPlot = data.GUIPlot 60 | CPSDPlot = data.CPSDPlot 61 | id_map = geometry.id_map 62 | System = system.System 63 | matrix_plot = correlation.matrix_plot 64 | Matrix = matrix_mod.Matrix 65 | matrix = matrix_mod.matrix 66 | -------------------------------------------------------------------------------- /src/sdynpy/core/__init__.py: -------------------------------------------------------------------------------- 1 | """Core SDynPy objects, including data and geometry 2 | 3 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 4 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 5 | Government retains certain rights in this software. 6 | 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 3 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see .""" 19 | from . import sdynpy_colors as colors 20 | from . import sdynpy_coordinate as coordinate 21 | from . import sdynpy_geometry as geometry 22 | from . import sdynpy_shape as shape 23 | from . import sdynpy_data as data 24 | from . import sdynpy_array as array 25 | from . import sdynpy_system as system 26 | from . import sdynpy_matrix as matrix_mod 27 | -------------------------------------------------------------------------------- /src/sdynpy/core/sdynpy_colors.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Defines the color scheme used in SDynPy. Matches the I-deas color scheme. 4 | 5 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 6 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 7 | Government retains certain rights in this software. 8 | 9 | This program is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU General Public License as published by 11 | the Free Software Foundation, either version 3 of the License, or 12 | (at your option) any later version. 13 | 14 | This program is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU General Public License for more details. 18 | 19 | You should have received a copy of the GNU General Public License 20 | along with this program. If not, see . 21 | """ 22 | 23 | from matplotlib.colors import ListedColormap 24 | 25 | colors = {0: [0.0, 0.0, 0.0], 26 | 1: [0.0, 0.0, 1.0], 27 | 2: [0.0, 0.329, 1.0], 28 | 3: [0.0, 0.66, 1.0], 29 | 4: [0.0, 1.0, 1.0], 30 | 5: [0.0, 0.33, 0.0], 31 | 6: [0.0, 0.66, 0.0], 32 | 7: [0.0, 1.0, 0.0], 33 | 8: [1.0, 1.0, 0.0], 34 | 9: [1.0, 0.66, 0.0], 35 | 10: [1.0, 0.33, 0.0], 36 | 11: [1.0, 0.0, 0.0], 37 | 12: [1.0, 0.0, 1.0], 38 | 13: [1.0, 0.33, 1.0], 39 | 14: [1.0, 0.66, 1.0], 40 | 15: [1.0, 1.0, 1.0]} 41 | 42 | color_list = [colors[i] for i in range(len(colors))] 43 | 44 | colormap = ListedColormap(color_list) 45 | 46 | coord_colormap = ListedColormap([[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [0, 1, 1], [1, 1, 0]]) 47 | -------------------------------------------------------------------------------- /src/sdynpy/demo/__init__.py: -------------------------------------------------------------------------------- 1 | """SDynPy demonstrator models 2 | 3 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 4 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 5 | Government retains certain rights in this software. 6 | 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 3 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see .""" 19 | from . import beam_airplane 20 | from . import beam_plate 21 | -------------------------------------------------------------------------------- /src/sdynpy/demo/beam_plate.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Demonstration system for a plate-like structure made of beams 4 | 5 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 6 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 7 | Government retains certain rights in this software. 8 | 9 | This program is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU General Public License as published by 11 | the Free Software Foundation, either version 3 of the License, or 12 | (at your option) any later version. 13 | 14 | This program is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU General Public License for more details. 18 | 19 | You should have received a copy of the GNU General Public License 20 | along with this program. If not, see . 21 | """ 22 | 23 | import numpy as _np 24 | from ..fem.sdynpy_beam import beamkm as _beamkm 25 | from ..core.sdynpy_geometry import (Geometry as _Geometry, 26 | node_array as _node_array, 27 | traceline_array as _traceline_array, 28 | coordinate_system_array as _coordinate_system_array) 29 | from ..core.sdynpy_coordinate import from_nodelist as _from_nodelist 30 | from ..core.sdynpy_system import (System as _System, 31 | substructure_by_position as _substructure_by_position) 32 | 33 | 34 | def create_models(width=1, length=0.5, grid=0.125, 35 | beam_height=0.02, beam_width=0.02, 36 | E=69e9, nu=0.33, rho=2830): 37 | nodes_width = int(_np.round(width / grid)) + 1 38 | nodes_length = int(_np.round(length / grid)) + 1 39 | coords = _np.moveaxis(_np.meshgrid(_np.linspace(0, width, nodes_width), 40 | _np.linspace(0, length, nodes_length), 41 | 0, 42 | indexing='ij'), 0, -1)[:, :, 0, :] 43 | indices = _np.arange(_np.prod(coords.shape[:-1])).reshape(coords.shape[:-1]) 44 | 45 | conn = [] 46 | for i in range(coords.shape[0]): 47 | for j in range(coords.shape[1]): 48 | try: 49 | conn.append([indices[i, j], indices[i, j + 1]]) 50 | except IndexError: 51 | pass 52 | try: 53 | conn.append([indices[i, j], indices[i + 1, j]]) 54 | except IndexError: 55 | pass 56 | conn = _np.array(conn) 57 | 58 | bend_direction_1 = _np.array( 59 | [_np.zeros(conn.shape[0]), 60 | _np.zeros(conn.shape[0]), 61 | _np.ones(conn.shape[0])] 62 | ).T 63 | 64 | I1 = beam_width * beam_height**3 / 12 65 | I2 = beam_width**3 * beam_height / 12 66 | G = E / (2 * (1 - nu)) 67 | J = I1 + I2 68 | Ixx_per_L = (1 / 12) * rho * beam_width * beam_height * (beam_width**2 + beam_height**2) 69 | 70 | # Create arguments for the beamkm function 71 | ae = beam_width * beam_height * E * _np.ones(conn.shape[0]) 72 | jg = J * G * _np.ones(conn.shape[0]) 73 | ei1 = E * I1 * _np.ones(conn.shape[0]) 74 | ei2 = E * I2 * _np.ones(conn.shape[0]) 75 | mass_per_length = rho * beam_width * beam_height * _np.ones(conn.shape[0]) 76 | tmmi_per_length = Ixx_per_L * _np.ones(conn.shape[0]) 77 | 78 | # Compute K and M via beamkm 79 | this_K, this_M = _beamkm(coords.reshape(-1, 3), conn, bend_direction_1, 80 | ae, jg, ei1, ei2, mass_per_length, tmmi_per_length) 81 | 82 | geometry = _Geometry( 83 | _node_array(_np.arange(coords.reshape(-1, 3).shape[0]) + 1, coords.reshape(-1, 3), 1), 84 | _coordinate_system_array(), 85 | _traceline_array(_np.arange(conn.shape[0]) + 1, color=1, connectivity=conn + 1) 86 | ) 87 | 88 | system = _System( 89 | _from_nodelist(geometry.node.id, [1, 2, 3, 4, 5, 6]), 90 | this_M, this_K 91 | ) 92 | 93 | return system, geometry 94 | 95 | 96 | system, geometry = create_models() 97 | -------------------------------------------------------------------------------- /src/sdynpy/doc/__init__.py: -------------------------------------------------------------------------------- 1 | """Functions for automatically creating documentation for test and analysis 2 | 3 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 4 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 5 | Government retains certain rights in this software. 6 | 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 3 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see .""" 19 | from .sdynpy_ppt import create_summary_pptx 20 | from .sdynpy_latex import create_latex_summary 21 | 22 | from . import sdynpy_ppt as ppt 23 | from . import sdynpy_latex as latex 24 | -------------------------------------------------------------------------------- /src/sdynpy/fem/__init__.py: -------------------------------------------------------------------------------- 1 | """Functions and classes for creating and interacting with finite element models 2 | 3 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 4 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 5 | Government retains certain rights in this software. 6 | 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 3 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see .""" 19 | -------------------------------------------------------------------------------- /src/sdynpy/fem/sdynpy_dof.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Functions for optimally down-selecting degrees of freedom from a candidate set. 4 | 5 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 6 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 7 | Government retains certain rights in this software. 8 | 9 | This program is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU General Public License as published by 11 | the Free Software Foundation, either version 3 of the License, or 12 | (at your option) any later version. 13 | 14 | This program is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU General Public License for more details. 18 | 19 | You should have received a copy of the GNU General Public License 20 | along with this program. If not, see . 21 | """ 22 | 23 | import numpy as np 24 | import time 25 | 26 | UPDATE_TIME = 5 27 | 28 | 29 | def by_condition_number(sensors_to_keep, shape_matrix, return_condition_numbers=False): 30 | '''Get the best set of degrees of freedom by mode shape condition number 31 | 32 | This function accepts a shape matrix and returns the set of degrees of 33 | freedom that corresponds to the lowest condition number. 34 | 35 | Parameters 36 | ---------- 37 | sensors_to_keep : int 38 | The number of sensors to keep. 39 | shape_matrix : np.ndarray 40 | A 2D or 3D numpy array. If it is a 2D array, the row indices should 41 | correspond to the degree of freedom and the column indices should 42 | correspond to the mode. For a 3D array, the first index corresponds to 43 | a "bundle" of channels (e.g. a triaxial accelerometer) that must be 44 | kept or removed as one unit. 45 | return_condition_numbers : bool (default False) 46 | If True, return a second value that is the condition number at each 47 | iteration of the technique. 48 | 49 | Returns 50 | ------- 51 | indices : np.array 52 | A 1d array corresponding to the indices to keep in the first dimension 53 | of the shape_matrix array (e.g. new_shape_matrix = 54 | shape_matrix[incies,...]) 55 | returned_condition_numbers : list 56 | The condition number at each iteration. Returned only if 57 | return_condition_numbers is True. 58 | ''' 59 | shape_matrix = shape_matrix.copy() 60 | keep_indices = np.arange(shape_matrix.shape[0]) 61 | if return_condition_numbers: 62 | returned_condition_numbers = [np.linalg.cond( 63 | shape_matrix.reshape(-1, shape_matrix.shape[-1]))] 64 | start_time = time.time() 65 | while shape_matrix.shape[0] > sensors_to_keep: 66 | condition_numbers = [np.linalg.cond(shape_matrix[np.arange(shape_matrix.shape[0]) != removed_dof_index, ...].reshape( 67 | -1, shape_matrix.shape[-1])) for removed_dof_index in range(shape_matrix.shape[0])] 68 | dof_to_remove = np.argmin(condition_numbers) 69 | # print('Condition Numbers {:}'.format(condition_numbers)) 70 | # print('Removing DOF {:}'.format(dof_to_remove)) 71 | shape_matrix = np.delete(shape_matrix.copy(), dof_to_remove, axis=0) 72 | keep_indices = np.delete(keep_indices, dof_to_remove, axis=0) 73 | if return_condition_numbers: 74 | returned_condition_numbers.append(condition_numbers[dof_to_remove]) 75 | new_time = time.time() 76 | if new_time - start_time > UPDATE_TIME: 77 | print('{:} DoFs Remaining'.format(shape_matrix.shape[0])) 78 | start_time += UPDATE_TIME 79 | if return_condition_numbers: 80 | return keep_indices, returned_condition_numbers 81 | else: 82 | return keep_indices 83 | 84 | 85 | def by_effective_independence(sensors_to_keep, shape_matrix, return_efi=False): 86 | '''Get the best set of degrees of freedom by mode shape effective independence 87 | 88 | This function accepts a shape matrix and returns the set of degrees of 89 | freedom that corresponds to the maximum effective independence. 90 | 91 | Parameters 92 | ---------- 93 | sensors_to_keep : int 94 | The number of sensors to keep. 95 | shape_matrix : np.ndarray 96 | A 2D or 3D numpy array. If it is a 2D array, the row indices should 97 | correspond to the degree of freedom and the column indices should 98 | correspond to the mode. For a 3D array, the first index corresponds to 99 | a "bundle" of channels (e.g. a triaxial accelerometer) that must be 100 | kept or removed as one unit. 101 | return_efi : bool (default False) 102 | If True, return a second value that is the effective independence at 103 | each iteration of the technique. 104 | 105 | Returns 106 | ------- 107 | indices : np.array 108 | A 1d array corresponding to the indices to keep in the first dimension 109 | of the shape_matrix array (e.g. new_shape_matrix = 110 | shape_matrix[incies,...]) 111 | returned_efi : list 112 | The effective independence at each iteration. Returned only if 113 | return_efi is set to True. 114 | ''' 115 | shape_matrix = shape_matrix.copy() 116 | keep_indices = np.arange(shape_matrix.shape[0]) 117 | if return_efi: 118 | returned_efi = [] 119 | start_time = time.time() 120 | while shape_matrix.shape[0] > sensors_to_keep: 121 | Q = shape_matrix.reshape(-1, shape_matrix.shape[-1] 122 | ).T @ shape_matrix.reshape(-1, shape_matrix.shape[-1]) 123 | if return_efi: 124 | returned_efi.append(np.linalg.det(Q)) 125 | Qinv = np.linalg.inv(Q) 126 | if shape_matrix.ndim == 2: 127 | EfIs = np.diag(shape_matrix @ Qinv @ shape_matrix.T) 128 | else: 129 | EfIs = 1 - np.linalg.det(np.eye(3) - np.einsum('ijk,kl,iml->ijm', 130 | shape_matrix, Qinv, shape_matrix)) 131 | dof_to_remove = np.argmin(EfIs) 132 | # print('Effective Independences {:}'.format(EfI3s)) 133 | # print('Removing DOF {:}'.format(dof_to_remove)) 134 | shape_matrix = np.delete(shape_matrix.copy(), dof_to_remove, axis=0) 135 | keep_indices = np.delete(keep_indices, dof_to_remove, axis=0) 136 | new_time = time.time() 137 | if new_time - start_time > UPDATE_TIME: 138 | print('{:} DoFs Remaining'.format(shape_matrix.shape[0])) 139 | start_time += UPDATE_TIME 140 | if return_efi: 141 | return keep_indices, returned_efi 142 | else: 143 | return keep_indices 144 | -------------------------------------------------------------------------------- /src/sdynpy/fileio/__init__.py: -------------------------------------------------------------------------------- 1 | """Functions and classes for reading data from common file types 2 | 3 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 4 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 5 | Government retains certain rights in this software. 6 | 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 3 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see .""" 19 | from . import sdynpy_uff as uff 20 | from . import sdynpy_rattlesnake as rattlesnake 21 | from . import sdynpy_vic as vic 22 | from . import sdynpy_tshaker as tshaker 23 | 24 | unv = uff 25 | -------------------------------------------------------------------------------- /src/sdynpy/fileio/sdynpy_uff_datasets/__init__.py: -------------------------------------------------------------------------------- 1 | """Universal file format dataset definitions 2 | 3 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 4 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 5 | Government retains certain rights in this software. 6 | 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 3 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see .""" 19 | -------------------------------------------------------------------------------- /src/sdynpy/fileio/sdynpy_uff_datasets/sdynpy_uff_dataset_164.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Units 4 | 5 | This dataset defines the unit system for the universal file 6 | 7 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 8 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 9 | Government retains certain rights in this software. 10 | 11 | This program is free software: you can redistribute it and/or modify 12 | it under the terms of the GNU General Public License as published by 13 | the Free Software Foundation, either version 3 of the License, or 14 | (at your option) any later version. 15 | 16 | This program is distributed in the hope that it will be useful, 17 | but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | GNU General Public License for more details. 20 | 21 | You should have received a copy of the GNU General Public License 22 | along with this program. If not, see . 23 | """ 24 | 25 | from ..sdynpy_uff import UFFReadError 26 | 27 | 28 | class Sdynpy_UFF_Dataset_164: 29 | def __init__(self): 30 | self.units_code = 0 31 | self.units_description = '' 32 | self.temperature_mode = 1 33 | self.length_conv = 1 34 | self.force_conv = 1 35 | self.temp_conv = 1 36 | self.temp_offset = 1 37 | 38 | @property 39 | def dataset_number(self): 40 | return 164 41 | 42 | @classmethod 43 | def from_uff_data_array(cls, data): 44 | # Transform from binary to ascii 45 | data = [line.decode() for line in data] 46 | ds_164 = cls() 47 | # Record 1: FORMAT(I10,20A1,I10) 48 | # Field 1 -- units code 49 | # = 1 - SI: Meter (newton) 50 | # = 2 - BG: Foot (pound f) 51 | # = 3 - MG: Meter (kilogram f) 52 | # = 4 - BA: Foot (poundal) 53 | # = 5 - MM: mm (milli newton) 54 | # = 6 - CM: cm (centi newton) 55 | # = 7 - IN: Inch (pound f) 56 | # = 8 - GM: mm (kilogram f) 57 | # = 9 - US: USER_DEFINED 58 | # = 10- MN: mm (newton) 59 | try: 60 | ds_164.units_code = int(data[0][0:10]) 61 | except ValueError: 62 | return UFFReadError('Units Code (record 1 field 1) must be an integer!') 63 | # Field 2 -- units description (used for 64 | # documentation only) 65 | ds_164.units_description = data[0][10:30].strip() 66 | # Field 3 -- temperature mode 67 | # = 1 - absolute 68 | # = 2 - relative 69 | try: 70 | ds_164.temperature_mode = int(data[0][30:40]) 71 | except ValueError: 72 | return UFFReadError('Temperature Mode (record 1 field 3) must be an integer!') 73 | # Record 2: FORMAT(3D25.17) 74 | # Unit factors for converting universal file units to SI. 75 | # To convert from universal file units to SI divide by 76 | # the appropriate factor listed below. 77 | # Field 1 -- length 78 | try: 79 | ds_164.length_conv = float(data[1][0:25]) 80 | except ValueError: 81 | return UFFReadError('Length Conversion Factor (record 2 field 1) must be a floating point number') 82 | # Field 2 -- force 83 | try: 84 | ds_164.force_conv = float(data[1][25:50]) 85 | except ValueError: 86 | return UFFReadError('Force Conversion Factor (record 2 field 2) must be a floating point number') 87 | # Field 3 -- temperature 88 | try: 89 | ds_164.temp_conv = float(data[1][50:75]) 90 | except ValueError: 91 | return UFFReadError('Temperature Conversion Factor (record 2 field 3) must be a floating point number') 92 | # Field 4 -- temperature offset <-- Actually Record 3 field 1! 93 | try: 94 | ds_164.temp_offset = float(data[2][0:25]) 95 | except ValueError: 96 | return UFFReadError('Temperature offset (record 4 field 1) must be a floating point number') 97 | return ds_164 98 | 99 | def __repr__(self): 100 | return 'Sdynpy_UFF_Dataset_164<{}>'.format(self.units_description) 101 | 102 | def write_string(self): 103 | return ('{:<10}{:<20}{:<10}\n'.format(self.units_code, 104 | self.units_description, 105 | self.temperature_mode) + 106 | '{:>25.17E}{:>25.17E}{:>25.17E}\n{:>25.17E}\n'.format(self.length_conv, 107 | self.force_conv, 108 | self.temp_conv, 109 | self.temp_offset)) 110 | 111 | def __str__(self): 112 | lines = self.write_string().split('\n') 113 | if len(lines) > 8: 114 | return 'Dataset 164: Units\n ' + '\n '.join(lines[0:5] + ['.', '.', '.']) 115 | else: 116 | return 'Dataset 164: Units\n ' + '\n '.join(lines) 117 | 118 | 119 | def read(data): 120 | return Sdynpy_UFF_Dataset_164.from_uff_data_array(data) 121 | -------------------------------------------------------------------------------- /src/sdynpy/fileio/sdynpy_uff_datasets/sdynpy_uff_dataset_2411.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Nodes 4 | 5 | This dataset defines the node positions, colors, and coordinate systems in a 6 | geometry. 7 | 8 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 9 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 10 | Government retains certain rights in this software. 11 | 12 | This program is free software: you can redistribute it and/or modify 13 | it under the terms of the GNU General Public License as published by 14 | the Free Software Foundation, either version 3 of the License, or 15 | (at your option) any later version. 16 | 17 | This program is distributed in the hope that it will be useful, 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | GNU General Public License for more details. 21 | 22 | You should have received a copy of the GNU General Public License 23 | along with this program. If not, see . 24 | """ 25 | 26 | from ..sdynpy_uff import UFFReadError, parse_uff_line, parse_uff_lines, write_uff_line 27 | import numpy as np 28 | 29 | 30 | class Sdynpy_UFF_Dataset_2411: 31 | def __init__(self, node_labels=np.array((1,)), export_coordinate_systems=np.array((1,)), 32 | displacement_coordinate_systems=np.array((1,)), colors=np.array((1,)), 33 | coordinates=np.array([(0, 0, 0)])): 34 | self.node_labels = node_labels 35 | self.export_coordinate_systems = export_coordinate_systems 36 | self.displacement_coordinate_systems = displacement_coordinate_systems 37 | self.colors = colors 38 | self.coordinates = coordinates 39 | 40 | @property 41 | def dataset_number(self): 42 | return 2411 43 | 44 | @classmethod 45 | def from_uff_data_array(cls, data): 46 | # Transform from binary to ascii 47 | data = [line.decode() for line in data] 48 | nnodes = len(data) // 2 49 | node_labels = np.empty(nnodes, dtype=int) 50 | export_coordinate_systems = np.empty(nnodes, dtype=int) 51 | displacement_coordinate_systems = np.empty(nnodes, dtype=int) 52 | coordinates = np.empty((nnodes, 3), dtype=float) 53 | colors = np.empty(nnodes, dtype=int) 54 | for i in range(nnodes): 55 | # Record 1: FORMAT(4I10) 56 | # Field 1 -- node label 57 | # Field 2 -- export coordinate system number 58 | # Field 3 -- displacement coordinate system number 59 | # Field 4 -- color 60 | node_labels[i], export_coordinate_systems[i], displacement_coordinate_systems[i], colors[i] = ( 61 | parse_uff_line(data[2 * i], 4 * ['I10'])) 62 | # Record 2: FORMAT(1P3D25.16) 63 | # Fields 1-3 -- node coordinates in the part coordinate 64 | # system 65 | coordinates[i, :] = parse_uff_line(data[2 * i + 1], 3 * ['D25.16']) 66 | # Make sure coordinates don't end up being 2D 67 | ds_2411 = cls(node_labels, export_coordinate_systems, displacement_coordinate_systems, 68 | colors, coordinates) 69 | return ds_2411 70 | 71 | def __repr__(self): 72 | return 'Sdynpy_UFF_Dataset_2411<{} node(s)>'.format(len(self.node_labels)) 73 | 74 | def write_string(self): 75 | return_string = '' 76 | for node_label, export_coordinate_system, displacement_coordinate_system, color, coordinates in zip( 77 | self.node_labels, self.export_coordinate_systems, self.displacement_coordinate_systems, self.colors, self.coordinates): 78 | return_string += write_uff_line([node_label, export_coordinate_system, displacement_coordinate_system, 79 | color] + coordinates.tolist(), 4 * ['I10'] + ['\n'] + 3 * ['D25.16']) 80 | return return_string 81 | 82 | def __str__(self): 83 | lines = self.write_string().split('\n') 84 | if len(lines) > 8: 85 | return 'Dataset 2411: Nodes\n ' + '\n '.join(lines[0:5] + ['.', '.', '.']) 86 | else: 87 | return 'Dataset 2411: Nodes\n ' + '\n '.join(lines) 88 | 89 | 90 | def read(data): 91 | return Sdynpy_UFF_Dataset_2411.from_uff_data_array(data) 92 | -------------------------------------------------------------------------------- /src/sdynpy/fileio/sdynpy_uff_datasets/sdynpy_uff_dataset_2420.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Coordinate Systems 4 | 5 | This dataset defines the coordinate systems in a test geometry 6 | 7 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 8 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 9 | Government retains certain rights in this software. 10 | 11 | This program is free software: you can redistribute it and/or modify 12 | it under the terms of the GNU General Public License as published by 13 | the Free Software Foundation, either version 3 of the License, or 14 | (at your option) any later version. 15 | 16 | This program is distributed in the hope that it will be useful, 17 | but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | GNU General Public License for more details. 20 | 21 | You should have received a copy of the GNU General Public License 22 | along with this program. If not, see . 23 | """ 24 | 25 | from ..sdynpy_uff import UFFReadError, parse_uff_line, parse_uff_lines, write_uff_line 26 | from ...core import sdynpy_colors 27 | import numpy as np 28 | 29 | 30 | class Sdynpy_UFF_Dataset_2420: 31 | def __init__(self, part_uid=1, part_name='', 32 | cs_labels=[], cs_types=[], cs_colors=[], 33 | cs_names=[], cs_matrices=np.zeros((0, 4, 3))): 34 | self.part_uid = part_uid 35 | self.part_name = part_name 36 | self.cs_labels = cs_labels 37 | self.cs_types = cs_types 38 | self.cs_colors = cs_colors 39 | self.cs_names = cs_names 40 | self.cs_matrices = cs_matrices 41 | 42 | @property 43 | def dataset_number(self): 44 | return 2420 45 | 46 | @classmethod 47 | def from_uff_data_array(cls, data): 48 | # Transform from binary to ascii 49 | data = [line.decode() for line in data] 50 | # Record 1: FORMAT (1I10) 51 | # Field 1 -- Part UID 52 | part_uid, = parse_uff_line(data[0], ['I10']) 53 | # Record 2: FORMAT (40A2) 54 | # Field 1 -- Part Name 55 | part_name, = parse_uff_line(data[1], ['A80']) 56 | cs_labels = [] 57 | cs_types = [] 58 | cs_colors = [] 59 | cs_matrices = [] 60 | cs_names = [] 61 | index = 2 62 | while index < len(data): 63 | # Record 3: FORMAT (3I10) 64 | # Field 1 -- Coordinate System Label 65 | # Field 2 -- Coordinate System Type 66 | # = 0, Cartesian 67 | # = 1, Cylindrical 68 | # = 2, Spherical 69 | # Field 3 -- Coordinate System Color 70 | cs_label, cs_type, cs_color = parse_uff_line(data[index], 3 * ['I10']) 71 | # Record 4: FORMAT (40A2) 72 | # Field 1 -- Coordinate System Name 73 | cs_name, = parse_uff_line(data[index + 1], ['A80']) 74 | # Record 5: FORMAT (1P3D25.16) 75 | # Field 1-3 -- Transformation Matrix Row 1 76 | # 77 | # Record 6: FORMAT (1P3D25.16) 78 | # Field 1-3 -- Transformation Matrix Row 2 79 | # 80 | # Record 7: FORMAT (1P3D25.16) 81 | # Field 1-3 -- Transformation Matrix Row 3 82 | # 83 | # Record 8: FORMAT (1P3D25.16) 84 | # Field 1-3 -- Transformation Matrix Row 4 85 | cs_matrix, read_lines = parse_uff_lines(data[index + 2:], 3 * ['D25.16'], 12) 86 | cs_matrix = np.array(cs_matrix).reshape(4, 3) 87 | index += 2 + read_lines 88 | cs_labels.append(cs_label) 89 | cs_types.append(cs_type) 90 | cs_colors.append(cs_color) 91 | cs_matrices.append(cs_matrix) 92 | cs_names.append(cs_name) 93 | # Make sure matrices are the right size 94 | matrix_array = np.array(cs_matrices) 95 | ds_2420 = cls(part_uid, part_name, cs_labels, cs_types, cs_colors, cs_names, 96 | matrix_array) 97 | return ds_2420 98 | 99 | def __repr__(self): 100 | return 'Sdynpy_UFF_Dataset_2420<{} coordinate systems(s)>'.format(len(self.cs_labels)) 101 | 102 | def write_string(self): 103 | return_string = write_uff_line([self.part_uid, self.part_name], ['I10', '\n', 'A80']) 104 | 105 | for cs_label, cs_type, cs_color, cs_name, cs_matrix in zip(self.cs_labels, self.cs_types, 106 | self.cs_colors, self.cs_names, 107 | self.cs_matrices): 108 | return_string += (write_uff_line([cs_label, cs_type, cs_color], 3 * ['I10']) + 109 | write_uff_line([cs_name], ['A80']) + 110 | write_uff_line(cs_matrix.flatten(), 3 * ['D25.16'])) 111 | return return_string 112 | 113 | def __str__(self): 114 | lines = self.write_string().split('\n') 115 | if len(lines) > 8: 116 | return 'Dataset 2420: Coordinate Systems\n ' + '\n '.join(lines[0:5] + ['.', '.', '.']) 117 | else: 118 | return 'Dataset 2420: Coordinate Systems\n ' + '\n '.join(lines) 119 | 120 | 121 | def read(data): 122 | return Sdynpy_UFF_Dataset_2420.from_uff_data_array(data) 123 | -------------------------------------------------------------------------------- /src/sdynpy/fileio/sdynpy_uff_datasets/sdynpy_uff_dataset_82.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Tracelines 4 | 5 | This dataset defines tracelines, which are used to improve visibility of a 6 | test geometry. 7 | 8 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 9 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 10 | Government retains certain rights in this software. 11 | 12 | This program is free software: you can redistribute it and/or modify 13 | it under the terms of the GNU General Public License as published by 14 | the Free Software Foundation, either version 3 of the License, or 15 | (at your option) any later version. 16 | 17 | This program is distributed in the hope that it will be useful, 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | GNU General Public License for more details. 21 | 22 | You should have received a copy of the GNU General Public License 23 | along with this program. If not, see . 24 | """ 25 | 26 | from ..sdynpy_uff import UFFReadError, parse_uff_line, parse_uff_lines, write_uff_line 27 | import numpy as np 28 | 29 | 30 | class Sdynpy_UFF_Dataset_82: 31 | def __init__(self, 32 | traceline_number=1, 33 | color=1, 34 | identification='', 35 | nodes=[1]): 36 | self.traceline_number = traceline_number 37 | self.color = color 38 | self.identification = identification 39 | self.nodes = nodes 40 | 41 | @property 42 | def dataset_number(self): 43 | return 82 44 | 45 | @classmethod 46 | def from_uff_data_array(cls, data): 47 | # Transform from binary to ascii 48 | data = [line.decode() for line in data] 49 | # Record 1: FORMAT(3I10) 50 | # Field 1 - trace line number 51 | # Field 2 - number of nodes defining trace line 52 | # (maximum of 250) 53 | # Field 3 - color 54 | traceline_number, number_nodes, color = parse_uff_line(data[0], 3 * ['I10']) 55 | # Record 2: FORMAT(80A1) 56 | # Field 1 - Identification line 57 | identification, = parse_uff_line(data[1], ['A80']) 58 | # Record 3: FORMAT(8I10) 59 | # Field 1 - nodes defining trace line 60 | # = > 0 draw line to node 61 | # = 0 move to node (a move to the first 62 | # node is implied) 63 | nodes, read_lines = parse_uff_lines(data[2:], 8 * ['I10'], number_nodes) 64 | # Make sure connectivities doesn't end up being 2D 65 | ds_82 = cls(traceline_number=traceline_number, 66 | nodes=nodes, 67 | color=color, 68 | identification=identification) 69 | return ds_82 70 | 71 | def __repr__(self): 72 | return 'Sdynpy_UFF_Dataset_82'.format(self.traceline_number) 73 | 74 | def write_string(self): 75 | return_string = '' 76 | return_string += write_uff_line([self.traceline_number, 77 | len(self.nodes), 78 | self.color], 3 * ['I10']) 79 | return_string += write_uff_line([self.identification], ['A80']) 80 | return_string += write_uff_line(self.nodes, 8 * ['I10']) 81 | return return_string 82 | 83 | def __str__(self): 84 | lines = self.write_string().split('\n') 85 | if len(lines) > 8: 86 | return 'Dataset 82: Tracelines\n ' + '\n '.join(lines[0:5] + ['.', '.', '.']) 87 | else: 88 | return 'Dataset 82: Tracelines\n ' + '\n '.join(lines) 89 | 90 | 91 | def read(data): 92 | return Sdynpy_UFF_Dataset_82.from_uff_data_array(data) 93 | -------------------------------------------------------------------------------- /src/sdynpy/modal/__init__.py: -------------------------------------------------------------------------------- 1 | """Functions and classes for performing Experimental Modal Analysis 2 | 3 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 4 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 5 | Government retains certain rights in this software. 6 | 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 3 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see .""" 19 | from .sdynpy_polypy import PolyPy, PolyPy_GUI 20 | from .sdynpy_smac import SMAC, SMAC_GUI 21 | from .sdynpy_modeshape import compute_residues, compute_shapes 22 | from .sdynpy_signal_processing_gui import SignalProcessingGUI 23 | from .sdynpy_ccmif import ColoredCMIF 24 | from .sdynpy_modal_test import read_modal_fit_data, ModalTest -------------------------------------------------------------------------------- /src/sdynpy/modal/mode_properties.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 225 11 | 12 | 13 | 14 | Dialog 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | Frequency: 23 | 24 | 25 | 26 | 27 | 28 | 29 | true 30 | 31 | 32 | QAbstractSpinBox::NoButtons 33 | 34 | 35 | Hz 36 | 37 | 38 | 100000000.000000000000000 39 | 40 | 41 | 42 | 43 | 44 | 45 | Damping: 46 | 47 | 48 | 49 | 50 | 51 | 52 | true 53 | 54 | 55 | QAbstractSpinBox::NoButtons 56 | 57 | 58 | % 59 | 60 | 61 | 100000000.000000000000000 62 | 63 | 64 | 65 | 66 | 67 | 68 | Comment 1 69 | 70 | 71 | 72 | 73 | 74 | 75 | 80 76 | 77 | 78 | 79 | 80 | 81 | 82 | Comment 2 83 | 84 | 85 | 86 | 87 | 88 | 89 | 80 90 | 91 | 92 | 93 | 94 | 95 | 96 | Comment 3 97 | 98 | 99 | 100 | 101 | 102 | 103 | 80 104 | 105 | 106 | 107 | 108 | 109 | 110 | Comment 4 111 | 112 | 113 | 114 | 115 | 116 | 117 | 80 118 | 119 | 120 | 121 | 122 | 123 | 124 | Comment 5 125 | 126 | 127 | 128 | 129 | 130 | 131 | 80 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | Qt::Horizontal 141 | 142 | 143 | QDialogButtonBox::Cancel|QDialogButtonBox::Ok 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | buttonBox 153 | accepted() 154 | Dialog 155 | accept() 156 | 157 | 158 | 248 159 | 254 160 | 161 | 162 | 157 163 | 274 164 | 165 | 166 | 167 | 168 | buttonBox 169 | rejected() 170 | Dialog 171 | reject() 172 | 173 | 174 | 316 175 | 260 176 | 177 | 178 | 286 179 | 274 180 | 181 | 182 | 183 | 184 | 185 | -------------------------------------------------------------------------------- /src/sdynpy/modal/polypy_stability_diagram.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Form 4 | 5 | 6 | 7 | 0 8 | 0 9 | 851 10 | 506 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | Stabilization View 25 | 26 | 27 | 28 | 29 | 30 | CMIF 31 | 32 | 33 | true 34 | 35 | 36 | 37 | 38 | 39 | 40 | QMIF 41 | 42 | 43 | 44 | 45 | 46 | 47 | MMIF 48 | 49 | 50 | 51 | 52 | 53 | 54 | NMIF 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | Poles 65 | 66 | 67 | 68 | 69 | 70 | 71 | 0 72 | 0 73 | 74 | 75 | 76 | Qt::ScrollBarAlwaysOff 77 | 78 | 79 | QAbstractScrollArea::AdjustIgnored 80 | 81 | 82 | 35 83 | 84 | 85 | 65 86 | 87 | 88 | 89 | Frequency 90 | 91 | 92 | 93 | 94 | Damping 95 | 96 | 97 | 98 | 99 | Stable 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | Stabilization Diagram 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | Highlighted Pole: 124 | 125 | 126 | 127 | 128 | 129 | 130 | Qt::Horizontal 131 | 132 | 133 | 134 | 40 135 | 20 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | Discard 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | PlotWidget 159 | QGraphicsView 160 |
pyqtgraph
161 |
162 |
163 | 164 | 165 |
166 | -------------------------------------------------------------------------------- /src/sdynpy/signal_processing/__init__.py: -------------------------------------------------------------------------------- 1 | """General purpose signal processing tools 2 | 3 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 4 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 5 | Government retains certain rights in this software. 6 | 7 | This program is free software: you can redistribute it and/or modify 8 | it under the terms of the GNU General Public License as published by 9 | the Free Software Foundation, either version 3 of the License, or 10 | (at your option) any later version. 11 | 12 | This program is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | GNU General Public License for more details. 16 | 17 | You should have received a copy of the GNU General Public License 18 | along with this program. If not, see .""" 19 | from . import sdynpy_cpsd as cpsd 20 | from . import sdynpy_frf as frf 21 | from . import sdynpy_lrm as lrm 22 | from . import sdynpy_generator as generator 23 | from . import sdynpy_integration as integration 24 | from . import sdynpy_correlation as correlation 25 | from . import sdynpy_complex as complex 26 | from . import sdynpy_rotation as rotation 27 | from . import sdynpy_camera as camera 28 | from . import sdynpy_harmonic as harmonic 29 | from . import sdynpy_geometry_fitting as geometry_fitting 30 | from . import sdynpy_frf_inverse as frf_inverse 31 | from . import sdynpy_srs as srs 32 | -------------------------------------------------------------------------------- /src/sdynpy/signal_processing/sdynpy_complex.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Functions for dealing with complex numbers 4 | 5 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 6 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 7 | Government retains certain rights in this software. 8 | 9 | This program is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU General Public License as published by 11 | the Free Software Foundation, either version 3 of the License, or 12 | (at your option) any later version. 13 | 14 | This program is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU General Public License for more details. 18 | 19 | You should have received a copy of the GNU General Public License 20 | along with this program. If not, see . 21 | """ 22 | 23 | import numpy as np 24 | import matplotlib.pyplot as plt 25 | 26 | 27 | def collapse_complex_to_real(vector, axis=-1, preserve_magnitude=False, plot=False, 28 | force_angle=None): 29 | x = np.real(vector) 30 | y = np.imag(vector) 31 | slope = np.sum(x * y, axis=axis, keepdims=True) / np.sum(x * x, axis=axis, keepdims=True) 32 | angle = np.arctan(slope) 33 | if force_angle is not None: 34 | angle[...] = force_angle 35 | rotated_vector = vector * np.exp(-1j * angle) 36 | if plot: 37 | plt.figure('Complex Rotation') 38 | shape = list(vector.shape) 39 | shape[axis] = 1 40 | for key in np.ndindex(*shape): 41 | print(key) 42 | index = list(key) 43 | index[axis] = slice(None) 44 | this_vector = vector[index] 45 | this_rotated_vector = rotated_vector[index] 46 | plt.plot(np.real(this_vector), np.imag(this_vector), 'x') 47 | plt.plot(np.real(this_rotated_vector), np.imag(this_rotated_vector), 'o') 48 | if preserve_magnitude: 49 | return np.sign(np.real(rotated_vector)) * np.abs(rotated_vector) 50 | else: 51 | return np.real(rotated_vector) 52 | -------------------------------------------------------------------------------- /src/sdynpy/signal_processing/sdynpy_correlation.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Functions to compute correlation metrics between datasets 4 | 5 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 6 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 7 | Government retains certain rights in this software. 8 | 9 | This program is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU General Public License as published by 11 | the Free Software Foundation, either version 3 of the License, or 12 | (at your option) any later version. 13 | 14 | This program is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU General Public License for more details. 18 | 19 | You should have received a copy of the GNU General Public License 20 | along with this program. If not, see . 21 | """ 22 | 23 | import numpy as np 24 | import matplotlib.pyplot as plt 25 | import matplotlib.ticker as ticker 26 | import copy 27 | 28 | # Look at FRAC and TRAC values 29 | 30 | 31 | def mac(phi_1, phi_2=None): 32 | if phi_2 is None: 33 | phi_2 = phi_1 34 | mac = np.zeros([phi_1.shape[-1], phi_2.shape[-1]]) 35 | for i, shape_1 in enumerate(phi_1.T): 36 | for j, shape_2 in enumerate(phi_2.T): 37 | mac[i, j] = np.abs(shape_1.T @ shape_2.conj())**2 / \ 38 | ((shape_1.T @ shape_1.conj()) * (shape_2.T @ shape_2.conj())) 39 | return mac 40 | 41 | 42 | def frac(fft_1, fft_2=None): 43 | if fft_2 is None: 44 | fft_2 = fft_1 45 | fft_1_original_shape = fft_1.shape 46 | fft_1_flattened = fft_1.reshape(-1, fft_1.shape[-1]) 47 | fft_2_flattened = fft_2.reshape(-1, fft_2.shape[-1]) 48 | frac = (np.abs(np.sum(fft_1_flattened * fft_2_flattened.conj(), axis=-1))**2 49 | / ((np.sum(fft_1_flattened * fft_1_flattened.conj(), axis=-1)) 50 | * np.sum(fft_2_flattened * fft_2_flattened.conj(), axis=-1))) 51 | return frac.reshape(fft_1_original_shape[:-1]) 52 | 53 | 54 | def trac(th_1, th_2=None): 55 | if th_2 is None: 56 | th_2 = th_1 57 | th_1_original_shape = th_1.shape 58 | th_1_flattened = th_1.reshape(-1, th_1.shape[-1]) 59 | th_2_flattened = th_2.reshape(-1, th_2.shape[-1]) 60 | trac = (np.abs(np.sum(th_1_flattened * th_2_flattened.conj(), axis=-1))**2 61 | / ((np.sum(th_1_flattened * th_1_flattened.conj(), axis=-1)) 62 | * np.sum(th_2_flattened * th_2_flattened.conj(), axis=-1))) 63 | return trac.reshape(th_1_original_shape[:-1]) 64 | 65 | 66 | def msf(shapes, reference_shapes=None): 67 | if reference_shapes is None: 68 | reference_shapes = shapes 69 | output = (np.einsum('...ij,...ij->...j', shapes, reference_shapes.conj()) / 70 | np.einsum('...ij,...ij->...j', reference_shapes, reference_shapes.conj())) 71 | return output 72 | 73 | 74 | def orthog(shapes_1, mass_matrix, shapes_2=None, scaling=None): 75 | if scaling not in ['none', 'unity', None]: 76 | raise ValueError('Invalid scaling, should be one of "none", "unity", or None') 77 | if shapes_2 is None: 78 | shapes_2 = shapes_1 79 | mat = np.moveaxis(shapes_1, -2, -1) @ mass_matrix @ shapes_2 80 | if scaling == 'unity': 81 | diagonal = np.einsum('...ii->...i', mat) 82 | scaling = 1/np.sqrt(diagonal) 83 | scaling_matrix = np.zeros(mat.shape) 84 | scaling_matrix[..., 85 | np.arange(scaling_matrix.shape[-2]), 86 | np.arange(scaling_matrix.shape[-1])] = scaling 87 | mat = scaling_matrix @ mat @ scaling_matrix 88 | return mat 89 | 90 | 91 | def matrix_plot(shape_matrix, ax=None, display_values=(0.1, 1.1), text_size=12, vmin=0, vmax=1, 92 | boundaries=None): 93 | if boundaries is None: 94 | # Display number not index 95 | @ticker.FuncFormatter 96 | def major_formatter(x, pos): 97 | return '{:0.0f}'.format(x + 1) 98 | cm = plt.get_cmap() 99 | else: 100 | # Add boundaries to the shape matrix 101 | boundaries = np.array(boundaries) 102 | shape_matrix_original = shape_matrix.copy() 103 | n_shapes = shape_matrix_original.shape[0] 104 | shape_matrix = np.nan * np.empty([v + len(boundaries) for v in shape_matrix_original.shape]) 105 | index_map = {i + np.sum(boundaries <= i): i for i in np.arange(n_shapes)} 106 | inverse_index_map = {i: i + np.sum(boundaries <= i) for i in np.arange(n_shapes)} 107 | outputs = np.arange(n_shapes) 108 | inputs = np.array([inverse_index_map[i] for i in outputs]) 109 | shape_matrix[ 110 | inputs[:, np.newaxis], inputs 111 | ] = shape_matrix_original[ 112 | outputs[:, np.newaxis], outputs] 113 | cm = copy.copy(plt.get_cmap()) 114 | cm.set_bad(color='w') 115 | 116 | @ticker.FuncFormatter 117 | def major_formatter(x, pos): 118 | x = int(np.round(x)) 119 | if x not in index_map: 120 | return '' 121 | else: 122 | x = index_map[x] 123 | level = np.sum(x >= boundaries) 124 | if level == 0: 125 | shape_index = x 126 | else: 127 | shape_index = x - boundaries[level - 1] 128 | return '{:},{:}'.format(level + 1, shape_index + 1) 129 | if ax is None: 130 | fig, ax = plt.subplots() 131 | out = ax.imshow(shape_matrix, vmin=vmin, vmax=vmax, cmap=cm) 132 | plt.colorbar(out, ax=ax) 133 | ax.xaxis.set_major_formatter(major_formatter) 134 | ax.xaxis.set_major_locator(ticker.MaxNLocator(integer=True)) 135 | ax.yaxis.set_major_formatter(major_formatter) 136 | ax.yaxis.set_major_locator(ticker.MaxNLocator(integer=True)) 137 | ax.set_xlabel('Shape Number') 138 | ax.set_ylabel('Shape Number') 139 | if display_values is not None: 140 | for key, val in np.ndenumerate(shape_matrix): 141 | if ((True if display_values[0] is None else (val > display_values[0])) 142 | and 143 | (True if display_values[1] is None else (val <= display_values[1]))): 144 | ax.text(key[1], key[0], '{:0.0f}'.format(val * 100), 145 | fontdict={'size': text_size}, ha='center', va='center') 146 | return ax 147 | -------------------------------------------------------------------------------- /src/sdynpy/signal_processing/sdynpy_geometry_fitting.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Functions to fit geometry to point data 4 | 5 | This module defines a Geometry object as well as all of the subcomponents of 6 | a geometry object: nodes, elements, tracelines and coordinate system. Geometry 7 | plotting is also handled in this module. 8 | 9 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 10 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 11 | Government retains certain rights in this software. 12 | 13 | This program is free software: you can redistribute it and/or modify 14 | it under the terms of the GNU General Public License as published by 15 | the Free Software Foundation, either version 3 of the License, or 16 | (at your option) any later version. 17 | 18 | This program is distributed in the hope that it will be useful, 19 | but WITHOUT ANY WARRANTY; without even the implied warranty of 20 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 | GNU General Public License for more details. 22 | 23 | You should have received a copy of the GNU General Public License 24 | along with this program. If not, see . 25 | """ 26 | 27 | 28 | import numpy as np 29 | import scipy.optimize as opt 30 | 31 | 32 | def cone_fit(points, origin, direction, angle): 33 | a = origin 34 | p = points 35 | n = direction 36 | height = np.einsum('...i,i->...', (a - p), n) 37 | distance = np.linalg.norm((a-p) - (height[:, np.newaxis])*n, axis=1) 38 | expected_distance = -np.tan(angle)*height 39 | return np.linalg.norm((distance-expected_distance)) 40 | 41 | 42 | def create_cone(ncircum, naxial, height, angle, origin, direction): 43 | circum_angles = np.linspace(0, 2*np.pi, ncircum, endpoint=False) 44 | heights = np.linspace(0, height, naxial+1)[1:] 45 | points = [] 46 | for i, cangle in enumerate(circum_angles): 47 | for j, h in enumerate(heights): 48 | radius = np.tan(angle)*h 49 | points.append([np.sin(cangle)*radius, np.cos(cangle)*radius, h]) 50 | points = np.array(points) 51 | rotation_matrix_z = direction/np.linalg.norm(direction) 52 | rotation_matrix_y = np.cross(rotation_matrix_z, [1.0, 0.0, 0.0]) 53 | if np.linalg.norm(rotation_matrix_y) < 1e-10: 54 | rotation_matrix_x = np.cross([0.0, 1.0, 0.0], rotation_matrix_z) 55 | rotation_matrix_x /= np.linalg.norm(rotation_matrix_x) 56 | rotation_matrix_y = np.cross(rotation_matrix_z, rotation_matrix_x) 57 | rotation_matrix_y /= np.linalg.norm(rotation_matrix_y) 58 | else: 59 | rotation_matrix_y /= np.linalg.norm(rotation_matrix_y) 60 | rotation_matrix_x = np.cross(rotation_matrix_y, rotation_matrix_z) 61 | rotation_matrix_x /= np.linalg.norm(rotation_matrix_x) 62 | R = np.array((rotation_matrix_x, rotation_matrix_y, rotation_matrix_z)).T 63 | new_points = ((R@points.T).T+origin) 64 | return new_points 65 | 66 | 67 | def cone_error_fn_fixed_angle(points, angle): 68 | return lambda x: cone_fit(points, x[:3], x[3:], angle) 69 | 70 | 71 | def cone_error_fn_free_angle(points): 72 | return lambda x: cone_fit(points, x[:3], x[3:6], x[6]) 73 | 74 | 75 | def fit_cone_fixed_angle(points, angle): 76 | 77 | def constraint_eqn(x): 78 | return np.linalg.norm(x[3:]) 79 | 80 | opt_fn = cone_error_fn_fixed_angle(points, angle) 81 | origin_guess = np.mean(points, axis=0) 82 | u, s, vh = np.linalg.svd(points-origin_guess) 83 | direction_guess = vh[0] 84 | x0_1 = np.concatenate((origin_guess, direction_guess)) 85 | x0_2 = np.concatenate((origin_guess, -direction_guess)) 86 | # Constrain to a unit vector 87 | constraint = opt.NonlinearConstraint(constraint_eqn, 1.0, 1.0) 88 | result_1 = opt.minimize(opt_fn, x0_1, method='trust-constr', constraints=constraint) 89 | result_2 = opt.minimize(opt_fn, x0_2, method='trust-constr', constraints=constraint) 90 | # Figure out which is the better one 91 | result = result_1 if result_1.fun < result_2.fun else result_2 92 | cone_origin = result.x[:3] 93 | cone_direction = result.x[3:] 94 | return result.fun, cone_origin, cone_direction 95 | 96 | 97 | def distance_point_line(points, origin, direction): 98 | return np.linalg.norm(np.cross((points-origin), direction), axis=-1)/np.linalg.norm(direction) 99 | 100 | 101 | def distance_point_plane(point, plane_point, plane_direction): 102 | return abs(np.einsum('...i,...i->...', point-plane_point, plane_direction))/np.linalg.norm(plane_direction, axis=-1) 103 | 104 | 105 | def cylinder_fit(points, origin, direction, radius): 106 | return np.linalg.norm(distance_point_line(points, origin, direction) - radius) 107 | 108 | 109 | def fit_cylinder(points, origin_guess=None, direction_guess=None, radius_guess=None): 110 | def opt_fn(x): 111 | return cylinder_fit(points, x[:3], x[3:6], x[6:7]) 112 | 113 | def constraint_eqn(x): 114 | return np.linalg.norm(x[3:6]) 115 | 116 | if origin_guess is None: 117 | origin_guess = np.mean(points, axis=0) 118 | if direction_guess is None or direction_guess == 'largest': 119 | u, s, vh = np.linalg.svd(points-origin_guess) 120 | direction_guess = vh[0] 121 | elif direction_guess == 'smallest': 122 | u, s, vh = np.linalg.svd(points-origin_guess) 123 | direction_guess = vh[-1] 124 | if radius_guess is None: 125 | u, s, vh = np.linalg.svd(points-origin_guess) 126 | radius_guess = s[0]/2 127 | x0 = np.concatenate((origin_guess, direction_guess, [radius_guess])) 128 | # Constrain to a unit vector 129 | constraint = opt.NonlinearConstraint(constraint_eqn, 1.0, 1.0) 130 | result = opt.minimize(opt_fn, x0, method='trust-constr', constraints=constraint) 131 | origin = result.x[:3] 132 | direction = result.x[3:6] 133 | radius = result.x[6] 134 | return result.fun, origin, direction, radius 135 | 136 | 137 | def fit_line_point_cloud(points): 138 | center = np.mean(points, axis=0) 139 | shifted_points = points-center 140 | cov = points.T@shifted_points 141 | evals, evects = np.linalg.eigh(cov) 142 | direction = evects[:, np.argmax(evals)] 143 | direction /= np.linalg.norm(direction) 144 | return lambda t: center+t*direction 145 | -------------------------------------------------------------------------------- /src/sdynpy/signal_processing/sdynpy_harmonic.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Functions for dealing with sinusoidal data 4 | 5 | Copyright 2022 National Technology & Engineering Solutions of Sandia, 6 | LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. 7 | Government retains certain rights in this software. 8 | 9 | This program is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU General Public License as published by 11 | the Free Software Foundation, either version 3 of the License, or 12 | (at your option) any later version. 13 | 14 | This program is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU General Public License for more details. 18 | 19 | You should have received a copy of the GNU General Public License 20 | along with this program. If not, see . 21 | """ 22 | 23 | import numpy as np 24 | import numpy.linalg as la 25 | 26 | 27 | def harmonic_mag_phase(ts, xs, frequency, nharmonics=1): 28 | A = np.zeros((ts.size, nharmonics * 2 + 1)) 29 | for i in range(nharmonics): 30 | A[:, i] = np.sin(2 * np.pi * frequency * (i + 1) * ts) 31 | A[:, nharmonics + i] = np.cos(2 * np.pi * frequency * (i + 1) * ts) 32 | A[:, -1] = np.ones(ts.size) 33 | coefs = la.lstsq(A, xs[:, np.newaxis])[0] 34 | As = np.array(coefs[:nharmonics, :]) 35 | Bs = np.array(coefs[nharmonics:nharmonics * 2, :]) 36 | phases = np.arctan2(Bs, As)[:, 0] 37 | magnitudes = np.sqrt(As**2 + Bs**2)[:, 0] 38 | return magnitudes, phases 39 | -------------------------------------------------------------------------------- /tests/geometry_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Aug 24 14:55:18 2022 4 | 5 | @author: dprohe 6 | """ 7 | 8 | import sys 9 | sys.path.insert(0,'./src') 10 | import sdynpy as sdpy 11 | import pytest 12 | import os 13 | THIS_DIR = os.path.dirname(os.path.abspath(__file__)) 14 | 15 | import numpy as np 16 | 17 | # Create some geometry objects 18 | @pytest.fixture 19 | def cartesian_geometry(): 20 | coordinates = np.linspace(-1,1,5) 21 | all_coords = np.array(np.meshgrid(coordinates,coordinates,coordinates,indexing='ij')).reshape(3,-1).T 22 | node_ids = np.arange(all_coords.shape[0])+1 23 | rotation = sdpy.rotation.R(2,20,degrees=True)@sdpy.rotation.R(1,-30,degrees=True)@sdpy.rotation.R(0,-45,degrees=True) 24 | translation = np.array(((0.0,2.0,1.0),)) 25 | rotmat = np.concatenate((rotation,translation),axis=0) 26 | definition_coordinate_system = sdpy.coordinate_system_array(2,matrix=rotmat)[np.newaxis] 27 | nodes = sdpy.node_array(node_ids,all_coords,def_cs=2,disp_cs=2) 28 | geometry = sdpy.Geometry(nodes,definition_coordinate_system) 29 | return geometry 30 | 31 | @pytest.fixture 32 | def cylindrical_geometry(): 33 | all_coords = np.array(np.meshgrid(np.linspace(-1,1,5),np.linspace(0,360,10),np.linspace(-1,1,5),indexing='ij')).reshape(3,-1).T 34 | node_ids = np.arange(all_coords.shape[0])+1 35 | rotation = sdpy.rotation.R(2,20,degrees=True)@sdpy.rotation.R(1,-30,degrees=True)@sdpy.rotation.R(0,-45,degrees=True) 36 | translation = np.array(((0.0,2.0,1.0),)) 37 | rotmat = np.concatenate((rotation,translation),axis=0) 38 | definition_coordinate_system = sdpy.coordinate_system_array(2,matrix=rotmat,cs_type=1)[np.newaxis] 39 | nodes = sdpy.node_array(node_ids,all_coords,def_cs=2,disp_cs=2) 40 | geometry = sdpy.Geometry(nodes,definition_coordinate_system) 41 | return geometry 42 | 43 | @pytest.fixture 44 | def spherical_geometry(): 45 | all_coords = np.array(np.meshgrid(np.linspace(-1,1,5),np.linspace(0,180,10),np.linspace(0,360,20),indexing='ij')).reshape(3,-1).T 46 | node_ids = np.arange(all_coords.shape[0])+1 47 | rotation = sdpy.rotation.R(2,20,degrees=True)@sdpy.rotation.R(1,-30,degrees=True)@sdpy.rotation.R(0,-45,degrees=True) 48 | translation = np.array(((0.0,2.0,1.0),)) 49 | rotmat = np.concatenate((rotation,translation),axis=0) 50 | definition_coordinate_system = sdpy.coordinate_system_array(2,matrix=rotmat,cs_type=2)[np.newaxis] 51 | nodes = sdpy.node_array(node_ids,all_coords,def_cs=2,disp_cs=2) 52 | geometry = sdpy.Geometry(nodes,definition_coordinate_system) 53 | return geometry 54 | 55 | @pytest.mark.parametrize('geometry_fixture', 56 | ['cartesian_geometry','cylindrical_geometry','spherical_geometry']) 57 | def test_geometry_construction(geometry_fixture,request): 58 | geometry = request.getfixturevalue(geometry_fixture) 59 | straight_geometry = geometry.copy() 60 | straight_geometry.coordinate_system.matrix[...,:3,:3] = np.eye(3) 61 | straight_geometry.coordinate_system.matrix[...,3:,:3] = 0 62 | rotated_geometry = geometry.copy() 63 | rotated_geometry.coordinate_system.matrix[...,3:,:3] = 0 64 | assert isinstance(geometry,sdpy.Geometry) 65 | straight_coords = straight_geometry.global_node_coordinate() 66 | rotated_coords = rotated_geometry.global_node_coordinate() 67 | final_coords = geometry.global_node_coordinate() 68 | rotation = geometry.coordinate_system.matrix[0,:3,:3] 69 | translation = geometry.coordinate_system.matrix[0,3,:3] 70 | cs_type = geometry.coordinate_system.cs_type[0] 71 | assert np.allclose(straight_coords@rotation,rotated_coords) 72 | assert np.allclose(rotated_coords+translation,final_coords) 73 | if cs_type == 0: # Cartesian 74 | assert np.allclose(geometry.node.coordinate,straight_coords) 75 | if cs_type == 1: # Cylindrical 76 | check_coords = geometry.node.coordinate.copy() 77 | check_coords[:,0],check_coords[:,1] = (check_coords[:,0]*np.cos(check_coords[:,1]*np.pi/180), 78 | check_coords[:,0]*np.sin(check_coords[:,1]*np.pi/180)) 79 | assert np.allclose(check_coords,straight_coords) 80 | if cs_type == 2: # Spherical 81 | check_coords = geometry.node.coordinate.copy() 82 | check_coords[:,0],check_coords[:,1],check_coords[:,2] = ( 83 | check_coords[:,0]*np.sin(check_coords[:,1]*np.pi/180)*np.cos(check_coords[:,2]*np.pi/180), 84 | check_coords[:,0]*np.sin(check_coords[:,1]*np.pi/180)*np.sin(check_coords[:,2]*np.pi/180), 85 | check_coords[:,0]*np.cos(check_coords[:,1]*np.pi/180)) 86 | assert np.allclose(check_coords,straight_coords) 87 | 88 | def test_node_indexing(cartesian_geometry): 89 | indices = np.array([[0,10], 90 | [40,20]]) 91 | scalar_index = 5 92 | ids = cartesian_geometry.node.id[indices] 93 | scalar_id = cartesian_geometry.node.id[scalar_index] 94 | # Index via id number 95 | nodes = cartesian_geometry.node(ids) 96 | scalar_node = cartesian_geometry.node(scalar_id) 97 | check_nodes = cartesian_geometry.node[indices] 98 | check_scalar_node = cartesian_geometry.node[scalar_index] 99 | nodes_by_reduction = cartesian_geometry.node.reduce(ids) 100 | scalar_node_by_reduction = cartesian_geometry.node.reduce(scalar_id) 101 | assert np.all(nodes == check_nodes) 102 | assert np.all(check_scalar_node == scalar_node) 103 | assert np.all(nodes_by_reduction == check_nodes) 104 | assert np.all(check_scalar_node == scalar_node_by_reduction) 105 | with pytest.raises(ValueError): 106 | cartesian_geometry.node(1000) 107 | -------------------------------------------------------------------------------- /tests/shape_test.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed Aug 24 12:17:18 2022 4 | 5 | @author: dprohe 6 | """ 7 | 8 | import sys 9 | sys.path.insert(0,'./src') 10 | import sdynpy as sdpy 11 | import pytest 12 | import os 13 | THIS_DIR = os.path.dirname(os.path.abspath(__file__)) 14 | 15 | import numpy as np 16 | 17 | @pytest.fixture 18 | def real_shape_information(): 19 | n_shapes = 30 20 | n_nodes = 20 21 | frequencies = np.arange(n_shapes)*0.1 22 | dampings = np.arange(n_shapes)*0.01 23 | coordinates = sdpy.coordinate.from_nodelist(np.arange(n_nodes)+1) 24 | shapes = np.arange(n_shapes*coordinates.size).reshape(n_shapes,coordinates.size)*1.0 25 | modal_masses = ((np.arange(n_shapes) % 2)+1)*0.25 26 | return {'frequency':frequencies, 27 | 'damping':dampings, 28 | 'coordinate':coordinates, 29 | 'shape_matrix':shapes, 30 | 'modal_mass':modal_masses} 31 | 32 | def test_construct_shape(real_shape_information): 33 | shape = sdpy.shape_array(**real_shape_information) 34 | assert np.all(shape.frequency == real_shape_information['frequency']) 35 | assert np.all(shape.damping == real_shape_information['damping']) 36 | assert np.all(shape.modal_mass == real_shape_information['modal_mass']) 37 | assert np.all(shape.shape_matrix == real_shape_information['shape_matrix']) 38 | assert shape.is_complex() is False 39 | assert shape.ndof == real_shape_information['coordinate'].size 40 | 41 | def test_shape_reduction(real_shape_information): 42 | shape = sdpy.shape_array(**real_shape_information) 43 | indices = [1,2,5,10] 44 | coordinates = real_shape_information['coordinate'][indices] 45 | shape_matrix_truth = real_shape_information['shape_matrix'][...,indices] 46 | reduced_shape = shape.reduce(coordinates) 47 | assert np.allclose(shape_matrix_truth, reduced_shape.shape_matrix) 48 | 49 | def test_shape_coordinate_indexing(real_shape_information): 50 | shape = sdpy.shape_array(**real_shape_information).reshape(2,3,5) 51 | node_indices = np.array([2,4,3,5]) 52 | coordinates = sdpy.coordinate.from_nodelist(node_indices+1,flatten=False) 53 | shape_matrix = shape[coordinates] 54 | negative_shape_matrix = shape[-coordinates] 55 | truth_matrix = real_shape_information['shape_matrix'].reshape(2,3,5,-1,3) 56 | truth_matrix = truth_matrix[...,node_indices,:] 57 | assert shape_matrix.shape == shape.shape+coordinates.shape 58 | assert np.allclose(shape_matrix, truth_matrix) 59 | assert np.allclose(negative_shape_matrix,-truth_matrix) -------------------------------------------------------------------------------- /tests/test_data/cellstr_test.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sandialabs/sdynpy/92b11b3beec687329aac3d4c4862e04dbecdbf85/tests/test_data/cellstr_test.mat --------------------------------------------------------------------------------