From 46f7b43aee69b8ccf27cdb97366c99af5d5d2412 Mon Sep 17 00:00:00 2001 From: Jacopo Date: Thu, 22 Jan 2026 18:43:25 +0100 Subject: [PATCH 1/5] add cartesian coordinates to serialbox --- .../src/icon4py/model/testing/serialbox.py | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/model/testing/src/icon4py/model/testing/serialbox.py b/model/testing/src/icon4py/model/testing/serialbox.py index f7cb57d2b2..ac4916512e 100644 --- a/model/testing/src/icon4py/model/testing/serialbox.py +++ b/model/testing/src/icon4py/model/testing/serialbox.py @@ -163,6 +163,18 @@ def verts_vertex_lon(self): """vertex longitude""" return self._get_field("verts_vertex_lon", dims.VertexDim) + def verts_vertex_cart_x(self): + """vertex cartesian x coordinate""" + return self._get_field("verts_vertex_cartesian_x", dims.VertexDim) + + def verts_vertex_cart_y(self): + """vertex cartesian y coordinate""" + return self._get_field("verts_vertex_cartesian_y", dims.VertexDim) + + def verts_vertex_cart_z(self): + """vertex cartesian z coordinate""" + return self._get_field("verts_vertex_cartesian_z", dims.VertexDim) + def primal_normal_v1(self): return self._get_field("primal_normal_v1", dims.EdgeDim) @@ -183,6 +195,18 @@ def edges_center_lon(self): """edge center longitude""" return self._get_field("edges_center_lon", dims.EdgeDim) + def edges_center_cart_x(self): + """edge center cartesian x coordinate""" + return self._get_field("edges_center_cartesian_x", dims.EdgeDim) + + def edges_center_cart_y(self): + """edge center cartesian y coordinate""" + return self._get_field("edges_center_cartesian_y", dims.EdgeDim) + + def edges_center_cart_z(self): + """edge center cartesian z coordinate""" + return self._get_field("edges_center_cartesian_z", dims.EdgeDim) + def edge_vert_length(self): """length of edge midpoint to vertex""" return self._get_field("edge_vert_length", dims.EdgeDim, dims.E2C2VDim) @@ -294,6 +318,18 @@ def cell_center_lat(self): def cell_center_lon(self): return self._get_field("cell_center_lon", dims.CellDim) + def cell_center_cart_x(self): + """cell center cartesian x coordinate""" + return self._get_field("cell_center_cartesian_x", dims.CellDim) + + def cell_center_cart_y(self): + """cell center cartesian y coordinate""" + return self._get_field("cell_center_cartesian_y", dims.CellDim) + + def cell_center_cart_z(self): + """cell center cartesian z coordinate""" + return self._get_field("cell_center_cartesian_z", dims.CellDim) + def edge_center_lat(self): return self._get_field("edges_center_lat", dims.EdgeDim) From c0210673ee99deeb9922e02eb58f49070fd11364 Mon Sep 17 00:00:00 2001 From: Jacopo Date: Thu, 22 Jan 2026 18:43:33 +0100 Subject: [PATCH 2/5] add cartesian coordinates to tests --- .../common/grid/unit_tests/test_geometry.py | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/model/common/tests/common/grid/unit_tests/test_geometry.py b/model/common/tests/common/grid/unit_tests/test_geometry.py index 1f306f3e86..79b9cbb3da 100644 --- a/model/common/tests/common/grid/unit_tests/test_geometry.py +++ b/model/common/tests/common/grid/unit_tests/test_geometry.py @@ -319,17 +319,28 @@ def test_dual_normal_vert( @pytest.mark.datatest def test_cartesian_centers_edge( - backend: gtx_typing.Backend, experiment: definitions.Experiment + backend: gtx_typing.Backend, + grid_savepoint: sb.IconGridSavepoint, + experiment: definitions.Experiment, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) grid = grid_geometry.grid x = grid_geometry.get(attrs.EDGE_CENTER_X) y = grid_geometry.get(attrs.EDGE_CENTER_Y) z = grid_geometry.get(attrs.EDGE_CENTER_Z) + + ser_x = grid_savepoint.edges_center_cart_x() + ser_y = grid_savepoint.edges_center_cart_y() + ser_z = grid_savepoint.edges_center_cart_z() + assert x.ndarray.shape == (grid.num_edges,) assert y.ndarray.shape == (grid.num_edges,) assert z.ndarray.shape == (grid.num_edges,) + assert test_utils.dallclose(x.asnumpy(), ser_x.asnumpy(), atol=1e-15) + assert test_utils.dallclose(y.asnumpy(), ser_y.asnumpy(), atol=1e-15) + assert test_utils.dallclose(z.asnumpy(), ser_z.asnumpy(), atol=1e-15) + match grid.geometry_type: case base.GeometryType.ICOSAHEDRON: # those are coordinates on the unit sphere: hence norm should be 1 @@ -347,17 +358,28 @@ def test_cartesian_centers_edge( @pytest.mark.datatest def test_cartesian_centers_cell( - backend: gtx_typing.Backend, experiment: definitions.Experiment + backend: gtx_typing.Backend, + grid_savepoint: sb.IconGridSavepoint, + experiment: definitions.Experiment ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) grid = grid_geometry.grid x = grid_geometry.get(attrs.CELL_CENTER_X) y = grid_geometry.get(attrs.CELL_CENTER_Y) z = grid_geometry.get(attrs.CELL_CENTER_Z) + + ser_x = grid_savepoint.cell_center_cart_x() + ser_y = grid_savepoint.cell_center_cart_y() + ser_z = grid_savepoint.cell_center_cart_z() + assert x.ndarray.shape == (grid.num_cells,) assert y.ndarray.shape == (grid.num_cells,) assert z.ndarray.shape == (grid.num_cells,) + assert test_utils.dallclose(x.asnumpy(), ser_x.asnumpy(), atol=1e-15) + assert test_utils.dallclose(y.asnumpy(), ser_y.asnumpy(), atol=1e-15) + assert test_utils.dallclose(z.asnumpy(), ser_z.asnumpy(), atol=1e-15) + match grid.geometry_type: case base.GeometryType.ICOSAHEDRON: # those are coordinates on the unit sphere: hence norm should be 1 @@ -374,16 +396,29 @@ def test_cartesian_centers_cell( @pytest.mark.datatest -def test_vertex(backend: gtx_typing.Backend, experiment: definitions.Experiment) -> None: +def test_vertex( + backend: gtx_typing.Backend, + grid_savepoint: sb.IconGridSavepoint, + experiment: definitions.Experiment +) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) grid = grid_geometry.grid x = grid_geometry.get(attrs.VERTEX_X) y = grid_geometry.get(attrs.VERTEX_Y) z = grid_geometry.get(attrs.VERTEX_Z) + + ser_x = grid_savepoint.verts_vertex_cart_x() + ser_y = grid_savepoint.verts_vertex_cart_y() + ser_z = grid_savepoint.verts_vertex_cart_z() + assert x.ndarray.shape == (grid.num_vertices,) assert y.ndarray.shape == (grid.num_vertices,) assert z.ndarray.shape == (grid.num_vertices,) + assert test_utils.dallclose(x.asnumpy(), ser_x.asnumpy(), atol=1e-15) + assert test_utils.dallclose(y.asnumpy(), ser_y.asnumpy(), atol=1e-15) + assert test_utils.dallclose(z.asnumpy(), ser_z.asnumpy(), atol=1e-15) + match grid.geometry_type: case base.GeometryType.ICOSAHEDRON: # those are coordinates on the unit sphere: hence norm should be 1 From 7b46f6711dabec35559044579322422e631b9e01 Mon Sep 17 00:00:00 2001 From: Jacopo Date: Thu, 22 Jan 2026 18:53:20 +0100 Subject: [PATCH 3/5] pre-commit --- model/common/tests/common/grid/unit_tests/test_geometry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/common/tests/common/grid/unit_tests/test_geometry.py b/model/common/tests/common/grid/unit_tests/test_geometry.py index 79b9cbb3da..8bd8c8ed68 100644 --- a/model/common/tests/common/grid/unit_tests/test_geometry.py +++ b/model/common/tests/common/grid/unit_tests/test_geometry.py @@ -360,7 +360,7 @@ def test_cartesian_centers_edge( def test_cartesian_centers_cell( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment + experiment: definitions.Experiment, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) grid = grid_geometry.grid @@ -399,7 +399,7 @@ def test_cartesian_centers_cell( def test_vertex( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment + experiment: definitions.Experiment, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) grid = grid_geometry.grid From 2b1b0d4706d283dcb03a11b3c763e014d2a43c55 Mon Sep 17 00:00:00 2001 From: Jacopo Date: Fri, 23 Jan 2026 10:53:53 +0100 Subject: [PATCH 4/5] update serialized data names --- .../src/icon4py/model/testing/serialbox.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/model/testing/src/icon4py/model/testing/serialbox.py b/model/testing/src/icon4py/model/testing/serialbox.py index ac4916512e..7804d5b9e5 100644 --- a/model/testing/src/icon4py/model/testing/serialbox.py +++ b/model/testing/src/icon4py/model/testing/serialbox.py @@ -165,15 +165,15 @@ def verts_vertex_lon(self): def verts_vertex_cart_x(self): """vertex cartesian x coordinate""" - return self._get_field("verts_vertex_cartesian_x", dims.VertexDim) + return self._get_field("verts_vertex_cart_x", dims.VertexDim) def verts_vertex_cart_y(self): """vertex cartesian y coordinate""" - return self._get_field("verts_vertex_cartesian_y", dims.VertexDim) + return self._get_field("verts_vertex_cart_y", dims.VertexDim) def verts_vertex_cart_z(self): """vertex cartesian z coordinate""" - return self._get_field("verts_vertex_cartesian_z", dims.VertexDim) + return self._get_field("verts_vertex_cart_z", dims.VertexDim) def primal_normal_v1(self): return self._get_field("primal_normal_v1", dims.EdgeDim) @@ -197,15 +197,15 @@ def edges_center_lon(self): def edges_center_cart_x(self): """edge center cartesian x coordinate""" - return self._get_field("edges_center_cartesian_x", dims.EdgeDim) + return self._get_field("edges_center_cart_x", dims.EdgeDim) def edges_center_cart_y(self): """edge center cartesian y coordinate""" - return self._get_field("edges_center_cartesian_y", dims.EdgeDim) + return self._get_field("edges_center_cart_y", dims.EdgeDim) def edges_center_cart_z(self): """edge center cartesian z coordinate""" - return self._get_field("edges_center_cartesian_z", dims.EdgeDim) + return self._get_field("edges_center_cart_z", dims.EdgeDim) def edge_vert_length(self): """length of edge midpoint to vertex""" @@ -320,15 +320,15 @@ def cell_center_lon(self): def cell_center_cart_x(self): """cell center cartesian x coordinate""" - return self._get_field("cell_center_cartesian_x", dims.CellDim) + return self._get_field("cell_center_cart_x", dims.CellDim) def cell_center_cart_y(self): """cell center cartesian y coordinate""" - return self._get_field("cell_center_cartesian_y", dims.CellDim) + return self._get_field("cell_center_cart_y", dims.CellDim) def cell_center_cart_z(self): """cell center cartesian z coordinate""" - return self._get_field("cell_center_cartesian_z", dims.CellDim) + return self._get_field("cell_center_cart_z", dims.CellDim) def edge_center_lat(self): return self._get_field("edges_center_lat", dims.EdgeDim) From 7412e8aad282be68f37d128f06a4b64006f77b38 Mon Sep 17 00:00:00 2001 From: Mikael Simberg Date: Wed, 28 Jan 2026 14:59:22 +0100 Subject: [PATCH 5/5] Enable gauss3d experiment for distributed tests --- model/testing/src/icon4py/model/testing/fixtures/datatest.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/model/testing/src/icon4py/model/testing/fixtures/datatest.py b/model/testing/src/icon4py/model/testing/fixtures/datatest.py index 28483172a1..3058fc7210 100644 --- a/model/testing/src/icon4py/model/testing/fixtures/datatest.py +++ b/model/testing/src/icon4py/model/testing/fixtures/datatest.py @@ -164,10 +164,6 @@ def download_ser_data( if "not datatest" in request.config.getoption("-k", ""): return - with_mpi = request.config.getoption("with_mpi", False) - if with_mpi and experiment == definitions.Experiments.GAUSS3D: - # TODO(msimberg): Fix? Need serialized data. - pytest.skip("GAUSS3D experiment does not support MPI tests") _download_ser_data(processor_props.comm_size, ranked_data_path, experiment)