Skip to content

Commit 0cb2c3d

Browse files
committed
Fix for #2358
1 parent 450b39c commit 0cb2c3d

File tree

4 files changed

+86
-4
lines changed

4 files changed

+86
-4
lines changed

src/Grids/level.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ struct LevelGrid{
66
level::L
77
end
88

9-
quadrature_style(levelgrid::LevelGrid) =
10-
quadrature_style(levelgrid.full_grid.horizontal_grid)
9+
quadrature_style(levelgrid::LevelGrid) = quadrature_style(levelgrid.full_grid)
1110

1211
level(
1312
grid::AbstractExtrudedFiniteDifferenceGrid,
@@ -23,6 +22,7 @@ dss_weights(levelgrid::LevelGrid, _) = dss_weights(levelgrid.full_grid, nothing)
2322

2423
local_geometry_type(::Type{LevelGrid{G, L}}) where {G, L} =
2524
local_geometry_type(G)
25+
2626
local_geometry_data(levelgrid::LevelGrid{<:Any, Int}, ::Nothing) = level(
2727
local_geometry_data(levelgrid.full_grid, CellCenter()),
2828
levelgrid.level,
@@ -32,7 +32,7 @@ local_geometry_data(levelgrid::LevelGrid{<:Any, PlusHalf{Int}}, ::Nothing) =
3232
local_geometry_data(levelgrid.full_grid, CellFace()),
3333
levelgrid.level + half,
3434
)
35-
global_geometry(levlgrid::LevelGrid) = global_geometry(levlgrid.full_grid)
35+
global_geometry(levelgrid::LevelGrid) = global_geometry(levelgrid.full_grid)
3636

3737
## GPU compatibility
3838
Adapt.adapt_structure(to, grid::LevelGrid) =

src/InputOutput/readers.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ function read_grid_new(reader, name)
522522
else
523523
level = attrs(group)["level_half"] + half
524524
end
525+
525526
return Grids.LevelGrid(full_grid, level)
526527
else
527528
error("Unsupported grid type $type")

test/Fields/unit_field.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,35 @@ end
689689
end
690690
end
691691

692+
@testset "Levels of nonlocal Fields and nonlocal Field broadcasts" begin
693+
FT = Float64
694+
gradh = Operators.Gradient()
695+
# Todo: Make this work over all spaces; currently broken for everything else.
696+
for space in (
697+
TU.CenterExtrudedFiniteDifferenceSpace(FT),
698+
TU.FaceExtrudedFiniteDifferenceSpace(FT),
699+
)
700+
TU.levelable(space) || continue
701+
field = fill((; x = FT(1)), space)
702+
703+
op_on_level_of_field =
704+
gradh.(
705+
Fields.Field(
706+
Spaces.level(Fields.field_values(field.x), 1),
707+
Spaces.level(space, TU.fc_index(1, space)),
708+
)
709+
)
710+
711+
@test op_on_level_of_field ==
712+
(Spaces.level(gradh.(field.x), TU.fc_index(1, space)))
713+
714+
@test_broken op_on_level_of_field == Base.materialize((Spaces.level(
715+
lazy.(gradh.(field.x)),
716+
TU.fc_index(1, space),
717+
)),)
718+
end
719+
end
720+
692721
@testset "Columns of Fields and Field broadcasts" begin
693722
FT = Float64
694723
for space in TU.all_spaces(FT)

test/InputOutput/unit_hybrid3dcubedsphere_topography.jl

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ using ClimaCore:
1313
InputOutput,
1414
Grids
1515

16+
@isdefined(TU) || include(
17+
joinpath(pkgdir(ClimaCore), "test", "TestUtilities", "TestUtilities.jl"),
18+
);
19+
import .TestUtilities as TU;
20+
1621
using ClimaComms
1722
const comms_ctx = ClimaComms.context(ClimaComms.CPUSingleThreaded())
1823
pid, nprocs = ClimaComms.init(comms_ctx)
@@ -54,7 +59,7 @@ end
5459
z_max / 8 .* (
5560
cosd.(Fields.coordinate_field(h_space).lat) .+
5661
cosd.(Fields.coordinate_field(h_space).long) .+ 1
57-
)
62+
),
5863
)
5964

6065
z_mesh = Meshes.IntervalMesh(z_domain, nelems = z_elem)
@@ -90,3 +95,50 @@ end
9095
end
9196
end
9297
end
98+
99+
100+
@testset "HDF5 restart test for a Named Tuple of Levels of a 3D hybrid cubed sphere for deep" begin
101+
# This I/O is used for the computation of the topographic drag
102+
FT = Float32
103+
104+
for space in (
105+
TU.CenterExtrudedFiniteDifferenceSpace(FT, context = comms_ctx),
106+
TU.FaceExtrudedFiniteDifferenceSpace(FT, context = comms_ctx),
107+
)
108+
TU.levelable(space) || continue
109+
field = fill((; x = FT(1)), space)
110+
111+
level_of_field = Fields.Field(
112+
Spaces.level(Fields.field_values(field.x), 1),
113+
Spaces.level(space, TU.fc_index(1, space)),
114+
)
115+
116+
fake_drag = fill(
117+
(;
118+
t11 = FT(0.0),
119+
t12 = FT(0.0),
120+
t21 = FT(0.0),
121+
t22 = FT(0.0),
122+
hmin = FT(0.0),
123+
hmax = FT(0.0),
124+
),
125+
axes(level_of_field),
126+
)
127+
128+
# write field vector to hdf5 file
129+
InputOutput.HDF5Writer(filename, comms_ctx) do writer
130+
InputOutput.write!(writer, fake_drag, "fake_drag")
131+
end
132+
133+
InputOutput.HDF5Reader(filename, comms_ctx) do reader
134+
restart_fake_drag = InputOutput.read_field(reader, "fake_drag") # read fieldvector from hdf5 file
135+
136+
# The underlying space is of a different instance, so we cannot use == to check for equivalence.
137+
# Instead, we make sure that the values and types are the same.
138+
@test typeof(restart_fake_drag) == typeof(fake_drag)
139+
@test maximum(
140+
abs.(parent(fake_drag.t21) .- parent(restart_fake_drag.t21)),
141+
) == 0.0f0
142+
end
143+
end
144+
end

0 commit comments

Comments
 (0)