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
|
|
34
|
|
35 ## Pre refactor code:
|
|
36 """
|
|
37 orthogonal_dims(grid::EquidistantGrid,dim)
|
|
38
|
|
39 Returns the dimensions of grid orthogonal to that of dim.
|
|
40 """
|
|
41 function orthogonal_dims(grid::EquidistantGrid, dim)
|
|
42 orth_dims = filter(i -> i != dim, dims(grid))
|
|
43 if orth_dims == dims(grid)
|
|
44 throw(DomainError(string("dimension ",string(dim)," not matching grid")))
|
|
45 end
|
|
46 return orth_dims
|
|
47 end
|
|
48
|
|
49 """
|
|
50 restrict(::EquidistantGrid, dim)
|
|
51
|
|
52 Pick out given dimensions from the grid and return a grid for them.
|
|
53 """
|
|
54 function restrict(grid::EquidistantGrid, dim)
|
|
55 size = grid.size[dim]
|
|
56 limit_lower = grid.limit_lower[dim]
|
|
57 limit_upper = grid.limit_upper[dim]
|
|
58
|
|
59 return EquidistantGrid(size, limit_lower, limit_upper)
|
|
60 end
|
|
61
|
|
62
|
|
63
|
|
64 """
|
|
65 boundary_identifiers(::EquidistantGrid)
|
|
66
|
|
67 Returns a tuple containing the boundary identifiers for the grid, stored as
|
|
68 (CartesianBoundary(1,Lower),
|
|
69 CartesianBoundary(1,Upper),
|
|
70 CartesianBoundary(2,Lower),
|
|
71 ...)
|
|
72 """
|
|
73 boundary_identifiers(g::EquidistantGrid) = (((ntuple(i->(CartesianBoundary{i,Lower}(),CartesianBoundary{i,Upper}()),ndims(g)))...)...,)
|
|
74
|
|
75
|
|
76 """
|
|
77 boundary_grid(grid::EquidistantGrid, id::CartesianBoundary)
|
|
78
|
|
79 Creates the lower-dimensional restriciton of `grid` spanned by the dimensions
|
|
80 orthogonal to the boundary specified by `id`. The boundary grid of a 1-dimensional
|
|
81 grid is a zero-dimensional grid.
|
|
82 """
|
|
83 function boundary_grid(grid::EquidistantGrid, id::CartesianBoundary)
|
|
84 orth_dims = orthogonal_dims(grid, dim(id))
|
|
85 return restrict(grid, orth_dims)
|
|
86 end
|
|
87 boundary_grid(::EquidistantGrid{1,T},::CartesianBoundary{1}) where T = EquidistantGrid{T}()
|