deal.II version GIT relicensing-2206-gaa53ff9447 2024-12-02 09:10:00+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Private Types | Private Member Functions | Private Attributes | Static Private Attributes | Related Symbols | List of all members
SparseLUDecomposition< number > Class Template Referenceabstract

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

Inheritance diagram for SparseLUDecomposition< number >:
Inheritance graph
[legend]

Classes

class  AdditionalData
 

Public Types

using size_type = typename SparseMatrix< number >::size_type
 

Public Member Functions

virtual ~SparseLUDecomposition () override=0
 
virtual void clear () override
 
template<typename somenumber >
void initialize (const SparseMatrix< somenumber > &matrix, const AdditionalData parameters)
 
bool empty () const
 
size_type m () const
 
size_type n () 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
 
virtual std::size_t memory_consumption () const
 
template<class Archive >
void serialize (Archive &ar, const unsigned int version)
 

Static Public Member Functions

static ::ExceptionBaseExcInvalidStrengthening (double arg1)
 
static ::ExceptionBaseExcInUse (int arg1, std::string arg2, std::string arg3)
 
static ::ExceptionBaseExcNoSubscriber (std::string arg1, std::string arg2)
 

Protected Types

using value_type = number
 
using real_type = typename numbers::NumberTraits< number >::real_type
 
using const_iterator = SparseMatrixIterators::Iterator< number, true >
 
using iterator = SparseMatrixIterators::Iterator< number, false >
 

Protected Member Functions

 SparseLUDecomposition ()
 
template<typename somenumber >
void copy_from (const SparseMatrix< somenumber > &matrix)
 
virtual void strengthen_diagonal_impl ()
 
virtual number get_strengthen_diagonal (const number rowsum, const size_type row) const
 
void prebuild_lower_bound ()
 
void prepare_add ()
 
void prepare_set ()
 
template<class Archive >
void serialize (Archive &ar, const unsigned int version)
 
Constructors and initialization
virtual void reinit (const SparsityPattern &sparsity)
 
template<typename number2 >
void reinit (const SparseMatrix< number2 > &sparse_matrix)
 
Information on the matrix
size_type get_row_length (const size_type row) const
 
std::size_t n_nonzero_elements () const
 
std::size_t n_actually_nonzero_elements (const double threshold=0.) const
 
const SparsityPatternget_sparsity_pattern () 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)
 
template<typename somenumber >
void add (const number factor, const SparseMatrix< somenumber > &matrix)
 
SparseMatrixoperator*= (const number factor)
 
SparseMatrixoperator/= (const number factor)
 
void symmetrize ()
 
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)
 
Accessing elements
const number & operator() (const size_type i, const size_type j) const
 
number & operator() (const size_type i, const size_type j)
 
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)
 
Multiplying matrices and vectors
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<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 omega=1.) const
 
template<typename somenumber >
void precondition_TSOR (Vector< somenumber > &dst, const Vector< somenumber > &src, const number omega=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 omega=1.) const
 
template<typename somenumber >
void TSOR (Vector< somenumber > &v, const number omega=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 omega=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 omega=1.) const
 
template<typename somenumber >
void Jacobi_step (Vector< somenumber > &v, const Vector< somenumber > &b, const number omega=1.) const
 
template<typename somenumber >
void SOR_step (Vector< somenumber > &v, const Vector< somenumber > &b, const number omega=1.) const
 
template<typename somenumber >
void TSOR_step (Vector< somenumber > &v, const Vector< somenumber > &b, const number omega=1.) const
 
template<typename somenumber >
void SSOR_step (Vector< somenumber > &v, const Vector< somenumber > &b, const number omega=1.) const
 
Iterators
const_iterator begin () const
 
iterator begin ()
 
const_iterator begin (const size_type r) const
 
iterator begin (const size_type r)
 
const_iterator end () const
 
iterator end ()
 
const_iterator end (const size_type r) const
 
iterator end (const size_type r)
 
Input/Output
template<typename StreamType >
void print (StreamType &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 char *separator=" ") const
 
void print_pattern (std::ostream &out, const double threshold=0.) const
 
void print_as_numpy_arrays (std::ostream &out, const unsigned int precision=9) const
 
void block_write (std::ostream &out) const
 
void block_read (std::istream &in)
 
EnableObserverPointer functionality

Classes derived from EnableObserverPointer provide a facility to subscribe to this object. This is mostly used by the ObserverPointer 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
 
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 Protected Member Functions

static ::ExceptionBaseExcInvalidIndex (int arg1, int arg2)
 
