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..8bd8c8ed68 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 diff --git a/model/testing/src/icon4py/model/testing/serialbox.py b/model/testing/src/icon4py/model/testing/serialbox.py index f7cb57d2b2..7804d5b9e5 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_cart_x", dims.VertexDim) + + def verts_vertex_cart_y(self): + """vertex cartesian y coordinate""" + 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_cart_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_cart_x", dims.EdgeDim) + + def edges_center_cart_y(self): + """edge center cartesian y coordinate""" + 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_cart_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_cart_x", dims.CellDim) + + def cell_center_cart_y(self): + """cell center cartesian y coordinate""" + 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_cart_z", dims.CellDim) + def edge_center_lat(self): return self._get_field("edges_center_lat", dims.EdgeDim)