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.
Files changed (44) hide show
  1. KIB_LAP/Betonbau/TEST_Rectangular.py +21 -0
  2. KIB_LAP/Betonbau/beam_rectangular.py +4 -0
  3. KIB_LAP/FACHWERKEBEN/Elements.py +209 -0
  4. KIB_LAP/FACHWERKEBEN/InputData.py +118 -0
  5. KIB_LAP/FACHWERKEBEN/Iteration.py +967 -0
  6. KIB_LAP/FACHWERKEBEN/Materials.py +30 -0
  7. KIB_LAP/FACHWERKEBEN/Plotting.py +681 -0
  8. KIB_LAP/FACHWERKEBEN/__init__.py +4 -0
  9. KIB_LAP/FACHWERKEBEN/main.py +27 -0
  10. KIB_LAP/Plattentragwerke/PlateBendingKirchhoff.py +36 -29
  11. KIB_LAP/STABRAUM/InputData.py +13 -2
  12. KIB_LAP/STABRAUM/Output_Data.py +61 -0
  13. KIB_LAP/STABRAUM/Plotting.py +1453 -0
  14. KIB_LAP/STABRAUM/Programm.py +518 -1026
  15. KIB_LAP/STABRAUM/Steifigkeitsmatrix.py +338 -117
  16. KIB_LAP/STABRAUM/main.py +58 -0
  17. KIB_LAP/STABRAUM/results.py +37 -0
  18. KIB_LAP/Scheibe/Assemble_Stiffness.py +246 -0
  19. KIB_LAP/Scheibe/Element_Stiffness.py +362 -0
  20. KIB_LAP/Scheibe/Meshing.py +365 -0
  21. KIB_LAP/Scheibe/Output.py +34 -0
  22. KIB_LAP/Scheibe/Plotting.py +722 -0
  23. KIB_LAP/Scheibe/Shell_Calculation.py +523 -0
  24. KIB_LAP/Scheibe/Testing_Mesh.py +25 -0
  25. KIB_LAP/Scheibe/__init__.py +14 -0
  26. KIB_LAP/Scheibe/main.py +33 -0
  27. KIB_LAP/StabEbenRitz/Biegedrillknicken.py +757 -0
  28. KIB_LAP/StabEbenRitz/Biegedrillknicken_Trigeometry.py +328 -0
  29. KIB_LAP/StabEbenRitz/Querschnittswerte.py +527 -0
  30. KIB_LAP/StabEbenRitz/Stabberechnung_Klasse.py +868 -0
  31. KIB_LAP/plate_bending_cpp.cp313-win_amd64.pyd +0 -0
  32. KIB_LAP/plate_buckling_cpp.cp313-win_amd64.pyd +0 -0
  33. {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/METADATA +1 -1
  34. {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/RECORD +37 -19
  35. Examples/Cross_Section_Thin.py +0 -61
  36. KIB_LAP/Betonbau/Bemessung_Zust_II.py +0 -648
  37. KIB_LAP/Betonbau/Iterative_Design.py +0 -723
  38. KIB_LAP/Plattentragwerke/NumInte.cpp +0 -23
  39. KIB_LAP/Plattentragwerke/NumericalIntegration.cpp +0 -23
  40. KIB_LAP/Plattentragwerke/plate_bending_cpp.cp313-win_amd64.pyd +0 -0
  41. KIB_LAP/main.py +0 -2
  42. {Examples → KIB_LAP/StabEbenRitz}/__init__.py +0 -0
  43. {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/WHEEL +0 -0
  44. {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
- ix, iy, iz = posI
13
- jx, jy, jz = posJ
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
- dx = jx - ix
16
- dy = jy - iy
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
- # Falls die Knoten identisch sind
24
- if length < 1e-12:
25
+ # identische Knoten
26
+ if L < 1e-12:
25
27
  np.fill_diagonal(T, 1.0)
26
28
  return T
27
29
 
28
- # 1. Spezialfall: Balken nur in z-Richtung
29
- # (dx, dy ~ 0, dz != 0)
30
- tol = 1e-12
31
- if abs(dx) < tol and abs(dy) < tol:
32
- # -> lokales x' = globales z
33
- # Rotationsmatrix R:
34
- # x' -> z
35
- # y' -> y
36
- # z' -> -x (z.B. so gewählt,
37
- # aber man kann auch x'->z, y'->x etc. nehmen)
38
- if dz > 0:
39
- # x' -> +z
40
- R = np.array([
41
- [0, 0, 1], # x'
42
- [0, 1, 0], # y'
43
- [-1, 0, 0], # z'
44
- ], dtype=float)
45
- else:
46
- # x' -> -z
47
- R = np.array([
48
- [0, 0, -1], # x'
49
- [0, 1, 0], # y'
50
- [1, 0, 0], # z'
51
- ], dtype=float)
52
-
53
- else:
54
- # 2. Allgemeiner Fall: Kreuzprodukt-Logik
55
- ex_approx = np.array([dx, dy, dz]) / length
56
-
57
- # Hilfsvektor für y'-Achse (wenn ex_approx zu parallel zu e_z, dann e_y)
58
- ez_approx = np.array([0, 0, 1], dtype=float)
59
- if abs(np.dot(ex_approx, ez_approx)) > 0.9999:
60
- ez_approx = np.array([0, 1, 0], dtype=float)
61
-
62
- ey = np.cross(ex_approx, ez_approx)
63
- ey /= np.linalg.norm(ey)
64
- ez = np.cross(ex_approx, ey)
65
-
66
- R = np.column_stack((ex_approx, ey, ez))
67
-
68
- cos_xX = R[0][0]
69
- cos_xY = R[0][1]
70
- cos_xZ = R[0][2]
71
-
72
- cos_yX = R[1][0]
73
- cos_yY = R[1][1]
74
- cos_yZ = R[1][2]
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(self, S, E, G, A, I_y, I_z, I_omega, I_T, cv, z1, cw, z2, c_thet, l):
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 + 13 / 35 * self.cv * self.l + 1.2 * self.S / self.l
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] = 13 / 35 * self.cv * self.l * self.z1 - 1.2 * self.S / self.l * self.z2
166
- self.Ke[1, 6] = -11 / 210 * self.cv * self.l**2 * self.z1 + 0.1 * self.S * self.z2
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] = -12 * self.E * self.I_z / self.l**3 + 9 / 70 * self.cv * self.l - 1.2 * self.S / self.l
169
- self.Ke[1, 9] = 6 * self.E * self.I_z / self.l**2 - 13 / 420 * self.cv * self.l**2 + 0.1 * self.S
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] = 9 / 70 * self.cv * self.l * self.z1 + 1.2 * self.S / self.l * self.z2
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] = 4 * self.E * self.I_z / self.l + 1 / 105 * self.cv * self.l**3 + 2 / 15 * self.S * self.l
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] = -1 / 105 * self.cv * self.l**3 * self.z1 + 2 / 15 * self.S * self.l * self.z2
179
- self.Ke[2, 8] = -6 * self.E * self.I_z / self.l**2 + 13 / 420 * self.cv * l**2 - 0.1 * self.S
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] = 2 * self.E * self.I_z / self.l - 1 / 140 * self.cv * self.l**3 - 1 / 30 * self.S * self.l
182
- self.Ke[2, 12] = 13 / 420 * self.cv * self.l**2 * self.z1 + 0.1 * self.S * self.z2
183
- self.Ke[2, 13] = 1 / 140 * self.cv * self.l**3 * self.z1 - 1 / 30 * self.S * self.l * self.z2
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] = -6 * self.E * self.I_y / self.l**2 - 11 / 210 * self.cw * self.l**2
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] = -6 * self.E * self.I_y / self.l**2 + 13 / 420 * self.cw * self.l**2
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] = 6 * self.E * self.I_y / self.l**2 - 13 / 420 * self.cw * self.l**2
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] = -13 / 420 * self.cv * self.l**2 * self.z1 - 0.1 * self.S * self.z2
237
- self.Ke[6, 9] = 1 / 140 * self.cv * self.l**3 * self.z1 - 1 / 30 * self.S * self.l * self.z2
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] = -6 * self.E * self.I_z / self.l**2 - 11 / 210 * self.cv * self.l**2 - 0.1 * self.S
253
- self.Ke[8, 12] = 13 / 35 * self.cv * self.l * self.z1 - 1.2 * self.S / self.l * self.z2
254
- self.Ke[8, 13] = 11 / 210 * self.cv * self.l**2 * self.z1 - 0.1 * self.S * self.z2
255
- self.Ke[9, 12] = -11 / 210 * self.cv * self.l**2 * self.z1 + 0.1 * self.S * self.z2
256
- self.Ke[9, 13] = -1 / 105 * self.cv * self.l**3 * z1 + 2 / 15 * self.S * self.l * self.z2
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
@@ -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