1#ifndef DUNE_FEM_OPERATOR_LINEAR_BLOCKDIAGONAL_HH
2#define DUNE_FEM_OPERATOR_LINEAR_BLOCKDIAGONAL_HH
10#include <dune/common/fmatrix.hh>
26 class LocalBlock = Dune::FieldMatrix<
typename DiscreteFunctionSpace ::
27 RangeFieldType, DiscreteFunctionSpace::localBlockSize, DiscreteFunctionSpace::localBlockSize > >
42 typedef typename RangeFunctionType::DiscreteFunctionSpaceType
RangeSpaceType;
54 typedef typename LocalBlockType::row_type
DofType ;
57 template<
class Operation >
60 typedef typename DiscreteFunctionSpaceType
87 DUNE_THROW( InvalidStateException,
"BlockDiagonalLinearOperator must be created with identical spaces." );
95 template <
class DomainSpace,
class RangeSpace >
102 template <
class DomainSpace,
class RangeSpace >
110 entry.mv( uit, wit );
124 template<
class Functor >
143 entry.rightmultiply( *it );
154 entry.leftmultiply( *it );
185 template<
class Operation >
186 typename CommDataHandle< Operation > :: Type
189 return space().createDataHandle( *
this, operation );
192 template<
class Stencil >
221 const std::string &
name ()
const
239 template<
class DiscreteFunctionSpace,
class LocalBlock >
260 template<
class DiscreteFunctionSpace,
class LocalBlock >
282 struct SetLocalBlockFunctor
284 SetLocalBlockFunctor ( std::vector< LocalBlockType > &diagonal,
285 LocalBlockType *&localBlock )
286 : diagonal_( diagonal ),
287 localBlock_( localBlock )
290 void operator() (
int localDoF, std::size_t globalDoF )
292 assert( localDoF == 0 );
293 assert( globalDoF < diagonal_.size() );
294 localBlock_ = &diagonal_[ globalDoF ];
298 std::vector< LocalBlockType > &diagonal_;
299 LocalBlockType *&localBlock_;
305 localBlock_( nullptr )
310 basisFunctionSet_ =
domainSpace().basisFunctionSet( domainEntity );
311 SetLocalBlockFunctor f( op_->diagonal_, localBlock_ );
312 domainSpace().blockMapper().mapEach( domainEntity, f );
313 if( &domainEntity != &rangeEntity )
315 static LocalBlockType dummyBlock( 0 );
317 LocalBlockType *otherBlock = 0;
318 SetLocalBlockFunctor f( op_->diagonal_, otherBlock );
319 rangeSpace().blockMapper().mapEach( rangeEntity, f );
322 if( otherBlock != localBlock_ )
323 localBlock_ = &dummyBlock ;
338 return localBlock()[ i ][ j ];
342 localBlock()[ i ][ j ] += value;
346 localBlock()[ i ][ j ] = value;
356 for(
int i = 0; i < rows(); ++i )
360 template<
class DomainLocalFunction,
class RangeLocalFunction >
361 void multiplyAdd (
const DomainLocalFunction &x, RangeLocalFunction &y )
const
363 localBlock().umv( x, y );
373 return localBlock().N();
377 return localBlock().M();
382 return op_->domainSpace();
385 {
return op_->rangeSpace();
390 return basisFunctionSet_;
394 return basisFunctionSet_;
399 return domainBasisFunctionSet().entity();
403 return rangeBasisFunctionSet().entity();
409 assert( localBlock_ );
414 assert( localBlock_ );
419 BasisFunctionSetType basisFunctionSet_;
428 template<
class DiscreteFunctionSpace,
class LocalBlock >
452 template<
class DiscreteFunctionSpace,
class LocalBlock >
457 return LocalMatrixType( localMatrixStack_, domainEntity, rangeEntity );
Definition: bindguard.hh:11
Definition: adaptivefunction/adaptivefunction.hh:48
DofType * leakPointer()
Definition: adaptivefunction/adaptivefunction.hh:130
SizeType size() const
Return the number of blocks in the block vector.
Definition: common/discretefunction.hh:755
Interface for local matrix classes.
Definition: localmatrix.hh:32
Traits::DomainSpaceType DomainSpaceType
type of domain discrete function space
Definition: localmatrix.hh:52
Traits::RangeSpaceType RangeSpaceType
type of range discrete function space
Definition: localmatrix.hh:55
RangeSpaceType::EntityType RangeEntityType
Definition: localmatrix.hh:66
RangeSpaceType::BasisFunctionSetType RangeBasisFunctionSetType
type of base function sets within range function space
Definition: localmatrix.hh:63
DomainSpaceType::BasisFunctionSetType DomainBasisFunctionSetType
type of base function sets within domain function space
Definition: localmatrix.hh:59
Traits::RangeFieldType RangeFieldType
type of range field
Definition: localmatrix.hh:49
DomainSpaceType::EntityType DomainEntityType
Definition: localmatrix.hh:65
Definition: localmatrixwrapper.hh:48
DomainFunction DomainFunctionType
type of discrete function in the operator's domain
Definition: operator.hh:36
RangeFunction::RangeFieldType RangeFieldType
field type of the operator's range
Definition: operator.hh:43
DomainFunction::RangeFieldType DomainFieldType
field type of the operator's domain
Definition: operator.hh:41
RangeFunction RangeFunctionType
type of discrete function in the operator's range
Definition: operator.hh:38
abstract matrix operator
Definition: operator.hh:124
default implementation for a general operator stencil
Definition: stencil.hh:35
BlockDiagonalLinearOperator.
Definition: blockdiagonal.hh:30
LocalMatrixWrapper< LocalMatrixStackType > LocalMatrixType
Definition: blockdiagonal.hh:73
CommDataHandle< Operation >::Type dataHandle(const Operation &operation)
return reference to data handle object (needed to make this class work with CommunicationManager)
Definition: blockdiagonal.hh:187
ConstDofBlockPtrType block(const std::size_t block) const
return block matrix for given block number (== entity number)
Definition: blockdiagonal.hh:167
BaseType::RangeFieldType RangeFieldType
Definition: blockdiagonal.hh:39
DomainSpaceType DiscreteFunctionSpaceType
Definition: blockdiagonal.hh:55
void forEach(const Functor &functor)
Definition: blockdiagonal.hh:125
void leftmultiply(const ThisType &other)
Definition: blockdiagonal.hh:148
const RangeSpaceType & space_
Definition: blockdiagonal.hh:228
LocalColumnObjectType localColumn(const DomainEntityType &domainEntity) const
Definition: blockdiagonal.hh:199
static const int localBlockSize
Definition: blockdiagonal.hh:47
void operator()(const DomainFunctionType &u, RangeFunctionType &w) const
application operator
Definition: blockdiagonal.hh:90
ColumnObject< ThisType > LocalColumnObjectType
Definition: blockdiagonal.hh:75
void communicate()
copy matrices to ghost cells to make this class work in parallel
Definition: blockdiagonal.hh:177
BlockDiagonalLinearOperator(const std::string &name, const DomainSpaceType &domainSpace, const RangeSpaceType &rangeSpace)
Definition: blockdiagonal.hh:78
const DomainSpaceType & space() const
return reference to space (needed to make this class work with CommunicationManager)
Definition: blockdiagonal.hh:216
void invert()
Definition: blockdiagonal.hh:131
RangeFunctionType::DiscreteFunctionSpaceType RangeSpaceType
Definition: blockdiagonal.hh:42
void multiply(const AdaptiveDiscreteFunction< DomainSpace > &u, AdaptiveDiscreteFunction< RangeSpace > &w) const
Definition: blockdiagonal.hh:103
void clear()
Definition: blockdiagonal.hh:118
BaseType::DomainFunctionType DomainFunctionType
Definition: blockdiagonal.hh:35
std::vector< LocalBlockType > diagonal_
Definition: blockdiagonal.hh:229
const RangeSpaceType & rangeSpace() const
Definition: blockdiagonal.hh:210
DomainFunctionType::DiscreteFunctionSpaceType DomainSpaceType
Definition: blockdiagonal.hh:41
LocalBlockType::row_type DofType
Definition: blockdiagonal.hh:54
DomainSpaceType::EntityType DomainEntityType
Definition: blockdiagonal.hh:44
const std::string & name() const
Definition: blockdiagonal.hh:221
LocalMatrixType localMatrix(const DomainEntityType &domainEntity, const RangeEntityType &rangeEntity) const
Definition: blockdiagonal.hh:455
void rightmultiply(const ThisType &other)
Definition: blockdiagonal.hh:137
BaseType::RangeFunctionType RangeFunctionType
Definition: blockdiagonal.hh:36
ObjectStack< LocalMatrixFactory > LocalMatrixStackType
Definition: blockdiagonal.hh:72
const DomainSpaceType & domainSpace() const
Definition: blockdiagonal.hh:206
BaseType::DomainFieldType DomainFieldType
Definition: blockdiagonal.hh:38
LocalMatrixFactory localMatrixFactory_
Definition: blockdiagonal.hh:230
std::string name_
Definition: blockdiagonal.hh:227
void reserve(const Stencil &stencil, bool verbose=false)
Definition: blockdiagonal.hh:193
DofBlockPtrType block(const std::size_t block)
return block matrix for given block number (== entity number)
Definition: blockdiagonal.hh:160
const LocalBlockType * ConstDofBlockPtrType
Definition: blockdiagonal.hh:53
RangeSpaceType::EntityType RangeEntityType
Definition: blockdiagonal.hh:45
LocalMatrixStackType localMatrixStack_
Definition: blockdiagonal.hh:231
LocalBlockType * DofBlockPtrType
Definition: blockdiagonal.hh:52
LocalBlock LocalBlockType
Definition: blockdiagonal.hh:49
Definition: blockdiagonal.hh:59
DiscreteFunctionSpaceType::template CommDataHandle< ThisType, Operation >::Type Type
Definition: blockdiagonal.hh:62
Definition: blockdiagonal.hh:241
OperatorType::RangeFieldType RangeFieldType
Definition: blockdiagonal.hh:247
OperatorType::DomainSpaceType DomainSpaceType
Definition: blockdiagonal.hh:249
RangeFieldType LittleBlockType
Definition: blockdiagonal.hh:252
OperatorType::LocalMatrix LocalMatrixType
Definition: blockdiagonal.hh:245
OperatorType::RangeSpaceType RangeSpaceType
Definition: blockdiagonal.hh:250
Definition: blockdiagonal.hh:263
void finalize()
Definition: blockdiagonal.hh:366
RangeFieldType get(int i, int j) const
Definition: blockdiagonal.hh:336
int columns() const
Definition: blockdiagonal.hh:375
void add(int i, int j, const RangeFieldType &value)
Definition: blockdiagonal.hh:340
const DomainBasisFunctionSetType & domainBasisFunctionSet() const
Definition: blockdiagonal.hh:388
BlockDiagonalLinearOperator< DiscreteFunctionSpace, LocalBlock > OperatorType
Definition: blockdiagonal.hh:268
void scale(const RangeFieldType &a)
Definition: blockdiagonal.hh:331
BaseType::DomainEntityType DomainEntityType
Definition: blockdiagonal.hh:275
void resort()
Definition: blockdiagonal.hh:368
void init(const DomainEntityType &domainEntity, const RangeEntityType &rangeEntity)
Definition: blockdiagonal.hh:308
const DomainSpaceType & domainSpace() const
Definition: blockdiagonal.hh:380
void set(int i, int j, const RangeFieldType &value)
Definition: blockdiagonal.hh:344
void clearRow(int i)
Definition: blockdiagonal.hh:349
BaseType::RangeFieldType RangeFieldType
Definition: blockdiagonal.hh:270
void clearCol(int j)
Definition: blockdiagonal.hh:354
BaseType::DomainBasisFunctionSetType DomainBasisFunctionSetType
Definition: blockdiagonal.hh:272
const RangeBasisFunctionSetType & rangeBasisFunctionSet() const
Definition: blockdiagonal.hh:392
void multiplyAdd(const DomainLocalFunction &x, RangeLocalFunction &y) const
Definition: blockdiagonal.hh:361
void clear()
Definition: blockdiagonal.hh:327
int rows() const
Definition: blockdiagonal.hh:371
BaseType::RangeBasisFunctionSetType RangeBasisFunctionSetType
Definition: blockdiagonal.hh:273
const RangeEntityType & rangeEntity() const
Definition: blockdiagonal.hh:401
BaseType::RangeEntityType RangeEntityType
Definition: blockdiagonal.hh:276
const DomainEntityType & domainEntity() const
Definition: blockdiagonal.hh:397
LocalMatrix(OperatorType &op)
Definition: blockdiagonal.hh:303
const RangeSpaceType & rangeSpace() const
Definition: blockdiagonal.hh:384
Definition: blockdiagonal.hh:430
LocalMatrix ObjectType
Definition: blockdiagonal.hh:432
ObjectType * newObject() const
Definition: blockdiagonal.hh:438
BlockDiagonalLinearOperator< DiscreteFunctionSpace, LocalBlock > OperatorType
Definition: blockdiagonal.hh:431
LocalMatrixFactory(OperatorType &op)
Definition: blockdiagonal.hh:434
Definition: columnobject.hh:12