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(
204 std::array<std::size_t,
sizeof...(Subindex)> {ddc::type_seq_rank_v<
205 typename ddc::type_seq_element_t<
206 ddc::type_seq_rank_v<
208 ddc::detail::TypeSeq<Subindex...>>,
209 ddc::detail::TypeSeq<CDim...>>,
210 typename Subindex::type_seq_dimensions>...});
216template <
class Index,
class IndicesTypeSeq,
class... CDim>
217static constexpr std::size_t access_id()
220 return IdFromTypeSeqDims<
222 ddc::DiscreteDomain<Index>,
223 type_seq_dims_at_ints_t<
224 ddc::detail::TypeSeq<CDim...>,
226 NbDimsBeforeIndex<Index, IndicesTypeSeq>::run(0),
227 std::make_integer_sequence<std::size_t, Index::rank()>>>>::run();
229 return IdFromTypeSeqDims<
231 typename Index::subindices_domain_t,
232 type_seq_dims_at_ints_t<
233 ddc::detail::TypeSeq<CDim...>,
235 NbDimsBeforeIndex<Index, IndicesTypeSeq>::run(0),
236 std::make_integer_sequence<std::size_t, Index::rank()>>>>::run();
240template <
class Index,
class SubindicesDomain>
243template <
class Index,
class... Subindex>
244struct IdFromElem<Index, ddc::DiscreteDomain<Subindex...>>
246 template <
class Elem>
247 static constexpr std::size_t run(Elem natural_elem)
250 return Index::access_id(natural_elem.template uid<Index>());
252 return Index::access_id(
253 std::array<std::size_t,
sizeof...(Subindex)> {
254 natural_elem.template uid<Subindex>()...});
259template <
class Index,
class IndicesTypeSeq,
class... NaturalIndex>
260static constexpr std::size_t access_id(ddc::DiscreteElement<NaturalIndex...> natural_elem)
263 return IdFromElem<Index, ddc::DiscreteDomain<Index>>::run(natural_elem);
265 return IdFromElem<Index, typename Index::subindices_domain_t>::run(natural_elem);
272template <TensorIndex... Index>
284 ddc::DiscreteDomain<Index>,
285 typename Index::subindices_domain_t>...>;
293 template <
class... CDim>
296 template <
class... NaturalIndex>
298 ddc::DiscreteElement<NaturalIndex...> natural_elem);
300 template <
class... MemIndex>
302 ddc::DiscreteElement<MemIndex...> mem_elem);
308struct TensorAccessorForTypeSeq;
311struct TensorAccessorForTypeSeq<ddc::detail::TypeSeq<Index...>>
317struct TensorAccessorForDomain;
319template <
class... DDim>
320struct TensorAccessorForDomain<ddc::DiscreteDomain<DDim...>>
322 using type =
typename TensorAccessorForTypeSeq<
323 ddc::to_type_seq_t<ddc::cartesian_prod_t<std::conditional_t<
325 ddc::DiscreteDomain<DDim>,
326 ddc::DiscreteDomain<>>...>>>::type;
331template <misc::Specialization<ddc::DiscreteDomain> Dom>
340template <
class Index>
341constexpr auto natural_domain()
344 return typename ddc::DiscreteDomain<
345 Index>(ddc::DiscreteElement<Index>(0), ddc::DiscreteVector<Index>(Index::size()));
347 return Index::subindices_domain();
352template <TensorIndex... Index>
361 return ddc::DiscreteDomain<Index...>(
362 ddc::DiscreteElement<Index...>(ddc::DiscreteElement<Index>(0)...),
363 ddc::DiscreteVector<Index...>(ddc::DiscreteVector<Index>(Index::mem_size())...));
369 return ddc::DiscreteDomain<Index...>(
370 ddc::DiscreteElement<Index...>(ddc::DiscreteElement<Index>(0)...),
371 ddc::DiscreteVector<Index...>(ddc::DiscreteVector<Index>(Index::access_size())...));
375template <
class... CDim>
378 return ddc::DiscreteElement<Index...>(ddc::DiscreteElement<Index>(
379 detail::access_id<Index, ddc::detail::TypeSeq<Index...>, CDim...>())...);
383template <
class... NaturalIndex>
385 [[maybe_unused]] ddc::DiscreteElement<NaturalIndex...> natural_elem)
387 return ddc::DiscreteElement<Index...>(
388 ddc::DiscreteElement<Index>(detail::access_id<Index, ddc::detail::TypeSeq<Index...>>(
389 typename natural_domain_t::discrete_element_type(natural_elem)))...);
393template <
class... MemIndex>
395 Index...>::canonical_natural_element(ddc::DiscreteElement<MemIndex...> mem_elem)
397 std::array<std::size_t, natural_domain_t::rank()> ids {};
398 auto it = ids.begin();
401 auto i = MemIndex::mem_id_to_canonical_natural_ids(
402 mem_elem.template uid<MemIndex>());
403 misc::detail::copy(i.begin(), i.end(), it);
407 typename natural_domain_t::discrete_element_type natural_elem;
408 ddc::detail::array(natural_elem) = std::array<std::size_t, natural_domain_t::rank()>(ids);
418 class IndexHeadsTypeSeq,
429struct Access<TensorField, Element, ddc::detail::TypeSeq<IndexHead...>, IndexInterest, IndexTail...>
431 template <
class Elem>
432 KOKKOS_FUNCTION
static TensorField::element_type run(TensorField tensor_field, Elem
const& elem)
440 if constexpr (
sizeof...(IndexTail) > 0) {
442 return IndexInterest::template process_access<TensorField, Elem, IndexInterest>(
443 KOKKOS_LAMBDA(TensorField tensor_field_, Elem elem_)
444 ->TensorField::element_type {
448 ddc::detail::TypeSeq<IndexHead..., IndexInterest>,
449 IndexTail...>::run(tensor_field_, elem_);
457 ddc::detail::TypeSeq<IndexHead..., IndexInterest>,
458 IndexTail...>::run(tensor_field, elem);
461 if constexpr (TensorIndex<IndexInterest>) {
462 return IndexInterest::template process_access<TensorField, Elem, IndexInterest>(
463 KOKKOS_LAMBDA(TensorField tensor_field_, Elem elem_)
464 ->TensorField::element_type {
465 double tensor_field_value = 0;
466 if constexpr (IndexInterest::is_explicitely_stored_tensor) {
467 std::size_t
const mem_id
468 = IndexInterest::access_id_to_mem_id(
469 elem_.template uid<IndexInterest>());
470 if (mem_id != std::numeric_limits<std::size_t>::max()) {
473 .mem(ddc::DiscreteElement<
474 IndexHead...>(elem_),
475 ddc::DiscreteElement<
476 IndexInterest>(mem_id));
478 tensor_field_value = 1.;
483 std::vector<std::size_t>>
const mem_lin_comb
484 = IndexInterest::access_id_to_mem_lin_comb(
485 elem_.template uid<IndexInterest>());
487 if (std::get<0>(mem_lin_comb).size() > 0) {
488 for (std::size_t i = 0;
489 i < std::get<0>(mem_lin_comb).size();
492 += std::get<0>(mem_lin_comb)[i]
494 ddc::DiscreteElement<
495 IndexHead...>(elem_),
496 ddc::DiscreteElement<
497 IndexInterest>(std::get<
502 tensor_field_value = 1.;
506 return tensor_field_value;
511 return tensor_field(elem);
518template <
class InterestDim>
521 template <
class Elem>
522 KOKKOS_FUNCTION
static ddc::DiscreteElement<InterestDim> run(Elem elem)
524 return ddc::DiscreteElement<InterestDim>(elem);
528template <TensorIndex InterestDim>
529struct LambdaMemElem<InterestDim>
531 template <
class Elem>
532 KOKKOS_FUNCTION
static ddc::DiscreteElement<InterestDim> run(Elem elem)
534 if constexpr (InterestDim::is_explicitely_stored_tensor) {
535 std::size_t
const mem_id
536 = InterestDim::access_id_to_mem_id(elem.template uid<InterestDim>());
537 assert(mem_id != std::numeric_limits<std::size_t>::max()
538 &&
"mem_elem is not defined because mem_id() returned a max integer. Maybe you "
539 "used Tensor::operator() in place of Tensor::get ?");
540 return ddc::DiscreteElement<InterestDim>(mem_id);
542 std::pair<std::vector<double>, std::vector<std::size_t>>
const mem_lin_comb
543 = InterestDim::access_id_to_mem_lin_comb(elem.template uid<InterestDim>());
544 assert(std::get<0>(mem_lin_comb).size() > 0
545 &&
"mem_elem is not defined because mem_lin_comb contains no id. Maybe you used "
546 "Tensor::operator() in place of Tensor::get ?");
547 assert(std::get<0>(mem_lin_comb).size() == 1
548 &&
"mem_elem is not defined because mem_lin_comb contains several ids. Maybe "
549 "you used Tensor::operator() in place of Tensor::get ?");
550 return ddc::DiscreteElement<InterestDim>(std::get<1>(mem_lin_comb)[0]);
559template <
class ElementType,
class SupportType,
class LayoutStr
idedPolicy,
class MemorySpace>
568template <
class ElementType,
class SupportType,
class LayoutStr
idedPolicy,
class MemorySpace>
569inline constexpr bool enable_chunk<
573template <
class ElementType,
class SupportType,
class LayoutStr
idedPolicy,
class MemorySpace>
574inline constexpr bool enable_borrowed_chunk<
587template <
class ElementType,
class... DDim,
class LayoutStridedPolicy,
class MemorySpace>
588class Tensor<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>
590 ChunkSpan<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>
594 ChunkSpan<ElementType, ddc::DiscreteDomain<DDim...>, LayoutStridedPolicy, MemorySpace>;
597 using base_type::ChunkSpan;
602 using base_type::domain;
603 using base_type::operator();
605 KOKKOS_FUNCTION
constexpr explicit Tensor(
608 ddc::DiscreteDomain<DDim...>,
610 MemorySpace> other) noexcept
617 ddc::DiscreteDomain<DDim>,
618 ddc::DiscreteDomain<>>...>>;
628 = ddc::detail::convert_type_seq_to_discrete_domain_t<ddc::type_seq_remove_t<
629 ddc::to_type_seq_t<discrete_domain_type>,
630 ddc::to_type_seq_t<indices_domain_t>>>;
643 = ddc::cartesian_prod_t<non_indices_domain_t, typename accessor_t::natural_domain_t>;
647 return natural_domain_t(non_indices_domain(), accessor_t::natural_domain());
650 KOKKOS_FUNCTION
constexpr discrete_domain_type access_domain() const noexcept
652 return discrete_domain_type(non_indices_domain(), accessor_t::access_domain());
655 template <
class... CDim>
662 template <
class... Elem>
666 accessor_t::access_element(
667 typename accessor_t::natural_domain_t::discrete_element_type(elem...)),
668 typename non_indices_domain_t::discrete_element_type(elem...));
671 template <
class... Elem>
672 KOKKOS_FUNCTION
constexpr natural_domain_t::discrete_element_type canonical_natural_element(
673 Elem... mem_elem)
const noexcept
675 return typename natural_domain_t::discrete_element_type(
676 accessor_t::canonical_natural_element(
677 typename accessor_t::discrete_element_type(mem_elem...)),
678 typename non_indices_domain_t::discrete_element_type(mem_elem...));
681 template <
class... DElems>
682 KOKKOS_FUNCTION
constexpr reference mem(DElems
const&... delems)
const noexcept
684 return ddc::ChunkSpan<
686 ddc::DiscreteDomain<DDim...>,
689 operator()(delems...);
692 template <
class... DElems>
693 KOKKOS_FUNCTION
constexpr reference operator()(DElems
const&... delems)
const noexcept
695 return ddc::ChunkSpan<
697 ddc::DiscreteDomain<DDim...>,
700 operator()(ddc::DiscreteElement<DDim...>(
701 detail::LambdaMemElem<DDim>::run(ddc::DiscreteElement<DDim>(delems...))...));
704 template <
class... ODDim>
705 KOKKOS_FUNCTION
constexpr auto operator[](
706 ddc::DiscreteElement<ODDim...>
const& slice_spec)
const noexcept
708 ddc::ChunkSpan chunkspan = ddc::ChunkSpan<
710 ddc::DiscreteDomain<DDim...>,
714 ddc::DiscreteElement<ODDim...>(detail::LambdaMemElem<ODDim>::run(slice_spec)...));
717 ddc::detail::convert_type_seq_to_discrete_domain_t<ddc::type_seq_remove_t<
718 ddc::detail::TypeSeq<DDim...>,
719 ddc::detail::TypeSeq<ODDim...>>>,
720 typename decltype(chunkspan)::layout_type,
721 MemorySpace>(chunkspan);
724 template <
class... DElems>
725 KOKKOS_FUNCTION ElementType get(DElems
const&... delems)
const noexcept
727 if constexpr (
sizeof...(DDim) == 0) {
728 return operator()(delems...);
730 return detail::Access<
732 ddc::DiscreteDomain<DDim...>,
735 ddc::DiscreteElement<DDim...>,
736 ddc::detail::TypeSeq<>,
737 DDim...>::run(*
this, ddc::DiscreteElement<DDim...>(delems...));
743 ddc::DiscreteDomain<DDim...>,
748 ddc::DiscreteDomain<DDim...>,
750 MemorySpace>& tensor)
752 ddc::device_for_each(this->domain(), [&](ddc::DiscreteElement<DDim...> elem) {
753 this->mem(elem) += tensor.mem(elem);
760 ddc::DiscreteDomain<DDim...>,
763 operator*=(
const ElementType scalar)
765 ddc::device_for_each(this->domain(), [&](ddc::DiscreteElement<DDim...> elem) {
766 this->mem(elem) *= scalar;
772template <
class ElementType,
class SupportType,
class Allocator>
773Tensor(ddc::Chunk<ElementType, SupportType, Allocator>)
776template <
class ElementType,
class SupportType,
class LayoutStr
idedPolicy,
class MemorySpace>
777Tensor(ddc::ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>)
783template <
class Dom1,
class Dom2>
784struct NaturalTensorProdDomain;
786template <
class... DDim1,
class... DDim2>
787struct NaturalTensorProdDomain<ddc::DiscreteDomain<DDim1...>, ddc::DiscreteDomain<DDim2...>>
789 using type = ddc::detail::convert_type_seq_to_discrete_domain_t<ddc::type_seq_merge_t<
790 ddc::type_seq_remove_t<ddc::detail::TypeSeq<DDim1...>, ddc::detail::TypeSeq<DDim2...>>,
791 ddc::type_seq_remove_t<
792 ddc::detail::TypeSeq<DDim2...>,
793 ddc::detail::TypeSeq<DDim1...>>>>;
814template <
class HeadDDim1TypeSeq,
class ContractDDimTypeSeq,
class TailDDim2TypeSeq>
815struct NaturalTensorProd;
817template <
class... HeadDDim1,
class... ContractDDim,
class... TailDDim2>
818struct NaturalTensorProd<
819 ddc::detail::TypeSeq<HeadDDim1...>,
820 ddc::detail::TypeSeq<ContractDDim...>,
821 ddc::detail::TypeSeq<TailDDim2...>>
823 template <
class ElementType,
class LayoutStr
idedPolicy,
class MemorySpace>
824 KOKKOS_FUNCTION
static Tensor<
826 ddc::DiscreteDomain<HeadDDim1..., TailDDim2...>,
830 ddc::DiscreteDomain<HeadDDim1..., TailDDim2...>,
832 MemorySpace> prod_tensor,
834 ddc::DiscreteDomain<HeadDDim1..., ContractDDim...>,
836 MemorySpace> tensor1,
838 ddc::DiscreteDomain<ContractDDim..., TailDDim2...>,
840 MemorySpace> tensor2)
842 ddc::device_for_each(
843 prod_tensor.domain(),
844 [&](ddc::DiscreteElement<HeadDDim1..., TailDDim2...> elem) {
845 prod_tensor(elem) = ddc::device_transform_reduce(
846 tensor1.template domain<ContractDDim...>(),
848 ddc::reducer::sum<ElementType>(),
849 [&](ddc::DiscreteElement<ContractDDim...> contract_elem) {
850 return tensor1(ddc::select<HeadDDim1...>(elem), contract_elem)
851 * tensor2(ddc::select<TailDDim2...>(elem), contract_elem);
861 TensorNatIndex... ProdDDim,
862 TensorNatIndex... DDim1,
863 TensorNatIndex... DDim2,
865 class LayoutStridedPolicy,
867Tensor<ElementType, ddc::DiscreteDomain<ProdDDim...>, LayoutStridedPolicy, MemorySpace> tensor_prod(
868 Tensor<ElementType, ddc::DiscreteDomain<ProdDDim...>, LayoutStridedPolicy, MemorySpace>
870 Tensor<ElementType, ddc::DiscreteDomain<DDim1...>, LayoutStridedPolicy, MemorySpace>
872 Tensor<ElementType, ddc::DiscreteDomain<DDim2...>, LayoutStridedPolicy, MemorySpace>
875 static_assert(std::is_same_v<
876 ddc::type_seq_remove_t<
877 ddc::detail::TypeSeq<DDim1...>,
878 ddc::detail::TypeSeq<ProdDDim...>>,
879 ddc::type_seq_remove_t<
880 ddc::detail::TypeSeq<DDim2...>,
881 ddc::detail::TypeSeq<ProdDDim...>>>);
882 return detail::NaturalTensorProd<
883 ddc::type_seq_remove_t<
884 ddc::detail::TypeSeq<ProdDDim...>,
885 ddc::detail::TypeSeq<DDim2...>>,
886 ddc::type_seq_remove_t<
887 ddc::detail::TypeSeq<DDim1...>,
888 ddc::detail::TypeSeq<ProdDDim...>>,
889 ddc::type_seq_remove_t<
890 ddc::detail::TypeSeq<ProdDDim...>,
891 ddc::detail::TypeSeq<DDim1...>>>::run(prod_tensor, tensor1, tensor2);
896template <
class HeadDom,
class InterestDom,
class TailDom>
899template <
class... HeadDDim,
class InterestDDim>
901 ddc::DiscreteDomain<HeadDDim...>,
902 ddc::DiscreteDomain<InterestDDim>,
903 ddc::DiscreteDomain<>>
905 template <
class TensorType>
906 static std::string run(
908 TensorType
const& tensor,
909 ddc::DiscreteElement<HeadDDim...> i)
911 for (ddc::DiscreteElement<InterestDDim> elem :
912 ddc::DiscreteDomain<InterestDDim>(tensor.natural_domain())) {
914 + std::to_string(tensor.get(tensor.access_element(
915 ddc::DiscreteElement<HeadDDim..., InterestDDim>(i, elem))));
922template <
class... HeadDDim,
class InterestDDim,
class HeadOfTailDDim,
class... TailOfTailDDim>
924 ddc::DiscreteDomain<HeadDDim...>,
925 ddc::DiscreteDomain<InterestDDim>,
926 ddc::DiscreteDomain<HeadOfTailDDim, TailOfTailDDim...>>
928 template <
class TensorType>
929 static std::string run(
931 TensorType
const& tensor,
932 ddc::DiscreteElement<HeadDDim...> i)
935 for (ddc::DiscreteElement<InterestDDim> elem :
936 ddc::DiscreteDomain<InterestDDim>(tensor.natural_domain())) {
938 ddc::DiscreteDomain<HeadDDim..., InterestDDim>,
939 ddc::DiscreteDomain<HeadOfTailDDim>,
940 ddc::DiscreteDomain<TailOfTailDDim...>>::
941 run(str, tensor, ddc::DiscreteElement<HeadDDim..., InterestDDim>(i, elem));
950template <misc::Specialization<Tensor> TensorType>
951std::ostream& operator<<(std::ostream& os, TensorType
const& tensor)
953 std::string str =
"";
954 os << detail::PrintTensor<
955 ddc::DiscreteDomain<>,
956 ddc::DiscreteDomain<ddc::type_seq_element_t<
958 ddc::to_type_seq_t<typename TensorType::natural_domain_t>>>,
959 ddc::detail::convert_type_seq_to_discrete_domain_t<ddc::type_seq_remove_t<
960 ddc::to_type_seq_t<typename TensorType::natural_domain_t>,
961 ddc::detail::TypeSeq<ddc::type_seq_element_t<
963 ddc::to_type_seq_t<typename TensorType::natural_domain_t>>>>>>::
964 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