Reference documentation for deal.II version 9.6.0

#include <deal.II/lac/chunk_sparse_matrix.h>
Classes  
struct  Traits 
Public Types  
using  size_type = types::global_dof_index 
using  value_type = number 
using  real_type = typename numbers::NumberTraits<number>::real_type 
using  const_iterator = ChunkSparseMatrixIterators::Iterator<number, true> 
using  iterator = ChunkSparseMatrixIterators::Iterator<number, false> 
Public Member Functions  
template<class Archive >  
void  serialize (Archive &ar, const unsigned int version) 
Constructors and initialization.  
ChunkSparseMatrix ()  
ChunkSparseMatrix (const ChunkSparseMatrix &)  
ChunkSparseMatrix (const ChunkSparsityPattern &sparsity)  
ChunkSparseMatrix (const ChunkSparsityPattern &sparsity, const IdentityMatrix &id)  
virtual  ~ChunkSparseMatrix () override 
ChunkSparseMatrix< number > &  operator= (const ChunkSparseMatrix< number > &) 
ChunkSparseMatrix< number > &  operator= (const IdentityMatrix &id) 
ChunkSparseMatrix &  operator= (const double d) 
virtual void  reinit (const ChunkSparsityPattern &sparsity) 
virtual void  clear () 
Information on the matrix  
bool  empty () const 
size_type  m () const 
size_type  n () const 
size_type  n_nonzero_elements () const 
size_type  n_actually_nonzero_elements () const 
const ChunkSparsityPattern &  get_sparsity_pattern () const 
std::size_t  memory_consumption () const 
Modifying entries  
void  set (const size_type i, const size_type j, const number value) 
void  add (const size_type i, const size_type j, const number value) 
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) 
ChunkSparseMatrix &  operator*= (const number factor) 
ChunkSparseMatrix &  operator/= (const number factor) 
void  symmetrize () 
template<typename somenumber >  
ChunkSparseMatrix< number > &  copy_from (const ChunkSparseMatrix< somenumber > &source) 
template<typename ForwardIterator >  
void  copy_from (const ForwardIterator begin, const ForwardIterator end) 
template<typename somenumber >  
void  copy_from (const FullMatrix< somenumber > &matrix) 
template<typename somenumber >  
void  add (const number factor, const ChunkSparseMatrix< 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 
void  extract_row_copy (const size_type row, const size_type array_length, size_type &row_length, size_type *column_indices, number *values) const 
Matrix vector 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 
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 om=1.) 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  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 unsigned int r) const 
const_iterator  end (const unsigned int r) const 
iterator  begin (const unsigned int r) 
iterator  end (const unsigned int r) 
Input/Output  
void  print (std::ostream &out) 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 char *separator=" ") 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 functionality  
Classes derived from Subscriptor provide a facility to subscribe to this object. This is mostly used by the SmartPointer class.  
void  subscribe (std::atomic< bool > *const validity, const std::string &identifier="") const 
void  unsubscribe (std::atomic< bool > *const validity, const std::string &identifier="") const 
unsigned int  n_subscriptions () const 
template<typename StreamType >  
void  list_subscribers (StreamType &stream) const 
void  list_subscribers () const 
Static Public Member Functions  
static ::ExceptionBase &  ExcInvalidIndex (int arg1, int arg2) 
static ::ExceptionBase &  ExcDifferentChunkSparsityPatterns () 
static ::ExceptionBase &  ExcIteratorRange (int arg1, int arg2) 
static ::ExceptionBase &  ExcSourceEqualsDestination () 
static ::ExceptionBase &  ExcInUse (int arg1, std::string arg2, std::string arg3) 
static ::ExceptionBase &  ExcNoSubscriber (std::string arg1, std::string arg2) 
Private Types  
using  map_value_type = decltype(counter_map)::value_type 
using  map_iterator = decltype(counter_map)::iterator 
Private Member Functions  
size_type  compute_location (const size_type i, const size_type j) const 
void  check_no_subscribers () const noexcept 
Private Attributes  
SmartPointer< const ChunkSparsityPattern, ChunkSparseMatrix< number > >  cols 
std::unique_ptr< number[]>  val 
size_type  max_len 
std::atomic< unsigned int >  counter 
std::map< std::string, unsigned int >  counter_map 
std::vector< std::atomic< bool > * >  validity_pointers 
const std::type_info *  object_info 
Static Private Attributes  
static std::mutex  mutex 
Friends  
template<typename somenumber >  
class  ChunkSparseMatrix 
template<typename , bool >  
class  ChunkSparseMatrixIterators::Iterator 
template<typename , bool >  
class  ChunkSparseMatrixIterators::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 use of this class is demonstrated in step51.
<float> and <double>
; others can be generated in application programs (see the section on Template instantiations in the manual). Definition at line 448 of file chunk_sparse_matrix.h.
using ChunkSparseMatrix< number >::size_type = types::global_dof_index 
Declare the type for container size.
Definition at line 454 of file chunk_sparse_matrix.h.
using ChunkSparseMatrix< number >::value_type = number 
Type of matrix entries. This alias is analogous to value_type
in the standard library containers.
Definition at line 460 of file chunk_sparse_matrix.h.
using ChunkSparseMatrix< number >::real_type = typename numbers::NumberTraits<number>::real_type 
Declare a type that has holds realvalued 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 alias is used to represent the return type of norms.
Definition at line 471 of file chunk_sparse_matrix.h.
using ChunkSparseMatrix< number >::const_iterator = ChunkSparseMatrixIterators::Iterator<number, true> 
Typedef of an iterator class walking over all the nonzero entries of this matrix. This iterator cannot change the values of the matrix.
Definition at line 477 of file chunk_sparse_matrix.h.
using ChunkSparseMatrix< number >::iterator = ChunkSparseMatrixIterators::Iterator<number, false> 
Typedef of an 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 485 of file chunk_sparse_matrix.h.

