Mercurial > repos > public > sbplib_julia
annotate src/Grids/tensor_grid.jl @ 1236:95e294576c2a refactor/grids
Implement boundary methods for TensorGrid
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Sun, 19 Feb 2023 22:50:02 +0100 |
parents | 5f677cd6f0b6 |
children | 6f75f2d2bf5c |
rev | line source |
---|---|
1222 | 1 struct TensorGrid{T,D,RD,GT<:NTuple{N,Grid} where N} <: Grid{T,D,RD} |
2 grids::GT | |
3 | |
4 function TensorGrid(gs...) | |
5 T = eltype(gs[1]) # All gs should have the same T | |
6 D = sum(ndims,gs) | |
7 RD = sum(nrangedims, gs) | |
8 | |
9 return new{T,D,RD,typeof(gs)}(gs) | |
10 end | |
11 end | |
12 | |
13 function Base.size(g::TensorGrid) | |
14 return concatenate_tuples(size.(g.grids)...) | |
15 end | |
16 | |
17 function Base.getindex(g::TensorGrid, I...) | |
18 szs = ndims.(g.grids) | |
19 | |
20 Is = split_tuple(I, szs) | |
21 ps = map((g,I)->SVector(g[I...]), g.grids, Is) | |
22 | |
23 return vcat(ps...) | |
24 end | |
25 | |
26 IndexStyle(::TensorGrid) = IndexCartesian() | |
27 | |
28 function Base.eachindex(g::TensorGrid) | |
29 szs = concatenate_tuples(size.(g.grids)...) | |
30 return CartesianIndices(szs) | |
31 end | |
32 | |
33 | |
1236
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
34 struct TensorBoundary{N, BID<:BoundaryIdentifier} <: BoundaryIdentifier end |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
35 grid_id(::TensorBoundary{N, BID}) where {N, BID} = N |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
36 boundary_id(::TensorBoundary{N, BID}) where {N, BID} = BID() |
1222 | 37 |
38 | |
39 """ | |
1236
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
40 boundary_identifiers(::TensorGrid) |
1222 | 41 |
1236
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
42 Returns a tuple containing the boundary identifiers for the grid. |
1222 | 43 """ |
1236
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
44 function boundary_identifiers(g::TensorGrid) |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
45 n = length(g.grids) |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
46 per_grid = map(eachindex(g.grids)) do i |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
47 return map(bid -> TensorBoundary{i, bid}(), boundary_identifiers(g.grids[i])) |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
48 end |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
49 return concatenate_tuples(per_grid...) |
1222 | 50 end |
51 | |
52 | |
53 """ | |
1236
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
54 boundary_grid(grid::TensorGrid, id::TensorBoundary) |
1222 | 55 |
1236
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
56 The grid for the boundary specified by `id`. |
1222 | 57 """ |
1236
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
58 function boundary_grid(g::TensorGrid, bid::TensorBoundary) |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
59 local_boundary_grid = boundary_grid(g.grids[grid_id(bid)], boundary_id(bid)) |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
60 new_grids = Base.setindex(g.grids, local_boundary_grid, grid_id(bid)) |
95e294576c2a
Implement boundary methods for TensorGrid
Jonatan Werpers <jonatan@werpers.com>
parents:
1222
diff
changeset
|
61 return TensorGrid(new_grids...) |
1222 | 62 end |