Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
41 changes: 38 additions & 3 deletions model/common/tests/common/grid/unit_tests/test_geometry.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
36 changes: 36 additions & 0 deletions model/testing/src/icon4py/model/testing/serialbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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)
Expand Down Expand Up @@ -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)

Expand Down