Reference documentation for deal.II version Git 016efd1 2014-11-21 17:32:43 -0600
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
BlockTrianglePrecondition< number > Class Template Reference

#include <deal.II/lac/block_matrix_array.h>

Inheritance diagram for BlockTrianglePrecondition< number >:
[legend]

Public Types

typedef types::global_dof_index size_type
 

Public Member Functions

 BlockTrianglePrecondition ()
 
 BlockTrianglePrecondition (const unsigned int n_blocks)
 
 BlockTrianglePrecondition (const unsigned int n_block_rows, VectorMemory< Vector< number > > &mem, const bool backward=false) DEAL_II_DEPRECATED
 
void initialize (const unsigned int n_block_rows, VectorMemory< Vector< number > > &mem, const bool backward=false) DEAL_II_DEPRECATED
 
void reinit (const unsigned int n_block_rows)
 
template<class MATRIX >
void enter (const MATRIX &matrix, const size_type row, const size_type col, const double prefix=1., const bool transpose=false)
 
template<class MATRIX >
void enter_aux (VectorMemory< Vector< double > > &mem, const MATRIX &matrix, const size_type row, const size_type col, const double prefix=1., const bool transpose=false) DEAL_II_DEPRECATED
 
void vmult (BlockVector< number > &dst, const BlockVector< number > &src) const
 
void vmult_add (BlockVector< number > &dst, const BlockVector< number > &src) const
 
void Tvmult (BlockVector< number > &dst, const BlockVector< number > &src) const
 
void Tvmult_add (BlockVector< number > &dst, const BlockVector< number > &src) const
 
 DeclException1 (ExcNoDiagonal, size_type,<< "No diagonal entry was added for block "<< arg1)
 
 DeclException1 (ExcMultipleDiagonal, size_type,<< "Inverse diagonal entries may not be added in block "<< arg1)
 

Private Member Functions

void do_row (BlockVector< number > &dst, size_type row_num) const
 
- Private Member Functions inherited from BlockMatrixArray< number >
 BlockMatrixArray ()
 
 BlockMatrixArray (const unsigned int n_block_rows, const unsigned int n_block_cols)
 
void initialize (const unsigned int n_block_rows, const unsigned int n_block_cols)
 
 BlockMatrixArray (const unsigned int n_block_rows, const unsigned int n_block_cols, VectorMemory< Vector< number > > &mem) DEAL_II_DEPRECATED
 
void initialize (const unsigned int n_block_rows, const unsigned int n_block_cols, VectorMemory< Vector< number > > &mem) DEAL_II_DEPRECATED
 
void reinit (const unsigned int n_block_rows, const unsigned int n_block_cols)
 
template<class MATRIX >
void enter (const MATRIX &matrix, const unsigned int row, const unsigned int col, const double prefix=1., const bool transpose=false)
 
template<class MATRIX >
void enter_aux (VectorMemory< Vector< number > > &mem, const MATRIX &matrix, const unsigned int row, const unsigned int col, const double prefix=1., const bool transpose=false) DEAL_II_DEPRECATED
 
void clear ()
 
unsigned int n_block_rows () const
 
unsigned int n_block_cols () const
 
void vmult (BlockVector< number > &dst, const BlockVector< number > &src) const
 
void vmult_add (BlockVector< number > &dst, const BlockVector< number > &src) const
 
void Tvmult (BlockVector< number > &dst, const BlockVector< number > &src) const
 
void Tvmult_add (BlockVector< number > &dst, const BlockVector< number > &src) const
 
number matrix_scalar_product (const BlockVector< number > &u, const BlockVector< number > &v) const
 
number matrix_norm_square (const BlockVector< number > &u) const
 
template<class STREAM >
void print_latex (STREAM &out) const
 
- Private Member Functions inherited from Subscriptor
 Subscriptor ()
 
 Subscriptor (const Subscriptor &)
 
virtual ~Subscriptor ()
 
Subscriptoroperator= (const Subscriptor &)
 
void subscribe (const char *identifier=0) const
 
void unsubscribe (const char *identifier=0) const
 
unsigned int n_subscriptions () const
 
void list_subscribers () const
 
 DeclException3 (ExcInUse, int, char *, std::string &,<< "Object of class "<< arg2<< " is still used by "<< arg1<< " other objects.\n"<< "(Additional information: "<< arg3<< ")\n"<< "Note the entry in the Frequently Asked Questions of "<< "deal.II (linked to from http://www.dealii.org/) for "<< "more information on what this error means.")
 
 DeclException2 (ExcNoSubscriber, char *, char *,<< "No subscriber with identifier \""<< arg2<< "\" did subscribe to this object of class "<< arg1)
 
template<class Archive >
void serialize (Archive &ar, const unsigned int version)
 

Private Attributes

bool backward
 
- Private Attributes inherited from BlockMatrixArray< number >
std::vector< Entryentries
 

Additional Inherited Members

- Private Types inherited from BlockMatrixArray< number >
typedef types::global_dof_index size_type
 

Detailed Description

template<typename number = double>
class BlockTrianglePrecondition< number >

Inversion of a block-triangular matrix.

In this block matrix, the inverses of the diagonal blocks are stored together with the off-diagonal blocks of a block matrix. Then, forward or backward insertion is performed block-wise. The diagonal blocks are NOT inverted for this purpose!

Like for all preconditioners, the preconditioning operation is performed by the vmult() member function.

Note
While block indices may be duplicated (see BlockMatrixArray) to add blocks, this has to be used with caution, since summing up the inverse of two blocks does not yield the inverse of the sum. While the latter would be desirable, we can only perform the first.

