From d0649d936c6edbdcaecbbc19daedd06c0ffb5469 Mon Sep 17 00:00:00 2001 From: Dennis Yatunin Date: Wed, 19 Feb 2025 11:23:17 -0800 Subject: [PATCH] Fix bug in DSS of level Fields (#2193) --- NEWS.md | 3 +++ src/Grids/extruded.jl | 5 +++-- src/Grids/level.jl | 8 ++++---- test/Spaces/unit_dss.jl | 5 ++++- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/NEWS.md b/NEWS.md index 271d41d792..d2cfc92f51 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,9 @@ ClimaCore.jl Release Notes main ------- + - Fixed bug in DSS for level fields. PR [2194](https://github.com/CliMA/ClimaCore.jl/pull/2194). + Closed [2193](https://github.com/CliMA/ClimaCore.jl/issues/2193). + v0.14.25 ------- diff --git a/src/Grids/extruded.jl b/src/Grids/extruded.jl index 6c583cad47..7c8baa50c8 100644 --- a/src/Grids/extruded.jl +++ b/src/Grids/extruded.jl @@ -131,8 +131,9 @@ vertical_topology(grid::ExtrudedFiniteDifferenceGrid) = # Since ∂z/∂ξ₃ and r are continuous across element boundaries, we can reuse # the horizontal weights instead of calling compute_dss_weights on the -# extruded local geometry. -dss_weights(grid::AbstractExtrudedFiniteDifferenceGrid, ::Staggering) = +# extruded local geometry. If we ever need to use extruded weights, this method +# will need to distinguish between weights on centers and weights on faces. +dss_weights(grid::AbstractExtrudedFiniteDifferenceGrid, _) = dss_weights(grid.horizontal_grid, nothing) local_geometry_data(grid::AbstractExtrudedFiniteDifferenceGrid, ::CellCenter) = diff --git a/src/Grids/level.jl b/src/Grids/level.jl index bb18b0d0ea..6f84e4a6b2 100644 --- a/src/Grids/level.jl +++ b/src/Grids/level.jl @@ -16,10 +16,10 @@ level( topology(levelgrid::LevelGrid) = topology(levelgrid.full_grid) -dss_weights(levelgrid::LevelGrid{<:Any, Int}, ::Nothing) = - level(dss_weights(levelgrid.full_grid, CellCenter()), levelgrid.level) -dss_weights(levelgrid::LevelGrid{<:Any, PlusHalf{Int}}, ::Nothing) = - level(dss_weights(levelgrid.full_grid, CellFace()), levelgrid.level + half) +# The DSS weights for extruded spaces are currently the same as the weights for +# horizontal spaces. If we ever need to use extruded weights, this method will +# need to extract the weights at a particular level. +dss_weights(levelgrid::LevelGrid, _) = dss_weights(levelgrid.full_grid, nothing) local_geometry_type(::Type{LevelGrid{G, L}}) where {G, L} = local_geometry_type(G) diff --git a/test/Spaces/unit_dss.jl b/test/Spaces/unit_dss.jl index bdf6f8e4e4..c079433776 100644 --- a/test/Spaces/unit_dss.jl +++ b/test/Spaces/unit_dss.jl @@ -138,7 +138,10 @@ end space_kwargs = (; context, topography, deep, autodiff_metric) center_space = TU.CenterExtrudedFiniteDifferenceSpace(FT; space_kwargs...) - for space in (center_space, Spaces.face_space(center_space)) + face_space = Spaces.face_space(center_space) + level_space1 = Spaces.level(center_space, 2) + level_space2 = Spaces.level(face_space, 1 + Spaces.half) + for space in (center_space, face_space, level_space1, level_space2) test_dss_conservation(space) end end