annotate EquidistantGrid.jl @ 71:18d0d794d3bb cell_based_test

Make stencils respond to @ inbounds
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 18 Jan 2019 14:21:58 +0100
parents a88222fc01de
children 8d505e9bc715
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).
64
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
6
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
7 struct EquidistantGrid{Dim,T<:Real} <: AbstractGrid
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
8 numberOfPointsPerDim::NTuple{Dim, Int} # First coordinate direction stored first, then
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
9
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
10 limit_lower::NTuple{Dim, T}
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
11 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
12
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
13 # General constructor
64
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
14 function EquidistantGrid(nPointsPerDim::NTuple{Dim, Int}, limit_lower::NTuple{Dim, T}, limit_upper::NTuple{Dim, T}) where Dim where T
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
15 @assert all(nPointsPerDim.>0)
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
16 @assert all(limit_upper.-limit_lower .!= 0)
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
17 return new{Dim,T}(nPointsPerDim, 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
18 end
64
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
19
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
20 # # 1D constructor which can be called as EquidistantGrid(m, (xl,xr))
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
21 # function EquidistantGrid(nPointsPerDim::Integer, lims::NTuple{2,Real})
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
22 # return EquidistantGrid((nPointsPerDim,), ((lims[1],),(lims[2],)))
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
23 # end
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
24
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
25 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
27 # 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
28 #
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
29 # @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
30 # @Return: numberOfPoints - The number of dimensions
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
31 function numberOfDimensions(grid::EquidistantGrid)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
32 return length(grid.numberOfPointsPerDim)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
33 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
34
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
35 # Computes the total number of points of an EquidistantGrid.
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36 #
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37 # @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
38 # @Return: numberOfPoints - The total number of points
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39 function numberOfPoints(grid::EquidistantGrid)
64
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
40 return prod(grid.numberOfPointsPerDim)
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
42
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
43 # Computes the grid spacing of an EquidistantGrid, i.e the unsigned distance
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
44 # between two points for each coordinate direction.
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 #
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
46 # @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
47 # @Return: h̄ - Grid spacing for each coordinate direction stored in a tuple.
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
48 function spacings(grid::EquidistantGrid)
64
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
49 return abs.(grid.limit_upper.-grid.limit_lower)./(grid.numberOfPointsPerDim.-1)
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
50 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
52 # Computes the points of an EquidistantGrid as a vector of tuples. The vector is ordered
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
53 # such that points in the first coordinate direction varies first, then the second
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54 # and lastely the third (if applicable)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
55 #
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
56 # @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
57 # @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
58 function points(grid::EquidistantGrid)
64
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
59 dx̄ = (grid.limit_upper.-grid.limit_lower)./(grid.numberOfPointsPerDim.-1)
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60
64
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
61 points = Vector{typeof(dx̄)}(undef, numberOfPoints(grid))
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62 # Compute the points based on their Cartesian indices and the signed
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 # grid spacings
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64 cartesianIndices = CartesianIndices(grid.numberOfPointsPerDim)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
65 for i ∈ 1:numberOfPoints(grid)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
66 ci = Tuple(cartesianIndices[i]) .-1
64
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
67 points[i] = grid.limit_lower .+ dx̄.*ci
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
68 end
64
a88222fc01de Make EquidistantGrid more concrete
Jonatan Werpers <jonatan@werpers.com>
parents: 63
diff changeset
69
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
70 # TBD: Keep? this? How do we want to represent points in 1D?
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
71 if numberOfDimensions(grid) == 1
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
72 points = broadcast(x -> x[1], points)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
73 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
74 return points
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
75 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
76
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
77 function pointsalongdim(grid::EquidistantGrid, dim::Integer)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
78 @assert dim<=numberOfDimensions(grid)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
79 @assert dim>0
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
80 points = range(grid.limits[1][dim],stop=grid.limits[2][dim],length=grid.numberOfPointsPerDim[dim])
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
81 end
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
82
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
83 using PyPlot, PyCall
53
8c6db1f6d8e0 Save plot to file when calling plotgridfunction, until figuring out how to set up an interactive gui backend for matplotlib in julia.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 51
diff changeset
84 #pygui(:qt)
8c6db1f6d8e0 Save plot to file when calling plotgridfunction, until figuring out how to set up an interactive gui backend for matplotlib in julia.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 51
diff changeset
85 #using Plots; pyplot()
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
86
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
87 function plotgridfunction(grid::EquidistantGrid, gridfunction)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
88 if numberOfDimensions(grid) == 1
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
89 plot(pointsalongdim(grid,1), gridfunction, linewidth=2.0)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
90 elseif numberOfDimensions(grid) == 2
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
91 mx = grid.numberOfPointsPerDim[1];
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
92 my = grid.numberOfPointsPerDim[2];
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
93 x = pointsalongdim(grid,1)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
94 X = repeat(x,1,my)
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
95 y = pointsalongdim(grid,2)
53
8c6db1f6d8e0 Save plot to file when calling plotgridfunction, until figuring out how to set up an interactive gui backend for matplotlib in julia.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 51
diff changeset
96 Y = permutedims(repeat(y,1,mx))
8c6db1f6d8e0 Save plot to file when calling plotgridfunction, until figuring out how to set up an interactive gui backend for matplotlib in julia.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 51
diff changeset
97 plot_surface(X,Y,reshape(gridfunction,mx,my))
8c6db1f6d8e0 Save plot to file when calling plotgridfunction, until figuring out how to set up an interactive gui backend for matplotlib in julia.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 51
diff changeset
98 # fig = figure()
8c6db1f6d8e0 Save plot to file when calling plotgridfunction, until figuring out how to set up an interactive gui backend for matplotlib in julia.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 51
diff changeset
99 # ax = fig[:add_subplot](1,1,1, projection = "3d")
8c6db1f6d8e0 Save plot to file when calling plotgridfunction, until figuring out how to set up an interactive gui backend for matplotlib in julia.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 51
diff changeset
100 # ax[:plot_surface](X,Y,reshape(gridfunction,mx,my))
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
101 else
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
102 error(string("Plot not implemented for dimension ", string(numberOfDimensions(grid))))
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
103 end
53
8c6db1f6d8e0 Save plot to file when calling plotgridfunction, until figuring out how to set up an interactive gui backend for matplotlib in julia.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents: 51
diff changeset
104 savefig("gridfunction")
51
614b56a017b9 Split grid.jl into AbstractGrid.jl and EquidistantGrid.jl
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
105 end