Mercurial > repos > public > sbplib_julia
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 |
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 |