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