Skip to content

Commit 410eaf9

Browse files
committed
Add tests for level function on Fields
Also add `issubspace` for `FiniteDifferenceSpaces` The test currently fails because an error is not thrown for face spaces when out of bounds indexing.
1 parent d91a0be commit 410eaf9

3 files changed

Lines changed: 48 additions & 0 deletions

File tree

src/Spaces/Spaces.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import ..Grids:
4343
quadrature_style
4444

4545
import ClimaComms
46+
import UnrolledUtilities: unrolled_any
4647
using StaticArrays, ForwardDiff, LinearAlgebra, Adapt
4748

4849
"""

src/Spaces/finitedifference.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,10 @@ Base.@propagate_inbounds function level(
145145
local_geometry = level(local_geometry_data(space), v)
146146
PointSpace(ClimaComms.context(space), local_geometry)
147147
end
148+
function issubspace(subspace::PointSpace, space::FiniteDifferenceSpace)
149+
all_local_geometry = local_geometry_data(space)
150+
unrolled_any(
151+
v -> subspace.local_geometry === level(all_local_geometry, v),
152+
1:nlevels(space),
153+
)
154+
end

test/Fields/unit_field.jl

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,46 @@ end
11961196
bf_new = @. bf # test copy()
11971197
end
11981198

1199+
@testset "Level function on fields" begin
1200+
FT = Float32
1201+
extruded_center_space = ExtrudedCubedSphereSpace(
1202+
FT;
1203+
z_elem = 10,
1204+
z_min = 0,
1205+
z_max = 1,
1206+
radius = 10,
1207+
h_elem = 10,
1208+
n_quad_points = 4,
1209+
staggering = Grids.CellCenter(),
1210+
)
1211+
fd_center_space = ColumnSpace(
1212+
FT;
1213+
z_elem = 10,
1214+
z_min = 0,
1215+
z_max = 10,
1216+
staggering = CellCenter(),
1217+
)
1218+
for center_space in (extruded_center_space, fd_center_space)
1219+
face_space = Spaces.face_space(center_space)
1220+
center_field = fill(FT(1), center_space)
1221+
face_field = fill(FT(2), face_space)
1222+
for i in 1:10
1223+
center_face_level = Fields.level(center_field, i)
1224+
face_level = Fields.level(face_field, PlusHalf(i))
1225+
@test axes(center_face_level) == Spaces.level(center_space, i)
1226+
@test Spaces.issubspace(axes(center_face_level), center_space)
1227+
@test axes(face_level) == Spaces.level(face_space, PlusHalf(i))
1228+
@test Spaces.issubspace(axes(face_level), face_space)
1229+
end
1230+
if Base.JLOptions().check_bounds == 1
1231+
@test_throws BoundsError Fields.level(center_field, 11)
1232+
@test_throws BoundsError Fields.level(face_field, PlusHalf(11))
1233+
else
1234+
@warn "Bounds check on level(::Field) not verified."
1235+
end
1236+
end
1237+
end
1238+
11991239
include("unit_field_multi_broadcast_fusion.jl")
12001240

12011241
nothing

0 commit comments

Comments
 (0)