Mercurial > repos > public > sbplib_julia
annotate grid.jl @ 21:2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Additional:
- Implement function calculating the grid spacing of a equidistant grid
- Change members of EquidistantGrid from vectors to tuples
- Add a 1D constructor for convenience
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Tue, 18 Dec 2018 13:27:25 +0100 |
parents | af8469bc1cb3 |
children | f2dc3e09fffc |
rev | line source |
---|---|
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
1 module grid |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
2 |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
3 abstract type Grid end |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
4 |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
5 function numberOfDimensions(grid::Grid) |
16
c61af27cb67a
Fix compile errors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
15
diff
changeset
|
6 error("Not yet implemented") |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
7 end |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
8 |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
9 function numberOfPoints(grid::Grid) |
16
c61af27cb67a
Fix compile errors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
15
diff
changeset
|
10 error("Not yet implemented") |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
11 end |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
12 |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
13 function points(grid::Grid) |
16
c61af27cb67a
Fix compile errors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
15
diff
changeset
|
14 error("Not yet implemented") |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
15 end |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
16 |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
17 abstract type BoundaryId end |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
18 |
21
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
19 # TODO: Move to seperate file. |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
20 # Prefer to use UInt here, but printing UInt returns hex. |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
21 struct EquidistantGrid <: Grid |
21
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
22 numberOfPointsPerDim::Tuple |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
23 limits::NTuple{2,Tuple} # Stores the points at the lower and upper corner of the domain. |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
24 # e.g (-1,0) and (1,2) for a domain of size (-1,1)x(0,2) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
25 |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
26 # General constructor |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
27 function EquidistantGrid(nPointsPerDim::Tuple, lims::NTuple{2,Tuple}) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
28 @assert length(nPointsPerDim) > 0 |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
29 @assert count(x -> x > 0, nPointsPerDim) == length(nPointsPerDim) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
30 @assert length(lims[1]) == length(nPointsPerDim) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
31 @assert length(lims[2]) == length(nPointsPerDim) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
32 # TODO: Assert that the same values are not passed in both lims[1] and lims[2] |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
33 # i.e the domain length is positive for all dimensions |
19
af8469bc1cb3
Implement function returning points of grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
16
diff
changeset
|
34 return new(nPointsPerDim, lims) |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
35 end |
21
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
36 # 1D constructor which can be called as EquidistantGrid(m, (x_l,x_r)) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
37 function EquidistantGrid(nPointsPerDim::Int, lims::NTuple{2,Int}) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
38 return EquidistantGrid((nPointsPerDim,), ((lims[1],),(lims[2],))) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
39 end |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
40 |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
41 end |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
42 |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
43 function numberOfDimensions(grid::EquidistantGrid) |
21
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
44 return length(grid.numberOfPointsPerDim) |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
45 end |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
46 |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
47 function numberOfPoints(grid::EquidistantGrid) |
21
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
48 numberOfPoints = grid.numberOfPointsPerDim[1]; |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
49 for i = 2:length(grid.numberOfPointsPerDim); |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
50 numberOfPoints = numberOfPoints*grid.numberOfPointsPerDim[i] |
19
af8469bc1cb3
Implement function returning points of grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
16
diff
changeset
|
51 end |
af8469bc1cb3
Implement function returning points of grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
16
diff
changeset
|
52 return numberOfPoints |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
53 end |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
54 |
21
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
55 # TODO: Decide if spacings should be positive or if it is allowed to be negative |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
56 # If defined as positive, then need to do something extra when calculating the |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
57 # points. The current implementation works for |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
58 function spacings(grid::EquidistantGrid) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
59 h = Vector{Real}(undef, numberOfDimensions(grid)) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
60 for i ∈ eachindex(h) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
61 h[i] = (grid.limits[2][i]-grid.limits[1][i])/(grid.numberOfPointsPerDim[i]-1) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
62 end |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
63 return Tuple(h) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
64 end |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
65 |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
66 function points(grid::EquidistantGrid) |
21
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
67 nPoints = numberOfPoints(grid) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
68 points = Vector{NTuple{numberOfDimensions(grid),Real}}(undef, nPoints) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
69 cartesianIndices = CartesianIndices(grid.numberOfPointsPerDim) |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
70 for i ∈ 1:nPoints |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
71 ci = Tuple(cartesianIndices[i]) .-1 |
2dbdd00eaea0
Implement function returing the points of a EquidistantGrid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
19
diff
changeset
|
72 points[i] = grid.limits[1] .+ spacings(grid).*ci |
19
af8469bc1cb3
Implement function returning points of grid
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
16
diff
changeset
|
73 end |
16
c61af27cb67a
Fix compile errors
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
15
diff
changeset
|
74 return points |
14
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
75 end |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
76 |
b11b67c02d1a
Started implementing grids
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
0
diff
changeset
|
77 end |