8#include <similie/exterior/hodge_star.hpp>
9#include <similie/misc/specialization.hpp>
10#include <similie/tensor/character.hpp>
11#include <similie/tensor/tensor_impl.hpp>
13#include <Kokkos_StdAlgorithms.hpp>
16#include "cosimplex.hpp"
26struct CodifferentialType;
32 class LayoutStridedPolicy1,
33 class LayoutStridedPolicy2,
35struct CodifferentialType<
38 LayoutStridedPolicy2>>
40 using type = Cosimplex<
Simplex<K - 1, Tag...>, ElementType>;
45template <misc::Specialization<Cochain> CochainType>
50template <
class TagToRemoveFromCochain,
class CochainTag>
51struct CodifferentialIndex;
53template <tensor::TensorNatIndex TagToRemoveFromCochain, tensor::TensorNatIndex CochainTag>
54 requires(CochainTag::rank() == 1 && std::is_same_v<TagToRemoveFromCochain, CochainTag>)
55struct CodifferentialIndex<TagToRemoveFromCochain, CochainTag>
60template <tensor::TensorNatIndex TagToRemoveFromCochain, tensor::TensorNatIndex Tag>
61struct CodifferentialIndex<
62 TagToRemoveFromCochain,
63 tensor::TensorAntisymmetricIndex<TagToRemoveFromCochain, Tag>>
69 requires(
sizeof...(Tag) > 1)
70struct CodifferentialIndex<
71 TagToRemoveFromCochain,
79template <
class TagToRemoveFromCochain,
class CochainTag>
81 typename detail::CodifferentialIndex<TagToRemoveFromCochain, CochainTag>::type;
89struct CodifferentialTensorType;
98struct CodifferentialTensorType<
99 TagToRemoveFromCochain,
101 tensor::Tensor<ElementType, ddc::DiscreteDomain<DDim...>, SupportType, MemorySpace>>
103 static_assert(ddc::type_seq_contains_v<
104 ddc::detail::TypeSeq<CochainIndex>,
105 ddc::detail::TypeSeq<DDim...>>);
108 ddc::replace_dim_of_t<
109 ddc::DiscreteDomain<DDim...>,
123 CodifferentialTensorType<TagToRemoveFromCochain, CochainTag, TensorType>::type;
127template <std::
size_t I,
class T>
132template <
class Ids,
class T>
133struct CodifferentialDummyIndexSeq_;
135template <std::size_t... Id,
class T>
136struct CodifferentialDummyIndexSeq_<std::index_sequence<Id...>, T>
138 using type = ddc::detail::TypeSeq<tensor::Covariant<CodifferentialDummyIndex<Id, T>>...>;
141template <std::
size_t EndId,
class T>
142struct CodifferentialDummyIndexSeq;
144template <std::
size_t EndId,
class T>
146struct CodifferentialDummyIndexSeq<EndId, T>
148 using type = ddc::detail::TypeSeq<>;
151template <std::
size_t EndId,
class T>
153struct CodifferentialDummyIndexSeq<EndId, T>
155 using type =
typename CodifferentialDummyIndexSeq_<std::make_index_sequence<EndId>, T>::type;
168 ExecSpace
const& exec_space,
170 codifferential_tensor,
172 MetricType inv_metric)
176 using NuLowSeq =
typename detail::CodifferentialDummyIndexSeq<
177 TagToRemoveFromCochain::size() - CochainTag::rank(),
178 TagToRemoveFromCochain>::type;
179 using RhoLowSeq = ddc::type_seq_merge_t<ddc::detail::TypeSeq<TagToRemoveFromCochain>, NuLowSeq>;
181 using SigmaLowSeq = ddc::type_seq_remove_t<
183 ddc::detail::TypeSeq<TagToRemoveFromCochain>>;
190 ddc::cartesian_prod_t<typename MetricType::non_indices_domain_t, HodgeStarDomain>
191 hodge_star_dom(inv_metric.non_indices_domain(), hodge_star_accessor.domain());
192 ddc::Chunk hodge_star_alloc(
194 ddc::KokkosAllocator<double, typename ExecSpace::memory_space>());
200 NuLowSeq>(exec_space, hodge_star, inv_metric);
205 dual_tensor_accessor;
206 ddc::cartesian_prod_t<
207 typename TensorType::non_indices_domain_t,
210 dual_tensor_dom(tensor.non_indices_domain(), dual_tensor_accessor.domain());
211 ddc::Chunk dual_tensor_alloc(
213 ddc::KokkosAllocator<double, typename ExecSpace::memory_space>());
216 ddc::parallel_for_each(
218 dual_tensor.non_indices_domain(),
219 KOKKOS_LAMBDA(
typename TensorType::non_indices_domain_t::discrete_element_type elem) {
226 dual_codifferential_accessor;
227 ddc::cartesian_prod_t<
228 typename TensorType::non_indices_domain_t,
231 dual_codifferential_dom(
232 tensor.non_indices_domain(),
233 dual_codifferential_accessor.domain());
234 ddc::Chunk dual_codifferential_alloc(
235 dual_codifferential_dom,
236 ddc::KokkosAllocator<double, typename ExecSpace::memory_space>());
239 TagToRemoveFromCochain,
242 NuLowSeq>>(exec_space, dual_codifferential, dual_tensor);
246 hodge_star_accessor2;
247 ddc::cartesian_prod_t<typename MetricType::non_indices_domain_t, HodgeStarDomain2>
248 hodge_star_dom2(inv_metric.non_indices_domain(), hodge_star_accessor2.domain());
249 ddc::Chunk hodge_star_alloc2(
251 ddc::KokkosAllocator<double, typename ExecSpace::memory_space>());
257 SigmaLowSeq>(exec_space, hodge_star2, inv_metric);
260 ddc::parallel_for_each(
262 codifferential_tensor.non_indices_domain(),
263 KOKKOS_LAMBDA(
typename TensorType::non_indices_domain_t::discrete_element_type elem) {
265 codifferential_tensor[elem],
266 dual_codifferential[elem],
269 (TagToRemoveFromCochain::size() * (CochainTag::rank() + 1) + 1) % 2 == 1) {
270 codifferential_tensor[elem] *= -1;
274 return codifferential_tensor;
HodgeStarType fill_hodge_star(ExecSpace const &exec_space, HodgeStarType hodge_star, MetricDeterminantType metric_determinant, MetricProdType metric_prod)
Cochain(ChainType, TensorType) -> Cochain< ChainType, typename TensorType::value_type, ddc::detail::mdspan_to_kokkos_layout_t< typename TensorType::layout_type > >
Simplex(ddc::DiscreteElement< Tag... >, ddc::DiscreteVector< T... >) -> Simplex< sizeof...(T), Tag... >
typename detail:: CodifferentialTensorType< TagToRemoveFromCochain, CochainTag, TensorType >::type codifferential_tensor_t
Chain(Head, Tail...) -> Chain< typename Head::value_type, typename Head::array_layout, typename Head::memory_space >
ddc::detail::convert_type_seq_to_discrete_domain_t< ddc::type_seq_merge_t< ddc::detail::TypeSeq< misc::convert_type_seq_to_t< tensor::TensorFullIndex, Indices1 > >, std::conditional_t<(ddc::type_seq_size_v< Indices2 >==0), ddc::detail::TypeSeq<>, ddc::detail::TypeSeq< misc::convert_type_seq_to_t< tensor::TensorAntisymmetricIndex, Indices2 > > > > > hodge_star_domain_t
coboundary_tensor_t< TagToAddToCochain, CochainTag, TensorType > deriv(ExecSpace const &exec_space, coboundary_tensor_t< TagToAddToCochain, CochainTag, TensorType > coboundary_tensor, TensorType tensor)
typename detail::CodifferentialIndex< TagToRemoveFromCochain, CochainTag >::type codifferential_index_t
codifferential_tensor_t< TagToRemoveFromCochain, CochainTag, TensorType > codifferential(ExecSpace const &exec_space, codifferential_tensor_t< TagToRemoveFromCochain, CochainTag, TensorType > codifferential_tensor, TensorType tensor, MetricType inv_metric)
typename detail::CodifferentialType< CochainType >::type codifferential_t
typename detail::ConvertTypeSeqTo< T, Seq >::type convert_type_seq_to_t
Tensor(ddc::Chunk< ElementType, SupportType, Allocator >) -> Tensor< ElementType, SupportType, Kokkos::layout_right, typename Allocator::memory_space >
detail::Upper< T >::type upper_t
Tensor< ElementType, ddc::DiscreteDomain< ProdDDim... >, LayoutStridedPolicy, MemorySpace > tensor_prod(Tensor< ElementType, ddc::DiscreteDomain< ProdDDim... >, LayoutStridedPolicy, MemorySpace > prod_tensor, Tensor< ElementType, ddc::DiscreteDomain< DDim1... >, LayoutStridedPolicy, MemorySpace > tensor1, Tensor< ElementType, ddc::DiscreteDomain< DDim2... >, LayoutStridedPolicy, MemorySpace > tensor2)
detail::Uncharacterize< Index >::type uncharacterize_t
detail::Lower< T >::type lower_t
bool constexpr is_covariant_v
detail::TensorAccessorForDomain< Dom >::type tensor_accessor_for_domain_t
The top-level namespace of SimiLie.