ourocode 1.6.0__py3-none-any.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.
Potentially problematic release.
This version of ourocode might be problematic. Click here for more details.
- ourocode/__init__.py +0 -0
- ourocode/__version__.py +1 -0
- ourocode/data/caracteristique_meca_acier.csv +33 -0
- ourocode/data/caracteristique_meca_bois.csv +59 -0
- ourocode/data/carte_action_region.csv +36722 -0
- ourocode/data/coeff_psy.csv +13 -0
- ourocode/data/exploitation.csv +17 -0
- ourocode/data/gammaM.csv +14 -0
- ourocode/data/kdef.csv +11 -0
- ourocode/data/kfi.csv +10 -0
- ourocode/data/kmod.csv +16 -0
- ourocode/data/limite_fleche.csv +9 -0
- ourocode/data/qualite_acier.csv +18 -0
- ourocode/data/screenshot/C90_def.png +0 -0
- ourocode/data/screenshot/Kv_def.png +0 -0
- ourocode/data/screenshot/fleche.png +0 -0
- ourocode/data/screenshot/sign_convention.png +0 -0
- ourocode/data/section_boulon.csv +12 -0
- ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.csv +22 -0
- ourocode/data/vent/vent_Cp_toiture_isolee_1_versant.png +0 -0
- ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.csv +31 -0
- ourocode/data/vent/vent_Cp_toiture_isolee_2_versants.png +0 -0
- ourocode/data/vent/vent_Cpe_mur_verticaux.csv +11 -0
- ourocode/data/vent/vent_Cpe_mur_verticaux.png +0 -0
- ourocode/data/vent/vent_Cpe_toiture_1_versant.png +0 -0
- ourocode/data/vent/vent_Cpe_toiture_1_versant_0_degres.csv +13 -0
- ourocode/data/vent/vent_Cpe_toiture_1_versant_180_degres.csv +13 -0
- ourocode/data/vent/vent_Cpe_toiture_1_versant_90_degres.csv +13 -0
- ourocode/data/vent/vent_Cpe_toiture_2_versants.png +0 -0
- ourocode/data/vent/vent_Cpe_toiture_2_versants_0_degres.csv +21 -0
- ourocode/data/vent/vent_Cpe_toiture_2_versants_90_degres.csv +21 -0
- ourocode/data/vent/vent_Cpe_toiture_terrasse.csv +21 -0
- ourocode/data/vent/vent_Cpe_toiture_terrasse.png +0 -0
- ourocode/data/vent/vent_Ffr.png +0 -0
- ourocode/eurocode/A0_Projet.py +1408 -0
- ourocode/eurocode/EC0_Combinaison.py +1763 -0
- ourocode/eurocode/EC1_Exploitation.py +103 -0
- ourocode/eurocode/EC1_Neige.py +385 -0
- ourocode/eurocode/EC1_Vent.py +1388 -0
- ourocode/eurocode/EC3_Assemblage.py +466 -0
- ourocode/eurocode/EC3_Element_droit.py +302 -0
- ourocode/eurocode/EC5_Assemblage.py +1760 -0
- ourocode/eurocode/EC5_Element_droit.py +1740 -0
- ourocode/eurocode/EC5_Feu.py +922 -0
- ourocode/eurocode/EC8_Sismique.py +2 -0
- ourocode/eurocode/__init__.py +0 -0
- ourocode/eurocode/logical.py +83 -0
- ourocode/eurocode/objet.py +263 -0
- ourocode-1.6.0.dist-info/METADATA +331 -0
- ourocode-1.6.0.dist-info/RECORD +53 -0
- ourocode-1.6.0.dist-info/WHEEL +5 -0
- ourocode-1.6.0.dist-info/licenses/LICENSE +201 -0
- ourocode-1.6.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,922 @@
|
|
|
1
|
+
#! env\Scripts\python.exe
|
|
2
|
+
# Encoding in UTF-8 by Anthony PARISOT
|
|
3
|
+
import sys
|
|
4
|
+
import os
|
|
5
|
+
import math as mt
|
|
6
|
+
from math import sqrt, pi
|
|
7
|
+
import pandas as pd
|
|
8
|
+
|
|
9
|
+
import forallpeople as si
|
|
10
|
+
|
|
11
|
+
si.environment("structural")
|
|
12
|
+
from handcalcs.decorator import handcalc
|
|
13
|
+
|
|
14
|
+
sys.path.append(os.path.join(os.getcwd()))
|
|
15
|
+
from ourocode.eurocode.EC5_Element_droit import (
|
|
16
|
+
Barre,
|
|
17
|
+
Flexion,
|
|
18
|
+
Traction,
|
|
19
|
+
Compression,
|
|
20
|
+
Cisaillement,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def interpolation_lineaire(x, xa, xb, ya, yb):
|
|
25
|
+
"""Fait une interpolation linéaire pour trouver un résultat y entre deux valeur xa et xb"""
|
|
26
|
+
y = ya + (x - xa) * ((yb - ya) / (xb - xa))
|
|
27
|
+
return y
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# ================================ GLOBAL ==================================
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class Feu(Barre):
|
|
34
|
+
EXPOSITION = (
|
|
35
|
+
"Pas d'exposition",
|
|
36
|
+
"Aucune protection",
|
|
37
|
+
"1 plaque de platre type A joints comblés",
|
|
38
|
+
"1 plaque de platre type A joints vides",
|
|
39
|
+
"1 plaque de platre type F joints comblés",
|
|
40
|
+
"1 plaque de platre type F joints vides",
|
|
41
|
+
"1 plaque de platre type H joints comblés",
|
|
42
|
+
"1 plaque de platre type H joints vides",
|
|
43
|
+
"Fibre de roche",
|
|
44
|
+
"Panneautage bois",
|
|
45
|
+
"Contreplaqué",
|
|
46
|
+
"Panneaux de fibres ou de particules",
|
|
47
|
+
)
|
|
48
|
+
D0 = 7 * si.mm
|
|
49
|
+
KMOD_FI = 1
|
|
50
|
+
ORIENTATION = ("Haut", "Bas", "Gauche", "Droite")
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
t_expo: int = 30,
|
|
55
|
+
haut: str = EXPOSITION,
|
|
56
|
+
bas: str = EXPOSITION,
|
|
57
|
+
gauche: str = EXPOSITION,
|
|
58
|
+
droite: str = EXPOSITION,
|
|
59
|
+
double_couches: bool = ("False", "True"),
|
|
60
|
+
hp: si.mm = 0,
|
|
61
|
+
rho_k_protect: float = 0,
|
|
62
|
+
tf: int = None,
|
|
63
|
+
**kwargs,
|
|
64
|
+
):
|
|
65
|
+
"""Classe qui définit les caractéristiques d'un élément droit au feu.
|
|
66
|
+
Cette classe est hérité de la classe Barre du module EC5_Element_droit.py.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
t_expo (int, optional): Durée d'exposition au feu en minutes. Defaults to 30.
|
|
70
|
+
|
|
71
|
+
Attention :
|
|
72
|
+
Pour la détermination des joints vides ou comblés en cas de protection rapportée:
|
|
73
|
+
un joint est considéré comme comblé si le vide est <= à 2mm.
|
|
74
|
+
|
|
75
|
+
haut (str): Type d'expostion ou de protection au feu sur le haut de l'élément.
|
|
76
|
+
bas (str): Type d'expostion ou de protection au feu sur le bas de l'élément.
|
|
77
|
+
gauche (str): Type d'expostion ou de protection au feu sur le gauche de l'élément.
|
|
78
|
+
droite (str): Type d'expostion ou de protection au feu sur le droite de l'élément.
|
|
79
|
+
hp (int)): épaisseur totale (si double couches) des panneaux de protection en mm. Defaults to 0.
|
|
80
|
+
rho_k_protect (float): A définir uniquement si il y a un ou des panneaux de protection bois ou en fibre de roche.
|
|
81
|
+
Masse volumique des panneaux de protection en kg/m3. Defaults to 0.
|
|
82
|
+
tf (int, optional): Durée avant rupture du matériaux de protection au feu en minutes. Defaults to None.
|
|
83
|
+
Attention uniquement pour les plaques de platre de type F ou les panneaux de fibres de roche.
|
|
84
|
+
On ne peut par conséquent pas définir des plaques de platre de type F en même temps que des panneaux de fibres de roche.
|
|
85
|
+
"""
|
|
86
|
+
super().__init__(**kwargs)
|
|
87
|
+
self.t_expo = t_expo
|
|
88
|
+
self.haut = haut
|
|
89
|
+
self.bas = bas
|
|
90
|
+
self.gauche = gauche
|
|
91
|
+
self.droite = droite
|
|
92
|
+
self.protection = {
|
|
93
|
+
"Haut": haut,
|
|
94
|
+
"Bas": bas,
|
|
95
|
+
"Gauche": gauche,
|
|
96
|
+
"Droite": droite,
|
|
97
|
+
}
|
|
98
|
+
self.double_couches = double_couches
|
|
99
|
+
self.hp = hp * si.mm
|
|
100
|
+
self.rho_k_protect = rho_k_protect
|
|
101
|
+
self.tf = tf
|
|
102
|
+
self._get_section_reduction()
|
|
103
|
+
|
|
104
|
+
def __convert_latex_ftyped(self, latex: str, type_caract: str):
|
|
105
|
+
end_index_rk = type_caract.find("k")
|
|
106
|
+
type_caract = type_caract[1:end_index_rk]
|
|
107
|
+
latex = latex.replace("f_{type_{Rd}", "f_{" + type_caract + "_{" + "d_fi}")
|
|
108
|
+
latex = latex.replace("f_{type_{k}", "f_{" + type_caract + "_{" + "k_fi}")
|
|
109
|
+
return latex
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def K_fi(self):
|
|
113
|
+
data_csv_kfi = self._data_from_csv("kfi.csv")
|
|
114
|
+
return float(data_csv_kfi.loc[self.type_bois]["kfi"])
|
|
115
|
+
|
|
116
|
+
def _get_bar_beta0_and_betan(self):
|
|
117
|
+
beta_0 = None
|
|
118
|
+
beta_n = None
|
|
119
|
+
rho_k = int(self.caract_meca.loc["rhok"])
|
|
120
|
+
if self.classe[0:1] == "C" and rho_k >= 290:
|
|
121
|
+
beta_0 = 0.65
|
|
122
|
+
beta_n = 0.8
|
|
123
|
+
elif self.classe[0:2] == "GL" and rho_k >= 290:
|
|
124
|
+
beta_0 = 0.65
|
|
125
|
+
beta_n = 0.7
|
|
126
|
+
elif self.classe[0:1] == "D":
|
|
127
|
+
if rho_k >= 290 and rho_k < 450:
|
|
128
|
+
beta_0 = interpolation_lineaire(rho_k, 290, 450, 0.65, 0.5)
|
|
129
|
+
beta_n = interpolation_lineaire(rho_k, 290, 450, 0.7, 0.55)
|
|
130
|
+
elif rho_k >= 450:
|
|
131
|
+
beta_0 = 0.5
|
|
132
|
+
beta_n = 0.55
|
|
133
|
+
elif self.type_bois == "LVL" and rho_k >= 480:
|
|
134
|
+
beta_0 = 0.65
|
|
135
|
+
beta_n = 0.7
|
|
136
|
+
elif self.b_calcul.value * 10**3 >= 20 and rho_k >= 450:
|
|
137
|
+
if self.type_bois == "CP":
|
|
138
|
+
beta_0 = 1
|
|
139
|
+
else:
|
|
140
|
+
beta_0 = 0.9
|
|
141
|
+
elif self.b_calcul.value * 10**3 < 20 or rho_k < 450:
|
|
142
|
+
kp = mt.sqrt(450 / rho_k)
|
|
143
|
+
kh = mt.sqrt(20 / self.b_calcul.value * 10**3)
|
|
144
|
+
if self.type_bois == "CP":
|
|
145
|
+
beta_0 = 1
|
|
146
|
+
else:
|
|
147
|
+
beta_0 = 0.9
|
|
148
|
+
beta_0 = beta_0 * kp * kh
|
|
149
|
+
return beta_0, beta_n
|
|
150
|
+
|
|
151
|
+
def _get_wood_protect_beta0_and_betan(self, type_wood_protect: str):
|
|
152
|
+
beta_0 = None
|
|
153
|
+
beta_n = None
|
|
154
|
+
if type_wood_protect in (
|
|
155
|
+
"Panneautage bois",
|
|
156
|
+
"Contreplaqué",
|
|
157
|
+
"Panneaux de fibres ou de particules",
|
|
158
|
+
):
|
|
159
|
+
if self.hp.value * 10**3 >= 20 and self.rho_k_protect >= 450:
|
|
160
|
+
if type_wood_protect == "Contreplaqué":
|
|
161
|
+
beta_0 = 1
|
|
162
|
+
else:
|
|
163
|
+
beta_0 = 0.9
|
|
164
|
+
elif self.hp.value * 10**3 < 20 or self.rho_k_protect < 450:
|
|
165
|
+
kp = mt.sqrt(450 / self.rho_k_protect)
|
|
166
|
+
kh = mt.sqrt(20 / self.hp.value * 10**3)
|
|
167
|
+
if type_wood_protect == "Contreplaqué":
|
|
168
|
+
beta_0 = 1
|
|
169
|
+
else:
|
|
170
|
+
beta_0 = 0.9
|
|
171
|
+
beta_0 = beta_0 * kp * kh
|
|
172
|
+
return beta_0, beta_n
|
|
173
|
+
|
|
174
|
+
def d_char_0(self, t: int, beta_0: float):
|
|
175
|
+
"""Retourne la valeur de la profondeur de carbonisation en mm pour une carbonisation uni-dimensionnelle
|
|
176
|
+
Args:
|
|
177
|
+
t (int): le temps approprié d'exposition au feu en minutes.
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
181
|
+
def val():
|
|
182
|
+
d_char_0 = beta_0 * t
|
|
183
|
+
return d_char_0
|
|
184
|
+
|
|
185
|
+
return val()
|
|
186
|
+
|
|
187
|
+
def _d_char_n(self, t: int, beta_n: float):
|
|
188
|
+
"""Retourne la valeur de la profondeur de carbonisation fictive qui tient compte de l'effet des arrondis en coins
|
|
189
|
+
Args:
|
|
190
|
+
t (int): le temps approprié d'exposition au feu en minutes.
|
|
191
|
+
"""
|
|
192
|
+
return beta_n * t * si.mm
|
|
193
|
+
|
|
194
|
+
def _k0(self, t: int):
|
|
195
|
+
if t < 20:
|
|
196
|
+
return t / 20
|
|
197
|
+
else:
|
|
198
|
+
return 1
|
|
199
|
+
|
|
200
|
+
def _d_ef(self, d_char_n: si.mm, t: int):
|
|
201
|
+
"""Retourne la valeur de la profondeur de carbonisation effective en mm
|
|
202
|
+
Args:
|
|
203
|
+
d_char_n (si.mm): profondeur de carbonisation fictive
|
|
204
|
+
t (int): le temps approprié d'exposition au feu en minutes.
|
|
205
|
+
"""
|
|
206
|
+
d_0 = self.D0
|
|
207
|
+
k_0 = self._k0(t)
|
|
208
|
+
|
|
209
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
210
|
+
def val():
|
|
211
|
+
d_ef = d_char_n + k_0 * d_0
|
|
212
|
+
return d_ef
|
|
213
|
+
return val()
|
|
214
|
+
|
|
215
|
+
def _get_tch_and_tf(self, orientation: str, beta_0: float):
|
|
216
|
+
"""Retorune le temps de démarrage de la carbonisation en minute (tch) et le temps de rupture de la protection (tf) en minute
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
orientation (str, optional): Orientation sur la barre. Defaults to "Bas".
|
|
220
|
+
"""
|
|
221
|
+
h_p = self.hp.value * 10**3
|
|
222
|
+
t_f = self.tf
|
|
223
|
+
|
|
224
|
+
if self.protection[orientation] in (
|
|
225
|
+
"Panneautage bois",
|
|
226
|
+
"Contreplaqué",
|
|
227
|
+
"Panneaux de fibres ou de particules",
|
|
228
|
+
):
|
|
229
|
+
|
|
230
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
231
|
+
def val():
|
|
232
|
+
t_ch = self.hp.value * 10**3 / beta_0 # en min/equa3.10
|
|
233
|
+
t_f = t_ch # en min/equa3.14
|
|
234
|
+
return t_ch, t_f
|
|
235
|
+
|
|
236
|
+
# platre à joint vide A,H,F
|
|
237
|
+
elif "joints comblés" in self.protection[orientation]:
|
|
238
|
+
if self.double_couches:
|
|
239
|
+
if "type F" in self.protection[orientation]:
|
|
240
|
+
h_p = (h_p / 2) * 1.8
|
|
241
|
+
else:
|
|
242
|
+
h_p = (h_p / 2) * 1.5
|
|
243
|
+
|
|
244
|
+
if (
|
|
245
|
+
"type A" in self.protection[orientation]
|
|
246
|
+
or "type H" in self.protection[orientation]
|
|
247
|
+
):
|
|
248
|
+
|
|
249
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
250
|
+
def val():
|
|
251
|
+
t_ch = 2.8 * h_p - 14 # en min/equa3.11
|
|
252
|
+
t_f = t_ch # en min/equa3.15
|
|
253
|
+
return t_ch, t_f
|
|
254
|
+
|
|
255
|
+
else:
|
|
256
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
257
|
+
def val():
|
|
258
|
+
t_ch = 2.8 * h_p - 14 # en min/equa3.11
|
|
259
|
+
t_f # Temps de rupture de la plaque de platre type F
|
|
260
|
+
return t_ch, t_f
|
|
261
|
+
|
|
262
|
+
# platre à joint comblé A,H,F
|
|
263
|
+
elif "joints vides" in self.protection[orientation]:
|
|
264
|
+
if (
|
|
265
|
+
"type A" in self.protection[orientation]
|
|
266
|
+
or "type H" in self.protection[orientation]
|
|
267
|
+
):
|
|
268
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
269
|
+
def val():
|
|
270
|
+
t_ch = 2.8 * h_p - 23 # en min/equa3.12
|
|
271
|
+
t_f = t_ch # en min/equa3.15
|
|
272
|
+
return t_ch, t_f
|
|
273
|
+
|
|
274
|
+
else:
|
|
275
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
276
|
+
def val():
|
|
277
|
+
t_ch = 2.8 * h_p - 23 # en min/equa3.12
|
|
278
|
+
t_f # Temps de rupture de la plaque de platre type F
|
|
279
|
+
return t_ch, t_f
|
|
280
|
+
|
|
281
|
+
# Fibre de roche
|
|
282
|
+
elif self.protection[orientation] == "Fibre de roche":
|
|
283
|
+
rho_k_protect = self.rho_k_protect
|
|
284
|
+
|
|
285
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
286
|
+
def val():
|
|
287
|
+
t_ch = 0.07 * (h_p - 20) * sqrt(rho_k_protect) # en min/equa3.13
|
|
288
|
+
t_f # Temps de rupture de la plaque en fibre de roche
|
|
289
|
+
return t_ch, t_f
|
|
290
|
+
|
|
291
|
+
# Aucune protection
|
|
292
|
+
else:
|
|
293
|
+
|
|
294
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
295
|
+
def val():
|
|
296
|
+
t_ch = 0 # en min/equa3.12
|
|
297
|
+
t_f = t_ch # en min/equa3.15
|
|
298
|
+
return t_ch, t_f
|
|
299
|
+
|
|
300
|
+
return val()
|
|
301
|
+
|
|
302
|
+
def _get_k2(self, orientation: str):
|
|
303
|
+
k2 = 1
|
|
304
|
+
hp = self.hp.value * 10**3
|
|
305
|
+
if "type F" in self.protection[orientation]:
|
|
306
|
+
if self.double_couches:
|
|
307
|
+
hp = self.hp.value * 10**3 / 2
|
|
308
|
+
k2 = 1 - 0.018 * hp # 3.7
|
|
309
|
+
elif self.protection[orientation] == "Fibre de roche":
|
|
310
|
+
if 45 > hp >= 20:
|
|
311
|
+
k2 = interpolation_lineaire(hp, 20, 45, 1, 0.6)
|
|
312
|
+
elif hp >= 45:
|
|
313
|
+
k2 = 0.6
|
|
314
|
+
return k2
|
|
315
|
+
|
|
316
|
+
def _get_ta(self, t_ch: int, t_f: int, beta_n: float, k_2: float):
|
|
317
|
+
"""Retourne le temps de rupture de la protection en minutes (ta)
|
|
318
|
+
Args:
|
|
319
|
+
t_ch (int): Temps de démarrage de la carbonisation en minutes
|
|
320
|
+
t_f (int): Temps de rupture de la protection en minutes
|
|
321
|
+
beta_n (float): Coefficient de carbonisation fictif
|
|
322
|
+
k_2 (float): Coefficient d'accelération de la carbonisation'"""
|
|
323
|
+
if t_f:
|
|
324
|
+
if t_ch < t_f:
|
|
325
|
+
|
|
326
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
327
|
+
def val():
|
|
328
|
+
t_a = (25 - (t_f - t_ch) * k_2 * beta_n) / (2 * beta_n) + t_f # en min/equa3.9
|
|
329
|
+
return t_a
|
|
330
|
+
|
|
331
|
+
else:
|
|
332
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
333
|
+
def val():
|
|
334
|
+
t_a = min(2 * t_f, 12.5 / beta_n + t_f) # en min/equa3.8
|
|
335
|
+
return t_a
|
|
336
|
+
|
|
337
|
+
return val()
|
|
338
|
+
else:
|
|
339
|
+
return ("", 0)
|
|
340
|
+
|
|
341
|
+
def _get_section_reduction(self):
|
|
342
|
+
self._base_b_calcul = self.b_calcul
|
|
343
|
+
self._base_h_calcul = self.h_calcul
|
|
344
|
+
self._def = {}
|
|
345
|
+
# Index des lignes
|
|
346
|
+
index = ["0", "tch", "tf", "ta", "t_expo", "d_ef"]
|
|
347
|
+
# Colonnes multi-index : (orientation, type de valeur)
|
|
348
|
+
cols = pd.MultiIndex.from_product(
|
|
349
|
+
[("Haut", "Bas", "Gauche", "Droite"), ("Temps(min)", "d_char_n(mm)")],
|
|
350
|
+
names=["Orientation", "Type"],
|
|
351
|
+
)
|
|
352
|
+
# DataFrame vide
|
|
353
|
+
self.d_ef = pd.DataFrame(index=index, columns=cols)
|
|
354
|
+
|
|
355
|
+
for orientation, protection in self.protection.items():
|
|
356
|
+
if protection != "Pas d'exposition":
|
|
357
|
+
d_char_n = 0
|
|
358
|
+
d_char_n_values = {"0": 0, "tch": 0, "tf": 0, "ta": 0, "t_expo": 0}
|
|
359
|
+
|
|
360
|
+
beta_0, beta_n = self._get_bar_beta0_and_betan()
|
|
361
|
+
beta_0_protect, beta_n_protect = self._get_wood_protect_beta0_and_betan(
|
|
362
|
+
orientation
|
|
363
|
+
)
|
|
364
|
+
latex_tch_tf, res_tch_tf = self._get_tch_and_tf(
|
|
365
|
+
orientation, beta_0_protect
|
|
366
|
+
)
|
|
367
|
+
tch = res_tch_tf[0]
|
|
368
|
+
tf = res_tch_tf[1]
|
|
369
|
+
k2 = self._get_k2(orientation)
|
|
370
|
+
latex_ta, ta = self._get_ta(tch, tf, beta_n, k2)
|
|
371
|
+
|
|
372
|
+
# Insertion des temps
|
|
373
|
+
self.d_ef.loc["0", (orientation, "Temps(min)")] = 0
|
|
374
|
+
self.d_ef.loc["tch", (orientation, "Temps(min)")] = tch
|
|
375
|
+
self.d_ef.loc["tf", (orientation, "Temps(min)")] = tf
|
|
376
|
+
self.d_ef.loc["ta", (orientation, "Temps(min)")] = ta
|
|
377
|
+
self.d_ef.loc["t_expo", (orientation, "Temps(min)")] = self.t_expo
|
|
378
|
+
|
|
379
|
+
# Calcul de d_char_n sur chaque phase
|
|
380
|
+
if self.t_expo > tf:
|
|
381
|
+
if tch < tf:
|
|
382
|
+
d1 = self._d_char_n(tf - tch, beta_n * k2)
|
|
383
|
+
d_char_n = d_char_n + d1
|
|
384
|
+
d_char_n_values["tf"] = d_char_n
|
|
385
|
+
|
|
386
|
+
k3 = 2
|
|
387
|
+
if ta < self.t_expo:
|
|
388
|
+
d2 = self._d_char_n(ta - tf, beta_n * k3)
|
|
389
|
+
d_char_n = d_char_n + d2
|
|
390
|
+
d_char_n_values["ta"] = d_char_n
|
|
391
|
+
|
|
392
|
+
d3 = self._d_char_n(self.t_expo - ta, beta_n)
|
|
393
|
+
d_char_n = d_char_n + d3
|
|
394
|
+
d_char_n_values["t_expo"] = d_char_n
|
|
395
|
+
else:
|
|
396
|
+
d2 = self._d_char_n(ta - tf, beta_n * k3)
|
|
397
|
+
d_charn_sup_texpo = d_char_n + d2
|
|
398
|
+
d_char_n_values["ta"] = d_charn_sup_texpo
|
|
399
|
+
|
|
400
|
+
d3 = self._d_char_n(self.t_expo - tf, beta_n * k3)
|
|
401
|
+
d_char_n = d_char_n + d3
|
|
402
|
+
d_char_n_values["t_expo"] = d_char_n
|
|
403
|
+
|
|
404
|
+
# Stockage dans le DataFrame des d_char_n
|
|
405
|
+
for key, dcharn in d_char_n_values.items():
|
|
406
|
+
self.d_ef.loc[key, (orientation, "d_char_n(mm)")] = dcharn
|
|
407
|
+
|
|
408
|
+
# Calcul de d_ef final
|
|
409
|
+
d_ef = self._d_ef(d_char_n, self.t_expo)
|
|
410
|
+
self.d_ef.loc["d_ef", (orientation, "Temps(min)")] = self.t_expo
|
|
411
|
+
self.d_ef.loc["d_ef", (orientation, "d_char_n(mm)")] = d_ef[1]
|
|
412
|
+
self._def[orientation] = (latex_tch_tf + latex_ta + d_ef[0], d_ef[1])
|
|
413
|
+
else:
|
|
414
|
+
self._def[orientation] = ("\\[\text{Pas d'exposition}\\]", 0 * si.mm)
|
|
415
|
+
|
|
416
|
+
self.b_calcul = self.b_calcul - self._def["Gauche"][1] - self._def["Droite"][1] # Réduction de la section
|
|
417
|
+
self.h_calcul = self.h_calcul - self._def["Haut"][1] - self._def["Bas"][1] # Réduction de la section
|
|
418
|
+
|
|
419
|
+
def get_def(self, orientation: str = ORIENTATION):
|
|
420
|
+
"""Retourne la profondeur de carbonisation effective en mm suivant l'orientation donnée"""
|
|
421
|
+
return self._def[orientation]
|
|
422
|
+
|
|
423
|
+
def _f_type_d(self, typeCarac=Barre.CARACTERISTIQUE[0:6]):
|
|
424
|
+
"""Méthode donnant la résistance de calcul de l'élément fonction de la vérification
|
|
425
|
+
|
|
426
|
+
Args:
|
|
427
|
+
typeCarac (str, optional): type de résistance caractéristique (flexion = "fm0k", compression = "fc0k" etc.). Defaults to "fm0k".
|
|
428
|
+
loadtype (str, optional): Durée de chargement (Permanente, Court terme etc.). Defaults to "Permanente".
|
|
429
|
+
typecombi (str, optional): type de combinaison étudiée ("Fondamentales" ou " Accidentelles"). Defaults to "Fondamentales".
|
|
430
|
+
|
|
431
|
+
Returns:
|
|
432
|
+
float: Résistance de calcul en N/mm2 du type de vérification étudié.
|
|
433
|
+
"""
|
|
434
|
+
gamma_M_fi = self._get_gamma_M("Accidentelles")
|
|
435
|
+
K_mod_fi = self.KMOD_FI # en situation à chaud
|
|
436
|
+
K_fi = self.K_fi
|
|
437
|
+
f_type_k = float(self.caract_meca.loc[typeCarac]) * si.MPa
|
|
438
|
+
|
|
439
|
+
if typeCarac == "fm0k" and self.k_sys > 1:
|
|
440
|
+
k_sys = self.k_sys
|
|
441
|
+
|
|
442
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
443
|
+
def val():
|
|
444
|
+
f_type_Rd = k_sys * f_type_k * K_fi * K_mod_fi / gamma_M_fi
|
|
445
|
+
return f_type_Rd
|
|
446
|
+
|
|
447
|
+
else:
|
|
448
|
+
|
|
449
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
450
|
+
def val():
|
|
451
|
+
f_type_Rd = f_type_k * K_fi * K_mod_fi / gamma_M_fi
|
|
452
|
+
return f_type_Rd
|
|
453
|
+
|
|
454
|
+
value = val()
|
|
455
|
+
latex = self.__convert_latex_ftyped(value[0], typeCarac)
|
|
456
|
+
self.f_type_rd = value[1]
|
|
457
|
+
return (latex, value[1])
|
|
458
|
+
|
|
459
|
+
def _K_h(self):
|
|
460
|
+
"""Retourne le coef. Kh qui peut augmenter la resistance caractéristique fm,k et ft,k"""
|
|
461
|
+
kh = {}
|
|
462
|
+
dim = {"y": self._base_h_calcul.value * 10**3, "z": self._base_b_calcul.value * 10**3}
|
|
463
|
+
|
|
464
|
+
for cle, valeur in dim.items():
|
|
465
|
+
if self.type_bois == "Massif":
|
|
466
|
+
if valeur < 150:
|
|
467
|
+
kh[cle] = min((150 / valeur) ** 0.2, 1.3)
|
|
468
|
+
else:
|
|
469
|
+
kh[cle] = 1
|
|
470
|
+
elif self.type_bois == "BLC":
|
|
471
|
+
if valeur < 600:
|
|
472
|
+
kh[cle] = min((600 / valeur) ** 0.1, 1.1)
|
|
473
|
+
else:
|
|
474
|
+
kh[cle] = 1
|
|
475
|
+
else:
|
|
476
|
+
print("LVL non pris en compte dans cette fonction")
|
|
477
|
+
kh[cle] = 1
|
|
478
|
+
return kh
|
|
479
|
+
|
|
480
|
+
def Emean_fin(self, psy_2: float):
|
|
481
|
+
"""Renvoie le E,mean,fin en fonction du Kdef et du psy2"""
|
|
482
|
+
self.psy_2 = psy_2
|
|
483
|
+
E0_mean = int(self.caract_meca.loc["E0mean"]) * si.MPa
|
|
484
|
+
K_fi = self.K_fi
|
|
485
|
+
K_def = self.K_def
|
|
486
|
+
|
|
487
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
488
|
+
def val():
|
|
489
|
+
E_mean_fin_fi = E0_mean * K_fi / (1 + psy_2 * K_def)
|
|
490
|
+
return E_mean_fin_fi
|
|
491
|
+
|
|
492
|
+
value = val()
|
|
493
|
+
self.E_mean_fin = value[1]
|
|
494
|
+
return value
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
# ================================ FLEXION ==================================
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
class Flexion_feu(Feu, Flexion):
|
|
501
|
+
def __init__(
|
|
502
|
+
self,
|
|
503
|
+
lo: si.mm,
|
|
504
|
+
coeflef: float = Flexion.COEF_LEF["Appuis simple"][1],
|
|
505
|
+
pos: str = Flexion.LOAD_POS,
|
|
506
|
+
**kwargs,
|
|
507
|
+
):
|
|
508
|
+
"""Classe permettant le calcul de la flexion d'une poutre bois selon l'EN 1995 §6.1.6, §6.2.3, §6.2.4 et §6.3.3.
|
|
509
|
+
Cette classe est hérité de la classe Barre, provenant du module EC5_Element_droit.py.
|
|
510
|
+
|
|
511
|
+
Args:
|
|
512
|
+
lo (int): longueur de déversemment en mm
|
|
513
|
+
coeflef (float): appuis simple :
|
|
514
|
+
Moment constant : 1
|
|
515
|
+
Charge répartie constante : 0.9
|
|
516
|
+
Charge concentrée au milieu de la portée : 0.8
|
|
517
|
+
porte à faux :
|
|
518
|
+
Charge répartie constante : 0.5
|
|
519
|
+
Charge concentrée agissant à l'extrémité libre : 0.8.
|
|
520
|
+
|
|
521
|
+
pos (str): positionnement de la charge sur la hauteur de poutre
|
|
522
|
+
"""
|
|
523
|
+
super().__init__(lo=lo, coeflef=coeflef, pos=pos, **kwargs)
|
|
524
|
+
|
|
525
|
+
@property
|
|
526
|
+
def sigma_m_crit(self):
|
|
527
|
+
"""Retourne sigma m,crit pour la prise en compte du déversement d'une poutre"""
|
|
528
|
+
self.l_ef = self.lo * self.coeflef
|
|
529
|
+
if self.pos == "Charge sur fibre comprimée":
|
|
530
|
+
self.l_ef = self.l_ef + 2 * self.h_calcul
|
|
531
|
+
elif self.pos == "Charge sur fibre tendue":
|
|
532
|
+
self.l_ef = self.l_ef - 0.5 * self.h_calcul
|
|
533
|
+
|
|
534
|
+
b_calcul = self.b_calcul
|
|
535
|
+
h_calcul = self.h_calcul
|
|
536
|
+
l_ef = self.l_ef
|
|
537
|
+
E_0_05 = int(self.caract_meca.loc["E005"]) * si.MPa
|
|
538
|
+
K_fi = self.K_fi
|
|
539
|
+
|
|
540
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
541
|
+
def val():
|
|
542
|
+
sigma_m_crit_fi = (0.78 * b_calcul**2 * E_0_05 * K_fi) / (h_calcul * l_ef)
|
|
543
|
+
return sigma_m_crit_fi
|
|
544
|
+
|
|
545
|
+
return val()
|
|
546
|
+
|
|
547
|
+
@property
|
|
548
|
+
def lamb_rel_m(self):
|
|
549
|
+
"""Retourne l'élancement relatif de la section avec pour argument"""
|
|
550
|
+
f_m0k = float(self.caract_meca.loc["fm0k"]) * si.MPa
|
|
551
|
+
K_fi = self.K_fi
|
|
552
|
+
sigma_m_crit = self.sigma_m_crit[1]
|
|
553
|
+
|
|
554
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
555
|
+
def val():
|
|
556
|
+
lamb_rel_m_fi = sqrt(f_m0k * K_fi / sigma_m_crit)
|
|
557
|
+
return lamb_rel_m_fi
|
|
558
|
+
|
|
559
|
+
return val()
|
|
560
|
+
|
|
561
|
+
@property
|
|
562
|
+
def K_crit(self):
|
|
563
|
+
"""Retourne K,crit le coef. de minoration de la résistance en flexion au déversement"""
|
|
564
|
+
lamb_rel_m_fi = self.lamb_rel_m[1]
|
|
565
|
+
|
|
566
|
+
if lamb_rel_m_fi <= 0.75:
|
|
567
|
+
|
|
568
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
569
|
+
def val():
|
|
570
|
+
K_crit_fi = 1
|
|
571
|
+
return K_crit_fi
|
|
572
|
+
|
|
573
|
+
elif 0.75 < lamb_rel_m_fi <= 1.4:
|
|
574
|
+
|
|
575
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
576
|
+
def val():
|
|
577
|
+
K_crit_fi = 1.56 - 0.75 * lamb_rel_m_fi
|
|
578
|
+
return K_crit_fi
|
|
579
|
+
|
|
580
|
+
else:
|
|
581
|
+
|
|
582
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
583
|
+
def val():
|
|
584
|
+
K_crit_fi = 1 / (lamb_rel_m_fi**2)
|
|
585
|
+
return K_crit_fi
|
|
586
|
+
|
|
587
|
+
return val()
|
|
588
|
+
|
|
589
|
+
def f_m_d(self):
|
|
590
|
+
"""Retourne la résistance f,m,d au feu de l'élément en MPa
|
|
591
|
+
"""
|
|
592
|
+
return super()._f_type_d("fm0k")
|
|
593
|
+
|
|
594
|
+
def taux_m_d(self, compression: object = None, traction: object = None):
|
|
595
|
+
"""Retourne les différents taux de travaux en flexion.
|
|
596
|
+
Si l'élement est une poutre (donc avec un travail principalement en flexion) et de la compression (EN 1995-1-1 §6.3.3) ou de la traction (EN 1995-1-1 §6.2.3) combinée,
|
|
597
|
+
il est possible d'ajouter l'objet Compression et Traction et de vérifier ces combinaisons.
|
|
598
|
+
|
|
599
|
+
Args:
|
|
600
|
+
compression (object, optional): L'objet Compression avec ces taux de travaux préalablement calculés. Defaults to None.
|
|
601
|
+
traction (object, optional): L'objet Traction avec ces taux de travaux préalablement calculés. Defaults to None.
|
|
602
|
+
|
|
603
|
+
Returns:
|
|
604
|
+
list: retourne la liste des taux de travaux en %"""
|
|
605
|
+
self.taux_m_rd = {}
|
|
606
|
+
|
|
607
|
+
sigma_my_d_fi = self.sigma_m_rd["y"]
|
|
608
|
+
sigma_mz_d_fi = self.sigma_m_rd["z"]
|
|
609
|
+
f_m_d_fi = self.f_type_rd
|
|
610
|
+
K_h_y = self.K_h["y"]
|
|
611
|
+
K_h_z = self.K_h["z"]
|
|
612
|
+
K_m = self.K_m
|
|
613
|
+
K_crit_fi = self.K_crit[1]
|
|
614
|
+
|
|
615
|
+
@handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
616
|
+
def base():
|
|
617
|
+
taux_6_11 = sigma_my_d_fi / (f_m_d_fi * K_h_y) + K_m * sigma_mz_d_fi / (f_m_d_fi * K_h_z) # equ6.11
|
|
618
|
+
taux_6_12 = K_m * sigma_my_d_fi / (f_m_d_fi * K_h_y) + sigma_mz_d_fi / (f_m_d_fi * K_h_z) # equ6.12
|
|
619
|
+
taux_6_33y = sigma_my_d_fi / (f_m_d_fi * K_h_y * K_crit_fi) # equ6.33
|
|
620
|
+
taux_6_33z = sigma_mz_d_fi / (f_m_d_fi * K_h_z * K_crit_fi) # equ6.33
|
|
621
|
+
return taux_6_11, taux_6_12, taux_6_33y, taux_6_33z
|
|
622
|
+
|
|
623
|
+
base_val = base()
|
|
624
|
+
latex = base_val[0]
|
|
625
|
+
self.taux_m_rd["equ6.11"] = base_val[1][0]
|
|
626
|
+
self.taux_m_rd["equ6.12"] = base_val[1][1]
|
|
627
|
+
self.taux_m_rd["equ6.33y"] = base_val[1][2]
|
|
628
|
+
self.taux_m_rd["equ6.33z"] = base_val[1][3]
|
|
629
|
+
|
|
630
|
+
if compression and isinstance(compression, Compression):
|
|
631
|
+
sigma_c_0_d = compression.sigma_c_0_rd
|
|
632
|
+
f_c_0_d = compression.f_type_rd
|
|
633
|
+
K_c_y = compression.kc_Axe[1]["y"]
|
|
634
|
+
K_c_z = compression.kc_Axe[1]["z"]
|
|
635
|
+
taux_6_2 = compression.taux_c_0_rd["equ6.2"]
|
|
636
|
+
|
|
637
|
+
# taux_6_23 = compression.taux_c_0_rd['equ6.23']
|
|
638
|
+
# taux_6_24 = compression.taux_c_0_rd['equ6.24']
|
|
639
|
+
@handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
640
|
+
def comp(taux_6_11, taux_6_12, taux_6_2, taux_6_33y, taux_6_33z):
|
|
641
|
+
taux_6_19 = taux_6_2**2 + taux_6_11 # equ6.19
|
|
642
|
+
taux_6_20 = taux_6_2**2 + taux_6_12 # equ6.20
|
|
643
|
+
taux_6_23 = sigma_c_0_d / (f_c_0_d * K_c_y) # equ6.23
|
|
644
|
+
taux_6_24 = sigma_c_0_d / (f_c_0_d * K_c_z) # equ6.24
|
|
645
|
+
taux_6_35zyz = (taux_6_33y**2 + (sigma_mz_d_fi / (f_m_d_fi * K_h_z)) + taux_6_24) # equ6.35
|
|
646
|
+
taux_6_35yzz = (taux_6_33y + (sigma_mz_d_fi / (f_m_d_fi * K_h_z)) ** 2 + taux_6_24) # equ6.35 interprétation
|
|
647
|
+
taux_6_35yzy = (taux_6_33z**2 + (sigma_my_d_fi / (f_m_d_fi * K_h_y)) + taux_6_23) # equ6.35
|
|
648
|
+
taux_6_35zyy = (taux_6_33z + (sigma_my_d_fi / (f_m_d_fi * K_h_y)) ** 2 + taux_6_23) # equ6.35 interprétation
|
|
649
|
+
return (
|
|
650
|
+
taux_6_19,
|
|
651
|
+
taux_6_20,
|
|
652
|
+
taux_6_35zyz,
|
|
653
|
+
taux_6_35yzz,
|
|
654
|
+
taux_6_35yzy,
|
|
655
|
+
taux_6_35zyy,
|
|
656
|
+
)
|
|
657
|
+
|
|
658
|
+
compression_val = comp(
|
|
659
|
+
self.taux_m_rd["equ6.11"],
|
|
660
|
+
self.taux_m_rd["equ6.12"],
|
|
661
|
+
taux_6_2,
|
|
662
|
+
self.taux_m_rd["equ6.33y"],
|
|
663
|
+
self.taux_m_rd["equ6.33z"],
|
|
664
|
+
)
|
|
665
|
+
latex = latex + compression_val[0]
|
|
666
|
+
self.taux_m_rd["equ6.19"] = compression_val[1][0]
|
|
667
|
+
self.taux_m_rd["equ6.20"] = compression_val[1][1]
|
|
668
|
+
self.taux_m_rd["equ6.35zyz"] = compression_val[1][2] # 1er item axe de flexion pas au carré, 2eme item axe de flexion au carré, 3eme axe de compression
|
|
669
|
+
self.taux_m_rd["equ6.35yzz"] = compression_val[1][3]
|
|
670
|
+
self.taux_m_rd["equ6.35yzy"] = compression_val[1][4]
|
|
671
|
+
self.taux_m_rd["equ6.35zyy"] = compression_val[1][5]
|
|
672
|
+
|
|
673
|
+
if traction and isinstance(traction, Traction):
|
|
674
|
+
taux_6_1 = traction.taux_t_0_rd["equ6.1"]
|
|
675
|
+
|
|
676
|
+
@handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
677
|
+
def tract(taux_6_11, taux_6_12):
|
|
678
|
+
taux_6_17 = taux_6_11 + taux_6_1 # equ6.17
|
|
679
|
+
taux_6_18 = taux_6_12 + taux_6_1 # equ6.18
|
|
680
|
+
return taux_6_17, taux_6_18
|
|
681
|
+
|
|
682
|
+
traction_val = tract(self.taux_m_rd["equ6.11"], self.taux_m_rd["equ6.12"])
|
|
683
|
+
latex = latex + traction_val[0]
|
|
684
|
+
self.taux_m_rd["equ6.11"] = traction_val[1][0]
|
|
685
|
+
self.taux_m_rd["equ6.12"] = traction_val[1][1]
|
|
686
|
+
|
|
687
|
+
return (latex, self.taux_m_rd)
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
# ================================ Traction ==================================
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
class Traction_feu(Feu, Traction):
|
|
694
|
+
def __init__(self, **kwargs):
|
|
695
|
+
"""Classe permettant le calcul de la Traction d'un élément bois selon l'EN 1995.
|
|
696
|
+
Cette classe est hérité de la classe Barre, provenant du module EC5_Element_droit.py.
|
|
697
|
+
"""
|
|
698
|
+
super().__init__(**kwargs)
|
|
699
|
+
|
|
700
|
+
def f_t_0_d(self):
|
|
701
|
+
"""Retourne la résistance f,t,0,d au feu de l'élément en MPa
|
|
702
|
+
"""
|
|
703
|
+
return super()._f_type_d("ft0k")
|
|
704
|
+
|
|
705
|
+
def taux_t_0_d(self):
|
|
706
|
+
"""Retourne le taux de travail en traction axial.
|
|
707
|
+
|
|
708
|
+
Returns:
|
|
709
|
+
float: taux de travail en %
|
|
710
|
+
"""
|
|
711
|
+
self.taux_t_0_rd = {}
|
|
712
|
+
K_h_y = self.K_h["y"]
|
|
713
|
+
K_h_z = self.K_h["z"]
|
|
714
|
+
sigma_t_0_d_fi = self.sigma_t_0_rd
|
|
715
|
+
f_t_0_d_fi = self.f_type_rd
|
|
716
|
+
|
|
717
|
+
@handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
718
|
+
def val():
|
|
719
|
+
K_h = min(K_h_y, K_h_z)
|
|
720
|
+
taux_6_1 = sigma_t_0_d_fi / (K_h * f_t_0_d_fi) # equ6.1
|
|
721
|
+
return taux_6_1
|
|
722
|
+
|
|
723
|
+
value = val()
|
|
724
|
+
|
|
725
|
+
self.taux_t_0_rd["equ6.1"] = value[1]
|
|
726
|
+
return value
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
# ================================ Compression ==================================
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
class Compression_feu(Feu, Compression):
|
|
733
|
+
def __init__(self, lo_y: si.mm, lo_z: si.mm, type_appuis: str = Compression.COEF_LF, **kwargs):
|
|
734
|
+
"""Classe permettant le calcul de la Compression d'un élément bois selon l'EN 1995.
|
|
735
|
+
Cette classe est hérité de la classe Barre, provenant du module EC5_Element_droit.py.
|
|
736
|
+
|
|
737
|
+
Args:
|
|
738
|
+
lo : Longueur de flambement suivant l'axe de rotation (y ou z) en mm si pas de flambement alors 0
|
|
739
|
+
type_appuis : Coefficient multiplicateur de la longueur pour obtenir la longeur efficace de flambement en
|
|
740
|
+
fonction des du type d'appuis :
|
|
741
|
+
Encastré 1 côté : 2
|
|
742
|
+
Rotule - Rotule : 1
|
|
743
|
+
Encastré - Rotule : 0.7
|
|
744
|
+
Encastré - Encastré : 0.5
|
|
745
|
+
Encastré - Rouleau : 1
|
|
746
|
+
"""
|
|
747
|
+
super().__init__(lo_y=lo_y, lo_z=lo_z, type_appuis=type_appuis, **kwargs)
|
|
748
|
+
|
|
749
|
+
@property
|
|
750
|
+
def lamb_rel_Axe(self):
|
|
751
|
+
"""Retourne l'élancement relatif d'un poteau en compression avec risque de flambement suivant son axe de rotation"""
|
|
752
|
+
lamb_y = self.lamb[1]["y"]
|
|
753
|
+
lamb_z = self.lamb[1]["z"]
|
|
754
|
+
f_c0k = float(self.caract_meca.loc["fc0k"]) * si.MPa
|
|
755
|
+
E_0_05 = int(self.caract_meca.loc["E005"]) * si.MPa
|
|
756
|
+
K_fi = self.K_fi
|
|
757
|
+
|
|
758
|
+
@handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
759
|
+
def val():
|
|
760
|
+
lamb_rel_y_fi = (lamb_y / pi) * sqrt(f_c0k * K_fi / (E_0_05 * K_fi))
|
|
761
|
+
lamb_rel_z_fi = (lamb_z / pi) * sqrt(f_c0k * K_fi / (E_0_05 * K_fi))
|
|
762
|
+
return {"y": lamb_rel_y_fi, "z": lamb_rel_z_fi}
|
|
763
|
+
|
|
764
|
+
return val()
|
|
765
|
+
|
|
766
|
+
@property
|
|
767
|
+
def k_Axe(self):
|
|
768
|
+
"""Retourne le facteur Ky ou Kz (fonction de l'axe de flambement)"""
|
|
769
|
+
beta_C = self.beta_C
|
|
770
|
+
lamb_rel_y_fi = self.lamb_rel_Axe[1]["y"]
|
|
771
|
+
lamb_rel_z_fi = self.lamb_rel_Axe[1]["z"]
|
|
772
|
+
|
|
773
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
774
|
+
def val():
|
|
775
|
+
k_y_fi = 0.5 * (1 + beta_C * (lamb_rel_y_fi - 0.3) + lamb_rel_y_fi**2)
|
|
776
|
+
k_z_fi = 0.5 * (1 + beta_C * (lamb_rel_z_fi - 0.3) + lamb_rel_z_fi**2)
|
|
777
|
+
return {"y": k_y_fi, "z": k_z_fi}
|
|
778
|
+
|
|
779
|
+
return val()
|
|
780
|
+
|
|
781
|
+
@property
|
|
782
|
+
def kc_Axe(self):
|
|
783
|
+
"""Retourne le coefficient multiplicateur KcAxe (axe = y ou z suivant axe de rotation en flambement) de fc,0,d"""
|
|
784
|
+
k_y_fi = self.k_Axe[1]["y"]
|
|
785
|
+
k_z_fi = self.k_Axe[1]["z"]
|
|
786
|
+
lamb_rel_y_fi = self.lamb_rel_Axe[1]["y"]
|
|
787
|
+
lamb_rel_z_fi = self.lamb_rel_Axe[1]["z"]
|
|
788
|
+
|
|
789
|
+
@handcalc(override="short", precision=2, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
790
|
+
def val():
|
|
791
|
+
k_c_y = 1 / (k_y_fi + sqrt(k_y_fi**2 - lamb_rel_y_fi**2))
|
|
792
|
+
k_c_z = 1 / (k_z_fi + sqrt(k_z_fi**2 - lamb_rel_z_fi**2))
|
|
793
|
+
return {"y": min(k_c_y, 1), "z": min(k_c_z, 1)}
|
|
794
|
+
|
|
795
|
+
return val()
|
|
796
|
+
|
|
797
|
+
def f_c_0_d(self):
|
|
798
|
+
"""Retourne la résistance f,c,0,d au feu de l'élément en MPa
|
|
799
|
+
"""
|
|
800
|
+
return super()._f_type_d("fc0k")
|
|
801
|
+
|
|
802
|
+
def taux_c_0_d(self, flexion: object = None):
|
|
803
|
+
"""Retourne les taux de travaux de la compression axial.
|
|
804
|
+
Si l'élement est un poteau (donc avec un travail principalement en compression) et de la flexion combinée (EN 1995-1-1 §6.3.2),
|
|
805
|
+
il est possible d'ajouter l'objet flexion et de vérifier cette combinaison.
|
|
806
|
+
|
|
807
|
+
Args:
|
|
808
|
+
flexion (object, optional): L'objet Flexion avec ces taux de travaux préalablement calculés. Default to None.
|
|
809
|
+
|
|
810
|
+
Returns:
|
|
811
|
+
list: retourne la liste des taux de travaux en %
|
|
812
|
+
"""
|
|
813
|
+
self.taux_c_0_rd = {}
|
|
814
|
+
sigma_c_0_d_fi = self.sigma_c_0_rd
|
|
815
|
+
f_c_0_d_fi = self.f_type_rd
|
|
816
|
+
lamb_rel_y = self.lamb_rel_Axe[1]["y"]
|
|
817
|
+
lamb_rel_z = self.lamb_rel_Axe[1]["z"]
|
|
818
|
+
K_c_y_fi = self.kc_Axe[1]["y"]
|
|
819
|
+
K_c_z_fi = self.kc_Axe[1]["z"]
|
|
820
|
+
|
|
821
|
+
if flexion and isinstance(flexion, Flexion):
|
|
822
|
+
taux_6_11 = flexion.taux_m_rd["equ6.11"]
|
|
823
|
+
taux_6_12 = flexion.taux_m_rd["equ6.12"]
|
|
824
|
+
else:
|
|
825
|
+
taux_6_11 = 0
|
|
826
|
+
taux_6_12 = 0
|
|
827
|
+
|
|
828
|
+
if lamb_rel_y < 0.3 and lamb_rel_z < 0.3:
|
|
829
|
+
|
|
830
|
+
@handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
831
|
+
def val():
|
|
832
|
+
taux_6_2 = sigma_c_0_d_fi / f_c_0_d_fi # equ6.2
|
|
833
|
+
taux_6_19 = (sigma_c_0_d_fi / (f_c_0_d_fi * K_c_y_fi)) ** 2 + taux_6_11 # equ6.19
|
|
834
|
+
taux_6_20 = (sigma_c_0_d_fi / (f_c_0_d_fi * K_c_z_fi)) ** 2 + taux_6_12 # equ6.20
|
|
835
|
+
return taux_6_2, taux_6_19, taux_6_20
|
|
836
|
+
|
|
837
|
+
value = val()
|
|
838
|
+
self.taux_c_0_rd["equ6.19"] = value[1][1]
|
|
839
|
+
self.taux_c_0_rd["equ6.20"] = value[1][2]
|
|
840
|
+
else:
|
|
841
|
+
|
|
842
|
+
@handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
843
|
+
def val():
|
|
844
|
+
taux_6_2 = sigma_c_0_d_fi / f_c_0_d_fi # equ6.2
|
|
845
|
+
taux_6_23 = (sigma_c_0_d_fi / (f_c_0_d_fi * K_c_y_fi) + taux_6_11) # equ6.23
|
|
846
|
+
taux_6_24 = (sigma_c_0_d_fi / (f_c_0_d_fi * K_c_z_fi) + taux_6_12) # equ6.24
|
|
847
|
+
return taux_6_2, taux_6_23, taux_6_24
|
|
848
|
+
|
|
849
|
+
value = val()
|
|
850
|
+
self.taux_c_0_rd["equ6.23"] = value[1][1]
|
|
851
|
+
self.taux_c_0_rd["equ6.24"] = value[1][2]
|
|
852
|
+
|
|
853
|
+
self.taux_c_0_rd["equ6.2"] = value[1][0]
|
|
854
|
+
return value
|
|
855
|
+
|
|
856
|
+
|
|
857
|
+
# ================================ CISAILLEMENT ==================================
|
|
858
|
+
|
|
859
|
+
class Cisaillement_feu(Cisaillement, Feu):
|
|
860
|
+
def __init__(self, **kwargs):
|
|
861
|
+
"""Classe qui permet de calculer le cisaillement d'une poutre comme décrit à l'EN 1995 §6.1.7 et §6.5.
|
|
862
|
+
Cette classe est hérité de la classe Barre, provenant du module EC5_Element_droit.py.
|
|
863
|
+
"""
|
|
864
|
+
super().__init__(**kwargs)
|
|
865
|
+
|
|
866
|
+
def Kv(self, hef: si.mm, x: si.mm, i_lo: si.mm, ent=("Dessous", "Dessus")):
|
|
867
|
+
"""Retourne le facteur d'entaille Kv pour une entaille au niveau d'un appuis
|
|
868
|
+
|
|
869
|
+
Args:
|
|
870
|
+
hef (int): Hauteur efficace à froid de la poutre (hauteur - hauteur de l'entaille) en mm
|
|
871
|
+
x (int):Distance entre le centre de réaction à l'appuis et le coin de l'entaille en mm
|
|
872
|
+
i_lo (float): longueur horizontal de l'entaille en mm
|
|
873
|
+
ent (tuple, optional): Entaille sur le dessus ou dessous de la poutre.
|
|
874
|
+
|
|
875
|
+
Returns:
|
|
876
|
+
float: facteur Kv
|
|
877
|
+
"""
|
|
878
|
+
h_ef = hef*si.mm - self._def["Bas"][1] - self._def["Haut"][1] # Réduction de la section
|
|
879
|
+
return super().Kv(h_ef.value*10**3, x, i_lo, ent)
|
|
880
|
+
|
|
881
|
+
def f_v_d(self):
|
|
882
|
+
"""Retourne la résistance f,v,d au feu de l'élément en MPa
|
|
883
|
+
"""
|
|
884
|
+
return super()._f_type_d("fvk")
|
|
885
|
+
|
|
886
|
+
def taux_tau_d(self):
|
|
887
|
+
"""Retourne le taux de travail en cisaillement en %"""
|
|
888
|
+
self.taux_tau_rd = {}
|
|
889
|
+
tau_d_fi = self.tau_rd
|
|
890
|
+
f_v_d_fi = self.f_type_rd
|
|
891
|
+
K_v = self.K_v
|
|
892
|
+
|
|
893
|
+
@handcalc(override="short", precision=3, jupyter_display=self.JUPYTER_DISPLAY, left="\\[", right="\\]")
|
|
894
|
+
def val():
|
|
895
|
+
taux_6_13 = tau_d_fi / f_v_d_fi
|
|
896
|
+
taux_6_60 = tau_d_fi / (K_v * f_v_d_fi)
|
|
897
|
+
return taux_6_13, taux_6_60
|
|
898
|
+
|
|
899
|
+
value = val()
|
|
900
|
+
self.taux_tau_rd["equ6.13"] = value[1][0]
|
|
901
|
+
self.taux_tau_rd["equ6.60"] = value[1][1]
|
|
902
|
+
return value
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
# if __name__ == "__main__":
|
|
906
|
+
# beam = Barre(b=100, h=200, section="Rectangulaire", classe="C24", cs=1)
|
|
907
|
+
# feu = Feu._from_parent_class(
|
|
908
|
+
# beam,
|
|
909
|
+
# t_expo= 30,
|
|
910
|
+
# haut="Aucune protection",
|
|
911
|
+
# bas="Aucune protection",
|
|
912
|
+
# gauche="1 plaque de platre type A joints comblés",
|
|
913
|
+
# droite="Pas d'exposition",
|
|
914
|
+
# double_couches=False,
|
|
915
|
+
# hp= 12,
|
|
916
|
+
# )
|
|
917
|
+
# print(feu.d_ef)
|
|
918
|
+
# print("Feu", feu.b_calcul, feu.h_calcul)
|
|
919
|
+
# cisai = Cisaillement_feu._from_parent_class(feu)
|
|
920
|
+
# print(cisai.Kv(140, 50, 0))
|
|
921
|
+
# print(cisai.tau_d(5))
|
|
922
|
+
# print("Cisailllemnt", cisai.b_calcul, cisai.h_calcul)
|