annotate src/Grids/EquidistantGrid.jl @ 352:a18bd337a280 feature/equidistant_grid/subgrid

Add function for getting a one dimensional grid for a given dimension from a equidistant grid
author Jonatan Werpers <jonatan@werpers.com>
date Sun, 27 Sep 2020 14:38:05 +0200
parents 01b851161018
children 8257cc75ea6b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
1 # EquidistantGrid is a grid with equidistant grid spacing per coordinat
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 # direction. The domain is defined through the two points P1 = x̄₁, P2 = x̄₂
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
3 # by the exterior product of the vectors obtained by projecting (x̄₂-x̄₁) onto
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
4 # the coordinate directions. E.g for a 2D grid with x̄₁=(-1,0) and x̄₂=(1,2)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
5 # the domain is defined as (-1,1)x(0,2).
75
93c833019857 Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 74
diff changeset
6
221
235f0a771c8f Make all packages load properly
Jonatan Werpers <jonatan@werpers.com>
parents: 211
diff changeset
7 export EquidistantGrid
235f0a771c8f Make all packages load properly
Jonatan Werpers <jonatan@werpers.com>
parents: 211
diff changeset
8
75
93c833019857 Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 74
diff changeset
9 struct EquidistantGrid{Dim,T<:Real} <: AbstractGrid
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
10 size::NTuple{Dim, Int} # First coordinate direction stored first
75
93c833019857 Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 74
diff changeset
11 limit_lower::NTuple{Dim, T}
93c833019857 Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 74
diff changeset
12 limit_upper::NTuple{Dim, T}
261
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
13 inverse_spacing::NTuple{Dim, T} # Reciprocal of grid spacing
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
14
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
15 # General constructor
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
16 function EquidistantGrid(size::NTuple{Dim, Int}, limit_lower::NTuple{Dim, T}, limit_upper::NTuple{Dim, T}) where Dim where T
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
17 @assert all(size.>0)
75
93c833019857 Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 74
diff changeset
18 @assert all(limit_upper.-limit_lower .!= 0)
268
f67ce2eb6019 Remove property spacing in EquidistantGrid, due to redundancy.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 261
diff changeset
19 inverse_spacing = (size.-1)./ abs.(limit_upper.-limit_lower)
f67ce2eb6019 Remove property spacing in EquidistantGrid, due to redundancy.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 261
diff changeset
20 return new{Dim,T}(size, limit_lower, limit_upper, inverse_spacing)
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
21 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
22 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
23
324
047dee8efaef Grids.EquidistantGrid: Add constructor for 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 270
diff changeset
24 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
25 return EquidistantGrid((size,),(limit_lower,),(limit_upper,))
047dee8efaef Grids.EquidistantGrid: Add constructor for 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 270
diff changeset
26 end
047dee8efaef Grids.EquidistantGrid: Add constructor for 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 270
diff changeset
27
129
1aaeb46ba5f4 Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 124
diff changeset
28 function Base.eachindex(grid::EquidistantGrid)
1aaeb46ba5f4 Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 124
diff changeset
29 CartesianIndices(grid.size)
1aaeb46ba5f4 Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 124
diff changeset
30 end
1aaeb46ba5f4 Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 124
diff changeset
31
241
1128ab4f5758 Add size method to EquidistantGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 221
diff changeset
32 Base.size(g::EquidistantGrid) = g.size
1128ab4f5758 Add size method to EquidistantGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 221
diff changeset
33
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
34 # Returns the number of dimensions of an EquidistantGrid.
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
35 #
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36 # @Input: grid - an 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
37 # @Return: dimension - The dimension of the grid
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
38 function dimension(grid::EquidistantGrid)
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
39 return length(grid.size)
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
40 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41
261
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
42 # Returns the reciprocal of the spacing of the grid
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
43 #
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
44 function inverse_spacing(grid::EquidistantGrid)
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
45 return grid.inverse_spacing
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
46 end
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
47 export inverse_spacing
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
48
01017d2b46b0 Store grid spacing as property in EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 256
diff changeset
49 # Returns the reciprocal of the spacing of the grid
129
1aaeb46ba5f4 Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 124
diff changeset
50 #
270
12b738f260a0 Add todo-comment
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 268
diff changeset
51 # TODO: Evaluate if divisions affect performance
129
1aaeb46ba5f4 Improve efficiency of apply by the following:
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 124
diff changeset
52 function spacing(grid::EquidistantGrid)
268
f67ce2eb6019 Remove property spacing in EquidistantGrid, due to redundancy.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 261
diff changeset
53 return 1.0./grid.inverse_spacing
95
9d53ecca34f7 Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
54 end
256
d8f42733f392 Export spacing() for Equidistant grids
Jonatan Werpers <jonatan@werpers.com>
parents: 241
diff changeset
55 export spacing
95
9d53ecca34f7 Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
56
130
155bbecf18bb Fix bug in points(::EquidistantGrid)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
57 # Computes the points of an EquidistantGrid as an array of tuples with
155bbecf18bb Fix bug in points(::EquidistantGrid)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
58 # the same dimension as the grid.
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 #
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60 # @Input: grid - an EquidistantGrid
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
61 # @Return: points - the points of the grid.
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62 function points(grid::EquidistantGrid)
95
9d53ecca34f7 Switch to using cartesian indicies
Jonatan Werpers <jonatan@werpers.com>
parents: 85
diff changeset
63 # TODO: Make this return an abstract array?
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
64 indices = Tuple.(CartesianIndices(grid.size))
130
155bbecf18bb Fix bug in points(::EquidistantGrid)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
65 h = spacing(grid)
155bbecf18bb Fix bug in points(::EquidistantGrid)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 129
diff changeset
66 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
67 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
68
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
69 function subgrid(grid::EquidistantGrid, dim::Integer)
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
70 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
71 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
72 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
73
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
74 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
75 end
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
76 export subgrid
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
77
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
78 function pointsalongdim(grid::EquidistantGrid, dim::Integer)
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
79 @assert dim<=dimension(grid)
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
80 @assert dim>0
137
99308f68e548 Fix bug in pointsalongdim where an empty range was returned
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 130
diff changeset
81 points = collect(range(grid.limit_lower[dim],stop=grid.limit_upper[dim],length=grid.size[dim]))
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
82 end