1#ifndef DUNE_FEM_FUNCTION_COMMON_LOCALCONTRIBUTION_HH
2#define DUNE_FEM_FUNCTION_COMMON_LOCALCONTRIBUTION_HH
9#include <dune/common/densevector.hh>
10#include <dune/common/ftraits.hh>
27 struct DiscreteFunctionTraits;
29 class IsDiscreteFunction;
42 template<
class DiscreteFunction >
43 struct AddBase< DiscreteFunction,
std::enable_if_t< std::is_base_of< Fem::IsDiscreteFunction, DiscreteFunction >::value > >
45 typedef typename DiscreteFunction::DofType
DofType;
47 static void begin ( DiscreteFunction &df )
49 typedef typename DiscreteFunction::DiscreteFunctionSpaceType::LocalBlockIndices LocalBlockIndices;
52 auto &dofVector = df.dofVector();
53 for(
const auto &auxiliaryDof : df.space().auxiliaryDofs() )
54 Hybrid::forEach( LocalBlockIndices(), [ &dofVector, &auxiliaryDof ] (
auto &&j ) { dofVector[ auxiliaryDof ][ j ] =
DofType( 0 ); } );
65 template<
class DiscreteFunction >
66 struct SetBase< DiscreteFunction,
std::enable_if_t< std::is_base_of< Fem::IsDiscreteFunction, DiscreteFunction >::value > >
68 static void begin ( DiscreteFunction &df ) {}
79 template<
class DiscreteFunction >
80 struct AddBase< DiscreteFunction,
std::enable_if_t< std::is_base_of< Fem::IsDiscreteFunction, DiscreteFunction >::value > >
82 typedef typename DiscreteFunction::DofType
DofType;
86 template<
class Entity,
class LocalDofVector >
87 void begin (
const Entity &entity,
const DiscreteFunction &df, LocalDofVector &localDofVector )
const
89 std::fill( localDofVector.begin(), localDofVector.end(),
DofType( 0 ) );
92 template<
class Entity,
class LocalDofVector >
93 void end (
const Entity &entity, LocalDofVector &localDofVector, DiscreteFunction &df )
const
95 df.addLocalDofs( entity, localDofVector );
104 template<
class DiscreteFunction >
105 struct AddScaledBase< DiscreteFunction,
std::enable_if_t< std::is_base_of< Fem::IsDiscreteFunction, DiscreteFunction >::value > >
106 :
public AddBase< DiscreteFunction >
108 AddScaledBase (
typename DiscreteFunction::DofType factor ) : factor_(
std::move( factor ) ) {}
110 template<
class Entity,
class LocalDofVector >
111 void end (
const Entity &entity, LocalDofVector &localDofVector, DiscreteFunction &df )
const
113 df.addScaledLocalDofs( entity, factor_, localDofVector );
117 typename DiscreteFunction::DofType factor_;
124 template<
class DiscreteFunction, const
bool getAndSet >
125 struct SetAndSelectDFImpl
127 typedef typename DiscreteFunction::DofType DofType;
129 typedef Global::Set< DiscreteFunction > GlobalOperationType;
131 template<
class Entity,
class LocalDofVector >
132 void begin (
const Entity &entity,
const DiscreteFunction &df, LocalDofVector &localDofVector )
const
134 if constexpr ( getAndSet )
137 df.getLocalDofs ( entity, localDofVector );
142 std::fill( localDofVector.begin(), localDofVector.end(), DofType( 0 ) );
146 template<
class Entity,
class LocalDofVector >
147 void end (
const Entity &entity, LocalDofVector &localDofVector, DiscreteFunction &df )
const
149 df.setLocalDofs( entity, localDofVector );
158 template<
class DiscreteFunction >
159 struct SetBase< DiscreteFunction,
std::enable_if_t< std::is_base_of< Fem::IsDiscreteFunction, DiscreteFunction >::value > >
160 :
public detail::SetAndSelectDFImpl< DiscreteFunction, false >
166 template<
class DiscreteFunction >
167 struct SetSelectedBase< DiscreteFunction,
std::enable_if_t< std::is_base_of< Fem::IsDiscreteFunction, DiscreteFunction >::value > >
168 :
public detail::SetAndSelectDFImpl< DiscreteFunction, true >
175 template<
class DiscreteFunction,
template<
class >
class AssemblyOperation >
176 struct FieldTraits< Fem::LocalContribution< DiscreteFunction, AssemblyOperation, std::enable_if_t< std::is_base_of< Fem::IsDiscreteFunction, DiscreteFunction >::value > > >
177 :
public FieldTraits< typename DiscreteFunction::DofType >
188 template<
class DiscreteFunction,
template<
class >
class AssemblyOperation >
189 class LocalContribution< DiscreteFunction, AssemblyOperation,
std::enable_if_t< std::is_base_of< Fem::IsDiscreteFunction, DiscreteFunction >::value > >
192 typedef typename DiscreteFunction::DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
198 typedef AssemblyOperation< typename DiscreteFunctionTraits< DiscreteFunctionType >::DiscreteFunctionType >
AssemblyOperationType;
201 typedef typename DiscreteFunctionType::DofType
DofType;
203 typedef typename DiscreteFunctionType::RangeType
RangeType;
208 typedef typename LocalDofVectorType::size_type
SizeType;
210 typedef typename BasisFunctionSetType::EntityType
EntityType;
212 using BaseType::entity;
213 using BaseType::localDofVector;
214 using BaseType::axpy;
216 template<
class... Args >
218 :
BaseType( discreteFunction.space() ),
219 discreteFunction_( discreteFunction ),
220 assemblyOperation_(
std::forward< Args >( args )... ),
223 discreteFunction.template beginAssemble< typename AssemblyOperationType::GlobalOperationType >();
229 ~LocalContribution () { discreteFunction().template endAssemble< typename AssemblyOperationType::GlobalOperationType >(); }
239 BaseType::bind( entity );
241 assemblyOperation_.begin( entity, discreteFunction(), localDofVector() );
249 assemblyOperation_.end( entity(), localDofVector(), discreteFunction() );
258 using BaseType::evaluate;
259 using BaseType::evaluateQuadrature;
260 using BaseType::jacobian;
261 using BaseType::hessian;
Definition: bindguard.hh:11
static void forEach(IndexRange< T, sz > range, F &&f)
Definition: hybrid.hh:129
Definition: common/localcontribution.hh:14
Definition: common/localcontribution.hh:28
Definition: common/localcontribution.hh:31
Definition: common/localcontribution.hh:41
Definition: common/localcontribution.hh:61
Definition: common/localcontribution.hh:64
Definition: common/localcontribution.hh:67
Definition: common/localcontribution.hh:70
static void begin(DiscreteFunction &df)
Definition: function/common/localcontribution.hh:47
static void end(DiscreteFunction &df)
Definition: function/common/localcontribution.hh:57
DiscreteFunction::DofType DofType
Definition: function/common/localcontribution.hh:45
static void end(DiscreteFunction &df)
Definition: function/common/localcontribution.hh:69
static void begin(DiscreteFunction &df)
Definition: function/common/localcontribution.hh:68
Global::Add< DiscreteFunction > GlobalOperationType
Definition: function/common/localcontribution.hh:84
void end(const Entity &entity, LocalDofVector &localDofVector, DiscreteFunction &df) const
Definition: function/common/localcontribution.hh:93
DiscreteFunction::DofType DofType
Definition: function/common/localcontribution.hh:82
void begin(const Entity &entity, const DiscreteFunction &df, LocalDofVector &localDofVector) const
Definition: function/common/localcontribution.hh:87
AddScaledBase(typename DiscreteFunction::DofType factor)
Definition: function/common/localcontribution.hh:108
void end(const Entity &entity, LocalDofVector &localDofVector, DiscreteFunction &df) const
Definition: function/common/localcontribution.hh:111
void bind(const EntityType &entity)
Definition: function/common/localcontribution.hh:237
LocalContribution(DiscreteFunctionType &discreteFunction, Args &&... args)
Definition: function/common/localcontribution.hh:217
const DiscreteFunctionType & discreteFunction() const
Definition: function/common/localcontribution.hh:234
BaseType::LocalDofVectorType LocalDofVectorType
Definition: function/common/localcontribution.hh:207
DiscreteFunctionType & discreteFunction()
Definition: function/common/localcontribution.hh:235
DiscreteFunctionType::RangeType RangeType
Definition: function/common/localcontribution.hh:203
DiscreteFunctionType & discreteFunction_
Definition: function/common/localcontribution.hh:264
DiscreteFunctionType::JacobianRangeType JacobianRangeType
Definition: function/common/localcontribution.hh:205
bool bound_
Definition: function/common/localcontribution.hh:266
RangeType::field_type RangeFieldType
Definition: function/common/localcontribution.hh:204
void unbind()
Definition: function/common/localcontribution.hh:244
LocalContribution(ThisType &&)=delete
AssemblyOperation< typename DiscreteFunctionTraits< DiscreteFunctionType >::DiscreteFunctionType > AssemblyOperationType
Definition: function/common/localcontribution.hh:198
DiscreteFunctionType::DofType DofType
Definition: function/common/localcontribution.hh:201
BasisFunctionSetType::EntityType EntityType
Definition: function/common/localcontribution.hh:210
AssemblyOperationType assemblyOperation_
Definition: function/common/localcontribution.hh:265
LocalContribution(const ThisType &)=delete
DiscreteFunctionType::DiscreteFunctionSpaceType::BasisFunctionSetType BasisFunctionSetType
Definition: function/common/localcontribution.hh:200
DiscreteFunction DiscreteFunctionType
Definition: function/common/localcontribution.hh:197
LocalDofVectorType::size_type SizeType
Definition: function/common/localcontribution.hh:208
~LocalContribution()
Definition: function/common/localcontribution.hh:229
A temporary function carrying values for one entity.
Definition: temporary.hh:208
just copy data
Definition: commoperations.hh:127
sum up data
Definition: commoperations.hh:144