changeset 1928:96b3e9c516fe feature/grids/manifolds

Make cartesian atlas work for any dimension
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 07 Feb 2025 09:12:41 +0100
parents fe18cdad2b27
children c5affb342e73
files src/Grids/manifolds.jl test/Grids/manifolds_test.jl
diffstat 2 files changed, 46 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/Grids/manifolds.jl	Fri Feb 07 08:44:36 2025 +0100
+++ b/src/Grids/manifolds.jl	Fri Feb 07 09:12:41 2025 +0100
@@ -68,23 +68,20 @@
 function connections(a::CartesianAtlas)
     c = Tuple{MultiBlockBoundary, MultiBlockBoundary}[]
 
-    N,M = size(a.charts)
-    for j ∈ 1:M, i ∈ 1:N-1
-        push!(c,
-            (
-                MultiBlockBoundary{(i,j), CartesianBoundary{1,UpperBoundary}}(),
-                MultiBlockBoundary{(i+1,j), CartesianBoundary{1,LowerBoundary}}(),
-            ),
-        )
-    end
-
-    for i ∈ 1:N, j ∈ 1:M-1
-        push!(c,
-            (
-                MultiBlockBoundary{(i,j), CartesianBoundary{2,UpperBoundary}}(),
-                MultiBlockBoundary{(i,j+1), CartesianBoundary{2,LowerBoundary}}(),
-            ),
-        )
+    for d ∈ 1:ndims(charts(a))
+        Is = eachslice(CartesianIndices(charts(a)); dims=d)
+        for i ∈ 1:length(Is)-1 # For each interface between slices
+            for jk ∈ eachindex(Is[i]) # For each block in slice
+                Iᵢⱼₖ = Tuple(Is[i][jk])
+                Iᵢ₊₁ⱼₖ = Tuple(Is[i+1][jk])
+                push!(c,
+                    (
+                        MultiBlockBoundary{Iᵢⱼₖ,   CartesianBoundary{d,UpperBoundary}}(),
+                        MultiBlockBoundary{Iᵢ₊₁ⱼₖ, CartesianBoundary{d,LowerBoundary}}(),
+                    )
+                )
+            end
+        end
     end
 
     return c
--- a/test/Grids/manifolds_test.jl	Fri Feb 07 08:44:36 2025 +0100
+++ b/test/Grids/manifolds_test.jl	Fri Feb 07 09:12:41 2025 +0100
@@ -36,6 +36,7 @@
 
     @testset "connections" begin
         a = CartesianAtlas(fill(c, 2,3))
+        # 2D
         west = CartesianBoundary{1,LowerBoundary}
         east = CartesianBoundary{1,UpperBoundary}
         south = CartesianBoundary{2,LowerBoundary}
@@ -50,6 +51,37 @@
             (MultiBlockBoundary{(2,2), north}(), MultiBlockBoundary{(2,3), south}()),
             (MultiBlockBoundary{(1,3), east}(), MultiBlockBoundary{(2,3), west}()),
         ])
+
+        # 3D
+        a = CartesianAtlas(fill(c, 2,2,3))
+        bottom = CartesianBoundary{3, LowerBoundary}
+        top = CartesianBoundary{3, UpperBoundary}
+        @test Set(connections(a)) == Set([
+            (MultiBlockBoundary{(1,1,1), east}(),  MultiBlockBoundary{(2,1,1), west}()),
+            (MultiBlockBoundary{(1,1,1), north}(), MultiBlockBoundary{(1,2,1), south}()),
+            (MultiBlockBoundary{(2,1,1), north}(), MultiBlockBoundary{(2,2,1), south}()),
+            (MultiBlockBoundary{(1,2,1), east}(),  MultiBlockBoundary{(2,2,1), west}()),
+
+            (MultiBlockBoundary{(1,1,2), east}(),  MultiBlockBoundary{(2,1,2), west}()),
+            (MultiBlockBoundary{(1,1,2), north}(), MultiBlockBoundary{(1,2,2), south}()),
+            (MultiBlockBoundary{(2,1,2), north}(), MultiBlockBoundary{(2,2,2), south}()),
+            (MultiBlockBoundary{(1,2,2), east}(),  MultiBlockBoundary{(2,2,2), west}()),
+
+            (MultiBlockBoundary{(1,1,3), east}(),  MultiBlockBoundary{(2,1,3), west}()),
+            (MultiBlockBoundary{(1,1,3), north}(), MultiBlockBoundary{(1,2,3), south}()),
+            (MultiBlockBoundary{(2,1,3), north}(), MultiBlockBoundary{(2,2,3), south}()),
+            (MultiBlockBoundary{(1,2,3), east}(),  MultiBlockBoundary{(2,2,3), west}()),
+
+            (MultiBlockBoundary{(1,1,1), top}(), MultiBlockBoundary{(1,1,2), bottom}()),
+            (MultiBlockBoundary{(2,1,1), top}(), MultiBlockBoundary{(2,1,2), bottom}()),
+            (MultiBlockBoundary{(1,2,1), top}(), MultiBlockBoundary{(1,2,2), bottom}()),
+            (MultiBlockBoundary{(2,2,1), top}(), MultiBlockBoundary{(2,2,2), bottom}()),
+
+            (MultiBlockBoundary{(1,1,2), top}(), MultiBlockBoundary{(1,1,3), bottom}()),
+            (MultiBlockBoundary{(2,1,2), top}(), MultiBlockBoundary{(2,1,3), bottom}()),
+            (MultiBlockBoundary{(1,2,2), top}(), MultiBlockBoundary{(1,2,3), bottom}()),
+            (MultiBlockBoundary{(2,2,2), top}(), MultiBlockBoundary{(2,2,3), bottom}()),
+        ])
     end
 end