kib-lap 0.5__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 (64) hide show
  1. Examples/Cross_Section_Thin.py +61 -0
  2. Examples/__init__.py +0 -0
  3. KIB_LAP/Betonbau/Bemessung_Polygon.py +667 -0
  4. KIB_LAP/Betonbau/Bemessung_Zust_II.py +648 -0
  5. KIB_LAP/Betonbau/Cross_Section_Kappa.py +925 -0
  6. KIB_LAP/Betonbau/Druckglied_KGV.py +179 -0
  7. KIB_LAP/Betonbau/Iterative_Design.py +723 -0
  8. KIB_LAP/Betonbau/Materialkennwerte_Beton.py +196 -0
  9. KIB_LAP/Betonbau/Querschnittsbreite.py +194 -0
  10. KIB_LAP/Betonbau/Querschnittsbreite_Kreis.py +63 -0
  11. KIB_LAP/Betonbau/__init__.py +2 -0
  12. KIB_LAP/Betonbau/beam_plate_T.py +921 -0
  13. KIB_LAP/Betonbau/beam_plate_T_reverse.py +915 -0
  14. KIB_LAP/Betonbau/beam_rectangular.py +635 -0
  15. KIB_LAP/Betonbau/beam_sub_section.py +9 -0
  16. KIB_LAP/Dynamik/Cross_Section_Properties.py +155 -0
  17. KIB_LAP/Dynamik/Deformation_Method.py +587 -0
  18. KIB_LAP/Dynamik/Duhamel_SDOF.py +221 -0
  19. KIB_LAP/Dynamik/FFT.py +87 -0
  20. KIB_LAP/Dynamik/Kontinuum_Eigenmodes.py +418 -0
  21. KIB_LAP/Dynamik/Kontinuum_Schwingung.py +757 -0
  22. KIB_LAP/Dynamik/Pendulum_Spring_Linearized.py +91 -0
  23. KIB_LAP/Dynamik/Pendulum_Spring_Problem.py +94 -0
  24. KIB_LAP/Dynamik/__init__.py +0 -0
  25. KIB_LAP/Examples/Cross_Section_Thin.py +61 -0
  26. KIB_LAP/Examples/Cross_Section_Thin_2.py +14 -0
  27. KIB_LAP/Examples/Plattentragwerke.py +39 -0
  28. KIB_LAP/Examples/Plattentragwerke_2.py +60 -0
  29. KIB_LAP/Examples/ShearDesign.py +28 -0
  30. KIB_LAP/Examples/__init__.py +0 -0
  31. KIB_LAP/Plattenbeulen/Plate_Design.py +276 -0
  32. KIB_LAP/Plattenbeulen/Ritz_Optimiert.py +658 -0
  33. KIB_LAP/Plattenbeulen/__init__.py +2 -0
  34. KIB_LAP/Plattenbeulen/dist/__init__.py +0 -0
  35. KIB_LAP/Plattenbeulen/plate_buckling.cpp +561 -0
  36. KIB_LAP/Plattenbeulen/plate_buckling_cpp.cp313-win_amd64.pyd +0 -0
  37. KIB_LAP/Plattenbeulen/plate_buckling_cpp.cpp +561 -0
  38. KIB_LAP/Plattenbeulen/setup.py +35 -0
  39. KIB_LAP/Plattentragwerke/Functions.cpp +326 -0
  40. KIB_LAP/Plattentragwerke/Functions.h +41 -0
  41. KIB_LAP/Plattentragwerke/NumInte.cpp +23 -0
  42. KIB_LAP/Plattentragwerke/NumericalIntegration.cpp +23 -0
  43. KIB_LAP/Plattentragwerke/PlateBendingKirchhoff.py +843 -0
  44. KIB_LAP/Plattentragwerke/__init__.py +1 -0
  45. KIB_LAP/Plattentragwerke/plate_bending.cpp +341 -0
  46. KIB_LAP/Plattentragwerke/plate_bending_cpp.cp313-win_amd64.pyd +0 -0
  47. KIB_LAP/Plattentragwerke/setup.py +39 -0
  48. KIB_LAP/Querschnittswerte/Querschnitt_Duenn.py +526 -0
  49. KIB_LAP/Querschnittswerte/__init__.py +1 -0
  50. KIB_LAP/STABRAUM/InputData.py +92 -0
  51. KIB_LAP/STABRAUM/Programm.py +1403 -0
  52. KIB_LAP/STABRAUM/Steifigkeitsmatrix.py +275 -0
  53. KIB_LAP/STABRAUM/__init__.py +3 -0
  54. KIB_LAP/Stahlbau/__init__.py +0 -0
  55. KIB_LAP/Verbundbau/Verbundtraeger_Bemessung.py +766 -0
  56. KIB_LAP/Verbundbau/__init__.py +0 -0
  57. KIB_LAP/__init__.py +4 -0
  58. KIB_LAP/main.py +2 -0
  59. KIB_LAP/plate_bending_cpp.cp313-win_amd64.pyd +0 -0
  60. KIB_LAP/plate_buckling_cpp.cp313-win_amd64.pyd +0 -0
  61. kib_lap-0.5.dist-info/METADATA +25 -0
  62. kib_lap-0.5.dist-info/RECORD +64 -0
  63. kib_lap-0.5.dist-info/WHEEL +5 -0
  64. kib_lap-0.5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,843 @@
