changeset 1220:93bba649aea2 refactor/grids

Merge default
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 01 Nov 2022 22:44:00 +0100
parents 50b008d2e937 (diff) dd7325f91aa3 (current diff)
children b3b4d29b46c3
files
diffstat 3 files changed, 66 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/src/Grids/Grids.jl	Fri Oct 21 21:41:43 2022 +0200
+++ b/src/Grids/Grids.jl	Tue Nov 01 22:44:00 2022 +0100
@@ -1,6 +1,7 @@
 module Grids
 
 using Sbplib.RegionIndices
+using Sbplib.LazyTensors
 
 # Grid
 export Grid
--- a/src/Grids/equidistant_grid.jl	Fri Oct 21 21:41:43 2022 +0200
+++ b/src/Grids/equidistant_grid.jl	Tue Nov 01 22:44:00 2022 +0100
@@ -1,4 +1,3 @@
-
 """
     EquidistantGrid{Dim,T<:Real} <: Grid
 
@@ -20,7 +19,6 @@
     end
 end
 
-
 """
     EquidistantGrid(size, limit_lower, limit_upper)
 
@@ -38,7 +36,6 @@
     return EquidistantGrid{length(size), eltype(limit_lower)}(size, limit_lower, limit_upper)
 end
 
-
 """
     EquidistantGrid{T}()
 
@@ -64,9 +61,21 @@
 
 Base.ndims(::EquidistantGrid{Dim}) where Dim = Dim
 
+function Base.getindex(g::EquidistantGrid, I::Vararg{Int})
+    h = spacing(g)
+    return g.limit_lower .+ (I.-1).*h
+end
 
+Base.getindex(g::EquidistantGrid, I::CartesianIndex) = g[Tuple(I)...]
 
+# Review: 
+# Is it not strange that evalOn(::Grid) is non-lazy while evalOn(::EquidistantGrid) is?
+# Also: Change name to evalon or eval_on!!!!!!
+function evalOn(grid::EquidistantGrid, f::Function)
+    F(I...) = f(grid[I...]...)
 
+    return LazyFunctionArray(F, size(grid))
+end
 
 """
     spacing(grid::EquidistantGrid)
@@ -99,7 +108,6 @@
     return broadcast(I -> grid.limit_lower .+ (I.-1).*h, indices)
 end
 
-
 """
     restrict(::EquidistantGrid, dim)
 
--- a/test/Grids/equidistant_grid_test.jl	Fri Oct 21 21:41:43 2022 +0200
+++ b/test/Grids/equidistant_grid_test.jl	Tue Nov 01 22:44:00 2022 +0100
@@ -1,6 +1,7 @@
 using Sbplib.Grids
 using Test
 using Sbplib.RegionIndices
+using Sbplib.LazyTensors
 
 
 @testset "EquidistantGrid" begin
@@ -44,6 +45,28 @@
         end
     end
 
+    @testset "getindex" begin
+        g = EquidistantGrid((5,3), (-1.0,0.0), (0.0,7.11))
+        @test g[1,1] == (-1.0,0.0)
+        @test g[1,3] == (-1.0,7.11)
+        @test g[5,1] == (0.0,0.0)
+        @test g[5,3] == (0.0,7.11)
+
+        @test g[4,2] == (-0.25,7.11/2)
+
+        @test g[CartesianIndex(1,3)] == (-1.0,7.11)
+    end
+
+    @testset "evalOn" begin
+        g = EquidistantGrid((5,3), (0.0,0.0), (2.0,1.0))
+
+        @test evalOn(g, (x,y) -> 0.) isa LazyArray
+        @test evalOn(g, (x,y) -> 0.) == fill(0., (5,3))
+
+        f(x,y) = sin(x)*cos(y)
+        @test evalOn(g, f) == map(p->f(p...), points(g))
+    end
+
     @testset "restrict" begin
         g = EquidistantGrid((5,3), (0.0,0.0), (2.0,1.0))
         @test restrict(g, 1) == EquidistantGrid(5,0.0,2.0)
@@ -69,36 +92,36 @@
     end
 
     @testset "boundary_grid" begin
-            @testset "1D" begin
-                g = EquidistantGrid(5,0.0,2.0)
-                (id_l, id_r) = boundary_identifiers(g)
-                @test boundary_grid(g,id_l) == EquidistantGrid{Float64}()
-                @test boundary_grid(g,id_r) == EquidistantGrid{Float64}()
-                @test_throws DomainError boundary_grid(g,CartesianBoundary{2,Lower}())
-                @test_throws DomainError boundary_grid(g,CartesianBoundary{0,Lower}())
-            end
-            @testset "2D" begin
-                g = EquidistantGrid((5,3),(0.0,0.0),(1.0,3.0))
-                (id_w, id_e, id_s, id_n) = boundary_identifiers(g)
-                @test boundary_grid(g,id_w) == restrict(g,2)
-                @test boundary_grid(g,id_e) == restrict(g,2)
-                @test boundary_grid(g,id_s) == restrict(g,1)
-                @test boundary_grid(g,id_n) == restrict(g,1)
-                @test_throws DomainError boundary_grid(g,CartesianBoundary{4,Lower}())
-            end
-            @testset "3D" begin
-                g = EquidistantGrid((2,5,3), (0.0,0.0,0.0), (2.0,1.0,3.0))
-                (id_w, id_e,
-                 id_s, id_n,
-                 id_t, id_b) = boundary_identifiers(g)
-                @test boundary_grid(g,id_w) == restrict(g,[2,3])
-                @test boundary_grid(g,id_e) == restrict(g,[2,3])
-                @test boundary_grid(g,id_s) == restrict(g,[1,3])
-                @test boundary_grid(g,id_n) == restrict(g,[1,3])
-                @test boundary_grid(g,id_t) == restrict(g,[1,2])
-                @test boundary_grid(g,id_b) == restrict(g,[1,2])
-                @test_throws DomainError boundary_grid(g,CartesianBoundary{4,Lower}())
-            end
+        @testset "1D" begin
+            g = EquidistantGrid(5,0.0,2.0)
+            (id_l, id_r) = boundary_identifiers(g)
+            @test boundary_grid(g,id_l) == EquidistantGrid{Float64}()
+            @test boundary_grid(g,id_r) == EquidistantGrid{Float64}()
+            @test_throws DomainError boundary_grid(g,CartesianBoundary{2,Lower}())
+            @test_throws DomainError boundary_grid(g,CartesianBoundary{0,Lower}())
+        end
+        @testset "2D" begin
+            g = EquidistantGrid((5,3),(0.0,0.0),(1.0,3.0))
+            (id_w, id_e, id_s, id_n) = boundary_identifiers(g)
+            @test boundary_grid(g,id_w) == restrict(g,2)
+            @test boundary_grid(g,id_e) == restrict(g,2)
+            @test boundary_grid(g,id_s) == restrict(g,1)
+            @test boundary_grid(g,id_n) == restrict(g,1)
+            @test_throws DomainError boundary_grid(g,CartesianBoundary{4,Lower}())
+        end
+        @testset "3D" begin
+            g = EquidistantGrid((2,5,3), (0.0,0.0,0.0), (2.0,1.0,3.0))
+            (id_w, id_e,
+             id_s, id_n,
+             id_t, id_b) = boundary_identifiers(g)
+            @test boundary_grid(g,id_w) == restrict(g,[2,3])
+            @test boundary_grid(g,id_e) == restrict(g,[2,3])
+            @test boundary_grid(g,id_s) == restrict(g,[1,3])
+            @test boundary_grid(g,id_n) == restrict(g,[1,3])
+            @test boundary_grid(g,id_t) == restrict(g,[1,2])
+            @test boundary_grid(g,id_b) == restrict(g,[1,2])
+            @test_throws DomainError boundary_grid(g,CartesianBoundary{4,Lower}())
+        end
     end
 
     @testset "refine" begin