1#ifndef DUNE_FEM_SOLVER_COMMUNICATION_HIERARCHICAL_HH
2#define DUNE_FEM_SOLVER_COMMUNICATION_HIERARCHICAL_HH
8#include <dune/common/ftraits.hh>
10#include <dune/istl/bvector.hh>
11#include <dune/istl/multitypeblockvector.hh>
12#include <dune/istl/solvercategory.hh>
30 template<
class DiscreteFunctionSpace,
class DofContainer >
38 typedef typename Dune::Fem::Impl::BlockIndicesFor< DofContainer >::Type
BlockIndices;
44 explicit DofVector ( DofContainer &data ) : data_( data ) {}
55 typedef typename DiscreteFunctionSpaceType::LocalBlockIndices
BlockIndices;
59 typedef typename DofContainer::field_type
DofType;
61 template<
class Operation >
68 : dfSpace_( dfSpace ), dofVector_( dofContainer )
71 template<
class Operation >
74 return space().createDataHandle( *
this, operation );
92 template<
class DiscreteFunctionSpace >
97 typedef typename DiscreteFunctionSpace::AuxiliaryDofsType AuxiliaryDofsType;
103 : dfSpace_( dfSpace ), solverCategory_( solverCategory )
106 const typename DiscreteFunctionSpace::GridPartType::CollectiveCommunicationType &
communicator ()
const {
return dfSpace_.gridPart().comm(); }
120 project( dfSpace_.auxiliaryDofs(), x );
123 template<
class T,
class F >
124 void dot (
const T &x,
const T &y, F &scp )
const
126 dot( dfSpace_.auxiliaryDofs(), x, y, scp );
131 typename Dune::FieldTraits< typename T::field_type >::real_type
norm (
const T &x )
const
134 typename Dune::FieldTraits< typename T::field_type >::real_type norm2( 0 );
136 return sqrt( norm2 );
142 template<
class... V >
143 static void project (
const AuxiliaryDofsType &auxiliaryDofs, MultiTypeBlockVector< V... > &x )
148 template<
class B,
class A >
149 static void project (
const AuxiliaryDofsType &auxiliaryDofs, BlockVector< B, A > &x )
151 typedef typename B::field_type field_type;
152 for(
int i : auxiliaryDofs )
153 x[ i ] = field_type( 0 );
156 template<
class... V,
class F >
157 static void dot (
const AuxiliaryDofsType &auxiliaryDofs,
const MultiTypeBlockVector< V... > &x,
const MultiTypeBlockVector< V... > &y, F &scp )
162 template<
class B,
class A,
class F >
163 static void dot (
const AuxiliaryDofsType &auxiliaryDofs,
const BlockVector< B, A > &x,
const BlockVector< B, A > &y, F &scp )
165 const int numAuxiliarys = auxiliaryDofs.size();
166 for(
int auxiliary = 0, i = 0; auxiliary < numAuxiliarys; ++auxiliary, ++i )
168 const int nextAuxiliary = auxiliaryDofs[ auxiliary ];
169 for( ; i < nextAuxiliary; ++i )
170 scp += x[ i ] * y[ i ];
175 Dune::SolverCategory::Category solverCategory_;
183 template<
class DiscreteFunctionSpace >
185 Dune::SolverCategory::Category solverCategory,
199 template<
class DiscreteFunctionSpace >
201 :
public std::false_type
double sqrt(const Dune::Fem::Double &v)
Definition: double.hh:977
Definition: bindguard.hh:11
static double sqrt(const Double &v)
Definition: double.hh:886
static void forEach(IndexRange< T, sz > range, F &&f)
Definition: hybrid.hh:129
void buildCommunication(const DiscreteFunctionSpace &dfSpace, Dune::SolverCategory::Category solverCategory, std::shared_ptr< FemCommunication< DiscreteFunctionSpace > > &communication)
Definition: fem.hh:143
Definition: hierarchical/dofvector.hh:60
Definition: solver/communication/hierarchical.hh:32
HierarchicalCommunicationVector(const DiscreteFunctionSpace &dfSpace, DofContainer &dofContainer)
Definition: solver/communication/hierarchical.hh:67
DofContainer::field_type DofType
Definition: solver/communication/hierarchical.hh:59
DofVector & dofVector()
Definition: solver/communication/hierarchical.hh:78
DiscreteFunctionSpace DiscreteFunctionSpaceType
Definition: solver/communication/hierarchical.hh:53
const DiscreteFunctionSpaceType & space() const
Definition: solver/communication/hierarchical.hh:80
const DofVector & dofVector() const
Definition: solver/communication/hierarchical.hh:77
DiscreteFunctionSpaceType::LocalBlockIndices BlockIndices
Definition: solver/communication/hierarchical.hh:55
CommDataHandle< Operation >::Type dataHandle(const Operation &operation)
Definition: solver/communication/hierarchical.hh:72
static constexpr std::size_t blockSize
Definition: solver/communication/hierarchical.hh:57
Definition: solver/communication/hierarchical.hh:37
Dune::Fem::Impl::BlockIndicesFor< DofContainer >::Type BlockIndices
Definition: solver/communication/hierarchical.hh:38
DofVector(DofContainer &data)
Definition: solver/communication/hierarchical.hh:44
static constexpr std::size_t blockSize
Definition: solver/communication/hierarchical.hh:39
HierarchicalDofBlock< DofContainer > DofBlockType
Definition: solver/communication/hierarchical.hh:42
HierarchicalDofBlock< const DofContainer > ConstDofBlockType
Definition: solver/communication/hierarchical.hh:41
ConstDofBlockType operator[](std::size_t i) const
Definition: solver/communication/hierarchical.hh:46
Definition: solver/communication/hierarchical.hh:63
DiscreteFunctionSpaceType::template CommDataHandle< ThisType, Operation >::Type Type
Definition: solver/communication/hierarchical.hh:64
Definition: solver/communication/hierarchical.hh:94
void copyOwnerToAll(const T &x, T &y) const
Definition: solver/communication/hierarchical.hh:109
Dune::FieldTraits< typenameT::field_type >::real_type norm(const T &x) const
Definition: solver/communication/hierarchical.hh:131
DiscreteFunctionSpace DiscreteFunctionSpaceType
Definition: solver/communication/hierarchical.hh:100
void dot(const T &x, const T &y, F &scp) const
Definition: solver/communication/hierarchical.hh:124
const DiscreteFunctionSpace::GridPartType::CollectiveCommunicationType & communicator() const
Definition: solver/communication/hierarchical.hh:106
Dune::SolverCategory::Category getSolverCategory() const
Definition: solver/communication/hierarchical.hh:139
HierarchicalCommunication(const DiscreteFunctionSpaceType &dfSpace, Dune::SolverCategory::Category solverCategory=Dune::SolverCategory::sequential)
Definition: solver/communication/hierarchical.hh:102
void project(T &x) const
Definition: solver/communication/hierarchical.hh:118
sum up data
Definition: commoperations.hh:144