21 #ifndef FUB_PATCH_DATA_VIEW_HPP
22 #define FUB_PATCH_DATA_VIEW_HPP
34 using Index = std::array<std::ptrdiff_t, static_cast<std::size_t>(Rank)>;
36 template <std::
size_t N>
37 std::array<std::ptrdiff_t, N>
Shift(
const std::array<std::ptrdiff_t, N>& idx,
40 shifted[
static_cast<std::size_t
>(dir)] += shift;
44 template <std::
size_t N>
45 std::array<std::ptrdiff_t, N>
LeftTo(
const std::array<std::ptrdiff_t, N>& idx,
46 Direction dir, std::ptrdiff_t shift = 1) {
47 return Shift(idx, dir, -shift);
50 template <std::
size_t N>
51 std::array<std::ptrdiff_t, N>
RightTo(
const std::array<std::ptrdiff_t, N>& idx,
52 Direction dir, std::ptrdiff_t shift = 1) {
53 return Shift(idx, dir, shift - 1);
57 static_assert(Rank >= 0);
75 std::less_equal<>{}) &&
83 std::transform(
index.begin(),
index.end(), upper.begin(),
84 [](std::ptrdiff_t i) { return i + 1; });
90 constexpr std::size_t sRank =
static_cast<std::size_t
>(Rank);
91 std::array<std::ptrdiff_t, sRank> lower;
94 [](std::ptrdiff_t l1, std::ptrdiff_t l2) { return std::max(l1, l2); });
95 std::array<std::ptrdiff_t, sRank> upper;
98 [](std::ptrdiff_t u1, std::ptrdiff_t u2) { return std::min(u1, u2); });
100 lower.begin(), lower.end(), upper.begin(), upper.begin(),
101 [](std::ptrdiff_t l, std::ptrdiff_t u) { return std::max(l, u); });
107 const std::array<std::ptrdiff_t, 2>& shifts) {
108 assert(
static_cast<int>(dir) < Rank);
109 constexpr std::size_t sRank =
static_cast<std::size_t
>(Rank);
110 std::array<std::ptrdiff_t, sRank> lower = box.
lower;
111 lower[
static_cast<std::size_t
>(dir)] -= shifts[0];
112 std::array<std::ptrdiff_t, sRank> upper = box.
upper;
113 upper[
static_cast<std::size_t
>(dir)] += shifts[1];
119 const std::array<std::ptrdiff_t, 2>& shifts) {
120 assert(
static_cast<int>(dir) < Rank);
121 constexpr std::size_t sRank =
static_cast<std::size_t
>(Rank);
122 std::array<std::ptrdiff_t, sRank> lower = box.
lower;
123 lower[
static_cast<std::size_t
>(dir)] += shifts[0];
124 std::array<std::ptrdiff_t, sRank> upper = box.
upper;
125 upper[
static_cast<std::size_t
>(dir)] -= shifts[1];
131 const std::array<std::ptrdiff_t, 2>& limits) {
132 constexpr std::size_t sRank =
static_cast<std::size_t
>(Rank);
133 std::array<std::ptrdiff_t, sRank> lower;
134 std::copy_n(box.
lower.begin(), Rank - 1, lower.begin());
135 lower[Rank - 1] = limits[0];
136 std::array<std::ptrdiff_t, sRank> upper;
137 std::copy_n(box.
upper.begin(), Rank - 1, upper.begin());
138 upper[Rank - 1] = limits[1];
142 template <
int Rank,
int OtherRank>
144 constexpr std::size_t sRank =
static_cast<std::size_t
>(Rank);
145 std::array<std::ptrdiff_t, sRank> lower;
146 std::copy_n(box.
lower.begin(), Rank, lower.begin());
147 std::array<std::ptrdiff_t, sRank> upper;
148 std::copy_n(box.
upper.begin(), Rank, upper.begin());
152 template <
typename Extents>
153 constexpr std::array<std::ptrdiff_t, Extents::rank()>
155 std::array<std::ptrdiff_t, Extents::rank()> array{};
156 for (std::size_t r = 0; r < Extents::rank(); ++r) {
157 array[r] = e.extent(r);
162 template <
typename T,
int Rank,
typename Layout = layout_left>
163 struct PatchDataView;
166 static constexpr std::size_t
sRank =
static_cast<std::size_t
>(Rank);
173 const std::array<std::ptrdiff_t, sRank>& origin)
180 template <
typename T,
int Rank,
typename Layout>
182 static constexpr std::size_t
sRank =
static_cast<std::size_t
>(Rank);
193 const std::array<std::ptrdiff_t, sRank>& origin)
200 template <
typename T,
int R,
typename Layout>
202 static constexpr std::size_t
sRank =
static_cast<std::size_t
>(R);
210 const std::array<std::ptrdiff_t, sRank>&
Origin() const noexcept {
215 return this->
mdspan_.extents();
218 typename Layout::template mapping<dynamic_extents<sRank>>
220 return this->
mdspan_.mapping();
223 static constexpr
int Rank() noexcept {
return R; }
224 static constexpr
int rank() noexcept {
return R; }
228 std::ptrdiff_t
Stride(std::size_t n)
const {
return this->
mdspan_.stride(n); }
230 std::ptrdiff_t
Extent(std::size_t n)
const {
return this->
mdspan_.extent(n); }
238 [](std::ptrdiff_t
extents, std::ptrdiff_t lower) {
239 FUB_ASSERT(extents >= 0);
240 return lower + extents;
246 std::array<std::ptrdiff_t, sRank> offset;
247 std::transform(box.
lower.begin(), box.
lower.end(), this->origin_.begin(),
249 [](std::ptrdiff_t lower, std::ptrdiff_t origin) {
250 FUB_ASSERT(origin <= lower);
251 return lower - origin;
253 std::array<std::ptrdiff_t, sRank>
extents;
256 [](std::ptrdiff_t lower, std::ptrdiff_t upper) {
257 FUB_ASSERT(lower <= upper);
258 return upper - lower;
260 std::array<std::pair<std::ptrdiff_t, std::ptrdiff_t>,
sRank> slice_array;
261 std::transform(offset.begin(), offset.end(),
extents.begin(),
263 [](std::ptrdiff_t offset, std::ptrdiff_t
extents) {
264 return std::make_pair(offset, offset + extents);
267 [&](
const auto&... slices) {
274 template <
typename... IndexType,
276 std::is_convertible<IndexType, std::ptrdiff_t>...>::value>>
278 std::array<std::ptrdiff_t, sRank>
index{
279 static_cast<std::ptrdiff_t
>(indices)...};
283 template <
typename IndexType,
284 typename = std::enable_if_t<
285 std::is_convertible_v<IndexType, std::ptrdiff_t>>>
286 auto&
operator()(
const std::array<IndexType, sRank>& indices)
const {
287 std::array<IndexType, sRank> local_index;
288 std::transform(indices.begin(), indices.end(),
Origin().begin(),
290 [](IndexType i, IndexType o) { return i - o; });
291 return this->
mdspan_(local_index);
295 template <
typename T,
int Rank,
typename Layout>
296 PatchDataView<T, Rank - 1, Layout>
298 constexpr std::size_t sRank =
static_cast<std::size_t
>(Rank - 1);
299 std::array<std::ptrdiff_t, sRank + 1>
index{};
300 index[sRank] = component;
301 std::array<std::ptrdiff_t, sRank>
extents;
302 for (std::size_t r = 0; r < sRank; ++r) {
305 std::array<std::ptrdiff_t, sRank> strides;
306 for (std::size_t r = 0; r < sRank; ++r) {
307 strides[r] = pdv.
Stride(r);
309 std::array<std::ptrdiff_t, sRank> origin;
310 std::copy_n(pdv.
Origin().begin(), Rank - 1, origin.begin());
311 if constexpr (std::is_same_v<Layout, layout_stride>) {
322 template <
typename T,
int Rank>
Definition: mdspan.hpp:573
An extents object defines a multidimensional index space which is the Cartesian product of integers e...
Definition: mdspan.hpp:208
Definition: mdspan.hpp:473
A span is a view over a contiguous sequence of objects, the storage of which is owned by some other o...
Definition: span.hpp:81
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
auto Shrink(const layout_left::mapping< Extent > &layout, Direction dir, std::ptrdiff_t n=1)
Definition: Equation.hpp:78
IndexBox< Rank > Grow(const IndexBox< Rank > &box, Direction dir, const std::array< std::ptrdiff_t, 2 > &shifts)
Definition: PatchDataView.hpp:106
std::array< std::ptrdiff_t, N > RightTo(const std::array< std::ptrdiff_t, N > &idx, Direction dir, std::ptrdiff_t shift=1)
Definition: PatchDataView.hpp:51
typename dynamic_extents_< make_index_sequence< Rank > >::type dynamic_extents
Definition: mdspan.hpp:725
constexpr std::array< std::ptrdiff_t, Extents::rank()> AsArray(Extents e) noexcept
Definition: PatchDataView.hpp:154
mdspan_subspan_t< ElementType, Extents, LayoutPolicy, AccessorPolicy, SliceSpecifiers... > subspan(const basic_mdspan< ElementType, Extents, LayoutPolicy, AccessorPolicy > &src, SliceSpecifiers... slices) noexcept
Definition: mdspan.hpp:968
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
std::array< std::ptrdiff_t, static_cast< std::size_t >(Rank)> Index
Definition: PatchDataView.hpp:34
bool operator==(const IndexBox< Rank > &b1, const IndexBox< Rank > &b2)
Definition: PatchDataView.hpp:63
bool Contains(const IndexBox< Rank > &b1, const IndexBox< Rank > &b2)
Definition: PatchDataView.hpp:73
dynamic_extents< static_cast< std::size_t >Rank)> Extents(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:480
std::array< double, 2 > Intersect(const std::array< double, 2 > &i1, const std::array< double, 2 > &i2)
Definition: CutCellData.hpp:29
bool operator!=(const IndexBox< Rank > &b1, const IndexBox< Rank > &b2)
Definition: PatchDataView.hpp:68
std::array< std::ptrdiff_t, N > Shift(const std::array< std::ptrdiff_t, N > &idx, Direction dir, std::ptrdiff_t shift)
Definition: PatchDataView.hpp:37
IndexBox< Rank > Project(const IndexBox< OtherRank > &box)
Definition: PatchDataView.hpp:143
IndexBox< Rank > Embed(const IndexBox< Rank - 1 > &box, const std::array< std::ptrdiff_t, 2 > &limits)
Definition: PatchDataView.hpp:130
PatchDataView< T, Rank - 1, Layout > SliceLast(const PatchDataView< T, Rank, Layout > &pdv, int component=0)
Definition: PatchDataView.hpp:297
std::ptrdiff_t index
Definition: type_traits.hpp:179
std::array< std::ptrdiff_t, N > LeftTo(const std::array< std::ptrdiff_t, N > &idx, Direction dir, std::ptrdiff_t shift=1)
Definition: PatchDataView.hpp:45
Definition: PatchDataView.hpp:56
Index< Rank > lower
Definition: PatchDataView.hpp:57
Index< Rank > upper
Definition: PatchDataView.hpp:59
std::array< std::ptrdiff_t, sRank > origin_
Definition: PatchDataView.hpp:197
PatchDataViewBase()=default
PatchDataViewBase(const PatchDataViewBase &)=default
PatchDataViewBase(const PatchDataView< T, Rank, Layout > &other)
Definition: PatchDataView.hpp:189
PatchDataViewBase(const mdspan< const T, sRank, Layout > &data, const std::array< std::ptrdiff_t, sRank > &origin)
Definition: PatchDataView.hpp:192
mdspan< const T, sRank, Layout > mdspan_
Definition: PatchDataView.hpp:196
PatchDataViewBase & operator=(const PatchDataViewBase &)=default
Definition: PatchDataView.hpp:165
mdspan< T, sRank, Layout > mdspan_
Definition: PatchDataView.hpp:176
PatchDataViewBase()=default
PatchDataViewBase(const mdspan< T, sRank, Layout > &data, const std::array< std::ptrdiff_t, sRank > &origin)
Definition: PatchDataView.hpp:172
PatchDataViewBase & operator=(const PatchDataViewBase &)=default
PatchDataViewBase(const PatchDataViewBase &)=default
static constexpr std::size_t sRank
Definition: PatchDataView.hpp:166
std::array< std::ptrdiff_t, sRank > origin_
Definition: PatchDataView.hpp:177
Definition: PatchDataView.hpp:201
auto & operator()(const std::array< IndexType, sRank > &indices) const
Definition: PatchDataView.hpp:286
std::ptrdiff_t Stride(std::size_t n) const
Definition: PatchDataView.hpp:228
static constexpr int rank() noexcept
Definition: PatchDataView.hpp:224
dynamic_extents< sRank > Extents() const noexcept
Definition: PatchDataView.hpp:214
auto & operator()(IndexType... indices) const
Definition: PatchDataView.hpp:277
static constexpr std::size_t sRank
Definition: PatchDataView.hpp:202
const mdspan< T, sRank, Layout > & MdSpan() const noexcept
Definition: PatchDataView.hpp:206
IndexBox< R > Box() const noexcept
Definition: PatchDataView.hpp:232
static constexpr int Rank() noexcept
Definition: PatchDataView.hpp:223
Layout::template mapping< dynamic_extents< sRank > > Mapping() const noexcept
Definition: PatchDataView.hpp:219
std::ptrdiff_t Extent(std::size_t n) const
Definition: PatchDataView.hpp:230
span< T > Span() const noexcept
Definition: PatchDataView.hpp:226
PatchDataView< T, R, layout_stride > Subview(const IndexBox< R > &box) const
Definition: PatchDataView.hpp:245
const std::array< std::ptrdiff_t, sRank > & Origin() const noexcept
Definition: PatchDataView.hpp:210
Definition: type_traits.hpp:123