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