Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#355 Added menard equations 2.21 and 2.22 of CUR 228 #356

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
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
3 changes: 3 additions & 0 deletions blueprints/codes/cur/cur_228/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"""CUR-228 package."""

CUR_228 = "CUR 228"
93 changes: 93 additions & 0 deletions blueprints/codes/cur/cur_228/formula_2_21.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
"""Contains formula 2.21 from CUR 228."""

from blueprints.codes.cur.cur_228 import CUR_228
from blueprints.codes.formula import Formula
from blueprints.codes.latex_formula import LatexFormula
from blueprints.type_alias import KN_M3, KPA, M
from blueprints.validations import raise_if_negative


class Form2Dot21MenardStiffness(Formula):
"""Representation of equation 2.21 CUR 228."""

source_document = CUR_228
label = "2.21"
r_0: M = 0.3

def __init__(self, r: M, e_p: KPA, alpha: float) -> None:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use DIMENSIONLESS instead of float

Suggested change
from blueprints.type_alias import KN_M3, KPA, M
from blueprints.validations import raise_if_negative
class Form2Dot21MenardStiffness(Formula):
"""Representation of equation 2.21 CUR 228."""
source_document = CUR_228
label = "2.21"
r_0: M = 0.3
def __init__(self, r: M, e_p: KPA, alpha: float) -> None:
from blueprints.type_alias import KN_M3, KPA, M, DIMENSIONLESS
from blueprints.validations import raise_if_negative
class Form2Dot21MenardStiffness(Formula):
"""Representation of equation 2.21 CUR 228."""
source_document = CUR_228
label = "2.21"
r_0: M = 0.3
def __init__(self, r: M, e_p: KPA, alpha: DIMENSIONLESS) -> None:

"""Calculates the Menard stiffness (k_h) for r >= 0.3 m.

Parameters
----------
r: M
The radius of a foundation pile [m]:
r >= 0.3 m
e_p: KPA
Elastic modulus of Ménard [kPa]:
e_p ≈ beta * q_c
beta: float
Dependent on soil type [-]:
q_c: float
Cone resistance [kPa]
alpha: float
Factor dependent on soil type [-]:
"""
super().__init__()
self.r = float(r)
self.e_p = float(e_p)
self.alpha = float(alpha)

@staticmethod
def _evaluate(r: M, e_p: KPA, alpha: float) -> KN_M3:
"""Evaluates the formula, for more information see the __init__ method."""
r_0 = Form2Dot21MenardStiffness.r_0
raise_if_negative(r=r, e_p=e_p, alpha=alpha)

if r >= r_0:
return 3 * e_p / (1.3 * r_0 * (2.65 * r / r_0) ** alpha + alpha * r)
msg = "Radius is smaller than 0.3m, use: Eq2Dot21MenardStiffness"
raise ValueError(msg)

@property
def result(self) -> KN_M3:
"""Return the Menard stiffness k_h when r >= 0.3 m [kN/m3].

Returns
-------
KN_M3
The Menard stiffness k_h [kN/m3]
"""
if self.r >= self.r_0:
return 3 * self.e_p / (1.3 * self.r_0 * (2.65 * self.r / self.r_0) ** self.alpha + self.alpha * self.r)
msg = "Radius is smaller than 0.3m, use: Eq2Dot21MenardStiffness"
raise ValueError(msg)

def latex(self, n_decimals: int = 2) -> LatexFormula:
"""Latex representation of the full equation including result.

Parameters
----------
n_decimals: int
Number of decimals to round the result to

Returns
-------
LatexFormula
Latex representation of the equation

"""
n = n_decimals

