1#ifndef DUNE_FEM_SOLVER_COMMUNICATION_FEM_HH
2#define DUNE_FEM_SOLVER_COMMUNICATION_FEM_HH
8#include <dune/common/ftraits.hh>
9#include <dune/common/hybridutilities.hh>
11#include <dune/istl/solvercategory.hh>
27 template<
class DiscreteFunctionSpace,
class DofVector >
35 typedef typename DiscreteFunctionSpaceType::LocalBlockIndices
BlockIndices;
39 typedef typename DofVector::field_type
DofType;
41 template<
class Operation >
48 : dfSpace_( dfSpace ), dofVector_(
dofVector )
51 template<
class Operation >
54 return space().createDataHandle( *
this, operation );
57 const DofVector &
dofVector ()
const {
return dofVector_; }
64 DofVector &dofVector_;
72 template<
class DiscreteFunctionSpace >
81 : dfSpace_( dfSpace ), solverCategory_( solverCategory )
84 const typename DiscreteFunctionSpace::GridPartType::CollectiveCommunicationType &
communicator ()
const {
return dfSpace_.gridPart().comm(); }
98 typedef typename T::field_type field_type;
101 for(
int i : dfSpace_.auxiliaryDofs() )
102 x[ i ] = field_type( 0 );
105 template<
class T,
class F >
106 void dot (
const T &x,
const T &y, F &scp )
const
108 const auto &auxiliaryDofs = dfSpace_.auxiliaryDofs();
110 const int numAuxiliarys = auxiliaryDofs.size();
111 for(
int auxiliary = 0, i = 0; auxiliary < numAuxiliarys; ++auxiliary, ++i )
113 const int nextAuxiliary = auxiliaryDofs[ auxiliary ];
114 for( ; i < nextAuxiliary; ++i )
115 scp += x[ i ] * y[ i ];
122 typename Dune::FieldTraits< typename T::field_type >::real_type
norm (
const T &x )
const
125 typename Dune::FieldTraits< typename T::field_type >::real_type norm2( 0 );
127 return sqrt( norm2 );
134 Dune::SolverCategory::Category solverCategory_;
142 template<
class DiscreteFunctionSpace >
144 Dune::SolverCategory::Category solverCategory,
158 template<
class DiscreteFunctionSpace >
160 :
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
void buildCommunication(const DiscreteFunctionSpace &dfSpace, Dune::SolverCategory::Category solverCategory, std::shared_ptr< FemCommunication< DiscreteFunctionSpace > > &communication)
Definition: fem.hh:143
const DiscreteFunctionSpaceType & space() const
Definition: fem.hh:60
static constexpr std::size_t blockSize
Definition: fem.hh:37
CommDataHandle< Operation >::Type dataHandle(const Operation &operation)
Definition: fem.hh:52
DiscreteFunctionSpaceType::LocalBlockIndices BlockIndices
Definition: fem.hh:35
FemCommunicationVector(const DiscreteFunctionSpace &dfSpace, DofVector &dofVector)
Definition: fem.hh:47
DofVector::field_type DofType
Definition: fem.hh:39
DiscreteFunctionSpace DiscreteFunctionSpaceType
Definition: fem.hh:33
const DofVector & dofVector() const
Definition: fem.hh:57
DofVector & dofVector()
Definition: fem.hh:58
DiscreteFunctionSpaceType::template CommDataHandle< ThisType, Operation >::Type Type
Definition: fem.hh:44
FemCommunication(const DiscreteFunctionSpaceType &dfSpace, Dune::SolverCategory::Category solverCategory=Dune::SolverCategory::sequential)
Definition: fem.hh:80
DiscreteFunctionSpace DiscreteFunctionSpaceType
Definition: fem.hh:78
void dot(const T &x, const T &y, F &scp) const
Definition: fem.hh:106
const DiscreteFunctionSpace::GridPartType::CollectiveCommunicationType & communicator() const
Definition: fem.hh:84
Dune::FieldTraits< typenameT::field_type >::real_type norm(const T &x) const
Definition: fem.hh:122
void project(T &x) const
Definition: fem.hh:96
Dune::SolverCategory::Category getSolverCategory() const
Definition: fem.hh:130
void copyOwnerToAll(const T &x, T &y) const
Definition: fem.hh:87
sum up data
Definition: commoperations.hh:144