8#include <similie/misc/macros.hpp>
9#include <similie/misc/specialization.hpp>
10#include <similie/tensor/character.hpp>
11#include <similie/tensor/tensor_impl.hpp>
13#include "coboundary.hpp"
14#include "codifferential.hpp"
24 tensor::TensorIndex MetricIndex,
25 tensor::TensorNatIndex LaplacianDummyIndex,
26 tensor::TensorIndex CochainTag,
27 misc::Specialization<tensor::Tensor> TensorType,
28 misc::Specialization<tensor::Tensor> MetricType,
30TensorType codifferential_of_coboundary(
31 ExecSpace
const& exec_space,
32 TensorType out_tensor,
34 MetricType inv_metric)
37 [[maybe_unused]] tensor::TensorAccessor<coboundary_index_t<LaplacianDummyIndex, CochainTag>>
39 ddc::cartesian_prod_t<
40 typename TensorType::non_indices_domain_t,
41 ddc::DiscreteDomain<coboundary_index_t<LaplacianDummyIndex, CochainTag>>>
42 derivative_tensor_dom(tensor.non_indices_domain(), derivative_accessor.domain());
43 ddc::Chunk derivative_tensor_alloc(
44 derivative_tensor_dom,
45 ddc::KokkosAllocator<double, typename ExecSpace::memory_space>());
56 CochainTag>>(exec_space, out_tensor, derivative_tensor, inv_metric);
62 tensor::TensorIndex MetricIndex,
63 tensor::TensorNatIndex LaplacianDummyIndex,
64 tensor::TensorIndex CochainTag,
65 misc::Specialization<tensor::Tensor> TensorType,
66 misc::Specialization<tensor::Tensor> MetricType,
68TensorType coboundary_of_codifferential(
69 ExecSpace
const& exec_space,
70 TensorType out_tensor,
72 MetricType inv_metric)
75 [[maybe_unused]] tensor::TensorAccessor<codifferential_index_t<LaplacianDummyIndex, CochainTag>>
76 codifferential_accessor;
77 ddc::cartesian_prod_t<
78 typename TensorType::non_indices_domain_t,
79 ddc::DiscreteDomain<codifferential_index_t<LaplacianDummyIndex, CochainTag>>>
80 codifferential_tensor_dom(
81 tensor.non_indices_domain(),
82 codifferential_accessor.domain());
83 ddc::Chunk codifferential_tensor_alloc(
84 codifferential_tensor_dom,
85 ddc::KokkosAllocator<double, typename ExecSpace::memory_space>());
91 CochainTag>(exec_space, codifferential_tensor, tensor, inv_metric);
98 CochainTag>>(exec_space, out_tensor, codifferential_tensor);
104struct LaplacianDummy2 : T
111 tensor::TensorIndex MetricIndex,
112 tensor::TensorNatIndex LaplacianDummyIndex,
113 tensor::TensorIndex CochainTag,
114 misc::Specialization<tensor::Tensor> TensorType,
115 misc::Specialization<tensor::Tensor> MetricType,
118 ExecSpace
const& exec_space,
119 TensorType laplacian_tensor,
121 MetricType inv_metric)
125 detail::LaplacianDummy2<tensor::uncharacterize_t<LaplacianDummyIndex>>>;
127 if constexpr (CochainTag::rank() == 0) {
128 detail::codifferential_of_coboundary<
130 LaplacianDummyIndex2,
131 CochainTag>(exec_space, laplacian_tensor, tensor, inv_metric);
132 }
else if constexpr (CochainTag::rank() < LaplacianDummyIndex::size()) {
133 auto tmp_alloc = ddc::create_mirror(exec_space, laplacian_tensor);
136 auto exec_spaces = Kokkos::Experimental::partition_space(exec_space, 1, 1);
138 detail::codifferential_of_coboundary<
140 LaplacianDummyIndex2,
141 CochainTag>(exec_spaces[0], laplacian_tensor, tensor, inv_metric);
142 detail::coboundary_of_codifferential<
145 CochainTag>(exec_spaces[1], tmp, tensor, inv_metric);
146 exec_spaces[0].fence();
147 exec_spaces[1].fence();
149 SIMILIE_DEBUG_LOG(
"similie_add_coboundary_of_codifferential_contribution_to_laplacian");
150 ddc::parallel_for_each(
151 "similie_add_coboundary_of_codifferential_contribution_to_laplacian",
153 laplacian_tensor.domain(),
154 KOKKOS_LAMBDA(
typename TensorType::discrete_element_type elem) {
155 laplacian_tensor(elem) += tmp(elem);
157 }
else if constexpr (CochainTag::rank() == LaplacianDummyIndex::size()) {
158 detail::coboundary_of_codifferential<
161 CochainTag>(exec_space, laplacian_tensor, tensor, inv_metric);
163 assert(
false &&
"Unsupported differential form in Laplacian operator");
166 return laplacian_tensor;
TensorType laplacian(ExecSpace const &exec_space, TensorType laplacian_tensor, TensorType tensor, MetricType inv_metric)
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
typename detail::CoboundaryIndex< TagToAddToCochain, CochainTag >::type coboundary_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)
Tensor(ddc::Chunk< ElementType, SupportType, Allocator >) -> Tensor< ElementType, SupportType, Kokkos::layout_right, typename Allocator::memory_space >
bool constexpr is_covariant_v
The top-level namespace of SimiLie.