Loading [MathJax]/extensions/TeX/AMSsymbols.js

DUNE-ACFEM (unstable)

divergence.hh
1#ifndef __DUNE_ACFEM_TENSOR_OPERATIONS_DIVERGENCE_HH__
2#define __DUNE_ACFEM_TENSOR_OPERATIONS_DIVERGENCE_HH__
3
4#include "derivative.hh"
5
6namespace Dune::ACFem {
7
8 namespace Tensor {
9
11 template<std::size_t IndeterminateId, std::size_t... Dims, class T,
12 std::enable_if_t<IsTensorOperand<T>::value, int> = 0>
13 constexpr decltype(auto) divergence(T&& t, Seq<Dims...> = Seq<Dims...>{}, IndexConstant<IndeterminateId> = IndexConstant<IndeterminateId>{})
14 {
15 using IndeterminateSignature = Seq<Dims...>;
16 constexpr std::size_t indeterminateRank = sizeof...(Dims);
17 using Signature = typename TensorTraits<T>::Signature;
18 using DivTailSignature = TailPart<indeterminateRank, Signature>;
19
20 static_assert(std::is_same<DivTailSignature, IndeterminateSignature>::value,
21 "Tail of signature does not match signature of indeterminate.");
22
23 constexpr std::size_t offset = TensorTraits<T>::rank - indeterminateRank;
24 using PosLeft = MakeIndexSequence<2*indeterminateRank, offset>;
25 using PosRight = MakeIndexSequence<2*indeterminateRank>;
26
27 return einsum<PosLeft, PosRight>(derivative<IndeterminateId, Dims...>(std::forward<T>(t)), blockEye<2>(IndeterminateSignature{}, Expressions::Disclosure{}));
28 }
29
31 template<
32 class T, class X,
33 std::enable_if_t<(IsTensorOperand<T>::value
34 && IsTensor<X>::value
35 && IsIndeterminateExpression<EnclosedType<X> >::value
36 ), int> = 0>
37 constexpr decltype(auto) divergence(T&& t, X&&)\
38 {
39 using XType = EnclosedType<X>;
40 constexpr std::size_t id = IndeterminateTraits<XType>::id_;
41 using Signature = typename TensorTraits<XType>::Signature;
42
43 return divergence<id>(std::forward<T>(t), Signature{});
44 }
45
46 } // Tensor::
47
48} // Dune::ACFEM::
49
50#endif // __DUNE_ACFEM_TENSOR_OPERATIONS_DIVERGENCE_HH__
A namespace encapsulating everything defined in our dune-acfem project.
Definition: ellipticfemscheme.hh:56
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Mar 12, 23:28, 2025)