1 #ifndef DUNE_FEM_HPDG_SPACE_COMMON_DATAPROJECTION_DEFAULT_HH
2 #define DUNE_FEM_HPDG_SPACE_COMMON_DATAPROJECTION_DEFAULT_HH
10 #include <dune/common/dynvector.hh>
34 template<
class DiscreteFunction >
36 :
public DataProjection< typename DiscreteFunction::DiscreteFunctionSpaceType, DefaultDataProjection< DiscreteFunction > >
50 using RangeFieldType =
typename DiscreteFunction::RangeFieldType;
51 using LocalDofVectorType = Dune::DynamicVector< RangeFieldType >;
54 static const std::size_t localBlockSize = DiscreteFunctionSpaceType::localBlockSize;
62 : discreteFunction_( discreteFunction )
64 discreteFunction_.get().enableDofCompression();
75 ThisType &
operator= (
const ThisType & ) =
delete;
77 ThisType &
operator= ( ThisType && ) =
default;
85 const std::vector< std::size_t > &origin,
86 const std::vector< std::size_t > &destination )
91 assert( present.size() == space().basisFunctionSet( entity ).size() );
92 LocalDofVectorType localDofVector( present.size() );
94 const auto interpolation = space().interpolation( entity );
95 interpolation( localFunction, localDofVector );
97 write( destination, localDofVector );
101 template <
class TemporaryStorage>
104 auto& df = discreteFunction();
107 auto dfit = df.dbegin();
108 const auto endtmp = tmp.dend();
109 for(
auto it = tmp.dbegin(); it != endtmp; ++it, ++dfit )
111 assert( dfit != df.dend() );
117 const auto end = df.space().end();
118 for(
auto it = df.space().begin(); it != end; ++it )
120 const auto& entity = *it;
121 const auto tmpLF = tmp.localFunction( entity );
122 auto lf = df.localFunction( entity );
125 if( tmpLF.size() == lf.size() )
132 df.space().interpolation( entity )( tmpLF, lf );
138 template<
class Communicator >
141 comm.addToList( discreteFunction() );
145 template<
class LocalDofVector >
146 void read (
const std::vector< std::size_t > &blocks, LocalDofVector &localDofVector )
const
148 assert( localDofVector.size() == localBlockSize*blocks.size() );
149 std::size_t index = 0;
150 for(
auto i : blocks )
152 const auto block = discreteFunction().block( i );
153 for( std::size_t j = 0; j < localBlockSize; ++j )
154 localDofVector[ index++ ] = (*block)[ j ];
156 assert( index == localDofVector.size() );
159 template<
class LocalDofVector >
160 void write (
const std::vector< std::size_t > &blocks,
const LocalDofVector &localDofVector )
162 assert( localDofVector.size() == localBlockSize*blocks.size() );
163 std::size_t index = 0;
164 for(
auto i : blocks )
166 auto block = discreteFunction().block( i );
167 for( std::size_t j = 0; j < localBlockSize; ++j )
168 (*block)[ j ] = localDofVector[ index++ ];
170 assert( index == localDofVector.size() );
173 DiscreteFunction &discreteFunction () {
return discreteFunction_.get(); }
175 const DiscreteFunction &discreteFunction ()
const {
return discreteFunction_.get(); }
179 std::reference_wrapper< DiscreteFunction > discreteFunction_;
185 using hpDG::DefaultDataProjection;
Definition: bindguard.hh:11
interface for local functions
Definition: localfunction.hh:44
const LocalDofVectorType & localDofVector() const
return const reference to local Dof Vector
Definition: localfunction.hh:396
Abstract definition of the local restriction and prolongation of discrete functions.
Definition: common/dataprojection/dataprojection.hh:29
typename BasisFunctionSetType::EntityType EntityType
entity type
Definition: common/dataprojection/dataprojection.hh:38
DataProjection & operator=(DataProjection &&)=default
DiscreteFunctionSpace DiscreteFunctionSpaceType
discrete function space type
Definition: common/dataprojection/dataprojection.hh:34
typename DiscreteFunctionSpaceType::BasisFunctionSetType BasisFunctionSetType
basis function set type
Definition: common/dataprojection/dataprojection.hh:36
Local -projection for the restriction and prolongation of discrete functions.
Definition: common/dataprojection/default.hh:37
void addToList(Communicator &comm)
()
Definition: common/dataprojection/default.hh:139
typename BaseType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
discrete function space type
Definition: common/dataprojection/default.hh:43
typename BaseType::EntityType EntityType
entity type
Definition: common/dataprojection/default.hh:47
typename BaseType::BasisFunctionSetType BasisFunctionSetType
basis function set type
Definition: common/dataprojection/default.hh:45
void operator()(const EntityType &entity, const BasisFunctionSetType &prior, const BasisFunctionSetType &present, const std::vector< std::size_t > &origin, const std::vector< std::size_t > &destination)
Definition: common/dataprojection/default.hh:82
DefaultDataProjection(DiscreteFunction &discreteFunction)
Definition: common/dataprojection/default.hh:61