Mercurial > repos > public > sbplib_julia
changeset 1465:88e738d807cb feature/grids/boundary_indicies
Implement boundary_indices for TensorGrid
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 29 Nov 2023 09:14:06 +0100 |
parents | 37cf9f79caa4 |
children | de4e15924d26 |
files | Notes.md src/Grids/tensor_grid.jl test/Grids/tensor_grid_test.jl |
diffstat | 3 files changed, 37 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/Notes.md Wed Nov 29 09:04:12 2023 +0100 +++ b/Notes.md Wed Nov 29 09:14:06 2023 +0100 @@ -313,3 +313,14 @@ Could the implementation of LazyOuterProduct be simplified by making it a struct containing two or more LazyTensors? (using split_tuple in a similar way as TensorGrid) + +## Implementation of boundary_indices for more complex grids +To represent boundaries of for example tet-elements we can use a type `IndexCollection` which should be able to be used to index a grid function directly. + +```julia +I = IndexCollection(...) +v[I] +``` + +* This would impact how tensor grid works. +* To make things homogenous maybe these index collections should be used for the more simple grids too.
--- a/src/Grids/tensor_grid.jl Wed Nov 29 09:04:12 2023 +0100 +++ b/src/Grids/tensor_grid.jl Wed Nov 29 09:14:06 2023 +0100 @@ -86,6 +86,17 @@ end +function boundary_indices(g::TensorGrid, id::TensorGridBoundary) + per_grid_ind = map(g.grids) do g + ntuple(i->:, ndims(g)) + end + + local_b_ind = boundary_indices(g.grids[grid_id(id)], boundary_id(id)) + b_ind = Base.setindex(per_grid_ind, local_b_ind, grid_id(id)) + + return LazyTensors.concatenate_tuples(b_ind...) +end + function combined_coordinate_vector_type(coordinate_types...) combined_coord_length = mapreduce(_ncomponents, +, coordinate_types) combined_coord_type = mapreduce(eltype, promote_type, coordinate_types)
--- a/test/Grids/tensor_grid_test.jl Wed Nov 29 09:04:12 2023 +0100 +++ b/test/Grids/tensor_grid_test.jl Wed Nov 29 09:14:06 2023 +0100 @@ -169,6 +169,21 @@ @test boundary_grid(TensorGrid(g₁, g₂), TensorGridBoundary{1, Upper}()) == TensorGrid(ZeroDimGrid(g₁[end]), g₂) @test boundary_grid(TensorGrid(g₁, g₄), TensorGridBoundary{1, Upper}()) == TensorGrid(ZeroDimGrid(g₁[end]), g₄) end + + @testset "boundary_indices" begin + g₁ = EquidistantGrid(range(0,1,length=11)) + g₂ = EquidistantGrid(range(2,3,length=6)) + g₄ = ZeroDimGrid(@SVector[1,2]) + + @test boundary_indices(TensorGrid(g₁, g₂), TensorGridBoundary{1, Lower}()) == (1,:) + @test boundary_indices(TensorGrid(g₁, g₂), TensorGridBoundary{1, Upper}()) == (11,:) + @test boundary_indices(TensorGrid(g₁, g₂), TensorGridBoundary{2, Lower}()) == (:,1) + @test boundary_indices(TensorGrid(g₁, g₂), TensorGridBoundary{2, Upper}()) == (:,6) + @test boundary_indices(TensorGrid(g₁, g₄), TensorGridBoundary{1, Lower}()) == (1,) + @test boundary_indices(TensorGrid(g₁, g₄), TensorGridBoundary{1, Upper}()) == (11,) + @test boundary_indices(TensorGrid(g₄,g₁), TensorGridBoundary{2, Lower}()) == (1,) + @test boundary_indices(TensorGrid(g₄,g₁), TensorGridBoundary{2, Upper}()) == (11,) + end end @testset "combined_coordinate_vector_type" begin