static ::ExceptionBaseExcDifferentSparsityPatterns ()
 
static ::ExceptionBaseExcIteratorRange (int arg1, int arg2)
 
static ::ExceptionBaseExcSourceEqualsDestination ()
 
static ::ExceptionBaseExcInUse (int arg1, std::string arg2, std::string arg3)
 
static ::ExceptionBaseExcNoSubscriber (std::string arg1, std::string arg2)
 

Protected Attributes

double strengthen_diagonal
 
std::vector< const size_type * > prebuilt_lower_bound
 

Private Types

using map_value_type = decltype(counter_map)::value_type
 
using map_iterator = decltype(counter_map)::iterator
 

Private Member Functions

void check_no_subscribers () const noexcept
 

Private Attributes

SparsityPatternown_sparsity
 
ObserverPointer< const SparsityPattern, SparseMatrix< number > > cols
 
std::unique_ptr< number[]> val
 
std::size_t max_len
 
std::atomic< unsigned intcounter
 
std::map< std::string, unsigned intcounter_map
 
std::vector< std::atomic< bool > * > validity_pointers
 
const std::type_info * object_info
 

Static Private Attributes

static std::mutex mutex
 

Related Symbols

(Note that these are not member symbols.)

template<typename Number >
void sum (const SparseMatrix< Number > &local, const MPI_Comm mpi_communicator, SparseMatrix< Number > &global)
 

Detailed Description

template<typename number>
class SparseLUDecomposition< number >

Abstract base class for incomplete decompositions of a sparse matrix into sparse factors. This class can't be used by itself, but only as the base class of derived classes that actually implement particular decompositions such as SparseILU or SparseMIC.

The decomposition is stored as a sparse matrix which is why this class is derived from the SparseMatrix. Since it is not a matrix in the usual sense (the stored entries are not those of a matrix, but of the two factors of the original matrix), the derivation is protected rather than public.

Fill-in

Sparse decompositions are frequently used with additional fill-in, i.e., the sparsity structure of the decomposition is denser than that of the matrix to be decomposed. The initialize() function of this class allows this fill-in via the AdditionalData object as long as all entries present in the original matrix are present in the decomposition also, i.e. the sparsity pattern of the decomposition is a superset of the sparsity pattern in the original matrix.

Such fill-in can be accomplished by various ways, one of which is the copy-constructor of the SparsityPattern class that allows the addition of side-diagonals to a given sparsity structure.

Unified use of preconditioners

While objects of this class can not be used directly (this class is only a base class for others implementing actual decompositions), derived classes such as SparseILU and SparseMIC can be used in the usual form as preconditioners. For example, this works:

somesolver.solve (A, x, f, ilu);
typename SparseLUDecomposition< number >::AdditionalData AdditionalData
Definition sparse_ilu.h:79
void initialize(const SparseMatrix< somenumber > &matrix, const AdditionalData &parameters=AdditionalData())

Through the AdditionalData object it is possible to specify additional parameters of the LU decomposition.

1/ The matrix diagonal can be strengthened by adding strengthen_diagonal times the sum of the absolute row entries of each row to the respective diagonal entries. By default no strengthening is performed.

2/ By default, each initialize() function call creates its own sparsity. For that, it copies the sparsity of matrix and adds a specific number of extra off diagonal entries specified by extra_off_diagonals.

3/ By setting use_previous_sparsity=true the sparsity is not recreated but the sparsity of the previous initialize() call is reused (recycled). This might be useful when several linear problems on the same sparsity need to solved, as for example several Newton iteration steps on the same triangulation. The default is false.

4/ It is possible to give a user defined sparsity to use_this_sparsity. Then, no sparsity is created but *use_this_sparsity is used to store the decomposed matrix. For restrictions on the sparsity see section ‘Fill-in’ above).

Particular implementations

It is enough to override the initialize() and vmult() methods to implement particular LU decompositions, like the true LU, or the Cholesky decomposition. Additionally, if that decomposition needs fine tuned diagonal strengthening on a per row basis, it may override the get_strengthen_diagonal() method.

Definition at line 106 of file sparse_decomposition.h.

Member Typedef Documentation

◆ size_type

template<typename number >
using SparseLUDecomposition< number >::size_type = typename SparseMatrix<number>::size_type

Declare type for container size.

Definition at line 122 of file sparse_decomposition.h.

◆ value_type

template<typename number >
using SparseMatrix< number >::value_type = number
inherited

Type of the matrix entries. This alias is analogous to value_type in the standard library containers.

