Mercurial > repos > public > sbplib_julia
comparison src/Grids/mapped_grid.jl @ 1801:2b5f81e288f1 feature/grids/manifolds
Merge feature/grids/curvilinear
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Wed, 02 Oct 2024 08:51:37 +0200 |
| parents | 819ab806960f 8583f6379bd8 |
| children | 1c58005429fd |
comparison
equal
deleted
inserted
replaced
| 1784:c5070edd0ebb | 1801:2b5f81e288f1 |
|---|---|
| 70 Base.size(g::MappedGrid, d) = size(g.logical_grid, d) | 70 Base.size(g::MappedGrid, d) = size(g.logical_grid, d) |
| 71 | 71 |
| 72 boundary_identifiers(g::MappedGrid) = boundary_identifiers(g.logical_grid) | 72 boundary_identifiers(g::MappedGrid) = boundary_identifiers(g.logical_grid) |
| 73 boundary_indices(g::MappedGrid, id::TensorGridBoundary) = boundary_indices(g.logical_grid, id) | 73 boundary_indices(g::MappedGrid, id::TensorGridBoundary) = boundary_indices(g.logical_grid, id) |
| 74 | 74 |
| 75 # Review: Error when calling plot(boundary_grid(g, id)) | |
| 76 # Currently need to collect first, i.e., plot(collect(boundary_grid(g, id))) | |
| 77 function boundary_grid(g::MappedGrid, id::TensorGridBoundary) | 75 function boundary_grid(g::MappedGrid, id::TensorGridBoundary) |
| 78 b_indices = boundary_indices(g.logical_grid, id) | 76 b_indices = boundary_indices(g.logical_grid, id) |
| 79 | 77 |
| 80 # Calculate indices of needed jacobian components | 78 # Calculate indices of needed jacobian components |
| 81 D = ndims(g) | 79 D = ndims(g) |
| 96 | 94 |
| 97 | 95 |
| 98 """ | 96 """ |
| 99 mapped_grid(x, J, size::Vararg{Int}) | 97 mapped_grid(x, J, size::Vararg{Int}) |
| 100 | 98 |
| 101 A `MappedGrid` with a default logical grid on a unit hyper box. `x` and `J` | 99 A `MappedGrid` with a default logical grid on the D-dimensional unit hyper |
| 102 are functions to be evaluated on the logical grid and `size` determines the | 100 box [0,1]ᴰ. `x` and `J`are functions to be evaluated on the logical grid |
| 103 size of the logical grid. | 101 and `size` determines the size of the logical grid. |
| 104 """ | 102 """ |
| 105 function mapped_grid(x, J, size::Vararg{Int}) | 103 function mapped_grid(x, J, size::Vararg{Int}) |
| 106 D = length(size) | 104 D = length(size) |
| 107 lg = equidistant_grid(ntuple(i->0., D), ntuple(i->1., D), size...) | 105 lg = equidistant_grid(ntuple(i->0., D), ntuple(i->1., D), size...) |
| 108 return mapped_grid(lg, x, J) | 106 return mapped_grid(lg, x, J) |
| 131 return map(jacobian(g)) do ∂x∂ξ | 129 return map(jacobian(g)) do ∂x∂ξ |
| 132 ∂x∂ξ'*∂x∂ξ | 130 ∂x∂ξ'*∂x∂ξ |
| 133 end | 131 end |
| 134 end | 132 end |
| 135 | 133 |
| 136 """ | |
| 137 metric_tensor_inverse(g::MappedGrid) | |
| 138 | |
| 139 The inverse of the metric tensor of `g` as a grid function. | |
| 140 """ | |
| 141 function metric_tensor_inverse(g::MappedGrid) | |
| 142 return map(jacobian(g)) do ∂x∂ξ | |
| 143 inv(∂x∂ξ'*∂x∂ξ) | |
| 144 end | |
| 145 end | |
| 146 | |
| 147 function min_spacing(g::MappedGrid{T,1} where T) | 134 function min_spacing(g::MappedGrid{T,1} where T) |
| 148 n, = size(g) | 135 n, = size(g) |
| 149 | 136 |
| 150 ms = Inf | 137 ms = Inf |
| 151 for i ∈ 1:n-1 | 138 for i ∈ 1:n-1 |
| 183 | 170 |
| 184 The outward pointing normal as a grid function on the corresponding boundary grid. | 171 The outward pointing normal as a grid function on the corresponding boundary grid. |
| 185 """ | 172 """ |
| 186 function normal(g::MappedGrid, boundary) | 173 function normal(g::MappedGrid, boundary) |
| 187 b_indices = boundary_indices(g, boundary) | 174 b_indices = boundary_indices(g, boundary) |
| 188 σ =_boundary_sign(component_type(g), boundary) | 175 σ = _boundary_sign(component_type(g), boundary) |
| 189 return map(jacobian(g)[b_indices...]) do ∂x∂ξ | 176 return map(jacobian(g)[b_indices...]) do ∂x∂ξ |
| 190 ∂ξ∂x = inv(∂x∂ξ) | 177 ∂ξ∂x = inv(∂x∂ξ) |
| 191 k = grid_id(boundary) | 178 k = grid_id(boundary) |
| 192 σ*∂ξ∂x[k,:]/norm(∂ξ∂x[k,:]) | 179 σ*∂ξ∂x[k,:]/norm(∂ξ∂x[k,:]) |
| 193 end | 180 end |
| 194 end | 181 end |
| 182 | |
| 183 function normal(g::MappedGrid, boundary, i...) | |
| 184 σ = _boundary_sign(component_type(g), boundary) | |
| 185 ∂ξ∂x = inv(jacobian(g)[i...]) | |
| 186 | |
| 187 k = grid_id(boundary) | |
| 188 return σ*∂ξ∂x[k,:]/norm(∂ξ∂x[k,:]) | |
| 189 end | |
| 190 | |
| 195 | 191 |
| 196 function _boundary_sign(T, boundary) | 192 function _boundary_sign(T, boundary) |
| 197 if boundary_id(boundary) == UpperBoundary() | 193 if boundary_id(boundary) == UpperBoundary() |
| 198 return one(T) | 194 return one(T) |
| 199 elseif boundary_id(boundary) == LowerBoundary() | 195 elseif boundary_id(boundary) == LowerBoundary() |
