comparison src/Grids/mapped_grid.jl @ 1746:44faa334adc6 feature/grids/curvilinear

Add docs
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 11 Sep 2024 14:41:14 +0200
parents 2f7974367cd3
children 03894fd7b132 e4353d5e8fc3
comparison
equal deleted inserted replaced
1745:2f7974367cd3 1746:44faa334adc6
1 """
2 MappedGrid{T,D} <: Grid{T,D}
3
4 A grid defined by a coordinate mapping from a logical grid to some physical
5 coordinates. The physical coordinates and the Jacobian are stored as grid
6 functions corresponding to the logical grid.
7
8 See also: [`logicalgrid`](@ref), [`jacobian`](@ref), [`metric_tensor`](@ref).
9 """
1 struct MappedGrid{T,D, GT<:Grid{<:Any,D}, CT<:AbstractArray{T,D}, JT<:AbstractArray{<:AbstractArray{<:Any, 2}, D}} <: Grid{T,D} 10 struct MappedGrid{T,D, GT<:Grid{<:Any,D}, CT<:AbstractArray{T,D}, JT<:AbstractArray{<:AbstractArray{<:Any, 2}, D}} <: Grid{T,D}
2 logicalgrid::GT 11 logicalgrid::GT
3 physicalcoordinates::CT 12 physicalcoordinates::CT
4 jacobian::JT 13 jacobian::JT
5 14
15 """
16 MappedGrid(logicalgrid, physicalcoordinates, jacobian)
17
18 A MappedGrid with the given physical coordinates and jacobian.
19 """
6 function MappedGrid(logicalgrid::GT, physicalcoordinates::CT, jacobian::JT) where {T,D, GT<:Grid{<:Any,D}, CT<:AbstractArray{T,D}, JT<:AbstractArray{<:AbstractArray{<:Any, 2}, D}} 20 function MappedGrid(logicalgrid::GT, physicalcoordinates::CT, jacobian::JT) where {T,D, GT<:Grid{<:Any,D}, CT<:AbstractArray{T,D}, JT<:AbstractArray{<:AbstractArray{<:Any, 2}, D}}
7 if !(size(logicalgrid) == size(physicalcoordinates) == size(jacobian)) 21 if !(size(logicalgrid) == size(physicalcoordinates) == size(jacobian))
8 throw(ArgumentError("Sizes must match")) 22 throw(ArgumentError("Sizes must match"))
9 end 23 end
10 24
24 same_jacobian = jacobian(a) == jacobian(b) 38 same_jacobian = jacobian(a) == jacobian(b)
25 39
26 return same_logicalgrid && same_coordinates && same_jacobian 40 return same_logicalgrid && same_coordinates && same_jacobian
27 end 41 end
28 42
43 """
44 logicalgrid(g::MappedGrid)
45
46 The logical grid of `g`.
47 """
48 logicalgrid(g::MappedGrid) = g.logicalgrid
49
50 """
51 jacobian(g::MappedGrid)
52
53 The Jacobian matrix of `g` as a grid function.
54 """
29 jacobian(g::MappedGrid) = g.jacobian 55 jacobian(g::MappedGrid) = g.jacobian
30 logicalgrid(g::MappedGrid) = g.logicalgrid
31 56
32 57
33 # Indexing interface 58 # Indexing interface
34 Base.getindex(g::MappedGrid, I::Vararg{Int}) = g.physicalcoordinates[I...] 59 Base.getindex(g::MappedGrid, I::Vararg{Int}) = g.physicalcoordinates[I...]
35 Base.eachindex(g::MappedGrid) = eachindex(g.logicalgrid) 60 Base.eachindex(g::MappedGrid) = eachindex(g.logicalgrid)
67 boundary_physicalcoordinates, 92 boundary_physicalcoordinates,
68 boundary_jacobian, 93 boundary_jacobian,
69 ) 94 )
70 end 95 end
71 96
72 # TBD: refine and coarsen could be implemented once we have a simple manifold implementation. 97
73 # Before we do, we should consider the overhead of including such a field in the mapped grid struct. 98 """
74 99 mapped_grid(x, J, size::Vararg{Int})
100
101 A `MappedGrid` with a default logical grid on a unit hyper box. `x` and `J`
102 are functions to be evaluated on the logical grid and `size` determines the
103 size of the logical grid.
104 """
75 function mapped_grid(x, J, size::Vararg{Int}) 105 function mapped_grid(x, J, size::Vararg{Int})
76 D = length(size) 106 D = length(size)
77 lg = equidistant_grid(ntuple(i->0., D), ntuple(i->1., D), size...) 107 lg = equidistant_grid(ntuple(i->0., D), ntuple(i->1., D), size...)
78 return mapped_grid(lg, x, J) 108 return mapped_grid(lg, x, J)
79 end 109 end
80 110
111 """
112 mapped_grid(lg::Grid, x, J)
113
114 A `MappedGrid` with logical grid `lg`. Physical coordinates and Jacobian are
115 determined by the functions `x` and `J`.
116 """
81 function mapped_grid(lg::Grid, x, J) 117 function mapped_grid(lg::Grid, x, J)
82 return MappedGrid( 118 return MappedGrid(
83 lg, 119 lg,
84 map(x,lg), 120 map(x,lg),
85 map(J,lg), 121 map(J,lg),
86 ) 122 )
87 end 123 end
88 124
125 """
126 jacobian_determinant(g::MappedGrid)
127
128 The jacobian determinant of `g` as a grid function.
129 """
89 function jacobian_determinant(g::MappedGrid) 130 function jacobian_determinant(g::MappedGrid)
90 return map(jacobian(g)) do ∂x∂ξ 131 return map(jacobian(g)) do ∂x∂ξ
91 det(∂x∂ξ) 132 det(∂x∂ξ)
92 end 133 end
93 end 134 end
94 # TBD: Should this be changed to calculate sqrt(g) instead? 135 # TBD: Should this be changed to calculate sqrt(g) instead?
95 # This would make it well defined also for n-dim grids embedded in higher dimensions. 136 # This would make it well defined also for n-dim grids embedded in higher dimensions.
96 # TBD: Is there a better name? metric_determinant? 137 # TBD: Is there a better name? metric_determinant?
97 # TBD: Is the best option to delete it? 138 # TBD: Is the best option to delete it?
98 139
140 """
141 metric_tensor(g::MappedGrid)
142
143 The metric tensor of `g` as a grid function.
144 """
99 function metric_tensor(g::MappedGrid) 145 function metric_tensor(g::MappedGrid)
100 return map(jacobian(g)) do ∂x∂ξ 146 return map(jacobian(g)) do ∂x∂ξ
101 ∂x∂ξ'*∂x∂ξ 147 ∂x∂ξ'*∂x∂ξ
102 end 148 end
103 end 149 end
104 150
151 """
152 metric_tensor_inverse(g::MappedGrid)
153
154 The inverse of the metric tensor of `g` as a grid function.
155 """
105 function metric_tensor_inverse(g::MappedGrid) 156 function metric_tensor_inverse(g::MappedGrid)
106 return map(jacobian(g)) do ∂x∂ξ 157 return map(jacobian(g)) do ∂x∂ξ
107 inv(∂x∂ξ'*∂x∂ξ) 158 inv(∂x∂ξ'*∂x∂ξ)
108 end 159 end
109 end 160 end
143 end 194 end
144 195
145 """ 196 """
146 normal(g::MappedGrid, boundary) 197 normal(g::MappedGrid, boundary)
147 198
148 The outward pointing normal as a grid function on the boundary 199 The outward pointing normal as a grid function on the corresponding boundary grid.
149 """ 200 """
150 function normal(g::MappedGrid, boundary) 201 function normal(g::MappedGrid, boundary)
151 b_indices = boundary_indices(g, boundary) 202 b_indices = boundary_indices(g, boundary)
152 σ =_boundary_sign(component_type(g), boundary) 203 σ =_boundary_sign(component_type(g), boundary)
153 return map(jacobian(g)[b_indices...]) do ∂x∂ξ 204 return map(jacobian(g)[b_indices...]) do ∂x∂ξ