Definition at line 531 of file sparse_matrix.h.

◆ real_type

template<typename number >
using SparseMatrix< number >::real_type = typename numbers::NumberTraits<number>::real_type
inherited

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 alias is used to represent the return type of norms.

Definition at line 542 of file sparse_matrix.h.

◆ const_iterator

template<typename number >
using SparseMatrix< number >::const_iterator = SparseMatrixIterators::Iterator<number, true>
inherited

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 548 of file sparse_matrix.h.

◆ iterator

template<typename number >
using SparseMatrix< number >::iterator = SparseMatrixIterators::Iterator<number, false>
inherited

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 556 of file sparse_matrix.h.

◆ map_value_type

The data type used in counter_map.

Definition at line 238 of file enable_observer_pointer.h.

◆ map_iterator

using EnableObserverPointer::map_iterator = decltype(counter_map)::iterator
privateinherited

The iterator type used in counter_map.

Definition at line 243 of file enable_observer_pointer.h.

Constructor & Destructor Documentation

◆ SparseLUDecomposition()

template<typename number >
SparseLUDecomposition< number >::SparseLUDecomposition ( )
protected

Constructor. Does nothing.

Call the initialize() function before using this object as preconditioner (vmult()).

◆ ~SparseLUDecomposition()

template<typename number >
virtual SparseLUDecomposition< number >::~SparseLUDecomposition ( )
overridepure virtual

Destruction. Mark the destructor pure to ensure that this class isn't used directly, but only its derived classes.

Member Function Documentation

◆ clear()

template<typename number >
virtual void SparseLUDecomposition< number >::clear ( )
overridevirtual

Deletes all member variables. Leaves the class in the state that it had directly after calling the constructor

Reimplemented from SparseMatrix< number >.

Reimplemented in SparseMIC< number >.

◆ initialize()

template<typename number >
template<typename somenumber >
template void SparseLUDecomposition< number >::initialize< float > ( const SparseMatrix< somenumber > &  matrix,
const AdditionalData  parameters 
)

This function needs to be called before an object of this class is used as preconditioner.

For more detail about possible parameters, see the class documentation and the documentation of the SparseLUDecomposition::AdditionalData class.

According to the parameters, this function creates a new SparsityPattern or keeps the previous sparsity or takes the sparsity given by the user to data. Then, this function performs the LU decomposition.

After this function is called the preconditioner is ready to be used (using the vmult function of derived classes).

◆ empty()

template<typename number >
bool SparseLUDecomposition< number >::empty ( ) const

Return whether the object is empty. It calls the inherited SparseMatrix::empty() function.

◆ m()

template<typename number >
size_type SparseLUDecomposition< number >::m ( ) const

Return the dimension of the codomain (or range) space. It calls the inherited SparseMatrix::m() function. Note that the matrix is of dimension \(m \times n\).

◆ n()

template<typename number >
size_type SparseLUDecomposition< number >::n ( ) const

Return the dimension of the domain space. It calls the inherited SparseMatrix::n() function. Note that the matrix is of dimension \(m \times n\).

◆ vmult_add()

template<typename number >
template<class OutVector , class InVector >
void SparseLUDecomposition< number >::vmult_add ( OutVector &  dst,
const InVector &  src 
) const

Adding Matrix-vector multiplication. Add M*src on dst with M being this matrix.

Source and destination must not be the same vector.

◆ Tvmult_add()

template<typename number >
template<class OutVector , class InVector >
void SparseLUDecomposition< 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.

Source and destination must not be the same vector.

◆ memory_consumption()

template<typename number >
virtual std::size_t SparseLUDecomposition< number >::memory_consumption ( ) const
virtual

Determine an estimate for the memory consumption (in bytes) of this object.

Reimplemented in SparseILU< number >, and SparseMIC< number >.

◆ copy_from() [1/4]

template<typename number >
template<typename somenumber >
template void SparseLUDecomposition< number >::copy_from< float > ( const SparseMatrix< somenumber > &  matrix)
protected

Copies the passed SparseMatrix onto this object. This object's sparsity pattern remains unchanged.

◆ strengthen_diagonal_impl()

template<typename number >
virtual void SparseLUDecomposition< number >::strengthen_diagonal_impl ( )
protectedvirtual

Performs the strengthening loop. For each row calculates the sum of absolute values of its elements, determines the strengthening factor (through get_strengthen_diagonal()) sf and multiplies the diagonal entry with sf+1.

◆ get_strengthen_diagonal()

