10#include <similie/misc/portable_stl.hpp>
11#include <similie/misc/specialization.hpp>
18template <
class... CDim>
31 return ddc::DiscreteDomain<>();
34 KOKKOS_FUNCTION
static constexpr std::size_t
rank()
36 return sizeof...(CDim) != 0;
39 KOKKOS_FUNCTION
static constexpr std::size_t
size()
41 if constexpr (
rank() == 0) {
44 return sizeof...(CDim);
48 KOKKOS_FUNCTION
static constexpr std::size_t
mem_size()
59 KOKKOS_FUNCTION
static constexpr std::size_t
mem_id()
61 if constexpr (
rank() == 0) {
64 return ddc::type_seq_rank_v<ODim, type_seq_dimensions>;
68 KOKKOS_FUNCTION
static constexpr std::size_t
mem_id(std::size_t
const natural_id)
73 KOKKOS_FUNCTION
static constexpr std::size_t
access_id(std::size_t
const natural_id)
83 template <
class Tensor,
class Elem,
class Id,
class FunctorType>
85 const FunctorType& access,
89 return access(tensor, elem);
92 KOKKOS_FUNCTION
static constexpr std::array<std::size_t,
rank()>
96 if constexpr (
rank() == 0) {
97 return std::array<std::size_t,
rank()> {};
99 return std::array<std::size_t,
rank()> {
mem_id};
106 { DDim::is_tensor_index } -> std::convertible_to<bool>;
107} && DDim::is_tensor_index;
111 { DDim::is_tensor_natural_index } -> std::convertible_to<bool>;
112} && DDim::is_tensor_natural_index;
122template <
class Index>
123struct NaturalDomainType;
125template <
class Index>
127struct NaturalDomainType<Index>
129 using type =
typename Index::subindices_domain_t;
132template <TensorNatIndex Index>
133struct NaturalDomainType<Index>
135 using type = ddc::DiscreteDomain<Index>;
140template <TensorIndex Index>
146template <
class Index,
class...>
147struct NbDimsBeforeIndex;
149template <
class Index,
class IndexHead,
class... IndexTail>
150struct NbDimsBeforeIndex<Index, ddc::detail::TypeSeq<IndexHead, IndexTail...>>
152 static constexpr std::size_t run(std::size_t nb_dims_before_index)
154 if constexpr (std::is_same_v<IndexHead, Index>) {
155 return nb_dims_before_index;
157 return NbDimsBeforeIndex<Index, ddc::detail::TypeSeq<IndexTail...>>::run(
158 nb_dims_before_index + IndexHead::rank());
164template <std::
size_t Offset,
class IndexSeq>
165struct OffsetIndexSeq;
167template <std::size_t Offset, std::size_t... Is>
168struct OffsetIndexSeq<Offset, std::integer_sequence<std::size_t, Is...>>
170 using type = std::integer_sequence<std::size_t, Offset + Is...>;
173template <std::
size_t Offset,
class IndexSeq>
174using offset_index_seq_t = OffsetIndexSeq<Offset, IndexSeq>::type;
177template <
class CDimTypeSeq,
class IndexSeq>
178struct TypeSeqDimsAtInts;
180template <
class CDimTypeSeq, std::size_t... Is>
181struct TypeSeqDimsAtInts<CDimTypeSeq, std::integer_sequence<std::size_t, Is...>>
183 using type = ddc::detail::TypeSeq<ddc::type_seq_element_t<Is, CDimTypeSeq>...>;
186template <
class CDimTypeSeq,
class IndexSeq>
187using type_seq_dims_at_ints_t = TypeSeqDimsAtInts<CDimTypeSeq, IndexSeq>::type;
190template <
class Index,
class SubindicesDomain,
class TypeSeqDims>
191struct IdFromTypeSeqDims;
193template <
class Index,
class... Subindex,
class... CDim>
194struct IdFromTypeSeqDims<Index, ddc::DiscreteDomain<Subindex...>, ddc::detail::TypeSeq<CDim...>>
196 static constexpr std::size_t run()
198 static_assert(
sizeof...(Subindex) ==
sizeof...(CDim));
200 return Index::access_id(
201 ddc::type_seq_rank_v<CDim, typename Index::type_seq_dimensions>...);
203 return Index::access_id(std::array<
205 sizeof...(Subindex)> {ddc::type_seq_rank_v<
206 typename ddc::type_seq_element_t<
207 ddc::type_seq_rank_v<Subindex, ddc::detail::TypeSeq<Subindex...>>,
208 ddc::detail::TypeSeq<CDim...>>,
209 typename Subindex::type_seq_dimensions>...});
215template <
class Index,
class IndicesTypeSeq,
class... CDim>
216static constexpr std::size_t access_id()
219 return IdFromTypeSeqDims<
221 ddc::DiscreteDomain<Index>,
222 type_seq_dims_at_ints_t<
223 ddc::detail::TypeSeq<CDim...>,
225 NbDimsBeforeIndex<Index, IndicesTypeSeq>::run(0),
226 std::make_integer_sequence<std::size_t, Index::rank()>>>>::run();
228 return IdFromTypeSeqDims<
230 typename Index::subindices_domain_t,
231 type_seq_dims_at_ints_t<
232 ddc::detail::TypeSeq<CDim...>,
234 NbDimsBeforeIndex<Index, IndicesTypeSeq>::run(0),
235 std::make_integer_sequence<std::size_t, Index::rank()>>>>::run();
239template <
class Index,
class SubindicesDomain>
242template <
class Index,
class... Subindex>
243struct IdFromElem<Index, ddc::DiscreteDomain<Subindex...>>
245 template <
class Elem>
246 static constexpr std::size_t run(Elem natural_elem)
249 return Index::access_id(natural_elem.template uid<Index>());
251 return Index::access_id(std::array<std::size_t,
sizeof...(Subindex)> {
252 natural_elem.template uid<Subindex>()...});
257template <
class Index,
class IndicesTypeSeq,
class... NaturalIndex>
258static constexpr std::size_t access_id(ddc::DiscreteElement<NaturalIndex...> natural_elem)
261 return IdFromElem<Index, ddc::DiscreteDomain<Index>>::run(natural_elem);
263 return IdFromElem<Index, typename Index::subindices_domain_t>::run(natural_elem);
270template <TensorIndex... Index>
282 ddc::DiscreteDomain<Index>,
283 typename Index::subindices_domain_t>...>;
291 template <
class... CDim>
294 template <
class... NaturalIndex>
296 ddc::DiscreteElement<NaturalIndex...> natural_elem);
298 template <
class... MemIndex>
300 ddc::DiscreteElement<MemIndex...> mem_elem);
306struct TensorAccessorForTypeSeq;
309struct TensorAccessorForTypeSeq<ddc::detail::TypeSeq<Index...>>
315struct TensorAccessorForDomain;
317template <
class... DDim>
318struct TensorAccessorForDomain<ddc::DiscreteDomain<DDim...>>
320 using type =
typename TensorAccessorForTypeSeq<
321 ddc::to_type_seq_t<ddc::cartesian_prod_t<std::conditional_t<
323 ddc::DiscreteDomain<DDim>,
324 ddc::DiscreteDomain<>>...>>>::type;
329template <misc::Specialization<ddc::DiscreteDomain> Dom>
338template <
class Index>
339constexpr auto natural_domain()
342 return typename ddc::DiscreteDomain<
343 Index>(ddc::DiscreteElement<Index>(0), ddc::DiscreteVector<Index>(Index::size()));
345 return Index::subindices_domain();
350template <TensorIndex... Index>
359 return ddc::DiscreteDomain<Index...>(
360 ddc::DiscreteElement<Index...>(ddc::DiscreteElement<Index>(0)...),
361 ddc::DiscreteVector<Index...>(ddc::DiscreteVector<Index>(Index::mem_size())...));
367 return ddc::DiscreteDomain<Index...>(
368 ddc::DiscreteElement<Index...>(ddc::DiscreteElement<Index>(0)...),
369 ddc::DiscreteVector<Index...>(ddc::DiscreteVector<Index>(Index::access_size())...));
373template <
class... CDim>
376 return ddc::DiscreteElement<Index...>(ddc::DiscreteElement<Index>(
377 detail::access_id<Index, ddc::detail::TypeSeq<Index...>, CDim...>())...);
381template <
class... NaturalIndex>
383 [[maybe_unused]] ddc::DiscreteElement<NaturalIndex...> natural_elem)
385 return ddc::DiscreteElement<Index...>(
386 ddc::DiscreteElement<Index>(detail::access_id<Index, ddc::detail::TypeSeq<Index...>>(
387 typename natural_domain_t::discrete_element_type(natural_elem)))...);
391template <
class... MemIndex>
393 Index...>::canonical_natural_element(ddc::DiscreteElement<MemIndex...> mem_elem)
395 std::array<std::size_t, natural_domain_t::rank()> ids {};
396 auto it = ids.begin();
399 auto i = MemIndex::mem_id_to_canonical_natural_ids(
400 mem_elem.template uid<MemIndex>());
401 misc::detail::copy(i.begin(), i.end(), it);
405 typename natural_domain_t::discrete_element_type natural_elem;
406 ddc::detail::array(natural_elem) = std::array<std::size_t, natural_domain_t::rank()>(ids);
416 class IndexHeadsTypeSeq,
427struct Access<TensorField, Element, ddc::detail::TypeSeq<IndexHead...>, IndexInterest, IndexTail...>
429 template <
class Elem>
430 KOKKOS_FUNCTION
static TensorField::element_type run(TensorField tensor_field, Elem
const& elem)
438 if constexpr (
sizeof...(IndexTail) > 0) {
440 return IndexInterest::template process_access<TensorField, Elem, IndexInterest>(
441 KOKKOS_LAMBDA(TensorField tensor_field_, Elem elem_)
442 ->TensorField::element_type {
446 ddc::detail::TypeSeq<IndexHead..., IndexInterest>,
447 IndexTail...>::run(tensor_field_, elem_);
455 ddc::detail::TypeSeq<IndexHead..., IndexInterest>,
456 IndexTail...>::run(tensor_field, elem);
459 if constexpr (TensorIndex<IndexInterest>) {
460 return IndexInterest::template process_access<TensorField, Elem, IndexInterest>(
461 KOKKOS_LAMBDA(TensorField tensor_field_, Elem elem_)
462 ->TensorField::element_type {
463 double tensor_field_value = 0;
464 if constexpr (IndexInterest::is_explicitely_stored_tensor) {
465 std::size_t
const mem_id
466 = IndexInterest::access_id_to_mem_id(
467 elem_.template uid<IndexInterest>());
468 if (mem_id != std::numeric_limits<std::size_t>::max()) {
471 .mem(ddc::DiscreteElement<
472 IndexHead...>(elem_),
473 ddc::DiscreteElement<
474 IndexInterest>(mem_id));
476 tensor_field_value = 1.;
481 std::vector<std::size_t>>
const mem_lin_comb
482 = IndexInterest::access_id_to_mem_lin_comb(
483 elem_.template uid<IndexInterest>());
485 if (std::get<0>(mem_lin_comb).size() > 0) {
486 for (std::size_t i = 0;
487 i < std::get<0>(mem_lin_comb).size();
490 += std::get<0>(mem_lin_comb)[i]
492 ddc::DiscreteElement<
493 IndexHead...>(elem_),
494 ddc::DiscreteElement<
495 IndexInterest>(std::get<
500 tensor_field_value = 1.;
504 return tensor_field_value;
509 return tensor_field(elem);
516template <
class InterestDim>
519 template <
class Elem>
520 KOKKOS_FUNCTION
static ddc::DiscreteElement<InterestDim> run(Elem elem)
522 return ddc::DiscreteElement<InterestDim>(elem);
526template <TensorIndex InterestDim>
527struct LambdaMemElem<InterestDim>
529 template <
class Elem>
530 KOKKOS_FUNCTION
static ddc::DiscreteElement<InterestDim> run(Elem elem)
532 if constexpr (InterestDim::is_explicitely_stored_tensor) {
533 std::size_t
const mem_id
534 = InterestDim::access_id_to_mem_id(elem.template uid<InterestDim>());
535 assert(mem_id != std::numeric_limits<std::size_t>::max()
536 &&
"mem_elem is not defined because mem_id() returned a max integer. Maybe you "
537 "used Tensor::operator() in place of Tensor::get ?");
538 return ddc::DiscreteElement<InterestDim>(mem_id);
540 std::pair<std::vector<double>, std::vector<std::size_t>>
const mem_lin_comb
541 = InterestDim::access_id_to_mem_lin_comb(elem.template uid<InterestDim>());
542 assert(std::get<0>(mem_lin_comb).size() > 0
543 &&
"mem_elem is not defined because mem_lin_comb contains no id. Maybe you used "
544 "Tensor::operator() in place of Tensor::get ?");
545 assert(std::get<0>(mem_lin_comb).size() == 1
546 &&
"mem_elem is not defined because mem_lin_comb contains several ids. Maybe "
547 "you used Tensor::operator() in place of Tensor::get ?");
548 return ddc::DiscreteElement<InterestDim>(std::get<1>(mem_lin_comb)[0]);
557template <
class ElementType,
class SupportType,
class LayoutStr
idedPolicy,
class MemorySpace>
566template <
class ElementType,
class SupportType,
class LayoutStr
idedPolicy,
class MemorySpace>
567inline constexpr bool enable_chunk<
571template <
class ElementType,
class SupportType,
class LayoutStr
idedPolicy,
class MemorySpace>
572inline constexpr bool enable_borrowed_chunk<
585template <
class ElementType,
class... DDim,
class LayoutStridedPolicy,
class MemorySpace>
586class Tensor<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>
588 ChunkSpan<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>
592 ChunkSpan<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>;
595 using base_type::ChunkSpan;
600 using base_type::domain;
601 using base_type::operator();
603 KOKKOS_FUNCTION
constexpr explicit Tensor(ddc::ChunkSpan<
605 ddc::DiscreteDomain<DDim...>,
607 MemorySpace> other) noexcept
614 ddc::DiscreteDomain<DDim>,
615 ddc::DiscreteDomain<>>...>>;
625 = ddc::detail::convert_type_seq_to_discrete_domain_t<ddc::type_seq_remove_t<
626 ddc::to_type_seq_t<discrete_domain_type>,
627 ddc::to_type_seq_t<indices_domain_t>>>;
640 = ddc::cartesian_prod_t<non_indices_domain_t, typename accessor_t::natural_domain_t>;
644 return natural_domain_t(non_indices_domain(), accessor_t::natural_domain());
647 KOKKOS_FUNCTION
constexpr discrete_domain_type access_domain() const noexcept
649 return discrete_domain_type(non_indices_domain(), accessor_t::access_domain());
652 template <
class... CDim>
659 template <
class... Elem>
663 accessor_t::access_element(
664 typename accessor_t::natural_domain_t::discrete_element_type(elem...)),
665 typename non_indices_domain_t::discrete_element_type(elem...));
668 template <
class... Elem>
669 KOKKOS_FUNCTION
constexpr natural_domain_t::discrete_element_type canonical_natural_element(
670 Elem... mem_elem)
const noexcept
672 return typename natural_domain_t::discrete_element_type(
673 accessor_t::canonical_natural_element(
674 typename accessor_t::discrete_element_type(mem_elem...)),
675 typename non_indices_domain_t::discrete_element_type(mem_elem...));
678 template <
class... DElems>
679 KOKKOS_FUNCTION
constexpr reference mem(DElems
const&... delems)
const noexcept
681 return ddc::ChunkSpan<
683 ddc::DiscreteDomain<DDim...>,
685 MemorySpace>::operator()(delems...);
688 template <
class... DElems>
689 KOKKOS_FUNCTION
constexpr reference operator()(DElems
const&... delems)
const noexcept
691 return ddc::ChunkSpan<
693 ddc::DiscreteDomain<DDim...>,
696 operator()(ddc::DiscreteElement<DDim...>(
697 detail::LambdaMemElem<DDim>::run(ddc::DiscreteElement<DDim>(delems...))...));
700 template <
class... ODDim>
701 KOKKOS_FUNCTION
constexpr auto operator[](
702 ddc::DiscreteElement<ODDim...>
const& slice_spec)
const noexcept
704 ddc::ChunkSpan chunkspan = ddc::ChunkSpan<
706 ddc::DiscreteDomain<DDim...>,
710 ddc::DiscreteElement<ODDim...>(detail::LambdaMemElem<ODDim>::run(slice_spec)...));
713 ddc::detail::convert_type_seq_to_discrete_domain_t<ddc::type_seq_remove_t<
714 ddc::detail::TypeSeq<DDim...>,
715 ddc::detail::TypeSeq<ODDim...>>>,
716 typename decltype(chunkspan)::layout_type,
717 MemorySpace>(chunkspan);
720 template <
class... DElems>
721 KOKKOS_FUNCTION ElementType get(DElems
const&... delems)
const noexcept
723 if constexpr (
sizeof...(DDim) == 0) {
724 return operator()(delems...);
726 return detail::Access<
728 ddc::DiscreteDomain<DDim...>,
731 ddc::DiscreteElement<DDim...>,
732 ddc::detail::TypeSeq<>,
733 DDim...>::run(*
this, ddc::DiscreteElement<DDim...>(delems...));
739 ddc::DiscreteDomain<DDim...>,
744 ddc::DiscreteDomain<DDim...>,
746 MemorySpace>& tensor)
748 ddc::annotated_for_each(this->domain(), [&](ddc::DiscreteElement<DDim...> elem) {
749 this->mem(elem) += tensor.mem(elem);
756 ddc::DiscreteDomain<DDim...>,
759 operator*=(
const ElementType scalar)
761 ddc::annotated_for_each(this->domain(), [&](ddc::DiscreteElement<DDim...> elem) {
762 this->mem(elem) *= scalar;
768template <
class ElementType,
class SupportType,
class Allocator>
769Tensor(ddc::Chunk<ElementType, SupportType, Allocator>)
772template <
class ElementType,
class SupportType,
class LayoutStr
idedPolicy,
class MemorySpace>
773Tensor(ddc::ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>)
779template <
class Dom1,
class Dom2>
780struct NaturalTensorProdDomain;
782template <
class... DDim1,
class... DDim2>
783struct NaturalTensorProdDomain<ddc::DiscreteDomain<DDim1...>, ddc::DiscreteDomain<DDim2...>>
785 using type = ddc::detail::convert_type_seq_to_discrete_domain_t<ddc::type_seq_merge_t<
786 ddc::type_seq_remove_t<ddc::detail::TypeSeq<DDim1...>, ddc::detail::TypeSeq<DDim2...>>,
787 ddc::type_seq_remove_t<
788 ddc::detail::TypeSeq<DDim2...>,
789 ddc::detail::TypeSeq<DDim1...>>>>;
810template <
class HeadDDim1TypeSeq,
class ContractDDimTypeSeq,
class TailDDim2TypeSeq>
811struct NaturalTensorProd;
813template <
class... HeadDDim1,
class... ContractDDim,
class... TailDDim2>
814struct NaturalTensorProd<
815 ddc::detail::TypeSeq<HeadDDim1...>,
816 ddc::detail::TypeSeq<ContractDDim...>,
817 ddc::detail::TypeSeq<TailDDim2...>>
819 template <
class ElementType,
class LayoutStr
idedPolicy,
class MemorySpace>
820 KOKKOS_FUNCTION
static Tensor<
822 ddc::DiscreteDomain<HeadDDim1..., TailDDim2...>,
826 ddc::DiscreteDomain<HeadDDim1..., TailDDim2...>,
828 MemorySpace> prod_tensor,
830 ddc::DiscreteDomain<HeadDDim1..., ContractDDim...>,
832 MemorySpace> tensor1,
834 ddc::DiscreteDomain<ContractDDim..., TailDDim2...>,
836 MemorySpace> tensor2)
838 ddc::annotated_for_each(
839 prod_tensor.domain(),
840 [&](ddc::DiscreteElement<HeadDDim1..., TailDDim2...> elem) {
841 prod_tensor(elem) = ddc::annotated_transform_reduce(
842 tensor1.template domain<ContractDDim...>(),
844 ddc::reducer::sum<ElementType>(),
845 [&](ddc::DiscreteElement<ContractDDim...> contract_elem) {
846 return tensor1(ddc::select<HeadDDim1...>(elem), contract_elem)
847 * tensor2(ddc::select<TailDDim2...>(elem), contract_elem);
857 TensorNatIndex... ProdDDim,
858 TensorNatIndex... DDim1,
859 TensorNatIndex... DDim2,
861 class LayoutStridedPolicy,
863Tensor<ElementType, ddc::DiscreteDomain<ProdDDim...>, LayoutStridedPolicy, MemorySpace> tensor_prod(
864 Tensor<ElementType, ddc::DiscreteDomain<ProdDDim...>, LayoutStridedPolicy, MemorySpace>
866 Tensor<ElementType, ddc::DiscreteDomain<DDim1...>, LayoutStridedPolicy, MemorySpace>
868 Tensor<ElementType, ddc::DiscreteDomain<DDim2...>, LayoutStridedPolicy, MemorySpace>
871 static_assert(std::is_same_v<
872 ddc::type_seq_remove_t<
873 ddc::detail::TypeSeq<DDim1...>,
874 ddc::detail::TypeSeq<ProdDDim...>>,
875 ddc::type_seq_remove_t<
876 ddc::detail::TypeSeq<DDim2...>,
877 ddc::detail::TypeSeq<ProdDDim...>>>);
878 return detail::NaturalTensorProd<
879 ddc::type_seq_remove_t<
880 ddc::detail::TypeSeq<ProdDDim...>,
881 ddc::detail::TypeSeq<DDim2...>>,
882 ddc::type_seq_remove_t<
883 ddc::detail::TypeSeq<DDim1...>,
884 ddc::detail::TypeSeq<ProdDDim...>>,
885 ddc::type_seq_remove_t<
886 ddc::detail::TypeSeq<ProdDDim...>,
887 ddc::detail::TypeSeq<DDim1...>>>::run(prod_tensor, tensor1, tensor2);
892template <
class HeadDom,
class InterestDom,
class TailDom>
895template <
class... HeadDDim,
class InterestDDim>
897 ddc::DiscreteDomain<HeadDDim...>,
898 ddc::DiscreteDomain<InterestDDim>,
899 ddc::DiscreteDomain<>>
901 template <
class TensorType>
902 static std::string run(
904 TensorType
const& tensor,
905 ddc::DiscreteElement<HeadDDim...> i)
907 for (ddc::DiscreteElement<InterestDDim> elem :
908 ddc::DiscreteDomain<InterestDDim>(tensor.natural_domain())) {
910 + std::to_string(tensor.get(tensor.access_element(
911 ddc::DiscreteElement<HeadDDim..., InterestDDim>(i, elem))));
918template <
class... HeadDDim,
class InterestDDim,
class HeadOfTailDDim,
class... TailOfTailDDim>
920 ddc::DiscreteDomain<HeadDDim...>,
921 ddc::DiscreteDomain<InterestDDim>,
922 ddc::DiscreteDomain<HeadOfTailDDim, TailOfTailDDim...>>
924 template <
class TensorType>
925 static std::string run(
927 TensorType
const& tensor,
928 ddc::DiscreteElement<HeadDDim...> i)
931 for (ddc::DiscreteElement<InterestDDim> elem :
932 ddc::DiscreteDomain<InterestDDim>(tensor.natural_domain())) {
934 ddc::DiscreteDomain<HeadDDim..., InterestDDim>,
935 ddc::DiscreteDomain<HeadOfTailDDim>,
936 ddc::DiscreteDomain<TailOfTailDDim...>>::
937 run(str, tensor, ddc::DiscreteElement<HeadDDim..., InterestDDim>(i, elem));
946template <misc::Specialization<Tensor> TensorType>
947std::ostream& operator<<(std::ostream& os, TensorType
const& tensor)
949 std::string str =
"";
950 os << detail::PrintTensor<
951 ddc::DiscreteDomain<>,
952 ddc::DiscreteDomain<ddc::type_seq_element_t<
954 ddc::to_type_seq_t<typename TensorType::natural_domain_t>>>,
955 ddc::detail::convert_type_seq_to_discrete_domain_t<ddc::type_seq_remove_t<
956 ddc::to_type_seq_t<typename TensorType::natural_domain_t>,
957 ddc::detail::TypeSeq<ddc::type_seq_element_t<
959 ddc::to_type_seq_t<typename TensorType::natural_domain_t>>>>>>::
960 run(str, tensor, ddc::DiscreteElement<>());
ddc::cartesian_prod_t< std::conditional_t< TensorNatIndex< Index >, ddc::DiscreteDomain< Index >, typename Index::subindices_domain_t >... > natural_domain_t
constexpr TensorAccessor()
static constexpr natural_domain_t natural_domain()
static constexpr natural_domain_t::discrete_element_type canonical_natural_element(ddc::DiscreteElement< MemIndex... > mem_elem)
static constexpr discrete_domain_type domain()
static constexpr discrete_element_type access_element()
static constexpr discrete_domain_type access_domain()
ddc::DiscreteDomain< Index... > discrete_domain_type
ddc::DiscreteElement< Index... > discrete_element_type
ddc:: ChunkSpan< ElementType, ddc::DiscreteDomain< DDim... >, LayoutStridedPolicy, MemorySpace > base_type
static constexpr accessor_t accessor()
base_type::discrete_domain_type discrete_domain_type
ddc::cartesian_prod_t< non_indices_domain_t, typename accessor_t::natural_domain_t > natural_domain_t
base_type::discrete_element_type discrete_element_type
ddc::detail::convert_type_seq_to_discrete_domain_t< ddc::type_seq_remove_t< ddc::to_type_seq_t< discrete_domain_type >, ddc::to_type_seq_t< indices_domain_t > > > non_indices_domain_t
tensor_accessor_for_domain_t< ddc::cartesian_prod_t< std::conditional_t< TensorIndex< DDim >, ddc::DiscreteDomain< DDim >, ddc::DiscreteDomain<> >... > > accessor_t
KOKKOS_FUNCTION constexpr Tensor(ddc::ChunkSpan< ElementType, ddc::DiscreteDomain< DDim... >, LayoutStridedPolicy, MemorySpace > other) noexcept
accessor_t::discrete_domain_type indices_domain_t
base_type::reference reference
Tensor(ddc::Chunk< ElementType, SupportType, Allocator >) -> Tensor< ElementType, SupportType, Kokkos::layout_right, typename Allocator::memory_space >
detail::NaturalTensorProdDomain< Dom1, Dom2 >::type natural_tensor_prod_domain_t
natural_tensor_prod_domain_t< Dom1, Dom2 > natural_tensor_prod_domain(Dom1 dom1, Dom2 dom2)
typename detail::NaturalDomainType< Index >::type natural_domain_t
detail::TensorAccessorForDomain< Dom >::type tensor_accessor_for_domain_t
The top-level namespace of SimiLie.
static KOKKOS_FUNCTION constexpr std::size_t mem_id(std::size_t const natural_id)
static KOKKOS_FUNCTION constexpr std::size_t mem_id()
ddc::DiscreteDomain<> subindices_domain_t
static KOKKOS_FUNCTION constexpr subindices_domain_t subindices_domain()
static KOKKOS_FUNCTION constexpr std::size_t access_id_to_mem_id(std::size_t access_id)
static constexpr bool is_explicitely_stored_tensor
static KOKKOS_FUNCTION constexpr std::size_t access_size()
static KOKKOS_FUNCTION constexpr std::size_t access_id(std::size_t const natural_id)
ddc::detail::TypeSeq< CDim... > type_seq_dimensions
static KOKKOS_FUNCTION constexpr std::size_t rank()
static KOKKOS_FUNCTION constexpr Tensor::element_type process_access(const FunctorType &access, Tensor tensor, Elem elem)
static KOKKOS_FUNCTION constexpr std::size_t size()
static KOKKOS_FUNCTION constexpr std::size_t mem_size()
static KOKKOS_FUNCTION constexpr std::array< std::size_t, rank()> mem_id_to_canonical_natural_ids(std::size_t mem_id)
static constexpr bool is_tensor_natural_index
static constexpr bool is_tensor_index