![]() |
Reference documentation for deal.II version 8.1.0
|
#include <sparse_matrix.h>
Classes | |
struct | Traits |
Public Types | |
typedef types::global_dof_index | size_type |
typedef number | value_type |
typedef numbers::NumberTraits< number >::real_type | real_type |
typedef SparseMatrixIterators::Iterator< number, true > | const_iterator |
typedef SparseMatrixIterators::Iterator< number, false > | iterator |
Public Member Functions | |
DeclException2 (ExcInvalidIndex, int, int,<< "The entry with index <"<< arg1<< ','<< arg2<< "> does not exist.") | |
DeclException1 (ExcInvalidIndex1, int,<< "The index "<< arg1<< " is not in the allowed range.") | |
DeclException0 (ExcDifferentSparsityPatterns) | |
DeclException2 (ExcIteratorRange, int, int,<< "The iterators denote a range of "<< arg1<< " elements, but the given number of rows was "<< arg2) | |
DeclException0 (ExcSourceEqualsDestination) | |
Constructors and initalization | |
SparseMatrix () | |
SparseMatrix (const SparseMatrix &) | |
SparseMatrix (const SparsityPattern &sparsity) | |
SparseMatrix (const SparsityPattern &sparsity, const IdentityMatrix &id) | |
virtual | ~SparseMatrix () |
SparseMatrix< number > & | operator= (const SparseMatrix< number > &) |
SparseMatrix< number > & | operator= (const IdentityMatrix &id) |
SparseMatrix & | operator= (const double d) |
virtual void | reinit (const SparsityPattern &sparsity) |
virtual void | clear () |
Information on the matrix | |
bool | empty () const |
size_type | m () const |
size_type | n () const |
size_type | get_row_length (const size_type row) const |
size_type | n_nonzero_elements () const |
size_type | n_actually_nonzero_elements (const double threshold=0.) const |
const SparsityPattern & | get_sparsity_pattern () const |
std::size_t | memory_consumption () const |
void | compress (::VectorOperation::values) |
Modifying entries | |
void | set (const size_type i, const size_type j, const number value) |
template<typename number2 > | |
void | set (const std::vector< size_type > &indices, const FullMatrix< number2 > &full_matrix, const bool elide_zero_values=false) |
template<typename number2 > | |
void | set (const std::vector< size_type > &row_indices, const std::vector< size_type > &col_indices, const FullMatrix< number2 > &full_matrix, const bool elide_zero_values=false) |
template<typename number2 > | |
void | set (const size_type row, const std::vector< size_type > &col_indices, const std::vector< number2 > &values, const bool elide_zero_values=false) |
template<typename number2 > | |
void | set (const size_type row, const size_type n_cols, const size_type *col_indices, const number2 *values, const bool elide_zero_values=false) |
void | add (const size_type i, const size_type j, const number value) |
template<typename number2 > | |
void | add (const std::vector< size_type > &indices, const FullMatrix< number2 > &full_matrix, const bool elide_zero_values=true) |
template<typename number2 > | |
void | add (const std::vector< size_type > &row_indices, const std::vector< size_type > &col_indices, const FullMatrix< number2 > &full_matrix, const bool elide_zero_values=true) |
template<typename number2 > | |
void | add (const size_type row, const std::vector< size_type > &col_indices, const std::vector< number2 > &values, const bool elide_zero_values=true) |
template<typename number2 > | |
void | add (const size_type row, const size_type n_cols, const size_type *col_indices, const number2 *values, const bool elide_zero_values=true, const bool col_indices_are_sorted=false) |
SparseMatrix & | operator*= (const number factor) |
SparseMatrix & | operator/= (const number factor) |
void | symmetrize () |
template<typename somenumber > | |
SparseMatrix< number > & | copy_from (const SparseMatrix< somenumber > &source) |
template<typename ForwardIterator > | |
void | copy_from (const ForwardIterator begin, const ForwardIterator end) |
template<typename somenumber > | |
void | copy_from (const FullMatrix< somenumber > &matrix) |
SparseMatrix< number > & | copy_from (const TrilinosWrappers::SparseMatrix &matrix) |
template<typename somenumber > | |
void | add (const number factor, const SparseMatrix< somenumber > &matrix) |
Entry Access | |
number | operator() (const size_type i, const size_type j) const |
number | el (const size_type i, const size_type j) const |
number | diag_element (const size_type i) const |
number & | diag_element (const size_type i) |
number | raw_entry (const size_type row, const size_type index) const DEAL_II_DEPRECATED |
number | global_entry (const size_type i) const DEAL_II_DEPRECATED |
number & | global_entry (const size_type i) DEAL_II_DEPRECATED |
Multiplications | |
template<class OutVector , class InVector > | |
void | vmult (OutVector &dst, const InVector &src) const |
template<class OutVector , class InVector > | |
void | Tvmult (OutVector &dst, const InVector &src) const |
template<class OutVector , class InVector > | |
void | vmult_add (OutVector &dst, const InVector &src) const |
template<class OutVector , class InVector > | |
void | Tvmult_add (OutVector &dst, const InVector &src) const |
template<typename somenumber > | |
somenumber | matrix_norm_square (const Vector< somenumber > &v) const |
template<typename somenumber > | |
somenumber | matrix_scalar_product (const Vector< somenumber > &u, const Vector< somenumber > &v) const |
template<typename somenumber > | |
somenumber | residual (Vector< somenumber > &dst, const Vector< somenumber > &x, const Vector< somenumber > &b) const |
template<typename numberB , typename numberC > | |
void | mmult (SparseMatrix< numberC > &C, const SparseMatrix< numberB > &B, const Vector< number > &V=Vector< number >(), const bool rebuild_sparsity_pattern=true) const |
template<typename numberB , typename numberC > | |
void | Tmmult (SparseMatrix< numberC > &C, const SparseMatrix< numberB > &B, const Vector< number > &V=Vector< number >(), const bool rebuild_sparsity_pattern=true) const |
Matrix norms | |
real_type | l1_norm () const |
real_type | linfty_norm () const |
real_type | frobenius_norm () const |
Preconditioning methods | |
template<typename somenumber > | |
void | precondition_Jacobi (Vector< somenumber > &dst, const Vector< somenumber > &src, const number omega=1.) const |
template<typename somenumber > | |
void | precondition_SSOR (Vector< somenumber > &dst, const Vector< somenumber > &src, const number omega=1., const std::vector< std::size_t > &pos_right_of_diagonal=std::vector< std::size_t >()) const |
template<typename somenumber > | |
void | precondition_SOR (Vector< somenumber > &dst, const Vector< somenumber > &src, const number om=1.) const |
template<typename somenumber > | |
void | precondition_TSOR (Vector< somenumber > &dst, const Vector< somenumber > &src, const number om=1.) const |
template<typename somenumber > | |
void | SSOR (Vector< somenumber > &v, const number omega=1.) const |
template<typename somenumber > | |
void | SOR (Vector< somenumber > &v, const number om=1.) const |
template<typename somenumber > | |
void | TSOR (Vector< somenumber > &v, const number om=1.) const |
template<typename somenumber > | |
void | PSOR (Vector< somenumber > &v, const std::vector< size_type > &permutation, const std::vector< size_type > &inverse_permutation, const number om=1.) const |
template<typename somenumber > | |
void | TPSOR (Vector< somenumber > &v, const std::vector< size_type > &permutation, const std::vector< size_type > &inverse_permutation, const number om=1.) const |
template<typename somenumber > | |
void | Jacobi_step (Vector< somenumber > &v, const Vector< somenumber > &b, const number om=1.) const |
template<typename somenumber > | |
void | SOR_step (Vector< somenumber > &v, const Vector< somenumber > &b, const number om=1.) const |
template<typename somenumber > | |
void | TSOR_step (Vector< somenumber > &v, const Vector< somenumber > &b, const number om=1.) const |
template<typename somenumber > | |
void | SSOR_step (Vector< somenumber > &v, const Vector< somenumber > &b, const number om=1.) const |
Iterators | |
const_iterator | begin () const |
const_iterator | end () const |
iterator | begin () |
iterator | end () |
const_iterator | begin (const size_type r) const |
const_iterator | end (const size_type r) const |
iterator | begin (const size_type r) |
iterator | end (const size_type r) |
Input/Output | |
template<class STREAM > | |
void | print (STREAM &out, const bool across=false, const bool diagonal_first=true) const |
void | print_formatted (std::ostream &out, const unsigned int precision=3, const bool scientific=true, const unsigned int width=0, const char *zero_string=" ", const double denominator=1.) const |
void | print_pattern (std::ostream &out, const double threshold=0.) const |
void | block_write (std::ostream &out) const |
void | block_read (std::istream &in) |
![]() | |
Subscriptor () | |
Subscriptor (const Subscriptor &) | |
virtual | ~Subscriptor () |
Subscriptor & | operator= (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) |
Protected Member Functions | |
void | prepare_add () |
void | prepare_set () |
Private Attributes | |
SmartPointer< const SparsityPattern, SparseMatrix< number > > | cols |
number * | val |
std::size_t | max_len |
Friends | |
template<typename somenumber > | |
class | SparseMatrix |
template<typename somenumber > | |
class | SparseLUDecomposition |
template<typename > | |
class | SparseILU |
template<typename > | |
class | BlockMatrixBase |
template<typename , bool > | |
class | SparseMatrixIterators::Iterator |
template<typename , bool > | |
class | SparseMatrixIterators::Accessor |
Sparse matrix. This class implements the function to store values in the locations of a sparse matrix denoted by a SparsityPattern. The separation of sparsity pattern and values is done since one can store data elements of different type in these locations without the SparsityPattern having to know this, and more importantly one can associate more than one matrix with the same sparsity pattern.
The elements of a SparseMatrix are stored in the same order in which the SparsityPattern class stores its entries. Within each row, elements are generally stored left-to-right in increasing column index order; the exception to this rule is that if the matrix is square (n_rows() == n_columns()), then the diagonal entry is stored as the first element in each row to make operations like applying a Jacobi or SSOR preconditioner faster. As a consequence, if you traverse the elements of a row of a SparseMatrix with the help of iterators into this object (using SparseMatrix::begin and SparseMatrix::end) you will find that the elements are not sorted by column index within each row whenever the matrix is square.
<float> and <double>
; others can be generated in application programs (see the section on Template instantiations in the manual).Definition at line 32 of file grid_generator.h.
typedef types::global_dof_index SparseMatrix< number >::size_type |
Declare type for container size.
Definition at line 499 of file sparse_matrix.h.
typedef number SparseMatrix< number >::value_type |
Type of matrix entries. In analogy to the STL container classes.
Definition at line 504 of file sparse_matrix.h.
typedef numbers::NumberTraits<number>::real_type SparseMatrix< number >::real_type |
Declare a type that has holds real-valued numbers with the same precision as the template argument to this class. If the template argument of this class is a real data type, then real_type equals the template argument. If the template argument is a std::complex type then real_type equals the type underlying the complex numbers.
This typedef is used to represent the return type of norms.
Definition at line 515 of file sparse_matrix.h.
typedef SparseMatrixIterators::Iterator<number,true> SparseMatrix< number >::const_iterator |
Typedef of an STL conforming iterator class walking over all the nonzero entries of this matrix. This iterator cannot change the values of the matrix.
Definition at line 524 of file sparse_matrix.h.
typedef SparseMatrixIterators::Iterator<number,false> SparseMatrix< number >::iterator |
Typedef of an STL conforming iterator class walking over all the nonzero entries of this matrix. This iterator can change the values of the matrix, but of course can't change the sparsity pattern as this is fixed once a sparse matrix is attached to it.
Definition at line 534 of file sparse_matrix.h.
DEAL_II_NAMESPACE_OPEN SparseMatrix< number >::SparseMatrix | ( | ) |
Constructor; initializes the matrix to be empty, without any structure, i.e. the matrix is not usable at all. This constructor is therefore only useful for matrices which are members of a class. All other matrices should be created at a point in the data flow where all necessary information is available.
You have to initialize the matrix before usage with reinit(const SparsityPattern&).
Definition at line 50 of file sparse_matrix.templates.h.
SparseMatrix< number >::SparseMatrix | ( | const SparseMatrix< number > & | m | ) |
Copy constructor. This constructor is only allowed to be called if the matrix to be copied is empty. This is for the same reason as for the SparsityPattern, see there for the details.
If you really want to copy a whole matrix, you can do so by using the copy_from() function.
Definition at line 60 of file sparse_matrix.templates.h.
|
explicit |
Constructor. Takes the given matrix sparsity structure to represent the sparsity pattern of this matrix. You can change the sparsity pattern later on by calling the reinit(const SparsityPattern&) function.
You have to make sure that the lifetime of the sparsity structure is at least as long as that of this matrix or as long as reinit(const SparsityPattern&) is not called with a new sparsity pattern.
The constructor is marked explicit so as to disallow that someone passes a sparsity pattern in place of a sparse matrix to some function, where an empty matrix would be generated then.
Definition at line 88 of file sparse_matrix.templates.h.
SparseMatrix< number >::SparseMatrix | ( | const SparsityPattern & | sparsity, |
const IdentityMatrix & | id | ||
) |
Copy constructor: initialize the matrix with the identity matrix. This constructor will throw an exception if the sizes of the sparsity pattern and the identity matrix do not coincide, or if the sparsity pattern does not provide for nonzero entries on the entire diagonal.
Definition at line 100 of file sparse_matrix.templates.h.
|
virtual |
Destructor. Free all memory, but do not release the memory of the sparsity structure.
Definition at line 118 of file sparse_matrix.templates.h.
SparseMatrix< number > & SparseMatrix< number >::operator= | ( | const SparseMatrix< number > & | m | ) |
Copy operator. Since copying entire sparse matrices is a very expensive operation, we disallow doing so except for the special case of empty matrices of size zero. This doesn't seem particularly useful, but is exactly what one needs if one wanted to have a std::vector<SparseMatrix<double> >
: in that case, one can create a vector (which needs the ability to copy objects) of empty matrices that are then later filled with something useful.
Definition at line 76 of file sparse_matrix.templates.h.
SparseMatrix< number > & SparseMatrix< number >::operator= | ( | const IdentityMatrix & | id | ) |
Copy operator: initialize the matrix with the identity matrix. This operator will throw an exception if the sizes of the sparsity pattern and the identity matrix do not coincide, or if the sparsity pattern does not provide for nonzero entries on the entire diagonal.
Definition at line 183 of file sparse_matrix.templates.h.
SparseMatrix< number > & SparseMatrix< number >::operator= | ( | const double | d | ) |
This operator assigns a scalar to a matrix. Since this does usually not make much sense (should we set all matrix entries to this value? Only the nonzero entries of the sparsity pattern?), this operation is only allowed if the actual value to be assigned is zero. This operator only exists to allow for the obvious notation matrix=0
, which sets all elements of the matrix to zero, but keep the sparsity pattern previously used.
Definition at line 148 of file sparse_matrix.templates.h.
|
virtual |
Reinitialize the sparse matrix with the given sparsity pattern. The latter tells the matrix how many nonzero elements there need to be reserved.
Regarding memory allocation, the same applies as said above.
You have to make sure that the lifetime of the sparsity structure is at least as long as that of this matrix or as long as reinit(const SparsityPattern &) is not called with a new sparsity structure.
The elements of the matrix are set to zero by this function.
Reimplemented in SparseLUDecomposition< number >, and SparseMIC< number >.
Definition at line 201 of file sparse_matrix.templates.h.
|
virtual |
Release all memory and return to a state just like after having called the default constructor. It also forgets the sparsity pattern it was previously tied to.
Reimplemented in SparseLUDecomposition< number >, and SparseMIC< number >.
Definition at line 230 of file sparse_matrix.templates.h.
bool SparseMatrix< number >::empty | ( | ) | const |
Return whether the object is empty. It is empty if either both dimensions are zero or no SparsityPattern is associated.
Definition at line 242 of file sparse_matrix.templates.h.
size_type SparseMatrix< number >::m | ( | ) | const |
Return the dimension of the image space. To remember: the matrix is of dimension .
size_type SparseMatrix< number >::n | ( | ) | const |
Return the dimension of the range space. To remember: the matrix is of dimension .
SparseMatrix< number >::size_type SparseMatrix< number >::get_row_length | ( | const size_type | row | ) | const |
Return the number of entries in a specific row.
Definition at line 254 of file sparse_matrix.templates.h.
SparseMatrix< number >::size_type SparseMatrix< number >::n_nonzero_elements | ( | ) | const |
Return the number of nonzero elements of this matrix. Actually, it returns the number of entries in the sparsity pattern; if any of the entries should happen to be zero, it is counted anyway.
Definition at line 264 of file sparse_matrix.templates.h.
SparseMatrix< number >::size_type SparseMatrix< number >::n_actually_nonzero_elements | ( | const double | threshold = 0. | ) | const |
Return the number of actually nonzero elements of this matrix. It is possible to specify the parameter threshold
in order to count only the elements that have absolute value greater than the threshold.
Note, that this function does (in contrary to n_nonzero_elements()) not count all entries of the sparsity pattern but only the ones that are nonzero (or whose absolute value is greater than threshold).
Definition at line 274 of file sparse_matrix.templates.h.
const SparsityPattern & SparseMatrix< number >::get_sparsity_pattern | ( | ) | const |
Return a (constant) reference to the underlying sparsity pattern of this matrix.
Though the return value is declared const
, you should be aware that it may change if you call any nonconstant function of objects which operate on it.
Definition at line 1811 of file sparse_matrix.templates.h.
std::size_t SparseMatrix< number >::memory_consumption | ( | ) | const |
Determine an estimate for the memory consumption (in bytes) of this object. See MemoryConsumption.
Definition at line 1949 of file sparse_matrix.templates.h.
void SparseMatrix< number >::compress | ( | ::VectorOperation::values | ) |
Dummy function for compatibility with distributed, parallel matrices.
Definition at line 1943 of file sparse_matrix.templates.h.
void SparseMatrix< number >::set | ( | const size_type | i, |
const size_type | j, | ||
const number | value | ||
) |
Set the element (i,j) to value
. Throws an error if the entry does not exist or if value
is not a finite number. Still, it is allowed to store zero values in non-existent fields.
void SparseMatrix< number >::set | ( | const std::vector< size_type > & | indices, |
const FullMatrix< number2 > & | full_matrix, | ||
const bool | elide_zero_values = false |
||
) |
Set all elements given in a FullMatrix into the sparse matrix locations given by indices
. In other words, this function writes the elements in full_matrix
into the calling matrix, using the local-to-global indexing specified by indices
for both the rows and the columns of the matrix. This function assumes a quadratic sparse matrix and a quadratic full_matrix, the usual situation in FE calculations.
The optional parameter elide_zero_values
can be used to specify whether zero values should be set anyway or they should be filtered away (and not change the previous content in the respective element if it exists). The default value is false
, i.e., even zero values are treated.
void SparseMatrix< number >::set | ( | const std::vector< size_type > & | row_indices, |
const std::vector< size_type > & | col_indices, | ||
const FullMatrix< number2 > & | full_matrix, | ||
const bool | elide_zero_values = false |
||
) |
Same function as before, but now including the possibility to use rectangular full_matrices and different local-to-global indexing on rows and columns, respectively.
void SparseMatrix< number >::set | ( | const size_type | row, |
const std::vector< size_type > & | col_indices, | ||
const std::vector< number2 > & | values, | ||
const bool | elide_zero_values = false |
||
) |
Set several elements in the specified row of the matrix with column indices as given by col_indices
to the respective value.
The optional parameter elide_zero_values
can be used to specify whether zero values should be set anyway or they should be filtered away (and not change the previous content in the respective element if it exists). The default value is false
, i.e., even zero values are treated.
void SparseMatrix< number >::set | ( | const size_type | row, |
const size_type | n_cols, | ||
const size_type * | col_indices, | ||
const number2 * | values, | ||
const bool | elide_zero_values = false |
||
) |
Set several elements to values given by values
in a given row in columns given by col_indices into the sparse matrix.
The optional parameter elide_zero_values
can be used to specify whether zero values should be inserted anyway or they should be filtered away. The default value is false
, i.e., even zero values are inserted/replaced.
Definition at line 625 of file sparse_matrix.templates.h.
void SparseMatrix< number >::add | ( | const size_type | i, |
const size_type | j, | ||
const number | value | ||
) |
Add value
to the element (i,j). Throws an error if the entry does not exist or if value
is not a finite number. Still, it is allowed to store zero values in non-existent fields.
void SparseMatrix< number >::add | ( | const std::vector< size_type > & | indices, |
const FullMatrix< number2 > & | full_matrix, | ||
const bool | elide_zero_values = true |
||
) |
Add all elements given in a FullMatrix<double> into sparse matrix locations given by indices
. In other words, this function adds the elements in full_matrix
to the respective entries in calling matrix, using the local-to-global indexing specified by indices
for both the rows and the columns of the matrix. This function assumes a quadratic sparse matrix and a quadratic full_matrix, the usual situation in FE calculations.
The optional parameter elide_zero_values
can be used to specify whether zero values should be added anyway or these should be filtered away and only non-zero data is added. The default value is true
, i.e., zero values won't be added into the matrix.
void SparseMatrix< number >::add | ( | const std::vector< size_type > & | row_indices, |
const std::vector< size_type > & | col_indices, | ||
const FullMatrix< number2 > & | full_matrix, | ||
const bool | elide_zero_values = true |
||
) |
Same function as before, but now including the possibility to use rectangular full_matrices and different local-to-global indexing on rows and columns, respectively.
void SparseMatrix< number >::add | ( | const size_type | row, |
const std::vector< size_type > & | col_indices, | ||
const std::vector< number2 > & | values, | ||
const bool | elide_zero_values = true |
||
) |
Set several elements in the specified row of the matrix with column indices as given by col_indices
to the respective value.
The optional parameter elide_zero_values
can be used to specify whether zero values should be added anyway or these should be filtered away and only non-zero data is added. The default value is true
, i.e., zero values won't be added into the matrix.
void SparseMatrix< number >::add | ( | const size_type | row, |
const size_type | n_cols, | ||
const size_type * | col_indices, | ||
const number2 * | values, | ||
const bool | elide_zero_values = true , |
||
const bool | col_indices_are_sorted = false |
||
) |
Add an array of values given by values
in the given global matrix row at columns specified by col_indices in the sparse matrix.
The optional parameter elide_zero_values
can be used to specify whether zero values should be added anyway or these should be filtered away and only non-zero data is added. The default value is true
, i.e., zero values won't be added into the matrix.
Definition at line 481 of file sparse_matrix.templates.h.
SparseMatrix& SparseMatrix< number >::operator*= | ( | const number | factor | ) |
Multiply the entire matrix by a fixed factor.
SparseMatrix& SparseMatrix< number >::operator/= | ( | const number | factor | ) |
Divide the entire matrix by a fixed factor.
void SparseMatrix< number >::symmetrize | ( | ) |
Symmetrize the matrix by forming the mean value between the existing matrix and its transpose, .
This operation assumes that the underlying sparsity pattern represents a symmetric object. If this is not the case, then the result of this operation will not be a symmetric matrix, since it only explicitly symmetrizes by looping over the lower left triangular part for efficiency reasons; if there are entries in the upper right triangle, then these elements are missed in the symmetrization. Symmetrization of the sparsity pattern can be obtain by SparsityPattern::symmetrize().
Definition at line 290 of file sparse_matrix.templates.h.
SparseMatrix< number > & SparseMatrix< number >::copy_from | ( | const SparseMatrix< somenumber > & | source | ) |
Copy the given matrix to this one. The operation triggers an assertion if the sparsity patterns of the two involved matrices do not point to the same object, since in this case the copy operation is cheaper. Since this operation is notheless not for free, we do not make it available through operator =
, since this may lead to unwanted usage, e.g. in copy arguments to functions, which should really be arguments by reference.
The source matrix may be a matrix of arbitrary type, as long as its data type is convertible to the data type of this matrix.
The function returns a reference to *this
.
Definition at line 330 of file sparse_matrix.templates.h.
void SparseMatrix< number >::copy_from | ( | const ForwardIterator | begin, |
const ForwardIterator | end | ||
) |
This function is complete analogous to the SparsityPattern::copy_from() function in that it allows to initialize a whole matrix in one step. See there for more information on argument types and their meaning. You can also find a small example on how to use this function there.
The only difference to the cited function is that the objects which the inner iterator points to need to be of type std::pair<unsigned int, value
, where value
needs to be convertible to the element type of this class, as specified by the number
template argument.
Previous content of the matrix is overwritten. Note that the entries specified by the input parameters need not necessarily cover all elements of the matrix. Elements not covered remain untouched.
void SparseMatrix< number >::copy_from | ( | const FullMatrix< somenumber > & | matrix | ) |
Copy the nonzero entries of a full matrix into this object. Previous content is deleted. Note that the underlying sparsity pattern must be appropriate to hold the nonzero entries of the full matrix.
Definition at line 347 of file sparse_matrix.templates.h.
SparseMatrix< number > & SparseMatrix< number >::copy_from | ( | const TrilinosWrappers::SparseMatrix< number > & | matrix | ) |
Copy the given Trilinos matrix to this one. The operation triggers an assertion if the sparsity patterns of the current object does not contain the location of a non-zero entry of the given argument.
This function assumes that the two matrices have the same sizes.
The function returns a reference to *this
.
Definition at line 365 of file sparse_matrix.templates.h.
void SparseMatrix< number >::add | ( | const number | factor, |
const SparseMatrix< somenumber > & | matrix | ||
) |
Add matrix
scaled by factor
to this matrix, i.e. the matrix factor*matrix
is added to this
. This function throws an error if the sparsity patterns of the two involved matrices do not point to the same object, since in this case the operation is cheaper.
The source matrix may be a sparse matrix over an arbitrary underlying scalar type, as long as its data type is convertible to the data type of this matrix.
Definition at line 410 of file sparse_matrix.templates.h.
number SparseMatrix< number >::operator() | ( | const size_type | i, |
const size_type | j | ||
) | const |
Return the value of the entry (i,j). This may be an expensive operation and you should always take care where to call this function. In order to avoid abuse, this function throws an exception if the required element does not exist in the matrix.
In case you want a function that returns zero instead (for entries that are not in the sparsity pattern of the matrix), use the el() function.
If you are looping over all elements, consider using one of the iterator classes instead, since they are tailored better to a sparse matrix structure.
number SparseMatrix< number >::el | ( | const size_type | i, |
const size_type | j | ||
) | const |
This function is mostly like operator()() in that it returns the value of the matrix entry (i,j). The only difference is that if this entry does not exist in the sparsity pattern, then instead of raising an exception, zero is returned. While this may be convenient in some cases, note that it is simple to write algorithms that are slow compared to an optimal solution, since the sparsity of the matrix is not used.
If you are looping over all elements, consider using one of the iterator classes instead, since they are tailored better to a sparse matrix structure.
number SparseMatrix< number >::diag_element | ( | const size_type | i | ) | const |
Return the main diagonal element in the ith row. This function throws an error if the matrix is not quadratic (see SparsityPattern::optimize_diagonal()).
This function is considerably faster than the operator()(), since for quadratic matrices, the diagonal entry may be the first to be stored in each row and access therefore does not involve searching for the right column number.
number& SparseMatrix< number >::diag_element | ( | const size_type | i | ) |
Same as above, but return a writeable reference. You're sure you know what you do?
number SparseMatrix< number >::raw_entry | ( | const size_type | row, |
const size_type | index | ||
) | const |
Access to values in internal mode. Returns the value of the index
th entry in row
. Here, index
refers to the internal representation of the matrix, not the column. Be sure to understand what you are doing here.
number SparseMatrix< number >::global_entry | ( | const size_type | i | ) | const |
This is for hackers. Get access to the ith element of this matrix. The elements are stored in a consecutive way, refer to the SparsityPattern class for more details.
You should use this interface very carefully and only if you are absolutely sure to know what you do. You should also note that the structure of these arrays may change over time. If you change the layout yourself, you should also rename this function to avoid programs relying on outdated information!
number& SparseMatrix< number >::global_entry | ( | const size_type | i | ) |
Same as above, but with write access. You certainly know what you do?
void SparseMatrix< number >::vmult | ( | OutVector & | dst, |
const InVector & | src | ||
) | const |
Matrix-vector multiplication: let dst = M*src with M being this matrix.
Note that while this function can operate on all vectors that offer iterator classes, it is only really effective for objects of type Vector. For all classes for which iterating over elements, or random member access is expensive, this function is not efficient. In particular, if you want to multiply with BlockVector objects, you should consider using a BlockSparseMatrix as well.
Source and destination must not be the same vector.
Definition at line 708 of file sparse_matrix.templates.h.
void SparseMatrix< number >::Tvmult | ( | OutVector & | dst, |
const InVector & | src | ||
) | const |
Matrix-vector multiplication: let dst = MT*src with M being this matrix. This function does the same as vmult() but takes the transposed matrix.
Note that while this function can operate on all vectors that offer iterator classes, it is only really effective for objects of type Vector. For all classes for which iterating over elements, or random member access is expensive, this function is not efficient. In particular, if you want to multiply with BlockVector objects, you should consider using a BlockSparseMatrix as well.
Source and destination must not be the same vector.
Definition at line 736 of file sparse_matrix.templates.h.
void SparseMatrix< number >::vmult_add | ( | OutVector & | dst, |
const InVector & | src | ||
) | const |
Adding Matrix-vector multiplication. Add M*src on dst with M being this matrix.
Note that while this function can operate on all vectors that offer iterator classes, it is only really effective for objects of type Vector. For all classes for which iterating over elements, or random member access is expensive, this function is not efficient. In particular, if you want to multiply with BlockVector objects, you should consider using a BlockSparseMatrix as well.
Source and destination must not be the same vector.
Definition at line 763 of file sparse_matrix.templates.h.
void SparseMatrix< number >::Tvmult_add | ( | OutVector & | dst, |
const InVector & | src | ||
) | const |
Adding Matrix-vector multiplication. Add MT*src to dst with M being this matrix. This function does the same as vmult_add() but takes the transposed matrix.
Note that while this function can operate on all vectors that offer iterator classes, it is only really effective for objects of type Vector. For all classes for which iterating over elements, or random member access is expensive, this function is not efficient. In particular, if you want to multiply with BlockVector objects, you should consider using a BlockSparseMatrix as well.
Source and destination must not be the same vector.
Definition at line 791 of file sparse_matrix.templates.h.
somenumber SparseMatrix< number >::matrix_norm_square | ( | const Vector< somenumber > & | v | ) | const |
Return the square of the norm of the vector with respect to the norm induced by this matrix, i.e.
. This is useful, e.g. in the finite element context, where the
norm of a function equals the matrix norm with respect to the mass matrix of the vector representing the nodal values of the finite element function.
Obviously, the matrix needs to be quadratic for this operation, and for the result to actually be a norm it also needs to be either real symmetric or complex hermitian.
The underlying template types of both this matrix and the given vector should either both be real or complex-valued, but not mixed, for this function to make sense.
Definition at line 853 of file sparse_matrix.templates.h.
somenumber SparseMatrix< number >::matrix_scalar_product | ( | const Vector< somenumber > & | u, |
const Vector< somenumber > & | v | ||
) | const |
Compute the matrix scalar product .
Definition at line 917 of file sparse_matrix.templates.h.
somenumber SparseMatrix< number >::residual | ( | Vector< somenumber > & | dst, |
const Vector< somenumber > & | x, | ||
const Vector< somenumber > & | b | ||
) | const |
Compute the residual of an equation Mx=b, where the residual is defined to be r=b-Mx. Write the residual into dst
. The l2 norm of the residual vector is returned.
Source x and destination dst must not be the same vector.
Definition at line 1302 of file sparse_matrix.templates.h.
void SparseMatrix< number >::mmult | ( | SparseMatrix< numberC > & | C, |
const SparseMatrix< numberB > & | B, | ||
const Vector< number > & | V = Vector<number>() , |
||
const bool | rebuild_sparsity_pattern = true |
||
) | const |
Perform the matrix-matrix multiplication C = A * B
, or, if an optional vector argument is given, C = A * diag(V) * B
, where diag(V)
defines a diagonal matrix with the vector entries.
This function assumes that the calling matrix A
and B
have compatible sizes. The size of C
will be set within this function.
The content as well as the sparsity pattern of the matrix C will be changed by this function, so make sure that the sparsity pattern is not used somewhere else in your program. This is an expensive operation, so think twice before you use this function.
There is an optional flag rebuild_sparsity_pattern
that can be used to bypass the creation of a new sparsity pattern and instead uses the sparsity pattern stored in C
. In that case, make sure that it really fits. The default is to rebuild the sparsity pattern.
Definition at line 942 of file sparse_matrix.templates.h.
void SparseMatrix< number >::Tmmult | ( | SparseMatrix< numberC > & | C, |
const SparseMatrix< numberB > & | B, | ||
const Vector< number > & | V = Vector<number>() , |
||
const bool | rebuild_sparsity_pattern = true |
||
) | const |
Perform the matrix-matrix multiplication with the transpose of this
, i.e., C = AT * B
, or, if an optional vector argument is given, C = AT * diag(V) * B
, where diag(V)
defines a diagonal matrix with the vector entries.
This function assumes that the calling matrix A
and B
have compatible sizes. The size of C
will be set within this function.
The content as well as the sparsity pattern of the matrix C will be changed by this function, so make sure that the sparsity pattern is not used somewhere else in your program. This is an expensive operation, so think twice before you use this function.
There is an optional flag rebuild_sparsity_pattern
that can be used to bypass the creation of a new sparsity pattern and instead uses the sparsity pattern stored in C
. In that case, make sure that it really fits. The default is to rebuild the sparsity pattern.
Definition at line 1069 of file sparse_matrix.templates.h.
SparseMatrix< number >::real_type SparseMatrix< number >::l1_norm | ( | ) | const |
Return the -norm of the matrix, that is
, (max. sum of columns). This is the natural matrix norm that is compatible to the
-norm for vectors, i.e.
. (cf. Haemmerlin-Hoffmann: Numerische Mathematik)
Definition at line 1197 of file sparse_matrix.templates.h.
SparseMatrix< number >::real_type SparseMatrix< number >::linfty_norm | ( | ) | const |
Return the -norm of the matrix, that is
, (max. sum of rows). This is the natural matrix norm that is compatible to the
-norm of vectors, i.e.
. (cf. Haemmerlin-Hoffmann: Numerische Mathematik)
Definition at line 1215 of file sparse_matrix.templates.h.
SparseMatrix< number >::real_type SparseMatrix< number >::frobenius_norm | ( | ) | const |
Return the frobenius norm of the matrix, i.e. the square root of the sum of squares of all entries in the matrix.
Definition at line 1240 of file sparse_matrix.templates.h.
void SparseMatrix< number >::precondition_Jacobi | ( | Vector< somenumber > & | dst, |
const Vector< somenumber > & | src, | ||
const number | omega = 1. |
||
) | const |
Apply the Jacobi preconditioner, which multiplies every element of the src
vector by the inverse of the respective diagonal element and multiplies the result with the relaxation factor omega
.
Definition at line 1332 of file sparse_matrix.templates.h.
void SparseMatrix< number >::precondition_SSOR | ( | Vector< somenumber > & | dst, |
const Vector< somenumber > & | src, | ||
const number | omega = 1. , |
||
const std::vector< std::size_t > & | pos_right_of_diagonal = std::vector<std::size_t>() |
||
) | const |
Apply SSOR preconditioning to src
with damping omega
. The optional argument pos_right_of_diagonal
is supposed to provide an array where each entry specifies the position just right of the diagonal in the global array of nonzeros.
Definition at line 1371 of file sparse_matrix.templates.h.
void SparseMatrix< number >::precondition_SOR | ( | Vector< somenumber > & | dst, |
const Vector< somenumber > & | src, | ||
const number | om = 1. |
||
) | const |
Apply SOR preconditioning matrix to src
.
Definition at line 1500 of file sparse_matrix.templates.h.
void SparseMatrix< number >::precondition_TSOR | ( | Vector< somenumber > & | dst, |
const Vector< somenumber > & | src, | ||
const number | om = 1. |
||
) | const |
Apply transpose SOR preconditioning matrix to src
.
Definition at line 1515 of file sparse_matrix.templates.h.
void SparseMatrix< number >::SSOR | ( | Vector< somenumber > & | v, |
const number | omega = 1. |
||
) | const |
Perform SSOR preconditioning in-place. Apply the preconditioner matrix without copying to a second vector. omega
is the relaxation parameter.
Definition at line 1760 of file sparse_matrix.templates.h.
void SparseMatrix< number >::SOR | ( | Vector< somenumber > & | v, |
const number | om = 1. |
||
) | const |
Perform an SOR preconditioning in-place. omega
is the relaxation parameter.
Definition at line 1530 of file sparse_matrix.templates.h.
void SparseMatrix< number >::TSOR | ( | Vector< somenumber > & | v, |
const number | om = 1. |
||
) | const |
Perform a transpose SOR preconditioning in-place. omega
is the relaxation parameter.
Definition at line 1557 of file sparse_matrix.templates.h.
void SparseMatrix< number >::PSOR | ( | Vector< somenumber > & | v, |
const std::vector< size_type > & | permutation, | ||
const std::vector< size_type > & | inverse_permutation, | ||
const number | om = 1. |
||
) | const |
Perform a permuted SOR preconditioning in-place.
The standard SOR method is applied in the order prescribed by permutation
, that is, first the row permutation[0]
, then permutation[1]
and so on. For efficiency reasons, the permutation as well as its inverse are required.
omega
is the relaxation parameter.
Definition at line 1587 of file sparse_matrix.templates.h.
void SparseMatrix< number >::TPSOR | ( | Vector< somenumber > & | v, |
const std::vector< size_type > & | permutation, | ||
const std::vector< size_type > & | inverse_permutation, | ||
const number | om = 1. |
||
) | const |
Perform a transposed permuted SOR preconditioning in-place.
The transposed SOR method is applied in the order prescribed by permutation
, that is, first the row permutation[m()-1]
, then permutation[m()-2]
and so on. For efficiency reasons, the permutation as well as its inverse are required.
omega
is the relaxation parameter.
Definition at line 1625 of file sparse_matrix.templates.h.
void SparseMatrix< number >::Jacobi_step | ( | Vector< somenumber > & | v, |
const Vector< somenumber > & | b, | ||
const number | om = 1. |
||
) | const |
Do one Jacobi step on v
. Performs a direct Jacobi step with right hand side b
. This function will need an auxiliary vector, which is acquired from GrowingVectorMemory.
Definition at line 1662 of file sparse_matrix.templates.h.
void SparseMatrix< number >::SOR_step | ( | Vector< somenumber > & | v, |
const Vector< somenumber > & | b, | ||
const number | om = 1. |
||
) | const |
Do one SOR step on v
. Performs a direct SOR step with right hand side b
.
Definition at line 1693 of file sparse_matrix.templates.h.
void SparseMatrix< number >::TSOR_step | ( | Vector< somenumber > & | v, |
const Vector< somenumber > & | b, | ||
const number | om = 1. |
||
) | const |
Do one adjoint SOR step on v
. Performs a direct TSOR step with right hand side b
.
Definition at line 1720 of file sparse_matrix.templates.h.
void SparseMatrix< number >::SSOR_step | ( | Vector< somenumber > & | v, |
const Vector< somenumber > & | b, | ||
const number | om = 1. |
||
) | const |
Do one SSOR step on v
. Performs a direct SSOR step with right hand side b
by performing TSOR after SOR.
Definition at line 1747 of file sparse_matrix.templates.h.
const_iterator SparseMatrix< number >::begin | ( | ) | const |
STL-like iterator with the first entry of the matrix. This is the version for constant matrices.
Note the discussion in the general documentation of this class about the order in which elements are accessed.
const_iterator SparseMatrix< number >::end | ( | ) | const |
Final iterator. This is the version for constant matrices.
iterator SparseMatrix< number >::begin | ( | ) |
STL-like iterator with the first entry of the matrix. This is the version for non-constant matrices.
Note the discussion in the general documentation of this class about the order in which elements are accessed.
iterator SparseMatrix< number >::end | ( | ) |
Final iterator. This is the version for non-constant matrices.
const_iterator SparseMatrix< number >::begin | ( | const size_type | r | ) | const |
STL-like iterator with the first entry of row r
. This is the version for constant matrices.
Note that if the given row is empty, i.e. does not contain any nonzero entries, then the iterator returned by this function equals end(r)
. Note also that the iterator may not be dereferencable in that case.
Note also the discussion in the general documentation of this class about the order in which elements are accessed.
const_iterator SparseMatrix< number >::end | ( | const size_type | r | ) | const |
Final iterator of row r
. It points to the first element past the end of line r
, or past the end of the entire sparsity pattern. This is the version for constant matrices.
Note that the end iterator is not necessarily dereferencable. This is in particular the case if it is the end iterator for the last row of a matrix.
iterator SparseMatrix< number >::begin | ( | const size_type | r | ) |
STL-like iterator with the first entry of row r
. This is the version for non-constant matrices.
Note that if the given row is empty, i.e. does not contain any nonzero entries, then the iterator returned by this function equals end(r)
. Note also that the iterator may not be dereferencable in that case.
Note the discussion in the general documentation of this class about the order in which elements are accessed.
iterator SparseMatrix< number >::end | ( | const size_type | r | ) |
Final iterator of row r
. It points to the first element past the end of line r
, or past the end of the entire sparsity pattern. This is the version for non-constant matrices.
Note that the end iterator is not necessarily dereferencable. This is in particular the case if it is the end iterator for the last row of a matrix.
void SparseMatrix< number >::print | ( | STREAM & | out, |
const bool | across = false , |
||
const bool | diagonal_first = true |
||
) | const |
Print the matrix to the given stream, using the format (row,column) value
, i.e. one nonzero entry of the matrix per line. If across
is true, print all entries on a single line, using the format row,column:value.
If the argument diagonal_first
is true, diagonal elements of quadratic matrices are printed first in their row, corresponding to the internal storage scheme. If it is false, the elements in a row are written in ascending column order.
void SparseMatrix< number >::print_formatted | ( | std::ostream & | out, |
const unsigned int | precision = 3 , |
||
const bool | scientific = true , |
||
const unsigned int | width = 0 , |
||
const char * | zero_string = " " , |
||
const double | denominator = 1. |
||
) | const |
Print the matrix in the usual format, i.e. as a matrix and not as a list of nonzero elements. For better readability, elements not in the matrix are displayed as empty space, while matrix elements which are explicitly set to zero are displayed as such.
The parameters allow for a flexible setting of the output format: precision
and scientific
are used to determine the number format, where scientific = false
means fixed point notation. A zero entry for width
makes the function compute a width, but it may be changed to a positive value, if output is crude.
Additionally, a character for an empty value may be specified.
Finally, the whole matrix can be multiplied with a common denominator to produce more readable output, even integers.
Definition at line 1820 of file sparse_matrix.templates.h.
void SparseMatrix< number >::print_pattern | ( | std::ostream & | out, |
const double | threshold = 0. |
||
) | const |
Print the actual pattern of the matrix. For each entry with an absolute value larger than threshold, a '*' is printed, a ':' for every value smaller and a '.' for every entry not allocated.
Definition at line 1868 of file sparse_matrix.templates.h.
void SparseMatrix< number >::block_write | ( | std::ostream & | out | ) | const |
Write the data of this object en bloc to a file. This is done in a binary mode, so the output is neither readable by humans nor (probably) by other computers using a different operating system of number format.
The purpose of this function is that you can swap out matrices and sparsity pattern if you are short of memory, want to communicate between different programs, or allow objects to be persistent across different runs of the program.
Definition at line 1892 of file sparse_matrix.templates.h.
void SparseMatrix< number >::block_read | ( | std::istream & | in | ) |
Read data that has previously been written by block_write() from a file. This is done using the inverse operations to the above function, so it is reasonably fast because the bitstream is not interpreted except for a few numbers up front.
The object is resized on this operation, and all previous contents are lost. Note, however, that no checks are performed whether new data and the underlying SparsityPattern object fit together. It is your responsibility to make sure that the sparsity pattern and the data to be read match.
A primitive form of error checking is performed which will recognize the bluntest attempts to interpret some data as a matrix stored bitwise to a file that wasn't actually created that way, but not more.
Definition at line 1912 of file sparse_matrix.templates.h.
|
protected |
For some matrix storage formats, in particular for the PETSc distributed blockmatrices, set and add operations on individual elements can not be freely mixed. Rather, one has to synchronize operations when one wants to switch from setting elements to adding to elements. BlockMatrixBase automatically synchronizes the access by calling this helper function for each block. This function ensures that the matrix is in a state that allows adding elements; if it previously already was in this state, the function does nothing.
|
protected |
Same as prepare_add() but prepare the matrix for setting elements if the representation of elements in this class requires such an operation.
To allow it calling private prepare_add() and prepare_set().
Definition at line 1652 of file sparse_matrix.h.
|
friend |
Also give access to internal details to the iterator/accessor classes.
Definition at line 1658 of file sparse_matrix.h.
|
private |
Pointer to the sparsity pattern used for this matrix. In order to guarantee that it is not deleted while still in use, we subscribe to it using the SmartPointer class.
Definition at line 1626 of file sparse_matrix.h.
|
private |
Array of values for all the nonzero entries. The position within the matrix, i.e. the row and column number for a given entry can only be deduced using the sparsity pattern. The same holds for the more common operation of finding an entry by its coordinates.
Definition at line 1634 of file sparse_matrix.h.
|
private |
Allocated size of val. This can be larger than the actually used part if the size of the matrix was reduced somewhen in the past by associating a sparsity pattern with a smaller size to this object, using the reinit() function.
Definition at line 1642 of file sparse_matrix.h.