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,915 @@
1
+ import numpy as np
2
+ from scipy.integrate import simpson as simps
3
+ import math
4
+
5
+
6
+ class BeamPlateTReverse:
7
+
8
+ def __init__(self, index, width_web, height, width_effective, height_plate):
9
+ self.index = index
10
+ self.width_web = width_web
11
+ self.height = height
12
+ self.width_effective = width_effective
13
+ self.height_plate = height_plate
14
+ self.cross_section_area = width_web * (height - height_plate) + height_plate * width_effective
15
+ self.center_of_gravity = ((height_plate*width_effective)*((height-height_plate)+height_plate/2)+(width_web*(height-height_plate))*((height-height_plate)/2))/((height_plate*width_effective)+(width_web*(height-height_plate)))
16
+ self.cross_section_inertia = (((width_effective*height_plate**3)/12)+(width_effective*height_plate) * ((height-(height_plate/2))-self.center_of_gravity)**2) + (((width_web*(height-height_plate)**3)/12) + (width_web*(height-height_plate))*((self.center_of_gravity-((height-height_plate)/2))**2))
17
+
18
+ def check_if_beam_is_suitable_for_bending_calc(self, ed_i):
19
+ check = ed_i/self.height
20
+ return check
21
+
22
+ def calculate_beam_section(self, beam_sub_section, strength_of_concrete, tensile_yield_strength, nu_limit):
23
+ # _____________________ Center of a composite function - Bending design for reinforced concrete _________________________________________#
24
+ M = beam_sub_section.moment_ed / 1000000 # Mnm
25
+ N_f = beam_sub_section.normal_force_ed / 1000000 # 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
+ Asmin = 0 # cm² Mindestbewehrung
46
+
47
+ # Geometrie
48
+ h = self.height # gesamt Höhe
49
+ b_eff = self.width_effective # effective Breite
50
+ b_w = self.width_web # Stegbreite
51
+ h_f = self.height_plate # Plattenbalkenhöhe
52
+
53
+ zs1 = self.center_of_gravity # Schwerpunkt
54
+
55
+ d = beam_sub_section.effective_height
56
+ d2 = beam_sub_section.effective_height_pressure
57
+
58
+ # Startwerte der Dehnungen und Stauchungen
59
+ epss = 25
60
+ steal_strain_1 = 0 # Falls Druckbewehrung, hier die neue Stahldehnung
61
+ epss2 = 0
62
+ epsc = 0.0001 # Darf nicht 0 sein, da sonst Teilung durch 0 in der Berechnung der Schwerpunkte -> Start mit 0,001
63
+
64
+ epss_new = 0
65
+ epss_2_new = 0
66
+
67
+ num_iter = 0
68
+ num_iter_grenz = 30000
69
+
70
+ N = 50 # Numerische Integration der Spannungen ueber die Hoehe
71
+
72
+ xi = 0
73
+ x = 0
74
+ z = 0
75
+
76
+ # KENNWERTE
77
+ # Querschnittslängen
78
+ interval_start_1 = 0
79
+ interval_end_1 = 0
80
+ interval_start_2 = 0
81
+ interval_end_2 = 0
82
+ interval_start_3 = 0
83
+ interval_end_3 = 0
84
+ # Querschnittsbreiten
85
+ concrete_width_1 = 0
86
+ concrete_width_2 = 0
87
+ concrete_width_3 = 0
88
+ # Druckkräfte und Schwerpunkte
89
+ A_1 = 0
90
+ S_1 = 0
91
+ A_2 = 0
92
+ S_2 = 0
93
+ A_3 = 0
94
+ S_3 = 0
95
+ while (Mrds <= abs(Meds) and num_iter < num_iter_grenz):
96
+ xi = epsc / (epsc + epss)
97
+ x = xi * d
98
+
99
+ # Stahl fließt nicht
100
+ if epss < epssyd:
101
+ sigma_s = E * epss * 0.001
102
+ # Stahl fließt
103
+ else:
104
+ sigma_s = fyd
105
+
106
+ # Feldmoment
107
+ if M >= 0:
108
+ # Druckzone liegt im Steg -> Nullline im Steg
109
+ if (x <= (h - h_f)):
110
+
111
+ # Grenzdehnung von 2 wird nicht erreicht
112
+ if (0 <= epsc < 2.0):
113
+ # Querschnittslängen Vergabe
114
+ interval_start_1 = 0
115
+ interval_end_1 = x
116
+ interval_start_2 = 0
117
+ interval_end_2 = 0
118
+ interval_start_3 = 0
119
+ interval_end_3 = 0
120
+ # Querschnittsbreiten Vergabe
121
+ concrete_width_1 = b_w
122
+ concrete_width_2 = 0
123
+ concrete_width_3 = 0
124
+ # Grenzdehnung von 2 wird im Steg erreicht
125
+ elif (2 / epsc * x <= (h - h_f)):
126
+ # Querschnittslängen Vergabe
127
+ interval_start_1 = 0
128
+ interval_end_1 = 2 / epsc * x # 2 = Dehnung beim Erreichen der Druckfestigkeit
129
+ interval_start_2 = 2 / epsc * x
130
+ interval_end_2 = x
131
+ interval_start_3 = 0
132
+ interval_end_3 = 0
133
+ # Querschnittsbreiten Vergabe
134
+ concrete_width_1 = b_w
135
+ concrete_width_2 = b_w
136
+ concrete_width_3 = 0
137
+
138
+ # Abgrenzen der einzlnen Bereichsunterschiede
139
+ x1 = np.linspace(interval_start_1, interval_end_1, N)
140
+ x2 = np.linspace(interval_start_2, interval_end_2, N)
141
+ x3 = np.linspace(interval_start_3, interval_end_3, N)
142
+
143
+ # Definition der Spannungsfunktionen
144
+ y1 = []
145
+ y2 = []
146
+ y3 = []
147
+ # Grenzdehnung von 2 wird nicht erreicht
148
+ if (0 <= epsc < 2.0):
149
+ y1_list_with_all_sigma_c_values_promille = []
150
+ for i in range(N):
151
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2)
152
+
153
+ y1_list_with_all_sigma_c_values_promille.append(sigma_c)
154
+
155
+ y1_values = y1_list_with_all_sigma_c_values_promille
156
+ y2_values = fcd * np.zeros(N)
157
+ y3_values = fcd * np.zeros(N)
158
+
159
+ y1.append(y1_values)
160
+ y2.append(y2_values)
161
+ y3.append(y3_values)
162
+ # Grenzdehnung von 2 wird im Steg erreicht
163
+ elif (2 / epsc * x <= (h - h_f)):
164
+ y1_list_with_all_sigma_c_values_upto_2_promille = []
165
+ for i in range(N):
166
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (
167
+ x * 2))) ** 2) # Sigma c-Werte bis zum Erreichen der Druckfestigkeit -> Betondehnung = 2
168
+
169
+ y1_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c)
170
+
171
+ y1_values = y1_list_with_all_sigma_c_values_upto_2_promille # sigma_concrete_at_given_intervals(x1)
172
+ y2_values = fcd * np.ones(N)
173
+ y3_values = fcd * np.ones(N)
174
+
175
+ y1.append(y1_values)
176
+ y2.append(y2_values)
177
+ y3.append(y3_values)
178
+
179
+ # Integration der einzelnen Spannungsfunktionen
180
+ if (0 <= epsc < 2.0):
181
+ M_1 = simps(y1 * x1, x = x1)
182
+ A_1 = simps(y1, x = x1)
183
+ S_1 = M_1 / A_1
184
+
185
+ elif (2 / epsc * x <= (h - h_f)):
186
+ M_1 = simps(y1 * x1, x = x1) # moment 1
187
+ A_1 = simps(y1, x = x1) # pressure force 1
188
+ S_1 = M_1 / A_1 # centroid of area 1
189
+
190
+ M_2 = simps(y2 * x2, x = x2)
191
+ A_2 = simps(y2, x = x2)
192
+ S_2 = M_2 / A_2
193
+
194
+ # concrete pressure
195
+ Fc_1 = A_1 * concrete_width_1
196
+ Fc_2 = A_2 * concrete_width_2
197
+ Fc_3 = 0
198
+
199
+ # centroid of compressive stress in concrete
200
+ S_ges = (S_1 * Fc_1 + S_2 * Fc_2 + S_3 * Fc_3) / (
201
+ Fc_1 + Fc_2 + Fc_3) # Bei der Berechnung der Gesamtschwerpunkte der Druckkraefte muss die Querschnittsbreite der einzelnen Querschnitte einfliessen
202
+ z = S_ges + d - x # Innerer Hebelarm
203
+
204
+ Meds = abs(M - N_f * (d - zs1))
205
+ Mrds = (Fc_1 + Fc_2 + Fc_3) * z
206
+
207
+ nu_eds = Meds / (b_w * (d ** 2) * fcd)
208
+ if nu_eds_grenz <= nu_eds:
209
+ Meds_lim = nu_eds_grenz * b_w * (d ** 2) * fcd
210
+
211
+ zeta_lim = 0
212
+ concrete_strain_2 = 3.5
213
+ if nu_eds_grenz == 0.296:
214
+ zeta_lim = 0.813
215
+ steal_strain_1 = 4.28
216
+ elif nu_eds_grenz == 0.371:
217
+ zeta_lim = 0.743
218
+ steal_strain_1 = 2.174
219
+
220
+ #epss2 = ((x - d2) / x) * abs(-3.5)
221
+ epss2 = ((steal_strain_1 + concrete_strain_2) / d) * (d - d2) - 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 = (1 / fyd) * (Meds_lim / z_nu_eds_grenz + N_f) * 100 ** 2
233
+ As2erf = (1 / sigma_s_2) * (delta_Med / (d - d2)) * 100 ** 2
234
+ As1erf = As1erf_nu_lim + As2erf
235
+ else:
236
+ As1erf = (1 / sigma_s) * (Fc_1 + Fc_2 + Fc_3 + N_f) * 100 ** 2
237
+
238
+ if (0 <= epsc < 3.5):
239
+ epsc += 0.001
240
+
241
+ else:
242
+ epss -= 0.001
243
+
244
+ num_iter += 1
245
+ # Druckzone im Steg und Flasch -> Nullline im Flansch
246
+ elif (x > (h - h_f)):
247
+ # Grenzdehnung von 2 wird nicht erreicht
248
+ if (0 <= epsc < 2.0):
249
+ # Querschnittslängen Vergabe
250
+ interval_start_1 = 0
251
+ interval_end_1 = x - (h - h_f)
252
+ interval_start_2 = x - (h - h_f)
253
+ interval_end_2 = x
254
+ interval_start_3 = 0
255
+ interval_end_3 = 0
256
+ # Querschnittsbreiten Vergabe
257
+ concrete_width_1 = b_w
258
+ concrete_width_2 = b_eff
259
+ concrete_width_3 = 0
260
+ # Grenzdehnung von 2 wird schon im FLansch erreicht
261
+ elif (2 / epsc * x <= x - (h - h_f)):
262
+ # Querschnittslängen Vergabe
263
+ interval_start_1 = 0
264
+ interval_end_1 = 2 / epsc * x # 2 = Dehnung beim Erreichen der Druckfestigkeit
265
+ interval_start_2 = 2 / epsc * x
266
+ interval_end_2 = x - (h - h_f)
267
+ interval_start_3 = x - (h - h_f)
268
+ interval_end_3 = x
269
+ # Querschnittsbreiten Vergabe
270
+ concrete_width_1 = b_eff
271
+ concrete_width_2 = b_eff
272
+ concrete_width_3 = b_w
273
+ # Grenzdehnung von 2 wird im Steg erreicht
274
+ elif (2 / epsc * x > x - (h - h_f)):
275
+ # Querschnittslängen Vergabe
276
+ interval_start_1 = 0
277
+ interval_end_1 = x - (h - h_f)
278
+ interval_start_2 = x - (h - h_f)
279
+ interval_end_2 = 2 / epsc * x
280
+ interval_start_3 = 2 / epsc * x
281
+ interval_end_3 = x
282
+ # Querschnittsbreiten Vergabe
283
+ concrete_width_1 = b_eff
284
+ concrete_width_2 = b_w
285
+ concrete_width_3 = b_w
286
+
287
+ # Abgrenzen der einzlnen Bereichsunterschiede
288
+ x1 = np.linspace(interval_start_1, interval_end_1, N)
289
+ x2 = np.linspace(interval_start_2, interval_end_2, N)
290
+ x3 = np.linspace(interval_start_3, interval_end_3, N)
291
+
292
+ # Definition der Spannungsfunktionen
293
+ y1 = []
294
+ y2 = []
295
+ y3 = []
296
+ # Grenzdehnung von 2 wird nicht erreicht
297
+ if (0 <= epsc < 2.0):
298
+ y1_list_with_all_sigma_c_values_promille = []
299
+ y2_list_with_all_sigma_c_values_upto_2_promille = []
300
+ for i in range(N):
301
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2)
302
+ sigma_c_2 = fcd * (1 - (1 - ((x2[i] * epsc) / (x * 2))) ** 2)
303
+
304
+ y1_list_with_all_sigma_c_values_promille.append(sigma_c)
305
+ y2_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c_2)
306
+
307
+ y1_values = y1_list_with_all_sigma_c_values_promille
308
+ y2_values = y2_list_with_all_sigma_c_values_upto_2_promille
309
+ y3_values = fcd * np.zeros(N)
310
+
311
+ y1.append(y1_values)
312
+ y2.append(y2_values)
313
+ y3.append(y3_values)
314
+ # Grenzdehnung von 2 wird im Steg erreicht
315
+ elif (2 / epsc * x <= x - (h - h_f)):
316
+ y1_list_with_all_sigma_c_values_upto_2_promille = []
317
+ for i in range(N):
318
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (
319
+ x * 2))) ** 2) # Sigma c-Werte bis zum Erreichen der Druckfestigkeit -> Betondehnung = 2
320
+
321
+ y1_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c)
322
+
323
+ y1_values = y1_list_with_all_sigma_c_values_upto_2_promille # sigma_concrete_at_given_intervals(x1)
324
+ y2_values = fcd * np.ones(N)
325
+ y3_values = fcd * np.ones(N)
326
+
327
+ y1.append(y1_values)
328
+ y2.append(y2_values)
329
+ y3.append(y3_values)
330
+ # Grenzdehnung von 2 wird im Flansch erreicht
331
+ elif (2 / epsc * x > x - (h - h_f)):
332
+ y1_list_with_all_sigma_c_values_promille = []
333
+ y2_list_with_all_sigma_c_values_upto_2_promille = []
334
+ for i in range(N):
335
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2)
336
+ sigma_c_2 = fcd * (1 - (1 - ((x2[i] * epsc) / (x * 2))) ** 2)
337
+
338
+ y1_list_with_all_sigma_c_values_promille.append(sigma_c)
339
+ y2_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c_2)
340
+
341
+ y1_values = y1_list_with_all_sigma_c_values_promille
342
+ y2_values = y2_list_with_all_sigma_c_values_upto_2_promille
343
+ y3_values = fcd * np.ones(N)
344
+
345
+ y1.append(y1_values)
346
+ y2.append(y2_values)
347
+ y3.append(y3_values)
348
+
349
+ # Integration der einzelnen Spannungsfunktionen
350
+ if (0 <= epsc < 2.0):
351
+ M_1 = simps(y1 * x1, x = x1)
352
+ A_1 = simps(y1, x = x1)
353
+ S_1 = M_1 / A_1
354
+
355
+ M_2 = simps(y2 * x2, x = x2)
356
+ A_2 = simps(y2, x = x2)
357
+ S_2 = M_2 / A_2
358
+
359
+ elif (2 / epsc * x <= x - (h - h_f)):
360
+ M_1 = simps(y1 * x1, x = x1) # moment 1
361
+ A_1 = simps(y1, x = x1) # pressure force 1
362
+ S_1 = M_1 / A_1 # centroid of area 1
363
+
364
+ M_2 = simps(y2 * x2, x = x2)
365
+ A_2 = simps(y2, x = x2)
366
+ S_2 = M_2 / A_2
367
+
368
+ M_3 = simps(y3 * x3, x= x3)
369
+ A_3 = simps(y3, x = x3)
370
+ S_3 = M_3 / A_3
371
+
372
+ elif (2 / epsc * x > x - (h - h_f)):
373
+ M_1 = simps(y1 * x1, x= x1)
374
+ A_1 = simps(y1, x= x1)
375
+ S_1 = M_1 / A_1
376
+
377
+ M_2 = simps(y2 * x2, x= x2)
378
+ A_2 = simps(y2, x = x2)
379
+ S_2 = M_2 / A_2
380
+
381
+ M_3 = simps(y3 * x3, x= x3)
382
+ A_3 = simps(y3, x = x3)
383
+ S_3 = M_3 / A_3
384
+
385
+ # concrete pressure
386
+ Fc_1 = A_1 * concrete_width_1
387
+ Fc_2 = A_2 * concrete_width_2
388
+ Fc_3 = A_3 * concrete_width_3
389
+
390
+ # centroid of compressive stress in concrete
391
+ S_ges = (S_1 * Fc_1 + S_2 * Fc_2 + S_3 * Fc_3) / (
392
+ Fc_1 + Fc_2 + Fc_3) # Bei der Berechnung der Gesamtschwerpunkte der Druckkraefte muss die Querschnittsbreite der einzelnen Querschnitte einfliessen
393
+ z = S_ges + d - x # Innerer Hebelarm
394
+
395
+ Meds = abs(M - N_f * (d - zs1))
396
+ Mrds = (Fc_1 + Fc_2 + Fc_3) * z
397
+
398
+ nu_eds = Meds / (b_w * (d ** 2) * fcd)
399
+ if nu_eds_grenz <= nu_eds:
400
+ Meds_lim = nu_eds_grenz * b_w * (d ** 2) * fcd
401
+
402
+ zeta_lim = 0
403
+ concrete_strain_2 = 3.5
404
+ if nu_eds_grenz == 0.296:
405
+ zeta_lim = 0.813
406
+ steal_strain_1 = 4.28
407
+ elif nu_eds_grenz == 0.371:
408
+ zeta_lim = 0.743
409
+ steal_strain_1 = 2.174
410
+
411
+ #epss2 = ((x - d2) / x) * abs(-3.5)
412
+ epss2 = ((steal_strain_1 + concrete_strain_2) / d) * (d - d2) - steal_strain_1
413
+
414
+ sigma_s_2 = 0
415
+ if epssyd <= epss2:
416
+ sigma_s_2 = fyd
417
+ elif epss2 < epssyd:
418
+ sigma_s_2 = fyd * (epss / epssyd)
419
+
420
+ z_nu_eds_grenz = zeta_lim * d
421
+
422
+ delta_Med = abs(M) - Meds_lim
423
+ As1erf_nu_lim = (1 / fyd) * (Meds_lim / z_nu_eds_grenz + N_f) * 100 ** 2
424
+ As2erf = (1 / sigma_s_2) * (delta_Med / (d - d2)) * 100 ** 2
425
+ As1erf = As1erf_nu_lim + As2erf
426
+ else:
427
+ As1erf = (1 / sigma_s) * (Fc_1 + Fc_2 + Fc_3 + N_f) * 100 ** 2
428
+
429
+ if (0 <= epsc < 3.5):
430
+ epsc += 0.001
431
+ else:
432
+ epss -= 0.001
433
+
434
+ num_iter += 1
435
+
436
+ # Stützmoment
437
+ elif 0 > M:
438
+ # Druckzone liegt im FLANSCH -> Nullline im Steg
439
+ if (x <= h_f):
440
+ # Grenzdehnung von 2 wird nicht erreicht
441
+ if (0 <= epsc < 2.0):
442
+ # Querschnittslängen Vergabe
443
+ interval_start_1 = 0
444
+ interval_end_1 = x
445
+ interval_start_2 = 0
446
+ interval_end_2 = 0
447
+ interval_start_3 = 0
448
+ interval_end_3 = 0
449
+ # Querschnittsbreiten Vergabe
450
+ concrete_width_1 = b_eff
451
+ concrete_width_2 = 0
452
+ concrete_width_3 = 0
453
+ # Grenzdehnung von 2 wird erreicht
454
+ elif (2 / epsc * x <= h_f):
455
+ # Querschnittslängen Vergabe
456
+ interval_start_1 = 0
457
+ interval_end_1 = 2 / epsc * x # 2 = Dehnung beim Erreichen der Druckfestigkeit
458
+ interval_start_2 = 2 / epsc * x
459
+ interval_end_2 = x
460
+ interval_start_3 = 0
461
+ interval_end_3 = 0
462
+ # Querschnittsbreiten Vergabe
463
+ concrete_width_1 = b_eff
464
+ concrete_width_2 = b_eff
465
+ concrete_width_3 = 0
466
+
467
+ # Abgrenzen der einzlnen Bereichsunterschiede
468
+ x1 = np.linspace(interval_start_1, interval_end_1, N)
469
+ x2 = np.linspace(interval_start_2, interval_end_2, N)
470
+ x3 = np.linspace(interval_start_3, interval_end_3, N)
471
+
472
+ # Definition der Spannungsfunktionen
473
+ y1 = []
474
+ y2 = []
475
+ y3 = []
476
+ # Grenzdehnung von 2 wird nicht erreicht
477
+ if (0 <= epsc < 2.0):
478
+ y1_list_with_all_sigma_c_values_promille = []
479
+ for i in range(N):
480
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2)
481
+
482
+ y1_list_with_all_sigma_c_values_promille.append(sigma_c)
483
+
484
+ y1_values = y1_list_with_all_sigma_c_values_promille
485
+ y2_values = fcd * np.zeros(N)
486
+ y3_values = fcd * np.zeros(N)
487
+
488
+ y1.append(y1_values)
489
+ y2.append(y2_values)
490
+ y3.append(y3_values)
491
+ # Grenzdehnung von 2 wird erreicht
492
+ elif (2 / epsc * x <= h_f):
493
+ y1_list_with_all_sigma_c_values_upto_2_promille = []
494
+ for i in range(N):
495
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (
496
+ x * 2))) ** 2) # Sigma c-Werte bis zum Erreichen der Druckfestigkeit -> Betondehnung = 2
497
+
498
+ y1_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c)
499
+
500
+ y1_values = y1_list_with_all_sigma_c_values_upto_2_promille # sigma_concrete_at_given_intervals(x1)
501
+ y2_values = fcd * np.ones(N)
502
+ y3_values = fcd * np.zeros(N)
503
+
504
+ y1.append(y1_values)
505
+ y2.append(y2_values)
506
+ y3.append(y3_values)
507
+
508
+ # Integration der einzelnen Spannungsfunktionen
509
+ if (0 <= epsc < 2.0):
510
+ M_1 = simps(y1 * x1, x= x1)
511
+ A_1 = simps(y1, x = x1)
512
+ S_1 = M_1 / A_1
513
+
514
+ elif (2 / epsc * x <= h_f):
515
+ M_1 = simps(y1 * x1, x = x1) # moment 1
516
+ A_1 = simps(y1, x = x1) # pressure force 1
517
+ S_1 = M_1 / A_1 # centroid of area 1
518
+
519
+ M_2 = simps(y2 * x2, x = x2)
520
+ A_2 = simps(y2, x = x2)
521
+ S_2 = M_2 / A_2
522
+
523
+ # concrete pressure
524
+ Fc_1 = A_1 * concrete_width_1
525
+ Fc_2 = A_2 * concrete_width_2
526
+ Fc_3 = 0
527
+
528
+ # centroid of compressive stress in concrete
529
+ S_ges = (S_1 * Fc_1 + S_2 * Fc_2 + S_3 * Fc_3) / (
530
+ Fc_1 + Fc_2 + Fc_3) # Bei der Berechnung der Gesamtschwerpunkte der Druckkraefte muss die Querschnittsbreite der einzelnen Querschnitte einfliessen
531
+ z = S_ges + d - x # Innerer Hebelarm
532
+
533
+ Meds = abs(M - N_f * (zs1 - (h - d)))
534
+ Mrds = (Fc_1 + Fc_2 + Fc_3) * z
535
+
536
+ nu_eds = Meds / (b_eff * (d ** 2) * fcd)
537
+ if nu_eds_grenz <= nu_eds:
538
+ Meds_lim = nu_eds_grenz * b_eff * (d ** 2) * fcd
539
+
540
+ zeta_lim = 0
541
+ concrete_strain_2 = 3.5
542
+ if nu_eds_grenz == 0.296:
543
+ zeta_lim = 0.813
544
+ steal_strain_1 = 4.28
545
+ elif nu_eds_grenz == 0.371:
546
+ zeta_lim = 0.743
547
+ steal_strain_1 = 2.174
548
+
549
+ #epss2 = ((x - d2) / x) * abs(-3.5)
550
+ epss2 = ((steal_strain_1 + concrete_strain_2) / d) * (d - d2) - steal_strain_1
551
+
552
+ sigma_s_2 = 0
553
+ if epssyd <= epss2:
554
+ sigma_s_2 = fyd
555
+ elif epss2 < epssyd:
556
+ sigma_s_2 = fyd * (epss / epssyd)
557
+
558
+ z_nu_eds_grenz = zeta_lim * d
559
+
560
+ delta_Med = abs(M) - Meds_lim
561
+ As1erf_nu_lim = (1 / fyd) * (Meds_lim / z_nu_eds_grenz + N_f) * 100 ** 2
562
+ As2erf = (1 / sigma_s_2) * (
563
+ delta_Med / (d - d2)) * 100 ** 2
564
+ As1erf = As1erf_nu_lim + As2erf
565
+ else:
566
+ As1erf = (1 / sigma_s) * (Fc_1 + Fc_2 + Fc_3 + N_f) * 100 ** 2
567
+
568
+ if (0 <= epsc < 3.5):
569
+ epsc += 0.001
570
+
571
+ else:
572
+ epss -= 0.001
573
+
574
+ num_iter += 1
575
+ # Druckzone im Steg und Flasch -> Nullline im Flansch
576
+ elif (x > h_f):
577
+ # Grenzdehnung von 2 wird nicht erreicht
578
+ if (0 <= epsc < 2.0):
579
+ # Querschnittslängen Vergabe
580
+ interval_start_1 = 0
581
+ interval_end_1 = x - h_f
582
+ interval_start_2 = x - h_f
583
+ interval_end_2 = x
584
+ interval_start_3 = 0
585
+ interval_end_3 = 0
586
+ # Querschnittsbreiten Vergabe
587
+ concrete_width_1 = b_w
588
+ concrete_width_2 = b_eff
589
+ concrete_width_3 = 0
590
+ # Grenzdehnung von 2 wird im STEG erreicht
591
+ elif (2 / epsc * x <= (x - h_f)):
592
+ # Querschnittslängen Vergabe
593
+ interval_start_1 = 0
594
+ interval_end_1 = 2 / epsc * x # 2 = Dehnung beim Erreichen der Druckfestigkeit
595
+ interval_start_2 = 2 / epsc * x
596
+ interval_end_2 = x - h_f
597
+ interval_start_3 = x - h_f
598
+ interval_end_3 = x
599
+ # Querschnittsbreiten Vergabe
600
+ concrete_width_1 = b_w
601
+ concrete_width_2 = b_w
602
+ concrete_width_3 = b_eff
603
+ # Grenzdehnung von 2 wird im FLANSCH erreicht
604
+ elif (2 / epsc * x > (x - h_f)):
605
+ # Querschnittslängen Vergabe
606
+ interval_start_1 = 0
607
+ interval_end_1 = x - h_f
608
+ interval_start_2 = x - h_f
609
+ interval_end_2 = 2 / epsc * x
610
+ interval_start_3 = 2 / epsc * x
611
+ interval_end_3 = x
612
+ # Querschnittsbreiten Vergabe
613
+ concrete_width_1 = b_w
614
+ concrete_width_2 = b_eff
615
+ concrete_width_3 = b_eff
616
+
617
+ # Abgrenzen der einzlnen Bereichsunterschiede
618
+ x1 = np.linspace(interval_start_1, interval_end_1, N)
619
+ x2 = np.linspace(interval_start_2, interval_end_2, N)
620
+ x3 = np.linspace(interval_start_3, interval_end_3, N)
621
+
622
+ # Definition der Spannungsfunktionen
623
+ y1 = []
624
+ y2 = []
625
+ y3 = []
626
+ # Grenzdehnung von 2 wird nicht erreicht
627
+ if (0 <= epsc < 2.0):
628
+ y1_list_with_all_sigma_c_values_promille = []
629
+ y2_list_with_all_sigma_c_values_upto_2_promille = []
630
+ for i in range(N):
631
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2)
632
+ sigma_c_2 = fcd * (1 - (1 - ((x2[i] * epsc) / (x * 2))) ** 2)
633
+
634
+ y1_list_with_all_sigma_c_values_promille.append(sigma_c)
635
+ y2_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c_2)
636
+
637
+ y1_values = y1_list_with_all_sigma_c_values_promille
638
+ y2_values = y2_list_with_all_sigma_c_values_upto_2_promille
639
+ y3_values = fcd * np.zeros(N)
640
+
641
+ y1.append(y1_values)
642
+ y2.append(y2_values)
643
+ y3.append(y3_values)
644
+ # Grenzdehnung von 2 wird im STEG erreicht
645
+ elif (2 / epsc * x <= (x - h_f)):
646
+ y1_list_with_all_sigma_c_values_upto_2_promille = []
647
+ for i in range(N):
648
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (
649
+ x * 2))) ** 2) # Sigma c-Werte bis zum Erreichen der Druckfestigkeit -> Betondehnung = 2
650
+
651
+ y1_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c)
652
+
653
+ y1_values = y1_list_with_all_sigma_c_values_upto_2_promille # sigma_concrete_at_given_intervals(x1)
654
+ y2_values = fcd * np.ones(N)
655
+ y3_values = fcd * np.ones(N)
656
+
657
+ y1.append(y1_values)
658
+ y2.append(y2_values)
659
+ y3.append(y3_values)
660
+ # Grenzdehnung von 2 wird im FLANSCH erreicht
661
+ elif (2 / epsc * x > (x - h_f)):
662
+ y1_list_with_all_sigma_c_values_promille = []
663
+ y2_list_with_all_sigma_c_values_upto_2_promille = []
664
+ for i in range(N):
665
+ sigma_c = fcd * (1 - (1 - ((x1[i] * epsc) / (x * 2))) ** 2)
666
+ sigma_c_2 = fcd * (1 - (1 - ((x2[i] * epsc) / (x * 2))) ** 2)
667
+
668
+ y1_list_with_all_sigma_c_values_promille.append(sigma_c)
669
+ y2_list_with_all_sigma_c_values_upto_2_promille.append(sigma_c_2)
670
+
671
+ y1_values = y1_list_with_all_sigma_c_values_promille
672
+ y2_values = y2_list_with_all_sigma_c_values_upto_2_promille
673
+ y3_values = fcd * np.ones(N)
674
+
675
+ y1.append(y1_values)
676
+ y2.append(y2_values)
677
+ y3.append(y3_values)
678
+
679
+ # Integration der einzelnen Spannungsfunktionen
680
+ if (0 <= epsc < 2.0):
681
+ M_1 = simps(y1 * x1, x= x1)
682
+ A_1 = simps(y1, x = x1)
683
+ S_1 = M_1 / A_1
684
+
685
+ M_2 = simps(y2 * x2, x= x2)
686
+ A_2 = simps(y2, x = x2)
687
+ S_2 = M_2 / A_2
688
+ # Grenzdehnung von 2 wird im STEG erreicht
689
+ elif (2 / epsc * x <= x - h_f):
690
+ M_1 = simps(y1 * x1, x = x1) # moment 1
691
+ A_1 = simps(y1, x = x1) # pressure force 1
692
+ S_1 = M_1 / A_1 # centroid of area 1
693
+
694
+ M_2 = simps(y2 * x2, x= x2)
695
+ A_2 = simps(y2, x= x2)
696
+ S_2 = M_2 / A_2
697
+
698
+ M_3 = simps(y3 * x3, x= x3)
699
+ A_3 = simps(y3, x= x3)
700
+ S_3 = M_3 / A_3
701
+ # Grenzdehnung von 2 wird im FLANSCH erreicht
702
+ elif (2 / epsc * x > x - h_f):
703
+ M_1 = simps(y1 * x1, x= x1)
704
+ A_1 = simps(y1, x=x1)
705
+ S_1 = M_1 / A_1
706
+
707
+ M_2 = simps(y2 * x2, x=x2)
708
+ A_2 = simps(y2, x=x2)
709
+ S_2 = M_2 / A_2
710
+
711
+ M_3 = simps(y3 * x3, x=x3)
712
+ A_3 = simps(y3, x=x3)
713
+ S_3 = M_3 / A_3
714
+
715
+ # concrete pressure
716
+ Fc_1 = A_1 * concrete_width_1
717
+ Fc_2 = A_2 * concrete_width_2
718
+ Fc_3 = A_3 * concrete_width_3
719
+
720
+ # centroid of compressive stress in concrete
721
+ S_ges = (S_1 * Fc_1 + S_2 * Fc_2 + S_3 * Fc_3) / (
722
+ Fc_1 + Fc_2 + Fc_3) # Bei der Berechnung der Gesamtschwerpunkte der Druckkraefte muss die Querschnittsbreite der einzelnen Querschnitte einfliessen
723
+ z = S_ges + d - x
724
+
725
+ Meds = abs(M - N_f * (d - (h - zs1)))
726
+ Mrds = (Fc_1 + Fc_2 + Fc_3) * z
727
+
728
+ nu_eds = Meds / (b_w * (d ** 2) * fcd)
729
+ if nu_eds_grenz <= nu_eds:
730
+ Meds_lim = nu_eds_grenz * b_w * (d ** 2) * fcd
731
+
732
+ zeta_lim = 0
733
+ concrete_strain_2 = 3.5
734
+ if nu_eds_grenz == 0.296:
735
+ zeta_lim = 0.813
736
+ steal_strain_1 = 4.28
737
+ elif nu_eds_grenz == 0.371:
738
+ zeta_lim = 0.743
739
+ steal_strain_1 = 2.174
740
+
741
+ #epss2 = ((x - d2) / x) * abs(-3.5)
742
+ epss2 = ((steal_strain_1 + concrete_strain_2) / d) * (d - d2) - steal_strain_1
743
+
744
+ sigma_s_2 = 0
745
+ if epssyd <= epss2:
746
+ sigma_s_2 = fyd
747
+ elif epss2 < epssyd:
748
+ sigma_s_2 = fyd * (epss / epssyd)
749
+
750
+ z_nu_eds_grenz = zeta_lim * d
751
+
752
+ delta_Med = abs(M) - Meds_lim
753
+ As1erf_nu_lim = (1 / fyd) * (Meds_lim / z_nu_eds_grenz + N_f) * 100 ** 2
754
+ As2erf = (1 / sigma_s_2) * (
755
+ delta_Med / (d - d2)) * 100 ** 2
756
+ As1erf = As1erf_nu_lim + As2erf
757
+ else:
758
+ As1erf = (1 / sigma_s) * (Fc_1 + Fc_2 + Fc_3 + N_f) * 100 ** 2
759
+
760
+ if (0 <= epsc < 3.5):
761
+ epsc += 0.001
762
+
763
+ else:
764
+ epss -= 0.001
765
+
766
+ num_iter += 1
767
+
768
+ else:
769
+ print("Limit reached!")
770
+ break
771
+
772
+ #DIN 1045-1:2008-08
773
+ amax = 0
774
+ a1 = self.center_of_gravity
775
+ a2 = h - self.center_of_gravity
776
+ if a1 > a2:
777
+ amax = a1 * 100
778
+ else:
779
+ amax = a2 * 100
780
+ Wc = (self.cross_section_inertia*100*100*100*100)/amax
781
+ Asmin = ((fctm*10**2) * Wc)/(fyk*10**2*(d*0.9)*100)
782
+
783
+ needed_reinforcement = []
784
+ if Asmin < As1erf:
785
+ print("Iteration steps: ", num_iter)
786
+ print("Med: ", np.around(M, 3), "MN")
787
+ print("Ned: ", np.around(N_f, 3), "MN")
788
+ print("Affecting moment: ", np.around(Meds, 3), "MN")
789
+ print("Marginal moment: ", np.around(Meds_lim, 3), "MN")
790
+ print("Modulus of section : ", np.around(Mrds, 3), "MN")
791
+ print("Required bending reinforcement: ", np.around(As1erf, 3), "cm²")
792
+ if As2erf != 0:
793
+ print("Required compressive reinforcement : ", np.around(As2erf, 3), "cm²")
794
+ print("Pressure zone height x = ", np.around(x, 3), "m")
795
+ print("Retrieved pressure zone ξ = ", np.around(xi, 3))
796
+ print("Edge concrete compression εc = ", np.around(epsc, 3), "‰")
797
+ if epss >= 2.17:
798
+ print("Steel strain of bending reinforcement εs: Yield strength is reached.")
799
+ if As2erf != 0:
800
+ print("εs = ", np.around(steal_strain_1, 3), "‰")
801
+ else:
802
+ print("εs = ", np.around(epss, 3), "‰")
803
+ else:
804
+ if As2erf != 0:
805
+ print("Steel strain of bending reinforcement εs: Yield strength is reached.")
806
+ print("εs = ", np.around(steal_strain_1, 3), "‰")
807
+ else:
808
+ print("Steel strain of bending reinforcement εs: Yield strength is not reached.")
809
+ print("εs = ", np.around(epss, 3), "‰")
810
+
811
+ if As2erf != 0:
812
+ if As2erf != 0:
813
+ print("Steel strain of compressive reinforcement εs2: Yield strength is reached.")
814
+ print("εs2 = ", np.around(epss2, 3), "‰")
815
+ else:
816
+ print("Steel strain of compressive reinforcement εs2: Yield strength is not reached.")
817
+ print("εs2 = ", np.around(epss2, 3), "‰")
818
+
819
+ print("Inner lever arm z = ", np.around(z, 3), "m")
820
+
821
+ reinforcement = [float(As1erf), float(As2erf)]
822
+ needed_reinforcement.append(reinforcement)
823
+ else:
824
+ print("Minimum reinforcement is dominant!")
825
+ print("Required bending reinforcement: ", np.around(Asmin, 3), "cm²")
826
+ reinforcement = [float(Asmin), float(0.0)]
827
+ needed_reinforcement.append(reinforcement)
828
+
829
+ return needed_reinforcement
830
+
831
+ def calculate_beam_section_stirrup(self, beam_sub_section, strength_of_concrete, tensile_yield_strength, strut_angle_choice):
832
+ Ved = beam_sub_section.shear_force_ed / 1000000
833
+ Vedr = abs(Ved) # reduzierte Querkraft, da direkte Lagerung
834
+ N_f = beam_sub_section.normal_force_ed / 1000000
835
+
836
+ A = self.cross_section_area # QS-Fläche
837
+
838
+ h = self.height
839
+ b = self.width_web # kleinste QS-breite -> bw aus Biegebemessung
840
+
841
+ d1 = beam_sub_section.effective_height_pressure # cnom + dsl*0.5
842
+ d = h - d1
843
+ z = 0.9 * d
844
+
845
+ fcd = strength_of_concrete # N/mm²
846
+ fck = (fcd * 1.5) / 0.85
847
+ fctm = 0.3 * fck ** (2 / 3)
848
+ yc = 1.5
849
+
850
+ fyd = tensile_yield_strength # MN/m²
851
+ fyk = fyd * 1.15
852
+
853
+ a_sw_correct = 0
854
+
855
+ # Berechnung des Druckstrebenwinkels
856
+ c = 0.5
857
+ sigma_cd = abs(N_f / A)
858
+ Vrd_cc = c * 0.48 * (fck ** (1 / 3)) * (1 - 1.2 * (sigma_cd / fcd)) * b * z
859
+
860
+ cot_teta = abs((1.2 + 1.4 * (sigma_cd / fcd)) / (1 - (Vrd_cc / Vedr)))
861
+ strut_angle = math.degrees(math.atan(1 / cot_teta))
862
+
863
+ if strut_angle_choice == 0:
864
+ if 1.0 <= cot_teta <= 3.0:
865
+ cot_teta = cot_teta
866
+ elif 3.0 < cot_teta:
867
+ cot_teta = 3.0
868
+ strut_angle = 18.43
869
+ elif 0 <= cot_teta < 1.0:
870
+ cot_teta = 1.0
871
+ strut_angle = 45
872
+ else:
873
+ if N_f > 0:
874
+ cot_teta = 1.0
875
+ strut_angle = 45
876
+ else:
877
+ cot_teta = 1.2
878
+ strut_angle = 40
879
+
880
+ # Nachweis der Druckstrebentragfähigkeit
881
+ alpha_cw = 1.0
882
+ v2 = 1.1 - (fck / 500)
883
+ v1 = 0.75 * v2
884
+ tan_teta = math.tan(math.radians(strut_angle))
885
+ Vrd_max = (alpha_cw * b * z * v1 * fcd) / ((tan_teta) + (cot_teta))
886
+ proof = abs(Vedr / Vrd_max)
887
+
888
+ # Ermittlung der stat. erforderlichen Bewehrung, für vertikale Bügel
889
+ a_sw = (Vedr / (z * fyd)) * tan_teta * 100 ** 2
890
+
891
+ # Konstruktive Durchbiegung
892
+ a_sw_min = 0.16 * (fctm / fyk) * b * 1.0 * 100 ** 2 # Mindestquerkraftbewehrung, vertikale Bügel
893
+
894
+ needed_reinforcement = []
895
+
896
+ if a_sw <= a_sw_min:
897
+ a_sw_correct = a_sw_min
898
+ else:
899
+ a_sw_correct = a_sw
900
+
901
+ if proof <= 1.0:
902
+ print("Proof that the strut sturdiness is complied = ", np.around(proof, 3), "%")
903
+ else:
904
+ print("Proof that the strut sturdiness is NOT complied = ", np.around(proof, 3), "%")
905
+
906
+ print("Compression strut angle = ", np.around(strut_angle, 2), "°")
907
+
908
+ if a_sw <= a_sw_min:
909
+ print("Minimum reinforcement is required for the shear force = ", np.around(a_sw_correct, 3), " cm²/m")
910
+ else:
911
+ print("Required shear force reinforcement = ", np.around(a_sw_correct, 3), " cm²/m")
912
+
913
+ needed_reinforcement.append(float(np.around(a_sw_correct, 3)))
914
+
915
+ return needed_reinforcement