├── .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 |
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 |
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 |
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
--------------------------------------------------------------------------------