1#ifndef DUNE_FEM_FUNCTION_TUPLEDISCRETEFUNCTION_SCALARPRODUCTS_HH
2#define DUNE_FEM_FUNCTION_TUPLEDISCRETEFUNCTION_SCALARPRODUCTS_HH
20 template<
class ... DiscreteFunctions >
25 typedef std::tuple< ParallelScalarProduct< DiscreteFunctions > ... > ParallelScalarProductTuple;
27 typedef decltype ( std::index_sequence_for< DiscreteFunctions ... >() ) Sequence;
35 : tuple_( createTuple(
space, Sequence() ) )
45 template<
class OtherDiscreteFunction >
48 DUNE_THROW( NotImplemented,
"Method scalarProductDofs ( DofVectorType, OtherDofVector ) not implemented" );
53 template< std::size_t ... I >
56 return Std::sum( std::get< I >( tuple_ ).
scalarProductDofs( x.template subDiscreteFunction< I >(), y.template subDiscreteFunction< I >() ) ... );
59 template< std::size_t ... I >
62 return std::make_tuple( std::tuple_element< I, ParallelScalarProductTuple >::type(
space.template subDiscreteFunctionSpace< I >() ) ... );
const DiscreteFunctionSpaceType & space_
Definition: common/scalarproducts.hh:173
const DiscreteFunctionSpaceType & space() const
Definition: common/scalarproducts.hh:102
RangeFieldType scalarProductDofs(const DiscreteFunctionType &x, const OtherDiscreteFunctionType &y) const
evaluate scalar product and omit auxiliary nodes
Definition: common/scalarproducts.hh:109
DiscreteFunctionSpaceType::RangeFieldType RangeFieldType
type of range field
Definition: common/scalarproducts.hh:86
Definition: bindguard.hh:11
static constexpr std::decay_t< T > sum(T a)
Definition: utility.hh:33
DiscreteFunctionSpaceType::RangeFieldType RangeFieldType
type of range field, i.e. dof type
Definition: common/discretefunction.hh:109
Definition: common/scalarproducts.hh:73
forward declaration
Definition: tuplediscretefunction/discretefunction.hh:51
Definition: tuplediscretefunction/scalarproducts.hh:22
TupleDiscreteFunction< DiscreteFunctions ... > DiscreteFunctionType
Definition: tuplediscretefunction/scalarproducts.hh:30
static ParallelScalarProductTuple createTuple(const DiscreteFunctionSpaceType &space, std::index_sequence< I ... >)
Definition: tuplediscretefunction/scalarproducts.hh:60
RangeFieldType scalarProductDofs(const DiscreteFunctionType &x, const DiscreteFunctionType &y) const
Definition: tuplediscretefunction/scalarproducts.hh:40
ParallelScalarProductTuple tuple_
Definition: tuplediscretefunction/scalarproducts.hh:66
DiscreteFunctionType::RangeFieldType RangeFieldType
Definition: tuplediscretefunction/scalarproducts.hh:32
ParallelScalarProduct(const DiscreteFunctionSpaceType &space)
Definition: tuplediscretefunction/scalarproducts.hh:34
DiscreteFunctionType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
Definition: tuplediscretefunction/scalarproducts.hh:31
const DiscreteFunctionSpaceType & space_
Definition: tuplediscretefunction/scalarproducts.hh:65
RangeFieldType scalarProductDofs(const DiscreteFunctionType &x, const DiscreteFunctionType &y, std::index_sequence< I ... >) const
Definition: tuplediscretefunction/scalarproducts.hh:54
RangeFieldType scalarProductDofs(const DiscreteFunctionType &x, const OtherDiscreteFunction &y) const
Definition: tuplediscretefunction/scalarproducts.hh:46
const DiscreteFunctionSpaceType & space() const
Definition: tuplediscretefunction/scalarproducts.hh:38
Definition: tuplespace.hh:192