1#ifndef DUNE_FEM_SPACE_COMBINEDSPACE_TUPLELOCALRESTIRCTPROLONG_HH
2#define DUNE_FEM_SPACE_COMBINEDSPACE_TUPLELOCALRESTIRCTPROLONG_HH
10#include <dune/common/exceptions.hh>
11#include <dune/common/hybridutilities.hh>
29 template<
class ... DiscreteFunctionSpaces >
34 typedef std::tuple< DefaultLocalRestrictProlong< DiscreteFunctionSpaces > ... > LocalRestrictProlongTupleType;
36 static const int setSize =
sizeof...( DiscreteFunctionSpaces )-1;
39 template<
int >
struct RestrictLocal;
40 template<
int >
struct RestrictFinalize;
41 template<
int >
struct ProlongLocal;
43 template< std::size_t ... i >
44 static LocalRestrictProlongTupleType localRestrictProlongTuple ( std::tuple< const DiscreteFunctionSpaces &... > tuple, std::index_sequence< i ... > )
46 return std::make_tuple(
typename std::tuple_element< i, LocalRestrictProlongTupleType >::type( std::get< i >( tuple ) ) ...);
50 static_assert(
Std::are_all_same<
typename DiscreteFunctionSpaces::DomainFieldType ... >::value,
51 "TupleLocalRestrictProlong needs common DomainFieldType in the Spaces!" );
53 typedef std::tuple_element_t< 0, std::tuple<
typename DiscreteFunctionSpaces::DomainFieldType... > >
DomainFieldType;
56 : localRestrictProlongTuple_( localRestrictProlongTuple( tuple,
std::index_sequence_for< DiscreteFunctionSpaces ... >() ) )
61 Hybrid::forEach( std::make_index_sequence<
sizeof ... ( DiscreteFunctionSpaces ) >{},
62 [ & ](
auto i ){ std::get< i >( localRestrictProlongTuple_ ).setFatherChildWeight( weight ); } );
66 template<
class LFFather,
class LFSon,
class LocalGeometry >
68 const LocalGeometry &geometryInFather,
bool initialize )
const
72 template<
class LFFather >
78 template<
class LFFather,
class LFSon,
class LocalGeometry >
80 const LocalGeometry &geometryInFather,
bool initialize )
const
87 return needCommunication( std::index_sequence_for< DiscreteFunctionSpaces ... >() );
91 template< std::size_t ... i >
98 LocalRestrictProlongTupleType localRestrictProlongTuple_;
106 template<
class ... DiscreteFunctionSpaces >
108 struct TupleLocalRestrictProlong< DiscreteFunctionSpaces ... >::
111 template<
class LFFather,
class LFSon,
class LocalGeometry,
class Tuple >
112 static void apply (
const LFFather &lfFather, LFSon &lfSon,
const LocalGeometry &geometryInFather,
bool initialize,
115 typedef SubVector< const typename LFFather::LocalDofVectorType, OffsetSubMapper > SubDofVectorTypeFather;
116 typedef SubVector< typename LFSon::LocalDofVectorType, OffsetSubMapper > SubDofVectorTypeSon;
118 typedef typename LFFather::BasisFunctionSetType::template SubBasisFunctionSet< i >::type SubFatherBasisFunctionSetType;
119 typedef typename LFSon::BasisFunctionSetType::template SubBasisFunctionSet< i >::type SubSonBasisFunctionSetType;
121 SubFatherBasisFunctionSetType subFatherBasisFunctionSet = lfFather.basisFunctionSet().template subBasisFunctionSet< i >();
122 SubSonBasisFunctionSetType subSonBasisFunctionSet = lfSon.basisFunctionSet().template subBasisFunctionSet< i >();
124 std::size_t fatherBasisSetOffset = lfFather.basisFunctionSet().offset( i );
125 std::size_t sonBasisSetOffset = lfSon.basisFunctionSet().offset(i);
127 SubDofVectorTypeSon sonSubDofVector( lfSon.localDofVector(), OffsetSubMapper( subSonBasisFunctionSet.size(), sonBasisSetOffset ) );
128 SubDofVectorTypeFather fatherSubDofVector( lfFather.localDofVector(), OffsetSubMapper( subFatherBasisFunctionSet.size(),
129 fatherBasisSetOffset ) );
131 BasicConstLocalFunction< SubFatherBasisFunctionSetType, SubDofVectorTypeFather > subLFFather( subFatherBasisFunctionSet,
132 fatherSubDofVector );
133 LocalFunction< SubSonBasisFunctionSetType, SubDofVectorTypeSon > subLFSon( subSonBasisFunctionSet, sonSubDofVector );
135 std::get< i >( tuple ).prolongLocal( subLFFather, subLFSon, geometryInFather, initialize );
143 template<
class ... DiscreteFunctionSpaces >
145 struct TupleLocalRestrictProlong< DiscreteFunctionSpaces ... >::
148 template<
class LFFather,
class Tuple >
149 static void apply ( LFFather &lfFather,
152 typedef SubVector< typename LFFather::LocalDofVectorType, OffsetSubMapper > SubDofVectorTypeFather;
154 typedef typename LFFather::BasisFunctionSetType::template SubBasisFunctionSet< i >::type SubFatherBasisFunctionSetType;
156 SubFatherBasisFunctionSetType subFatherBasisFunctionSet = lfFather.basisFunctionSet().template subBasisFunctionSet< i >();
158 std::size_t fatherBasisSetOffset = lfFather.basisFunctionSet().offset(i);
160 SubDofVectorTypeFather fatherSubDofVector( lfFather.localDofVector(), OffsetSubMapper( subFatherBasisFunctionSet.size(),
161 fatherBasisSetOffset ) );
162 LocalFunction< SubFatherBasisFunctionSetType, SubDofVectorTypeFather > subLFFather( subFatherBasisFunctionSet, fatherSubDofVector );
164 std::get< i >( tuple ).restrictFinalize( subLFFather );
172 template<
class ... DiscreteFunctionSpaces >
174 struct TupleLocalRestrictProlong< DiscreteFunctionSpaces ... >::
177 template<
class LFFather,
class LFSon,
class LocalGeometry,
class Tuple >
178 static void apply ( LFFather &lfFather,
const LFSon &lfSon,
const LocalGeometry &geometryInFather,
bool initialize,
181 typedef SubVector< typename LFFather::LocalDofVectorType, OffsetSubMapper > SubDofVectorTypeFather;
182 typedef SubVector< const typename LFSon::LocalDofVectorType, OffsetSubMapper > SubDofVectorTypeSon;
184 typedef typename LFFather::BasisFunctionSetType::template SubBasisFunctionSet< i >::type SubFatherBasisFunctionSetType;
185 typedef typename LFSon::BasisFunctionSetType::template SubBasisFunctionSet< i >::type SubSonBasisFunctionSetType;
187 SubFatherBasisFunctionSetType subFatherBasisFunctionSet = lfFather.basisFunctionSet().template subBasisFunctionSet< i >();
188 SubSonBasisFunctionSetType subSonBasisFunctionSet = lfSon.basisFunctionSet().template subBasisFunctionSet< i >();
190 std::size_t fatherBasisSetOffset = lfFather.basisFunctionSet().offset(i);
191 std::size_t sonBasisSetOffset = lfSon.basisFunctionSet().offset(i);
193 SubDofVectorTypeSon sonSubDofVector( lfSon.localDofVector(), OffsetSubMapper( subSonBasisFunctionSet.size(), sonBasisSetOffset ) );
194 SubDofVectorTypeFather fatherSubDofVector( lfFather.localDofVector(), OffsetSubMapper( subFatherBasisFunctionSet.size(),
195 fatherBasisSetOffset ) );
197 LocalFunction< SubFatherBasisFunctionSetType, SubDofVectorTypeFather > subLFFather( subFatherBasisFunctionSet, fatherSubDofVector );
198 BasicConstLocalFunction< SubSonBasisFunctionSetType, SubDofVectorTypeSon > subLFSon( subSonBasisFunctionSet, sonSubDofVector );
200 std::get< i >( tuple ).restrictLocal( subLFFather, subLFSon, geometryInFather, initialize );
Definition: bindguard.hh:11
static void forEach(IndexRange< T, sz > range, F &&f)
Definition: hybrid.hh:129
static constexpr bool Or()
Definition: utility.hh:110
static DUNE_PRIVATE void apply(Args &&... args)
Definition: forloop.hh:23
Definition: utility.hh:147
Definition: tuplelocalrestrictprolong.hh:31
std::tuple_element_t< 0, std::tuple< typename DiscreteFunctionSpaces::DomainFieldType... > > DomainFieldType
Definition: tuplelocalrestrictprolong.hh:53
void prolongLocal(const LFFather &lfFather, LFSon &lfSon, const LocalGeometry &geometryInFather, bool initialize) const
Definition: tuplelocalrestrictprolong.hh:79
TupleLocalRestrictProlong(std::tuple< const DiscreteFunctionSpaces &... > tuple)
Definition: tuplelocalrestrictprolong.hh:55
bool needCommunication(std::index_sequence< i... >) const
Definition: tuplelocalrestrictprolong.hh:92
bool needCommunication() const
Definition: tuplelocalrestrictprolong.hh:85
void restrictFinalize(LFFather &lfFather) const
Definition: tuplelocalrestrictprolong.hh:73
void restrictLocal(LFFather &lfFather, const LFSon &lfSon, const LocalGeometry &geometryInFather, bool initialize) const
restrict data to father
Definition: tuplelocalrestrictprolong.hh:67
void setFatherChildWeight(const DomainFieldType &weight)
Definition: tuplelocalrestrictprolong.hh:59