annotate src/Grids/equidistant_grid.jl @ 1152:bda0afcf8e52 refactor/grids

REVIEW: Give input on TBD comments, suggest name change of evalOn.
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 20 Oct 2022 20:59:56 +0200
parents 31041ef8092a
children 50b008d2e937
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
406
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
1 """
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
2 EquidistantGrid{Dim,T<:Real} <: Grid
75
93c833019857 Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 74
diff changeset
3
909
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
4 `Dim`-dimensional equidistant grid with coordinates of type `T`.
406
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
5 """
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
6 struct EquidistantGrid{Dim,T<:Real} <: Grid
381
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
7 size::NTuple{Dim, Int}
75
93c833019857 Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 74
diff changeset
8 limit_lower::NTuple{Dim, T}
93c833019857 Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 74
diff changeset
9 limit_upper::NTuple{Dim, T}
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
10
877
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
11 function EquidistantGrid{Dim,T}(size::NTuple{Dim, Int}, limit_lower::NTuple{Dim, T}, limit_upper::NTuple{Dim, T}) where {Dim,T}
406
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
12 if any(size .<= 0)
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
13 throw(DomainError("all components of size must be postive"))
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
14 end
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
15 if any(limit_upper.-limit_lower .<= 0)
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
16 throw(DomainError("all side lengths must be postive"))
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
17 end
381
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
18 return new{Dim,T}(size, limit_lower, limit_upper)
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
19 end
877
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
20 end
680
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
21
909
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
22 """
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
23 EquidistantGrid(size, limit_lower, limit_upper)
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
24
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
25 Construct an equidistant grid with corners at the coordinates `limit_lower` and
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
26 `limit_upper`.
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
27
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
28 The length of the domain sides are given by the components of
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
29 `limit_upper-limit_lower`. E.g for a 2D grid with `limit_lower=(-1,0)` and `limit_upper=(1,2)` the domain is defined
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
30 as `(-1,1)x(0,2)`. The side lengths of the grid are not allowed to be negative.
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
31
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
32 The number of equidistantly spaced points in each coordinate direction are given
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
33 by the tuple `size`.
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
34 """
877
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
35 function EquidistantGrid(size, limit_lower, limit_upper)
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
36 return EquidistantGrid{length(size), eltype(limit_lower)}(size, limit_lower, limit_upper)
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37 end
1092
c4ea28d904f5 Fix grid indexing with CartesianIndex
Jonatan Werpers <jonatan@werpers.com>
parents: 1090
diff changeset
38 # TBD: Should it be an AbstractArray?
1152
bda0afcf8e52 REVIEW: Give input on TBD comments, suggest name change of evalOn.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1146
diff changeset
39 # Review: Do we need it to be? It could be nice to have an iterator for a grid, but are there any other
bda0afcf8e52 REVIEW: Give input on TBD comments, suggest name change of evalOn.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1146
diff changeset
40 # functionalities we need? Adding two grids etc? If not, I suggest against subtyping AbstractArray.
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
41
909
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
42 """
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
43 EquidistantGrid{T}()
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
44
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
45 Constructs a 0-dimensional grid.
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
46 """
877
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
47 EquidistantGrid{T}() where T = EquidistantGrid{0,T}((),(),()) # Convenience constructor for 0-dim grid
406
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
48
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
49
406
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
50 """
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
51 EquidistantGrid(size::Int, limit_lower::T, limit_upper::T)
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
52
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
53 Convenience constructor for 1D grids.
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
54 """
324
047dee8efaef Grids.EquidistantGrid: Add constructor for 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 270
diff changeset
55 function EquidistantGrid(size::Int, limit_lower::T, limit_upper::T) where T
047dee8efaef Grids.EquidistantGrid: Add constructor for 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 270
diff changeset
56 return EquidistantGrid((size,),(limit_lower,),(limit_upper,))
047dee8efaef Grids.EquidistantGrid: Add constructor for 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 270
diff changeset
57 end
047dee8efaef Grids.EquidistantGrid: Add constructor for 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 270
diff changeset
58
688
e9e46a587370 Add eltype function to EquidistantGrids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 686
diff changeset
59 Base.eltype(grid::EquidistantGrid{Dim,T}) where {Dim,T} = T
e9e46a587370 Add eltype function to EquidistantGrids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 686
diff changeset
60
e9e46a587370 Add eltype function to EquidistantGrids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 686
diff changeset
61 Base.eachindex(grid::EquidistantGrid) = CartesianIndices(grid.size)
129
1aaeb46ba5f4 Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 124
diff changeset
62
241
1128ab4f5758 Add size method to EquidistantGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 221
diff changeset
63 Base.size(g::EquidistantGrid) = g.size
1128ab4f5758 Add size method to EquidistantGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 221
diff changeset
64
1128
dfbd62c7eb09 Rename dim to ndims in Grids.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1126
diff changeset
65 Base.ndims(::EquidistantGrid{Dim}) where Dim = Dim
406
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
66
1092
c4ea28d904f5 Fix grid indexing with CartesianIndex
Jonatan Werpers <jonatan@werpers.com>
parents: 1090
diff changeset
67 function Base.getindex(g::EquidistantGrid, I::Vararg{Int})
1090
9b40aeac4269 Add getindex for grid
Jonatan Werpers <jonatan@werpers.com>
parents: 909
diff changeset
68 h = spacing(g)
9b40aeac4269 Add getindex for grid
Jonatan Werpers <jonatan@werpers.com>
parents: 909
diff changeset
69 return g.limit_lower .+ (I.-1).*h
9b40aeac4269 Add getindex for grid
Jonatan Werpers <jonatan@werpers.com>
parents: 909
diff changeset
70 end
9b40aeac4269 Add getindex for grid
Jonatan Werpers <jonatan@werpers.com>
parents: 909
diff changeset
71
1092
c4ea28d904f5 Fix grid indexing with CartesianIndex
Jonatan Werpers <jonatan@werpers.com>
parents: 1090
diff changeset
72 Base.getindex(g::EquidistantGrid, I::CartesianIndex) = g[Tuple(I)...]
c4ea28d904f5 Fix grid indexing with CartesianIndex
Jonatan Werpers <jonatan@werpers.com>
parents: 1090
diff changeset
73 # TBD: Can this method be removed if `EquidistantGrid` is an AbstractArray?
1152
bda0afcf8e52 REVIEW: Give input on TBD comments, suggest name change of evalOn.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1146
diff changeset
74 # Review: See comment above.
1128
dfbd62c7eb09 Rename dim to ndims in Grids.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1126
diff changeset
75
1152
bda0afcf8e52 REVIEW: Give input on TBD comments, suggest name change of evalOn.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1146
diff changeset
76 # Review:
bda0afcf8e52 REVIEW: Give input on TBD comments, suggest name change of evalOn.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1146
diff changeset
77 # Is it not strange that evalOn(::Grid) is non-lazy while evalOn(::EquidistantGrid) is?
bda0afcf8e52 REVIEW: Give input on TBD comments, suggest name change of evalOn.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1146
diff changeset
78 # Also: Change name to evalon or eval_on!!!!!!
1146
31041ef8092a Specialize evalOn for EquidistantGrid to return a LazyArray
Jonatan Werpers <jonatan@werpers.com>
parents: 1143
diff changeset
79 function evalOn(grid::EquidistantGrid, f::Function)
31041ef8092a Specialize evalOn for EquidistantGrid to return a LazyArray
Jonatan Werpers <jonatan@werpers.com>
parents: 1143
diff changeset
80 F(I...) = f(grid[I...]...)
381
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
81
1146
31041ef8092a Specialize evalOn for EquidistantGrid to return a LazyArray
Jonatan Werpers <jonatan@werpers.com>
parents: 1143
diff changeset
82 return LazyFunctionArray(F, size(grid))
31041ef8092a Specialize evalOn for EquidistantGrid to return a LazyArray
Jonatan Werpers <jonatan@werpers.com>
parents: 1143
diff changeset
83 end
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
84
381
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
85 """
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
86 spacing(grid::EquidistantGrid)
261
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
87
909
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
88 The spacing between grid points.
381
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
89 """
406
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
90 spacing(grid::EquidistantGrid) = (grid.limit_upper.-grid.limit_lower)./(grid.size.-1)
95
9d53ecca34f7 Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
91
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
92
381
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
93 """
406
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
94 inverse_spacing(grid::EquidistantGrid)
381
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
95
909
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
96 The reciprocal of the spacing between grid points.
381
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
97 """
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
98 inverse_spacing(grid::EquidistantGrid) = 1 ./ spacing(grid)
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
99
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
100
406
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
101 """
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
102 points(grid::EquidistantGrid)
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
103
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
104 The point of the grid as an array of tuples with the same dimension as the grid.
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
105 The points are stored as [(x1,y1), (x1,y2), … (x1,yn);
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
106 (x2,y1), (x2,y2), … (x2,yn);
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
107 ⋮ ⋮ ⋮
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
108 (xm,y1), (xm,y2), … (xm,yn)]
c377fc37c04b Clean up EquidistantGrid and tests after deciding that side lengths must be positive.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 405
diff changeset
109 """
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
110 function points(grid::EquidistantGrid)
124
631eb9b35d72 Make grid spacing a property of EquidistantGrid. Create plotting module for sbplib.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 95
diff changeset
111 indices = Tuple.(CartesianIndices(grid.size))
130
155bbecf18bb Fix bug in points(::EquidistantGrid)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
112 h = spacing(grid)
155bbecf18bb Fix bug in points(::EquidistantGrid)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
113 return broadcast(I -> grid.limit_lower .+ (I.-1).*h, indices)
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
114 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
115
353
8257cc75ea6b Add doc string and allow picking several dimensions
Jonatan Werpers <jonatan@werpers.com>
parents: 352
diff changeset
116 """
358
64ad8ec0eae0 Change name from subgrid to restrict
Jonatan Werpers <jonatan@werpers.com>
parents: 353
diff changeset
117 restrict(::EquidistantGrid, dim)
353
8257cc75ea6b Add doc string and allow picking several dimensions
Jonatan Werpers <jonatan@werpers.com>
parents: 352
diff changeset
118
909
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
119 Pick out given dimensions from the grid and return a grid for them.
353
8257cc75ea6b Add doc string and allow picking several dimensions
Jonatan Werpers <jonatan@werpers.com>
parents: 352
diff changeset
120 """
358
64ad8ec0eae0 Change name from subgrid to restrict
Jonatan Werpers <jonatan@werpers.com>
parents: 353
diff changeset
121 function restrict(grid::EquidistantGrid, dim)
352
a18bd337a280 Add function for getting a one dimensional grid for a given dimension from a equidistant grid
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
122 size = grid.size[dim]
a18bd337a280 Add function for getting a one dimensional grid for a given dimension from a equidistant grid
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
123 limit_lower = grid.limit_lower[dim]
a18bd337a280 Add function for getting a one dimensional grid for a given dimension from a equidistant grid
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
124 limit_upper = grid.limit_upper[dim]
a18bd337a280 Add function for getting a one dimensional grid for a given dimension from a equidistant grid
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
125
a18bd337a280 Add function for getting a one dimensional grid for a given dimension from a equidistant grid
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
126 return EquidistantGrid(size, limit_lower, limit_upper)
a18bd337a280 Add function for getting a one dimensional grid for a given dimension from a equidistant grid
Jonatan Werpers <jonatan@werpers.com>
parents: 333
diff changeset
127 end
658
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
128
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
129
1113
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
130 """
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
131 orthogonal_dims(grid::EquidistantGrid,dim)
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
132
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
133 Returns the dimensions of grid orthogonal to that of dim.
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
134 """
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
135 function orthogonal_dims(grid::EquidistantGrid, dim)
1114
fc57804c9bf4 Add function dims
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1113
diff changeset
136 orth_dims = filter(i -> i != dim, dims(grid))
fc57804c9bf4 Add function dims
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1113
diff changeset
137 if orth_dims == dims(grid)
1113
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
138 throw(DomainError(string("dimension ",string(dim)," not matching grid")))
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
139 end
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
140 return orth_dims
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
141 end
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
142
1111
5b3d4a8ec3ab Change to using filter for picking out orthogonal dimensions
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 909
diff changeset
143
658
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
144 """
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
145 boundary_identifiers(::EquidistantGrid)
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
146
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
147 Returns a tuple containing the boundary identifiers for the grid, stored as
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
148 (CartesianBoundary(1,Lower),
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
149 CartesianBoundary(1,Upper),
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
150 CartesianBoundary(2,Lower),
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
151 ...)
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
152 """
1128
dfbd62c7eb09 Rename dim to ndims in Grids.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1126
diff changeset
153 boundary_identifiers(g::EquidistantGrid) = (((ntuple(i->(CartesianBoundary{i,Lower}(),CartesianBoundary{i,Upper}()),ndims(g)))...)...,)
680
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
154
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
155
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
156 """
1111
5b3d4a8ec3ab Change to using filter for picking out orthogonal dimensions
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 909
diff changeset
157 boundary_grid(grid::EquidistantGrid, id::CartesianBoundary)
680
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
158
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
159 Creates the lower-dimensional restriciton of `grid` spanned by the dimensions
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
160 orthogonal to the boundary specified by `id`. The boundary grid of a 1-dimensional
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
161 grid is a zero-dimensional grid.
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
162 """
1111
5b3d4a8ec3ab Change to using filter for picking out orthogonal dimensions
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 909
diff changeset
163 function boundary_grid(grid::EquidistantGrid, id::CartesianBoundary)
1113
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
164 orth_dims = orthogonal_dims(grid, dim(id))
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
165 return restrict(grid, orth_dims)
680
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
166 end
686
27dcac8fb350 Fix type parameter for a 0-dimensional grid and update docs
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 684
diff changeset
167 boundary_grid(::EquidistantGrid{1,T},::CartesianBoundary{1}) where T = EquidistantGrid{T}()
877
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
168
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
169
1113
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
170 """
877
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
171 refine(grid::EquidistantGrid, r::Int)
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
172
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
173 Refines `grid` by a factor `r`. The factor is applied to the number of
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
174 intervals which is 1 less than the size of the grid.
908
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
175
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
176 See also: [`coarsen`](@ref)
877
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
177 """
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
178 function refine(grid::EquidistantGrid, r::Int)
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
179 sz = size(grid)
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
180 new_sz = (sz .- 1).*r .+ 1
1128
dfbd62c7eb09 Rename dim to ndims in Grids.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1126
diff changeset
181 return EquidistantGrid{ndims(grid), eltype(grid)}(new_sz, grid.limit_lower, grid.limit_upper)
877
dd2ab001a7b6 Implement refine function, move exports to the top of the file, change location of constuctors.
Jonatan Werpers <jonatan@werpers.com>
parents: 688
diff changeset
182 end
907
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
183
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
184
908
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
185 """
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
186 coarsen(grid::EquidistantGrid, r::Int)
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
187
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
188 Coarsens `grid` by a factor `r`. The factor is applied to the number of
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
189 intervals which is 1 less than the size of the grid. If the number of
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
190 intervals are not divisible by `r` an error is raised.
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
191
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
192 See also: [`refine`](@ref)
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
193 """
907
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
194 function coarsen(grid::EquidistantGrid, r::Int)
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
195 sz = size(grid)
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
196
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
197 if !all(n -> (n % r == 0), sz.-1)
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
198 throw(DomainError(r, "Size minus 1 must be divisible by the ratio."))
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
199 end
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
200
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
201 new_sz = (sz .- 1).÷r .+ 1
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
202
1128
dfbd62c7eb09 Rename dim to ndims in Grids.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1126
diff changeset
203 return EquidistantGrid{ndims(grid), eltype(grid)}(new_sz, grid.limit_lower, grid.limit_upper)
907
e81b89ae17c4 Add coarsen()
Jonatan Werpers <jonatan@werpers.com>
parents: 877
diff changeset
204 end