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
79 changes: 50 additions & 29 deletions src/py_sofistik_utils/cdb_reader/_internals/spring_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,18 @@ class _SpringResult:
* ``LOAD_CASE`` load case number
* ``GROUP`` element group
* ``ELEM_ID`` element number
* ``FORCE`` axial force
* ``TRANSVERSAL_FORCE``: transversal force
* ``MOMENT``: axial moment
* ``DISPLACEMENT``: axial displacement
* ``TRANSVERSAL_DISPLACEMENT``: transversal displacement
* ``ROTATION``: axial rotation
* ``P`` axial force
* ``PT``: transversal force
* ``PTX``: force in global X-direction
* ``PTY``: force in global Y-direction
* ``PTZ``: force in global Z-direction
* ``M``: axial moment
* ``V``: axial displacement
* ``VT``: transversal displacement
* ``VTX``: displacement in global X-direction
* ``VTY``: displacement in global Y-direction
* ``VTZ``: displacement in global Z-direction
* ``PHI``: axial rotation

The ``DataFrame`` uses a MultiIndex with levels ``ELEM_ID`` and
``LOAD_CASE`` (in this specific order) to enable fast lookups via the
Expand All @@ -39,9 +45,6 @@ class _SpringResult:
Not all available quantities are retrieved and stored. In
particular:

* the three components along the global X, Y and Z axes for:
- spring force
- spring displacement
* nonlinear effects
* all quantities available if a workload has beed defined

