From 85a00d158f157e23fe851a6f7d4538116f8dfc80 Mon Sep 17 00:00:00 2001 From: Nicholas Clemett Date: Thu, 17 Oct 2024 09:57:10 +0200 Subject: [PATCH 1/7] Add torisonfactor file --- .../torsion_factors_rectangular_solid_sections.csv | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 eurocodedesign/geometry/steelsections/_data/torsion_factors_rectangular_solid_sections.csv diff --git a/eurocodedesign/geometry/steelsections/_data/torsion_factors_rectangular_solid_sections.csv b/eurocodedesign/geometry/steelsections/_data/torsion_factors_rectangular_solid_sections.csv new file mode 100644 index 0000000..db68939 --- /dev/null +++ b/eurocodedesign/geometry/steelsections/_data/torsion_factors_rectangular_solid_sections.csv @@ -0,0 +1,10 @@ +aspect_ratio,alpha,beta +1,0.14,0.208 +1.25,0.171,0.221 +1.5,0.196,0.231 +2,0.229,0.246 +3,0.263,0.267 +4,0.281,0.282 +6,0.299,0.299 +10,0.313,0.313 +1000,0.333,0.333 From c6e58b15dff56f9d19d5e4ddd3e0459e0f5d9b3b Mon Sep 17 00:00:00 2001 From: Nicholas Clemett Date: Thu, 17 Oct 2024 11:57:37 +0200 Subject: [PATCH 2/7] Add RectangularSolidSection --- .../geometry/steelsections/__init__.py | 57 ++++++++++++++++-- eurocodedesign/materials/structuralsteel.py | 1 + tests/test_steelsections.py | 60 ++++++++++++++++++- 3 files changed, 112 insertions(+), 6 deletions(-) diff --git a/eurocodedesign/geometry/steelsections/__init__.py b/eurocodedesign/geometry/steelsections/__init__.py index 23e3d62..6d855b9 100644 --- a/eurocodedesign/geometry/steelsections/__init__.py +++ b/eurocodedesign/geometry/steelsections/__init__.py @@ -2,17 +2,24 @@ STEEL PROFILE CLASSES """ import os +from math import sqrt from dataclasses import dataclass, field from pathlib import Path from typing import Any, Dict, Type +import numpy as np import pandas as pd +from numpy.typing import ArrayLike from eurocodedesign.geometry.section import BasicSection +from eurocodedesign.materials.structuralsteel import DENSITY +@ dataclass(frozen=True) +class SteelSection(): + ... @dataclass(frozen=True) -class SteelSection(BasicSection): +class StandardSteelSection(BasicSection): # properties common among all steel sections (incl. major axis bending) m: float = field(kw_only=True) A: float = field(kw_only=True) @@ -51,7 +58,7 @@ class ISection(SteelSection): @dataclass(frozen=True) -class LSection(RolledSection): +class LSection(RolledSection, StandardSteelSection): h: float = field(kw_only=True) b: float = field(kw_only=True) t: float = field(kw_only=True) @@ -73,13 +80,13 @@ class HollowSection(SteelSection): @dataclass(frozen=True) -class RolledISection(RolledSection, ISection): +class RolledISection(RolledSection, ISection, StandardSteelSection): r: float = field(kw_only=True) P: float = field(kw_only=True) @dataclass(frozen=True) -class CircularHollowSection(HollowSection): +class CircularHollowSection(HollowSection, StandardSteelSection): D: float = field(kw_only=True) P: float = field(kw_only=True) t: float = field(kw_only=True) @@ -100,7 +107,7 @@ def __post_init__(self) -> None: @dataclass(frozen=True) -class RectangularHollowSection(HollowSection): +class RectangularHollowSection(HollowSection, StandardSteelSection): h: float = field(kw_only=True) b: float = field(kw_only=True) t: float = field(kw_only=True) @@ -126,6 +133,38 @@ def __post_init__(self) -> None: object.__setattr__(self, "W_pl", self.W_ply) +@dataclass(frozen=True) +class RectangularSolidSection(SteelSection): + h: float + b: float + + def __post_init__(self): + object.__setattr__(self, "name", f"Rect{self.h}x{self.b}") + object.__setattr__(self, "A", self.h * self.b) + object.__setattr__(self, "m", self.A * DENSITY / 1e6) + object.__setattr__(self, "P", 2 * (self.h + self.b)) + object.__setattr__(self, "A_vz", self.A * self.h / (self.h + self.b)) + object.__setattr__(self, "A_vy", self.A * self.b / (self.h + self.b)) + object.__setattr__(self, "I_y", self.b * self.h ** 3 / 12) + object.__setattr__(self, "i_y", sqrt(self.I_y / self.A)) + object.__setattr__(self, "W_ely", self.b * self.h ** 2 / 6) + object.__setattr__(self, "W_ply", self.b * self.h ** 2 / 4) + object.__setattr__(self, "I_z", self.h * self.b ** 3 / 12) + object.__setattr__(self, "i_z", sqrt(self.I_z / self.A)) + object.__setattr__(self, "W_elz", self.h * self.b ** 2 / 6) + object.__setattr__(self, "W_plz", self.h * self.b ** 2 / 4) + object.__setattr__(self, "I_T", self._alpha() * self.h * self. b ** 3) + object.__setattr__(self, "W_T", self._beta() * self.h * self. b ** 2) + + def _alpha(self): + data = rect_section_torsion_factors() + return np.interp(self.h / self.b, data[:,0], data[:,1]) + + def _beta(self): + data = rect_section_torsion_factors() + return np.interp(self.h / self.b, data[:,0], data[:,2]) + + """ MODULE LEVEL CONSTANTS """ @@ -388,3 +427,11 @@ def _is_valid_property(df: pd.DataFrame, prop: str) -> bool: if prop in df.columns: return True return False + + +def rect_section_torsion_factors() -> ArrayLike: + file_name = "torsion_factors_rectangular_solid_sections.csv" + folder = _get_data_path() + + factors = np.loadtxt(folder / file_name, delimiter=",", skiprows=1) + return factors \ No newline at end of file diff --git a/eurocodedesign/materials/structuralsteel.py b/eurocodedesign/materials/structuralsteel.py index e22def3..db6dc49 100644 --- a/eurocodedesign/materials/structuralsteel.py +++ b/eurocodedesign/materials/structuralsteel.py @@ -33,6 +33,7 @@ from eurocodedesign.units import Pascal, mm2, N +DENSITY = 7850 # kg/m³ @dataclass(frozen=True) class BasicStructuralSteel(): diff --git a/tests/test_steelsections.py b/tests/test_steelsections.py index 6c538ce..d11cb49 100644 --- a/tests/test_steelsections.py +++ b/tests/test_steelsections.py @@ -6,7 +6,7 @@ from unittest.mock import patch import pandas as pd -from pytest import fixture, raises +from pytest import fixture, raises, approx import eurocodedesign.geometry.steelsections as ss @@ -252,6 +252,28 @@ def ipe_dataframe(): return pd.DataFrame(data, columns=columns, index=["IPE100", "IPE270"]) +@fixture +def dummy_100x60(): + props = { + "A" : 6000, + "m" : 47.1, + "P" : 320, + "A_vz" : 3750, + "A_vy" : 2250, + "I_y" : 5000000, + "i_y" : 28.86751346, + "W_ely" : 100000, + "W_ply" : 150000, + "I_z" : 1800000, + "i_z" : 17.32050808, + "W_elz" : 60000, + "W_plz" : 90000, + "I_T" : 4471200.004, + "W_T" : 84960.00036} + return props + + + def test_when_is_valid_type(): assert ss._is_valid_type("HEM600") is True @@ -367,3 +389,39 @@ def test_invalid_property(self, ipe_dataframe): def test_valid_property(self, ipe_dataframe): assert ss._is_valid_property(ipe_dataframe, "A") is True + + +class TestTorsionFactors: + def test_shape(self): + assert ss.rect_section_torsion_factors().shape == (9,3) + + def test_value(self): + assert ss.rect_section_torsion_factors()[2, 1] == 0.196 + + +class TestRectangularSolidSection: + def test_alpha(self): + section = ss.RectangularSolidSection(100, 60) + assert section._alpha() == approx(0.2070000022) + + def test_beta(self): + section = ss.RectangularSolidSection(100, 60) + assert section._beta() == approx(0.236000001) + + def test_properties(self, dummy_100x60): + section = ss.RectangularSolidSection(100, 60) + assert all([section.A == approx(dummy_100x60["A"]), + section.m == approx(dummy_100x60["m"]), + section.P == approx(dummy_100x60["P"]), + section.A_vz == approx(dummy_100x60["A_vz"]), + section.A_vy == approx(dummy_100x60["A_vy"]), + section.I_y == approx(dummy_100x60["I_y"]), + section.i_y == approx(dummy_100x60["i_y"]), + section.W_ely == approx(dummy_100x60["W_ely"]), + section.W_ply == approx(dummy_100x60["W_ply"]), + section.I_z == approx(dummy_100x60["I_z"]), + section.i_z == approx(dummy_100x60["i_z"]), + section.W_ely == approx(dummy_100x60["W_ely"]), + section.W_ply == approx(dummy_100x60["W_ply"]), + section.I_T == approx(dummy_100x60["I_T"]), + section.W_T == approx(dummy_100x60["W_T"])]) \ No newline at end of file From 110caca58816e82478b4e1ceeb1568eebc947707 Mon Sep 17 00:00:00 2001 From: Nicholas Clemett Date: Thu, 24 Oct 2024 16:10:54 +0200 Subject: [PATCH 3/7] Allow get to work with non standard cross sections --- .../geometry/steelsections/__init__.py | 101 +++++++++++++----- tests/test_steelsections.py | 41 +++++-- 2 files changed, 105 insertions(+), 37 deletions(-) diff --git a/eurocodedesign/geometry/steelsections/__init__.py b/eurocodedesign/geometry/steelsections/__init__.py index 6d855b9..8c33a86 100644 --- a/eurocodedesign/geometry/steelsections/__init__.py +++ b/eurocodedesign/geometry/steelsections/__init__.py @@ -2,6 +2,7 @@ STEEL PROFILE CLASSES """ import os +import re from math import sqrt from dataclasses import dataclass, field from pathlib import Path @@ -104,6 +105,8 @@ def __post_init__(self) -> None: object.__setattr__(self, "i", self.i_y) object.__setattr__(self, "W_el", self.W_ely) object.__setattr__(self, "W_pl", self.W_ply) + object.__setattr__(self, "h", self.D) + object.__setattr__(self, "b", self.D) @dataclass(frozen=True) @@ -199,9 +202,14 @@ def _beta(self): "section_class": RectangularHollowSection, }, "L": {"filename": "L_en10056_2017.csv", - "section_class": LSection} + "section_class": LSection + }, + "Rect": {"filename": "", + "section_class": RectangularSolidSection} } +_NO_FILES = ["Rect"] + # used to link the variable names in the csv data to variable names in code _PROPERTY_TYPE_MAP: Dict[str, Type[float] | Type[str]] = { # TODO change float to abstractunit @@ -259,25 +267,27 @@ def _get_data_path() -> Path: return Path(os.path.dirname(os.path.realpath(__file__))) / "_data" -def _is_valid_type(section_name: str) -> bool: +def _is_valid_type(section_type: str) -> bool: """checks that the section type provided is valid A section type is valid if a csv datafile exists for the section type provided by section_name, e.g. "IPE", "HEA", "CHS", etc. Args: - section_name (str): name of the section section e.g. "IPE100" + section_type (str): type of section e.g. "IPE", "Rect" Returns: bool: True if the section type is valid, False otherwise """ - for section_type in _SECTION_DATA.keys(): - if section_type in section_name: - filepath = _get_data_path() \ - / str(_SECTION_DATA[section_type]["filename"]) - return os.path.exists(filepath) + if section_type in _SECTION_DATA.keys(): + return True return False +def _is_file_available(section_type: str): + filepath = _get_data_path() / str(_SECTION_DATA[section_type]["filename"]) + return os.path.exists(filepath) + + def import_section_database(section_type: str) -> pd.DataFrame: """imports the data for the chosen section type as a pandas dataframe @@ -339,6 +349,8 @@ def _get_section_type(section_name: str) -> str | None: def _load_section_props(section_name: str) -> Any: """retrieves the section properties for the given section + + assumes the section_name belongs to valid type of cross-section Args: section_name (str): the name of the steel section @@ -352,19 +364,20 @@ def _load_section_props(section_name: str) -> Any: Returns: pd.Series: containing all the geometric data for the profile """ - if not isinstance(section_name, str): - raise ValueError("Provide the section name as a string e.g. 'IPE100'") - else: - if not _is_valid_type(section_name): - raise ValueError(f"Invalid section type for section: " - f"'{section_name}'") - section_type = _get_section_type(section_name) - if not section_type: - raise ValueError - section_db = import_section_database(section_type) - if _is_valid_section(section_name, section_db): - return section_db.loc[section_name] - raise ValueError(f"Invalid section name: '{section_name}'") + # if not isinstance(section_name, str): + # raise ValueError("Provide the section name as a string e.g. 'IPE100'") + # else: + # if not _is_valid_type(section_name): + # raise ValueError(f"Invalid section type for section: " + # f"'{section_name}'") + section_type = _get_section_type(section_name) + # if not section_type: + # raise ValueError + section_db = import_section_database(section_type) + + if _is_valid_section(section_name, section_db): + return section_db.loc[section_name] + raise ValueError(f"Invalid section name: '{section_name}'") def _get_section(section_name: str) -> SteelSection: @@ -380,15 +393,31 @@ def _get_section(section_name: str) -> SteelSection: Returns: SteelSection: object containing the geometric properties of the section """ - section_props = _load_section_props(section_name) + section_type = _get_section_type(section_name) - if not section_type: - raise ValueError + if not _is_valid_type(section_type): + raise ValueError(f"Invalid section type for section: '{section_name}'") + + if not section_type in _NO_FILES: + if not _is_file_available(section_type): + raise ValueError(f"No data available for: {section_type}") + + section_props = _load_section_props(section_name) + + if not section_type: + raise ValueError + + section_class = _SECTION_DATA[section_type]["section_class"] + if not isinstance(section_class, type(SteelSection)): + raise TypeError + return section_class(section_name, **_map_property_names(section_props)) + section_class = _SECTION_DATA[section_type]["section_class"] - if not isinstance(section_class, type(SteelSection)): - raise TypeError - return section_class(section_name, **_map_property_names(section_props)) + if section_type == "Rect": + height, width = _rect_height_and_width(section_name) + return section_class(height, width) + def _map_property_names(section_props: Any) -> Dict[str, Any]: return {str(k): _PROPERTY_TYPE_MAP[k](v) for k, v in section_props.items()} @@ -434,4 +463,20 @@ def rect_section_torsion_factors() -> ArrayLike: folder = _get_data_path() factors = np.loadtxt(folder / file_name, delimiter=",", skiprows=1) - return factors \ No newline at end of file + return factors + + +def _rect_height_and_width(section_name: str): + if _has_valid_rect_dimensions(section_name): + height, width = section_name[4:].split("x") + return float(height), float(width) + + +def _has_valid_rect_dimensions(section_name:str): + """returns true if section_name contains [float]x[float] + """ + match = re.search(r"\d*\.?\d*+[x]\d*\.?\d*+", section_name) + + if match == None: + return False + return True diff --git a/tests/test_steelsections.py b/tests/test_steelsections.py index d11cb49..ced5f6d 100644 --- a/tests/test_steelsections.py +++ b/tests/test_steelsections.py @@ -275,7 +275,7 @@ def dummy_100x60(): def test_when_is_valid_type(): - assert ss._is_valid_type("HEM600") is True + assert ss._is_valid_type("HEM") is True def test_when_not_is_valid_type_with_empty_string(): @@ -302,16 +302,11 @@ def test_when_get_section_type_is_not_found(): assert ss._get_section_type("320LRB") == "" -def test_load_section_props_input_not_string(): - with raises(ValueError): - ss._load_section_props(2) - - -def test_load_section_props_input_is_wrong_type(): +def test_get_section_input_is_wrong_type(): with raises( ValueError, match="Invalid section type for section: 'XYZ281'" ): - ss._load_section_props("XYZ281") + ss._get_section("XYZ281") def test_load_section_props_input_is_wrong_section(): @@ -424,4 +419,32 @@ def test_properties(self, dummy_100x60): section.W_ely == approx(dummy_100x60["W_ely"]), section.W_ply == approx(dummy_100x60["W_ply"]), section.I_T == approx(dummy_100x60["I_T"]), - section.W_T == approx(dummy_100x60["W_T"])]) \ No newline at end of file + section.W_T == approx(dummy_100x60["W_T"])]) + + def test_get(self): + section = ss.RectangularSolidSection(100, 60) + assert ss.get("Rect100x60") == section + + +class TestHasValidRectDimensions(): + def test_with_floats(self): + section_name = "Rect100.3x61.2" + assert ss._has_valid_rect_dimensions(section_name) is True + + def test_with_ints(self): + section_name = "Rect100x61" + assert ss._has_valid_rect_dimensions(section_name) is True + + def test_floats_and_ints(self): + section_name = "Rect100x61.2" + assert ss._has_valid_rect_dimensions(section_name) is True + + def test_no_x(self): + section_name = "Rect40y10" + ss._has_valid_rect_dimensions(section_name) is False + + +def test_rect_height_and_width(): + section_name = "Rect100.3x10" + height, width = ss._rect_height_and_width(section_name) + assert ((height == 100.3) and (width == 10)) is True From 6fc191e0fe628854458b052917949db2f89f421b Mon Sep 17 00:00:00 2001 From: Nicholas Clemett Date: Tue, 17 Dec 2024 10:33:11 +0100 Subject: [PATCH 4/7] Correct error in calculation of shear area for rectangular cross sections --- eurocodedesign/geometry/steelsections/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eurocodedesign/geometry/steelsections/__init__.py b/eurocodedesign/geometry/steelsections/__init__.py index 8c33a86..20df65a 100644 --- a/eurocodedesign/geometry/steelsections/__init__.py +++ b/eurocodedesign/geometry/steelsections/__init__.py @@ -146,8 +146,8 @@ def __post_init__(self): object.__setattr__(self, "A", self.h * self.b) object.__setattr__(self, "m", self.A * DENSITY / 1e6) object.__setattr__(self, "P", 2 * (self.h + self.b)) - object.__setattr__(self, "A_vz", self.A * self.h / (self.h + self.b)) - object.__setattr__(self, "A_vy", self.A * self.b / (self.h + self.b)) + object.__setattr__(self, "A_vz", self.A * self.h) + object.__setattr__(self, "A_vy", self.A * self.b) object.__setattr__(self, "I_y", self.b * self.h ** 3 / 12) object.__setattr__(self, "i_y", sqrt(self.I_y / self.A)) object.__setattr__(self, "W_ely", self.b * self.h ** 2 / 6) From 04c0bf79e30cb323d72837fc30a8f09179bd76ed Mon Sep 17 00:00:00 2001 From: Nicholas Clemett Date: Mon, 3 Mar 2025 10:08:32 +0100 Subject: [PATCH 5/7] Add radius property to ISection class --- eurocodedesign/geometry/steelsections/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/eurocodedesign/geometry/steelsections/__init__.py b/eurocodedesign/geometry/steelsections/__init__.py index 20df65a..a96581b 100644 --- a/eurocodedesign/geometry/steelsections/__init__.py +++ b/eurocodedesign/geometry/steelsections/__init__.py @@ -48,6 +48,7 @@ class ISection(SteelSection): b: float = field(kw_only=True) t_w: float = field(kw_only=True) t_f: float = field(kw_only=True) + r: float = field(kw_only=True) A_vz: float = field(kw_only=True) A_vy: float = field(kw_only=True) W_ply: float = field(kw_only=True) From 0fa8038e92e6dd8883ad714e66a1ef43f3e96b4a Mon Sep 17 00:00:00 2001 From: Nicholas Clemett Date: Mon, 3 Mar 2025 10:30:45 +0100 Subject: [PATCH 6/7] Fix Regex issue for Python 3.10 --- eurocodedesign/geometry/steelsections/__init__.py | 6 +++--- tests/test_steelsections.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/eurocodedesign/geometry/steelsections/__init__.py b/eurocodedesign/geometry/steelsections/__init__.py index a96581b..3e90a70 100644 --- a/eurocodedesign/geometry/steelsections/__init__.py +++ b/eurocodedesign/geometry/steelsections/__init__.py @@ -147,8 +147,8 @@ def __post_init__(self): object.__setattr__(self, "A", self.h * self.b) object.__setattr__(self, "m", self.A * DENSITY / 1e6) object.__setattr__(self, "P", 2 * (self.h + self.b)) - object.__setattr__(self, "A_vz", self.A * self.h) - object.__setattr__(self, "A_vy", self.A * self.b) + object.__setattr__(self, "A_vz", self.b * self.h) + object.__setattr__(self, "A_vy", self.h * self.b) object.__setattr__(self, "I_y", self.b * self.h ** 3 / 12) object.__setattr__(self, "i_y", sqrt(self.I_y / self.A)) object.__setattr__(self, "W_ely", self.b * self.h ** 2 / 6) @@ -476,7 +476,7 @@ def _rect_height_and_width(section_name: str): def _has_valid_rect_dimensions(section_name:str): """returns true if section_name contains [float]x[float] """ - match = re.search(r"\d*\.?\d*+[x]\d*\.?\d*+", section_name) + match = re.search(r"(\d+)\.?(\d+)[x](\d+)\.?(\d+)", section_name) if match == None: return False diff --git a/tests/test_steelsections.py b/tests/test_steelsections.py index ced5f6d..3b896ff 100644 --- a/tests/test_steelsections.py +++ b/tests/test_steelsections.py @@ -258,8 +258,8 @@ def dummy_100x60(): "A" : 6000, "m" : 47.1, "P" : 320, - "A_vz" : 3750, - "A_vy" : 2250, + "A_vz" : 6000, + "A_vy" : 6000, "I_y" : 5000000, "i_y" : 28.86751346, "W_ely" : 100000, @@ -416,8 +416,8 @@ def test_properties(self, dummy_100x60): section.W_ply == approx(dummy_100x60["W_ply"]), section.I_z == approx(dummy_100x60["I_z"]), section.i_z == approx(dummy_100x60["i_z"]), - section.W_ely == approx(dummy_100x60["W_ely"]), - section.W_ply == approx(dummy_100x60["W_ply"]), + section.W_elz == approx(dummy_100x60["W_elz"]), + section.W_plz == approx(dummy_100x60["W_plz"]), section.I_T == approx(dummy_100x60["I_T"]), section.W_T == approx(dummy_100x60["W_T"])]) From 5ab4b028d16ef9d6d66613d84d35ce295e601293 Mon Sep 17 00:00:00 2001 From: Dominik Thomas Date: Thu, 23 Oct 2025 19:32:43 +0200 Subject: [PATCH 7/7] Add documentation stub --- docs/eurocodedesign.constants.rst | 10 +++ ...ocodedesign.standard.ec3.steel_bridges.rst | 21 +++++ docs/index.rst | 2 +- docs/usage/ec3.rst | 82 +++++++++++++++++++ docs/{usage.rst => usage/gettingstarted.rst} | 2 +- docs/usage/index.rst | 16 ++++ docs/usage/namingconvention.rst | 14 ++++ 7 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 docs/eurocodedesign.constants.rst create mode 100644 docs/eurocodedesign.standard.ec3.steel_bridges.rst create mode 100644 docs/usage/ec3.rst rename docs/{usage.rst => usage/gettingstarted.rst} (83%) create mode 100644 docs/usage/index.rst create mode 100644 docs/usage/namingconvention.rst diff --git a/docs/eurocodedesign.constants.rst b/docs/eurocodedesign.constants.rst new file mode 100644 index 0000000..f4d78c9 --- /dev/null +++ b/docs/eurocodedesign.constants.rst @@ -0,0 +1,10 @@ +eurocodedesign.constants package +================================ + +Module contents +--------------- + +.. automodule:: eurocodedesign.constants + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/eurocodedesign.standard.ec3.steel_bridges.rst b/docs/eurocodedesign.standard.ec3.steel_bridges.rst new file mode 100644 index 0000000..240b7a5 --- /dev/null +++ b/docs/eurocodedesign.standard.ec3.steel_bridges.rst @@ -0,0 +1,21 @@ +eurocodedesign.standard.ec3.steel\_bridges package +================================================== + +Submodules +---------- + +eurocodedesign.standard.ec3.steel\_bridges.fatigue module +--------------------------------------------------------- + +.. automodule:: eurocodedesign.standard.ec3.steel_bridges.fatigue + :members: + :show-inheritance: + :undoc-members: + +Module contents +--------------- + +.. automodule:: eurocodedesign.standard.ec3.steel_bridges + :members: + :show-inheritance: + :undoc-members: diff --git a/docs/index.rst b/docs/index.rst index 5b011f5..b8ec9ad 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -7,7 +7,7 @@ Welcome to eurocodedesign's documentation! readme installation - usage + usage/index modules contributing authors diff --git a/docs/usage/ec3.rst b/docs/usage/ec3.rst new file mode 100644 index 0000000..9fe073f --- /dev/null +++ b/docs/usage/ec3.rst @@ -0,0 +1,82 @@ +###################################### +Eurocode 3: Design of steel structures +###################################### + +********************* +Implementation status +********************* + ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| Standard | Title | Status | ++==================+============================================================================================+==================+ +| EN 1993-1-1 | General rules and rules for buildings | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-2 | General rules - Structural fire design | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-3 | General rules - Supplementary rules for cold-formed members and sheeting | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-4 | General rules - Supplementary rules for stainless steels | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-5 | General rules - Plated structural elements | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-6 | General rules - Strength and stability of shell structures | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-7 | General rules - Strength and stability of planar plated structures subject to | | +| | out of plane loading | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-8 | Design of joints | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-9 | Fatigue | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-10 | Material toughness and through-thickness properties | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-11 | Design of structures with tension components | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-1-12 | General - High strength steels | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-2 | Steel bridges | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-3-1 | Towers, masts and chimneys – Towers and masts | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-3-2 | Towers, masts and chimneys – Chimneys | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-4-1 | Silos | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-4-2 | Storage tanks | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-4-3 | Pipelines | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-5 | Deep foundation (piling) | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ +| EN 1993-6 | Crane supporting structures | | ++------------------+--------------------------------------------------------------------------------------------+------------------+ + + +************************************************** +EN 1993-1-1: General rules and rules for buildings +************************************************** + +Safety factors and crosssection is partly implemented + + +******************************************************* +EN 1993-1-5: General rules - Plated structural elements +******************************************************* + +§ 4-7: Effective width method +============================ + + + +§ 10: Reduced stress method +=========================== + + + + +************************** +EN 1993-2: Steel bridges +************************** + +§ 9: Fatigue +============ diff --git a/docs/usage.rst b/docs/usage/gettingstarted.rst similarity index 83% rename from docs/usage.rst rename to docs/usage/gettingstarted.rst index 69ac7f5..1148c50 100644 --- a/docs/usage.rst +++ b/docs/usage/gettingstarted.rst @@ -1,5 +1,5 @@ ===== -Usage +Getting started ===== To use eurocodedesign in a project:: diff --git a/docs/usage/index.rst b/docs/usage/index.rst new file mode 100644 index 0000000..f6e91f3 --- /dev/null +++ b/docs/usage/index.rst @@ -0,0 +1,16 @@ +Usage +========================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + usage + namingconvention + ec3 + +Indices and tables +================== +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/usage/namingconvention.rst b/docs/usage/namingconvention.rst new file mode 100644 index 0000000..70f275b --- /dev/null +++ b/docs/usage/namingconvention.rst @@ -0,0 +1,14 @@ +================= +Naming convention +================= + +The naming convention in eurocodedesign tries to follow the eurocode naming convention as closely as possible, while +being restrained to valid python names and using only alphanumerical characters. + +* First letter is uppercase if the symbol is uppercase in eurocode, e.g. ``F_Ed`` +* Commas in subscript are neglected, except for ``Ed`` and ``Rd``, where it is replaced by an underscore, e.g. ``F_z_Ed, M_BV_Rd, M_cB_Rd, M_pl_Rd`` +* Subscript is added with an underscore before the subscript, e.g. ``M_I_Ed`` +* Only alphanumerical names are valid, greek letters are written out, e.g. ``Delta_M_y_Ed, Phi_LT, alpha_crop, alpha_ultk`` +* Variable names with a bar, like relative slenderness, are written as ``bar_lambda_czmod`` +* Other examples are ``phi_0, Chi_LT, psi`` +