kib-lap 0.5__cp313-cp313-win_amd64.whl → 0.7.7__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.
- KIB_LAP/Betonbau/TEST_Rectangular.py +21 -0
- KIB_LAP/Betonbau/beam_rectangular.py +4 -0
- KIB_LAP/FACHWERKEBEN/Elements.py +209 -0
- KIB_LAP/FACHWERKEBEN/InputData.py +118 -0
- KIB_LAP/FACHWERKEBEN/Iteration.py +967 -0
- KIB_LAP/FACHWERKEBEN/Materials.py +30 -0
- KIB_LAP/FACHWERKEBEN/Plotting.py +681 -0
- KIB_LAP/FACHWERKEBEN/__init__.py +4 -0
- KIB_LAP/FACHWERKEBEN/main.py +27 -0
- KIB_LAP/Plattentragwerke/PlateBendingKirchhoff.py +36 -29
- KIB_LAP/STABRAUM/InputData.py +13 -2
- KIB_LAP/STABRAUM/Output_Data.py +61 -0
- KIB_LAP/STABRAUM/Plotting.py +1453 -0
- KIB_LAP/STABRAUM/Programm.py +518 -1026
- KIB_LAP/STABRAUM/Steifigkeitsmatrix.py +338 -117
- KIB_LAP/STABRAUM/main.py +58 -0
- KIB_LAP/STABRAUM/results.py +37 -0
- KIB_LAP/Scheibe/Assemble_Stiffness.py +246 -0
- KIB_LAP/Scheibe/Element_Stiffness.py +362 -0
- KIB_LAP/Scheibe/Meshing.py +365 -0
- KIB_LAP/Scheibe/Output.py +34 -0
- KIB_LAP/Scheibe/Plotting.py +722 -0
- KIB_LAP/Scheibe/Shell_Calculation.py +523 -0
- KIB_LAP/Scheibe/Testing_Mesh.py +25 -0
- KIB_LAP/Scheibe/__init__.py +14 -0
- KIB_LAP/Scheibe/main.py +33 -0
- KIB_LAP/StabEbenRitz/Biegedrillknicken.py +757 -0
- KIB_LAP/StabEbenRitz/Biegedrillknicken_Trigeometry.py +328 -0
- KIB_LAP/StabEbenRitz/Querschnittswerte.py +527 -0
- KIB_LAP/StabEbenRitz/Stabberechnung_Klasse.py +868 -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 → kib_lap-0.7.7.dist-info}/METADATA +1 -1
- {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/RECORD +37 -19
- Examples/Cross_Section_Thin.py +0 -61
- KIB_LAP/Betonbau/Bemessung_Zust_II.py +0 -648
- KIB_LAP/Betonbau/Iterative_Design.py +0 -723
- KIB_LAP/Plattentragwerke/NumInte.cpp +0 -23
- KIB_LAP/Plattentragwerke/NumericalIntegration.cpp +0 -23
- KIB_LAP/Plattentragwerke/plate_bending_cpp.cp313-win_amd64.pyd +0 -0
- KIB_LAP/main.py +0 -2
- {Examples → KIB_LAP/StabEbenRitz}/__init__.py +0 -0
- {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/WHEEL +0 -0
- {kib_lap-0.5.dist-info → kib_lap-0.7.7.dist-info}/top_level.txt +0 -0
|
@@ -1,723 +0,0 @@
|
|
|
1
|
-
from Querschnittsbreite import PolygonSection
|
|
2
|
-
import numpy as np
|
|
3
|
-
import matplotlib.pyplot as plt
|
|
4
|
-
import pandas as pd
|
|
5
|
-
from scipy.interpolate import interp1d
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class Baustoffe:
|
|
9
|
-
def __init__(self, liste_baustoffe, h_c=0.13, b_c=4, traeger="FT", t0=1, t=365):
|
|
10
|
-
"""
|
|
11
|
-
Klasse zur Berechnung der Baustoffparameter: Eingabe in [MN/m², m , MN, etc.]
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"""
|
|
15
|
-
# Teilsicherheitsbeiwerte für Baustoffe
|
|
16
|
-
self.gamma_c = 1.5
|
|
17
|
-
self.gamma_s = 1.15
|
|
18
|
-
# Stahlbeton
|
|
19
|
-
self.fck = liste_baustoffe[0]
|
|
20
|
-
self.fcd = self.fck / self.gamma_c * 0.85
|
|
21
|
-
self.fctm = 0.30 * self.fck ** (2 / 3) # Nach Eurocode 2 Tabelle 3.1
|
|
22
|
-
self.fctk_005 = 0.7 * self.fctm
|
|
23
|
-
self.fcm = self.fck + 8
|
|
24
|
-
self.Ecm = 22000 * (0.1 * self.fcm) ** (0.3)
|
|
25
|
-
|
|
26
|
-
self.alpha_T = 1.2e-5
|
|
27
|
-
|
|
28
|
-
# Kriechen und Schwinden
|
|
29
|
-
|
|
30
|
-
self.traeger = traeger
|
|
31
|
-
self.Zement = "I42.5N"
|
|
32
|
-
self.LF = 80
|
|
33
|
-
|
|
34
|
-
self.t0 = t0 # Annahme: Belastungsbeginn der Fertigteile nach 28 d
|
|
35
|
-
self.t = t
|
|
36
|
-
|
|
37
|
-
# Querschnittswerte für Kriechen / Schwinden
|
|
38
|
-
|
|
39
|
-
self.b_c = b_c
|
|
40
|
-
self.h_c = h_c
|
|
41
|
-
|
|
42
|
-
self.A = self.b_c * self.h_c
|
|
43
|
-
if self.traeger == "FT":
|
|
44
|
-
self.u = self.b_c
|
|
45
|
-
elif self.traeger == "Normal":
|
|
46
|
-
self.u = self.b_c * 2 # Zur Trocknung freigesetzter Umfang
|
|
47
|
-
else:
|
|
48
|
-
self.u = self.b_c * 2
|
|
49
|
-
|
|
50
|
-
self.h_0 = 2 * self.A / self.u
|
|
51
|
-
|
|
52
|
-
# Stahl
|
|
53
|
-
self.fyk = liste_baustoffe[1]
|
|
54
|
-
self.fyd = self.fyk / self.gamma_s
|
|
55
|
-
self.Es = 2e5
|
|
56
|
-
self.Materialgesetz_Beton()
|
|
57
|
-
self.Kriechzahlen()
|
|
58
|
-
self.Schwindzahlen()
|
|
59
|
-
|
|
60
|
-
def Materialgesetz_Beton(self):
|
|
61
|
-
self.eps_c1 = 0.7 * self.fcm**0.31
|
|
62
|
-
self.eps_c1 = min(self.eps_c1, 2.8) # Sicherstellen, dass eps_c1 <= 2.8
|
|
63
|
-
|
|
64
|
-
def Kriechzahlen(self):
|
|
65
|
-
self.Zement = "I42.5N"
|
|
66
|
-
|
|
67
|
-
if self.Zement == "I42.5N" or self.Zement == "I32.5R":
|
|
68
|
-
self.alpha = 0
|
|
69
|
-
elif (
|
|
70
|
-
self.Zement == "I42.5R"
|
|
71
|
-
or self.Zement == "I52.5N"
|
|
72
|
-
or self.Zement == "I52.5R"
|
|
73
|
-
):
|
|
74
|
-
self.alpha = 1
|
|
75
|
-
else:
|
|
76
|
-
self.alpha = -1
|
|
77
|
-
|
|
78
|
-
self.t_0 = self.t0
|
|
79
|
-
|
|
80
|
-
self.t_0_eff = max(
|
|
81
|
-
self.t_0 * (1 + 9 / (2 + self.t_0 ** (1.2))) ** self.alpha, 0.5
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
self.t_infty = (
|
|
85
|
-
self.t
|
|
86
|
-
) # self.t_0+15 #70 * 365 Annahme: 15 Tage nach der Betonage
|
|
87
|
-
|
|
88
|
-
self.RH = self.LF # Außenliegendes Bauteil
|
|
89
|
-
|
|
90
|
-
# Fallunterscheidung für Druckfestigkeit
|
|
91
|
-
self.alpha_1 = min((35 / self.fcm) ** 0.7, 1)
|
|
92
|
-
self.alpha_2 = min((35 / self.fcm) ** 0.2, 1)
|
|
93
|
-
self.alpha_3 = min((35 / self.fcm) ** 0.5, 1)
|
|
94
|
-
|
|
95
|
-
# Einfluss der Luftfeuchte und wirksamer Bauteildicke
|
|
96
|
-
if self.fcm <= 35:
|
|
97
|
-
self.phi_rh = 1 + (1 - self.RH / 100) / (
|
|
98
|
-
0.1 * (self.h_0 * 1000) ** (0.3333333)
|
|
99
|
-
)
|
|
100
|
-
else:
|
|
101
|
-
self.phi_rh = (
|
|
102
|
-
1
|
|
103
|
-
+ (1 - self.RH / 100)
|
|
104
|
-
/ (0.1 * (self.h_0 * 1000) ** (0.3333333))
|
|
105
|
-
* self.alpha_1
|
|
106
|
-
) * self.alpha_2
|
|
107
|
-
|
|
108
|
-
# Einfluss der Betondruckfestigkeit
|
|
109
|
-
self.beta_fcm = 16.8 / np.sqrt(self.fcm)
|
|
110
|
-
# Einfluss des Belastungsbeginns
|
|
111
|
-
self.beta_t0 = 1 / (0.1 + self.t_0_eff**0.2)
|
|
112
|
-
|
|
113
|
-
# Einfluss der Luftfeuchte - Beta-Beiwert
|
|
114
|
-
if self.fcm <= 35:
|
|
115
|
-
self.beta_h = min(
|
|
116
|
-
1.5 * (1 + (0.012 * self.RH) ** 18) * self.h_0 * 1000 + 250, 1500
|
|
117
|
-
)
|
|
118
|
-
else:
|
|
119
|
-
self.beta_h = min(
|
|
120
|
-
1.5 * (1 + (0.012 * self.RH) ** 18) * self.h_0 * 1000
|
|
121
|
-
+ 250 * self.alpha_3,
|
|
122
|
-
1500 * self.alpha_3,
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
# Einfluss der Belastungsdauer und Belastungsbeginn
|
|
126
|
-
|
|
127
|
-
self.beta_c_t_t0 = (
|
|
128
|
-
(self.t_infty - self.t_0) / (self.beta_h + self.t_infty - self.t_0)
|
|
129
|
-
) ** 0.30
|
|
130
|
-
|
|
131
|
-
self.phi_infty = (
|
|
132
|
-
self.phi_rh * self.beta_fcm * self.beta_t0 * self.beta_c_t_t0
|
|
133
|
-
) # Kriechzahl zum Zeitpunkt t
|
|
134
|
-
|
|
135
|
-
print("Kriechzahl phi ", self.phi_infty)
|
|
136
|
-
|
|
137
|
-
def Schwindzahlen(self):
|
|
138
|
-
self.beta_rh = 1.55 * (1 - (self.RH / 100) ** 3)
|
|
139
|
-
|
|
140
|
-
if self.Zement == "I42.5N" or self.Zement == "I32.5R":
|
|
141
|
-
self.alpha_as = 700
|
|
142
|
-
self.alpha_ds1 = 4
|
|
143
|
-
self.alpha_ds2 = 0.12
|
|
144
|
-
elif (
|
|
145
|
-
self.Zement == "I42.5R"
|
|
146
|
-
or self.Zement == "I52.5N"
|
|
147
|
-
or self.Zement == "I52.5R"
|
|
148
|
-
):
|
|
149
|
-
self.alpha_as = 600
|
|
150
|
-
self.alpha_ds1 = 6
|
|
151
|
-
self.alpha_ds2 = 0.12
|
|
152
|
-
else:
|
|
153
|
-
self.alpha_as = 800
|
|
154
|
-
self.alpha_ds1 = 3
|
|
155
|
-
self.alpha_ds2 = 0.12
|
|
156
|
-
|
|
157
|
-
self.epsilon_cd_0 = (
|
|
158
|
-
0.85
|
|
159
|
-
* ((220 + 110 * self.alpha_ds1) * np.exp(-self.alpha_ds2 * self.fcm / 10))
|
|
160
|
-
* 1e-6
|
|
161
|
-
* self.beta_rh
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
ts = 3 # Nachbehandlung des Betons
|
|
165
|
-
self.t_s = ts
|
|
166
|
-
|
|
167
|
-
t = self.t_infty
|
|
168
|
-
self.t_infty_s = t
|
|
169
|
-
|
|
170
|
-
self.beta_ds = (t - ts) / ((t - ts) + 0.04 * np.sqrt(self.h_0**3))
|
|
171
|
-
|
|
172
|
-
if self.h_0 * 1000 <= 100:
|
|
173
|
-
self.k_h = 1.00
|
|
174
|
-
elif self.h_0 * 1000 > 100 and self.h_0 * 1000 <= 200:
|
|
175
|
-
self.k_h = 1.00 - 0.15 / 100 * self.h_0 * 1000
|
|
176
|
-
elif self.h_0 * 1000 > 200 and self.h_0 * 1000 <= 300:
|
|
177
|
-
self.k_h = 0.85 - 0.10 / 100 * self.h_0 * 1000
|
|
178
|
-
elif self.h_0 * 1000 > 300 and self.h_0 * 1000 <= 500:
|
|
179
|
-
self.k_h = 0.75 - 0.05 / 100 * self.h_0 * 1000
|
|
180
|
-
elif self.h_0 * 1000 > 500:
|
|
181
|
-
self.k_h = 0.70
|
|
182
|
-
|
|
183
|
-
self.epsilon_cd = self.beta_ds * self.epsilon_cd_0 * self.k_h
|
|
184
|
-
|
|
185
|
-
# Autogenes Schwinden
|
|
186
|
-
self.epsilon_ca_infty = 2.5 * (self.fck - 10) * 1e-6
|
|
187
|
-
self.beta_as = 1 - np.exp(-0.2 * np.sqrt(t))
|
|
188
|
-
|
|
189
|
-
self.epsilon_ca = self.beta_as * self.epsilon_ca_infty
|
|
190
|
-
|
|
191
|
-
# Gesamtschwinden
|
|
192
|
-
self.epsilon_cs = self.epsilon_cd + self.epsilon_ca
|
|
193
|
-
|
|
194
|
-
print("Gesamtschwindmaß ", self.epsilon_cs)
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
class Laengsbemessung:
|
|
198
|
-
def __init__(
|
|
199
|
-
self,
|
|
200
|
-
fck=30,
|
|
201
|
-
fyk=500,
|
|
202
|
-
_LoadingType="csv",
|
|
203
|
-
Iter="Bruch",
|
|
204
|
-
Reinforcement="csv",
|
|
205
|
-
Querschnittsbemessung="Polygon",
|
|
206
|
-
P_m_inf = 0, A_p = 0, d_p1 = 0
|
|
207
|
-
):
|
|
208
|
-
# Calculation mode
|
|
209
|
-
self.Iter = Iter
|
|
210
|
-
# Material properties from input
|
|
211
|
-
self.fck = fck
|
|
212
|
-
self.fyk = fyk
|
|
213
|
-
self.varepsilon_grenz = 2 # In Permille
|
|
214
|
-
self.n_czone = 100
|
|
215
|
-
# Init design values for loading
|
|
216
|
-
self.LoadingType = _LoadingType
|
|
217
|
-
|
|
218
|
-
self.NEd_GZT = 0
|
|
219
|
-
self.MEd_GZT = 0
|
|
220
|
-
self.MEds_GZT = 0
|
|
221
|
-
self.Mrds_GZT = 0
|
|
222
|
-
|
|
223
|
-
self.NEd_GZG = 0
|
|
224
|
-
self.MEd_GZG = 0
|
|
225
|
-
self.MEds_GZG = 0
|
|
226
|
-
|
|
227
|
-
self.PM_inf = P_m_inf
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
# Geometric parameters for the design
|
|
232
|
-
self.Bewehrung = Reinforcement
|
|
233
|
-
|
|
234
|
-
self.d_s1 = 0
|
|
235
|
-
self.d_s2 = 0
|
|
236
|
-
self.dp_1 = d_p1 # Abstand der Außenkante Biegezug bis elast. Zentrum des Spannglieds
|
|
237
|
-
|
|
238
|
-
self.A_svorh = 0
|
|
239
|
-
self.A_svorh2 = 0
|
|
240
|
-
|
|
241
|
-
self.Ap = A_p
|
|
242
|
-
try:
|
|
243
|
-
self.epsilon_pm_inf = abs(self.PM_inf / self.Ap * 1/ self.Ep ) #Vordehnung
|
|
244
|
-
except:
|
|
245
|
-
self.epsilon_pm_inf = 0
|
|
246
|
-
self.epsilon_yk = 1500/195000 # Für St 1550/1770
|
|
247
|
-
|
|
248
|
-
def Calculate_All(self):
|
|
249
|
-
self.Querschnittswerte()
|
|
250
|
-
self.Bewehrungsangaben()
|
|
251
|
-
self.Baustoffe()
|
|
252
|
-
self.ReadLoading()
|
|
253
|
-
self.Iter_Gebrauchslast()
|
|
254
|
-
# if self.Iter == "Bruch":
|
|
255
|
-
# self.Iter_Compression()
|
|
256
|
-
# else:
|
|
257
|
-
# self.Iter_Gebrauchslast()
|
|
258
|
-
|
|
259
|
-
def Querschnittswerte(self, _height_test=0.5):
|
|
260
|
-
# Example usage
|
|
261
|
-
df = pd.read_csv("Polygon/Polygon.csv")
|
|
262
|
-
self.vertices = df.values.tolist()
|
|
263
|
-
|
|
264
|
-
self.polygon = PolygonSection(self.vertices)
|
|
265
|
-
|
|
266
|
-
# Calculate the height of the polygon based on y-values
|
|
267
|
-
|
|
268
|
-
y_values = [vertex[1] for vertex in self.vertices]
|
|
269
|
-
self.height = abs(max(y_values) - min(y_values))
|
|
270
|
-
self.z_su = self.height - self.polygon.centroid[0]
|
|
271
|
-
self.z_so = self.height - self.z_su
|
|
272
|
-
|
|
273
|
-
# Define the rotation angle
|
|
274
|
-
self.angle_degrees = 0
|
|
275
|
-
self.polygon.rotate(self.angle_degrees)
|
|
276
|
-
|
|
277
|
-
height = _height_test
|
|
278
|
-
section_width = self.polygon.calculate_section_width_at_height(height)
|
|
279
|
-
|
|
280
|
-
return section_width
|
|
281
|
-
|
|
282
|
-
def PlotCrossSection(self, _height_test=0.5):
|
|
283
|
-
# Define the height at which to calculate the section width
|
|
284
|
-
height = _height_test
|
|
285
|
-
section_width = self.polygon.calculate_section_width_at_height(height)
|
|
286
|
-
print(
|
|
287
|
-
f"Section width at height {height} after rotating by {self.angle_degrees} degrees: {section_width}"
|
|
288
|
-
)
|
|
289
|
-
|
|
290
|
-
# Plot the polygon and the horizontal line
|
|
291
|
-
self.polygon.plot(height)
|
|
292
|
-
|
|
293
|
-
def Bewehrungsangaben(self):
|
|
294
|
-
if self.Bewehrung == "csv":
|
|
295
|
-
df = pd.read_csv("Bewehrung/Linienbewehrung.csv")
|
|
296
|
-
print(df)
|
|
297
|
-
for i in range(0, len(df["Lage"]), 1):
|
|
298
|
-
Lage = df["Lage"][i]
|
|
299
|
-
if Lage == "Unten":
|
|
300
|
-
self.d_s1 = (
|
|
301
|
-
df["dsl [m]"][i] * 0.5 + df["cnom [m]"][i] + df["dsw [m]"][i]
|
|
302
|
-
)
|
|
303
|
-
self.A_svorh = df["As [cm**2]"][i]
|
|
304
|
-
elif Lage == "Oben":
|
|
305
|
-
self.d_s2 = (
|
|
306
|
-
df["dsl [m]"][i] * 0.5 + df["cnom [m]"][i] + df["dsw [m]"][i]
|
|
307
|
-
)
|
|
308
|
-
self.A_svorh2 = df["As [cm**2]"][i]
|
|
309
|
-
|
|
310
|
-
self.z_ds1 = self.z_su - self.d_s1
|
|
311
|
-
self.z_ds2 = self.z_so - self.d_s2
|
|
312
|
-
|
|
313
|
-
def ReadLoading(self):
|
|
314
|
-
if self.LoadingType == "csv":
|
|
315
|
-
df = pd.read_csv("Lasteingabe/Lasten.csv")
|
|
316
|
-
print(df)
|
|
317
|
-
self.Zugseite = None
|
|
318
|
-
for i in range(0, len(df["Grenzzustand"]), 1):
|
|
319
|
-
if df["Grenzzustand"][i] == "GZT":
|
|
320
|
-
self.NEd_GZT = df["NEd in [MN]"][i]
|
|
321
|
-
self.MEd_GZT = df["MEd in [MNm]"][i]
|
|
322
|
-
elif df["Grenzzustand"][i] == "GZG":
|
|
323
|
-
self.NEd_GZG = df["NEd in [MN]"][i]
|
|
324
|
-
self.MEd_GZG = df["MEd in [MNm]"][i]
|
|
325
|
-
|
|
326
|
-
if self.MEd_GZT >= 0:
|
|
327
|
-
self.MEds_GZT = abs(
|
|
328
|
-
self.MEd_GZT - self.NEd_GZT * self.z_ds1 + self.PM_inf * (self.dp_1 - self.d_s1)
|
|
329
|
-
) # Bezug auf die Biegezugbewehrung (Hier UNTEN)
|
|
330
|
-
self.NEd_GZT -= self.PM_inf
|
|
331
|
-
self.Zugseite_GZT = "UNTEN"
|
|
332
|
-
self.d = self.height - self.d_s1
|
|
333
|
-
elif self.MEd_GZT < 0:
|
|
334
|
-
self.MEds_GZT = abs(
|
|
335
|
-
self.MEd_GZT + self.NEd_GZT * self.z_ds2 - self.PM_inf * (self.dp_1 - self.d_s1)
|
|
336
|
-
) # Bezug auf die Biegezugbewehrung (Hier OBEN)
|
|
337
|
-
self.NEd_GZT -= self.PM_inf
|
|
338
|
-
self.Zugseite_GZT = "OBEN"
|
|
339
|
-
self.d = self.height - self.d_s2
|
|
340
|
-
|
|
341
|
-
if self.MEd_GZG >= 0:
|
|
342
|
-
self.MEds_GZG = self.MEd_GZG - self.NEd_GZG * self.z_ds1 + self.PM_inf * (self.dp_1 - self.d_s1)
|
|
343
|
-
self.NEd_GZG -= self.PM_inf
|
|
344
|
-
self.Zugseite_GZG = "UNTEN"
|
|
345
|
-
self.d = self.height - self.d_s1
|
|
346
|
-
elif self.MEd_GZG < 0:
|
|
347
|
-
self.MEds_GZG = self.MEd_GZG + self.NEd_GZG * self.z_ds2 - self.PM_inf * (self.dp_1 - self.d_s1)
|
|
348
|
-
self.NEd_GZG -= self.PM_inf
|
|
349
|
-
self.Zugseite_GZG = "OBEN"
|
|
350
|
-
self.d = self.height - self.d_s2
|
|
351
|
-
|
|
352
|
-
else:
|
|
353
|
-
self.NEd_GZT = float(
|
|
354
|
-
input("Geben Sie die Normalkraft NEd im GZT in [MN] ein: \n")
|
|
355
|
-
)
|
|
356
|
-
self.MEd_GZT = float(
|
|
357
|
-
input("Geben Sie das Biegemoment im GZT in [MN] ein: \n")
|
|
358
|
-
)
|
|
359
|
-
if self.MEd_GZT >= 0:
|
|
360
|
-
self.MEds_GZT = self.MEd_GZT - self.NEd_GZT * self.z_ds1
|
|
361
|
-
elif self.MEd_GZT < 0:
|
|
362
|
-
self.MEds_GZT = self.MEd_GZT + self.NEd_GZT * self.z_ds1
|
|
363
|
-
|
|
364
|
-
if self.MEd_GZG >= 0:
|
|
365
|
-
self.MEds_GZG = self.MEd_GZG - self.NEd_GZG * self.z_ds1
|
|
366
|
-
elif self.MEd_GZG < 0:
|
|
367
|
-
self.MEds_GZG = self.MEd_GZG + self.NEd_GZG * self.z_ds1
|
|
368
|
-
|
|
369
|
-
# Export loading parameters to the output folder
|
|
370
|
-
self.zsi_GZT = None
|
|
371
|
-
self.zsi_GZG = None
|
|
372
|
-
|
|
373
|
-
if self.Zugseite_GZT == "UNTEN":
|
|
374
|
-
self.zsi_GZT = self.z_ds1
|
|
375
|
-
else:
|
|
376
|
-
self.zsi_GZT = self.z_ds2
|
|
377
|
-
|
|
378
|
-
if self.Zugseite_GZG == "UNTEN":
|
|
379
|
-
self.zsi_GZG = self.z_ds1
|
|
380
|
-
else:
|
|
381
|
-
self.zsi_GZG = self.z_ds2
|
|
382
|
-
|
|
383
|
-
df = pd.DataFrame(
|
|
384
|
-
{
|
|
385
|
-
"GZT": [
|
|
386
|
-
self.NEd_GZT,
|
|
387
|
-
self.MEd_GZT,
|
|
388
|
-
self.zsi_GZT,
|
|
389
|
-
self.MEds_GZT,
|
|
390
|
-
self.Zugseite_GZT,
|
|
391
|
-
],
|
|
392
|
-
"GZG": [
|
|
393
|
-
self.NEd_GZG,
|
|
394
|
-
self.MEd_GZG,
|
|
395
|
-
self.zsi_GZG,
|
|
396
|
-
self.MEds_GZG,
|
|
397
|
-
self.Zugseite_GZG,
|
|
398
|
-
],
|
|
399
|
-
},
|
|
400
|
-
index=[
|
|
401
|
-
"NEd [MN]",
|
|
402
|
-
"MEd in [MNm]",
|
|
403
|
-
"zsi in [m]",
|
|
404
|
-
"|MEds| in [MNm]",
|
|
405
|
-
"Zugseite",
|
|
406
|
-
],
|
|
407
|
-
)
|
|
408
|
-
|
|
409
|
-
df.to_csv("Output/Design_Forces.csv")
|
|
410
|
-
|
|
411
|
-
def Baustoffe(self):
|
|
412
|
-
self.fcd = self.fck / 1.5 * 0.85
|
|
413
|
-
self.fctm = 0.30 * self.fck ** (2 / 3) # Nach Eurocode 2 Tabelle 3.1
|
|
414
|
-
self.fctk_005 = 0.7 * self.fctm
|
|
415
|
-
self.fcm = self.fck + 8
|
|
416
|
-
self.Ecm = 22000 * (self.fcm / 10) ** 0.3
|
|
417
|
-
# Stahl
|
|
418
|
-
self.fyd = self.fyk / 1.15
|
|
419
|
-
self.Es = 200000
|
|
420
|
-
# Spannstahl
|
|
421
|
-
self.Ep = 195000 # Für Litzen
|
|
422
|
-
|
|
423
|
-
def Sigma_ParabalRechteck(self, _varepsilon):
|
|
424
|
-
if _varepsilon <= self.varepsilon_grenz:
|
|
425
|
-
sigma = self.fcd * (1 - (1 - _varepsilon / self.varepsilon_grenz) ** 2)
|
|
426
|
-
return sigma
|
|
427
|
-
else:
|
|
428
|
-
sigma = self.fcd
|
|
429
|
-
return sigma
|
|
430
|
-
|
|
431
|
-
def Sigma_Gebrauchslasten(self, _varepsilon):
|
|
432
|
-
"""
|
|
433
|
-
This function returns the concrete stresses under
|
|
434
|
-
servicability strains smaller than 0.5e-3.
|
|
435
|
-
Args:
|
|
436
|
-
_varepsilon (_type_): _description_
|
|
437
|
-
|
|
438
|
-
Returns:
|
|
439
|
-
_type_: _description_
|
|
440
|
-
"""
|
|
441
|
-
return self.Ecm * _varepsilon * 1e-3
|
|
442
|
-
|
|
443
|
-
def Iter_Compression(self):
|
|
444
|
-
print("iteration")
|
|
445
|
-
iter = 0
|
|
446
|
-
self.epss = 25
|
|
447
|
-
self.epsc = 0.00
|
|
448
|
-
self.dimensionsless_moment = 0
|
|
449
|
-
self.limit_dimensionless_moment = 0.296
|
|
450
|
-
self.bcm_i = np.zeros(self.n_czone - 1)
|
|
451
|
-
self.hcm_i = np.zeros(self.n_czone - 1)
|
|
452
|
-
|
|
453
|
-
self.Fc_i = np.zeros(self.n_czone - 1)
|
|
454
|
-
|
|
455
|
-
while self.Mrds <= self.Meds and iter <= 10000:
|
|
456
|
-
self.xi = self.epsc / (self.epss + self.epsc)
|
|
457
|
-
self.hu = self.height * (1 - self.xi)
|
|
458
|
-
|
|
459
|
-
self.hc_i = np.linspace(self.hu, self.height, self.n_czone)
|
|
460
|
-
self.Mrds = 0
|
|
461
|
-
|
|
462
|
-
for i in range(0, self.n_czone - 1, 1):
|
|
463
|
-
self.hcm_i[i] = 0.5 * (self.hc_i[i] + self.hc_i[i + 1])
|
|
464
|
-
self.bcm_i[i] = 0.5 * (
|
|
465
|
-
self.Querschnittswerte(self.hc_i[i])
|
|
466
|
-
+ self.Querschnittswerte(self.hc_i[i + 1])
|
|
467
|
-
)
|
|
468
|
-
|
|
469
|
-
for i in range(0, self.n_czone - 1, 1):
|
|
470
|
-
epsilon_ci = abs(
|
|
471
|
-
self.epss
|
|
472
|
-
- (self.epsc + self.epss) / self.d * (self.hcm_i[i] - self.d_s1)
|
|
473
|
-
)
|
|
474
|
-
sigma_ci = self.Sigma_ParabalRechteck(epsilon_ci)
|
|
475
|
-
|
|
476
|
-
self.Fc_i[i] = (
|
|
477
|
-
(self.hc_i[i + 1] - self.hc_i[i]) * self.bcm_i[i] * sigma_ci
|
|
478
|
-
)
|
|
479
|
-
|
|
480
|
-
self.Mrds += self.Fc_i[i] * (self.hcm_i[i] - self.d_s1)
|
|
481
|
-
|
|
482
|
-
iter += 1
|
|
483
|
-
|
|
484
|
-
if self.epsc >= 3.5:
|
|
485
|
-
while self.Mrds <= self.Meds and iter <= 10000:
|
|
486
|
-
self.Mrds = 0
|
|
487
|
-
|
|
488
|
-
self.xi = self.epsc / (self.epss + self.epsc)
|
|
489
|
-
self.hu = self.height * (1 - self.xi)
|
|
490
|
-
self.hc_i = np.linspace(self.hu, self.height, self.n_czone)
|
|
491
|
-
|
|
492
|
-
for i in range(0, self.n_czone - 1, 1):
|
|
493
|
-
self.hcm_i[i] = 0.5 * (self.hc_i[i] + self.hc_i[i + 1])
|
|
494
|
-
self.bcm_i[i] = 0.5 * (
|
|
495
|
-
self.Querschnittswerte(self.hc_i[i])
|
|
496
|
-
+ self.Querschnittswerte(self.hc_i[i + 1])
|
|
497
|
-
)
|
|
498
|
-
epsilon_ci = abs(
|
|
499
|
-
self.epss
|
|
500
|
-
- (self.epsc + self.epss)
|
|
501
|
-
/ self.d
|
|
502
|
-
* (self.hcm_i[i] - self.d_s1)
|
|
503
|
-
)
|
|
504
|
-
sigma_ci = self.Sigma_ParabalRechteck(epsilon_ci)
|
|
505
|
-
self.Fc_i[i] = (
|
|
506
|
-
(self.hc_i[i + 1] - self.hc_i[i]) * self.bcm_i[i] * sigma_ci
|
|
507
|
-
)
|
|
508
|
-
|
|
509
|
-
self.Mrds += self.Fc_i[i] * (self.hcm_i[i] - self.d_s1)
|
|
510
|
-
|
|
511
|
-
iter += 1
|
|
512
|
-
|
|
513
|
-
if abs(self.Mrds - self.Meds) > 0.15:
|
|
514
|
-
self.epss -= 0.1
|
|
515
|
-
elif abs(self.Mrds - self.Meds) > 0.02:
|
|
516
|
-
self.epss -= 0.01
|
|
517
|
-
else:
|
|
518
|
-
self.epss -= 0.001
|
|
519
|
-
|
|
520
|
-
if abs(self.Mrds - self.Meds) > 0.15:
|
|
521
|
-
self.epsc += 0.1
|
|
522
|
-
elif abs(self.Mrds - self.Meds) > 0.02:
|
|
523
|
-
self.epsc += 0.01
|
|
524
|
-
else:
|
|
525
|
-
self.epsc += 0.0001
|
|
526
|
-
|
|
527
|
-
self.F_sd = self.Fc_i.sum() + self.NEd
|
|
528
|
-
self.A_serf = self.F_sd / self.fyd
|
|
529
|
-
|
|
530
|
-
print(
|
|
531
|
-
"The required reinforcement for bending is ",
|
|
532
|
-
self.A_serf * 100**2,
|
|
533
|
-
"cm**2",
|
|
534
|
-
)
|
|
535
|
-
|
|
536
|
-
def Iter_Gebrauchslast(self):
|
|
537
|
-
iter = 0
|
|
538
|
-
|
|
539
|
-
self.bcm_i = np.zeros(self.n_czone - 1)
|
|
540
|
-
self.hcm_i = np.zeros(self.n_czone - 1)
|
|
541
|
-
self.Fc_i = np.zeros(self.n_czone - 1)
|
|
542
|
-
|
|
543
|
-
self.Fc_ges = 0
|
|
544
|
-
self.F_c_list = []
|
|
545
|
-
self.F_s1_ges = 0
|
|
546
|
-
self.F_s1_list = []
|
|
547
|
-
|
|
548
|
-
sum_h = []
|
|
549
|
-
sum_F_s1 = []
|
|
550
|
-
sum_F_s2 = []
|
|
551
|
-
sum_F_c = []
|
|
552
|
-
|
|
553
|
-
resu = []
|
|
554
|
-
|
|
555
|
-
b = self.Querschnittswerte(self.height / 2)
|
|
556
|
-
xi = 1e-4
|
|
557
|
-
result = 1
|
|
558
|
-
|
|
559
|
-
print("Iteration begins")
|
|
560
|
-
p = 0
|
|
561
|
-
while xi < 0.70:
|
|
562
|
-
print(xi)
|
|
563
|
-
x = xi * self.d
|
|
564
|
-
|
|
565
|
-
epsilon_c2 = self.MEds_GZG / (
|
|
566
|
-
(self.d - x / 3) * (0.5 * b * x * self.Ecm)
|
|
567
|
-
+ self.Es
|
|
568
|
-
* (1 - self.d_s2 / x)
|
|
569
|
-
* (self.d - self.d_s2)
|
|
570
|
-
* self.A_svorh2
|
|
571
|
-
* 0.01**2
|
|
572
|
-
)
|
|
573
|
-
|
|
574
|
-
sigma_c2 = epsilon_c2 * self.Ecm
|
|
575
|
-
epsilon_s1 = epsilon_c2 * (self.d / x - 1)
|
|
576
|
-
epsilon_s2 = epsilon_c2 * (1 - self.d_s2 / x)
|
|
577
|
-
|
|
578
|
-
self.F_ci = 0.5 * b * x * sigma_c2 * (-1)
|
|
579
|
-
if self.F_ci > 0:
|
|
580
|
-
self.F_ci = 0
|
|
581
|
-
|
|
582
|
-
self.F_s1 = (self.A_svorh * 0.01**2) * epsilon_s1 * self.Es
|
|
583
|
-
self.F_s2 = epsilon_s2 * self.Es * self.A_svorh2 * 0.01**2 * (-1)
|
|
584
|
-
|
|
585
|
-
result = - self.NEd_GZG + self.F_s1 + self.F_ci + self.F_s2
|
|
586
|
-
|
|
587
|
-
sum_h.append(result)
|
|
588
|
-
sum_F_s1.append(self.F_s1)
|
|
589
|
-
sum_F_s2.append(self.F_s2)
|
|
590
|
-
sum_F_c.append(self.F_ci)
|
|
591
|
-
|
|
592
|
-
if abs(result) < 0.0001:
|
|
593
|
-
print("The iterated compression zone height xi is ", xi ,"and x = ", xi*self.d)
|
|
594
|
-
self.xi = xi
|
|
595
|
-
break
|
|
596
|
-
|
|
597
|
-
if abs(result) > 0.5:
|
|
598
|
-
xi += 0.0001
|
|
599
|
-
elif abs(result) > 0.01:
|
|
600
|
-
xi += 0.00001
|
|
601
|
-
else:
|
|
602
|
-
xi += 0.000001
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
p+=1
|
|
606
|
-
|
|
607
|
-
print(xi)
|
|
608
|
-
# plt.plot(sum_h)
|
|
609
|
-
# plt.show()
|
|
610
|
-
|
|
611
|
-
def Iter_Gebrauchslast_Spannbeton(self):
|
|
612
|
-
iter = 0
|
|
613
|
-
|
|
614
|
-
self.bcm_i = np.zeros(self.n_czone - 1)
|
|
615
|
-
self.hcm_i = np.zeros(self.n_czone - 1)
|
|
616
|
-
self.Fc_i = np.zeros(self.n_czone - 1)
|
|
617
|
-
|
|
618
|
-
self.Fc_ges = 0
|
|
619
|
-
self.F_c_list = []
|
|
620
|
-
self.F_s1_ges = 0
|
|
621
|
-
self.F_s1_list = []
|
|
622
|
-
|
|
623
|
-
sum_h = []
|
|
624
|
-
sum_F_s1 = []
|
|
625
|
-
sum_F_s2 = []
|
|
626
|
-
sum_F_c = []
|
|
627
|
-
sum_F_p = []
|
|
628
|
-
|
|
629
|
-
xi = 1e-5
|
|
630
|
-
|
|
631
|
-
b = self.Querschnittswerte(self.height / 2)
|
|
632
|
-
print("Iteration begins")
|
|
633
|
-
|
|
634
|
-
while xi < 0.60:
|
|
635
|
-
x = xi * self.d
|
|
636
|
-
epsilon_c2 = self.MEds_GZG / (
|
|
637
|
-
(self.d - x / 3) * (0.5 * b * x * self.Ecm)
|
|
638
|
-
+ self.Es
|
|
639
|
-
* (1 - self.d_s2 / x)
|
|
640
|
-
* (self.d - self.d_s2)
|
|
641
|
-
* self.A_svorh2
|
|
642
|
-
* 0.01**2
|
|
643
|
-
|
|
644
|
-
)
|
|
645
|
-
|
|
646
|
-
sigma_c2 = epsilon_c2 * self.Ecm
|
|
647
|
-
epsilon_s1 = epsilon_c2 * (self.d / x - 1)
|
|
648
|
-
epsilon_s2 = epsilon_c2 * (1 - self.d_s2 / x)
|
|
649
|
-
|
|
650
|
-
epsilon_p = epsilon_c2 + (abs(epsilon_c2) + epsilon_s1)/self.d * (self.height - self.dp_1) # Additional strains in the prestressing cable
|
|
651
|
-
|
|
652
|
-
self.F_ci = 0.5 * b * x * sigma_c2
|
|
653
|
-
|
|
654
|
-
if self.F_ci < 0:
|
|
655
|
-
self.F_ci = 0
|
|
656
|
-
if (epsilon_s1 * self.Es <= self.fyk):
|
|
657
|
-
self.F_s1 = (self.A_svorh * 0.01**2) * epsilon_s1 * self.Es
|
|
658
|
-
else:
|
|
659
|
-
self.F_s1 = (self.A_svorh * 0.01**2) * self.fyk
|
|
660
|
-
if (epsilon_s2 * self.Es <= self.fyk):
|
|
661
|
-
self.F_s2 = epsilon_s2 * self.Es * self.A_svorh2 * 0.01**2
|
|
662
|
-
else:
|
|
663
|
-
self.F_s2 = - self.fyk * self.A_svorh2 * 0.01**2
|
|
664
|
-
|
|
665
|
-
if (abs(epsilon_p +self.epsilon_pm_inf) <= self.epsilon_yk):
|
|
666
|
-
self.F_p = abs((epsilon_p)) * self.Ep * self.Ap
|
|
667
|
-
else:
|
|
668
|
-
self.F_p = 1500 * self.Ap
|
|
669
|
-
|
|
670
|
-
result = -self.NEd_GZG + self.F_s1 - self.F_ci + self.F_s2 + self.F_p
|
|
671
|
-
|
|
672
|
-
sum_h.append(result)
|
|
673
|
-
sum_F_s1.append(self.F_s1)
|
|
674
|
-
sum_F_s2.append(self.F_s2)
|
|
675
|
-
sum_F_c.append(self.F_ci)
|
|
676
|
-
|
|
677
|
-
if abs(result) < 0.0001:
|
|
678
|
-
print("The iterated compression zone height xi is ", xi)
|
|
679
|
-
self.xi = xi
|
|
680
|
-
break
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
if abs(result) > 0.7:
|
|
684
|
-
xi += 0.0001
|
|
685
|
-
elif abs(result) > 0.10:
|
|
686
|
-
xi += 0.00001
|
|
687
|
-
else:
|
|
688
|
-
xi += 0.000001
|
|
689
|
-
|
|
690
|
-
print("Ned", self.NEd_GZG)
|
|
691
|
-
print("xi",xi)
|
|
692
|
-
print("Sum H", result)
|
|
693
|
-
print("MEds - GZG", self.MEds_GZG)
|
|
694
|
-
print("NEd - GZG", self.NEd_GZG)
|
|
695
|
-
|
|
696
|
-
print("Fcd", self.F_ci)
|
|
697
|
-
print("FP", self.F_p)
|
|
698
|
-
print("Fs1" , self.F_s1)
|
|
699
|
-
print("Fs2", self.F_s2)
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
Laengs = Laengsbemessung(P_m_inf=0,A_p=37.8*0.01**2,d_p1=0.19)
|
|
703
|
-
|
|
704
|
-
Laengs.Calculate_All()
|
|
705
|
-
|
|
706
|
-
print("Fcd" ,Laengs.F_ci)
|
|
707
|
-
print("Fs1",Laengs.F_s1)
|
|
708
|
-
print("Fs2",Laengs.F_s2)
|
|
709
|
-
print("NEd",Laengs.NEd_GZG)
|
|
710
|
-
|
|
711
|
-
print("Sigma_s1 [MPa]", Laengs.F_s1 / (Laengs.A_svorh*0.01**2))
|
|
712
|
-
print("Sigma_s2 [MPa]", Laengs.F_s2 / (Laengs.A_svorh2*0.01**2))
|
|
713
|
-
|
|
714
|
-
print(Laengs.MEds_GZG)
|
|
715
|
-
|
|
716
|
-
print(Laengs.z_su)
|
|
717
|
-
print(Laengs.d_s1)
|
|
718
|
-
print(Laengs.d_s2)
|
|
719
|
-
|
|
720
|
-
Laengs.PlotCrossSection()
|
|
721
|
-
|
|
722
|
-
# Laengs.Iter_Gebrauchslast_Spannbeton()
|
|
723
|
-
|