return LatexFormula(
return_symbol="k_{h}",
equation=r"\frac{1}{3 \cdot E_{p}} \cdot "
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is the original equation, but the return symbol is k_h

the original 2.21 returns 1 / k_h

r"\left[1.3 \cdot R_{0} "
r"\left( 2.65 \frac{R}{R_0}\right)^\alpha"
r" + \alpha \cdot R \right]",
numeric_equation=rf"\frac{{1}}{{3 \cdot {self.e_p :.{n}}}} \cdot"
rf"\left[1.3 \cdot {self.r_0 :.{n}} "
rf"\left( 2.65 \cdot \frac{{{self.r :.{n}}}}{{{self.r_0 :.{n}}}}\right)^{{{self.alpha :.{n}f}}}"
rf"+ {self.alpha :.{n}} \cdot {self.r :.{n}}\right]",
result=f"{self.result :.{n_decimals}f}",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

n_decimals used instead of n. (doesn't change result)

unit="kN/m^3",
)
68 changes: 68 additions & 0 deletions blueprints/codes/cur/cur_228/formula_2_22.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
"""Contains formula 2.22 from CUR 228."""

from blueprints.codes.cur.cur_228 import CUR_228
from blueprints.codes.formula import Formula
from blueprints.codes.latex_formula import LatexFormula
from blueprints.type_alias import KN_M3, KPA, M


class Form2Dot22MenardStiffness(Formula):
"""Representation of equation 2.22 CUR 228."""

source_document = CUR_228
label = "2.22"

def __init__(self, r: M, e_p: KPA, alpha: float) -> None:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use dimensionless instead of float

Suggested change
from blueprints.type_alias import KN_M3, KPA, M
class Form2Dot22MenardStiffness(Formula):
"""Representation of equation 2.22 CUR 228."""
source_document = CUR_228
label = "2.22"
def __init__(self, r: M, e_p: KPA, alpha: float) -> None:
from blueprints.type_alias import KN_M3, KPA, M, DIMENSIONLESS
class Form2Dot22MenardStiffness(Formula):
"""Representation of equation 2.22 CUR 228."""
source_document = CUR_228
label = "2.22"
def __init__(self, r: M, e_p: KPA, alpha: DIMENSIONLESS) -> None:

"""Calculates the Menard stiffness (k_h) for r < 0.3 m.

Parameters
----------
r: M
The radius of a foundation pile [m]:
r >= 0.3 m
e_p: KPA
Elastic modulus of Ménard [kPa]:
e_p ≈ beta * q_c
beta: float
Dependent on soil type [-]:
q_c: KPA
Cone resistance [kPa]
alpha: float
Factor dependent on soil type [-]:
"""
super().__init__()
self.r = r
self.e_p = e_p
self.alpha = alpha

@staticmethod
def _evaluate(r: M, e_p: KPA, alpha: float) -> KN_M3:
"""Return the Menard stiffness k_h when r >= 0.3 m [kN/m3]."""
johan-tuls marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add checks for negative numbers

Suggested change
"""Return the Menard stiffness k_h when r >= 0.3 m [kN/m3]."""
"""Return the Menard stiffness k_h when r >= 0.3 m [kN/m3]."""
raise_if_negative(r=r, e_p=e_p, alpha=alpha)

if r < 0.3:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here 0.3 is hardcoded, but in 2.21 it's a static value. Maybe refer to the same constant in a constant file

return e_p / 2 / r / ((4 * 2.65**alpha + 3 * alpha) / 18)
msg = "Radius is equal to- or larger than 0.3m, use: Eq2Dot21MenardStiffness"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if using constant maybe change this to a f-string and then put the r_0 in there

raise ValueError(msg)

def latex(self, n_decimals: int = 2) -> LatexFormula:
"""Latex representation of the full equation including result.

Parameters
----------
n_decimals: int
Number of decimals to round the result to

Returns
-------
LatexFormula
Latex representation of the equation

"""
n = n_decimals
return LatexFormula(
return_symbol=r"k_{h}",
result=f"{self:.{n}f} kN/m3",
equation=r"\frac{2 \cdot R}{E_{p}} \cdot \frac{4 \cdot 2.65^{\alpha} + 3 \alpha}{18}",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is the original equation, but the return symbol is k_h

the original 2.22 returns 1 / k_h

numeric_equation=rf"\frac{{2 \cdot {self.r :.{n}f}}}{{{self.e_p :.{n}f}}} \cdot \frac{{4 \cdot 2.65^{{{self.alpha :.{n}f}}} + 3 \cdot "
rf"{self.alpha :.{n}f}}}{{18}}",
unit="kN/m^3",
)
1 change: 1 addition & 0 deletions blueprints/type_alias.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
# <editor-fold desc="COMPOUNDS">
N_M2 = float
KN_M2 = float
KN_M3 = float
# </editor-fold>

# <editor-fold desc="TIME">
Expand Down
12 changes: 12 additions & 0 deletions docs/source/codes/cur/cur_228/formulas.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
**CUR 228 - 2010
Design guideline for soil laterally loaded piles**

The table presents a list of formulas from the CUR 228 guideline, tracking their implementation status
( :x: or :heavy_check_mark: ) and any pertinent remarks. The 'Object Name' column references the corresponding Python entities inside of Blueprints.

Total of 2 formulas present.

| Formula number | Done | Remarks | Object name |
|:---------------|:------------------:|:--------|:--------------------------|
| 2.21 | :heavy_check_mark: | | Form2Dot21MenardStiffness |
| 2.22 | :heavy_check_mark: | | Form2Dot22MenardStiffness |
1 change: 1 addition & 0 deletions tests/codes/cur/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Tests for the CUR guidelines."""
1 change: 1 addition & 0 deletions tests/codes/cur/cur_228/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Tests for the CUR 228."""
42 changes: 42 additions & 0 deletions tests/codes/cur/cur_228/test_formula_2_21.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""Test for formula 2.21 from CUR 228."""

import pytest

from blueprints.codes.cur.cur_228.formula_2_21 import Form2Dot21MenardStiffness


class TestForm2Dot21MenardStiffness:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add test with invalid values for e_p

"""Validation for formula 2.21 from CUR 228."""

def test_evaluation(self) -> None:
"""Test the evaluation of the result."""
# Example values
r = 0.5 # m
e_p = 2.47 # kN/m²
alpha = 1 / 3 # -
form_2_21 = Form2Dot21MenardStiffness(r=r, e_p=e_p, alpha=alpha)

# Expected result, manually calculated
manually_calculated_result = 9.187357198

assert form_2_21 == pytest.approx(expected=manually_calculated_result, rel=1e-4)

def test_raise_error_when_r_is_lower_then_0_3(self) -> None:
"""Tests if an ValueError is raised when r < 0.3."""
# Example values
r = 0.2 # m
e_p = 2.47 # kN/m²
alpha = 1 / 3 # -

with pytest.raises(ValueError):
Form2Dot21MenardStiffness(r=r, e_p=e_p, alpha=alpha)

def test_latex_method(self) -> None:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this doesn't check correctness

"""Test the latex method."""
r = 0.5 # m
e_p = 2.47 # kN/m²
alpha = 1 / 3 # -
form_2_21 = Form2Dot21MenardStiffness(r=r, e_p=e_p, alpha=alpha)

# Test the full LaTeX representation
assert isinstance(form_2_21.latex(2).complete, str)
42 changes: 42 additions & 0 deletions tests/codes/cur/cur_228/test_formula_2_22.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""Test for formula 2.22 from CUR 228."""

import pytest

from blueprints.codes.cur.cur_228.formula_2_22 import Form2Dot22MenardStiffness


class TestForm2Dot22MenardStiffness:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would probably add some tests for the raise if negative checks. To make sure it's captured

"""Validation for formula 2.22 from CUR 228."""

def test_evaluation(self) -> None:
"""Test the evaluation of the result."""
# Example values
r = 0.2 # m
e_p = 2.47 # kN/m²
alpha = 1 / 3 # -
form_2_22 = Form2Dot22MenardStiffness(r=r, e_p=e_p, alpha=alpha)

# Expected result, manually calculated
manually_calculated_result = 17.00760939

assert form_2_22 == pytest.approx(expected=manually_calculated_result, rel=1e-4)

def test_raise_error_when_r_is_higher_then_0_3(self) -> None:
"""Tests if an ValueError is raised when r > 0.3."""
# Example values
r = 0.5 # m
e_p = 2.47 # kN/m²
alpha = 1 / 3 # -

with pytest.raises(ValueError):
Form2Dot22MenardStiffness(r=r, e_p=e_p, alpha=alpha)

def test_latex_method(self) -> None:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this doesn't check correctness

"""Test the latex method."""
r = 0.2 # m
e_p = 2.47 # kN/m²
alpha = 1 / 3 # -
form_2_22 = Form2Dot22MenardStiffness(r=r, e_p=e_p, alpha=alpha)

# Test the full LaTeX representation
assert isinstance(form_2_22.latex(2).complete, str)
Loading