https://github.com/harrytwigg/aero-calculators
Calculators for the SESA2025 and FEEG2005 modules at the University of Southampton. Includes cross-section, beams, and pin-jointed truss analysis
https://github.com/harrytwigg/aero-calculators
aero-calculator engineering-calculator feeg2005 sesa2025 statics structural-engineering
Last synced: 2 months ago
JSON representation
Calculators for the SESA2025 and FEEG2005 modules at the University of Southampton. Includes cross-section, beams, and pin-jointed truss analysis
- Host: GitHub
- URL: https://github.com/harrytwigg/aero-calculators
- Owner: harrytwigg
- Created: 2021-07-11T10:01:36.000Z (almost 4 years ago)
- Default Branch: master
- Last Pushed: 2021-07-11T10:10:37.000Z (almost 4 years ago)
- Last Synced: 2025-02-09T23:26:53.253Z (4 months ago)
- Topics: aero-calculator, engineering-calculator, feeg2005, sesa2025, statics, structural-engineering
- Language: Python
- Homepage:
- Size: 54.7 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Aero Calculators
Calculators for the SESA2025 and FEEG2005 modules at the University of Southampton. Includes cross-section, beams, and pin-jointed truss analysis among other things.
I coded these myself, example how to use functions based of lecture questions can be seen in the individual files.
I have tried to include docstrings wherever possible
## FEEG2005 - Materials and Structures
### section.py
Calculate properties on 2D cross-sections
#### Cross section area
```{python}
area(points)
```Area of cross-section using greens theorem
points - an array of (y, z) point pairs
#### Cross section centroid
```{python}
centroid(points)
```Location of the centroid
points - an array of (y, z) point pairs
#### Moments of inertia around the centroid
```{python}
inertia(points)
```Moments and product of inertia about centroid
points - an array of (y, z) point pairs
#### Principal moments of inertia and orientation
```{python}
principal(Iyy, Izz, Iyz)
```Principal moments of inertia and orientation
points - an arraz of (y, z) point pairs
### beam.py
Calculate various properties such as bending stress and moments of a beam
Supports custom point and distributed loads through the use of heaviside functions, bending stress and moments can then be graphed.
```{python}
def bending_shear_force_lecture_1():
"""Example shear force from lecture 1"""
beam = Beam(1, 24.2 * 10**(-6))
beam.add_distributed_load(10000, 0, 1)
beam.add_point_load(5000, 0.5)
print("R_a", beam.get_R_a())
print("M_a", beam.get_M_a())bending_stress = beam.bending_stress(0, -0.01, -0.1, 6.6 * 10 **-6, 7.2 * 10 **-6, x_value=0)
print("bending_stress", bending_stress)bending_moment = beam.bending_moment()
shear_force = beam.shear_force()
x_points = []
bending_moment_points = []
shear_force_points = []# Enables floating point increments in loops
def drange(start, stop, step):
while start < stop:
yield start
start += stepfor i in drange(0, 1, 0.01):
x_points.append(i)
bending_moment_points.append(bending_moment.subs(x, i))
shear_force_points.append(shear_force.subs(x, i))plt.plot(x_points, bending_moment_points)
plt.plot(x_points, shear_force_points)plt.legend(["Bending Moment", "Shear Force"])
plt.show()
```Example Output
```{console}
R_a 15000
M_a -7500.0
bending_stress -50514460.5116797
```
### pin_trusses.py
Can solve pin-jointed trusses using real or virtual energy methods
Force can be appleid at any of the joints
Generates equations using the method of joints and resolves them automatically
Generates truss from an input set of points data and can sketch the truss
```{python}
def virtual_forces_lecture_16():
"""Example question lecture 16, uses a virtual external force"""points = [("B", 0, 2, "W"), ("C", 2, 2), ("D", 4, 2),
("F", 0, 0, "W"), ("G", 2, 0)]
members = [("B", "C"), ("C", "D"), ("D", "G"),
("F", "G"), ("F", "C"), ("C", "G")]A = 1000 * 10**-6
E = 200 * 10**9N = CoordSys3D('N')
real_force = - 10000 * N.j
real_point = "D"virtual_force = - 1 * N.j
virtual_point = "G"print("""
=====================
Real Truss
=====================
""")# Apply analysis on real truss in same way as before
real_truss = Truss(points, members)
real_truss.add_force_at_point(real_point, real_force)
real_truss.print_all_eqns()
real_truss.solve_equation_system()
real_truss.print_resolved_forces()
real_elements, headers = real_truss.find_truss_elements(A, E)
real_truss.plot()
print("""
Real Truss Elements:
""")print(tabulate(real_elements, headers=headers, disable_numparse=True))
print("""
=====================
Virtual Truss
=====================
""")# Make new truss and apply virtual force at point G and solve
virtual_truss = Truss(points, members)
virtual_truss.add_force_at_point(virtual_point, virtual_force)
virtual_truss.print_all_eqns()
virtual_truss.solve_equation_system()
virtual_truss.print_resolved_forces()
virtual_elements = virtual_truss.find_truss_elements(A, E)[0]print("""
Virtual Truss Elements:
""")print(tabulate(virtual_elements, headers=headers, disable_numparse=True))
u = Truss.displacement_arbitrary_point(
real_elements, virtual_elements, virtual_force)
print("")
print("Displacement u at the point G is", u, "as float", u.evalf())
```
Example output
```{console}
=====================
Real Truss
=====================
Equations:
B i: 0 = F_BC + Rx_B
B j: 0 = Ry_B
C i: 0 = -F_BC + F_CD - sqrt(2)*F_CF/2
C j: 0 = -sqrt(2)*F_CF/2 - F_CG
D i: 0 = -F_CD - sqrt(2)*F_DG/2
D j: 0 = -sqrt(2)*F_DG/2 - 10000
F i: 0 = sqrt(2)*F_CF/2 + F_FG + Rx_F
F j: 0 = sqrt(2)*F_CF/2 + Ry_F
G i: 0 = sqrt(2)*F_DG/2 - F_FG
G j: 0 = F_CG + sqrt(2)*F_DG/2Resolving Forces:
B j: 0 = Ry_B | resolving Ry_B ==> 0
D j: 0 = -sqrt(2)*F_DG/2 - 10000 | resolving F_DG ==> -10000*sqrt(2)
G i: 0 = -F_FG - 10000 | resolving F_FG ==> -10000
G j: 0 = F_CG - 10000 | resolving F_CG ==> 10000
C j: 0 = -sqrt(2)*F_CF/2 - 10000 | resolving F_CF ==> -10000*sqrt(2)
D i: 0 = 10000 - F_CD | resolving F_CD ==> 10000
F i: 0 = Rx_F - 20000 | resolving Rx_F ==> 20000
F j: 0 = Ry_F - 10000 | resolving Ry_F ==> 10000
C i: 0 = 20000 - F_BC | resolving F_BC ==> 20000
B i: 0 = Rx_B + 20000 | resolving Rx_B ==> -20000Resolved Forces:
Ry_B = 0
F_DG = -10000*sqrt(2)
F_FG = -10000
F_CG = 10000
F_CF = -10000*sqrt(2)
F_CD = 10000
Rx_F = 20000
Ry_F = 10000
F_BC = 20000
Rx_B = -20000Real Truss Elements:
Member Force [N] Length [m] δ [m]
-------- -------------- ------------ -------
BC 20000 2 0.0002
CD 10000 2 0.0001
CF -10000*sqrt(2) 2*sqrt(2) -0.0002
CG 10000 2 0.0001
DG -10000*sqrt(2) 2*sqrt(2) -0.0002
FG -10000 2 -0.0001=====================
Virtual Truss
=====================
Equations:
B i: 0 = F_BC + Rx_B
B j: 0 = Ry_B
C i: 0 = -F_BC + F_CD - sqrt(2)*F_CF/2
C j: 0 = -sqrt(2)*F_CF/2 - F_CG
D i: 0 = -F_CD - sqrt(2)*F_DG/2
D j: 0 = -sqrt(2)*F_DG/2
F i: 0 = sqrt(2)*F_CF/2 + F_FG + Rx_F
F j: 0 = sqrt(2)*F_CF/2 + Ry_F
G i: 0 = sqrt(2)*F_DG/2 - F_FG
G j: 0 = F_CG + sqrt(2)*F_DG/2 - 1Resolving Forces:
B j: 0 = Ry_B | resolving Ry_B ==> 0
D j: 0 = -sqrt(2)*F_DG/2 | resolving F_DG ==> 0
G i: 0 = -F_FG | resolving F_FG ==> 0
G j: 0 = F_CG - 1 | resolving F_CG ==> 1
C j: 0 = -sqrt(2)*F_CF/2 - 1 | resolving F_CF ==> -sqrt(2)
D i: 0 = -F_CD | resolving F_CD ==> 0
F i: 0 = Rx_F - 1 | resolving Rx_F ==> 1
F j: 0 = Ry_F - 1 | resolving Ry_F ==> 1
C i: 0 = 1 - F_BC | resolving F_BC ==> 1
B i: 0 = Rx_B + 1 | resolving Rx_B ==> -1Resolved Forces:
Ry_B = 0
F_DG = 0
F_FG = 0
F_CG = 1
F_CF = -sqrt(2)
F_CD = 0
Rx_F = 1
Ry_F = 1
F_BC = 1
Rx_B = -1Virtual Truss Elements:
Member Force [N] Length [m] δ [m]
-------- ----------- ------------ -------
BC 1 2 1e-08
CD 0 2 0
CF -sqrt(2) 2*sqrt(2) -2e-08
CG 1 2 1e-08
DG 0 2*sqrt(2) 0
FG 0 2 0Merged Truss Data:
Member δ Actual[m] F* Virtual [N] F* x δ Actual
-------- ------------- ---------------- --------------------
BC 0.0002 1 0.000200000000000000
CD 0.0001 0 0
CF -0.0002 -sqrt(2) 0.0002*sqrt(2)
CG 0.0001 1 0.000100000000000000
DG -0.0002 0 0
FG -0.0001 0 0Displacement u at the point G is 0.0002*sqrt(2) + 0.0003 as float 0.000582842712474619
```### materials_eqns.py
Materials exam useful sympy equations
## SESA025 - Flight Mechanics
Formula sheet equations as auto-rearrangeable Sympy equations