privateinherited 
The data type used in counter_map.
Definition at line 229 of file subscriptor.h.

privateinherited 
The iterator type used in counter_map.
Definition at line 234 of file subscriptor.h.
ChunkSparseMatrix< number >::ChunkSparseMatrix  (  ) 
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 ChunkSparsityPattern&).
ChunkSparseMatrix< number >::ChunkSparseMatrix  (  const ChunkSparseMatrix< number > &  ) 
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 ChunkSparsityPattern, see there for the details.
If you really want to copy a whole matrix, you can do so by using the copy_from() function.

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 ChunkSparsityPattern&) 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 ChunkSparsityPattern&) 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.
ChunkSparseMatrix< number >::ChunkSparseMatrix  (  const ChunkSparsityPattern &  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.

overridevirtual 
Destructor. Free all memory, but do not release the memory of the sparsity structure.
ChunkSparseMatrix< number > & ChunkSparseMatrix< number >::operator=  (  const ChunkSparseMatrix< number > &  ) 
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<ChunkSparseMatrix<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.
ChunkSparseMatrix< number > & ChunkSparseMatrix< 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.
ChunkSparseMatrix & ChunkSparseMatrix< 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.

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 ChunkSparsityPattern &) is not called with a new sparsity structure.
The elements of the matrix are set to zero by this function.

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.
bool ChunkSparseMatrix< number >::empty  (  )  const 
Return whether the object is empty. It is empty if either both dimensions are zero or no ChunkSparsityPattern is associated.
size_type ChunkSparseMatrix< number >::m  (  )  const 
Return the dimension of the codomain (or range) space. Note that the matrix is of dimension \(m \times n\).
size_type ChunkSparseMatrix< number >::n  (  )  const 
Return the dimension of the domain space. Note that the matrix is of dimension \(m \times n\).
size_type ChunkSparseMatrix< 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.
size_type ChunkSparseMatrix< number >::n_actually_nonzero_elements  (  )  const 
Return the number of actually nonzero elements of this matrix.
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.
const ChunkSparsityPattern & ChunkSparseMatrix< 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.
std::size_t ChunkSparseMatrix< number >::memory_consumption  (  )  const 
Determine an estimate for the memory consumption (in bytes) of this object. See MemoryConsumption.
void ChunkSparseMatrix< 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 nonexistent fields.
void ChunkSparseMatrix< 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 nonexistent fields.
void ChunkSparseMatrix< 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 nonzero data is added. The default value is true
, i.e., zero values won't be added into the matrix.
ChunkSparseMatrix & ChunkSparseMatrix< number >::operator*=  (  const number  factor  ) 
Multiply the entire matrix by a fixed factor.
ChunkSparseMatrix & ChunkSparseMatrix< number >::operator/=  (  const number  factor  ) 
Divide the entire matrix by a fixed factor.
void ChunkSparseMatrix< number >::symmetrize  (  ) 
Symmetrize the matrix by forming the mean value between the existing matrix and its transpose, \(A = \frac 12(A+A^T)\).
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 ChunkSparsityPattern::symmetrize().
ChunkSparseMatrix< number > & ChunkSparseMatrix< number >::copy_from  (  const ChunkSparseMatrix< somenumber > &  source  ) 
Copy the matrix given as argument into the current object.
Copying matrices is an expensive operation that we do not want to happen by accident through compiler generated code for operator=
. (This would happen, for example, if one accidentally declared a function argument of the current type by value rather than by reference.) The functionality of copying matrices is implemented in this member function instead. All copy operations of objects of this type therefore require an explicit function call.
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
.
void ChunkSparseMatrix< number >::copy_from  (  const ForwardIterator  begin, 
const ForwardIterator  end ) 
This function is complete analogous to the ChunkSparsityPattern::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 ChunkSparseMatrix< 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.
void ChunkSparseMatrix< number >::add  (  const number  factor, 
const ChunkSparseMatrix< 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.
number ChunkSparseMatrix< 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 ChunkSparseMatrix< 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 ChunkSparseMatrix< 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.
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.
void ChunkSparseMatrix< number >::extract_row_copy  (  const size_type  row, 
const size_type  array_length,  
size_type &  row_length,  
size_type *  column_indices,  
number *  values ) const 
Extracts a copy of the values and indices in the given matrix row.
The user is expected to pass the length of the arrays column_indices and values, which gives a means for checking that we do not write to unallocated memory. This method is motivated by a similar method in Trilinos row matrices and gives faster access to entries in the matrix as compared to iterators which are quite slow for this matrix type.
void ChunkSparseMatrix< number >::vmult  (  OutVector &  dst, 
const InVector &  src ) const 
Matrixvector 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 BlockChunkSparseMatrix as well.
Source and destination must not be the same vector.
void ChunkSparseMatrix< number >::Tvmult  (  OutVector &  dst, 
const InVector &  src ) const 
Matrixvector multiplication: let dst = M^{T}*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 BlockChunkSparseMatrix as well.
Source and destination must not be the same vector.
void ChunkSparseMatrix< number >::vmult_add  (  OutVector &  dst, 
const InVector &  src ) const 
Adding Matrixvector 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 BlockChunkSparseMatrix as well.
Source and destination must not be the same vector.
void ChunkSparseMatrix< number >::Tvmult_add  (  OutVector &  dst, 
const InVector &  src ) const 
Adding Matrixvector multiplication. Add M^{T}*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 BlockChunkSparseMatrix as well.
Source and destination must not be the same vector.
somenumber ChunkSparseMatrix< number >::matrix_norm_square  (  const Vector< somenumber > &  v  )  const 
Return the square of the norm of the vector \(v\) with respect to the norm induced by this matrix, i.e. \(\left(v,Mv\right)\). This is useful, e.g. in the finite element context, where the \(L_2\) 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 complexvalued, but not mixed, for this function to make sense.
somenumber ChunkSparseMatrix< number >::matrix_scalar_product  (  const Vector< somenumber > &  u, 
const Vector< somenumber > &  v ) const 
Compute the matrix scalar product \(\left(u,Mv\right)\).
somenumber ChunkSparseMatrix< 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=bMx. Write the residual into dst
. The l_{2} norm of the residual vector is returned.
Source x and destination dst must not be the same vector.
real_type ChunkSparseMatrix< number >::l1_norm  (  )  const 
Return the l1norm of the matrix, that is \(M_1=max_{all columns j}\sum_{all rows i} M_ij\), (max. sum of columns). This is the natural matrix norm that is compatible to the l1norm for vectors, i.e. \(Mv_1\leq M_1 v_1\). (cf. HaemmerlinHoffmann : Numerische Mathematik)
real_type ChunkSparseMatrix< number >::linfty_norm  (  )  const 
Return the linftynorm of the matrix, that is \(M_infty=max_{all rows i}\sum_{all columns j} M_ij\), (max. sum of rows). This is the natural matrix norm that is compatible to the linftynorm of vectors, i.e. \(Mv_infty \leq M_infty v_infty\). (cf. HaemmerlinHoffmann : Numerische Mathematik)
real_type ChunkSparseMatrix< 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.
void ChunkSparseMatrix< 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
.
void ChunkSparseMatrix< number >::precondition_SSOR  (  Vector< somenumber > &  dst, 
const Vector< somenumber > &  src,  
const number  om = 1. ) const 
Apply SSOR preconditioning to src
.
void ChunkSparseMatrix< number >::precondition_SOR  (  Vector< somenumber > &  dst, 
const Vector< somenumber > &  src,  
const number  om = 1. ) const 
Apply SOR preconditioning matrix to src
.
void ChunkSparseMatrix< number >::precondition_TSOR  (  Vector< somenumber > &  dst, 
const Vector< somenumber > &  src,  
const number  om = 1. ) const 
Apply transpose SOR preconditioning matrix to src
.
void ChunkSparseMatrix< number >::SSOR  (  Vector< somenumber > &  v, 
const number  omega = 1. ) const 
Perform SSOR preconditioning inplace. Apply the preconditioner matrix without copying to a second vector. omega
is the relaxation parameter.
void ChunkSparseMatrix< number >::SOR  (  Vector< somenumber > &  v, 
const number  om = 1. ) const 
Perform an SOR preconditioning inplace. omega
is the relaxation parameter.
void ChunkSparseMatrix< number >::TSOR  (  Vector< somenumber > &  v, 
const number  om = 1. ) const 
Perform a transpose SOR preconditioning inplace. omega
is the relaxation parameter.
void ChunkSparseMatrix< 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 inplace.
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.
void ChunkSparseMatrix< 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 inplace.
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.
void ChunkSparseMatrix< 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
.
void ChunkSparseMatrix< 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
.
void ChunkSparseMatrix< 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.
const_iterator ChunkSparseMatrix< number >::begin  (  )  const 
Iterator starting at first entry of the matrix. This is the version for constant matrices.
Note that due to the layout in ChunkSparseMatrix, iterating over matrix entries is considerably slower than for a sparse matrix, as the iterator is travels rowbyrow, whereas data is stored in chunks of several rows and columns.
const_iterator ChunkSparseMatrix< number >::end  (  )  const 
Final iterator. This is the version for constant matrices.
Note that due to the layout in ChunkSparseMatrix, iterating over matrix entries is considerably slower than for a sparse matrix, as the iterator is travels rowbyrow, whereas data is stored in chunks of several rows and columns.
iterator ChunkSparseMatrix< number >::begin  (  ) 
Iterator starting at the first entry of the matrix. This is the version for nonconstant matrices.
Note that due to the layout in ChunkSparseMatrix, iterating over matrix entries is considerably slower than for a sparse matrix, as the iterator is travels rowbyrow, whereas data is stored in chunks of several rows and columns.
iterator ChunkSparseMatrix< number >::end  (  ) 
Final iterator. This is the version for nonconstant matrices.
Note that due to the layout in ChunkSparseMatrix, iterating over matrix entries is considerably slower than for a sparse matrix, as the iterator is travels rowbyrow, whereas data is stored in chunks of several rows and columns.
const_iterator ChunkSparseMatrix< number >::begin  (  const unsigned int  r  )  const 
Iterator starting at 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 dereferenceable in that case.
Note that due to the layout in ChunkSparseMatrix, iterating over matrix entries is considerably slower than for a sparse matrix, as the iterator is travels rowbyrow, whereas data is stored in chunks of several rows and columns.
const_iterator ChunkSparseMatrix< number >::end  (  const unsigned int  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 dereferenceable. This is in particular the case if it is the end iterator for the last row of a matrix.
Note that due to the layout in ChunkSparseMatrix, iterating over matrix entries is considerably slower than for a sparse matrix, as the iterator is travels rowbyrow, whereas data is stored in chunks of several rows and columns.
iterator ChunkSparseMatrix< number >::begin  (  const unsigned int  r  ) 
Iterator starting at the first entry of row r
. This is the version for nonconstant 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 dereferenceable in that case.
Note that due to the layout in ChunkSparseMatrix, iterating over matrix entries is considerably slower than for a sparse matrix, as the iterator is travels rowbyrow, whereas data is stored in chunks of several rows and columns.
iterator ChunkSparseMatrix< number >::end  (  const unsigned int  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 nonconstant matrices.
Note that the end iterator is not necessarily dereferenceable. This is in particular the case if it is the end iterator for the last row of a matrix.
Note that due to the layout in ChunkSparseMatrix, iterating over matrix entries is considerably slower than for a sparse matrix, as the iterator is travels rowbyrow, whereas data is stored in chunks of several rows and columns.
void ChunkSparseMatrix< number >::print  (  std::ostream &  out  )  const 
Print the matrix to the given stream, using the format (line,col) value
, i.e. one nonzero entry of the matrix per line.
void ChunkSparseMatrix< 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 char *  separator = " " ) 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 in zero_string
, and a character to separate row entries can be set in separator
.
Finally, the whole matrix can be multiplied with a common denominator
to produce more readable output, even integers.
void ChunkSparseMatrix< 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.
void ChunkSparseMatrix< 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 or 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.
void ChunkSparseMatrix< 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 ChunkSparsityPattern 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.

private 
Return the location of entry \((i,j)\) within the val array.

inherited 
Subscribes a user of the object by storing the pointer validity
. The subscriber may be identified by text supplied as identifier
.
Definition at line 135 of file subscriptor.cc.

inherited 
Unsubscribes a user from the object.
identifier
and the validity
pointer must be the same as the one supplied to subscribe(). Definition at line 155 of file subscriptor.cc.

inlineinherited 
Return the present number of subscriptions to this object. This allows to use this class for reference counted lifetime determination where the last one to unsubscribe also deletes the object.
Definition at line 300 of file subscriptor.h.

inlineinherited 
List the subscribers to the input stream
.
Definition at line 317 of file subscriptor.h.

inherited 
List the subscribers to deallog
.
Definition at line 203 of file subscriptor.cc.

inlineinherited 
Read or write the data of this object to or from a stream for the purpose of serialization using the BOOST serialization library.
This function does not actually serialize any of the member variables of this class. The reason is that what this class stores is only who subscribes to this object, but who does so at the time of storing the contents of this object does not necessarily have anything to do with who subscribes to the object when it is restored. Consequently, we do not want to overwrite the subscribers at the time of restoring, and then there is no reason to write the subscribers out in the first place.
Definition at line 309 of file subscriptor.h.

privatenoexceptinherited 
Check that there are no objects subscribing to this object. If this check passes then it is safe to destroy the current object. It this check fails then this function will either abort or print an error message to deallog (by using the AssertNothrow mechanism), but will not throw an exception.
Definition at line 52 of file subscriptor.cc.
Definition at line 1437 of file chunk_sparse_matrix.h.

friend 
Definition at line 1441 of file chunk_sparse_matrix.h.

friend 
Definition at line 1443 of file chunk_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 1410 of file chunk_sparse_matrix.h.

private 
Array of values for all the nonzero entries. The position of an entry within the matrix, i.e., the row and column number for a given value in this array 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 1419 of file chunk_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 sometime in the past by associating a sparsity pattern with a smaller size to this object, using the reinit() function.
Definition at line 1427 of file chunk_sparse_matrix.h.

mutableprivateinherited 
Store the number of objects which subscribed to this object. Initially, this number is zero, and upon destruction it shall be zero again (i.e. all objects which subscribed should have unsubscribed again).
The creator (and owner) of an object is counted in the map below if HE manages to supply identification.
We use the mutable
keyword in order to allow subscription to constant objects also.
This counter may be read from and written to concurrently in multithreaded code: hence we use the std::atomic
class template.
Definition at line 218 of file subscriptor.h.

mutableprivateinherited 
In this map, we count subscriptions for each different identification string supplied to subscribe().
Definition at line 224 of file subscriptor.h.

mutableprivateinherited 
In this vector, we store pointers to the validity bool in the SmartPointer objects that subscribe to this class.
Definition at line 240 of file subscriptor.h.

mutableprivateinherited 
Pointer to the typeinfo object of this object, from which we can later deduce the class name. Since this information on the derived class is neither available in the destructor, nor in the constructor, we obtain it in between and store it here.
Definition at line 248 of file subscriptor.h.

staticprivateinherited 
A mutex used to ensure data consistency when accessing the mutable
members of this class. This lock is used in the subscribe() and unsubscribe() functions, as well as in list_subscribers()
.
Definition at line 271 of file subscriptor.h.