1
+ import numpy as np
2
+ import matplotlib.pyplot as plt
3
+ from matplotlib import cm
4
+ import pandas as pd
5
+ import time
6
+ import os
7
+ from scipy import optimize
8
+ from scipy.integrate import simpson
9
+ import math
10
+
11
+ try:
12
+ import plate_bending_cpp
13
+ except:
14
+ from KIB_LAP.Plattentragwerke import plate_bending_cpp
15
+
16
+
17
+ class PlateBendingKirchhoffClass:
18
+ def __init__(
19
+ self,
20
+ E,
21
+ t,
22
+ a,
23
+ b,
24
+ p0,
25
+ x0,
26
+ u,
27
+ y0,
28
+ v,
29
+ nu=0.0,
30
+ kappa_s=5 / 6,
31
+ K=0,
32
+ n_inte=50,
33
+ loading="Regular",
34
+ support="hhhh",
35
+ reihen=8,
36
+ x_s_positions = [],
37
+ I_s_values= [],
38
+ y_s_positions = [],
39
+ I_t_values = []
40
+ ):
41
+ """
42
+ Initialisierung der Klasse PlateBendingKirchhoff.
43
+
44
+ Args:
45
+ E (float): Elastizitätsmodul.
46
+ t (float): Dicke der Platte.
47
+ a (float): Länge der Platte in x-Richtung.
48
+ b (float): Länge der Platte in y-Richtung.
49
+ p0 (float): Maximale Last.
50
+ x0 (float): Startpunkt der Last in x-Richtung.
51
+ u (float): Breite der Last in x-Richtung.
52
+ y0 (float): Startpunkt der Last in y-Richtung.
53
+ v (float): Breite der Last in y-Richtung.
54
+ nu (float, optional): Querdehnzahl. Standardmäßig 0.0.
55
+ kappa_s (float, optional): Schubkorrekturfaktor. Standardmäßig 5/6.
56
+ K (int, optional): Torsionssteifigkeit. Standardmäßig 0.
57
+ n_inte (int, optional): Anzahl der Integrationspunkte. Standardmäßig 50.
58
+ loading (str, optional): Art der Belastung. Standardmäßig "Regular". Andere Eingabewerte Liste
59
+ support (str, optional): Lagerungsbedingungen. Standardmäßig "hhhh".
60
+ reihen (int, optional): Anzahl der Reihen für die Reihenentwicklung. Standardmäßig 8.
61
+ """
62
+ # Materialien
63
+ self.E = E
64
+ self.nu = nu
65
+ self.kappa_s = kappa_s
66
+ self.K = K
67
+ # Plattenabmessungen in [m]
68
+ self.t = t
69
+ self.a = a
70
+ self.b = b
71
+
72
+ self.n_inte = n_inte
73
+
74
+ self.list_a = np.linspace(0, self.a, self.n_inte)
75
+ self.list_b = np.linspace(0, self.b, self.n_inte)
76
+
77
+ # Belastung
78
+ self.p0 = p0
79
+ self.x0 = x0
80
+ self.u = u
81
+ self.y0 = y0
82
+ self.v = v
83
+
84
+ self.loading = loading
85
+
86
+ # Steifigkeitsmatrix-Komponenten
87
+ self.D_11 = E * t**3 / (12 * (1 - nu**2))
88
+ self.D_22 = self.D_11
89
+ self.D_12 = self.D_11 * nu
90
+ self.D_66 = (1 - nu) / 2 * self.D_11
91
+
92
+ self.support = support
93
+
94
+ self.reihen = reihen
95
+
96
+ self.mat = np.zeros((self.reihen**2, self.reihen**2))
97
+
98
+ self.load = np.zeros((self.reihen**2))
99
+
100
+
101
+ self.x_s_array = np.array(x_s_positions, dtype=np.float64)
102
+ self.I_s_array = np.array(I_s_values, dtype=np.float64)
103
+
104
+
105
+ self.y_s_array = np.array(y_s_positions, dtype=np.float64)
106
+ self.I_t_array = np.array(I_t_values, dtype=np.float64)
107
+
108
+
109
+ def CalculateAll(self):
110
+ """
111
+ Führt alle Berechnungsschritte aus.
112
+ """
113
+ self.AssembleStiffnessMatrix()
114
+ self.Construct_Loadvector()
115
+ self.ReduceMatrix()
116
+ self.SolveSystem()
117
+ self.TransformSolutionMatrix()
118
+
119
+ def AssembleStiffnessMatrix(self):
120
+ """
121
+ Berechnung der Steifigkeitsmatrix für die Plattenstruktur mit dem C++-Modul via pybind11.
122
+ """
123
+ # Sicherstellen, dass das C++-Modul importiert werden kann
124
+ try:
125
+ pass
126
+ except ImportError as e:
127
+ print("Fehler beim Import des C++-Moduls:", e)
128
+ raise
129
+ print(self.support)
130
+ # Aufruf der assemble_stiffness_matrix-Funktion aus dem C++-Modul
131
+ self.mat = plate_bending_cpp.assemble_stiffness_matrix(
132
+ self.D_11,
133
+ self.D_22,
134
+ self.D_12,
135
+ self.D_66,
136
+ self.reihen,
137
+ self.n_inte,
138
+ self.a,
139
+ self.b,
140
+ self.support,
141
+ self.E,
142
+ self.x_s_array,
143
+ self.I_s_array,
144
+ self.y_s_array,
145
+ self.I_t_array
146
+ )
147
+
148
+ self.mat = np.array(self.mat) # Konvertierung in ein NumPy-Array
149
+
150
+ def Construct_Loadvector(self):
151
+ """
152
+ Konstruktion des Lastvektors basierend auf der aufgebrachten Belastung.
153
+ """
154
+ if self.loading == "Regular":
155
+ rectangular_loads = [
156
+ # [x0, x1, y0, y1, p0]
157
+ [self.x0, self.x0 + self.u, self.y0, self.y0 + self.v, self.p0]
158
+ ]
159
+
160
+ for load in rectangular_loads:
161
+ x0, x1, y0, y1, p0 = load
162
+
163
+ # Sicherstellen, dass die Last innerhalb der Plattenabmessungen liegt
164
+ x0 = max(0, min(self.a, x0))
165
+ x1 = max(0, min(self.a, x1))
166
+ y0 = max(0, min(self.b, y0))
167
+ y1 = max(0, min(self.b, y1))
168
+
169
+ list_load_inte_x = np.linspace(x0, x1, 100)
170
+ list_load_inte_y = np.linspace(y0, y1, 100)
171
+ for m in range(1, self.reihen + 1):
172
+ for n in range(1, self.reihen + 1):
173
+ # Integration über die Lastfläche
174
+
175
+ y_values_1 = self.function_1(list_load_inte_x, m)
176
+ omega_1m = simpson(y_values_1, x=list_load_inte_x)
177
+
178
+ y_values_2 = self.function_2(list_load_inte_y, n)
179
+ omega_1n = simpson(y_values_2, x=list_load_inte_y)
180
+
181
+ self.load[n - 1 + self.reihen * (m - 1)] += (
182
+ p0 * omega_1m * omega_1n
183
+ )
184
+ else:
185
+ self.RectangularLoad = pd.DataFrame(
186
+ pd.read_csv("Loading/Constant_Loading.csv")
187
+ )
188
+ for i in range(0, len(self.RectangularLoad["x0[m]"]), 1):
189
+ x0 = float(self.RectangularLoad["x0[m]"][i])
190
+ if (x0 < 0) or (x0 > self.a):
191
+ x0 = 0
192
+ x1 = float(self.RectangularLoad["x1[m]"][i])
193
+ if x1 > self.a or x1 < 0:
194
+ x1 = self.a
195
+ y0 = float(self.RectangularLoad["y0[m]"][i])
196
+ if y0 < 0 or y0 > self.b:
197
+ y0 = 0
198
+ y1 = float(self.RectangularLoad["y1[m]"][i])
199
+ if y1 < 0 or y1 > self.b:
200
+ y1 = self.b
201
+
202
+ p0 = float(self.RectangularLoad["p0[MN/m**2]"][i])
203
+
204
+ list_load_inte_x = np.linspace(x0, x1, 100)
205
+ list_load_inte_y = np.linspace(y0, y1, 100)
206
+ for m in range(1, self.reihen + 1, 1):
207
+ for n in range(1, self.reihen + 1, 1):
208
+
209
+ y_values_1 = self.function_1(list_load_inte_x, m)
210
+ omega_1m = simpson(y_values_1, x=list_load_inte_x)
211
+
212
+ y_values_2 = self.function_2(list_load_inte_y, n)
213
+ omega_1n = simpson(y_values_2, x=list_load_inte_y)
214
+
215
+ self.load[n - 1 + self.reihen * (m - 1)] += (
216
+ p0 * omega_1m * omega_1n
217
+ )
218
+
219
+ def ReduceMatrix(self):
220
+ """
221
+ Reduziert die Matrix und den Lastvektor, um Nullzeilen und -spalten zu entfernen.
222
+ """
223
+ # Prüfen, welche Zeilen und Spalten nur Nullen enthalten
224
+ non_zero_rows = ~np.all(self.mat == 0, axis=1)
225
+ non_zero_cols = ~np.all(self.mat == 0, axis=0)
226
+
227
+ # Reduziere die Matrix und den Vektor, um nur Nicht-Null Zeilen und Spalten zu behalten
228
+ self.reduced_mat = self.mat[non_zero_rows, :][:, non_zero_cols]
229
+ self.reduced_load = self.load[non_zero_rows]
230
+
231
+ def SolveSystem(self):
232
+ """
233
+ Löst das reduzierte Gleichungssystem.
234
+ """
235
+ if self.reduced_mat.size > 0:
236
+ self.x_reduced = np.linalg.solve(self.reduced_mat, self.reduced_load)
237
+ else:
238
+ print("Keine Lösung möglich, da das Gleichungssystem nur Nullen enthält.")
239
+
240
+ def TransformSolutionMatrix(self):
241
+ """
242
+ Transformiert die Lösungsvektoren in eine Matrixform.
243
+ """
244
+ # Berechnen der Dimension der quadratischen Matrix
245
+ n = int(np.sqrt(len(self.x_reduced)))
246
+
247
+ if n**2 != len(self.x_reduced):
248
+ raise ValueError(
249
+ "Die Länge von x_reduced ist nicht das Quadrat einer ganzen Zahl"
250
+ )
251
+
252
+ # Umstrukturieren des Vektors x_reduced in eine quadratische n x n Matrix
253
+ self.matrix = self.x_reduced.reshape(n, n)
254
+
255
+ def SolutionPointDisp(self, a_sol, b_sol):
256
+ """
257
+ Berechnet die Durchbiegung an einem bestimmten Punkt (a_sol, b_sol).
258
+ """
259
+ x_disp = 0.0
260
+
261
+ for m in range(1, self.reihen + 1):
262
+ for n in range(1, self.reihen + 1):
263
+ x_disp += (
264
+ self.matrix[m - 1][n - 1]
265
+ * self.function_1(a_sol, m)
266
+ * self.function_2(b_sol, n)
267
+ )
268
+
269
+ return x_disp
270
+
271
+ def SolutionPointMomentx(self, a_sol, b_sol):
272
+ """
273
+ Berechnet den Biegemoment mxx an einem bestimmten Punkt (a_sol, b_sol).
274
+ """
275
+ mxx = 0.0
276
+
277
+ for m in range(1, self.reihen + 1):
278
+ for n in range(1, self.reihen + 1):
279
+ mxx += self.matrix[m - 1][n - 1] * (
280
+ -self.D_11 * self.function_1xx(a_sol, m) * self.function_2(b_sol, n)
281
+ - self.D_12
282
+ * self.function_2yy(b_sol, n)
283
+ * self.function_1(a_sol, m)
284
+ )
285
+
286
+ return mxx
287
+
288
+ def SolutionPointMomenty(self, a_sol, b_sol):
289
+ """
290
+ Berechnet den Biegemoment myy an einem bestimmten Punkt (a_sol, b_sol).
291
+ """
292
+ myy = 0.0
293
+
294
+ for m in range(1, self.reihen + 1):
295
+ for n in range(1, self.reihen + 1):
296
+ myy += self.matrix[m - 1][n - 1] * (
297
+ -self.D_12 * self.function_1xx(a_sol, m) * self.function_2(b_sol, n)
298
+ - self.D_22
299
+ * self.function_2yy(b_sol, n)
300
+ * self.function_1(a_sol, m)
301
+ )
302
+
303
+ return myy
304
+
305
+ def SolutionPointMomentxy(self, a_sol, b_sol):
306
+ """
307
+ Berechnet das Drillmoment Mxy an einem bestimmten Punkt (a_sol, b_sol).
308
+ """
309
+ mxy = 0.0
310
+
311
+ for m in range(1, self.reihen + 1):
312
+ for n in range(1, self.reihen + 1):
313
+ mxy += (
314
+ -self.D_66
315
+ * self.matrix[m - 1][n - 1]
316
+ * (self.function_1x(a_sol, m) * self.function_2y(b_sol, n))
317
+ )
318
+
319
+ return mxy
320
+
321
+ def SolutionPointShearForceX(self, a_sol, b_sol):
322
+ """
323
+ Berechnet die Querkraft Qx an einem bestimmten Punkt (a_sol, b_sol).
324
+ """
325
+ Qx = 0.0
326
+
327
+ for m in range(1, self.reihen + 1):
328
+ for n in range(1, self.reihen + 1):
329
+ term1 = (
330
+ self.D_11 * self.function_1xxx(a_sol, m) * self.function_2(b_sol, n)
331
+ )
332
+ term2 = (
333
+ (self.D_12 + self.D_66)
334
+ * self.function_1x(a_sol, m)
335
+ * self.function_2yy(b_sol, n)
336
+ )
337
+ Qx += self.matrix[m - 1][n - 1] * (term1 + term2)
338
+
339
+ return Qx
340
+
341
+ def SolutionPointShearForceY(self, a_sol, b_sol):
342
+ """
343
+ Berechnet die Querkraft Qy an einem bestimmten Punkt (a_sol, b_sol).
344
+ """
345
+ Qy = 0.0
346
+
347
+ for m in range(1, self.reihen + 1):
348
+ for n in range(1, self.reihen + 1):
349
+ term1 = (
350
+ self.D_22 * self.function_1(a_sol, m) * self.function_2yyy(b_sol, n)
351
+ )
352
+ term2 = (
353
+ (self.D_12 + self.D_66)
354
+ * self.function_1xx(a_sol, m)
355
+ * self.function_2y(b_sol, n)
356
+ )
357
+ Qy += self.matrix[m - 1][n - 1] * (term1 + term2)
358
+
359
+ return Qy
360
+
361
+ def function_1(self, x, m):
362
+ if self.support == "hhhh":
363
+ return np.sin(x * np.pi / self.a * m)
364
+ elif self.support == "cccc":
365
+ return 1 - np.cos(2 * m * np.pi * x / self.a)
366
+ elif self.support == "hhff":
367
+
368
+ lambda_m = (0.50 + m - 1) * np.pi
369
+ if m == 2:
370
+ lambda_m = 4.730041
371
+ elif m == 3:
372
+ lambda_m = 7.853205
373
+ elif m == 4:
374
+ lambda_m = 10.99561
375
+
376
+ alpha = lambda_m / self.a
377
+
378
+ a_j = (np.sinh(lambda_m) - np.sin(lambda_m)) / (
379
+ np.cosh(lambda_m) - np.cos(lambda_m)
380
+ )
381
+ if m > 1:
382
+ return (np.sin(alpha * x) + np.sinh(alpha * x)) / (
383
+ np.sin(lambda_m) - np.sinh(lambda_m)
384
+ ) - a_j * (np.cosh(alpha * x) + np.cos(alpha * x)) / (
385
+ np.cos(lambda_m) - np.cosh(lambda_m)
386
+ )
387
+ else:
388
+ return np.ones_like(x)
389
+ elif self.support == "hhhf":
390
+ lambda_m = (0.25 + m - 1) * np.pi
391
+ if m == 2:
392
+ lambda_m = 3.926602
393
+ elif m == 3:
394
+ lambda_m = 7.068582
395
+ elif m == 4:
396
+ lambda_m = 10.21018
397
+
398
+ alpha = lambda_m / self.a
399
+ if m > 1:
400
+ return np.sin(alpha * x) + np.sinh(alpha * x) * np.sin(
401
+ lambda_m
402
+ ) / np.sinh(lambda_m)
403
+ else:
404
+ return x / self.a
405
+ else:
406
+ return np.zeros_like(x)
407
+
408
+ def function_2(self, y, n):
409
+ if self.support == "hhhh":
410
+ return np.sin(y * np.pi / self.b * n)
411
+ elif self.support == "cccc":
412
+ return 1 - np.cos(2 * n * np.pi * y / self.b)
413
+ elif self.support == "hhff":
414
+ return np.sin(y * np.pi / self.b * n)
415
+ elif self.support == "hhhf":
416
+ return np.sin(y * np.pi / self.b * n)
417
+ else:
418
+ return np.zeros_like(y)
419
+
420
+ def function_1x(self, x, m):
421
+ if self.support == "hhhh":
422
+ return np.cos(x * np.pi / self.a * m) * np.pi / self.a * m
423
+ elif self.support == "cccc":
424
+ return 2 * np.pi * m * np.sin(2 * np.pi * m * x / self.a) / self.a
425
+ elif self.support == "hhff":
426
+ lambda_m = (0.50 + m) * np.pi
427
+ if m == 2:
428
+ lambda_m = 4.730041
429
+ elif m == 3:
430
+ lambda_m = 7.853205
431
+ elif m == 4:
432
+ lambda_m = 10.99561
433
+
434
+ alpha = lambda_m / self.a
435
+ a_j = (np.sinh(lambda_m) - np.sin(lambda_m)) / (
436
+ np.cosh(lambda_m) - np.cos(lambda_m)
437
+ )
438
+ if m > 1:
439
+ return alpha * (
440
+ (np.cos(alpha * x) + np.cosh(alpha * x))
441
+ / (np.sin(lambda_m) - np.sinh(lambda_m))
442
+ - a_j
443
+ * (np.sinh(alpha * x) - np.sin(alpha * x))
444
+ / (np.cos(lambda_m) - np.cosh(lambda_m))
445
+ )
446
+ else:
447
+ return np.zeros_like(x)
448
+
449
+ elif self.support == "hhhf":
450
+ lambda_m = (0.25 + m - 1) * np.pi
451
+ if m == 2:
452
+ lambda_m = 3.926602
453
+ elif m == 3:
454
+ lambda_m = 7.068582
455
+ elif m == 4:
456
+ lambda_m = 10.21018
457
+
458
+ alpha = lambda_m / self.a
459
+ if m > 1:
460
+ return alpha * (
461
+ np.cos(alpha * x)
462
+ + np.cosh(alpha * x) * np.sin(lambda_m) / np.sinh(lambda_m)
463
+ )
464
+ else:
465
+ return 1 / self.a
466
+ else:
467
+ return np.zeros_like(x)
468
+
469
+ def function_1xx(self, x, m):
470
+ if self.support == "hhhh":
471
+ return -np.sin(x * np.pi / self.a * m) * (np.pi / self.a * m) ** 2
472
+ elif self.support == "cccc":
473
+ return 4 * np.pi**2 * m**2 * np.cos(2 * np.pi * m * x / self.a) / self.a**2
474
+ elif self.support == "hhff":
475
+ lambda_m = (0.50 + m - 1) * np.pi
476
+ if m == 2:
477
+ lambda_m = 4.730041
478
+ elif m == 3:
479
+ lambda_m = 7.853205
480
+ elif m == 4:
481
+ lambda_m = 10.99561
482
+
483
+ alpha = lambda_m / self.a
484
+ a_j = (np.sinh(lambda_m) - np.sin(lambda_m)) / (
485
+ np.cosh(lambda_m) - np.cos(lambda_m)
486
+ )
487
+ if m > 1:
488
+ return (alpha**2) * (
489
+ (-np.sin(alpha * x) + np.sinh(alpha * x))
490
+ / (np.sin(lambda_m) - np.sinh(lambda_m))
491
+ - a_j
492
+ * (np.cosh(alpha * x) - np.cos(alpha * x))
493
+ / ((np.cos(lambda_m) - np.cosh(lambda_m)))
494
+ )
495
+ else:
496
+ return np.zeros_like(x)
497
+
498
+ elif self.support == "hhhf":
499
+ lambda_m = (0.25 + m - 1) * np.pi
500
+ if m == 2:
501
+ lambda_m = 3.926602
502
+ elif m == 3:
503
+ lambda_m = 7.068582
504
+ elif m == 4:
505
+ lambda_m = 10.21018
506
+
507
+ alpha = lambda_m / self.a
508
+ if m > 1:
509
+ return alpha**2 * (
510
+ -np.sin(alpha * x)
511
+ + np.sinh(alpha * x) * np.sin(lambda_m) / np.sinh(lambda_m)
512
+ )
513
+ else:
514
+ return 0
515
+
516
+ else:
517
+ return np.zeros_like(x)
518
+
519
+ def function_1xxx(self, x, m):
520
+ if self.support == "hhhh":
521
+ return np.cos(x * np.pi / self.a * m) * (np.pi / self.a * m) ** 3 * (-1)
522
+
523
+ elif self.support == "cccc":
524
+ return -8 * np.pi**3 * m**3 * np.sin(2 * np.pi * m * x / self.a) / self.a**3
525
+
526
+ elif self.support == "hhff":
527
+ lambda_m = (0.50 + m - 1) * np.pi
528
+ if m == 2:
529
+ lambda_m = 4.730041
530
+ elif m == 3:
531
+ lambda_m = 7.853205
532
+ elif m == 4:
533
+ lambda_m = 10.99561
534
+
535
+ alpha = lambda_m / self.a
536
+ a_j = (np.sinh(lambda_m) - np.sin(lambda_m)) / (
537
+ np.cosh(lambda_m) - np.cos(lambda_m)
538
+ )
539
+ if m > 1:
540
+ return (alpha**3) * (
541
+ (-np.cos(alpha * x) + np.cosh(alpha * x))
542
+ / (np.sin(lambda_m) - np.sinh(lambda_m))
543
+ - a_j
544
+ * (np.sinh(alpha * x) + np.sin(alpha * x))
545
+ / (np.cos(lambda_m) - np.cosh(lambda_m))
546
+ )
547
+ else:
548
+ return np.zeros_like(x) # Starrkörperverschiebung
549
+
550
+ elif self.support == "hhhf":
551
+ lambda_m = (0.25 + m - 1) * np.pi
552
+ if m == 2:
553
+ lambda_m = 3.926602
554
+ elif m == 3:
555
+ lambda_m = 7.068582
556
+ elif m == 4:
557
+ lambda_m = 10.21018
558
+
559
+ alpha = lambda_m / self.a
560
+ if m > 1:
561
+ return alpha**3 * (
562
+ -np.cos(alpha * x)
563
+ + np.cosh(alpha * x) * np.sin(lambda_m) / np.sinh(lambda_m)
564
+ )
565
+ else:
566
+ return 0
567
+ else:
568
+ return np.zeros_like(x)
569
+
570
+ def function_2y(self, y, n):
571
+ if self.support == "hhhh":
572
+ return np.cos(y * np.pi / self.b * n) * np.pi / self.b * n
573
+ elif self.support == "cccc":
574
+ return 2 * np.pi * n * np.sin(2 * np.pi * n * y / self.b) / self.b
575
+ elif self.support == "hhff":
576
+ return 2 * np.pi * n * np.sin(2 * np.pi * n * y / self.b) / self.b
577
+ elif self.support == "hhhf":
578
+ return 2 * np.pi * n * np.sin(2 * np.pi * n * y / self.b) / self.b
579
+ else:
580
+ return np.zeros_like(x)
581
+
582
+ def function_2yy(self, y, n):
583
+ if self.support == "hhhh":
584
+ return -np.sin(y * np.pi / self.b * n) * (np.pi / self.b * n) ** 2
585
+ elif self.support == "cccc":
586
+ return 4 * np.pi**2 * n**2 * np.cos(2 * np.pi * n * y / self.b) / self.b**2
587
+ elif self.support == "hhff":
588
+ return -np.sin(y * np.pi / self.b * n) * (np.pi / self.b * n) ** 2
589
+ elif self.support == "hhhf":
590
+ return -np.sin(y * np.pi / self.b * n) * (np.pi / self.b * n) ** 2
591
+ else:
592
+ return np.zeros_like(y)
593
+
594
+ def function_2yyy(self, y, n):
595
+ if self.support == "hhhh":
596
+ return np.cos(y * np.pi / self.b * n) * (np.pi / self.b * n) ** 3 * (-1)
597
+ elif self.support == "cccc":
598
+ return -8 * np.pi**3 * n**3 * np.sin(2 * np.pi * n * y / self.b) / self.b**3
599
+ elif self.support == "hhff":
600
+ return np.cos(y * np.pi / self.b * n) * (np.pi / self.b * n) ** 3 * (-1)
601
+ elif self.support == "hhhf":
602
+ return np.cos(y * np.pi / self.b * n) * (np.pi / self.b * n) ** 3 * (-1)
603
+ else:
604
+ return np.zeros_like(y)
605
+
606
+ def PlotLoad(self):
607
+ """
608
+ Plottet die aufgebrachte Belastung auf der Platte.
609
+ """
610
+ x_values = [0, self.a, self.a, 0, 0]
611
+ y_values = [0, 0, self.b, self.b, 0]
612
+
613
+ if self.loading == "Regular":
614
+ rectangular_loads = [
615
+ # [x0, x1, y0, y1]
616
+ [self.x0, self.x0 + self.u, self.y0, self.y0 + self.v]
617
+ ]
618
+
619
+ for load in rectangular_loads:
620
+ x0, x1, y0, y1 = load
621
+ x = [x0, x1, x1, x0, x0]
622
+ y = [y0, y0, y1, y1, y0]
623
+ plt.plot(x, y)
624
+ else:
625
+ print("Else")
626
+ for i in range(0, len(self.RectangularLoad["x0[m]"]), 1):
627
+ x = [
628
+ self.RectangularLoad["x0[m]"][i],
629
+ self.RectangularLoad["x1[m]"][i],
630
+ self.RectangularLoad["x1[m]"][i],
631
+ self.RectangularLoad["x0[m]"][i],
632
+ self.RectangularLoad["x0[m]"][i],
633
+ ]
634
+ y = [
635
+ self.RectangularLoad["y0[m]"][i],
636
+ self.RectangularLoad["y0[m]"][i],
637
+ self.RectangularLoad["y1[m]"][i],
638
+ self.RectangularLoad["y1[m]"][i],
639
+ self.RectangularLoad["y0[m]"][i],
640
+ ]
641
+
642
+ plt.plot(x, y)
643
+
644
+ plt.plot(x_values, y_values)
645
+ plt.gca().set_aspect("equal", adjustable="box")
646
+ plt.show(block=False)
647
+ plt.pause(2)
648
+ plt.close()
649
+
650
+ def PlotDeflectionGrid(self, grid_size=20):
651
+ """
652
+ Berechnet und plottet ein Raster der Momentenverläufe.
653
+
654
+ Args:
655
+ grid_size (int): Anzahl der Unterteilungen in x- und y-Richtung. Standardmäßig 20.
656
+ """
657
+ x_values = np.linspace(0, self.a, grid_size)
658
+ y_values = np.linspace(0, self.b, grid_size)
659
+ self.w_values = np.zeros((grid_size, grid_size))
660
+
661
+ for i, x in enumerate(x_values):
662
+ for j, y in enumerate(y_values):
663
+ self.w_values[i][j] = self.SolutionPointDisp(x, y)
664
+
665
+ print("Max. Deflection", self.w_values.max())
666
+
667
+ X, Y = np.meshgrid(x_values, y_values)
668
+ fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
669
+ surf = ax.plot_surface(
670
+ X, Y, self.w_values, cmap=cm.coolwarm, linewidth=0, antialiased=False
671
+ )
672
+ ax.set_title("Deflections w in [mm]")
673
+ plt.show(block=False)
674
+ plt.pause(6)
675
+ plt.close()
676
+
677
+ def PlotMomentGrid(self, grid_size=20):
678
+ """
679
+ Berechnet und plottet ein Raster der Momentenverläufe.
680
+
681
+ Args:
682
+ grid_size (int): Anzahl der Unterteilungen in x- und y-Richtung. Standardmäßig 20.
683
+ """
684
+ x_values = np.linspace(0, self.a, grid_size)
685
+ y_values = np.linspace(0, self.b, grid_size)
686
+ self.mx_values = np.zeros((grid_size, grid_size))
687
+ self.my_values = np.zeros((grid_size, grid_size))
688
+
689
+ for i, x in enumerate(x_values):
690
+ for j, y in enumerate(y_values):
691
+ self.mx_values[i][j] = self.SolutionPointMomentx(x, y)
692
+ self.my_values[i][j] = self.SolutionPointMomenty(x, y)
693
+
694
+ print("Max-Moment x in [kNm]", self.mx_values.max() * 1000)
695
+ print("Min-Moment x in [kNm]", self.mx_values.min() * 1000)
696
+ print("Max-Moment y in [kNm]", self.my_values.max() * 1000)
697
+ print("Min-Moment y in [kNm]", self.my_values.min() * 1000)
698
+
699
+ X, Y = np.meshgrid(x_values, y_values)
700
+ fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
701
+ surf = ax.plot_surface(
702
+ X, Y, self.mx_values, cmap=cm.coolwarm, linewidth=0, antialiased=False
703
+ )
704
+ ax.set_title("Moment Mx")
705
+ plt.show(block=False)
706
+ plt.pause(6)
707
+ plt.close()
708
+
709
+ fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
710
+ surf = ax.plot_surface(
711
+ X, Y, self.my_values, cmap=cm.coolwarm, linewidth=0, antialiased=False
712
+ )
713
+ ax.set_title("Moment My")
714
+ plt.show(block=False)
715
+ plt.pause(6)
716
+ plt.close()
717
+
718
+ def PlotShearForceGrid(self, grid_size=20):
719
+ """
720
+ Berechnet und plottet ein Raster der Querkräfte.
721
+ """
722
+ x_values = np.linspace(0, self.a, grid_size)
723
+ y_values = np.linspace(0, self.b, grid_size)
724
+ self.qx_values = np.zeros((grid_size, grid_size))
725
+ self.qy_values = np.zeros((grid_size, grid_size))
726
+
727
+ for i, x in enumerate(x_values):
728
+ for j, y in enumerate(y_values):
729
+ self.qx_values[i][j] = self.SolutionPointShearForceX(x, y)
730
+ self.qy_values[i][j] = self.SolutionPointShearForceY(x, y)
731
+
732
+ print("Max Qx in [kN/m]", self.qx_values.max() * 1000)
733
+ print("Min Qx in [kN/m]", self.qx_values.min() * 1000)
734
+ print("Max Qy in [kN/m]", self.qy_values.max() * 1000)
735
+ print("Min Qy in [kN/m]", self.qy_values.min() * 1000)
736
+
737
+ X, Y = np.meshgrid(x_values, y_values)
738
+ fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
739
+ surf = ax.plot_surface(
740
+ X, Y, self.qx_values, cmap=cm.coolwarm, linewidth=0, antialiased=False
741
+ )
742
+ ax.set_title("Querkraft Qx")
743
+ plt.show(block=False)
744
+ plt.pause(6)
745
+ plt.close()
746
+
747
+ fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
748
+ surf = ax.plot_surface(
749
+ X, Y, self.qy_values, cmap=cm.coolwarm, linewidth=0, antialiased=False
750
+ )
751
+ ax.set_title("Querkraft Qy")
752
+ plt.show(block=False)
753
+ plt.pause(6)
754
+ plt.close()
755
+
756
+ def PlotTorsionalMomentGrid(self, grid_size=20):
757
+ """
758
+ Berechnet und plottet ein Raster der Drillmomente.
759
+ """
760
+ x_values = np.linspace(0, self.a, grid_size)
761
+ y_values = np.linspace(0, self.b, grid_size)
762
+ self.mxy_values = np.zeros((grid_size, grid_size))
763
+
764
+ for i, x in enumerate(x_values):
765
+ for j, y in enumerate(y_values):
766
+ self.mxy_values[i][j] = self.SolutionPointMomentxy(x, y)
767
+
768
+ print("Max Mxy in [kNm/m]", self.mxy_values.max() * 1000)
769
+ print("Min Mxy in [kNm/m]", self.mxy_values.min() * 1000)
770
+
771
+ X, Y = np.meshgrid(x_values, y_values)
772
+ fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
773
+ surf = ax.plot_surface(
774
+ X, Y, self.mxy_values, cmap=cm.coolwarm, linewidth=0, antialiased=False
775
+ )
776
+ ax.set_title("Drillmoment Mxy")
777
+ plt.show(block=False)
778
+ plt.pause(6)
779
+ plt.close()
780
+
781
+
782
+
783
+ a = 15
784
+ b = 6
785
+
786
+ Plate = PlateBendingKirchhoffClass(
787
+ 35000, 0.30, a, b, 1, 0.5, 0.5, 0.5, 0.5, 0.0, 0, 0, n_inte=50, loading="Liste", support = "hhhh",reihen = 8)
788
+
789
+
790
+ btire = 0.37
791
+ p_tire = 120/(4*btire**2) / 1000
792
+
793
+ print("tire pressure [MN/m²]: ", p_tire)
794
+
795
+ # Daten als Liste von Listen
796
+ new_data = [
797
+ ["No.","x0[m]","x1[m]","y0[m]","y1[m]","p0[MN/m**2]"],
798
+ [1,3+2-btire,3+2+btire,0.5,0.5+2*btire,p_tire *1.5],
799
+ [2,3+3.2-btire,3+3.2+btire,0.5,0.5+2*btire,p_tire *1.5],
800
+ [3,3+3.2-btire,3+3.2+btire,2.5,2.5+2*btire,p_tire *1.5],
801
+ [4,3+2-btire,3+2+btire,2.5,2.5+2*btire,p_tire *1.5],
802
+
803
+ [5,0,15,0,3,6.5/1000*1.5],
804
+
805
+ [6,0,15,0,6,2.5/1000*1.5],
806
+ [7,0,15,0,6,0.35*25/1000*1.35],
807
+
808
+ # [6,2-0.2,2+0.2,3.5,3.9,100/0.4**2/1000],
809
+ # [7,3.2-0.2,3.2+0.2,3.5,3.9,100/0.4**2/1000],
810
+ # [8,3.2-0.2,3.2+0.2,5.5,5.9,100/0.4**2/1000],
811
+ # [9,2-0.2,2+0.2,5.5,5.9,100/0.4**2/1000],
812
+
813
+ # [10,2-0.2,2+0.2,6.5,6.9,100/0.4**2/1000],
814
+ # [11,3.2-0.2,3.2+0.2,6.5,6.9,100/0.4**2/1000],
815
+ # [12,3.2-0.2,3.2+0.2,8.5,8.9,100/0.4**2/1000],
816
+ # [13,2-0.2,2+0.2,8.5,8.9,100/0.4**2/1000]
817
+
818
+ ]
819
+
820
+ # Konvertiere die Daten in ein DataFrame
821
+ df = pd.DataFrame(new_data[1:], columns=new_data[0])
822
+
823
+ # Dateipfad zur CSV-Datei
824
+ file_path = 'Loading/Constant_Loading.csv'
825
+
826
+ # Schreibe das DataFrame in eine CSV-Datei
827
+ df.to_csv(file_path, index=False)
828
+
829
+
830
+ Plate.CalculateAll()
831
+
832
+ Plate.SolutionPointDisp(0.5,0.5)
833
+ Plate.SolutionPointMomentx(0.5,0.5)
834
+ Plate.SolutionPointMomenty(0.5,0.5)
835
+
836
+
837
+ Plate.PlotLoad()
838
+ print("BENDING MOMENTS")
839
+ Plate.PlotMomentGrid()
840
+ print("SHEAR FORCES")
841
+ Plate.PlotShearForceGrid()
842
+ print("DRILL MOMENTS")
843
+ Plate.PlotTorsionalMomentGrid()