annotate src/Grids/mapped_grid.jl @ 1773:08e52f442872 feature/grids/curvilinear

Replace AbstractArray{<:Any,2} with AbstractMatrix{<:Any}
author Jonatan Werpers <jonatan@werpers.com>
date Sun, 15 Sep 2024 18:00:40 +0200
parents 672897f64d58
children 035af82f559a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
1 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
2 MappedGrid{T,D} <: Grid{T,D}
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
3
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
4 A grid defined by a coordinate mapping from a logical grid to some physical
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
5 coordinates. The physical coordinates and the Jacobian are stored as grid
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
6 functions corresponding to the logical grid.
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
7
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
8 See also: [`logicalgrid`](@ref), [`jacobian`](@ref), [`metric_tensor`](@ref).
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
9 """
1773
08e52f442872 Replace AbstractArray{<:Any,2} with AbstractMatrix{<:Any}
Jonatan Werpers <jonatan@werpers.com>
parents: 1768
diff changeset
10 struct MappedGrid{T,D, GT<:Grid{<:Any,D}, CT<:AbstractArray{T,D}, JT<:AbstractArray{<:AbstractMatrix{<:Any}, D}} <: Grid{T,D}
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
11 logicalgrid::GT
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
12 physicalcoordinates::CT
1505
63101a1cd0e6 Remove some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1504
diff changeset
13 jacobian::JT
1743
49bd573ab07f Implement checking of sizes for inputs to MappedGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 1741
diff changeset
14
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
15 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
16 MappedGrid(logicalgrid, physicalcoordinates, jacobian)
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
17
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
18 A MappedGrid with the given physical coordinates and jacobian.
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
19 """
1773
08e52f442872 Replace AbstractArray{<:Any,2} with AbstractMatrix{<:Any}
Jonatan Werpers <jonatan@werpers.com>
parents: 1768
diff changeset
20 function MappedGrid(logicalgrid::GT, physicalcoordinates::CT, jacobian::JT) where {T,D, GT<:Grid{<:Any,D}, CT<:AbstractArray{T,D}, JT<:AbstractArray{<:AbstractMatrix{<:Any}, D}}
1743
49bd573ab07f Implement checking of sizes for inputs to MappedGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 1741
diff changeset
21 if !(size(logicalgrid) == size(physicalcoordinates) == size(jacobian))
49bd573ab07f Implement checking of sizes for inputs to MappedGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 1741
diff changeset
22 throw(ArgumentError("Sizes must match"))
49bd573ab07f Implement checking of sizes for inputs to MappedGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 1741
diff changeset
23 end
49bd573ab07f Implement checking of sizes for inputs to MappedGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 1741
diff changeset
24
1744
c38eead8be17 Add checks for the size of the jacobian
Jonatan Werpers <jonatan@werpers.com>
parents: 1743
diff changeset
25 if size(first(jacobian)) != (length(first(physicalcoordinates)),D)
c38eead8be17 Add checks for the size of the jacobian
Jonatan Werpers <jonatan@werpers.com>
parents: 1743
diff changeset
26 throw(ArgumentError("The size of the jacobian must match the dimensions of the grid and coordinates"))
c38eead8be17 Add checks for the size of the jacobian
Jonatan Werpers <jonatan@werpers.com>
parents: 1743
diff changeset
27 end
c38eead8be17 Add checks for the size of the jacobian
Jonatan Werpers <jonatan@werpers.com>
parents: 1743
diff changeset
28
1743
49bd573ab07f Implement checking of sizes for inputs to MappedGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 1741
diff changeset
29 return new{T,D,GT,CT,JT}(logicalgrid, physicalcoordinates, jacobian)
49bd573ab07f Implement checking of sizes for inputs to MappedGrid
Jonatan Werpers <jonatan@werpers.com>
parents: 1741
diff changeset
30 end
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
31 end
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
32
1705
4870fc3faa25 Add tests for equallity of mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1704
diff changeset
33 function Base.:(==)(a::MappedGrid, b::MappedGrid)
4870fc3faa25 Add tests for equallity of mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1704
diff changeset
34 same_logicalgrid = logicalgrid(a) == logicalgrid(b)
4870fc3faa25 Add tests for equallity of mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1704
diff changeset
35 same_coordinates = collect(a) == collect(b)
4870fc3faa25 Add tests for equallity of mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1704
diff changeset
36 same_jacobian = jacobian(a) == jacobian(b)
4870fc3faa25 Add tests for equallity of mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1704
diff changeset
37
4870fc3faa25 Add tests for equallity of mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1704
diff changeset
38 return same_logicalgrid && same_coordinates && same_jacobian
4870fc3faa25 Add tests for equallity of mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1704
diff changeset
39 end
4870fc3faa25 Add tests for equallity of mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1704
diff changeset
40
1752
c98d9c528a22 Review: Added review comments to Grids.jl and mapped_grid.jl
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1749
diff changeset
41 # Review: rename function logicalgrid to logical_grid
c98d9c528a22 Review: Added review comments to Grids.jl and mapped_grid.jl
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1749
diff changeset
42 # for consistency with mapped_grid.
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
43 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
44 logicalgrid(g::MappedGrid)
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
45
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
46 The logical grid of `g`.
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
47 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
48 logicalgrid(g::MappedGrid) = g.logicalgrid
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
49
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
50 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
51 jacobian(g::MappedGrid)
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
52
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
53 The Jacobian matrix of `g` as a grid function.
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
54 """
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
55 jacobian(g::MappedGrid) = g.jacobian
1431
6adf31ba6cfd Add `jacobian` and `logicalgrid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1430
diff changeset
56
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
57
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
58 # Indexing interface
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
59 Base.getindex(g::MappedGrid, I::Vararg{Int}) = g.physicalcoordinates[I...]
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
60 Base.eachindex(g::MappedGrid) = eachindex(g.logicalgrid)
1432
64b60b42d367 Implement indexing interface
Jonatan Werpers <jonatan@werpers.com>
parents: 1431
diff changeset
61
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
62 Base.firstindex(g::MappedGrid, d) = firstindex(g.logicalgrid, d)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
63 Base.lastindex(g::MappedGrid, d) = lastindex(g.logicalgrid, d)
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
64
1450
647c8b18b84f Implement iterator interface
Jonatan Werpers <jonatan@werpers.com>
parents: 1449
diff changeset
65 # Iteration interface
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
66 Base.iterate(g::MappedGrid) = iterate(g.physicalcoordinates)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
67 Base.iterate(g::MappedGrid, state) = iterate(g.physicalcoordinates, state)
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
68
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
69 Base.IteratorSize(::Type{<:MappedGrid{<:Any, D}}) where D = Base.HasShape{D}()
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
70 Base.length(g::MappedGrid) = length(g.logicalgrid)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
71 Base.size(g::MappedGrid) = size(g.logicalgrid)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
72 Base.size(g::MappedGrid, d) = size(g.logicalgrid, d)
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
73
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
74 boundary_identifiers(g::MappedGrid) = boundary_identifiers(g.logicalgrid)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
75 boundary_indices(g::MappedGrid, id::TensorGridBoundary) = boundary_indices(g.logicalgrid, id)
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
76
1768
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
77 # Review: Error when calling plot(boundary_grid(g, id))
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
78 # Currently need to collect first, i.e., plot(collect(boundary_grid(g, id)))
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
79 function boundary_grid(g::MappedGrid, id::TensorGridBoundary)
1451
2e08f3444354 Implement boundary_identifiers, and a wishful implementation of boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1450
diff changeset
80 b_indices = boundary_indices(g.logicalgrid, id)
1503
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
81
1504
976f5784d7b9 Spelling
Jonatan Werpers <jonatan@werpers.com>
parents: 1503
diff changeset
82 # Calculate indices of needed jacobian components
1503
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
83 D = ndims(g)
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
84 all_indices = SVector{D}(1:D)
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
85 free_variable_indices = deleteat(all_indices, grid_id(id))
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
86 jacobian_components = (:, free_variable_indices)
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
87
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
88 # Create grid function for boundary grid jacobian
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
89 boundary_jacobian = componentview((@view g.jacobian[b_indices...]) , jacobian_components...)
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
90 boundary_physicalcoordinates = @view g.physicalcoordinates[b_indices...]
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
91
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
92 return MappedGrid(
1451
2e08f3444354 Implement boundary_identifiers, and a wishful implementation of boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1450
diff changeset
93 boundary_grid(g.logicalgrid, id),
1503
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
94 boundary_physicalcoordinates,
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
95 boundary_jacobian,
1451
2e08f3444354 Implement boundary_identifiers, and a wishful implementation of boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1450
diff changeset
96 )
2e08f3444354 Implement boundary_identifiers, and a wishful implementation of boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1450
diff changeset
97 end
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
98
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
99
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
100 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
101 mapped_grid(x, J, size::Vararg{Int})
1527
69790e9d1652 Remove tests for refine and coarsen
Jonatan Werpers <jonatan@werpers.com>
parents: 1506
diff changeset
102
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
103 A `MappedGrid` with a default logical grid on a unit hyper box. `x` and `J`
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
104 are functions to be evaluated on the logical grid and `size` determines the
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
105 size of the logical grid.
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
106 """
1706
11640aa3e348 Add method and refactor mapped_grid()
Jonatan Werpers <jonatan@werpers.com>
parents: 1705
diff changeset
107 function mapped_grid(x, J, size::Vararg{Int})
1502
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
108 D = length(size)
1570
063a2bfb03da Fix bugs in calls to equidistant_grid after merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 1560
diff changeset
109 lg = equidistant_grid(ntuple(i->0., D), ntuple(i->1., D), size...)
1706
11640aa3e348 Add method and refactor mapped_grid()
Jonatan Werpers <jonatan@werpers.com>
parents: 1705
diff changeset
110 return mapped_grid(lg, x, J)
11640aa3e348 Add method and refactor mapped_grid()
Jonatan Werpers <jonatan@werpers.com>
parents: 1705
diff changeset
111 end
11640aa3e348 Add method and refactor mapped_grid()
Jonatan Werpers <jonatan@werpers.com>
parents: 1705
diff changeset
112
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
113 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
114 mapped_grid(lg::Grid, x, J)
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
115
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
116 A `MappedGrid` with logical grid `lg`. Physical coordinates and Jacobian are
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
117 determined by the functions `x` and `J`.
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
118 """
1706
11640aa3e348 Add method and refactor mapped_grid()
Jonatan Werpers <jonatan@werpers.com>
parents: 1705
diff changeset
119 function mapped_grid(lg::Grid, x, J)
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
120 return MappedGrid(
1502
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
121 lg,
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
122 map(x,lg),
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
123 map(J,lg),
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
124 )
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
125 end
1560
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
126
1768
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
127 # Review: Error when calling jacobian_determinant(boundary_grid(g,id))
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
128 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
129 jacobian_determinant(g::MappedGrid)
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
130
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
131 The jacobian determinant of `g` as a grid function.
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
132 """
1560
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
133 function jacobian_determinant(g::MappedGrid)
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
134 return map(jacobian(g)) do ∂x∂ξ
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
135 det(∂x∂ξ)
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
136 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
137 end
1741
248304f88e49 Add TBD for deciding about what jacobian_determinant should mean for Rn->Rm grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1736
diff changeset
138 # TBD: Should this be changed to calculate sqrt(g) instead?
248304f88e49 Add TBD for deciding about what jacobian_determinant should mean for Rn->Rm grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1736
diff changeset
139 # This would make it well defined also for n-dim grids embedded in higher dimensions.
248304f88e49 Add TBD for deciding about what jacobian_determinant should mean for Rn->Rm grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1736
diff changeset
140 # TBD: Is there a better name? metric_determinant?
1745
2f7974367cd3 Add TBD
Jonatan Werpers <jonatan@werpers.com>
parents: 1744
diff changeset
141 # TBD: Is the best option to delete it?
1752
c98d9c528a22 Review: Added review comments to Grids.jl and mapped_grid.jl
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1749
diff changeset
142 # Review: I don't think we should delete it. Users building their own
c98d9c528a22 Review: Added review comments to Grids.jl and mapped_grid.jl
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1749
diff changeset
143 # curvilinear operators will need the functionality. Also the
c98d9c528a22 Review: Added review comments to Grids.jl and mapped_grid.jl
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1749
diff changeset
144 # determinant of the jacobian (and not its square root) is required
c98d9c528a22 Review: Added review comments to Grids.jl and mapped_grid.jl
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1749
diff changeset
145 # for quadratures on mapped grids right? For that reason I think we should
c98d9c528a22 Review: Added review comments to Grids.jl and mapped_grid.jl
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1749
diff changeset
146 # keep the function as is. We could provide a function for the square root
c98d9c528a22 Review: Added review comments to Grids.jl and mapped_grid.jl
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1749
diff changeset
147 # as well if we think it would be helpfull. Regarding naming, perhaps
c98d9c528a22 Review: Added review comments to Grids.jl and mapped_grid.jl
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1749
diff changeset
148 # metric_determinant is better?
1560
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
149
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
150 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
151 metric_tensor(g::MappedGrid)
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
152
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
153 The metric tensor of `g` as a grid function.
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
154 """
1682
4ce9cb21220c Fix naming of metrix tensor functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1681
diff changeset
155 function metric_tensor(g::MappedGrid)
1560
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
156 return map(jacobian(g)) do ∂x∂ξ
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
157 ∂x∂ξ'*∂x∂ξ
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
158 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
159 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
160
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
161 """
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
162 metric_tensor_inverse(g::MappedGrid)
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
163
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
164 The inverse of the metric tensor of `g` as a grid function.
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
165 """
1682
4ce9cb21220c Fix naming of metrix tensor functions
Jonatan Werpers <jonatan@werpers.com>
parents: 1681
diff changeset
166 function metric_tensor_inverse(g::MappedGrid)
1560
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
167 return map(jacobian(g)) do ∂x∂ξ
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
168 inv(∂x∂ξ'*∂x∂ξ)
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
169 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
170 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
171
1684
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
172 function min_spacing(g::MappedGrid{T,1} where T)
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
173 n, = size(g)
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
174
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
175 ms = Inf
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
176 for i ∈ 1:n-1
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
177 ms = min(ms, norm(g[i+1]-g[i]))
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
178 end
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
179
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
180 return ms
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
181 end
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
182
1688
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
183 function min_spacing(g::MappedGrid{T,2} where T)
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
184 n, m = size(g)
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
185
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
186 ms = Inf
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
187 for i ∈ 1:n-1, j ∈ 1:m-1 # loop over each cell of the grid
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
188
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
189 ms = min(
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
190 ms,
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
191 norm(g[i+1,j]-g[i,j]),
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
192 norm(g[i,j+1]-g[i,j]),
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
193
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
194 norm(g[i+1,j]-g[i+1,j+1]),
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
195 norm(g[i,j+1]-g[i+1,j+1]),
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
196
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
197 norm(g[i+1,j+1]-g[i,j]),
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
198 norm(g[i+1,j]-g[i,j+1]),
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
199 )
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
200 # NOTE: This could be optimized to avoid checking all interior edges twice.
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
201 end
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
202
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
203 return ms
72776d3d5fd6 Add min_spacing for 2D mapped grids
Jonatan Werpers <jonatan@werpers.com>
parents: 1684
diff changeset
204 end
1684
22a9992471be Add min_spacing for mapped 1d grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1682
diff changeset
205
1768
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
206 # Review: I would implement the normal through Nansons formula
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
207 # nⱼ = inv(Jᵧ)*J*Fⱼᵢ*νᵢ
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
208 # where
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
209 # Jᵧ boundary jacobian determiant
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
210 # J is the volume jacobian determinant
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
211 # Fⱼᵢ = dξᵢ/dxⱼ
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
212 # νᵢ normal on logical grid
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
213 # j: indices on physical grid
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
214 # i: indices on logical grid
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
215 # ξ: coordinate vector on logical grid
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
216 # x: coordinate vector on logical grid
672897f64d58 More reivew comments
Vidar Stiernström <vidar.stiernstrom@gmail.com>
parents: 1752
diff changeset
217 # Perhaps the below is equivalent?
1659
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
218 """
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
219 normal(g::MappedGrid, boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
220
1746
44faa334adc6 Add docs
Jonatan Werpers <jonatan@werpers.com>
parents: 1745
diff changeset
221 The outward pointing normal as a grid function on the corresponding boundary grid.
1659
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
222 """
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
223 function normal(g::MappedGrid, boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
224 b_indices = boundary_indices(g, boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
225 σ =_boundary_sign(component_type(g), boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
226 return map(jacobian(g)[b_indices...]) do ∂x∂ξ
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
227 ∂ξ∂x = inv(∂x∂ξ)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
228 k = grid_id(boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
229 σ*∂ξ∂x[k,:]/norm(∂ξ∂x[k,:])
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
230 end
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
231 end
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
232
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
233 function _boundary_sign(T, boundary)
1736
863385aae454 Merge default
Jonatan Werpers <jonatan@werpers.com>
parents: 1706
diff changeset
234 if boundary_id(boundary) == UpperBoundary()
1659
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
235 return one(T)
1736
863385aae454 Merge default
Jonatan Werpers <jonatan@werpers.com>
parents: 1706
diff changeset
236 elseif boundary_id(boundary) == LowerBoundary()
1659
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
237 return -one(T)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
238 else
1736
863385aae454 Merge default
Jonatan Werpers <jonatan@werpers.com>
parents: 1706
diff changeset
239 throw(ArgumentError("The boundary identifier must be either `LowerBoundary()` or `UpperBoundary()`"))
1659
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
240 end
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
241 end