From 27ac1b906e9177795b7d9d58e8a8b407d91c86a3 Mon Sep 17 00:00:00 2001 From: Henrik Andersson Date: Tue, 14 May 2024 09:48:34 +0200 Subject: [PATCH 1/3] Selecting a layer ignores vertical coordinates --- tests/test_geometry_fm.py | 42 ++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/tests/test_geometry_fm.py b/tests/test_geometry_fm.py index ec1bec0e0..0b58fde48 100644 --- a/tests/test_geometry_fm.py +++ b/tests/test_geometry_fm.py @@ -6,20 +6,18 @@ @pytest.fixture def simple_3d_geom(): - # x y z - nc = [ - (0.0, 0.0, 0.0), - (1.0, 0.0, 0.0), - (1.0, 1.0, 0.0), - (0.0, 0.0, -1.0), - (1.0, 0.0, -1.0), - (1.0, 1.0, -1.0), - (0.0, 0.0, -2.0), - (1.0, 0.0, -2.0), - (1.0, 1.0, -2.0), - ] - el = [(0, 1, 2, 3, 4, 5), (3, 4, 5, 6, 7, 8)] + nc_2d = [(0.0, 0.0), (1.0, 0.0), (1.0, 1.0)] + # bottom first approach + z = [-2.0, -1.0, 0.0] + + nc = [] + + for col in nc_2d: + for depth in z: + nc.append((col[0], col[1], depth)) + + el = [(3, 4, 5, 6, 7, 8), (0, 1, 2, 3, 4, 5)] g = GeometryFM3D( node_coordinates=nc, @@ -183,7 +181,7 @@ def test_plot_mesh(): g.plot.mesh() -def test_layered(simple_3d_geom: GeometryFM3D): +def test_layered(simple_3d_geom: GeometryFM3D) -> None: g = simple_3d_geom @@ -203,3 +201,19 @@ def test_layered(simple_3d_geom: GeometryFM3D): assert "elements: 2" in repr(g2) assert "layers: 2" in repr(g2) + + +def test_select_single_layer_preserved_vertical_coordinates( + simple_3d_geom: GeometryFM3D, +) -> None: + g = simple_3d_geom + + bot_el = g.bottom_elements + gb = g.elements_to_geometry(bot_el, keepdims=True) + assert gb.node_coordinates[0][2] == -2.0 + + top_el = g.top_elements + + gt = g.elements_to_geometry(top_el, keepdims=True) + assert gt.n_elements == 1 + assert gt.node_coordinates[0][2] == 0.0 From 5f5941d47cacaf454a8082251115fb426d5e2daa Mon Sep 17 00:00:00 2001 From: Henrik Andersson Date: Tue, 14 May 2024 13:10:08 +0200 Subject: [PATCH 2/3] Remove special case --- mikeio/spatial/_FM_geometry_layered.py | 26 ++++++++------------------ tests/test_geometry_fm.py | 8 ++++++-- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/mikeio/spatial/_FM_geometry_layered.py b/mikeio/spatial/_FM_geometry_layered.py index 79b3543f4..b22864d52 100644 --- a/mikeio/spatial/_FM_geometry_layered.py +++ b/mikeio/spatial/_FM_geometry_layered.py @@ -117,22 +117,12 @@ def elements_to_geometry( if n_layers == 1 and node_layers == "all": node_layers = "bottom" - # extract information for selected elements - if n_layers == 1: - elem2d = self.elem2d_ids[sorted_elements] - geom2d = self.geometry2d - node_ids, elem_tbl = geom2d._get_nodes_and_table_for_elements(elem2d) - assert len(elem_tbl[0]) <= 4, "Not a 2D element" - node_coords = geom2d.node_coordinates[node_ids] - codes = geom2d.codes[node_ids] - elem_ids = self._element_ids[elem2d] - else: - node_ids, elem_tbl = self._get_nodes_and_table_for_elements( - sorted_elements, node_layers=node_layers - ) - node_coords = self.node_coordinates[node_ids] - codes = self.codes[node_ids] - elem_ids = self._element_ids[sorted_elements] + node_ids, elem_tbl = self._get_nodes_and_table_for_elements( + sorted_elements, node_layers=node_layers + ) + node_coords = self.node_coordinates[node_ids] + codes = self.codes[node_ids] + elem_ids = self._element_ids[sorted_elements] if new_type == DfsuFileType.Dfsu2D: return GeometryFM2D( @@ -223,7 +213,7 @@ def _get_nodes_and_table_for_elements( nodes = np.unique(np.hstack(elem_tbl)) # type: ignore return nodes, elem_tbl - def to_2d_geometry(self) -> GeometryFM2D: + def to_2d_geometry(self, layer="bottom") -> GeometryFM2D: """extract 2d geometry from 3d geometry Returns @@ -238,7 +228,7 @@ def to_2d_geometry(self) -> GeometryFM2D: elem_ids = self.top_elements node_ids, elem_tbl = self._get_nodes_and_table_for_elements( - elem_ids, node_layers="bottom" + elem_ids, node_layers=layer ) node_coords = self.node_coordinates[node_ids] codes = self._codes[node_ids] diff --git a/tests/test_geometry_fm.py b/tests/test_geometry_fm.py index 0b58fde48..54e910341 100644 --- a/tests/test_geometry_fm.py +++ b/tests/test_geometry_fm.py @@ -17,7 +17,9 @@ def simple_3d_geom(): for depth in z: nc.append((col[0], col[1], depth)) - el = [(3, 4, 5, 6, 7, 8), (0, 1, 2, 3, 4, 5)] + # TODO constructing a 3d mesh following the convention needs a helper function + # Arbitrary 3d element tables doesn't work + el = [(0, 3, 6, 1, 4, 7), (1, 4, 7, 2, 5, 8)] g = GeometryFM3D( node_coordinates=nc, @@ -210,10 +212,12 @@ def test_select_single_layer_preserved_vertical_coordinates( bot_el = g.bottom_elements gb = g.elements_to_geometry(bot_el, keepdims=True) + assert isinstance(gb, GeometryFM2D) assert gb.node_coordinates[0][2] == -2.0 top_el = g.top_elements gt = g.elements_to_geometry(top_el, keepdims=True) + assert isinstance(gt, GeometryFM2D) assert gt.n_elements == 1 - assert gt.node_coordinates[0][2] == 0.0 + assert gt.node_coordinates[0][2] == -1.0 From 0f9be5a00989555ed0af6728818cbe0b2a627e06 Mon Sep 17 00:00:00 2001 From: Henrik Andersson Date: Wed, 15 May 2024 07:46:56 +0200 Subject: [PATCH 3/3] Revert --- mikeio/spatial/_FM_geometry_layered.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mikeio/spatial/_FM_geometry_layered.py b/mikeio/spatial/_FM_geometry_layered.py index b22864d52..a50889762 100644 --- a/mikeio/spatial/_FM_geometry_layered.py +++ b/mikeio/spatial/_FM_geometry_layered.py @@ -213,7 +213,7 @@ def _get_nodes_and_table_for_elements( nodes = np.unique(np.hstack(elem_tbl)) # type: ignore return nodes, elem_tbl - def to_2d_geometry(self, layer="bottom") -> GeometryFM2D: + def to_2d_geometry(self) -> GeometryFM2D: """extract 2d geometry from 3d geometry Returns @@ -228,7 +228,7 @@ def to_2d_geometry(self, layer="bottom") -> GeometryFM2D: elem_ids = self.top_elements node_ids, elem_tbl = self._get_nodes_and_table_for_elements( - elem_ids, node_layers=layer + elem_ids, node_layers="bottom" ) node_coords = self.node_coordinates[node_ids] codes = self._codes[node_ids] @@ -246,6 +246,7 @@ def to_2d_geometry(self, layer="bottom") -> GeometryFM2D: reindex=True, ) + # TODO move this to before creating the geometry # Fix z-coordinate for sigma-z: if self._type == DfsuFileType.Dfsu3DSigmaZ: zn = geom.node_coordinates[:, 2].copy()