Bolt pattern force distribution analysis
This project has been archived.
The maintainers of this project have marked this project as archived. No new releases are expected.
Project description
Implements the methodology from NASA RP-1228.
Given a bolt pattern (positions + areas) and applied loads at arbitrary locations, this module computes the axial and shear force on each bolt.
Outputs verified against the calulator here: https://mechanicalc.com/reference/bolt-pattern-force-distribution 3d plotting currently does not display the moments, but they are handled correctly for calculations.
Example usage:
if name == "main": import os import bolt_pattern_elastic_method
HERE = os.path.dirname(os.path.abspath(__file__))
positions_1 = [(-3.5, 15), (3.5, 15), (-3.5, -15), (3.5, -15)
, (10, -15), (18.82, -12.14), (24.27, -4.635)
, (24.27, 4.635), (18.82, 12.14), (10, 15)
, (-10, 15), (-18.82, 12.14), (-24.27, 4.635)
, (-24.27, -4.635), (-18.82, -12.14), (-10, -15)] #[x,y]
# ------------------------------------------------------------------
# Example 1: 4-bolt rectangular pattern, in-plane eccentric shear
# A 1000 N force applied in X at (y=5) – creates torsion about Z
# ------------------------------------------------------------------
print("\nEXAMPLE 1 – General 3-D loading")
save_path="bolt_pattern_ex1.png"
analysis_1 = BoltPatternAnalysis(
bolts=[Bolt(x, y) for (x, y) in positions_1],
loads=[AppliedLoad(Fx=1500.0, Fy=500.0, Fz=5000.0, z=15.0),
AppliedLoad(Mz=1000.0)],
)
results_1 = analysis_1.solve()
print_results(results_1, analysis_1)
plot_bolt_pattern_3d(
analysis_1, results_1,
title="Example 1 - General 3-D loading",
show=False,
save_path=os.path.join(HERE, "save_path"),
)
print(f" → saved {save_path}")
# ------------------------------------------------------------------
# Example 2: general 3-D loading using the convenience function
# ------------------------------------------------------------------
print("\nEXAMPLE 2 - General 3-D loading (convenience function)")
analysis_2 = BoltPatternAnalysis(
bolts=[Bolt(x, y, label=lbl) for (x, y), lbl in zip(
[(-3, -3), (3, -3), (3, 3), (-3, 3)], ["TL", "TR", "BR", "BL"]
)],
loads=[AppliedLoad(Fx=200, Fy=-150, Fz=300,
Mx=500, My=-400, Mz=1000,
x=1.0, y=2.0, z=50.0)],
)
results_2 = analysis_2.solve()
print_results(results_2, analysis_2)
plot_bolt_pattern_3d(
analysis_2, results_2,
title="Example 2 - General 3-D Loading",
show=False,
save_path=os.path.join(HERE, "bolt_pattern_ex2.png"),
)
print(" → saved bolt_pattern_ex2.png")
# ------------------------------------------------------------------
# Example 2: general 3-D loading using the convenience function
# ------------------------------------------------------------------
import os
import bolt_pattern_elastic_method as bp
HERE = os.path.dirname(os.path.abspath(__file__))
save_path="bolt_pattern_ex1.png"
r_y_c, r_x_c = (3)/2, (4)/2 # bolt cardinal spacing from centroid of bolt pattern, in, as viewed from a given axis.
Fx=F_xz_c
Fy=100
Fz=42
Mx=500
My=37
Mz=0
positions_1 = [(r_x_c, r_y_c), (r_x_c, -r_y_c), (-r_x_c, r_y_c), (-r_x_c, -r_y_c)]
analysis_1 = bp.BoltPatternAnalysis(
bolts=[bp.Bolt(x, y) for (x, y) in positions_1],
loads=[bp.AppliedLoad(Fx=Fx, Fy=Fy, Fz=Fz, Mx=Mx, My=My, Mz=Mz, x=0, y=0, z=0)],
)
results_1 = analysis_1.solve()
#bp.print_results(results_1, analysis_1)
max_tension = max(results_1, key=lambda r: r.Fz_total)
min_tension = min(results_1, key=lambda r: r.Fz_total)
max_shear = max(results_1, key=lambda r: r.F_shear)
min_shear = min(results_1, key=lambda r: r.F_shear)
print(f" Max tension (lbf): {max_tension.bolt.label:>6} Fz = {max_tension.Fz_total:+.2f}")
print(f" Min tension (lbf): {min_tension.bolt.label:>6} Fz = {min_tension.Fz_total:+.2f}")
print(f" Max shear (lbf): {max_shear.bolt.label:>6} Fs = {max_shear.F_shear:.2f}")
print(f" Min shear (lbf): {min_shear.bolt.label:>6} Fs = {min_shear.F_shear:.2f}")
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bolt_pattern_elastic_method-1.0.1.tar.gz.
File metadata
- Download URL: bolt_pattern_elastic_method-1.0.1.tar.gz
- Upload date:
- Size: 9.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba0a9c2835be43e3a3e3d2ed5b4f1d03085952f10e4b59dea391f10a343d64e7
|
|
| MD5 |
6ec7dc9ab4befd4e4ef1bf52f556fa9d
|
|
| BLAKE2b-256 |
36e3d62f95459088a4e5670706c1845afb5cf6267ec4aefd63c978ed5e7293db
|
File details
Details for the file bolt_pattern_elastic_method-1.0.1-py3-none-any.whl.
File metadata
- Download URL: bolt_pattern_elastic_method-1.0.1-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87bd4769760ab4d1b6ce83c3bc31e35f007949ac3fb00bd3ec2ce0e0e73fa3ea
|
|
| MD5 |
26333a6409d4ebfa40296e75cd3c22d8
|
|
| BLAKE2b-256 |
1f417c7e9c26c72e9ae0728053715045352b769a43352a365737aad756bf5479
|