Mercurial > repos > public > sbplib_julia
changeset 1451:2e08f3444354 feature/grids/curvilinear
Implement boundary_identifiers, and a wishful implementation of boundary_grid
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Thu, 23 Nov 2023 16:08:47 +0100 |
parents | 647c8b18b84f |
children | d9d9ab18cdfc |
files | src/Grids/curvilinear_grid.jl test/Grids/curvilinear_grid_test.jl |
diffstat | 2 files changed, 28 insertions(+), 63 deletions(-) [+] |
line wrap: on
line diff
--- a/src/Grids/curvilinear_grid.jl Thu Nov 23 10:16:19 2023 +0100 +++ b/src/Grids/curvilinear_grid.jl Thu Nov 23 16:08:47 2023 +0100 @@ -26,48 +26,16 @@ Base.size(g::CurvilinearGrid) = size(g.logicalgrid) Base.size(g::CurvilinearGrid, d) = size(g.logicalgrid, d) - -# refine(g::TensorGrid, r::Int) = mapreduce(g->refine(g,r), TensorGrid, g.grids) -# coarsen(g::TensorGrid, r::Int) = mapreduce(g->coarsen(g,r), TensorGrid, g.grids) - -# """ -# TensorGridBoundary{N, BID} <: BoundaryIdentifier - -# A boundary identifier for a tensor grid. `N` Specifies which grid in the -# tensor product and `BID` which boundary on that grid. -# """ -# struct TensorGridBoundary{N, BID} <: BoundaryIdentifier end -# grid_id(::TensorGridBoundary{N, BID}) where {N, BID} = N -# boundary_id(::TensorGridBoundary{N, BID}) where {N, BID} = BID() - -# """ -# boundary_identifiers(g::TensorGrid) +boundary_identifiers(g::CurvilinearGrid) = boundary_identifiers(g.logicalgrid) -# Returns a tuple containing the boundary identifiers of `g`. -# """ -# function boundary_identifiers(g::TensorGrid) -# per_grid = map(eachindex(g.grids)) do i -# return map(bid -> TensorGridBoundary{i, typeof(bid)}(), boundary_identifiers(g.grids[i])) -# end -# return LazyTensors.concatenate_tuples(per_grid...) -# end - - -# """ -# boundary_grid(g::TensorGrid, id::TensorGridBoundary) - -# The grid for the boundary of `g` specified by `id`. -# """ -# function boundary_grid(g::TensorGrid, id::TensorGridBoundary) -# local_boundary_grid = boundary_grid(g.grids[grid_id(id)], boundary_id(id)) -# new_grids = Base.setindex(g.grids, local_boundary_grid, grid_id(id)) -# return TensorGrid(new_grids...) -# end - - - - - +function boundary_grid(g::CurvilinearGrid, id::TensorGridBoundary) + b_indices = boundary_indices(g.logicalgrid, id) + return CurvilinearGrid( + boundary_grid(g.logicalgrid, id), + g.physicalcoordinates[b_indices], + g.jacobian[b_indices], + ) +end
--- a/test/Grids/curvilinear_grid_test.jl Thu Nov 23 10:16:19 2023 +0100 +++ b/test/Grids/curvilinear_grid_test.jl Thu Nov 23 16:08:47 2023 +0100 @@ -1,4 +1,5 @@ using Sbplib.Grids +using Sbplib.RegionIndices using Test using StaticArrays @@ -102,41 +103,37 @@ end @testset "Base" begin - # @test ndims(EquidistantGrid(0:10)) == 1 + @test ndims(cg) == 2 end @testset "boundary_identifiers" begin - # g = EquidistantGrid(0:0.1:10) - # @test boundary_identifiers(g) == (Lower(), Upper()) - # @inferred boundary_identifiers(g) + @test boundary_identifiers(cg) == boundary_identifiers(lg) end @testset "boundary_grid" begin - # g = EquidistantGrid(0:0.1:1) - # @test boundary_grid(g, Lower()) == ZeroDimGrid(0.0) - # @test boundary_grid(g, Upper()) == ZeroDimGrid(1.0) + @test_broken boundary_grid(cg, TensorGridBoundary{1, Lower}()) == 2. * boundary_grid(lg,TensorGridBoundary{1, Lower()}) + @test_broken boundary_grid(cg, TensorGridBoundary{1, Upper}()) == 2. * boundary_grid(lg,TensorGridBoundary{1, Upper()}) + @test_broken boundary_grid(cg, TensorGridBoundary{2, Lower}()) == 2. * boundary_grid(lg,TensorGridBoundary{2, Lower()}) + @test_broken boundary_grid(cg, TensorGridBoundary{2, Upper}()) == 2. * boundary_grid(lg,TensorGridBoundary{2, Upper()}) end + # TBD: Should curvilinear grid support refining and coarsening? + # This would require keeping the coordinate mapping around which seems burdensome, and might increase compilation time? @testset "refine" begin - # g = EquidistantGrid(0:0.1:1) - # @test refine(g, 1) == g - # @test refine(g, 2) == EquidistantGrid(0:0.05:1) - # @test refine(g, 3) == EquidistantGrid(0:(0.1/3):1) + @test_broken refine(cg, 1) == cg + @test_broken refine(cg, 2) == CurvilinearGrid(refine(lg,2), x̄, J) + @test_broken refine(cg, 3) == CurvilinearGrid(refine(lg,3), x̄, J) end @testset "coarsen" begin - # g = EquidistantGrid(0:1:10) - # @test coarsen(g, 1) == g - # @test coarsen(g, 2) == EquidistantGrid(0:2:10) + lg = equidistant_grid((11,11), (0,0), (1,1)) # TODO: Change dims of the grid to be different + x̄ = map(ξ̄ -> 2ξ̄, lg) + J = map(ξ̄ -> @SArray(fill(2., 2, 2)), lg) + cg = CurvilinearGrid(lg, x̄, J) - # g = EquidistantGrid(0:0.1:1) - # @test coarsen(g, 1) == g - # @test coarsen(g, 2) == EquidistantGrid(0:0.2:1) + @test_broken coarsen(cg, 1) == cg + @test_broken coarsen(cg, 2) == CurvilinearGrid(coarsen(lg,2), x̄, J) - # g = EquidistantGrid(0:10) - # @test coarsen(g, 1) == EquidistantGrid(0:1:10) - # @test coarsen(g, 2) == EquidistantGrid(0:2:10) - - # @test_throws DomainError(3, "Size minus 1 must be divisible by the ratio.") coarsen(g, 3) + @test_broken false # @test_throws DomainError(3, "Size minus 1 must be divisible by the ratio.") coarsen(cg, 3) end end