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,635 @@
1
+ import numpy as np
2
+ from scipy.integrate import simpson as simps
3
+ import math
4
+
5
+
6
+ class BeamRectangular:
7
+ def __init__(self, index, width, height):
8
+ self.index = index
9
+ self.width = width
10
+ self.height = height
11
+ self.cross_section_area = width * height
12
+ self.center_of_gravity = height / 2
13
+ self.cross_section_inertia = (width * height**3) / 12
14
+
15
+ # Check if the beam is suitable for the bending calculation DIN EN 1992-1-1
16
+ def check_if_beam_is_suitable_for_bending_calc(self, ed_i):
17
+ check = ed_i / self.height
18
+ return check
19
+
20
+ # Bending Calculation after DIN EN 1992-1-1
21
+ def calculate_beam_section(
22
+ self, beam_sub_section, strength_of_concrete, tensile_yield_strength, nu_limit
23
+ ):
24
+ M = beam_sub_section.moment_ed # Mnm
25
+ N_f = beam_sub_section.normal_force_ed # Mn
26
+
27
+ Mrds = 0
28
+ Meds = 0
29
+ Meds_lim = 0
30
+
31
+ nu_eds = 0
32
+ nu_eds_grenz = nu_limit # 0.371 # 0.296
33
+
34
+ fcd = strength_of_concrete # N/mm²
35
+ fyd = tensile_yield_strength # MN/m²
36
+ E = beam_sub_section.elasticity_modulus_steel # MN/m²
37
+ fck = (fcd * 1.5) / 0.85
38
+ fctm = 0.3 * fck ** (2 / 3)
39
+ fyk = fyd * 1.15
40
+
41
+ epssyd = (fyd / E) * 1000
42
+
43
+ As1erf = 0 # cm²
44
+ As2erf = 0 # cm² Druckbewehrung
45
+ # Geometrie
46
+ h = self.height # gesamt Höhe
47
+ b_w = self.width # Balkenbreite
48
+
49
+ zs1 = self.center_of_gravity # Schwerpunkt
50
+
51
+ d = beam_sub_section.effective_height
52
+ d2 = beam_sub_section.effective_height_pressure
53
+
54
+ # Startwerte der Dehnungen und Stauchungen
55
+ epss = 25
56
+ steal_strain_1 = 0 # Falls Druckbewehrung, hier die neue Stahldehnung
57
+ epss2 = 0
58
+ epsc = 0.0001 # Darf nicht 0 sein, da sonst Teilung durch 0 in der Berechnung der Schwerpunkte -> Start mit 0,001
59
+
60
+ epss_new = 0
61
+ epss_2_new = 0
62
+
63
+ num_iter = 0
64
+ num_iter_grenz = 30000
65
+
66
+ N = 50 # Numerische Integration der Spannungen ueber die Hoehe
67
+
68
+ xi = 0
69
+ x = 0
70
+ z = 0
71
+
72
+ # KENNWERTE
73
+ # Querschnittslängen
74
+ interval_start_1 = 0
75
+ interval_end_1 = 0
76
+ interval_start_2 = 0
77
+ interval_end_2 = 0
78
+ interval_start_3 = 0
79
+ interval_end_3 = 0
80
+ # Querschnittsbreiten
81
+ concrete_width_1 = 0
82
+ concrete_width_2 = 0
83
+ concrete_width_3 = 0
84
+ # Druckkräfte und Schwerpunkte
85
+ A_1 = 0
86
+ S_1 = 0
87
+ A_2 = 0
88
+ S_2 = 0
89
+ A_3 = 0
90
+ S_3 = 0
91
+ while Mrds <= abs(Meds) and num_iter < num_iter_grenz:
92
+ xi = epsc / (epsc + epss)
93
+ x = xi * d
94
+
95
+ # Stahl fließt nicht
96
+ if epss < epssyd:
97
+ sigma_s = E * epss * 0.001
98
+ # Stahl fließt
99
+ else:
100
+ sigma_s = fyd
101
+
102
+ # Feldmoment
103
+ if M >= 0:
104
+
105
+ # Grenzdehnung von 2 wird nicht erreicht
106
+ if 0 <= epsc < 2.0:
107
+ # Querschnittslängen Vergabe
108
+ interval_start_1 = 0
109
+ interval_end_1 = x
110
+ interval_start_2 = 0
111
+ interval_end_2 = 0
112
+ interval_start_3 = 0
113
+ interval_end_3 = 0
114
+ # Querschnittsbreiten Vergabe
115
+ concrete_width_1 = b_w
116
+ concrete_width_2 = 0
117
+ concrete_width_3 = 0
118
+ # Grenzdehnung von 2 wird erreicht
119
+ elif epsc >= 2.0:
120
+ # Querschnittslängen Vergabe
121
+ interval_start_1 = 0
122
+ interval_end_1 = (
123
+ 2 / epsc * x
124
+ ) # 2 = Dehnung beim Erreichen der Druckfestigkeit
125
+ interval_start_2 = 2 / epsc * x
126
+ interval_end_2 = x
127
+ interval_start_3 = 0
128
+ interval_end_3 = 0
129
+ # Querschnittsbreiten Vergabe
130
+ concrete_width_1 = b_w
131
+ concrete_width_2 = b_w
132
+ concrete_width_3 = 0
133
+
134
+ # Abgrenzen der einzlnen Bereichsunterschiede
135
+ x1 = np.linspace(interval_start_1, interval_end_1, N)
136
+ x2 = np.linspace(interval_start_2, interval_end_2, N)
137
+ x3 = np.linspace(interval_start_3, interval_end_3, N)
138
+
139
+ # Definition der Spannungsfunktionen
140
+ y1 = []
141
+ y2 = []
142
+ y3 = []
143
+ # Grenzdehnung von 2 wird nicht erreicht
144
+ if 0 <= epsc < 2.0:
145
+ y1_list_with_all_sigma_c_values_promille = []
146
+ for i in range(N):
147
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2)
148
+
149
+ y1_list_with_all_sigma_c_values_promille.append(sigma_c)
150
+
151
+ y1_values = y1_list_with_all_sigma_c_values_promille
152
+ y2_values = fcd * np.zeros(N)
153
+ y3_values = fcd * np.zeros(N)
154
+
155
+ y1.append(y1_values)
156
+ y2.append(y2_values)
157
+ y3.append(y3_values)
158
+ # Grenzdehnung von 2 wird erreicht
159
+ elif epsc >= 2.0:
160
+ y1_list_with_all_sigma_c_values_upto_2_promille = []
161
+ for i in range(N):
162
+ sigma_c = fcd * (
163
+ 1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2
164
+ ) # Sigma c-Werte bis zum Erreichen der Druckfestigkeit -> Betondehnung = 2
165
+
166
+ y1_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c)
167
+
168
+ y1_values = y1_list_with_all_sigma_c_values_upto_2_promille # sigma_concrete_at_given_intervals(x1)
169
+ y2_values = fcd * np.ones(N)
170
+ y3_values = fcd * np.zeros(N)
171
+
172
+ y1.append(y1_values)
173
+ y2.append(y2_values)
174
+ y3.append(y3_values)
175
+
176
+ # Integration der einzelnen Spannungsfunktionen
177
+ if 0 <= epsc < 2.0:
178
+ M_1 = simps(y1 * x1, x=x1)
179
+ A_1 = simps(y1, x=x1)
180
+ S_1 = M_1 / A_1
181
+
182
+ elif epsc >= 2.0:
183
+ M_1 = simps(y1 * x1, x=x1) # moment 1
184
+ A_1 = simps(y1, x = x1) # pressure force 1
185
+ S_1 = M_1 / A_1 # centroid of area 1
186
+
187
+ M_2 = simps(y2 * x2, x=x2)
188
+ A_2 = simps(y2, x=x2)
189
+ S_2 = M_2 / A_2
190
+
191
+ # concrete pressure
192
+ Fc_1 = A_1 * concrete_width_1
193
+ Fc_2 = A_2 * concrete_width_2
194
+ Fc_3 = 0
195
+
196
+ # centroid of compressive stress in concrete
197
+ S_ges = (S_1 * Fc_1 + S_2 * Fc_2 + S_3 * Fc_3) / (
198
+ Fc_1 + Fc_2 + Fc_3
199
+ ) # Bei der Berechnung der Gesamtschwerpunkte der Druckkraefte muss die Querschnittsbreite der einzelnen Querschnitte einfliessen
200
+ z = S_ges + d - x # Innerer Hebelarm
201
+
202
+ Meds = abs(M - N_f * (d - zs1))
203
+ Mrds = (Fc_1 + Fc_2 + Fc_3) * z
204
+
205
+ nu_eds = Meds / (b_w * (d**2) * fcd)
206
+ if nu_eds_grenz <= nu_eds:
207
+ Meds_lim = nu_eds_grenz * b_w * (d**2) * fcd
208
+
209
+ zeta_lim = 0
210
+ concrete_strain_2 = 3.5
211
+ if nu_eds_grenz == 0.296:
212
+ zeta_lim = 0.813
213
+ steal_strain_1 = 4.28
214
+ elif nu_eds_grenz == 0.371:
215
+ zeta_lim = 0.743
216
+ steal_strain_1 = 2.174
217
+
218
+ # epss2 = ((x - d2) / x) * abs(-3.5)
219
+ epss2 = ((steal_strain_1 + concrete_strain_2) / d) * (
220
+ d - d2
221
+ ) - steal_strain_1
222
+
223
+ sigma_s_2 = 0
224
+ if epssyd <= epss2:
225
+ sigma_s_2 = fyd
226
+ elif epss2 < epssyd:
227
+ sigma_s_2 = fyd * (epss / epssyd)
228
+
229
+ z_nu_eds_grenz = zeta_lim * d
230
+
231
+ delta_Med = abs(M) - Meds_lim
232
+ As1erf_nu_lim = (
233
+ (1 / fyd) * (Meds_lim / z_nu_eds_grenz + N_f) * 100**2
234
+ )
235
+ As2erf = (1 / sigma_s_2) * (delta_Med / (d - d2)) * 100**2
236
+ As1erf = As1erf_nu_lim + As2erf
237
+ else:
238
+ As1erf = (1 / sigma_s) * (Fc_1 + Fc_2 + Fc_3 + N_f) * 100**2
239
+
240
+ if 0 <= epsc < 3.5:
241
+ epsc += 0.001
242
+
243
+ else:
244
+ epss -= 0.001
245
+
246
+ num_iter += 1
247
+ # Stützmoment
248
+ elif 0 > M:
249
+
250
+ # Grenzdehnung von 2 wird nicht erreicht
251
+ if 0 <= epsc < 2.0:
252
+ # Querschnittslängen Vergabe
253
+ interval_start_1 = 0
254
+ interval_end_1 = x
255
+ interval_start_2 = 0
256
+ interval_end_2 = 0
257
+ interval_start_3 = 0
258
+ interval_end_3 = 0
259
+ # Querschnittsbreiten Vergabe
260
+ concrete_width_1 = b_w
261
+ concrete_width_2 = 0
262
+ concrete_width_3 = 0
263
+ # Grenzdehnung von 2 wird erreicht
264
+ elif epsc >= 2.0:
265
+ # Querschnittslängen Vergabe
266
+ interval_start_1 = 0
267
+ interval_end_1 = (
268
+ 2 / epsc * x
269
+ ) # 2 = Dehnung beim Erreichen der Druckfestigkeit
270
+ interval_start_2 = 2 / epsc * x
271
+ interval_end_2 = x
272
+ interval_start_3 = 0
273
+ interval_end_3 = 0
274
+ # Querschnittsbreiten Vergabe
275
+ concrete_width_1 = b_w
276
+ concrete_width_2 = b_w
277
+ concrete_width_3 = 0
278
+
279
+ # Abgrenzen der einzlnen Bereichsunterschiede
280
+ x1 = np.linspace(interval_start_1, interval_end_1, N)
281
+ x2 = np.linspace(interval_start_2, interval_end_2, N)
282
+ x3 = np.linspace(interval_start_3, interval_end_3, N)
283
+
284
+ # Definition der Spannungsfunktionen
285
+ y1 = []
286
+ y2 = []
287
+ y3 = []
288
+ # Grenzdehnung von 2 wird nicht erreicht
289
+ if 0 <= epsc < 2.0:
290
+ y1_list_with_all_sigma_c_values_promille = []
291
+ for i in range(N):
292
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2)
293
+
294
+ y1_list_with_all_sigma_c_values_promille.append(sigma_c)
295
+
296
+ y1_values = y1_list_with_all_sigma_c_values_promille
297
+ y2_values = fcd * np.zeros(N)
298
+ y3_values = fcd * np.zeros(N)
299
+
300
+ y1.append(y1_values)
301
+ y2.append(y2_values)
302
+ y3.append(y3_values)
303
+ # Grenzdehnung von 2 wird erreicht
304
+ elif epsc >= 2.0:
305
+ y1_list_with_all_sigma_c_values_upto_2_promille = []
306
+ for i in range(N):
307
+ sigma_c = fcd * (
308
+ 1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2
309
+ ) # Sigma c-Werte bis zum Erreichen der Druckfestigkeit -> Betondehnung = 2
310
+
311
+ y1_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c)
312
+
313
+ y1_values = y1_list_with_all_sigma_c_values_upto_2_promille # sigma_concrete_at_given_intervals(x1)
314
+ y2_values = fcd * np.ones(N)
315
+ y3_values = fcd * np.zeros(N)
316
+
317
+ y1.append(y1_values)
318
+ y2.append(y2_values)
319
+ y3.append(y3_values)
320
+
321
+ # Integration der einzelnen Spannungsfunktionen
322
+ if 0 <= epsc < 2.0:
323
+ M_1 = simps(y1 * x1, x=x1)
324
+ A_1 = simps(y1, x=x1)
325
+ S_1 = M_1 / A_1
326
+
327
+ elif epsc >= 2.0:
328
+ M_1 = simps(y1 * x1, x=x1) # moment 1
329
+ A_1 = simps(y1, x=x1) # pressure force 1
330
+ S_1 = M_1 / A_1 # centroid of area 1
331
+
332
+ M_2 = simps(y2 * x2, x=x2)
333
+ A_2 = simps(y2, x=x2)
334
+ S_2 = M_2 / A_2
335
+
336
+ # concrete pressure
337
+ Fc_1 = A_1 * concrete_width_1
338
+ Fc_2 = A_2 * concrete_width_2
339
+ Fc_3 = 0
340
+
341
+ # centroid of compressive stress in concrete
342
+ S_ges = (S_1 * Fc_1 + S_2 * Fc_2 + S_3 * Fc_3) / (
343
+ Fc_1 + Fc_2 + Fc_3
344
+ ) # Bei der Berechnung der Gesamtschwerpunkte der Druckkraefte muss die Querschnittsbreite der einzelnen Querschnitte einfliessen
345
+ z = S_ges + d - x # Innerer Hebelarm
346
+
347
+ Meds = abs(M - N_f * (zs1 - (h - d)))
348
+ Mrds = (Fc_1 + Fc_2 + Fc_3) * z
349
+
350
+ nu_eds = Meds / (b_w * (d**2) * fcd)
351
+ if nu_eds_grenz <= nu_eds:
352
+ Meds_lim = nu_eds_grenz * b_w * (d**2) * fcd
353
+
354
+ zeta_lim = 0
355
+ concrete_strain_2 = 3.5
356
+ if nu_eds_grenz == 0.296:
357
+ zeta_lim = 0.813
358
+ steal_strain_1 = 4.28
359
+ elif nu_eds_grenz == 0.371:
360
+ zeta_lim = 0.743
361
+ steal_strain_1 = 2.174
362
+
363
+ # epss2 = ((x - d2) / x) * abs(-3.5)
364
+ epss2 = ((steal_strain_1 + concrete_strain_2) / d) * (
365
+ d - d2
366
+ ) - steal_strain_1
367
+
368
+ sigma_s_2 = 0
369
+ if epssyd <= epss2:
370
+ sigma_s_2 = fyd
371
+ elif epss2 < epssyd:
372
+ sigma_s_2 = fyd * (epss / epssyd)
373
+
374
+ z_nu_eds_grenz = zeta_lim * d
375
+
376
+ delta_Med = abs(M) - Meds_lim
377
+ As1erf_nu_lim = (
378
+ (1 / fyd) * (Meds_lim / z_nu_eds_grenz + N_f) * 100**2
379
+ )
380
+ As2erf = (1 / sigma_s_2) * (delta_Med / (d - d2)) * 100**2
381
+ As1erf = As1erf_nu_lim + As2erf
382
+ else:
383
+ As1erf = (1 / sigma_s) * (Fc_1 + Fc_2 + Fc_3 + N_f) * 100**2
384
+
385
+ if 0 <= epsc < 3.5:
386
+ epsc += 0.001
387
+ else:
388
+ epss -= 0.001
389
+
390
+ num_iter += 1
391
+
392
+ else:
393
+ print("Limit reached!")
394
+ break
395
+
396
+ # DIN 1045-1:2008-08
397
+ amax = 0
398
+ a1 = self.center_of_gravity
399
+ a2 = h - self.center_of_gravity
400
+ if a1 > a2:
401
+ amax = a1 * 100
402
+ else:
403
+ amax = a2 * 100
404
+ Wc = (self.cross_section_inertia * 100 * 100 * 100 * 100) / amax
405
+ Asmin = ((fctm * 10**2) * Wc) / (fyk * 10**2 * (d * 0.9) * 100)
406
+
407
+ needed_reinforcement = []
408
+ if Asmin < As1erf:
409
+ print("Iteration steps: ", num_iter)
410
+ print("Med: ", np.around(M, 3), "MN")
411
+ print("Ned: ", np.around(N_f, 3), "MN")
412
+ print("Affecting moment: ", np.around(Meds, 3), "MN")
413
+ print("Marginal moment: ", np.around(Meds_lim, 3), "MN")
414
+ print("Modulus of section : ", np.around(Mrds, 3), "MN")
415
+ print("Required bending reinforcement: ", np.around(As1erf, 3), "cm²")
416
+ if As2erf != 0:
417
+ print(
418
+ "Required compressive reinforcement : ", np.around(As2erf, 3), "cm²"
419
+ )
420
+ print("Pressure zone height x = ", np.around(x, 3), "m")
421
+ print("Retrieved pressure zone ξ = ", np.around(xi, 3))
422
+ print("Edge concrete compression εc = ", np.around(epsc, 3), "‰")
423
+ if epss >= 2.17:
424
+ print(
425
+ "Steel strain of bending reinforcement εs: Yield strength is reached."
426
+ )
427
+ if As2erf != 0:
428
+ print("εs = ", np.around(steal_strain_1, 3), "‰")
429
+ else:
430
+ print("εs = ", np.around(epss, 3), "‰")
431
+ else:
432
+ if As2erf != 0:
433
+ print(
434
+ "Steel strain of bending reinforcement εs: Yield strength is reached."
435
+ )
436
+ print("εs = ", np.around(steal_strain_1, 3), "‰")
437
+ else:
438
+ print(
439
+ "Steel strain of bending reinforcement εs: Yield strength is not reached."
440
+ )
441
+ print("εs = ", np.around(epss, 3), "‰")
442
+
443
+ if As2erf != 0:
444
+ if As2erf != 0:
445
+ print(
446
+ "Steel strain of compressive reinforcement εs2: Yield strength is reached."
447
+ )
448
+ print("εs2 = ", np.around(epss2, 3), "‰")
449
+ else:
450
+ print(
451
+ "Steel strain of compressive reinforcement εs2: Yield strength is not reached."
452
+ )
453
+ print("εs2 = ", np.around(epss2, 3), "‰")
454
+
455
+ print("Inner lever arm z = ", np.around(z, 3), "m")
456
+
457
+ reinforcement = [float(As1erf), float(As2erf)]
458
+ needed_reinforcement.append(reinforcement)
459
+ else:
460
+ print("Minimum reinforcement is dominant!")
461
+ print("Required bending reinforcement: ", np.around(Asmin, 3), "cm²")
462
+ reinforcement = [float(Asmin), float(0.0)]
463
+ needed_reinforcement.append(reinforcement)
464
+
465
+ return needed_reinforcement
466
+
467
+ def calculate_beam_section_without_shearreinforcement(
468
+ self, beam_sub_section, as1, strength_of_concrete, tensile_yield_strength
469
+ ):
470
+ """
471
+ Function to calculate the resistance of a rectangular cross section without
472
+ a shear reinformcent (e.g. plates) \n
473
+
474
+ Args:
475
+ beam_sub_section (_type_): _description_
476
+ as1 (_type_): Biegezugbewehrung in [m**2]
477
+ strength_of_concrete (_type_): _description_
478
+ tensile_yield_strength (_type_): _description_
479
+ """
480
+ Ved = beam_sub_section.shear_force_ed
481
+ Vedr = abs(Ved) # reduzierte Querkraft, da direkte Lagerung
482
+ N_f = beam_sub_section.normal_force_ed # Normalkraft mit üblicher Vorzeichenkonvention
483
+
484
+ A = self.cross_section_area # QS-Fläche
485
+
486
+ h = self.height
487
+ b = self.width # kleinste QS-breite -> bw aus Biegebemessung
488
+
489
+ d1 = beam_sub_section.effective_height_pressure # cnom + dsl*0.5
490
+ self.d = h - d1
491
+ self.z = 0.9 * self.d
492
+
493
+ fcd = strength_of_concrete # N/mm²
494
+ fck = (fcd * 1.5) / 0.85
495
+ fctm = 0.3 * fck ** (2 / 3)
496
+ yc = 1.5
497
+
498
+ fyd = tensile_yield_strength # MN/m²
499
+ fyk = fyd * 1.15
500
+
501
+ rho_l = min(as1 / (b * self.d), 0.02) # Begrenzung auf 2 % Bewehrungsgrad (Anrechenbar)
502
+ k = min(1 + np.sqrt(200 / (self.d * 1000)), 2)
503
+
504
+ if (N_f < 0):
505
+ sigma_cd = min(abs(N_f) / A, 0.2 * fcd) # Druckspannungen positiv < 0.2 fcd
506
+ else:
507
+ sigma_cd = N_f / A # Zugspannungen negativ, keine Begrenzung im reinen Massivbau
508
+
509
+ self.v_rdcs = (
510
+ (0.15 / 1.5 * k * (100 * rho_l * fck) ** (1 / 3) + 0.12 * sigma_cd) * b * self.d
511
+ )
512
+
513
+ if self.d * 1000 < 600:
514
+ self.nu_rd_c_min = 0.0525 / 1.5 * k**1.5 * fck**0.5
515
+ elif 600 > self.d * 1000 and d * 1000 <= 800:
516
+ nu = 0.0525 - (0.0525 - 0.0375) / 200 * (d * 1000 - 600)
517
+ self.nu_rd_c_min = nu / 1.5 * k**1.5 * fck**0.5
518
+ elif self.d * 1000 > 800:
519
+ self.nu_rd_c_min = 0.0375 / 1.5 * k**1.5 * fck**0.5
520
+
521
+ self.v_rdcmin = (self.nu_rd_c_min + 0.12 * sigma_cd) * b * self.d
522
+
523
+ self.v_rdc = max(self.v_rdcmin, self.v_rdcs)
524
+
525
+ # Shear-Force Calculation after DIN EN 1992-1-1
526
+ def calculate_beam_section_stirrup(
527
+ self,
528
+ beam_sub_section,
529
+ strength_of_concrete,
530
+ tensile_yield_strength,
531
+ strut_angle_choice,
532
+ stirrup_angle
533
+ ):
534
+ Ved = beam_sub_section.shear_force_ed
535
+ Vedr = abs(Ved) # reduzierte Querkraft, da direkte Lagerung
536
+ N_f = beam_sub_section.normal_force_ed
537
+
538
+ A = self.cross_section_area # QS-Fläche
539
+
540
+ h = self.height
541
+ b = self.width # kleinste QS-breite -> bw aus Biegebemessung
542
+
543
+ d1 = beam_sub_section.effective_height_pressure # cnom + dsl*0.5
544
+ d = h - d1
545
+ z = 0.9 * d
546
+
547
+ fcd = strength_of_concrete # N/mm²
548
+ fck = (fcd * 1.5) / 0.85
549
+ fctm = 0.3 * fck ** (2 / 3)
550
+ yc = 1.5
551
+
552
+ fyd = tensile_yield_strength # MN/m²
553
+ fyk = fyd * 1.15
554
+
555
+ a_sw_correct = 0
556
+
557
+ # Berechnung des Druckstrebenwinkels
558
+ c = 0.5
559
+ sigma_cd = N_f / A
560
+ Vrd_cc = c * 0.48 * (fck ** (1 / 3)) * (1 - 1.2 * (sigma_cd / fcd)) * b * z
561
+
562
+ cot_teta = abs((1.2 + 1.4 * (sigma_cd / fcd)) / (1 - (Vrd_cc / Vedr)))
563
+ strut_angle = math.degrees(math.atan(1 / cot_teta))
564
+
565
+ if strut_angle_choice == 0:
566
+ if 1.0 <= cot_teta <= 1.75:
567
+ cot_teta = cot_teta
568
+ elif 1.75 < cot_teta:
569
+ cot_teta = 1.75
570
+ strut_angle = 18.43
571
+ elif 0 <= cot_teta < 1.0:
572
+ cot_teta = 1.0
573
+ strut_angle = 45
574
+ else:
575
+ if N_f > 0:
576
+ cot_teta = 1.0
577
+ strut_angle = 45
578
+ else:
579
+ cot_teta = 1.2
580
+ strut_angle = 40
581
+
582
+ # Nachweis der Druckstrebentragfähigkeit
583
+ alpha_cw = 1.0
584
+ v2 = 1.1 - (fck / 500)
585
+ v1 = 0.75 * v2
586
+ tan_teta = math.tan(math.radians(strut_angle))
587
+ Vrd_max = (alpha_cw * b * z * v1 * fcd) / ((tan_teta) + (cot_teta))
588
+ proof = abs(Vedr / Vrd_max)
589
+
590
+ # Ermittlung der stat. erforderlichen Bewehrung, für vertikale Bügel
591
+ a_sw = (Vedr / (z * fyd)) * tan_teta * 100**2
592
+
593
+ # Konstruktive Mindestbewehrung
594
+ a_sw_min = (
595
+ 0.16 * (fctm / fyk) * b * 1.0 * 100**2
596
+ ) # Mindestquerkraftbewehrung, vertikale Bügel
597
+
598
+ needed_reinforcement = []
599
+
600
+ if a_sw <= a_sw_min:
601
+ a_sw_correct = a_sw_min
602
+ else:
603
+ a_sw_correct = a_sw
604
+
605
+ if proof <= 1.0:
606
+ print(
607
+ "Proof that the strut sturdiness is complied = ",
608
+ np.around(proof, 3),
609
+ "%",
610
+ )
611
+ else:
612
+ print(
613
+ "Proof that the strut sturdiness is NOT complied = ",
614
+ np.around(proof, 3),
615
+ "%",
616
+ )
617
+
618
+ print("Compression strut angle = ", np.around(strut_angle, 2), "°")
619
+
620
+ if a_sw <= a_sw_min:
621
+ print(
622
+ "Minimum reinforcement is required for the shear force = ",
623
+ np.around(a_sw_correct, 3),
624
+ " cm²/m",
625
+ )
626
+ else:
627
+ print(
628
+ "Required shear force reinforcement = ",
629
+ np.around(a_sw_correct, 3),
630
+ " cm²/m",
631
+ )
632
+
633
+ needed_reinforcement.append(float(np.around(a_sw_correct, 3)))
634
+
635
+ return needed_reinforcement
@@ -0,0 +1,9 @@
1
+ class BeamSubSection:
2
+
3
+ def __init__(self, moment_ed, normal_force_ed, shear_force_ed, effective_height, effective_height_pressure, elasticity_modulus_steel):
4
+ self.moment_ed = moment_ed
5
+ self.normal_force_ed = normal_force_ed
6
+ self.shear_force_ed = shear_force_ed
7
+ self.effective_height = effective_height
8
+ self.effective_height_pressure = effective_height_pressure
9
+ self.elasticity_modulus_steel = elasticity_modulus_steel