diff --git a/src/Fields/broadcast.jl b/src/Fields/broadcast.jl index 533faf3667..fa1d1753ad 100644 --- a/src/Fields/broadcast.jl +++ b/src/Fields/broadcast.jl @@ -192,6 +192,10 @@ end parent(Spaces.local_geometry_data(space2)) ) warn_mismatched_spaces(typeof(space1), typeof(space2)) + elseif Spaces.issubspace(space2, space1) + return space1 + elseif Spaces.issubspace(space1, space2) + return space2 else error_mismatched_spaces(typeof(space1), typeof(space2)) end @@ -229,6 +233,9 @@ end parent(Spaces.local_geometry_data(space2)) ) warn_mismatched_spaces(typeof(space1), typeof(space2)) + elseif Spaces.issubspace(space2, space1) || + Spaces.issubspace(space1, space2) + nothing else error_mismatched_spaces(typeof(space1), typeof(space2)) end diff --git a/src/Spaces/Spaces.jl b/src/Spaces/Spaces.jl index 50dc6f741a..2ff34a2094 100644 --- a/src/Spaces/Spaces.jl +++ b/src/Spaces/Spaces.jl @@ -26,6 +26,8 @@ using StaticArrays, ForwardDiff, LinearAlgebra, UnPack, Adapt abstract type AbstractSpace end +issubspace(::AbstractSpace, ::AbstractSpace) = false + undertype(space::AbstractSpace) = Geometry.undertype(eltype(local_geometry_data(space))) diff --git a/src/Spaces/extruded.jl b/src/Spaces/extruded.jl index fc7c6cdfbe..b66bbbfc35 100644 --- a/src/Spaces/extruded.jl +++ b/src/Spaces/extruded.jl @@ -32,6 +32,21 @@ struct ExtrudedFiniteDifferenceSpace{ face_ghost_geometry::LGG end +function issubspace( + hspace::AbstractSpectralElementSpace, + extruded_space::ExtrudedFiniteDifferenceSpace, +) + if hspace === extruded_space.horizontal_space + return true + end + # TODO: improve level handling + return Spaces.topology(hspace) === + Spaces.topology(extruded_space.horizontal_space) && + quadrature_style(hspace) === + quadrature_style(extruded_space.horizontal_space) +end + + Adapt.adapt_structure(to, space::ExtrudedFiniteDifferenceSpace) = ExtrudedFiniteDifferenceSpace( space.staggering, diff --git a/test/Fields/field.jl b/test/Fields/field.jl index b198f80fe5..a18ccb24dd 100644 --- a/test/Fields/field.jl +++ b/test/Fields/field.jl @@ -426,25 +426,17 @@ end TU.has_z_coordinates(space) || continue Y = TU.FieldFromNamedTuple(space, (; x = FT(1))) ᶜz_surf = - Spaces.level(Fields.coordinate_field(Y.x).z, TU.fc_index(1, space)) - ᶜx_surf = Spaces.level(Y.x, TU.fc_index(1, space)) + Spaces.level(Fields.coordinate_field(Y).z, TU.fc_index(1, space)) + ᶜx_surf = copy(Spaces.level(Y.x, TU.fc_index(1, space))) # Still need to define broadcast rules for surface planes with 3D domains - if nameof(typeof(space)) == :ExtrudedFiniteDifferenceSpace - @test_broken begin - try - domain_surface_bc!(Y.x, ᶜz_surf) - true - catch - false - end - end - else - domain_surface_bc!(Y.x, ᶜz_surf, ᶜx_surf) - end + domain_surface_bc!(Y.x, ᶜz_surf, ᶜx_surf) + # Skip spaces incompatible with Fields.bycolumn: TU.bycolumnable(space) || continue - column_surface_bc!(Y.x, ᶜz_surf, ᶜx_surf) + Yc = TU.FieldFromNamedTuple(space, (; x = FT(1))) + column_surface_bc!(Yc.x, ᶜz_surf, ᶜx_surf) + @test Y.x == Yc.x nothing end nothing