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,925 @@
1
+ import numpy as np
2
+ import matplotlib.pyplot as plt
3
+ import pandas as pd
4
+ from scipy.interpolate import interp1d
5
+ from Iterative_Design import Baustoffe
6
+ from Querschnittsbreite import PolygonSection
7
+
8
+ class M_Kappa_Cross_Section:
9
+ def __init__(
10
+ self,
11
+ _LoadingType="csv",
12
+ Iter="Bruch",
13
+ Reinforcement="csv",
14
+ Querschnittsbemessung="Polygon",
15
+ ):
16
+ # Init design values for loading
17
+ self.LoadingType = _LoadingType
18
+ # Geometric parameters for the design
19
+ self.Bewehrung = Reinforcement
20
+
21
+ self.readBaustoffe()
22
+ self.Querschnittswerte()
23
+ self.Bewehrungsangaben()
24
+ self.ReadLoading()
25
+
26
+ print("height", self.h_c)
27
+ print("width", self.b_c)
28
+
29
+ # Latex-Ausgabe
30
+
31
+ self.results_A = []
32
+ self.results_B = []
33
+ self.results_B_Iterate = []
34
+ self.results_C = []
35
+ self.results_C_Iterate = []
36
+ self.results_D = []
37
+ self.results_D_Iterate = []
38
+
39
+ # Bemessungswerte der Baustoffwerte
40
+
41
+ self.Point_A()
42
+ self.Point_B()
43
+ self.Point_B_Iterate()
44
+ self.Point_C()
45
+ self.Point_C_Iterative()
46
+ # self.Point_D()
47
+
48
+ def readBaustoffe(self):
49
+ csv_read_beton = pd.read_csv("Materialparameter/Beton.csv")
50
+ csv_read_stahl = pd.read_csv("Materialparameter/Betonstahl.csv")
51
+
52
+ print(csv_read_beton["traeger"])
53
+ self.Baustoff = Baustoffe(
54
+ [csv_read_beton["fck"].iloc[0], csv_read_stahl["fyk[MPa]"].iloc[0]],
55
+ csv_read_beton["h_c"].iloc[0],
56
+ csv_read_beton["b_c"].iloc[0],
57
+ csv_read_beton["traeger"].iloc[0],
58
+ csv_read_beton["t0"].iloc[0],
59
+ csv_read_beton["t"].iloc[0],
60
+ )
61
+
62
+ def Querschnittswerte(self, _height_test=0.5):
63
+ # Example usage
64
+ df = pd.read_csv("Polygon/Polygon.csv")
65
+ self.vertices = df.values.tolist()
66
+
67
+ self.polygon = PolygonSection(self.vertices)
68
+
69
+ # Calculate the height of the polygon based on y-values
70
+
71
+ y_values = [vertex[1] for vertex in self.vertices]
72
+ self.height = abs(max(y_values) - min(y_values))
73
+ self.z_cu = self.height - self.polygon.centroid[1]
74
+ self.z_co = self.height - self.z_cu
75
+
76
+ # Define the rotation angle
77
+ self.angle_degrees = 0
78
+ self.polygon.rotate(self.angle_degrees)
79
+
80
+ height = self.height
81
+
82
+
83
+ self.num_stripes = 1000
84
+ self.section_width_list = [
85
+ self.polygon.calculate_section_width_at_height(
86
+ height / (self.num_stripes) * (i + 0.5)
87
+ )
88
+ for i in range(0, self.num_stripes, 1)
89
+ ]
90
+ self.section_height_list = [
91
+ height / (self.num_stripes) * (i + 0.5)
92
+ for i in range(0, self.num_stripes, 1)
93
+ ]
94
+ self.delta_height = height / self.num_stripes
95
+
96
+ self.h_c = self.height
97
+ self.b_c = self.polygon.calculate_section_width_at_height(_height_test)
98
+
99
+ self.A = self.polygon.A
100
+
101
+
102
+ def PlotCrossSection(self, _height_test=0.25):
103
+ # Define the height at which to calculate the section width
104
+ height = _height_test
105
+ section_width = self.polygon.calculate_section_width_at_height(height)
106
+ print(
107
+ f"Section width at height {height} after rotating by {self.angle_degrees} degrees: {section_width}"
108
+ )
109
+
110
+ # Plot the polygon and the horizontal line
111
+ self.polygon.plot(height)
112
+
113
+ def Bewehrungsangaben(self):
114
+ if self.Bewehrung == "csv":
115
+ df = pd.read_csv("Bewehrung/Linienbewehrung.csv")
116
+ print(df)
117
+ for i in range(0, len(df["Lage"]), 1):
118
+ Lage = df["Lage"][i]
119
+ if Lage == "Unten":
120
+ self.d_s1 = (
121
+ df["dsl [m]"][i] * 0.5 + df["cnom [m]"][i] + df["dsw [m]"][i]
122
+ )
123
+ self.A_s1 = df["As [cm**2]"][i] * 0.01**2
124
+ elif Lage == "Oben":
125
+ self.d_s2 = (
126
+ df["dsl [m]"][i] * 0.5 + df["cnom [m]"][i] + df["dsw [m]"][i]
127
+ )
128
+ self.A_s2 = df["As [cm**2]"][i] * 0.01**2
129
+
130
+ self.z_ds1 = self.z_cu - self.d_s1
131
+ self.z_ds2 = self.z_co - self.d_s2
132
+
133
+ def ReadLoading(self):
134
+ if self.LoadingType == "csv":
135
+ df = pd.read_csv("Lasteingabe/Lasten.csv")
136
+ print(df)
137
+ self.Zugseite = None
138
+ for i in range(0, len(df["Grenzzustand"]), 1):
139
+ if df["Grenzzustand"][i] == "GZT":
140
+ self.NEd_GZT = df["NEd in [MN]"][i]
141
+ self.MEd_GZT = df["MEd in [MNm]"][i]
142
+ elif df["Grenzzustand"][i] == "GZG":
143
+ self.NEd_GZG = df["NEd in [MN]"][i]
144
+ self.MEd_GZG = df["MEd in [MNm]"][i]
145
+
146
+ if self.MEd_GZT >= 0:
147
+ self.MEds_GZT = abs(
148
+ self.MEd_GZT - self.NEd_GZT * self.z_ds1
149
+ ) # Bezug auf die Biegezugbewehrung (Hier UNTEN)
150
+ self.Zugseite_GZT = "UNTEN"
151
+ self.d = self.height - self.d_s1
152
+ elif self.MEd_GZT < 0:
153
+ self.MEds_GZT = abs(
154
+ self.MEd_GZT + self.NEd_GZT * self.z_ds2
155
+ ) # Bezug auf die Biegezugbewehrung (Hier OBEN)
156
+ self.Zugseite_GZT = "OBEN"
157
+ self.d = self.height - self.d_s2
158
+
159
+ if self.MEd_GZG >= 0:
160
+ self.MEds_GZG = self.MEd_GZG - self.NEd_GZG * self.z_ds1
161
+ self.Zugseite_GZG = "UNTEN"
162
+ self.d = self.height - self.d_s1
163
+ elif self.MEd_GZG < 0:
164
+ self.MEds_GZG = self.MEd_GZG + self.NEd_GZG * self.z_ds2
165
+ self.Zugseite_GZG = "OBEN"
166
+ self.d = self.height - self.d_s2
167
+
168
+ elif self.LoadingType == "csv_druckglied":
169
+ df = pd.read_csv("Lasteingabe/Lasten_Druckglied.csv")
170
+ print(df)
171
+ self.Zugseite = None
172
+ for i in range(0, len(df["Grenzzustand"]), 1):
173
+ if df["Grenzzustand"][i] == "GZT":
174
+ self.NEd_GZT = df["NEd in [MN]"][i]
175
+ self.MEd1_GZT = df["MEd1 in [MNm]"][i]
176
+ self.MEd2_GZT = df["MEd2 in [MNm]"][i]
177
+ elif df["Grenzzustand"][i] == "GZG":
178
+ self.NEd_GZG = df["NEd in [MN]"][i]
179
+ self.MEd1_GZG = df["MEd1 in [MNm]"][i]
180
+ self.MEd2_GZG = df["MEd2 in [MNm]"][i]
181
+
182
+ if self.MEd1_GZT >= 0:
183
+ self.Zugseite_GZT = "UNTEN"
184
+ self.d = self.height - self.d_s1
185
+ elif self.MEd1_GZT < 0:
186
+ self.Zugseite_GZT = "OBEN"
187
+ self.d = self.height - self.d_s2
188
+
189
+ if self.MEd1_GZG >= 0:
190
+ self.Zugseite_GZG = "UNTEN"
191
+ self.d = self.height - self.d_s1
192
+ elif self.MEd1_GZG < 0:
193
+ self.Zugseite_GZG = "OBEN"
194
+ self.d = self.height - self.d_s2
195
+
196
+ else:
197
+ self.NEd_GZT = float(
198
+ input("Geben Sie die Normalkraft NEd im GZT in [MN] ein: \n")
199
+ )
200
+ self.MEd_GZT = float(
201
+ input("Geben Sie das Biegemoment im GZT in [MN] ein: \n")
202
+ )
203
+ if self.MEd_GZT >= 0:
204
+ self.MEds_GZT = self.MEd_GZT - self.NEd_GZT * self.z_ds1
205
+ elif self.MEd_GZT < 0:
206
+ self.MEds_GZT = self.MEd_GZT + self.NEd_GZT * self.z_ds1
207
+
208
+ if self.MEd_GZG >= 0:
209
+ self.MEds_GZG = self.MEd_GZG - self.NEd_GZG * self.z_ds1
210
+ elif self.MEd_GZG < 0:
211
+ self.MEds_GZG = self.MEd_GZG + self.NEd_GZG * self.z_ds1
212
+
213
+ # Export loading parameters to the output folder
214
+ self.zsi_GZT = None
215
+ self.zsi_GZG = None
216
+
217
+ if self.Zugseite_GZT == "UNTEN":
218
+ self.zsi_GZT = self.z_ds1
219
+ else:
220
+ self.zsi_GZT = self.z_ds2
221
+
222
+ if self.Zugseite_GZG == "UNTEN":
223
+ self.zsi_GZG = self.z_ds1
224
+ else:
225
+ self.zsi_GZG = self.z_ds2
226
+
227
+ def Nonlinear_Material_Law(self, eps_c):
228
+ # Berechnung von eta und k
229
+ eta = abs(eps_c / (self.Baustoff.eps_c1 * 1e-3))
230
+ k = (
231
+ 1.05
232
+ * self.Baustoff.Ecm
233
+ / 1.5
234
+ * abs(self.Baustoff.eps_c1 * 1e-3)
235
+ / self.Baustoff.fcd
236
+ )
237
+
238
+ # Berechnung von sigma_c
239
+
240
+ sigma_c = self.Baustoff.fcd * (k * eta - eta**2) / (1 + (k - 2) * eta)
241
+
242
+ return eta, k, sigma_c
243
+
244
+ def Point_A(self):
245
+ """
246
+ Calculates the strain for the case, that the cross section is cracking at one edge
247
+ """
248
+
249
+ self.Wco = self.polygon.I_yy / self.z_co
250
+ self.Wcu = self.polygon.I_yy / self.z_cu
251
+ self.A = self.polygon.A
252
+
253
+ self.M_cr_o = self.Wco * (self.Baustoff.fctm - self.NEd_GZT / self.A)
254
+ self.M_cr_u = self.Wcu * (self.Baustoff.fctm - self.NEd_GZT / self.A)
255
+
256
+ print("Area", self.polygon.A)
257
+ print("Trägheitsmoment ", self.polygon.I_yy)
258
+ print("Widerstandsmoment ", self.Wco)
259
+ print("Zugfestigkeit ", self.Baustoff.fctm)
260
+
261
+ self.M_A = min(self.M_cr_o, self.M_cr_u)
262
+ self.kappa_A = self.M_A / (self.Baustoff.Ecm * self.polygon.I_yy)
263
+
264
+ # Save results
265
+ self.results_A.append(("I_y", self.polygon.I_yy))
266
+ self.results_A.append(("Wco", self.Wco))
267
+ self.results_A.append(("Wcu", self.Wcu))
268
+ self.results_A.append(("A", self.A))
269
+ self.results_A.append(("M_cr_o", self.M_cr_o))
270
+ self.results_A.append(("M_cr_u", self.M_cr_u))
271
+ self.results_A.append(("M_A", self.M_A))
272
+ self.results_A.append(("Kappa_A", self.kappa_A))
273
+
274
+ self.latex_table_A = self.results_to_latex_table(
275
+ self.results_A, ["Parameter", "Wert"], "Results of Point A"
276
+ )
277
+
278
+ def Point_B(self):
279
+ """
280
+ Point B is the case, where the compression reinforcement reaches its \n
281
+ yielding stress. \n
282
+ The iterations starts at the yielding strains of -2.174e-3 in both compression and \n
283
+ tension reinforcement.
284
+ """
285
+ N_Rd_B = self.NEd_GZT - 10
286
+ iter = 0
287
+
288
+ epsilon_s2 = -2.174e-3
289
+ epsilon_s1 = -2.174e-3
290
+ epsilon_c2 = epsilon_s2 + (
291
+ (epsilon_s2 - epsilon_s1) / (self.h_c - self.d_s1 - self.d_s2) * (self.d_s2)
292
+ )
293
+
294
+ print(epsilon_c2)
295
+
296
+ N_Rd_B_list = []
297
+
298
+ x = self.h_c
299
+
300
+ while (N_Rd_B < self.NEd_GZT) and (iter < 1000) and (epsilon_c2 >= -0.0035):
301
+ eta = self.Nonlinear_Material_Law(epsilon_c2)[0]
302
+ k = self.Nonlinear_Material_Law(epsilon_c2)[1]
303
+ sigma_c = self.Nonlinear_Material_Law(epsilon_c2)[2]
304
+
305
+ epsilon_c_list = np.linspace(0, epsilon_c2, 100)
306
+
307
+ sigma_c_list = self.Nonlinear_Material_Law(epsilon_c_list)[2]
308
+
309
+ x_list = np.linspace(0, x, 100)
310
+
311
+ if abs(N_Rd_B - self.NEd_GZT) > 1e-1:
312
+ epsilon_s1 += 1e-4
313
+ else:
314
+ epsilon_s1 += 1e-5
315
+
316
+ epsilon_c2 = epsilon_s2 + (
317
+ (epsilon_s2 - epsilon_s1)
318
+ / (self.h_c - self.d_s1 - self.d_s2)
319
+ * (self.d_s2)
320
+ )
321
+
322
+ N_cRd_B = np.trapz(sigma_c_list, x_list) * self.b_c * (-1)
323
+
324
+ if abs(epsilon_s2) <= 2.174e-3:
325
+ N_s2_Rd_B = epsilon_s2 * self.A_s2 * self.Baustoff.Es
326
+ else:
327
+ N_s2_Rd_B = -self.A_s2 * self.Baustoff.fyd
328
+ if abs(epsilon_s1) <= 2.174e-3:
329
+ N_s1_Rd_B = epsilon_s1 * self.A_s1 * self.Baustoff.Es
330
+ else:
331
+ N_s1_Rd_B = self.Baustoff.fyd * self.A_s1
332
+
333
+ # Berechnung des Abstands der Druckresultierenden von DNL
334
+
335
+ N_Rd_B_list.append(N_cRd_B)
336
+
337
+ dx = x_list[1] - x_list[0]
338
+
339
+ # Berechnung der Fläche unter der Kurve (Flächenmoment 0. Grades)
340
+ A = np.sum(sigma_c_list * dx)
341
+
342
+ # Berechnung des 1. Flächenmoments um den Ursprung
343
+ S = np.sum(sigma_c_list * x_list * dx)
344
+
345
+ # Berechnung des Schwerpunkts
346
+ a = S / A
347
+
348
+ N_Rd_B = N_cRd_B + N_s2_Rd_B + N_s1_Rd_B
349
+
350
+ iter += 1
351
+
352
+ print("eps s1", epsilon_s1)
353
+ print("eps s2", epsilon_s2)
354
+ print("eps c2", epsilon_c2)
355
+
356
+ print("NRd_B", N_Rd_B)
357
+ print("NRd_s1", N_s1_Rd_B)
358
+ print("NRd_s2", N_s2_Rd_B)
359
+
360
+ self.M_B = (
361
+ abs(N_cRd_B) * (self.z_cu - a)
362
+ + abs(N_s2_Rd_B) * (self.z_cu - self.d_s2)
363
+ + abs(N_s1_Rd_B) * (self.z_co - self.d_s1)
364
+ )
365
+
366
+ self.kappa_B = (epsilon_s1 - epsilon_c2) / self.d
367
+
368
+ if epsilon_c2 < -0.0035:
369
+ self.M_B = None
370
+ self.kappa_B = None
371
+
372
+ self.results_B.append(("M_B", self.M_B))
373
+ self.results_B.append(("Kappa_B", self.kappa_B))
374
+
375
+ def Point_B_Iterate(self):
376
+ """
377
+ Point B is the case, where the compression reinforcement reaches its \n
378
+ yielding stress. \n
379
+ The iterations starts at the yielding strains of -2.174e-3 in both compression and \n
380
+ tension reinforcement. \n
381
+ This function is the iterative representative for general cross sections.
382
+ """
383
+ N_Rd_B = self.NEd_GZT - 10
384
+ iter = 0
385
+
386
+ epsilon_s2 = -2.174e-3
387
+ epsilon_s1 = -2.174e-3
388
+ epsilon_c2 = epsilon_s2 + (
389
+ (epsilon_s2 - epsilon_s1) / (self.h_c - self.d_s1 - self.d_s2) * (self.d_s2)
390
+ )
391
+
392
+ N_Rd_B_list = []
393
+ x = self.h_c
394
+
395
+ while (N_Rd_B < self.NEd_GZT) and (iter < 1000) and (epsilon_c2 >= -0.0035):
396
+
397
+ eps_0 = epsilon_s2 - (epsilon_s2 - epsilon_s1) / (
398
+ self.h_c - self.d_s1 - self.d_s2
399
+ ) * (self.h_c - self.d_s2)
400
+
401
+ delta_eps_h = epsilon_c2 - eps_0
402
+
403
+ print(delta_eps_h)
404
+
405
+ N_cRd_B = 0
406
+ F_cd_list = np.zeros(1000)
407
+
408
+ for i in range(0, len(self.section_height_list), 1):
409
+ epsilon_i = eps_0 + delta_eps_h / (self.num_stripes) * (i)
410
+ if epsilon_i < 0:
411
+ sigma_c = self.Nonlinear_Material_Law(epsilon_i)[2]
412
+ else:
413
+ sigma_c = 0
414
+
415
+ F_cd_i = sigma_c * self.delta_height * self.section_width_list[i]
416
+ F_cd_list[i] = F_cd_i
417
+
418
+ N_cRd_B = sum(F_cd_list) * (-1)
419
+
420
+ if abs(N_Rd_B - self.NEd_GZT) > 1e-1:
421
+ epsilon_s1 += 1e-4
422
+ else:
423
+ epsilon_s1 += 1e-5
424
+
425
+ epsilon_c2 = epsilon_s2 + (
426
+ (epsilon_s2 - epsilon_s1)
427
+ / (self.h_c - self.d_s1 - self.d_s2)
428
+ * (self.d_s2)
429
+ )
430
+
431
+ if abs(epsilon_s2) <= 2.174e-3:
432
+ N_s2_Rd_B = epsilon_s2 * self.A_s2 * self.Baustoff.Es
433
+ else:
434
+ N_s2_Rd_B = -self.A_s2 * self.Baustoff.fyd
435
+ if abs(epsilon_s1) <= 2.174e-3:
436
+ N_s1_Rd_B = epsilon_s1 * self.A_s1 * self.Baustoff.Es
437
+ else:
438
+ N_s1_Rd_B = self.Baustoff.fyd * self.A_s1
439
+
440
+ N_Rd_B = N_cRd_B + N_s2_Rd_B + N_s1_Rd_B
441
+
442
+ # print("N_c_RdB", N_cRd_B)
443
+ # print("N_s1", N_s1_Rd_B)
444
+ # print("N_s2", N_s2_Rd_B)
445
+ # print("Ned",self.NEd_GZT)
446
+
447
+ iter += 1
448
+ print("H-GGW", abs(N_Rd_B - self.NEd_GZT))
449
+ print("eps s1 - ITER", epsilon_s1)
450
+ print("eps s2 - ITER", epsilon_s2)
451
+ print("eps c2 - ITER", epsilon_c2)
452
+
453
+ print("NRd_B - ITER", N_Rd_B)
454
+ print("NRd_s1 - ITER", N_s1_Rd_B)
455
+ print("NRd_s2 - ITER", N_s2_Rd_B)
456
+
457
+ # self.M_B_Iterate = (
458
+ # abs(N_cRd_B) * (self.z_cu - a)
459
+ # + abs(N_s2_Rd_B) * (self.z_cu - self.d_s2)
460
+ # + abs(N_s1_Rd_B) * (self.z_co - self.d_s1)
461
+ # )
462
+
463
+ # self.kappa_B_Iterate = (epsilon_s1 - epsilon_c2) / self.d
464
+
465
+ # if epsilon_c2 < -0.0035:
466
+ # self.M_B = None
467
+ # self.kappa_B = None
468
+
469
+ # self.results_B_Iterate.append(("M_B", self.M_B_Iterate))
470
+ # self.results_B_Iterate.append(("Kappa_B", self.kappa_B_Iterate))
471
+
472
+ # plt.plot(F_cd_list)
473
+ # plt.show()
474
+
475
+ def Point_C(self):
476
+ """
477
+ Point C represents the point in the M-Kappa-Law, where \n
478
+ the tensional reinforcement reaches the yielding stresses. \n
479
+ Therefore the iteration starts at 2.174e-3 \n
480
+ The iteration is performed over the strain of the compressional reinforcement \n
481
+
482
+ """
483
+ print("Point C")
484
+ N_Rd_C = self.NEd_GZT + 1
485
+ iter = 0
486
+
487
+ epsilon_s1 = +2.174e-3
488
+ epsilon_s2 = 0
489
+
490
+ epsilon_c2 = epsilon_s1 + (
491
+ (epsilon_s2 - epsilon_s1)
492
+ / (self.h_c - self.d_s1 - self.d_s2)
493
+ * (self.h_c - self.d_s1)
494
+ )
495
+
496
+ x = epsilon_c2 / (epsilon_c2 - epsilon_s1) * self.d
497
+
498
+ print()
499
+
500
+ while (N_Rd_C > self.NEd_GZT) and (iter < 1000) and (abs(epsilon_c2) <= 3.5e-3):
501
+
502
+ eta = self.Nonlinear_Material_Law(epsilon_c2)[0]
503
+ k = self.Nonlinear_Material_Law(epsilon_c2)[1]
504
+ sigma_c = self.Nonlinear_Material_Law(epsilon_c2)[2]
505
+
506
+ epsilon_c_list = np.linspace(0, epsilon_c2, 100)
507
+
508
+ sigma_c_list = self.Nonlinear_Material_Law(epsilon_c_list)[2]
509
+
510
+ x_list = np.linspace(0, x, 100)
511
+
512
+ if abs(N_Rd_C - self.NEd_GZT) > 1e-1:
513
+ epsilon_s2 -= 1e-4
514
+ else:
515
+ epsilon_s2 -= 1e-5
516
+
517
+ epsilon_c2 = epsilon_s1 + (
518
+ (epsilon_s2 - epsilon_s1)
519
+ / (self.h_c - self.d_s1 - self.d_s2)
520
+ * (self.h_c - self.d_s1)
521
+ )
522
+
523
+ x = epsilon_c2 / (epsilon_c2 - epsilon_s1) * self.d
524
+
525
+ N_cRd_C = np.trapz(sigma_c_list, x_list) * self.b_c * (-1)
526
+
527
+ if abs(epsilon_s2) <= 2.174e-3:
528
+ N_s2_Rd_C = epsilon_s2 * self.A_s2 * self.Baustoff.Es
529
+ else:
530
+ N_s2_Rd_C = -self.A_s2 * self.Baustoff.fyd
531
+ if abs(epsilon_s1) <= 2.174e-3:
532
+ N_s1_Rd_C = epsilon_s1 * self.A_s1 * self.Baustoff.Es
533
+ else:
534
+ N_s1_Rd_C = self.Baustoff.fyd * self.A_s1
535
+
536
+ N_Rd_C = N_cRd_C + N_s2_Rd_C + N_s1_Rd_C
537
+
538
+ # Berechnung des Abstands der Druckresultierenden von DNL
539
+
540
+ dx = x_list[1] - x_list[0]
541
+
542
+ # Berechnung der Fläche unter der Kurve (Flächenmoment 0. Grades)
543
+ A = np.sum(sigma_c_list * dx)
544
+
545
+ # Berechnung des 1. Flächenmoments um den Ursprung
546
+ S = np.sum(sigma_c_list * x_list * dx)
547
+
548
+ # Berechnung des Schwerpunkts
549
+ a = S / A
550
+
551
+ iter += 1
552
+
553
+ print("H-GGW", abs(N_Rd_C - self.NEd_GZT))
554
+ print("eps s1 ", epsilon_s1)
555
+ print("eps s2 ", epsilon_s2)
556
+ print("eps c2 ", epsilon_c2)
557
+
558
+ print("NRd_C ", N_Rd_C)
559
+ print("NRd_s1 ", N_s1_Rd_C)
560
+ print("NRd_s2 ", N_s2_Rd_C)
561
+
562
+ plt.plot([epsilon_s1,epsilon_s2,epsilon_c2],[0,self.d,self.height])
563
+ plt.show()
564
+
565
+ self.M_C = (
566
+ abs(N_cRd_C) * (self.z_cu - x + a)
567
+ + abs(N_s2_Rd_C) * (self.z_cu - self.d_s2)
568
+ + abs(N_s1_Rd_C) * (self.z_co - self.d_s1)
569
+ )
570
+
571
+ self.kappa_C = (epsilon_s1 - epsilon_c2) / self.d
572
+
573
+ self.results_C.append(("M_C", self.M_C))
574
+ self.results_C.append(("Kappa_C", self.kappa_C))
575
+
576
+ def Point_C_Iterative(self):
577
+ N_Rd_C = self.NEd_GZT + 1
578
+ iter = 0
579
+
580
+ epsilon_s1 = +2.174e-3
581
+ epsilon_s2 = 0
582
+
583
+ epsilon_c2 = epsilon_s1 + (
584
+ (epsilon_s2 - epsilon_s1)
585
+ / (self.h_c - self.d_s1 - self.d_s2)
586
+ * (self.h_c - self.d_s1)
587
+ )
588
+
589
+ x = epsilon_c2 / (epsilon_c2 - epsilon_s1) * self.d
590
+
591
+
592
+ while (N_Rd_C > self.NEd_GZT) and (iter < 1000) and (abs(epsilon_c2) <= 3.5e-3):
593
+
594
+
595
+ eps_0 = epsilon_s2 + (abs(epsilon_s2 - epsilon_s1)) / (
596
+ self.h_c - self.d_s1 - self.d_s2
597
+ ) * (self.h_c - self.d_s2)
598
+
599
+ delta_eps_h = epsilon_c2 - eps_0
600
+
601
+ x = epsilon_c2 / (epsilon_c2 - epsilon_s1) * self.d
602
+
603
+ N_cRd_C = 0
604
+ F_cd_list = np.zeros(1000)
605
+
606
+ eps_list = []
607
+
608
+ for i in range(0, len(self.section_height_list), 1):
609
+
610
+ epsilon_i = eps_0 + delta_eps_h / (self.num_stripes) * (i+1.5)
611
+
612
+ if epsilon_i <= 0:
613
+ sigma_c = self.Nonlinear_Material_Law(epsilon_i)[2]
614
+ else:
615
+ sigma_c = 0
616
+
617
+ F_cd_i = sigma_c * self.delta_height * self.section_width_list[i]
618
+
619
+ F_cd_list[i] = F_cd_i
620
+
621
+ N_cRd_C = F_cd_list.sum() * (-1)
622
+
623
+ if abs(epsilon_s2) <= 2.174e-3:
624
+ N_s2_Rd_C = epsilon_s2 * self.A_s2 * self.Baustoff.Es
625
+ else:
626
+ N_s2_Rd_C = -self.A_s2 * self.Baustoff.fyd
627
+
628
+ if abs(epsilon_s1) <= 2.174e-3:
629
+ N_s1_Rd_C = epsilon_s1 * self.A_s1 * self.Baustoff.Es
630
+ else:
631
+ N_s1_Rd_C = self.Baustoff.fyd * self.A_s1
632
+
633
+ N_Rd_C = N_cRd_C + N_s2_Rd_C + N_s1_Rd_C
634
+
635
+ if abs(N_Rd_C - self.NEd_GZT) > 1e-1:
636
+ epsilon_s2 -= 1e-4
637
+ else:
638
+ epsilon_s2 -= 1e-5
639
+
640
+ epsilon_c2 = epsilon_s1 + (
641
+ (epsilon_s2 - epsilon_s1)
642
+ / (self.h_c - self.d_s1 - self.d_s2)
643
+ * (self.h_c - self.d_s1)
644
+ )
645
+
646
+ iter += 1
647
+
648
+
649
+
650
+
651
+ print("H-GGW", abs(N_Rd_C - self.NEd_GZT))
652
+ print("eps s1 - ITER", epsilon_s1)
653
+ print("eps s2 - ITER", epsilon_s2)
654
+ print("eps c2 - ITER", epsilon_c2)
655
+
656
+ print("NRd_C - ITER", N_Rd_C)
657
+ print("NRd_s1 - ITER", N_s1_Rd_C)
658
+ print("NRd_s2 - ITER", N_s2_Rd_C)
659
+
660
+
661
+ # self.M_C_Iter = (
662
+ # abs(N_cRd_C) * (self.z_cu - x + a)
663
+ # + abs(N_s2_Rd_C) * (self.z_cu - self.d_s2)
664
+ # + abs(N_s1_Rd_C) * (self.z_co - self.d_s1)
665
+ # )
666
+
667
+ # self.kappa_C_Iter = (epsilon_s1 - epsilon_c2) / self.d
668
+
669
+ # self.results_C_Iterate.append(("M_C", self.M_C_Iter))
670
+ # self.results_C_Iterate.append(("Kappa_C", self.kappa_Iter))
671
+
672
+ def Point_D(self):
673
+ """
674
+ Point D represents the point in the M-Kappa-Law, where \n
675
+ the concrete reaches its breaking strain. \n
676
+ Therefore the iteration starts at -3.50e-3 for the concrete strain epsilon_c2 \n
677
+ The iteration is performed over the strain of the tensional reinforcement \n
678
+
679
+ """
680
+ N_Rd_D = self.NEd_GZT - 1
681
+ iter = 0
682
+
683
+ epsilon_s1 = 0
684
+
685
+ epsilon_c2 = -3.5e-3
686
+ epsilon_s2 = epsilon_c2 + (epsilon_c2 - epsilon_s1) / (self.d) * (self.d_s2)
687
+
688
+ x = epsilon_c2 / (epsilon_c2 - epsilon_s1) * self.d
689
+
690
+ while (N_Rd_D < self.NEd_GZT) and (iter < 10000):
691
+ eta = self.Nonlinear_Material_Law(epsilon_c2)[0]
692
+ k = self.Nonlinear_Material_Law(epsilon_c2)[1]
693
+ sigma_c = self.Nonlinear_Material_Law(epsilon_c2)[2]
694
+
695
+ epsilon_c_list = np.linspace(0, epsilon_c2, 100)
696
+
697
+ sigma_c_list = self.Nonlinear_Material_Law(epsilon_c_list)[2]
698
+
699
+ x_list = np.linspace(0, x, 100)
700
+
701
+ if abs(N_Rd_D - self.NEd_GZT) > 1e-1:
702
+ epsilon_s1 += 1e-4
703
+ else:
704
+ epsilon_s1 += 1e-5
705
+
706
+ print("epsilon s2", epsilon_s2)
707
+
708
+ epsilon_s2 = epsilon_c2 + (epsilon_c2 - epsilon_s1) / (self.d) * (self.d_s2)
709
+
710
+ x = epsilon_c2 / (epsilon_c2 - epsilon_s1) * self.d
711
+
712
+ N_cRd_D = np.trapz(sigma_c_list, x_list) * self.b_c * (-1)
713
+ if abs(epsilon_s2) <= 2.174e-3:
714
+ N_s2_Rd_D = epsilon_s2 * self.A_s2 * self.Baustoff.Es
715
+ else:
716
+ N_s2_Rd_D = -self.A_s2 * self.Baustoff.fyd
717
+ if abs(epsilon_s1) <= 2.174e-3:
718
+ N_s1_Rd_D = epsilon_s1 * self.A_s1 * self.Baustoff.Es
719
+ else:
720
+ N_s1_Rd_D = self.Baustoff.fyd * self.A_s1
721
+
722
+ N_Rd_D = N_cRd_D + N_s2_Rd_D + N_s1_Rd_D
723
+
724
+ print("N_D", N_cRd_D)
725
+ print("NDs2", N_s2_Rd_D)
726
+ print("NDs1", N_s1_Rd_D)
727
+
728
+ print("NDRd", N_Rd_D)
729
+
730
+ print("NEd", self.NEd_GZT)
731
+
732
+ print(N_Rd_D > self.NEd_GZT)
733
+
734
+ print(epsilon_c2)
735
+
736
+ # Berechnung des Abstands der Druckresultierenden von DNL
737
+
738
+ dx = x_list[1] - x_list[0]
739
+
740
+ # Berechnung der Fläche unter der Kurve (Flächenmoment 0. Grades)
741
+ A = np.sum(sigma_c_list * dx)
742
+
743
+ # Berechnung des 1. Flächenmoments um den Ursprung
744
+ S = np.sum(sigma_c_list * x_list * dx)
745
+
746
+ # Berechnung des Schwerpunkts
747
+ a = S / A
748
+
749
+ iter += 1
750
+
751
+ print("a", a)
752
+ print("x", x)
753
+
754
+ self.M_D = (
755
+ abs(N_cRd_D) * (self.z_cu - x + a)
756
+ + abs(N_s2_Rd_D) * (self.z_cu - self.d_s2)
757
+ + abs(N_s1_Rd_D) * (self.z_co - self.d_s1)
758
+ )
759
+
760
+ print(self.M_D)
761
+
762
+ self.kappa_D = (epsilon_s1 - epsilon_c2) / self.d
763
+
764
+ self.results_D.append(("M_D", self.M_D))
765
+ self.results_D.append(("Kappa_D", self.kappa_D))
766
+
767
+ def Point_D_Iterative(self):
768
+ print("Point D Iterative")
769
+
770
+ def Interpolation_Function(self, _M_Value):
771
+ if self.kappa_B == None or round(self.A_s2, 0) == 0:
772
+ try:
773
+ kappa = [0, self.kappa_A, self.kappa_C, self.kappa_D]
774
+ M = [0, self.M_A, self.M_C, self.M_D]
775
+ except:
776
+ kappa = [0, self.kappa_A, self.kappa_C]
777
+ M = [0, self.M_A, self.M_C]
778
+ else:
779
+ try:
780
+ kappa = [0, self.kappa_A, self.kappa_B, self.kappa_C]
781
+ M = [0, self.M_A, self.M_B, self.M_C]
782
+ except:
783
+ kappa = [0, self.kappa_A, self.kappa_B, self.kappa_C]
784
+ M = [0, self.M_A, self.M_B, self.M_C]
785
+
786
+ moment_to_kappa_function = interp1d(M, kappa, kind="linear")
787
+
788
+ # Gegebenen Momentenwert, für den du den kappa-Wert finden möchtest
789
+ M_value = _M_Value # Beispielwert für das Moment
790
+
791
+ # Berechne den zugehörigen kappa-Wert
792
+ kappa_value = moment_to_kappa_function(M_value)
793
+
794
+ # Einzelwert ausgeben
795
+ # print(f"Der zugehörige kappa-Wert für M = {M_value} ist kappa = {kappa_value}")
796
+
797
+ # Plot der Original-Stützpunkte und der interpolierten Werte
798
+ kappa_new = np.linspace(min(kappa), max(kappa), 100)
799
+ M_interpolated = interp1d(kappa, M, kind="linear")(
800
+ kappa_new
801
+ ) # Interpolierte Momentenwerte
802
+
803
+
804
+ return kappa_value, M_value, kappa,kappa_new,M_interpolated,M
805
+
806
+
807
+
808
+ def Plot_Interpolation_M_Kappa(self, kappa_value, M_value, kappa,kappa_new,M_interpolated,M):
809
+ plt.plot(kappa, M, "o", label="Stützpunkte") # Original-Stützpunkte
810
+ plt.plot(
811
+ kappa_new, M_interpolated, "-", label="Interpolierte Werte"
812
+ ) # Interpolierte Werte
813
+
814
+ # Einzelnen interpolierten Punkt für den Momentenwert markieren
815
+ plt.plot(kappa_value, M_value, "ro", label=f"kappa-Wert bei M={M_value:.2f}")
816
+ plt.text(
817
+ kappa_value,
818
+ M_value,
819
+ f"kappa = {kappa_value:.2e}, M = {M_value:.2f} ",
820
+ color="red",
821
+ verticalalignment="bottom",
822
+ )
823
+
824
+ # Legende und Plot anzeigen
825
+
826
+ plt.legend()
827
+ plt.show(block=False) # block=False sorgt dafür, dass das Skript nicht anhält
828
+
829
+ # 3 Sekunden warten
830
+ plt.pause(5)
831
+
832
+ # Fenster schließen
833
+ plt.close()
834
+
835
+ def results_to_latex_table(self, results, headers, caption):
836
+ # Initialisiere LaTeX-Code mit Table- und Tabular-Umgebung
837
+ latex_code = (
838
+ "\\begin{table}[htbp]\n\\centering\n\\begin{tabular}{|"
839
+ + "|".join(["c"] * len(headers))
840
+ + "|}\n\\hline\n"
841
+ )
842
+
843
+ # Füge die Kopfzeile hinzu
844
+ latex_code += " & ".join(headers) + " \\\\ \\hline\n"
845
+
846
+ # Füge die Datenzeilen hinzu
847
+ for result in results:
848
+ # Überprüfen, ob alle Werte in der Zeile numerisch sind, bevor sie formatiert werden
849
+ formatted_result = []
850
+ for val in result:
851
+ if isinstance(val, float):
852
+ formatted_result.append(f"{val:.4f}")
853
+ else:
854
+ formatted_result.append(str(val))
855
+
856
+ latex_code += " & ".join(formatted_result) + " \\\\ \\hline\n"
857
+
858
+ # Schließe die Tabular- und Table-Umgebung
859
+ latex_code += "\\end{tabular}\n\\caption{" + caption + "}\n\\end{table}\n"
860
+
861
+ return latex_code
862
+
863
+ def generate_latex_plot(
864
+ self,
865
+ data_x,
866
+ data_y,
867
+ xlabel="x",
868
+ ylabel="y",
869
+ plot_title="Plot Title",
870
+ plot_style="thick,blue",
871
+ caption="Plot caption",
872
+ connect_points=True,
873
+ ):
874
+ # Start des LaTeX-Codes
875
+ latex_code = "\\begin{figure}[htbp]\n\\centering\n"
876
+
877
+ # pgfplots Umgebung
878
+ latex_code += "\\begin{tikzpicture}\n\\begin{axis}[\n"
879
+ latex_code += f"title={{{plot_title}}},\n"
880
+ latex_code += f"xlabel={{{xlabel}}},\n"
881
+ latex_code += f"ylabel={{{ylabel}}},\n"
882
+ latex_code += "grid=major,\n]\n"
883
+
884
+ # Plotdaten
885
+ plot_option = plot_style
886
+ if connect_points:
887
+ plot_option += ",sharp plot"
888
+
889
+ latex_code += f"\\addplot[{plot_option}] coordinates {{\n"
890
+ for x, y in zip(data_x, data_y):
891
+ latex_code += f"({x},{y})\n"
892
+ latex_code += "};\n"
893
+
894
+ # Ende der pgfplots Umgebung
895
+ latex_code += "\\end{axis}\n\\end{tikzpicture}\n"
896
+
897
+ # Caption und Ende der Figure-Umgebung
898
+ latex_code += f"\\caption{{{caption}}}\n"
899
+ latex_code += "\\end{figure}\n"
900
+
901
+ return latex_code
902
+
903
+
904
+ # Baumgart = M_Kappa_Cross_Section()
905
+
906
+ # print(Baumgart.section_width_list)
907
+
908
+ # Baumgart.PlotCrossSection()
909
+
910
+ # Baumgart.Interpolation_Function(0.20)
911
+
912
+
913
+ # # Erzeuge das LaTeX-Diagramm mit den korrekten Daten
914
+ # latex_code = Baumgart.generate_latex_plot(data_x=kappa, data_y=M)
915
+
916
+ # Image = Baumgart.generate_latex_plot(kappa, M)
917
+
918
+ # plt.plot(kappa,M)
919
+
920
+
921
+ # # Speicher den LaTeX-Code in einer .tex-Datei
922
+ # with open("Output/Baumgart.tex", "w") as tex_file:
923
+ # tex_file.write(Image )
924
+
925
+