template<typename number >
virtual number SparseLUDecomposition< number >::get_strengthen_diagonal ( const number  rowsum,
const size_type  row 
) const
protectedvirtual

In the decomposition phase, computes a strengthening factor for the diagonal entry in row row with sum of absolute values of its elements rowsum.

Note
The default implementation in SparseLUDecomposition returns strengthen_diagonal's value. This variable is set to a nonzero value in several of the derived classes.

◆ prebuild_lower_bound()

template<typename number >
void SparseLUDecomposition< number >::prebuild_lower_bound ( )
protected

Fills the prebuilt_lower_bound array.

◆ reinit() [1/2]

template<typename number >
virtual void SparseMatrix< number >::reinit ( const SparsityPattern sparsity)
virtualinherited

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.

◆ reinit() [2/2]

template<typename number >
template<typename number2 >
void SparseMatrix< number >::reinit ( const SparseMatrix< number2 > &  sparse_matrix)
inherited

Reinitialize the sparse matrix with the sparsity pattern of the given sparse_matrix. See also comments of the function above.

Note
The elements of the matrix are set to zero by this function.

◆ get_row_length()

template<typename number >
size_type SparseMatrix< number >::get_row_length ( const size_type  row) const
inherited

Return the number of entries in a specific row.

◆ n_nonzero_elements()

template<typename number >
std::size_t SparseMatrix< number >::n_nonzero_elements ( ) const
inherited

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.

◆ n_actually_nonzero_elements()

template<typename number >
std::size_t SparseMatrix< number >::n_actually_nonzero_elements ( const double  threshold = 0.) const
inherited

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).

◆ get_sparsity_pattern()

template<typename number >
const SparsityPattern & SparseMatrix< number >::get_sparsity_pattern ( ) const
inherited

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.

◆ compress()

template<typename number >
void SparseMatrix< number >::compress ( VectorOperation::values  )
inherited

Dummy function for compatibility with distributed, parallel matrices.

◆ set() [1/5]

template<typename number >
void SparseMatrix< number >::set ( const size_type  i,
const size_type  j,
const number  value 
)
inherited

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.

◆ set() [2/5]

template<typename number >
template<typename number2 >
void SparseMatrix< number >::set ( const std::vector< size_type > &  indices,
const FullMatrix< number2 > &  full_matrix,
const bool  elide_zero_values = false 
)
inherited

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.

◆ set() [3/5]

template<typename number >
template<typename number2 >
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 
)
inherited

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.

◆ set() [4/5]

template<typename number >
template<typename number2 >
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 
)
inherited

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.

◆ set() [5/5]

template<typename number >
template<typename number2 >
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 
)
inherited

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.

◆ add() [1/6]

template<typename number >
void SparseMatrix< number >::add ( const size_type  i,
const size_type  j,
const number  value 
)
inherited

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.

◆ add() [2/6]

template<typename number >
template<typename number2 >
void SparseMatrix< number >::add ( const std::vector< size_type > &  indices,
const FullMatrix< number2 > &  full_matrix,
const bool  elide_zero_values = true 
)
inherited

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.

◆ add() [3/6]

template<typename number >
template<typename number2 >
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 
)
inherited

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.

◆ add() [4/6]

template<typename number >
template<typename number2 >
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 
)
inherited

Add the provided values to several elements in the specified row of the matrix with column indices as given by col_indices.

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.

◆ add() [5/6]

template<typename number >
template<typename number2 >
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 
)
inherited

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.

◆ add() [6/6]

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::add ( const number  factor,
const SparseMatrix< somenumber > &  matrix 
)
inherited

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.

◆ operator*=()

template<typename number >
SparseMatrix & SparseMatrix< number >::operator*= ( const number  factor)
inherited

Multiply the entire matrix by a fixed factor.

◆ operator/=()

template<typename number >
SparseMatrix & SparseMatrix< number >::operator/= ( const number  factor)
inherited

Divide the entire matrix by a fixed factor.

◆ symmetrize()

template<typename number >
void SparseMatrix< number >::symmetrize ( )
inherited

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 SparsityPattern::symmetrize().

◆ copy_from() [2/4]

template<typename number >
template<typename ForwardIterator >
void SparseMatrix< number >::copy_from ( const ForwardIterator  begin,
const ForwardIterator  end 
)
inherited

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.

◆ copy_from() [3/4]

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::copy_from ( const FullMatrix< somenumber > &  matrix)
inherited

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. This can be achieved using that version of SparsityPattern::copy_from() that takes a FullMatrix as argument.

◆ copy_from() [4/4]