Expand All @@ -54,12 +57,18 @@ def __init__(self, dll: SofDll) -> None:
"LOAD_CASE",
"GROUP",
"ELEM_ID",
"FORCE",
"TRANSVERSAL_FORCE",
"MOMENT",
"DISPLACEMENT",
"TRANSVERSAL_DISPLACEMENT",
"ROTATION"
"P",
"PT",
"PTX",
"PTY",
"PTZ",
"M",
"V",
"VT",
"VTX",
"VTY",
"VTZ",
"PHI"
]
)
self._dll = dll
Expand Down Expand Up @@ -101,7 +110,7 @@ def get(
self,
element_id: int,
load_case: int,
quantity: str = "FORCE",
quantity: str,
default: float | None = None
) -> float:
"""Retrieve the requested cable result.
Expand All @@ -112,15 +121,21 @@ def get(
Cable element number
load_case : int
Load case number
quantity : str, default "FORCE"
quantity : str
Quantity to retrieve. Must be one of:

- ``FORCE``
- ``TRANSVERSAL_FORCE``
- ``MOMENT``
- ``DISPLACEMENT``
- ``TRANSVERSAL_DISPLACEMENT``
- ``ROTATION``
- ``P``
- ``PT``
- ``PTX``
- ``PTY``
- ``PTZ``
- ``M``
- ``V``
- ``VT``
- ``VTX``
- ``VTY``
- ``VTZ``
- ``PHI``

default : float or None, default None
Value to return if the requested quantity is not found
Expand Down Expand Up @@ -235,12 +250,18 @@ def _load(self, load_case: int) -> list[dict[str, float | int | str]]:
"LOAD_CASE": load_case,
"GROUP": 0,
"ELEM_ID": spri_res.m_nr,
"FORCE": spri_res.m_p,
"TRANSVERSAL_FORCE": spri_res.m_pt,
"MOMENT": spri_res.m_m,
"DISPLACEMENT": spri_res.m_v,
"TRANSVERSAL_DISPLACEMENT": spri_res.m_vt,
"ROTATION": spri_res.m_phi
"P": spri_res.m_p,
"PT": spri_res.m_pt,
"PTX": spri_res.m_ptx,
"PTY": spri_res.m_pty,
"PTZ": spri_res.m_ptz,
"M": spri_res.m_m,
"V": spri_res.m_v,
"VT": spri_res.m_vt,
"VTX": spri_res.m_vtx,
"VTY": spri_res.m_vty,
"VTZ": spri_res.m_vtz,
"PHI": spri_res.m_phi
}
)

Expand Down
76 changes: 53 additions & 23 deletions tests/cdb_reader/test_spring_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,50 @@
"LOAD_CASE",
"GROUP",
"ELEM_ID",
"FORCE",
"TRANSVERSAL_FORCE",
"MOMENT",
"DISPLACEMENT",
"TRANSVERSAL_DISPLACEMENT",
"ROTATION",
"P",
"PT",
"PTX",
"PTY",
"PTZ",
"M",
"V",
"VT",
"VTX",
"VTY",
"VTZ",
"PHI",
]

_DATA = [
(1000, 10, 102, 9.0, 0.0, 1.0000000031710769e-29, 0.09000000357627869, 0.07000000029802322, 0.0),
(1000, 11, 113, 1.0000000031710769e-29, 1.4142135381698608, 1.0000000031710769e-29, 0.11313708126544952, 0.01414213515818119, 0.0),
[
1000, 10, 102,
9.0,
0.0,
0.0,
0.0,
0.0,
1.0000000031710769e-29,
0.09000000357627869,
0.07000000029802322,
-0.07000000029802322,
0.0,
0.0,
0.0,
],
[
1000, 11, 113,
1.0000000031710769e-29,
1.4142135381698608,
-1.0,
-1.0,
0.0,
1.0000000031710769e-29,
0.11313708126544952,
0.01414213515818119,
-0.009999999776482582,
-0.009999999776482582,
0.0,
0.0,
],
]


Expand Down Expand Up @@ -68,35 +101,32 @@ def test_data(self) -> None:

def test_get(self) -> None:
with self.subTest(msg="Axial force"):
self.assertEqual(self.cdb.spring.result.get(102, 1000, "FORCE"), 9)
self.assertEqual(self.cdb.spring.result.get(102, 1000, "P"), 9)

with self.subTest(msg="Transversal force"):
self.assertEqual(
self.cdb.spring.result.get(102, 1000, "TRANSVERSAL_FORCE"),
0
)
self.assertEqual(self.cdb.spring.result.get(102, 1000, "PT"), 0)

with self.subTest(msg="Moment"):
self.assertEqual(
self.cdb.spring.result.get(113, 1000, "MOMENT"),
self.cdb.spring.result.get(113, 1000, "M"),
1.0000000031710769e-29
)

with self.subTest(msg="Displacement"):
self.assertEqual(
self.cdb.spring.result.get(102, 1000, "DISPLACEMENT"),
self.cdb.spring.result.get(102, 1000, "V"),
0.09000000357627869
)

with self.subTest(msg="Transversal displacement"):
self.assertEqual(
self.cdb.spring.result.get(102, 1000, "TRANSVERSAL_DISPLACEMENT"),
self.cdb.spring.result.get(102, 1000, "VT"),
0.07000000029802322
)

with self.subTest(msg="Rotation"):
self.assertEqual(
self.cdb.spring.result.get(113, 1000, "ROTATION"),
self.cdb.spring.result.get(113, 1000, "PHI"),
0
)

Expand All @@ -114,32 +144,32 @@ def test_get_after_clear(self) -> None:
self.cdb.spring.result.clear(1000)
with self.subTest(msg="Check clear method"):
with self.assertRaises(LookupError):
self.cdb.spring.result.get(113, 1000, "MOMENT")
self.cdb.spring.result.get(113, 1000, "M")

self.cdb.spring.result.load(1000)
with self.subTest(msg="Check indexes management"):
self.assertEqual(
self.cdb.spring.result.get(113, 1000, "MOMENT"),
self.cdb.spring.result.get(113, 1000, "M"),
1.0000000031710769e-29
)

def test_get_after_clear_all(self) -> None:
self.cdb.spring.result.clear_all()
with self.subTest(msg="Check clear_all method"):
with self.assertRaises(LookupError):
self.cdb.spring.result.get(113, 1000, "MOMENT")
self.cdb.spring.result.get(113, 1000, "M")

self.cdb.spring.result.load(1000)
with self.subTest(msg="Check indexes management"):
self.assertEqual(
self.cdb.spring.result.get(113, 1000, "MOMENT"),
self.cdb.spring.result.get(113, 1000, "M"),
1.0000000031710769e-29
)

def test_load_with_duplicated_load_cases(self) -> None:
self.cdb.spring.result.clear_all()
self.cdb.spring.result.load([1000] + [1000])
self.assertEqual(
self.cdb.spring.result.get(113, 1000, "MOMENT"),
self.cdb.spring.result.get(113, 1000, "M"),
1.0000000031710769e-29
)
Loading