Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,34 @@ Toutes les modifications notables de ce projet seront documentées dans ce fichi
Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/),
et ce projet adhère au [Semantic Versioning](https://semver.org/lang/fr/).

## [2.1.3]

### Added
- **`Verification_EC5`** : intégration de la vérification feu (EN 1995-1-2) dans le processus de vérification EC5.
- Ajout du paramètre `t_expo` (durée d'exposition au feu en minutes, défaut 30) dans `__init__` et `verify`.
- Vérifications feu (Flexion_feu, Compression_feu, Traction_feu, Cisaillement_feu) calculées uniquement pour les combinaisons contenant "FIRE" (ex: ELU_STR_ACC_FIRE).
- Vérifications normales (Flexion, Compression, Traction, Cisaillement) calculées uniquement pour les combinaisons ne contenant pas "FIRE".
- Configuration par défaut : aucune protection des faces (haut, bas, gauche, droite = "Aucune protection").
- Logique de comparaison des contraintes pour déterminer le mode dominant : si `sigma_c_0_rd > max(sigma_m_rd_y, sigma_m_rd_z)`, la compression est considérée dominante et l'interaction flexion-compression est adaptée en conséquence. Cette logique s'applique aux combinaisons normales et FIRE.
- **`EC3` - Classe `Profil`** : nouvelle classe pour les profilés laminés acier selon EN 1993-1-1 en cours de développement.
- Permet de générer des poutres en I ou H (IPE, HEA, HEB) à partir de désignations normalisées selon EN 10365.
- Chargement automatique des caractéristiques géométriques depuis `data/profil_acier.csv` (h, b, tw, tf, r, A, Av, Iy, Iz, Wely, Welz, Wply, Wplz, iy, iz, masse).
- Détermination automatique des propriétés mécaniques (fy, fu) selon la classe d'acier et l'épaisseur maximale (max(tw, tf)).
- Hérite de `Plat` (au lieu de `Projet`) pour être compatible avec les classes de vérification (Compression, Traction, Cisaillement, Flexion) via `_from_parent_class`.
- **`data/profil_acier.csv`** : nouveau fichier de données contenant les caractéristiques géométriques des profils standards IPE (80-600), HEA (100-600), HEB (100-600) et UPN (80-200) selon EN 10365.
- **`tests/test_EC3_Element_droit.py`** : ajout de la classe `TestProfil` avec 10 tests couvrant l'initialisation (IPE, HEA, HEB), le chargement des caractéristiques géométriques, les propriétés mécaniques (fy, fu), les validations (désignation, classe acier, classe transversale) et la compatibilité avec Compression.

### Changed
- **`Compression_feu`** : séparation des paramètres `type_appuis` en `type_appuis_y` et `type_appuis_z` pour une gestion indépendante des conditions d'appui selon les axes de flambement, cohérente avec la classe `Compression` normale.

### Added (tests)
- **`tests/test_EC5_Verification.py`** : nouvelle classe `TestFireVerification` avec 4 tests couvrant la vérification feu :
- Vérification que les combinaisons FIRE n'ont pas de vérifications normales.
- Vérification que les combinaisons FIRE ont des vérifications feu.
- Vérification que les combinaisons normales n'ont pas de vérifications feu.
- Vérification que le paramètre `t_expo` est correctement utilisé.
- Fixture `fire_beam_verif` pour créer un modèle avec combinaisons FIRE (ELU_STR_ACC=True).

## [2.1.2]

### Fixed
Expand Down
21 changes: 21 additions & 0 deletions ourocode/data/profil_acier.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
type;designation;h;b;tw;tf;r1;A;Av;Avz;Iy;Iz;Wely;Welz;Wply;Wplz;iy;iz;masse
A refaire complètement !
HEA;HEA 100;96;100;5.0;8.0;12;21.24;12.0;12.0;349;133.5;69.8;26.7;80.1;41.3;4.06;2.51
HEA;HEA 120;120;120;5.0;8.0;12;25.34;14.0;14.0;606;229.3;101.1;38.2;116.5;59.9;4.90;3.01
HEA;HEA 140;140;140;5.5;8.5;12;31.42;16.8;16.8;1033;389.2;147.6;55.6;172.5;89.3;5.74;3.52
HEA;HEA 160;160;160;6.0;9.0;15;38.77;20.2;20.2;1670;623.9;208.7;78.0;249.3;130.7;6.57;4.02
HEA;HEA 180;180;180;6.5;9.5;15;45.25;23.8;23.8;2510;924.6;278.9;102.7;329.8;171.7;7.45;4.52
HEA;HEA 200;200;200;7.0;10.0;18;53.83;27.6;27.6;3692;1335.6;369.2;133.6;431.6;222.8;8.28;4.98
HEA;HEA 220;220;220;7.5;10.5;18;63.53;31.6;31.6;5409;1955.4;492.6;177.8;571.8;294.4;9.23;5.55
HEA;HEA 240;240;240;7.5;11.0;21;73.85;36.0;36.0;7762;2768.7;646.8;230.7;773.2;391.2;10.27;6.13
HEA;HEA 260;260;260;8.0;11.5;21;84.37;40.6;40.6;10455;3667.6;804.3;282.1;959.1;507.6;11.11;6.60
HEA;HEA 280;280;280;8.5;12.0;24;97.30;46.2;46.2;13670;4762.8;976.4;339.9;1165.8;626.5;11.86;7.00
HEA;HEA 300;300;300;9.0;12.0;24;111.78;51.6;51.6;18262;6310.4;1217.5;420.7;1431.8;836.2;12.78;7.52
HEA;HEA 320;320;320;10.0;13.5;27;131.13;59.0;59.0;24529;8172.7;1533.0;510.8;1798.8;1072.3;13.70;7.89
HEA;HEA 340;340;340;10.0;14.5;27;142.94;65.4;65.4;31533;10474.3;1855.0;616.1;2158.9;1308.9;14.85;8.56
HEA;HEA 360;360;360;12.5;16.5;27;171.18;75.6;75.6;43191;14178.6;2399.5;787.7;2849.2;1674.9;15.88;9.10
HEA;HEA 400;400;400;13.5;18.0;27;198.58;86.2;86.2;63222;20580.3;3161.1;1029.0;3765.8;2191.2;17.85;10.19
HEA;HEA 450;450;450;14.0;20.0;27;237.66;100.2;100.2;93819;29798.3;4170.0;1324.4;4880.9;2816.3;19.88;11.19
HEA;HEA 500;500;500;16.0;23.0;27;298.31;123.4;123.4;131932;42385.5;5277.3;1695.4;6208.0;3616.8;21.04;11.93
HEA;HEA 550;550;550;16.5;24.5;27;354.41;143.8;143.8;178830;56837.2;6502.9;2066.8;7648.2;4388.9;22.44;12.67
HEA;HEA 600;600;600;18.0;28.0;27;428.31;170.4;170.4;238620;78762.8;7954.0;2625.4;9370.9;5318.6;23.63;13.57
File renamed without changes.
6 changes: 3 additions & 3 deletions ourocode/eurocode/core/objet.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ def set_value(self, value: float | int | str = None, unit: str = MathUtilsMixin.

return numeric * self._PHYSICAL_UNITS[unit]

def get_value(self, value: dict|list|str, index: int=None, key: str=None, get_keys: bool=("False", "True"),):
def get_value(self, value: dict|list|str, index: int|None=None, key: str=None, get_keys: bool=("False", "True"),):
"""Extrait et retourne une valeur depuis une structure de données complexe.

Cette méthode utilitaire permet de naviguer dans les dictionnaires,
Expand All @@ -141,9 +141,9 @@ def get_value(self, value: dict|list|str, index: int=None, key: str=None, get_ke
>>> obj.get_value({"x": 1, "y": 2}, get_keys=True)
["x", "y"]
"""
if index and isinstance(value, list):
if index is not None and isinstance(value, list):
value = value[index]
elif index and isinstance(value, str):
elif index is not None and isinstance(value, str):
value = list(value)[index]
elif get_keys and isinstance(value, dict):
value = list(value.keys())
Expand Down
2 changes: 1 addition & 1 deletion ourocode/eurocode/ec1/exploitation.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from math import *

import forallpeople as si
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc

from ourocode.eurocode.core.projet import Projet

Expand Down
2 changes: 1 addition & 1 deletion ourocode/eurocode/ec1/neige.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import warnings

import forallpeople as si
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc

from ourocode.eurocode.core.batiment import Batiment

Expand Down
43 changes: 14 additions & 29 deletions ourocode/eurocode/ec1/vent.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@

import pandas as pd
import forallpeople as si
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc
from ourocode.eurocode.mixins.math_utils import MathUtilsMixin

# sys.path.append(os.path.join(os.getcwd(), "ourocode"))
# from eurocode.A0_Projet import Batiment
Expand All @@ -18,22 +19,6 @@
si.environment("structural")


def interpolation_lineaire(x, xa, xb, ya, yb):
"""Fait une interpolation linéaire pour trouver un résultat y entre deux valeur xa et xb"""
y = ya + (x - xa) * ((yb - ya) / (xb - xa))
return y


def interpolation_logarithmique(x, xa, xb, ya, yb):
"""Fait une interpolation linéaire pour trouver un résultat y entre deux valeur xa et xb"""
y = (
(x > xb) * yb
+ (x < xa) * ya
+ (x <= xb) * (x >= 1) * (ya - (ya - yb) * mt.log10(x))
)
return y


class Vent(Batiment):
RHO_AIR = 1.225 * si.kg / si.m**3
CPI = [0.2, -0.3]
Expand Down Expand Up @@ -581,7 +566,7 @@ def _Cpe(self, cle: str):
if borne_inf:
for i in range(self._df.shape[0]):
list_CPE_line.append(
interpolation_lineaire(
MathUtilsMixin.interpolation_lineaire(
h_d,
borne_inf,
borne_sup,
Expand All @@ -598,7 +583,7 @@ def _Cpe(self, cle: str):
self._df.loc[self._df.shape[0]] = [
self._df.iloc[i, 0],
"CPE " + str(round(self.load_area, 2)),
interpolation_logarithmique(
MathUtilsMixin.interpolation_logarithmique(
self.load_area,
1,
10,
Expand Down Expand Up @@ -734,7 +719,7 @@ def _Cpe(self):
row = [round(self._hp_h, 3), cpe]
for j in range(2, num_columns):
row.append(
interpolation_lineaire(
MathUtilsMixin.interpolation_lineaire(
self._hp_h,
minimum,
maximum,
Expand All @@ -750,7 +735,7 @@ def _Cpe(self):
row = [df.iloc[i, 0], "CPE " + str(round(self.load_area, 2))]
for j in range(2, num_columns):
row.append(
interpolation_logarithmique(
MathUtilsMixin.interpolation_logarithmique(
self.load_area, 1, 10, df.iloc[i + 1, j], df.iloc[i, j]
)
)
Expand Down Expand Up @@ -941,7 +926,7 @@ def _Cpe(self, direction: str):
row.append(df_max.iloc[i, j])
else:
row.append(
interpolation_lineaire(
MathUtilsMixin.interpolation_lineaire(
self.alpha_toit,
minimum,
maximum,
Expand All @@ -957,7 +942,7 @@ def _Cpe(self, direction: str):
row = [df.iloc[i, 0], "CPE " + str(round(self.load_area, 2))]
for j in range(2, num_columns):
row.append(
interpolation_logarithmique(
MathUtilsMixin.interpolation_logarithmique(
self.load_area, 1, 10, df.iloc[i + 1, j], df.iloc[i, j]
)
)
Expand Down Expand Up @@ -1166,7 +1151,7 @@ def _Cpe(self, direction: str):
row.append(df_max.iloc[i, j])
else:
row.append(
interpolation_lineaire(
MathUtilsMixin.interpolation_lineaire(
self.alpha_toit,
minimum,
maximum,
Expand All @@ -1182,7 +1167,7 @@ def _Cpe(self, direction: str):
row = [df.iloc[i, 0], "CPE " + str(round(self.load_area, 2))]
for j in range(2, num_columns):
row.append(
interpolation_logarithmique(
MathUtilsMixin.interpolation_logarithmique(
self.load_area, 1, 10, df.iloc[i + 1, j], df.iloc[i, j]
)
)
Expand Down Expand Up @@ -1304,7 +1289,7 @@ def _Cp(self):
row = [self._df.iloc[i, 0], self.phi]
for j in range(2, 6):
row.append(
interpolation_lineaire(
MathUtilsMixin.interpolation_lineaire(
self.phi,
0,
1,
Expand Down Expand Up @@ -1346,7 +1331,7 @@ def _Cp(self):
row.append(df_max.iloc[i, j])
else:
row.append(
interpolation_lineaire(
MathUtilsMixin.interpolation_lineaire(
self.alpha_toit,
minimum,
maximum,
Expand Down Expand Up @@ -1480,7 +1465,7 @@ def _Cp(self):
row = [self._df.iloc[i, 0], self.phi]
for j in range(2, 7):
row.append(
interpolation_lineaire(
MathUtilsMixin.interpolation_lineaire(
self.phi,
0,
1,
Expand Down Expand Up @@ -1522,7 +1507,7 @@ def _Cp(self):
row.append(df_max.iloc[i, j])
else:
row.append(
interpolation_lineaire(
MathUtilsMixin.interpolation_lineaire(
self.alpha_toit,
minimum,
maximum,
Expand Down
2 changes: 1 addition & 1 deletion ourocode/eurocode/ec3/assemblage/platine.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import forallpeople as si
si.environment("structural")
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc

from ourocode.eurocode.ec3.assemblage.tige import Tige
from ourocode.eurocode.ec3.element_droit.plat import Plat
Expand Down
2 changes: 1 addition & 1 deletion ourocode/eurocode/ec3/assemblage/soudure.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from matplotlib.patches import Rectangle, Circle
import forallpeople as si
si.environment("structural")
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc

from ourocode.eurocode.ec3.element_droit.plat import Plat

Expand Down
2 changes: 1 addition & 1 deletion ourocode/eurocode/ec3/assemblage/tige.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import forallpeople as si
si.environment("structural")
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc

from ourocode.eurocode.ec3.element_droit.plat import Plat

Expand Down
3 changes: 2 additions & 1 deletion ourocode/eurocode/ec3/element_droit/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from ourocode.eurocode.ec3.element_droit.plat import Plat
from ourocode.eurocode.ec3.element_droit.profil import Profil
from ourocode.eurocode.ec3.element_droit.traction import Traction
from ourocode.eurocode.ec3.element_droit.compression import Compression
from ourocode.eurocode.ec3.element_droit.cisaillement import Cisaillement
from ourocode.eurocode.ec3.element_droit.flexion import Flexion

__all__ = ["Plat", "Traction", "Compression", "Cisaillement", "Flexion"]
__all__ = ["Plat", "Profil", "Traction", "Compression", "Cisaillement", "Flexion"]
2 changes: 1 addition & 1 deletion ourocode/eurocode/ec3/element_droit/cisaillement.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import forallpeople as si
si.environment("structural")
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc

from ourocode.eurocode.ec3.element_droit.plat import Plat

Expand Down
32 changes: 20 additions & 12 deletions ourocode/eurocode/ec3/element_droit/compression.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import forallpeople as si
si.environment("structural")
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc

from ourocode.eurocode.ec3.element_droit.plat import Plat

Expand All @@ -17,7 +17,7 @@ class Compression(Plat):
"Encastré - Rotule" : 0.7,
"Encastré - Encastré" : 0.5,
"Encastré - Rouleau" : 1}
def __init__(self, A: si.mm**2, Iy:si.mm**4, Iz:si.mm**4, lo_y: si.mm=0, lo_z: si.mm=0, courbe_flamb: dict="{'y':'c', 'z':'c'}", type_appuis: str=COEF_LF, *args, **kwargs):
def __init__(self, A: si.mm**2, Iy:si.mm**4, Iz:si.mm**4, lo_y: si.mm=0, lo_z: si.mm=0, courbe_flamb: dict="{'y':'c', 'z':'c'}", type_appuis_y: str=COEF_LF, type_appuis_z: str=COEF_LF, *args, **kwargs):
"""
Classe intégrant les formules de compression et d'instabilité au flambement à l'EC3.
Cette classe est hérité de la classe Plat du module EC3_Element_droit.py.
Expand All @@ -28,21 +28,29 @@ def __init__(self, A: si.mm**2, Iy:si.mm**4, Iz:si.mm**4, lo_y: si.mm=0, lo_z: s
Iz (float): Moment quadratique suivant l'axe de rotation z en mm4
lo_y (float): Longueur de flambement suivant l'axe de rotation y en mm. Defaults to 0.
lo_z (float): Longueur de flambement suivant l'axe de rotation z en mm. Defaults to 0.
type_appuis (str): Permet de déterminé la forme du flambement en fonction des types d'appui:
Encastré 1 côté : 2
Rotule - Rotule : 1
Encastré - Rotule : 0.7
Encastré - Encastré : 0.5
Encastré - Rouleau : 1
type_appuis_y (str): Conditions d'appui pour le flambement selon l'axe de rotation y.
Détermine β_y dans lf_y = β_y · lo_y.
Valeurs possibles (voir COEF_LF):
- "Encastré 1 côté" : β = 2.0 (console)
- "Rotule - Rotule" : β = 1.0 (articulé-articulé)
- "Encastré - Rotule" : β = 0.7
- "Encastré - Encastré" : β = 0.5
- "Encastré - Rouleau" : β = 1.0 (encastré-glissière)
Defaults to "Rotule - Rotule".
type_appuis_z (str, optional): Conditions d'appui pour le flambement
selon l'axe de rotation z.

"""
super().__init__(*args, **kwargs)
self.A = A * si.mm**2
self.Iy = Iy * si.mm**4
self.Iz = Iz * si.mm**4
self.lo ={'y': lo_y*si.mm, 'z': lo_z*si.mm}
self.courbe_flamb = courbe_flamb
self.type_appuis = type_appuis
self.coef_lef = self.COEF_LF[type_appuis]
self.type_appuis_y = type_appuis_y
self.type_appuis_z = type_appuis_z
self.coef_lef_y = self.COEF_LF[type_appuis_y]
self.coef_lef_z = self.COEF_LF[type_appuis_z]



Expand Down Expand Up @@ -76,8 +84,8 @@ def lamb(self):
dict: {"y": λ_y, "z": λ_z} (élancements sans unité).
"""
lamb = {'y':0, 'z':0}
lamb['y'] = (self.lo['y'].value * 10**3 * self.coef_lef) / mt.sqrt(self.Iy / (self.A))
lamb['z'] = (self.lo['z'].value * 10**3 * self.coef_lef) / mt.sqrt(self.Iz / (self.A))
lamb['y'] = (self.lo['y'].value * 10**3 * self.coef_lef_y) / mt.sqrt(self.Iy / (self.A))
lamb['z'] = (self.lo['z'].value * 10**3 * self.coef_lef_z) / mt.sqrt(self.Iz / (self.A))
return lamb

@property
Expand Down
2 changes: 1 addition & 1 deletion ourocode/eurocode/ec3/element_droit/flexion.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import forallpeople as si
si.environment("structural")
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc

from ourocode.eurocode.ec3.element_droit.plat import Plat
from ourocode.eurocode.ec3.element_droit.cisaillement import Cisaillement
Expand Down
2 changes: 1 addition & 1 deletion ourocode/eurocode/ec3/element_droit/plat.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import forallpeople as si
si.environment("structural")
from ourocode.eurocode.core.renderer import handcalc
from ourocode.eurocode.core._renderer import handcalc

from ourocode.eurocode.core.projet import Projet

Expand Down
Loading
Loading