template<typename number >
SparseMatrix< number > & SparseMatrix< number >::copy_from ( const TrilinosWrappers::SparseMatrix< number > &  matrix)
inherited

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.

◆ operator()() [1/2]

template<typename number >
const number & SparseMatrix< number >::operator() ( const size_type  i,
const size_type  j 
) const
inherited

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.

◆ operator()() [2/2]

template<typename number >
number & SparseMatrix< number >::operator() ( const size_type  i,
const size_type  j 
)
inherited

In contrast to the one above, this function allows modifying the object.

◆ el()

template<typename number >
number SparseMatrix< number >::el ( const size_type  i,
const size_type  j 
) const
inherited

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.

◆ diag_element() [1/2]

template<typename number >
number SparseMatrix< number >::diag_element ( const size_type  i) const
inherited

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.

◆ diag_element() [2/2]

template<typename number >
number & SparseMatrix< number >::diag_element ( const size_type  i)
inherited

Same as above, but return a writeable reference. You're sure you know what you do?

◆ vmult()

template<typename number >
template<class OutVector , class InVector >
void SparseMatrix< number >::vmult ( OutVector &  dst,
const InVector &  src 
) const
inherited

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.

Note
If deal.II is configured with threads, this operation will run multi-threaded by splitting the work into smaller chunks (assuming there is enough work to make this worthwhile).

◆ Tvmult()

template<typename number >
template<class OutVector , class InVector >
void SparseMatrix< number >::Tvmult ( OutVector &  dst,
const InVector &  src 
) const
inherited

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.

◆ matrix_norm_square()

template<typename number >
template<typename somenumber >
somenumber SparseMatrix< number >::matrix_norm_square ( const Vector< somenumber > &  v) const
inherited

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 complex-valued, but not mixed, for this function to make sense.

Note
If deal.II is configured with threads, this operation will run multi-threaded by splitting the work into smaller chunks (assuming there is enough work to make this worthwhile).

◆ matrix_scalar_product()

template<typename number >
template<typename somenumber >
somenumber SparseMatrix< number >::matrix_scalar_product ( const Vector< somenumber > &  u,
const Vector< somenumber > &  v 
) const
inherited

Compute the matrix scalar product \(\left(u,Mv\right)\).

Note
If deal.II is configured with threads, this operation will run multi-threaded by splitting the work into smaller chunks (assuming there is enough work to make this worthwhile).

◆ residual()

template<typename number >
template<typename somenumber >
somenumber SparseMatrix< number >::residual ( Vector< somenumber > &  dst,
const Vector< somenumber > &  x,
const Vector< somenumber > &  b 
) const
inherited

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.

Note
If deal.II is configured with threads, this operation will run multi-threaded by splitting the work into smaller chunks (assuming there is enough work to make this worthwhile).

◆ mmult()

template<typename number >
template<typename numberB , typename numberC >
void SparseMatrix< number >::mmult ( SparseMatrix< numberC > &  C,
const SparseMatrix< numberB > &  B,
const Vector< number > &  V = Vector< number >(),
const bool  rebuild_sparsity_pattern = true 
) const
inherited

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 the argument B have compatible sizes. By default, the output matrix C will be resized appropriately.

By default, i.e., if the optional argument rebuild_sparsity_pattern is true, the sparsity pattern of the matrix C will be changed to ensure that all entries that result from the product \(AB\) can be stored in \(C\). This is an expensive operation, and if there is a way to predict the sparsity pattern up front, you should probably build it yourself before calling this function with false as last argument. In this case, the rebuilding of the sparsity pattern is bypassed.

When setting rebuild_sparsity_pattern to true (i.e., leaving it at the default value), it is important to realize that the matrix C passed as first argument still has to be initialized with a sparsity pattern (either at the time of creation of the SparseMatrix object, or via the SparseMatrix::reinit() function). This is because we could create a sparsity pattern inside the current function, and then associate C with it, but there would be no way to transfer ownership of this sparsity pattern to anyone once the current function finishes. Consequently, the function requires that C be already associated with a sparsity pattern object, and this object is then reset to fit the product of A and B.

As a consequence of this, however, it is also important to realize that the sparsity pattern of C is modified and that this would render invalid all other SparseMatrix objects that happen to also use that sparsity pattern object.

◆ Tmmult()

template<typename number >
template<typename numberB , typename numberC >
void SparseMatrix< number >::Tmmult ( SparseMatrix< numberC > &  C,
const SparseMatrix< numberB > &  B,
const Vector< number > &  V = Vector< number >(),
const bool  rebuild_sparsity_pattern = true 
) const
inherited

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.