The implementation may be a little clumsy, but it should be sufficient as long as the block sizes are much larger than the number of blocks.

Example

Here, we document the second part of examples/doxygen/block_matrix_array.cc. For the beginning of this file, see BlockMatrixArray.

In order to set up the preconditioner, we have to compute the inverses of the diagonal blocks ourselves. Since we used FullMatrix objects, this is fairly easy.

deallog << "Error " << x.l2_norm() << std::endl;
deallog << "Error A-norm "
<< std::sqrt(matrix.matrix_norm_square(x))
<< std::endl;
FullMatrix<float> Ainv(4,4);
Ainv.invert(A);
FullMatrix<float> Cinv(2,2);
Cinv.invert(C);

After creating a 2x2 BlockTrianglePrecondition object, we only fill its diagonals. The scaling factor 1/2 used for A is the reciprocal of the scaling factor used for the matrix itself. Remember, this preconditioner actually multiplies with the diagonal blocks.

precondition(2, simple_mem);
precondition.enter(Ainv,0,0,.5);
precondition.enter(Cinv,1,1);

Now, we have a block Jacobi preconditioner, which is still symmetric, since the blocks are symmetric. Therefore, we can still use the preconditioned conjugate gradient method.

cg.solve(matrix, x, y, precondition);
x.add(-1., result);
deallog << "Error " << x.l2_norm() << std::endl;

Now, we enter the subdiagonal block. This is the same as in matrix.

precondition.enter(B1,1,0,-1., true);
precondition.enter(B2,1,0,1.);

Since the preconditioner is not symmetric anymore, we use the GMRES method for solving.

SolverGMRES<BlockVector<double> > gmres(control, mem);
gmres.solve(matrix, x, y, precondition);
x.add(-1., result);
deallog << "Error " << x.l2_norm() << std::endl;

Author
Guido Kanschat, 2001, 2005

Definition at line 510 of file block_matrix_array.h.

Member Typedef Documentation

template<typename number = double>
typedef types::global_dof_index BlockTrianglePrecondition< number >::size_type

Declare type for container size.

Definition at line 517 of file block_matrix_array.h.

Constructor & Destructor Documentation

template<typename number = double>
BlockTrianglePrecondition< number >::BlockTrianglePrecondition ( )

Default constructor creating a useless object. initialize() must be called before using it.

template<typename number = double>
BlockTrianglePrecondition< number >::BlockTrianglePrecondition ( const unsigned int  n_blocks)

Constructor. This matrix must be block-quadratic, and n_blocks is the number of blocks in each direction.

template<typename number = double>
BlockTrianglePrecondition< number >::BlockTrianglePrecondition ( const unsigned int  n_block_rows,
VectorMemory< Vector< number > > &  mem,
const bool  backward = false 
)

Constructor. This matrix must be block-quadratic. The additional parameter allows for backward insertion instead of forward.

Deprecated:
The second argument is ignored. Use the constructor with only the first and third argument.

Member Function Documentation

template<typename number = double>
void BlockTrianglePrecondition< number >::initialize ( const unsigned int  n_block_rows,
VectorMemory< Vector< number > > &  mem,
const bool  backward = false 
)

Initialize object completely. This is the function to call for an object created by the default constructor.

Deprecated:
The second argument is ignored. Use the function without that argument.
template<typename number = double>
void BlockTrianglePrecondition< number >::reinit ( const unsigned int  n_block_rows)

Resize preconditioner to a new size and clear all blocks.

template<typename number = double>
template<class MATRIX >
void BlockTrianglePrecondition< number >::enter ( const MATRIX matrix,
const size_type  row,
const size_type  col,
const double  prefix = 1.,
const bool  transpose = false 
)

Enter a block. This calls BlockMatrixArray::enter(). Remember that the diagonal blocks should actually be inverse matrices or preconditioners.

template<typename number = double>
template<class MATRIX >
void BlockTrianglePrecondition< number >::enter_aux ( VectorMemory< Vector< double > > &  mem,
const MATRIX matrix,
const size_type  row,
const size_type  col,
const double  prefix = 1.,
const bool  transpose = false 
)

Enter a block. This calls BlockMatrixArray::enter_aux(). Remember that the diagonal blocks should actually be inverse matrices or preconditioners.

Deprecated:
The first argument is ignored. Use enter() instead.
template<typename number = double>
void BlockTrianglePrecondition< number >::vmult ( BlockVector< number > &  dst,
const BlockVector< number > &  src 
) const

Preconditioning.

template<typename number = double>
void BlockTrianglePrecondition< number >::vmult_add ( BlockVector< number > &  dst,
const BlockVector< number > &  src 
) const

Preconditioning adding to dst.

template<typename number = double>
void BlockTrianglePrecondition< number >::Tvmult ( BlockVector< number > &  dst,
const BlockVector< number > &  src 
) const

Transposed preconditioning

template<typename number = double>
void BlockTrianglePrecondition< number >::Tvmult_add ( BlockVector< number > &  dst,
const BlockVector< number > &  src 
) const

Transposed preconditioning adding to dst.

template<typename number = double>
void BlockTrianglePrecondition< number >::do_row ( BlockVector< number > &  dst,
size_type  row_num 
) const
private

Add all off-diagonal contributions and return the entry of the diagonal element for one row.

Member Data Documentation

template<typename number = double>
bool BlockTrianglePrecondition< number >::backward
private

Flag for backward insertion.

Definition at line 685 of file block_matrix_array.h.


The documentation for this class was generated from the following file: