Mercurial > repos > public > sbplib_julia
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