Note
Rebuilding the sparsity pattern requires changing it. This means that all other matrices that are associated with this sparsity pattern will then have invalid entries.

◆ l1_norm()

template<typename number >
real_type SparseMatrix< number >::l1_norm ( ) const
inherited

Return the \(l_1\)-norm of the matrix, that is \(|M|_1=\max_{\mathrm{all\ columns\ }j}\sum_{\mathrm{all\ rows\ } i} |M_{ij}|\), (max. sum of columns). This is the natural matrix norm that is compatible to the \(l_1\)-norm for vectors, i.e. \(|Mv|_1\leq |M|_1 |v|_1\). (cf. Haemmerlin-Hoffmann: Numerische Mathematik)

◆ linfty_norm()

template<typename number >
real_type SparseMatrix< number >::linfty_norm ( ) const
inherited

Return the \(l_\infty\)-norm of the matrix, that is \(|M|_\infty=\max_{\mathrm{all\ rows\ }i}\sum_{\mathrm{all\ columns\ }j} |M_{ij}|\), (max. sum of rows). This is the natural matrix norm that is compatible to the \(l_\infty\)-norm of vectors, i.e. \(|Mv|_\infty \leq |M|_\infty |v|_\infty\). (cf. Haemmerlin-Hoffmann: Numerische Mathematik)

◆ frobenius_norm()

template<typename number >
real_type SparseMatrix< number >::frobenius_norm ( ) const
inherited

Return the frobenius norm of the matrix, i.e. the square root of the sum of squares of all entries in the matrix.

◆ precondition_Jacobi()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::precondition_Jacobi ( Vector< somenumber > &  dst,
const Vector< somenumber > &  src,
const number  omega = 1. 
) const
inherited

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.

◆ precondition_SSOR()

template<typename number >
template<typename somenumber >
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
inherited

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.

◆ precondition_SOR()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::precondition_SOR ( Vector< somenumber > &  dst,
const Vector< somenumber > &  src,
const number  omega = 1. 
) const
inherited

Apply SOR preconditioning matrix to src.

◆ precondition_TSOR()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::precondition_TSOR ( Vector< somenumber > &  dst,
const Vector< somenumber > &  src,
const number  omega = 1. 
) const
inherited

Apply transpose SOR preconditioning matrix to src.

◆ SSOR()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::SSOR ( Vector< somenumber > &  v,
const number  omega = 1. 
) const
inherited

Perform SSOR preconditioning in-place. Apply the preconditioner matrix without copying to a second vector. omega is the relaxation parameter.

◆ SOR()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::SOR ( Vector< somenumber > &  v,
const number  omega = 1. 
) const
inherited

Perform an SOR preconditioning in-place. omega is the relaxation parameter.

◆ TSOR()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::TSOR ( Vector< somenumber > &  v,
const number  omega = 1. 
) const
inherited

Perform a transpose SOR preconditioning in-place. omega is the relaxation parameter.

◆ PSOR()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::PSOR ( Vector< somenumber > &  v,
const std::vector< size_type > &  permutation,
const std::vector< size_type > &  inverse_permutation,
const number  omega = 1. 
) const
inherited

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.

◆ TPSOR()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::TPSOR ( Vector< somenumber > &  v,
const std::vector< size_type > &  permutation,
const std::vector< size_type > &  inverse_permutation,
const number  omega = 1. 
) const
inherited

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.

◆ Jacobi_step()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::Jacobi_step ( Vector< somenumber > &  v,
const Vector< somenumber > &  b,
const number  omega = 1. 
) const
inherited

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.

◆ SOR_step()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::SOR_step ( Vector< somenumber > &  v,
const Vector< somenumber > &  b,
const number  omega = 1. 
) const
inherited

Do one SOR step on v. Performs a direct SOR step with right hand side b.

◆ TSOR_step()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::TSOR_step ( Vector< somenumber > &  v,
const Vector< somenumber > &  b,
const number  omega = 1. 
) const
inherited

Do one adjoint SOR step on v. Performs a direct TSOR step with right hand side b.

◆ SSOR_step()

template<typename number >
template<typename somenumber >
void SparseMatrix< number >::SSOR_step ( Vector< somenumber > &  v,
const Vector< somenumber > &  b,
const number  omega = 1. 
) const
inherited

Do one SSOR step on v. Performs a direct SSOR step with right hand side b by performing TSOR after SOR.

◆ begin() [1/4]

