1#ifndef DUNE_FEM_OPERATOR_COMMON_LOCALCONTRIBUTION_HH
2#define DUNE_FEM_OPERATOR_COMMON_LOCALCONTRIBUTION_HH
9#include <dune/common/densematrix.hh>
10#include <dune/common/dynvector.hh>
34 template<
class AssembledOperator >
37 template <
class DF,
class RF>
39 template <
class DF,
class RF>
48 template<
class AssembledOperator >
51 template <
class DF,
class RF>
53 template <
class DF,
class RF>
65 template<
class LocalMatrix >
66 struct LocalMatrixGetter
68 typedef typename LocalMatrix::value_type value_type;
70 explicit LocalMatrixGetter (
const LocalMatrix &localMatrix ) : localMatrix_( localMatrix ) {}
72 decltype( auto )
operator[] (
int row )
const {
return localMatrix_[ row ]; }
74 value_type get (
int row,
int col )
const {
return localMatrix_[ row ][ col ]; }
76 const LocalMatrix & localMatrix()
const {
return localMatrix_; }
79 const LocalMatrix &localMatrix_;
89 template<
class AssembledOperator >
96 template<
class DomainEntity,
class RangeEntity,
class LocalMatrix >
97 void begin (
const DomainEntity &domainEntity,
const RangeEntity &rangeEntity,
const AssembledOperator &op, LocalMatrix &localMatrix )
const
102 template<
class DomainEntity,
class RangeEntity,
class LocalMatrix >
103 void end (
const DomainEntity &domainEntity,
const RangeEntity &rangeEntity, LocalMatrix &localMatrix,
AssembledOperator &op )
const
105 op.addLocalMatrix( domainEntity, rangeEntity, Impl::LocalMatrixGetter< LocalMatrix >( localMatrix ) );
114 template<
class AssembledOperator >
116 :
public AddBase< AssembledOperator >
122 template<
class DomainEntity,
class RangeEntity,
class LocalMatrix >
123 void end (
const DomainEntity &domainEntity,
const RangeEntity &rangeEntity, LocalMatrix &localMatrix,
AssembledOperator &op )
const
125 op.addScaledLocalMatrix( domainEntity, rangeEntity, Impl::LocalMatrixGetter< LocalMatrix >( localMatrix ), factor_ );
137 template<
class AssembledOperator, const
bool getAndSet >
144 template<
class DomainEntity,
class RangeEntity,
class LocalMatrix >
145 void begin (
const DomainEntity &domainEntity,
const RangeEntity &rangeEntity,
const AssembledOperator &op, LocalMatrix &localMatrix )
const
147 if constexpr ( getAndSet )
150 op.getLocalMatrix( domainEntity, rangeEntity, localMatrix );
158 template<
class DomainEntity,
class RangeEntity,
class LocalMatrix >
159 void end (
const DomainEntity &domainEntity,
const RangeEntity &rangeEntity, LocalMatrix &localMatrix,
AssembledOperator &op )
const
161 op.setLocalMatrix( domainEntity, rangeEntity, Impl::LocalMatrixGetter< LocalMatrix >( localMatrix ) );
167 template<
class AssembledOperator >
176 template<
class AssembledOperator >
193 template<
class AssembledOperator,
template<
class >
class AssemblyOperation >
195 :
public TemporaryLocalMatrix< typename AssembledOperator::DomainFunctionType::DiscreteFunctionSpaceType,
196 typename AssembledOperator::RangeFunctionType::DiscreteFunctionSpaceType
203 typedef typename AssembledOperatorType::DomainFunctionType::DiscreteFunctionSpaceType
DomainSpaceType;
204 typedef typename AssembledOperatorType::RangeFunctionType::DiscreteFunctionSpaceType
RangeSpaceType;
220 typedef typename LocalMatrixEntriesType::size_type
SizeType;
226 template<
class T,
class... U >
228 :
public std::integral_constant< bool, Std::Or( std::is_same< T, U >::value... ) >
233 :
public InTypeRange< T, typename RangeBasisFunctionSetType::RangeType,
234 typename RangeBasisFunctionSetType::JacobianRangeType,
235 typename RangeBasisFunctionSetType::HessianRangeType >
238 struct ColIndexMapper
240 ColIndexMapper ( SizeType j, SizeType cols ) : j_( j ), cols_( cols ) {}
242 SizeType operator[] ( SizeType i )
const {
return (i*cols_ + j_); }
249 using BaseType::mat_cols;
252 using BaseType::domainBasisFunctionSet;
253 using BaseType::rangeBasisFunctionSet;
255 template<
class... Args >
257 :
BaseType( assembledOperator.domainSpace(), assembledOperator.rangeSpace() ),
258 assembledOperator_( assembledOperator ),
259 assemblyOperation_(
std::forward< Args >( args )... )
261 assembledOperator.template beginAssemble< typename AssemblyOperationType::GlobalOperationType >();
267 ~LocalContribution () { assembledOperator().template endAssemble< typename AssemblyOperationType::GlobalOperationType >(); }
288 return BaseType::column( j );
294 template<
class Point,
class... Factors >
295 auto axpy (
const Point &x,
const Factors &... factors )
296 -> std::enable_if_t< Std::And( (IsRangeValue< std::decay_t< decltype( std::declval< Factors & >()[ 0 ] ) > >::value)... ) >
298 const SizeType matCols = mat_cols();
299 for(
SizeType j = 0; j < matCols; ++j )
301 auto col = column( j );
302 rangeBasisFunctionSet().axpy( x, factors[ j ]..., col );
317 int order ()
const {
return domainBasisFunctionSet().order() + rangeBasisFunctionSet().order(); }
322 BaseType::bind( domainEntity, rangeEntity );
323 assemblyOperation_.begin( domainEntity, rangeEntity, assembledOperator(), *
this );
329 assemblyOperation_.end( domainBasisFunctionSet().entity(), rangeBasisFunctionSet().entity(), *
this, assembledOperator() );
339 using BaseType::fields_;
Definition: bindguard.hh:11
void axpy(const T &a, const T &x, T &y)
Definition: space/basisfunctionset/functor.hh:38
Definition: common/localcontribution.hh:14
Definition: common/localcontribution.hh:28
Definition: common/localcontribution.hh:31
Definition: common/localcontribution.hh:41
Definition: common/localcontribution.hh:51
Definition: common/localcontribution.hh:61
Definition: common/localcontribution.hh:64
Definition: common/localcontribution.hh:67
Definition: common/localcontribution.hh:70
static void begin(Dune::Fem::AssembledOperator< DF, RF > &op)
Definition: operator/common/localcontribution.hh:38
static void end(Dune::Fem::AssembledOperator< DF, RF > &op)
Definition: operator/common/localcontribution.hh:40
static void end(Dune::Fem::AssembledOperator< DF, RF > &op)
Definition: operator/common/localcontribution.hh:54
static void begin(Dune::Fem::AssembledOperator< DF, RF > &op)
Definition: operator/common/localcontribution.hh:52
void begin(const DomainEntity &domainEntity, const RangeEntity &rangeEntity, const AssembledOperator &op, LocalMatrix &localMatrix) const
Definition: operator/common/localcontribution.hh:97
Global::Add< AssembledOperator > GlobalOperationType
Definition: operator/common/localcontribution.hh:94
void end(const DomainEntity &domainEntity, const RangeEntity &rangeEntity, LocalMatrix &localMatrix, AssembledOperator &op) const
Definition: operator/common/localcontribution.hh:103
AssembledOperator::RangeFieldType value_type
Definition: operator/common/localcontribution.hh:92
AssembledOperator::RangeFieldType value_type
Definition: operator/common/localcontribution.hh:118
void end(const DomainEntity &domainEntity, const RangeEntity &rangeEntity, LocalMatrix &localMatrix, AssembledOperator &op) const
Definition: operator/common/localcontribution.hh:123
AddScaledBase(value_type factor)
Definition: operator/common/localcontribution.hh:120
Definition: operator/common/localcontribution.hh:139
void begin(const DomainEntity &domainEntity, const RangeEntity &rangeEntity, const AssembledOperator &op, LocalMatrix &localMatrix) const
Definition: operator/common/localcontribution.hh:145
void end(const DomainEntity &domainEntity, const RangeEntity &rangeEntity, LocalMatrix &localMatrix, AssembledOperator &op) const
Definition: operator/common/localcontribution.hh:159
AssembledOperator::RangeFieldType value_type
Definition: operator/common/localcontribution.hh:140
Global::Set< AssembledOperator > GlobalOperationType
Definition: operator/common/localcontribution.hh:142
RangeBasisFunctionSetType::EntityType RangeEntityType
Definition: operator/common/localcontribution.hh:215
auto axpy(const Point &x, const Factors &... factors) -> std::enable_if_t< Std::And((IsRangeValue< std::decay_t< decltype(std::declval< Factors & >()[0]) > >::value)...) >
Definition: operator/common/localcontribution.hh:295
const AssembledOperatorType & assembledOperator() const
Definition: operator/common/localcontribution.hh:272
LocalMatrixEntriesType::size_type SizeType
Definition: operator/common/localcontribution.hh:220
BaseType::MatrixColumnType matrixColumn(SizeType j)
Definition: operator/common/localcontribution.hh:286
AssembledOperatorType::RangeFunctionType::DiscreteFunctionSpaceType RangeSpaceType
Definition: operator/common/localcontribution.hh:204
void unbind()
clear local matrix from entities
Definition: operator/common/localcontribution.hh:327
SubVector< LocalMatrixEntriesType, ColIndexMapper > column(SizeType j)
Definition: operator/common/localcontribution.hh:275
RowReferenceVector< const value_type > const_row_reference
Definition: operator/common/localcontribution.hh:223
int order() const
obtain the order of this local contribution
Definition: operator/common/localcontribution.hh:317
AssembledOperator AssembledOperatorType
Definition: operator/common/localcontribution.hh:200
void bind(const DomainEntityType &domainEntity, const RangeEntityType &rangeEntity)
initialize the local matrix to entities
Definition: operator/common/localcontribution.hh:320
DomainSpaceType::BasisFunctionSetType DomainBasisFunctionSetType
Definition: operator/common/localcontribution.hh:211
RowReferenceVector< value_type > row_reference
Definition: operator/common/localcontribution.hh:222
DomainBasisFunctionSetType::EntityType DomainEntityType
Definition: operator/common/localcontribution.hh:214
AssemblyOperation< AssembledOperator > AssemblyOperationType
Definition: operator/common/localcontribution.hh:201
AssembledOperatorType::DomainFunctionType::DiscreteFunctionSpaceType DomainSpaceType
Definition: operator/common/localcontribution.hh:203
BaseType::MatrixEntriesType LocalMatrixEntriesType
Definition: operator/common/localcontribution.hh:219
~LocalContribution()
Definition: operator/common/localcontribution.hh:267
RangeSpaceType::BasisFunctionSetType RangeBasisFunctionSetType
Definition: operator/common/localcontribution.hh:212
AssembledOperatorType::RangeFieldType value_type
Definition: operator/common/localcontribution.hh:217
LocalContribution(ThisType &&)=delete
LocalContribution(const ThisType &)=delete
AssembledOperatorType & assembledOperator()
Definition: operator/common/localcontribution.hh:273
SubVector< const LocalMatrixEntriesType, ColIndexMapper > column(SizeType j) const
Definition: operator/common/localcontribution.hh:280
AssemblyOperationType assemblyOperation_
Definition: operator/common/localcontribution.hh:341
LocalMatrixEntriesType & localMatrixEntries()
return reference to vector of local matrix entries
Definition: operator/common/localcontribution.hh:336
const LocalMatrixEntriesType & localMatrixEntries() const
return const reference to vector of local matrix entries
Definition: operator/common/localcontribution.hh:334
AssembledOperatorType & assembledOperator_
Definition: operator/common/localcontribution.hh:340
LocalContribution(AssembledOperator &assembledOperator, Args &&... args)
Definition: operator/common/localcontribution.hh:256
Definition: localmatrix.hh:440
RangeFunction::RangeFieldType RangeFieldType
field type of the operator's range
Definition: operator.hh:43
abstract matrix operator
Definition: operator.hh:124
virtual void flushAssembly()
commit intermediate states of linear operator assembly
Definition: operator.hh:127
A local matrix with a small array as storage.
Definition: temporarylocalmatrix.hh:100
Definition: rowreferencevector.hh:56
An implementation of DenseVector to extract a portion, not necessarly contiguos, of a vector.
Definition: subvector.hh:161