kib-lap 0.5__cp313-cp313-win_amd64.whl → 0.7.7__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- KIB_LAP/Betonbau/TEST_Rectangular.py +21 -0
- KIB_LAP/Betonbau/beam_rectangular.py +4 -0
- KIB_LAP/FACHWERKEBEN/Elements.py +209 -0
- KIB_LAP/FACHWERKEBEN/InputData.py +118 -0
- KIB_LAP/FACHWERKEBEN/Iteration.py +967 -0
- KIB_LAP/FACHWERKEBEN/Materials.py +30 -0
- KIB_LAP/FACHWERKEBEN/Plotting.py +681 -0
- KIB_LAP/FACHWERKEBEN/__init__.py +4 -0
- KIB_LAP/FACHWERKEBEN/main.py +27 -0
- KIB_LAP/Plattentragwerke/PlateBendingKirchhoff.py +36 -29
- KIB_LAP/STABRAUM/InputData.py +13 -2
- KIB_LAP/STABRAUM/Output_Data.py +61 -0
- KIB_LAP/STABRAUM/Plotting.py +1453 -0
- KIB_LAP/STABRAUM/Programm.py +518 -1026
- KIB_LAP/STABRAUM/Steifigkeitsmatrix.py +338 -117
- KIB_LAP/STABRAUM/main.py +58 -0
- KIB_LAP/STABRAUM/results.py +37 -0
- KIB_LAP/Scheibe/Assemble_Stiffness.py +246 -0
- KIB_LAP/Scheibe/Element_Stiffness.py +362 -0
- KIB_LAP/Scheibe/Meshing.py +365 -0
- KIB_LAP/Scheibe/Output.py +34 -0
- KIB_LAP/Scheibe/Plotting.py +722 -0
- KIB_LAP/Scheibe/Shell_Calculation.py +523 -0
- KIB_LAP/Scheibe/Testing_Mesh.py +25 -0
- KIB_LAP/Scheibe/__init__.py +14 -0
- KIB_LAP/Scheibe/main.py +33 -0
- KIB_LAP/StabEbenRitz/Biegedrillknicken.py +757 -0
- KIB_LAP/StabEbenRitz/Biegedrillknicken_Trigeometry.py +328 -0
- KIB_LAP/StabEbenRitz/Querschnittswerte.py +527 -0
- KIB_LAP/StabEbenRitz/Stabberechnung_Klasse.py +868 -0
- KIB_LAP/plate_bending_cpp.cp313-win_amd64.pyd +0 -0
- KIB_LAP/plate_buckling_cpp.cp313-win_amd64.pyd +0 -0
- {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/METADATA +1 -1
- {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/RECORD +37 -19
- Examples/Cross_Section_Thin.py +0 -61
- KIB_LAP/Betonbau/Bemessung_Zust_II.py +0 -648
- KIB_LAP/Betonbau/Iterative_Design.py +0 -723
- KIB_LAP/Plattentragwerke/NumInte.cpp +0 -23
- KIB_LAP/Plattentragwerke/NumericalIntegration.cpp +0 -23
- KIB_LAP/Plattentragwerke/plate_bending_cpp.cp313-win_amd64.pyd +0 -0
- KIB_LAP/main.py +0 -2
- {Examples → KIB_LAP/StabEbenRitz}/__init__.py +0 -0
- {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/WHEEL +0 -0
- {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/top_level.txt +0 -0
|
@@ -2,6 +2,7 @@ import sympy as sp
|
|
|
2
2
|
import numpy as np
|
|
3
3
|
import math
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
class ElemStema:
|
|
6
7
|
def __init__(self):
|
|
7
8
|
|
|
@@ -9,113 +10,86 @@ class ElemStema:
|
|
|
9
10
|
self.Ke = np.zeros((14, 14))
|
|
10
11
|
|
|
11
12
|
def TransformationMatrix(self, posI, posJ):
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
Pi = np.asarray(posI, dtype=float).reshape(
|
|
14
|
+
3,
|
|
15
|
+
)
|
|
16
|
+
Pj = np.asarray(posJ, dtype=float).reshape(
|
|
17
|
+
3,
|
|
18
|
+
)
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
dz = jz - iz
|
|
18
|
-
length = math.sqrt(dx**2 + dy**2 + dz**2)
|
|
20
|
+
v = Pj - Pi
|
|
21
|
+
L = np.linalg.norm(v)
|
|
19
22
|
|
|
20
|
-
T = np.zeros((14, 14))
|
|
21
|
-
T_i = np.zeros((6, 6))
|
|
23
|
+
T = np.zeros((14, 14), dtype=float)
|
|
22
24
|
|
|
23
|
-
#
|
|
24
|
-
if
|
|
25
|
+
# identische Knoten
|
|
26
|
+
if L < 1e-12:
|
|
25
27
|
np.fill_diagonal(T, 1.0)
|
|
26
28
|
return T
|
|
27
29
|
|
|
28
|
-
#
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
#
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
cos_zX = R[2][0]
|
|
77
|
-
cos_zY = R[2][1]
|
|
78
|
-
cos_zZ = R[2][2]
|
|
79
|
-
|
|
80
|
-
# T_i: 6x6-Block
|
|
81
|
-
|
|
82
|
-
T_i[0,0] = cos_xX
|
|
83
|
-
T_i[0,1] = cos_xY
|
|
84
|
-
T_i[0,3] = cos_xZ
|
|
85
|
-
|
|
86
|
-
T_i[1,0] = cos_yX
|
|
87
|
-
T_i[1,1] = cos_yY
|
|
88
|
-
T_i[1,3] = cos_yZ
|
|
89
|
-
|
|
90
|
-
T_i[2,2] = cos_zZ
|
|
91
|
-
T_i[2,4] = cos_zY
|
|
92
|
-
T_i[2,5] = cos_zX
|
|
93
|
-
|
|
94
|
-
T_i[3,0] = cos_zX
|
|
95
|
-
T_i[3,1] = cos_zY
|
|
96
|
-
T_i[3,3] = cos_zZ
|
|
97
|
-
|
|
98
|
-
T_i[4,2] = cos_yZ
|
|
99
|
-
T_i[4,4] = cos_yY
|
|
100
|
-
T_i[4,5] = cos_yX
|
|
101
|
-
|
|
102
|
-
T_i[5,2] = cos_xZ
|
|
103
|
-
T_i[5,4] = cos_xY
|
|
104
|
-
T_i[5,5] = cos_xX
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
T[0:6,0:6] = T_i
|
|
109
|
-
T[7:13,7:13] = T_i
|
|
30
|
+
# lokale x-Achse
|
|
31
|
+
ex = v / L
|
|
32
|
+
|
|
33
|
+
# robuste Referenzachse wählen (nicht parallel zu ex)
|
|
34
|
+
g = np.array([0.0, 1.0, 0.0], dtype=float) # bevorzugt global y
|
|
35
|
+
if abs(np.dot(ex, g)) > 0.95:
|
|
36
|
+
g = np.array([0.0, 0.0, 1.0], dtype=float) # sonst global z
|
|
37
|
+
if abs(np.dot(ex, g)) > 0.95:
|
|
38
|
+
g = np.array([1.0, 0.0, 0.0], dtype=float) # zur Not global x
|
|
39
|
+
|
|
40
|
+
# --- Stabiler Aufbau: erst ey als Projektion von g orthogonal zu ex ---
|
|
41
|
+
ey = g - np.dot(g, ex) * ex
|
|
42
|
+
ney = np.linalg.norm(ey)
|
|
43
|
+
if ney < 1e-12:
|
|
44
|
+
raise ValueError("Degeneriertes lokales Achsensystem (ey ~ 0).")
|
|
45
|
+
ey = ey / ney
|
|
46
|
+
|
|
47
|
+
# --- Rechtshändiges System erzwingen ---
|
|
48
|
+
ez = np.cross(ex, ey)
|
|
49
|
+
nez = np.linalg.norm(ez)
|
|
50
|
+
if nez < 1e-12:
|
|
51
|
+
raise ValueError("Degeneriertes lokales Achsensystem (ez ~ 0).")
|
|
52
|
+
ez = ez / nez
|
|
53
|
+
|
|
54
|
+
# Optional: Flip-Schutz (ey soll möglichst in Richtung g zeigen)
|
|
55
|
+
# verhindert, dass bei ähnlichen Elementen ey/ez um 180° springen
|
|
56
|
+
if np.dot(ey, g) < 0.0:
|
|
57
|
+
ey *= -1.0
|
|
58
|
+
ez *= -1.0
|
|
59
|
+
|
|
60
|
+
# R: local -> global (Spalten sind ex, ey, ez)
|
|
61
|
+
R = np.column_stack((ex, ey, ez))
|
|
62
|
+
|
|
63
|
+
# ---- 6x6 Transformationsblock passend zu deiner DOF-Reihenfolge ----
|
|
64
|
+
Ti = np.zeros((6, 6), dtype=float)
|
|
65
|
+
|
|
66
|
+
# translations: [ux, uy, uz] sitzen auf [0,1,3]
|
|
67
|
+
trans = [0, 1, 3]
|
|
68
|
+
# rotations: [rx, ry, rz] sitzen auf [5,4,2]
|
|
69
|
+
rot = [5, 4, 2]
|
|
70
|
+
|
|
71
|
+
Ti[np.ix_(trans, trans)] = R
|
|
72
|
+
Ti[np.ix_(rot, rot)] = R
|
|
73
|
+
|
|
74
|
+
# In 14x14 einbauen (Knoten a: 0..6, Knoten b: 7..13)
|
|
75
|
+
T[0:6, 0:6] = Ti
|
|
76
|
+
T[7:13, 7:13] = Ti
|
|
110
77
|
|
|
111
78
|
# Warping
|
|
112
|
-
|
|
113
79
|
T[6, 6] = 1.0
|
|
114
80
|
T[13, 13] = 1.0
|
|
115
81
|
|
|
82
|
+
# Debug-Sanity
|
|
83
|
+
if not np.isfinite(T).all():
|
|
84
|
+
print("TM NaN/Inf:", posI, posJ)
|
|
85
|
+
print(T)
|
|
86
|
+
raise ValueError("TM enthält NaN/Inf")
|
|
87
|
+
|
|
116
88
|
return T
|
|
117
89
|
|
|
118
|
-
def insert_elements(
|
|
90
|
+
def insert_elements(
|
|
91
|
+
self, S, E, G, A, I_y, I_z, I_omega, I_T, cv, z1, cw, z2, c_thet, l
|
|
92
|
+
):
|
|
119
93
|
"""
|
|
120
94
|
Element-Stiffness-Matrix:
|
|
121
95
|
Na
|
|
@@ -133,6 +107,7 @@ class ElemStema:
|
|
|
133
107
|
Mxb
|
|
134
108
|
Mwb
|
|
135
109
|
"""
|
|
110
|
+
self.Ke[:, :] = 0.0
|
|
136
111
|
self.S = S # Stiffness of shear field
|
|
137
112
|
|
|
138
113
|
self.E = E # Material stiffness of the beam
|
|
@@ -158,41 +133,86 @@ class ElemStema:
|
|
|
158
133
|
self.Ke[0, 7] = self.Ke[7, 0] = -self.E * self.A / self.l
|
|
159
134
|
|
|
160
135
|
self.Ke[1, 1] = self.Ke[8, 8] = (
|
|
161
|
-
12 * self.E * self.I_z / self.l**3
|
|
136
|
+
12 * self.E * self.I_z / self.l**3
|
|
137
|
+
+ 13 / 35 * self.cv * self.l
|
|
138
|
+
+ 1.2 * self.S / self.l
|
|
139
|
+
)
|
|
140
|
+
self.Ke[1, 2] = (
|
|
141
|
+
6 * self.E * self.I_z / self.l**2
|
|
142
|
+
+ 11 / 210 * self.cv * self.l**2
|
|
143
|
+
+ 0.1 * self.S
|
|
162
144
|
)
|
|
163
|
-
self.Ke[1, 2] = 6 * self.E * self.I_z / self.l**2 + 11 / 210 * self.cv * self.l**2 + 0.1 * self.S
|
|
164
145
|
|
|
165
|
-
self.Ke[1, 5] =
|
|
166
|
-
|
|
146
|
+
self.Ke[1, 5] = (
|
|
147
|
+
13 / 35 * self.cv * self.l * self.z1 - 1.2 * self.S / self.l * self.z2
|
|
148
|
+
)
|
|
149
|
+
self.Ke[1, 6] = (
|
|
150
|
+
-11 / 210 * self.cv * self.l**2 * self.z1 + 0.1 * self.S * self.z2
|
|
151
|
+
)
|
|
167
152
|
|
|
168
|
-
self.Ke[1, 8] =
|
|
169
|
-
|
|
153
|
+
self.Ke[1, 8] = (
|
|
154
|
+
-12 * self.E * self.I_z / self.l**3
|
|
155
|
+
+ 9 / 70 * self.cv * self.l
|
|
156
|
+
- 1.2 * self.S / self.l
|
|
157
|
+
)
|
|
158
|
+
self.Ke[1, 9] = (
|
|
159
|
+
6 * self.E * self.I_z / self.l**2
|
|
160
|
+
- 13 / 420 * self.cv * self.l**2
|
|
161
|
+
+ 0.1 * self.S
|
|
162
|
+
)
|
|
170
163
|
|
|
171
|
-
self.Ke[1, 12] =
|
|
164
|
+
self.Ke[1, 12] = (
|
|
165
|
+
9 / 70 * self.cv * self.l * self.z1 + 1.2 * self.S / self.l * self.z2
|
|
166
|
+
)
|
|
172
167
|
self.Ke[1, 13] = 13 / 420 * self.cv * self.l**2 * z1 + 0.1 * self.S * self.z2
|
|
173
168
|
|
|
174
|
-
self.Ke[2, 2] =
|
|
169
|
+
self.Ke[2, 2] = (
|
|
170
|
+
4 * self.E * self.I_z / self.l
|
|
171
|
+
+ 1 / 105 * self.cv * self.l**3
|
|
172
|
+
+ 2 / 15 * self.S * self.l
|
|
173
|
+
)
|
|
175
174
|
self.Ke[9, 9] = self.Ke[2, 2]
|
|
176
175
|
|
|
177
176
|
self.Ke[2, 5] = 11 / 210 * self.cv * l**2 * self.z1 - 0.1 * self.S * self.z2
|
|
178
|
-
self.Ke[2, 6] =
|
|
179
|
-
|
|
177
|
+
self.Ke[2, 6] = (
|
|
178
|
+
-1 / 105 * self.cv * self.l**3 * self.z1
|
|
179
|
+
+ 2 / 15 * self.S * self.l * self.z2
|
|
180
|
+
)
|
|
181
|
+
self.Ke[2, 8] = (
|
|
182
|
+
-6 * self.E * self.I_z / self.l**2
|
|
183
|
+
+ 13 / 420 * self.cv * l**2
|
|
184
|
+
- 0.1 * self.S
|
|
185
|
+
)
|
|
180
186
|
|
|
181
|
-
self.Ke[2, 9] =
|
|
182
|
-
|
|
183
|
-
|
|
187
|
+
self.Ke[2, 9] = (
|
|
188
|
+
2 * self.E * self.I_z / self.l
|
|
189
|
+
- 1 / 140 * self.cv * self.l**3
|
|
190
|
+
- 1 / 30 * self.S * self.l
|
|
191
|
+
)
|
|
192
|
+
self.Ke[2, 12] = (
|
|
193
|
+
13 / 420 * self.cv * self.l**2 * self.z1 + 0.1 * self.S * self.z2
|
|
194
|
+
)
|
|
195
|
+
self.Ke[2, 13] = (
|
|
196
|
+
1 / 140 * self.cv * self.l**3 * self.z1 - 1 / 30 * self.S * self.l * self.z2
|
|
197
|
+
)
|
|
184
198
|
|
|
185
199
|
self.Ke[3, 3] = 12 * self.E * self.I_y / self.l**3 + 13 / 35 * self.cw * self.l
|
|
186
200
|
self.Ke[10, 10] = self.Ke[3, 3]
|
|
187
201
|
|
|
188
|
-
self.Ke[3, 4] =
|
|
202
|
+
self.Ke[3, 4] = (
|
|
203
|
+
-6 * self.E * self.I_y / self.l**2 - 11 / 210 * self.cw * self.l**2
|
|
204
|
+
)
|
|
189
205
|
self.Ke[3, 10] = -12 * self.E * self.I_y / self.l**3 + 9 / 70 * self.cw * self.l
|
|
190
|
-
self.Ke[3, 11] =
|
|
206
|
+
self.Ke[3, 11] = (
|
|
207
|
+
-6 * self.E * self.I_y / self.l**2 + 13 / 420 * self.cw * self.l**2
|
|
208
|
+
)
|
|
191
209
|
|
|
192
210
|
self.Ke[4, 4] = 4 * self.E * self.I_y / self.l + 1 / 105 * self.cw * self.l**3
|
|
193
211
|
self.Ke[11, 11] = self.Ke[4, 4]
|
|
194
212
|
|
|
195
|
-
self.Ke[4, 10] =
|
|
213
|
+
self.Ke[4, 10] = (
|
|
214
|
+
6 * self.E * self.I_y / self.l**2 - 13 / 420 * self.cw * self.l**2
|
|
215
|
+
)
|
|
196
216
|
self.Ke[4, 11] = 2 * self.E * self.I_y / self.l - 1 / 140 * self.cw * self.l**3
|
|
197
217
|
|
|
198
218
|
self.Ke[5, 5] = self.Ke[12, 12] = (
|
|
@@ -233,8 +253,12 @@ class ElemStema:
|
|
|
233
253
|
+ 2 / 15 * self.S * self.l * self.z2**2
|
|
234
254
|
)
|
|
235
255
|
|
|
236
|
-
self.Ke[6, 8] =
|
|
237
|
-
|
|
256
|
+
self.Ke[6, 8] = (
|
|
257
|
+
-13 / 420 * self.cv * self.l**2 * self.z1 - 0.1 * self.S * self.z2
|
|
258
|
+
)
|
|
259
|
+
self.Ke[6, 9] = (
|
|
260
|
+
1 / 140 * self.cv * self.l**3 * self.z1 - 1 / 30 * self.S * self.l * self.z2
|
|
261
|
+
)
|
|
238
262
|
self.Ke[6, 12] = (
|
|
239
263
|
6 * self.E * self.I_omega / self.l**2
|
|
240
264
|
+ 0.1 * self.G * self.I_T
|
|
@@ -249,11 +273,23 @@ class ElemStema:
|
|
|
249
273
|
- 1 / 140 * self.cv * l**3 * self.z1**2
|
|
250
274
|
- 1 / 30 * self.S * self.l * self.z2**2
|
|
251
275
|
)
|
|
252
|
-
self.Ke[8, 9] =
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
276
|
+
self.Ke[8, 9] = (
|
|
277
|
+
-6 * self.E * self.I_z / self.l**2
|
|
278
|
+
- 11 / 210 * self.cv * self.l**2
|
|
279
|
+
- 0.1 * self.S
|
|
280
|
+
)
|
|
281
|
+
self.Ke[8, 12] = (
|
|
282
|
+
13 / 35 * self.cv * self.l * self.z1 - 1.2 * self.S / self.l * self.z2
|
|
283
|
+
)
|
|
284
|
+
self.Ke[8, 13] = (
|
|
285
|
+
11 / 210 * self.cv * self.l**2 * self.z1 - 0.1 * self.S * self.z2
|
|
286
|
+
)
|
|
287
|
+
self.Ke[9, 12] = (
|
|
288
|
+
-11 / 210 * self.cv * self.l**2 * self.z1 + 0.1 * self.S * self.z2
|
|
289
|
+
)
|
|
290
|
+
self.Ke[9, 13] = (
|
|
291
|
+
-1 / 105 * self.cv * self.l**3 * z1 + 2 / 15 * self.S * self.l * self.z2
|
|
292
|
+
)
|
|
257
293
|
self.Ke[10, 11] = 6 * E * I_y / l**2 + 11 / 210 * cw * l**2
|
|
258
294
|
self.Ke[12, 13] = (
|
|
259
295
|
6 * E * I_omega / l**2
|
|
@@ -273,3 +309,188 @@ class ElemStema:
|
|
|
273
309
|
|
|
274
310
|
def print_elem_matrix(self):
|
|
275
311
|
sp.pprint(self.Ke)
|
|
312
|
+
|
|
313
|
+
def Kg_theory_II_order(
|
|
314
|
+
self, L, N, My_a, My_b, Mz_a, Mz_b, Mr, qy, qz, yq, zq, yM, zM
|
|
315
|
+
):
|
|
316
|
+
"""
|
|
317
|
+
Geometrische Steifigkeitsmatrix K_g (14x14) für Theorie II. Ordnung
|
|
318
|
+
inkl. Biegedrillknicken (Vlasov-Element mit Warping), gemäß deiner Belegung.
|
|
319
|
+
|
|
320
|
+
DOF-Reihenfolge (1..14) wie in deinem Element:
|
|
321
|
+
1: Na
|
|
322
|
+
2: Vya
|
|
323
|
+
3: Mza
|
|
324
|
+
4: Vza
|
|
325
|
+
5: Mya
|
|
326
|
+
6: Mxa
|
|
327
|
+
7: Mwa
|
|
328
|
+
8: Nb
|
|
329
|
+
9: Vyb
|
|
330
|
+
10: Mzb
|
|
331
|
+
11: Vzb
|
|
332
|
+
12: Myb
|
|
333
|
+
13: Mxb
|
|
334
|
+
14: Mwb
|
|
335
|
+
"""
|
|
336
|
+
Kg = np.zeros((14, 14), dtype=float)
|
|
337
|
+
|
|
338
|
+
mq = qy * (yq - yM) + qz * (zq - zM)
|
|
339
|
+
|
|
340
|
+
def setg(i, j, val):
|
|
341
|
+
# i,j in 1-based
|
|
342
|
+
Kg[i - 1, j - 1] = val
|
|
343
|
+
Kg[j - 1, i - 1] = val # Symmetrie
|
|
344
|
+
|
|
345
|
+
# --- Einträge gemäß Screenshot ---
|
|
346
|
+
for i, j in [(2, 2), (4, 4), (9, 9), (11, 11)]:
|
|
347
|
+
setg(i, j, 1.2 * N / L)
|
|
348
|
+
|
|
349
|
+
for i, j in [(2, 3), (2, 10), (5, 11), (11, 12)]:
|
|
350
|
+
setg(i, j, 0.1 * N)
|
|
351
|
+
|
|
352
|
+
setg(
|
|
353
|
+
2,
|
|
354
|
+
6,
|
|
355
|
+
-1.1 * My_a / L - 0.1 * My_b / L - qz * L * (9 / 140) + 1.2 * (zM / L) * N,
|
|
356
|
+
)
|
|
357
|
+
setg(2, 7, 0.1 * My_a + qz * (L**2) / 140 - 0.1 * zM * N)
|
|
358
|
+
setg(2, 9, -1.2 * N / L)
|
|
359
|
+
setg(4, 11, -1.2 * N / L)
|
|
360
|
+
setg(
|
|
361
|
+
2,
|
|
362
|
+
13,
|
|
363
|
+
0.1 * My_a / L + 1.1 * My_b / L + qz * L * (9 / 140) - 1.2 * (zM / L) * N,
|
|
364
|
+
)
|
|
365
|
+
setg(2, 14, 0.1 * My_b + qz * (L**2) / 140 + 0.1 * zM * N)
|
|
366
|
+
|
|
367
|
+
for i, j in [(3, 3), (5, 5), (10, 10), (12, 12)]:
|
|
368
|
+
setg(i, j, (2 / 15) * N * L)
|
|
369
|
+
|
|
370
|
+
setg(3, 6, -0.9 * My_a - 0.2 * My_b - qz * (L**2) * (31 / 420) + 0.1 * zM * N)
|
|
371
|
+
setg(3, 7, 0.1 * My_a + (1 / 30) * My_b + qz * (L**2) / 84 - (2 / 15) * zM * N)
|
|
372
|
+
|
|
373
|
+
for i, j in [(3, 9), (4, 5), (4, 12), (9, 10)]:
|
|
374
|
+
setg(i, j, -0.1 * N)
|
|
375
|
+
|
|
376
|
+
for i, j in [(3, 10), (5, 12)]:
|
|
377
|
+
setg(i, j, -(1 / 30) * N * L)
|
|
378
|
+
|
|
379
|
+
setg(3, 13, -0.1 * My_a + 0.2 * My_b - qz * (L**2) / 105 + 0.1 * zM * N)
|
|
380
|
+
setg(3, 14, -(1 / 30) * My_a * L - qz * (L**2) / 210 + (1 / 30) * L * zM * N)
|
|
381
|
+
|
|
382
|
+
setg(4, 6, -1.1 * Mz_a / L - 0.1 * Mz_b / L - 1.2 * (yM / L) * N)
|
|
383
|
+
setg(4, 7, 0.1 * Mz_a + 0.1 * yM * N)
|
|
384
|
+
setg(4, 13, 0.1 * Mz_a / L + 1.1 * Mz_b / L + 1.2 * (yM / L) * N)
|
|
385
|
+
setg(4, 14, 0.1 * Mz_b + 0.1 * yM * N)
|
|
386
|
+
|
|
387
|
+
setg(5, 6, 0.9 * Mz_a + 0.2 * Mz_b + 0.1 * yM * N)
|
|
388
|
+
setg(5, 7, -0.1 * Mz_a * L - (1 / 30) * Mz_b * L - (2 / 15) * L * yM * N)
|
|
389
|
+
setg(5, 13, 0.1 * Mz_a - 0.2 * Mz_b - 0.1 * yM * N)
|
|
390
|
+
setg(5, 14, (1 / 30) * Mz_a * L + (1 / 30) * L * yM * N)
|
|
391
|
+
|
|
392
|
+
setg(6, 6, 1.2 * Mr / L + mq * (13 / 35) * L)
|
|
393
|
+
setg(13, 13, 1.2 * Mr / L + mq * (13 / 35) * L)
|
|
394
|
+
|
|
395
|
+
setg(6, 7, -0.1 * Mr - mq * (11 / 210) * (L**2))
|
|
396
|
+
setg(
|
|
397
|
+
6,
|
|
398
|
+
9,
|
|
399
|
+
1.1 * My_a / L + 0.1 * My_b / L + qz * L * (9 / 140) - 1.2 * (zM / L) * N,
|
|
400
|
+
)
|
|
401
|
+
setg(6, 10, -0.2 * My_a + 0.1 * My_b + qz * (L**2) / 105 + 0.1 * zM * N)
|
|
402
|
+
setg(6, 11, 1.1 * Mz_a / L + 0.1 * Mz_b / L + 1.2 * (yM / L) * N)
|
|
403
|
+
setg(6, 12, 0.2 * Mz_a - 0.1 * Mz_b + 0.1 * yM * N)
|
|
404
|
+
setg(6, 13, -1.2 * Mr / L - mq * L * (9 / 70))
|
|
405
|
+
setg(6, 14, -0.1 * Mr + mq * (13 / 420) * (L**2))
|
|
406
|
+
|
|
407
|
+
setg(7, 7, (L / 7.5) * Mr + mq * (L**3) / 105)
|
|
408
|
+
setg(14, 14, (L / 7.5) * Mr + mq * (L**3) / 105)
|
|
409
|
+
|
|
410
|
+
setg(7, 9, -0.1 * My_a - qz * (L**2) / 140 + 0.1 * zM * N)
|
|
411
|
+
setg(7, 10, -(1 / 30) * My_a * L - qz * (L**2) / 210 + (1 / 30) * L * zM * N)
|
|
412
|
+
setg(7, 11, -0.1 * Mz_a - 0.1 * yM * N)
|
|
413
|
+
setg(7, 12, (1 / 30) * Mz_b * L + (1 / 30) * L * yM * N)
|
|
414
|
+
setg(7, 13, 0.1 * Mr - mq * (13 / 420) * (L**2))
|
|
415
|
+
setg(7, 14, -(1 / 30) * Mr * L - mq * (L**3) / 140)
|
|
416
|
+
|
|
417
|
+
setg(
|
|
418
|
+
9,
|
|
419
|
+
13,
|
|
420
|
+
-0.1 * My_a / L - 1.1 * My_b / L - qz * L * (9 / 140) + 1.2 * (zM / L) * N,
|
|
421
|
+
)
|
|
422
|
+
setg(9, 14, -0.1 * My_b - qz * (L**2) / 140 + 0.1 * zM * N)
|
|
423
|
+
|
|
424
|
+
setg(10, 13, 0.2 * My_a - 0.9 * My_b + qz * (L**2) * (31 / 420) - 0.1 * zM * N)
|
|
425
|
+
setg(
|
|
426
|
+
10,
|
|
427
|
+
14,
|
|
428
|
+
(1 / 30) * My_a * L
|
|
429
|
+
+ 0.1 * My_b * L
|
|
430
|
+
+ qz * (L**2) / 84
|
|
431
|
+
- (2 / 15) * L * zM * N,
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
setg(11, 13, -0.1 * Mz_a / L - 1.1 * Mz_b / L - 1.2 * (yM / L) * N)
|
|
435
|
+
setg(11, 14, -0.1 * Mz_b - 0.1 * yM * N)
|
|
436
|
+
|
|
437
|
+
setg(12, 13, -0.2 * Mz_a - 0.9 * Mz_b - 0.1 * yM * N)
|
|
438
|
+
setg(12, 14, -(1 / 30) * Mz_a * L - 0.1 * Mz_b * L - (2 / 15) * L * yM * N)
|
|
439
|
+
|
|
440
|
+
setg(13, 14, 0.1 * Mr + mq * (11 / 210) * (L**2))
|
|
441
|
+
|
|
442
|
+
return Kg
|
|
443
|
+
|
|
444
|
+
def element_stiffness_theory_II(
|
|
445
|
+
self,
|
|
446
|
+
# Material-/Elementparameter für Ke:
|
|
447
|
+
S,
|
|
448
|
+
E,
|
|
449
|
+
G,
|
|
450
|
+
A,
|
|
451
|
+
I_y,
|
|
452
|
+
I_z,
|
|
453
|
+
I_omega,
|
|
454
|
+
I_T,
|
|
455
|
+
cv,
|
|
456
|
+
z1,
|
|
457
|
+
cw,
|
|
458
|
+
z2,
|
|
459
|
+
c_thet,
|
|
460
|
+
l,
|
|
461
|
+
# Schnittgrößen/Lasten für Kg:
|
|
462
|
+
N,
|
|
463
|
+
My_a,
|
|
464
|
+
My_b,
|
|
465
|
+
Mz_a,
|
|
466
|
+
Mz_b,
|
|
467
|
+
Mr,
|
|
468
|
+
qy,
|
|
469
|
+
qz,
|
|
470
|
+
yq,
|
|
471
|
+
zq,
|
|
472
|
+
yM,
|
|
473
|
+
zM,
|
|
474
|
+
):
|
|
475
|
+
"""
|
|
476
|
+
Liefert K_total = Ke + Kg (lokal).
|
|
477
|
+
"""
|
|
478
|
+
Ke = self.insert_elements(
|
|
479
|
+
S, E, G, A, I_y, I_z, I_omega, I_T, cv, z1, cw, z2, c_thet, l
|
|
480
|
+
)
|
|
481
|
+
Kg = self.Kg_theory_II_order(
|
|
482
|
+
L=l,
|
|
483
|
+
N=N,
|
|
484
|
+
My_a=My_a,
|
|
485
|
+
My_b=My_b,
|
|
486
|
+
Mz_a=Mz_a,
|
|
487
|
+
Mz_b=Mz_b,
|
|
488
|
+
Mr=Mr,
|
|
489
|
+
qy=qy,
|
|
490
|
+
qz=qz,
|
|
491
|
+
yq=yq,
|
|
492
|
+
zq=zq,
|
|
493
|
+
yM=yM,
|
|
494
|
+
zM=zM,
|
|
495
|
+
)
|
|
496
|
+
return Ke + Kg, Ke, Kg
|
KIB_LAP/STABRAUM/main.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from Programm import mainloop
|
|
2
|
+
from Plotting import StructurePlotter
|
|
3
|
+
from Output_Data import OutputData
|
|
4
|
+
import matplotlib
|
|
5
|
+
|
|
6
|
+
matplotlib.use("TkAgg")
|
|
7
|
+
import matplotlib.pyplot as plt
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if __name__ == "__main__":
|
|
11
|
+
calc = mainloop()
|
|
12
|
+
res = calc.run()
|
|
13
|
+
|
|
14
|
+
plotter = StructurePlotter(res)
|
|
15
|
+
Output = OutputData()
|
|
16
|
+
|
|
17
|
+
calc.check_global_equilibrium()
|
|
18
|
+
|
|
19
|
+
# print(type(res), hasattr(res, "Inp"), hasattr(res, "GesMat"), hasattr(res, "u_ges"), hasattr(res, "FGes"))
|
|
20
|
+
|
|
21
|
+
# res = calc.run()
|
|
22
|
+
|
|
23
|
+
out = OutputData()
|
|
24
|
+
df = out.support_reactions_from_springs_table(res)
|
|
25
|
+
print(df)
|
|
26
|
+
|
|
27
|
+
calc.sum_reactions_fx()
|
|
28
|
+
calc.sum_spring_reactions_fx()
|
|
29
|
+
|
|
30
|
+
# plotter.plot_support_reactions_2d_interactive()
|
|
31
|
+
# plt.show()
|
|
32
|
+
|
|
33
|
+
# plotter.plot_nodal_loads_2d_interactive()
|
|
34
|
+
|
|
35
|
+
# plt.show()
|
|
36
|
+
|
|
37
|
+
fig, ax, s = plotter.plot_endforces_2d_interactive(
|
|
38
|
+
kind="MY", scale_init=0.2, node_labels=True, elem_labels=True
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
plt.show()
|
|
42
|
+
|
|
43
|
+
# fig, ax, s = plotter.plot_endforces_2d_interactive(kind="N", scale_init=0.2, node_labels=True, elem_labels=True)
|
|
44
|
+
|
|
45
|
+
# plt.show()
|
|
46
|
+
|
|
47
|
+
# fig, ax, s = plotter.plot_endforces_2d_interactive(kind="VZ", scale_init=0.2, node_labels=True, elem_labels=True)
|
|
48
|
+
|
|
49
|
+
# plt.show()
|
|
50
|
+
|
|
51
|
+
plotter.plot_diagram_3d_interactive(kind="MY", scale_init=0.2,springs_size_frac=0.01,springs_rot_radius_frac=0.01)
|
|
52
|
+
plt.show()
|
|
53
|
+
|
|
54
|
+
plotter.plot_diagram_3d_interactive(kind="N", scale_init=0.2,springs_size_frac=0.01,springs_rot_radius_frac=0.01)
|
|
55
|
+
plt.show()
|
|
56
|
+
|
|
57
|
+
plotter.plot_diagram_3d_interactive(kind="VZ", scale_init=0.2,springs_size_frac=0.01,springs_rot_radius_frac=0.01)
|
|
58
|
+
plt.show()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# results.py
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
import numpy as np
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class AnalysisResults:
|
|
9
|
+
"""
|
|
10
|
+
Reiner Datencontainer für Analyse-Ergebnisse.
|
|
11
|
+
KEINE Berechnungen, KEIN Plotting.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# Input (Geometrie, Materialien, Knoten, Stäbe)
|
|
15
|
+
Inp: Any
|
|
16
|
+
|
|
17
|
+
# Globale Ergebnisse
|
|
18
|
+
u_ges: np.ndarray
|
|
19
|
+
GesMat: np.ndarray
|
|
20
|
+
FGes: np.ndarray
|
|
21
|
+
|
|
22
|
+
# Elementweise Matrizen
|
|
23
|
+
TransMats: np.ndarray
|
|
24
|
+
K_el_i_store: np.ndarray
|
|
25
|
+
u_el: np.ndarray
|
|
26
|
+
s_el: np.ndarray
|
|
27
|
+
|
|
28
|
+
# Schnittgrößen an den Elementenden
|
|
29
|
+
N_el_i_store: np.ndarray
|
|
30
|
+
VY_el_i_store: np.ndarray
|
|
31
|
+
VZ_el_i_store: np.ndarray
|
|
32
|
+
MX_el_i_store: np.ndarray
|
|
33
|
+
MY_el_i_store: np.ndarray
|
|
34
|
+
MZ_el_i_store: np.ndarray
|
|
35
|
+
|
|
36
|
+
# Zusatzinfos
|
|
37
|
+
member_length: np.ndarray
|