template<typename number >
const_iterator SparseMatrix< number >::begin ( ) const
inherited

Return an iterator pointing to the first element of the matrix.

Note the discussion in the general documentation of this class about the order in which elements are accessed.

◆ begin() [2/4]

template<typename number >
iterator SparseMatrix< number >::begin ( )
inherited

Like the function above, but for non-const matrices.

◆ begin() [3/4]

template<typename number >
const_iterator SparseMatrix< number >::begin ( const size_type  r) const
inherited

Return an iterator pointing to the first element of row r.

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). The returned iterator may not be dereferenceable in that case if neither row r nor any of the following rows contain any nonzero entries.

◆ begin() [4/4]

template<typename number >
iterator SparseMatrix< number >::begin ( const size_type  r)
inherited

Like the function above, but for non-const matrices.

◆ end() [1/4]

template<typename number >
const_iterator SparseMatrix< number >::end ( ) const
inherited

Return an iterator pointing the element past the last one of this matrix.

◆ end() [2/4]

template<typename number >
iterator SparseMatrix< number >::end ( )
inherited

Like the function above, but for non-const matrices.

◆ end() [3/4]

template<typename number >
const_iterator SparseMatrix< number >::end ( const size_type  r) const
inherited

Return an iterator pointing the element past the last one of row r , or past the end of the entire sparsity pattern if none of the rows after r contain any entries at all.

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.

◆ end() [4/4]

template<typename number >
iterator SparseMatrix< number >::end ( const size_type  r)
inherited

Like the function above, but for non-const matrices.

◆ print()

template<typename number >
template<typename StreamType >
void SparseMatrix< number >::print ( StreamType &  out,
const bool  across = false,
const bool  diagonal_first = true 
) const
inherited

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.

◆ print_formatted()

template<typename number >
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 char *  separator = " " 
) const
inherited

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.

Attention
This function may produce large amounts of output if applied to a large matrix!

◆ print_pattern()

template<typename number >
void SparseMatrix< number >::print_pattern ( std::ostream &  out,
const double  threshold = 0. 
) const
inherited

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.

◆ print_as_numpy_arrays()

template<typename number >
void SparseMatrix< number >::print_as_numpy_arrays ( std::ostream &  out,
const unsigned int  precision = 9 
) const
inherited

Print the matrix to the output stream out in a format that can be read by numpy::readtxt(). To load the matrix in python just do [data, row, column] = numpy.loadtxt('my_matrix.txt') sparse_matrix = scipy.sparse.csr_matrix((data, (row, column)))

◆ block_write()

template<typename number >
void SparseMatrix< number >::block_write ( std::ostream &  out) const
inherited

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.

◆ block_read()

template<typename number >
void SparseMatrix< number >::block_read ( std::istream &  in)
inherited

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.

◆ prepare_add()

template<typename number >
void SparseMatrix< number >::prepare_add ( )
protectedinherited

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.

◆ prepare_set()

template<typename number >
void SparseMatrix< number >::prepare_set ( )
protectedinherited

Same as prepare_add() but prepare the matrix for setting elements if the representation of elements in this class requires such an operation.

◆ subscribe() [1/2]

void EnableObserverPointer::subscribe ( std::atomic< bool > *const  validity,
const std::string &  identifier = "" 
) const
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 131 of file enable_observer_pointer.cc.

◆ unsubscribe() [1/2]

void EnableObserverPointer::unsubscribe ( std::atomic< bool > *const  validity,
const std::string &  identifier = "" 
) const
inherited

Unsubscribes a user from the object.

Note
The identifier and the validity pointer must be the same as the one supplied to subscribe().

Definition at line 151 of file enable_observer_pointer.cc.

◆ n_subscriptions() [1/2]

unsigned int EnableObserverPointer::n_subscriptions ( ) const
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 322 of file enable_observer_pointer.h.

◆ list_subscribers() [1/4]

template<typename StreamType >
void EnableObserverPointer::list_subscribers ( StreamType &  stream) const
inlineinherited

List the subscribers to the input stream.

Definition at line 339 of file enable_observer_pointer.h.

◆ list_subscribers() [2/4]

void EnableObserverPointer::list_subscribers ( ) const
inherited

List the subscribers to deallog.

Definition at line 199 of file enable_observer_pointer.cc.

◆ serialize() [1/2]

template<class Archive >
void EnableObserverPointer::serialize ( Archive &  ar,
const unsigned int  version 
)
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 331 of file enable_observer_pointer.h.

◆ check_no_subscribers()

void EnableObserverPointer::check_no_subscribers ( ) const
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.

