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