Mercurial > repos > public > sbplib_julia
view src/Grids/curvilinear_grid.jl @ 1431:6adf31ba6cfd feature/grids/curvilinear
Add `jacobian` and `logicalgrid`
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Fri, 25 Aug 2023 15:41:19 +0200 |
parents | 9fc3c1af33e5 |
children | 64b60b42d367 |
line wrap: on
line source
struct CurvilinearGrid{T,D, GT<:Grid{<:Any,D}, CT<:AbstractArray{T,D}, JT<:AbstractArray{<:AbstractArray{<:Any, 2}, D}} <: Grid{T,D} logicalgrid::GT physicalcoordinates::CT jacobian::JT end jacobian(g::CurvilinearGrid) = g.jacobian logicalgrid(g::CurvilinearGrid) = g.logicalgrid # Indexing interface Base.getindex(g::CurvilinearGrid, I...) = g.physicalcoordinates[I...] # function Base.getindex(g::TensorGrid, I...) # szs = ndims.(g.grids) # Is = LazyTensors.split_tuple(I, szs) # ps = map((g,I)->SVector(g[I...]), g.grids, Is) # return vcat(ps...) # end # function Base.eachindex(g::TensorGrid) # szs = LazyTensors.concatenate_tuples(size.(g.grids)...) # return CartesianIndices(szs) # end # # Iteration interface # Base.iterate(g::TensorGrid) = iterate(Iterators.product(g.grids...)) |> _iterate_combine_coords # Base.iterate(g::TensorGrid, state) = iterate(Iterators.product(g.grids...), state) |> _iterate_combine_coords # _iterate_combine_coords(::Nothing) = nothing # _iterate_combine_coords((next,state)) = combine_coordinates(next...), state # Base.IteratorSize(::Type{<:TensorGrid{<:Any, D}}) where D = Base.HasShape{D}() # Base.eltype(::Type{<:TensorGrid{T}}) where T = T # Base.length(g::TensorGrid) = sum(length, g.grids) # Base.size(g::TensorGrid) = LazyTensors.concatenate_tuples(size.(g.grids)...) # refine(g::TensorGrid, r::Int) = mapreduce(g->refine(g,r), TensorGrid, g.grids) # coarsen(g::TensorGrid, r::Int) = mapreduce(g->coarsen(g,r), TensorGrid, g.grids) # """ # TensorGridBoundary{N, BID} <: BoundaryIdentifier # A boundary identifier for a tensor grid. `N` Specifies which grid in the # tensor product and `BID` which boundary on that grid. # """ # struct TensorGridBoundary{N, BID} <: BoundaryIdentifier end # grid_id(::TensorGridBoundary{N, BID}) where {N, BID} = N # boundary_id(::TensorGridBoundary{N, BID}) where {N, BID} = BID() # """ # boundary_identifiers(g::TensorGrid) # Returns a tuple containing the boundary identifiers of `g`. # """ # function boundary_identifiers(g::TensorGrid) # per_grid = map(eachindex(g.grids)) do i # return map(bid -> TensorGridBoundary{i, typeof(bid)}(), boundary_identifiers(g.grids[i])) # end # return LazyTensors.concatenate_tuples(per_grid...) # end # """ # boundary_grid(g::TensorGrid, id::TensorGridBoundary) # The grid for the boundary of `g` specified by `id`. # """ # function boundary_grid(g::TensorGrid, id::TensorGridBoundary) # local_boundary_grid = boundary_grid(g.grids[grid_id(id)], boundary_id(id)) # new_grids = Base.setindex(g.grids, local_boundary_grid, grid_id(id)) # return TensorGrid(new_grids...) # end # Do we add a convenience function `curvilinear_grid`? It could help with # creating the logical grid, evaluating functions and possibly calculating the # entries in the jacobian.