Note
Since this function is just a consistency check it does nothing in release mode.
If this function is called when there is an uncaught exception then, rather than aborting, this function prints an error message to the standard error stream and returns.

Definition at line 53 of file enable_observer_pointer.cc.

◆ subscribe() [2/2]

void EnableObserverPointer::subscribe ( std::atomic< bool > *const  validity,
const std::string &  identifier = "" 
) const
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 131 of file enable_observer_pointer.cc.

◆ unsubscribe() [2/2]

void EnableObserverPointer::unsubscribe ( std::atomic< bool > *const  validity,
const std::string &  identifier = "" 
) const
inherited

Unsubscribes a user from the object.

Note
The identifier and the validity pointer must be the same as the one supplied to subscribe().

Definition at line 151 of file enable_observer_pointer.cc.

◆ n_subscriptions() [2/2]

unsigned int EnableObserverPointer::n_subscriptions ( ) const
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 322 of file enable_observer_pointer.h.

◆ list_subscribers() [3/4]

template<typename StreamType >
void EnableObserverPointer::list_subscribers ( StreamType &  stream) const
inlineinherited

List the subscribers to the input stream.

Definition at line 339 of file enable_observer_pointer.h.

◆ list_subscribers() [4/4]

void EnableObserverPointer::list_subscribers ( ) const
inherited

List the subscribers to deallog.

Definition at line 199 of file enable_observer_pointer.cc.

◆ serialize() [2/2]

template<class Archive >
void EnableObserverPointer::serialize ( Archive &  ar,
const unsigned int  version 
)
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 331 of file enable_observer_pointer.h.

Friends And Related Symbol Documentation

◆ sum()

template<typename Number >
void sum ( const SparseMatrix< Number > &  local,
const MPI_Comm  mpi_communicator,
SparseMatrix< Number > &  global 
)
related

Perform an MPI sum of the entries of a SparseMatrix.

Note
local and global should have the same sparsity pattern and it should be the same for all MPI processes.

Member Data Documentation

◆ strengthen_diagonal

template<typename number >
double SparseLUDecomposition< number >::strengthen_diagonal
protected

The default strengthening value, returned by get_strengthen_diagonal().

Definition at line 311 of file sparse_decomposition.h.

◆ prebuilt_lower_bound

template<typename number >
std::vector<const size_type *> SparseLUDecomposition< number >::prebuilt_lower_bound
protected

For every row in the underlying SparsityPattern, this array contains a pointer to the row's first afterdiagonal entry. Becomes available after invocation of prebuild_lower_bound().

Definition at line 318 of file sparse_decomposition.h.

◆ own_sparsity

template<typename number >
SparsityPattern* SparseLUDecomposition< number >::own_sparsity
private

In general this pointer is zero except for the case that no SparsityPattern is given to this class. Then, a SparsityPattern is created and is passed down to the SparseMatrix base class.

Nevertheless, the SparseLUDecomposition needs to keep ownership of this sparsity. It keeps this pointer to it enabling it to delete this sparsity at destruction time.

Definition at line 336 of file sparse_decomposition.h.

◆ cols

template<typename number >
ObserverPointer<const SparsityPattern, SparseMatrix<number> > SparseMatrix< number >::cols
privateinherited

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 ObserverPointer class.

Definition at line 1747 of file sparse_matrix.h.

◆ val

template<typename number >
std::unique_ptr<number[]> SparseMatrix< number >::val
privateinherited

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 1756 of file sparse_matrix.h.

◆ max_len

template<typename number >
std::size_t SparseMatrix< number >::max_len
privateinherited

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 1764 of file sparse_matrix.h.

◆ counter

std::atomic<unsigned int> EnableObserverPointer::counter
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 227 of file enable_observer_pointer.h.

◆ counter_map

std::map<std::string, unsigned int> EnableObserverPointer::counter_map
mutableprivateinherited

In this map, we count subscriptions for each different identification string supplied to subscribe().

Definition at line 233 of file enable_observer_pointer.h.

◆ validity_pointers

std::vector<std::atomic<bool> *> EnableObserverPointer::validity_pointers
mutableprivateinherited

In this vector, we store pointers to the validity bool in the ObserverPointer objects that subscribe to this class.

Definition at line 249 of file enable_observer_pointer.h.

◆ object_info

const std::type_info* EnableObserverPointer::object_info
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 257 of file enable_observer_pointer.h.

◆ mutex

std::mutex EnableObserverPointer::mutex
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 280 of file enable_observer_pointer.h.


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