1#ifndef __DUNE_ACFEM_TENSOR_OPERATIONS_DIVERGENCE_HH__
2#define __DUNE_ACFEM_TENSOR_OPERATIONS_DIVERGENCE_HH__
4#include "derivative.hh"
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>{})
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>;
20 static_assert(std::is_same<DivTailSignature, IndeterminateSignature>::value,
21 "Tail of signature does not match signature of indeterminate.");
23 constexpr std::size_t offset = TensorTraits<T>::rank - indeterminateRank;
24 using PosLeft = MakeIndexSequence<2*indeterminateRank, offset>;
25 using PosRight = MakeIndexSequence<2*indeterminateRank>;
27 return einsum<PosLeft, PosRight>(derivative<IndeterminateId, Dims...>(std::forward<T>(t)), blockEye<2>(IndeterminateSignature{}, Expressions::Disclosure{}));
33 std::enable_if_t<(IsTensorOperand<T>::value
35 && IsIndeterminateExpression<EnclosedType<X> >::value
37 constexpr decltype(
auto) divergence(T&& t, X&&)\
39 using XType = EnclosedType<X>;
40 constexpr std::size_t
id = IndeterminateTraits<XType>::id_;
41 using Signature =
typename TensorTraits<XType>::Signature;
43 return divergence<id>(std::forward<T>(t), Signature{});
A namespace encapsulating everything defined in our dune-acfem project.
Definition: ellipticfemscheme.hh:56