annotate src/Grids/equidistant_grid.jl @ 1222:5f677cd6f0b6 refactor/grids

Start refactoring
author Jonatan Werpers <jonatan@werpers.com>
date Sat, 18 Feb 2023 11:37:35 +0100
parents 50b008d2e937
children 2abec782cf5b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
1 struct EquidistantGrid{T,R<:AbstractRange{T}} <: Grid{T,1,1}
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
2 points::R
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
3 end
75
93c833019857 Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 74
diff changeset
4
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
5 Base.eltype(g::EquidistantGrid{T}) where T = T
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
6 Base.getindex(g::EquidistantGrid, i) = g.points[i]
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
7 Base.size(g::EquidistantGrid) = size(g.points)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
8 Base.length(g::EquidistantGrid) = length(g.points)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
9 Base.eachindex(g::EquidistantGrid) = eachindex(g.points)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
10
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
11 # TODO: Make sure collect works!
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
12
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
13
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
14 """
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
15 spacing(grid::EquidistantGrid)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
16
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
17 The spacing between grid points.
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
18 """
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
19 spacing(g::EquidistantGrid) = step(g.points)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
20
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
21
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
22 """
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
23 inverse_spacing(grid::EquidistantGrid)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
24
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
25 The reciprocal of the spacing between grid points.
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
26 """
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
27 inverse_spacing(g::EquidistantGrid) = 1/step(g.points)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
28
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
29
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
30 boundary_identifiers(::EquidistantGrid) = (Lower(), Upper())
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
31 boundary_grid(g::EquidistantGrid, id::Lower) = ZeroDimGrid(g[begin])
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
32 boundary_grid(g::EquidistantGrid, id::Upper) = ZeroDimGrid(g[end])
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
33
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
34
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
35 """
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
36 refine(g::EquidistantGrid, r::Int)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
37
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
38 Refines `grid` by a factor `r`. The factor is applied to the number of
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
39 intervals which is 1 less than the size of the grid.
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
40
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
41 See also: [`coarsen`](@ref)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
42 """
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
43 function refine(g::EquidistantGrid, r::Int)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
44 new_sz = (length(g) - 1)*r + 1
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
45 return EquidistantGrid(change_length(g.points, new_sz))
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
46 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
47
909
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
48 """
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
49 coarsen(grid::EquidistantGrid, r::Int)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
50
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
51 Coarsens `grid` by a factor `r`. The factor is applied to the number of
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
52 intervals which is 1 less than the size of the grid. If the number of
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
53 intervals are not divisible by `r` an error is raised.
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
54
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
55 See also: [`refine`](@ref)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
56 """
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
57 function coarsen(g::EquidistantGrid, r::Int)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
58 if (length(g)-1)%r != 0
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
59 throw(DomainError(r, "Size minus 1 must be divisible by the ratio."))
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
60 end
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
61
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
62 new_sz = (length(g) - 1)÷r + 1
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
63
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
64 return EquidistantGrid(change_length(g.points), new_sz)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
65 end
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
66
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
67
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
68
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
69
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
70
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
71
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
72
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
73 """
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
74 equidistant_grid(size::Dims, limit_lower, limit_upper)
909
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
75
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
76 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
77 `limit_upper`.
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
78
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
79 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
80 `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
81 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
82
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
83 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
84 by the tuple `size`.
b900fea1c057 Clean up the docs a bit
Jonatan Werpers <jonatan@werpers.com>
parents: 908
diff changeset
85 """
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
86 function equidistant_grid(size::Dims, limit_lower, limit_upper)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
87 gs = map(size, limit_lower, limit_upper) do s,l,u
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
88 EquidistantGrid(range(l, u, length=s)) # TBD: Should it use LinRange instead?
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
89 end
381
dacbcba33d7d Refactor EquidistantGrid to not store spacing or inverse spacing
Jonatan Werpers <jonatan@werpers.com>
parents: 358
diff changeset
90
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
91 return TensorGrid(gs...)
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
92 end
658
26b0eb83aea4 Add function for getting boundary identifiers from equidistant grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 406
diff changeset
93
1116
c2d7e940639e Rename AbstractGrid to Grid and clean up Grids module
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1115
diff changeset
94
1113
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
95 """
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
96 equidistant_grid(size::Int, limit_lower::T, limit_upper::T)
1113
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
97
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
98 Constructs a 1D equidistant grid.
1113
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
99 """
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
100 function equidistant_grid(size::Int, limit_lower::T, limit_upper::T) where T
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
101 return equidistant_grid((size,),(limit_lower,),(limit_upper,))
1113
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
102 end
4e4c5011140d Add functions orthogonal_dims and boundary_size
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 1111
diff changeset
103
1111
5b3d4a8ec3ab Change to using filter for picking out orthogonal dimensions
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 909
diff changeset
104
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
105
1d3e29ffc6c6 Add support for 0-dimensional grid, and add method boundary_grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 661
diff changeset
106 """
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
107 change_length(::AbstractRange, n)
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
108
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
109 Change the length of a range to `n`, keeping the same start and stop.
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
110 """
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
111 function change_length(::AbstractRange, n) end
908
bc71dd5b8311 More docs
Jonatan Werpers <jonatan@werpers.com>
parents: 907
diff changeset
112
1222
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
113 change_length(r::LinRange, n) = LinRange(r[begin], r[end], n)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
114 change_length(r::StepRangeLen, n) = range(r[begin], r[end], n)
5f677cd6f0b6 Start refactoring
Jonatan Werpers <jonatan@werpers.com>
parents: 1156
diff changeset
115 # TODO: Test the above