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.
- Examples/Cross_Section_Thin.py +61 -0
- Examples/__init__.py +0 -0
- KIB_LAP/Betonbau/Bemessung_Polygon.py +667 -0
- KIB_LAP/Betonbau/Bemessung_Zust_II.py +648 -0
- KIB_LAP/Betonbau/Cross_Section_Kappa.py +925 -0
- KIB_LAP/Betonbau/Druckglied_KGV.py +179 -0
- KIB_LAP/Betonbau/Iterative_Design.py +723 -0
- KIB_LAP/Betonbau/Materialkennwerte_Beton.py +196 -0
- KIB_LAP/Betonbau/Querschnittsbreite.py +194 -0
- KIB_LAP/Betonbau/Querschnittsbreite_Kreis.py +63 -0
- KIB_LAP/Betonbau/__init__.py +2 -0
- KIB_LAP/Betonbau/beam_plate_T.py +921 -0
- KIB_LAP/Betonbau/beam_plate_T_reverse.py +915 -0
- KIB_LAP/Betonbau/beam_rectangular.py +635 -0
- KIB_LAP/Betonbau/beam_sub_section.py +9 -0
- KIB_LAP/Dynamik/Cross_Section_Properties.py +155 -0
- KIB_LAP/Dynamik/Deformation_Method.py +587 -0
- KIB_LAP/Dynamik/Duhamel_SDOF.py +221 -0
- KIB_LAP/Dynamik/FFT.py +87 -0
- KIB_LAP/Dynamik/Kontinuum_Eigenmodes.py +418 -0
- KIB_LAP/Dynamik/Kontinuum_Schwingung.py +757 -0
- KIB_LAP/Dynamik/Pendulum_Spring_Linearized.py +91 -0
- KIB_LAP/Dynamik/Pendulum_Spring_Problem.py +94 -0
- KIB_LAP/Dynamik/__init__.py +0 -0
- KIB_LAP/Examples/Cross_Section_Thin.py +61 -0
- KIB_LAP/Examples/Cross_Section_Thin_2.py +14 -0
- KIB_LAP/Examples/Plattentragwerke.py +39 -0
- KIB_LAP/Examples/Plattentragwerke_2.py +60 -0
- KIB_LAP/Examples/ShearDesign.py +28 -0
- KIB_LAP/Examples/__init__.py +0 -0
- KIB_LAP/Plattenbeulen/Plate_Design.py +276 -0
- KIB_LAP/Plattenbeulen/Ritz_Optimiert.py +658 -0
- KIB_LAP/Plattenbeulen/__init__.py +2 -0
- KIB_LAP/Plattenbeulen/dist/__init__.py +0 -0
- KIB_LAP/Plattenbeulen/plate_buckling.cpp +561 -0
- KIB_LAP/Plattenbeulen/plate_buckling_cpp.cp313-win_amd64.pyd +0 -0
- KIB_LAP/Plattenbeulen/plate_buckling_cpp.cpp +561 -0
- KIB_LAP/Plattenbeulen/setup.py +35 -0
- KIB_LAP/Plattentragwerke/Functions.cpp +326 -0
- KIB_LAP/Plattentragwerke/Functions.h +41 -0
- KIB_LAP/Plattentragwerke/NumInte.cpp +23 -0
- KIB_LAP/Plattentragwerke/NumericalIntegration.cpp +23 -0
- KIB_LAP/Plattentragwerke/PlateBendingKirchhoff.py +843 -0
- KIB_LAP/Plattentragwerke/__init__.py +1 -0
- KIB_LAP/Plattentragwerke/plate_bending.cpp +341 -0
- KIB_LAP/Plattentragwerke/plate_bending_cpp.cp313-win_amd64.pyd +0 -0
- KIB_LAP/Plattentragwerke/setup.py +39 -0
- KIB_LAP/Querschnittswerte/Querschnitt_Duenn.py +526 -0
- KIB_LAP/Querschnittswerte/__init__.py +1 -0
- KIB_LAP/STABRAUM/InputData.py +92 -0
- KIB_LAP/STABRAUM/Programm.py +1403 -0
- KIB_LAP/STABRAUM/Steifigkeitsmatrix.py +275 -0
- KIB_LAP/STABRAUM/__init__.py +3 -0
- KIB_LAP/Stahlbau/__init__.py +0 -0
- KIB_LAP/Verbundbau/Verbundtraeger_Bemessung.py +766 -0
- KIB_LAP/Verbundbau/__init__.py +0 -0
- KIB_LAP/__init__.py +4 -0
- KIB_LAP/main.py +2 -0
- KIB_LAP/plate_bending_cpp.cp313-win_amd64.pyd +0 -0
- KIB_LAP/plate_buckling_cpp.cp313-win_amd64.pyd +0 -0
- kib_lap-0.5.dist-info/METADATA +25 -0
- kib_lap-0.5.dist-info/RECORD +64 -0
- kib_lap-0.5.dist-info/WHEEL +5 -0
- 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
|