Reference documentation for deal.II version 8.1.0
Public Types | Public Member Functions | Private Attributes | List of all members
LAPACKFullMatrix< number > Class Template Reference

#include <lapack_full_matrix.h>

Inheritance diagram for LAPACKFullMatrix< number >:
[legend]

Public Types

typedef types::global_dof_index size_type
 

Public Member Functions

 LAPACKFullMatrix (const size_type n=0)
 
 LAPACKFullMatrix (const size_type rows, const size_type cols)
 
 LAPACKFullMatrix (const LAPACKFullMatrix &)
 
LAPACKFullMatrix< number > & operator= (const LAPACKFullMatrix< number > &)
 
template<typename number2 >
LAPACKFullMatrix< number > & operator= (const FullMatrix< number2 > &)
 
LAPACKFullMatrix< number > & operator= (const double d)
 
template<class MATRIX >
void copy_from (const MATRIX &)
 
template<class MATRIX >
void fill (const MATRIX &src, const size_type dst_offset_i=0, const size_type dst_offset_j=0, const size_type src_offset_i=0, const size_type src_offset_j=0, const number factor=1., const bool transpose=false)
 
template<class VECTOR >
void vmult (VECTOR &dst, const VECTOR &src, const bool adding=false) const
 
template<class VECTOR >
void vmult_add (VECTOR &w, const VECTOR &v) const
 
template<class VECTOR >
void Tvmult (VECTOR &w, const VECTOR &v, const bool adding=false) const
 
template<class VECTOR >
void Tvmult_add (VECTOR &w, const VECTOR &v) const
 
void vmult (Vector< number > &w, const Vector< number > &v, const bool adding=false) const
 
void vmult_add (Vector< number > &w, const Vector< number > &v) const
 
void Tvmult (Vector< number > &w, const Vector< number > &v, const bool adding=false) const
 
void Tvmult_add (Vector< number > &w, const Vector< number > &v) const
 
void compute_lu_factorization ()
 
void invert ()
 
void apply_lu_factorization (Vector< number > &v, const bool transposed) const
 
void compute_eigenvalues (const bool right_eigenvectors=false, const bool left_eigenvectors=false)
 
void compute_eigenvalues_symmetric (const number lower_bound, const number upper_bound, const number abs_accuracy, Vector< number > &eigenvalues, FullMatrix< number > &eigenvectors)
 
void compute_generalized_eigenvalues_symmetric (LAPACKFullMatrix< number > &B, const number lower_bound, const number upper_bound, const number abs_accuracy, Vector< number > &eigenvalues, std::vector< Vector< number > > &eigenvectors, const int itype=1)
 
void compute_generalized_eigenvalues_symmetric (LAPACKFullMatrix< number > &B, std::vector< Vector< number > > &eigenvectors, const int itype=1)
 
void compute_svd ()
 
void compute_inverse_svd (const double threshold=0.)
 
std::complex< number > eigenvalue (const size_type i) const
 
number singular_value (const size_type i) const
 
void print_formatted (std::ostream &out, const unsigned int presicion=3, const bool scientific=true, const unsigned int width=0, const char *zero_string=" ", const double denominator=1., const double threshold=0.) const
 
- Public Member Functions inherited from TransposeTable< number >
 TransposeTable ()
 
 TransposeTable (const unsigned int size1, const unsigned int size2)
 
void reinit (const unsigned int size1, const unsigned int size2, const bool fast=false)
 
std::vector< number >::const_reference operator() (const unsigned int i, const unsigned int j) const
 
std::vector< number >::reference operator() (const unsigned int i, const unsigned int j)
 
unsigned int n_rows () const
 
unsigned int n_cols () const
 
- Public Member Functions inherited from TableBase< 2, number >
 TableBase ()
 
 TableBase (const TableIndices< N > &sizes)
 
 TableBase (const TableBase< N, number > &src)
 
 TableBase (const TableBase< N, T2 > &src)
 
 ~TableBase ()
 
TableBase< N, number > & operator= (const TableBase< N, number > &src)
 
TableBase< N, number > & operator= (const TableBase< N, T2 > &src)
 
bool operator== (const TableBase< N, number > &T2) const
 
void reset_values ()
 
void reinit (const TableIndices< N > &new_size, const bool fast=false)
 
unsigned int size (const unsigned int i) const
 
const TableIndices< N > & size () const
 
unsigned int n_elements () const
 
bool empty () const
 
void fill (const T2 *entries)
 
void fill (const number &value)
 
std::vector< number >::reference operator() (const TableIndices< N > &indices)
 
std::vector< number >::const_reference operator() (const TableIndices< N > &indices) const
 
void swap (TableBase< N, number > &v)
 
std::size_t memory_consumption () const
 
void serialize (Archive &ar, const unsigned int version)
 
- Public Member Functions inherited from Subscriptor
 Subscriptor ()
 
 Subscriptor (const Subscriptor &)
 
virtual ~Subscriptor ()
 
Subscriptoroperator= (const Subscriptor &)
 
void subscribe (const char *identifier=0) const
 
void unsubscribe (const char *identifier=0) const
 
unsigned int n_subscriptions () const
 
void list_subscribers () const
 
 DeclException3 (ExcInUse, int, char *, std::string &,<< "Object of class "<< arg2<< " is still used by "<< arg1<< " other objects.\n"<< "(Additional information: "<< arg3<< ")\n"<< "Note the entry in the Frequently Asked Questions of "<< "deal.II (linked to from http://www.dealii.org/) for "<< "more information on what this error means.")
 
 DeclException2 (ExcNoSubscriber, char *, char *,<< "No subscriber with identifier \""<< arg2<< "\" did subscribe to this object of class "<< arg1)
 
template<class Archive >
void serialize (Archive &ar, const unsigned int version)
 

Private Attributes

LAPACKSupport::State state
 
LAPACKSupport::Properties properties
 
std::vector< number > work
 
std::vector< intipiv
 
std::vector< number > inv_work
 
std::vector< number > wr
 
std::vector< number > wi
 
std::vector< number > vl
 
std::vector< number > vr
 
std_cxx1x::shared_ptr< LAPACKFullMatrix< number > > svd_u
 
std_cxx1x::shared_ptr< LAPACKFullMatrix< number > > svd_vt
 

Additional Inherited Members

- Protected Member Functions inherited from TransposeTable< number >
std::vector< number >::reference el (const unsigned int i, const unsigned int j)
 
std::vector< number >::const_reference el (const unsigned int i, const unsigned int j) const
 
- Protected Member Functions inherited from TableBase< 2, number >
unsigned int position (const TableIndices< N > &indices) const
 
std::vector< number >::reference el (const TableIndices< N > &indices)
 
std::vector< number >::const_reference el (const TableIndices< N > &indices) const
 
std::vector< number >::const_pointer data () const DEAL_II_DEPRECATED
 
- Protected Attributes inherited from TableBase< 2, number >
std::vector< number > values
 
TableIndices< N > table_size
 

Detailed Description

template<typename number>
class LAPACKFullMatrix< number >

A variant of FullMatrix using LAPACK functions wherever possible. In order to do this, the matrix is stored in transposed order. The element access functions hide this fact by reverting the transposition.

Note
In order to perform LAPACK functions, the class contains a lot of auxiliary data in the private section. The names of these data vectors are usually the names chosen for the arguments in the LAPACK documentation.
Author
Guido Kanschat, 2005

Definition at line 37 of file full_matrix.h.

Member Typedef Documentation

template<typename number>
typedef types::global_dof_index LAPACKFullMatrix< number >::size_type

Declare type for container size.

Definition at line 60 of file lapack_full_matrix.h.

Constructor & Destructor Documentation

template<typename number>
LAPACKFullMatrix< number >::LAPACKFullMatrix ( const size_type  n = 0)
explicit

Constructor. Initialize the matrix as a square matrix with dimension n.

In order to avoid the implicit conversion of integers and other types to a matrix, this constructor is declared explicit.

By default, no memory is allocated.

template<typename number>
LAPACKFullMatrix< number >::LAPACKFullMatrix ( const size_type  rows,
const size_type  cols 
)

Constructor. Initialize the matrix as a rectangular matrix.

template<typename number>
LAPACKFullMatrix< number >::LAPACKFullMatrix ( const LAPACKFullMatrix< number > &  )

Copy constructor. This constructor does a deep copy of the matrix. Therefore, it poses a possible efficiency problem, if for example, function arguments are passed by value rather than by reference. Unfortunately, we can't mark this copy constructor explicit, since that prevents the use of this class in containers, such as std::vector. The responsibility to check performance of programs must therefore remain with the user of this class.

Member Function Documentation

template<typename number>
LAPACKFullMatrix<number>& LAPACKFullMatrix< number >::operator= ( const LAPACKFullMatrix< number > &  )

Assignment operator.

template<typename number>
template<typename number2 >
LAPACKFullMatrix<number>& LAPACKFullMatrix< number >::operator= ( const FullMatrix< number2 > &  )

Assignment operator for a regular FullMatrix. Note that since LAPACK expects matrices in transposed order, this transposition is included here.

template<typename number>
LAPACKFullMatrix<number>& LAPACKFullMatrix< number >::operator= ( const double  d)

This operator assigns a scalar to a matrix. To avoid confusion with constructors, zero is the only value allowed for d

template<typename number >
template<class MATRIX >
void LAPACKFullMatrix< number >::copy_from ( const MATRIX M)
inline

Assignment from different matrix classes, performing the usual conversion to the transposed format expected by LAPACK. This assignment operator uses iterators of the class MATRIX. Therefore, sparse matrices are possible sources.

Definition at line 715 of file lapack_full_matrix.h.

template<typename number>
template<class MATRIX >
void LAPACKFullMatrix< number >::fill ( const MATRIX src,
const size_type  dst_offset_i = 0,
const size_type  dst_offset_j = 0,
const size_type  src_offset_i = 0,
const size_type  src_offset_j = 0,
const number  factor = 1.,
const bool  transpose = false 
)
inline

Fill rectangular block.

A rectangular block of the matrix src is copied into this. The upper left corner of the block being copied is (src_offset_i,src_offset_j). The upper left corner of the copied block is (dst_offset_i,dst_offset_j). The size of the rectangular block being copied is the maximum size possible, determined either by the size of this or src.

The final two arguments allow to enter a multiple of the source or its transpose.

Definition at line 738 of file lapack_full_matrix.h.

template<typename number >
template<class VECTOR >
void LAPACKFullMatrix< number >::vmult ( VECTOR &  dst,
const VECTOR &  src,
const bool  adding = false 
) const
inline

Matrix-vector-multiplication.

Depending on previous transformations recorded in state, the result of this function is one of

  • If state is LAPACKSupport::matrix or LAPACKSupport::inverse_matrix, this will be a regular matrix vector product using LAPACK gemv().
  • If state is LAPACKSupport::svd or LAPACKSupport::inverse_svd, this function first multiplies with the right transformation matrix, then with the diagonal matrix of singular values or their reciprocal values, and finally with the left trandformation matrix.

The optional parameter adding determines, whether the result is stored in w or added to w.

if (adding) w += A*v

if (!adding) w = A*v

Note
Source and destination must not be the same vector.
This template only exists for compile-time compatibility with FullMatrix. Implementation is only available for VECTOR=Vector<number>

Definition at line 772 of file lapack_full_matrix.h.

template<typename number >
template<class VECTOR >
void LAPACKFullMatrix< number >::vmult_add ( VECTOR &  w,
const VECTOR &  v 
) const
inline

Adding Matrix-vector-multiplication. w += A*v

See the documentation of vmult() for details on the implementation.

Definition at line 781 of file lapack_full_matrix.h.

template<typename number >
template<class VECTOR >
void LAPACKFullMatrix< number >::Tvmult ( VECTOR &  w,
const VECTOR &  v,
const bool  adding = false 
) const
inline

Transpose matrix-vector-multiplication.

The optional parameter adding determines, whether the result is stored in w or added to w.

if (adding) w += AT*v

if (!adding) w = AT*v

See the documentation of vmult() for details on the implementation.

Definition at line 790 of file lapack_full_matrix.h.

template<typename number >
template<class VECTOR >
void LAPACKFullMatrix< number >::Tvmult_add ( VECTOR &  w,
const VECTOR &  v 
) const
inline

Adding transpose matrix-vector-multiplication. w += AT*v

See the documentation of vmult() for details on the implementation.

Definition at line 799 of file lapack_full_matrix.h.

template<typename number>
void LAPACKFullMatrix< number >::compute_lu_factorization ( )

Compute the LU factorization of the matrix using LAPACK function Xgetrf.

template<typename number>
void LAPACKFullMatrix< number >::invert ( )

Invert the matrix by first computing an LU factorization with the LAPACK function Xgetrf and then building the actual inverse using Xgetri.

template<typename number>
void LAPACKFullMatrix< number >::apply_lu_factorization ( Vector< number > &  v,
const bool  transposed 
) const

Solve the linear system with right hand side given by applying forward/backward substitution to the previously computed LU factorization. Uses LAPACK function Xgetrs.

template<typename number>
void LAPACKFullMatrix< number >::compute_eigenvalues ( const bool  right_eigenvectors = false,
const bool  left_eigenvectors = false 
)

Compute eigenvalues of the matrix. After this routine has been called, eigenvalues can be retrieved using the eigenvalue() function. The matrix itself will be LAPACKSupport::unusable after this operation.

The optional arguments allow to compute left and right eigenvectors as well.

Note that the function does not return the computed eigenvalues right away since that involves copying data around between the output arrays of the LAPACK functions and any return array. This is often unnecessary since one may not be interested in all eigenvalues at once, but for example only the extreme ones. In that case, it is cheaper to just have this function compute the eigenvalues and have a separate function that returns whatever eigenvalue is requested.

Note
Calls the LAPACK function Xgeev.
template<typename number>
void LAPACKFullMatrix< number >::compute_eigenvalues_symmetric ( const number  lower_bound,
const number  upper_bound,
const number  abs_accuracy,
Vector< number > &  eigenvalues,
FullMatrix< number > &  eigenvectors 
)

Compute eigenvalues and eigenvectors of a real symmetric matrix. Only eigenvalues in the interval (lower_bound, upper_bound] are computed with the absolute tolerance abs_accuracy. An approximate eigenvalue is accepted as converged when it is determined to lie in an interval [a,b] of width less than or equal to abs_accuracy + eps * max( |a|,|b| ), where eps is the machine precision. If abs_accuracy is less than or equal to zero, then eps*|t| will be used in its place, where |t| is the 1-norm of the tridiagonal matrix obtained by reducing A to tridiagonal form. Eigenvalues will be computed most accurately when abs_accuracy is set to twice the underflow threshold, not zero. After this routine has been called, all eigenvalues in (lower_bound, upper_bound] will be stored in eigenvalues and the corresponding eigenvectors will be stored in the columns of eigenvectors, whose dimension is set accordingly.

Note
Calls the LAPACK function Xsyevx. For this to work, ./configure has to be told to use LAPACK.
template<typename number>
void LAPACKFullMatrix< number >::compute_generalized_eigenvalues_symmetric ( LAPACKFullMatrix< number > &  B,
const number  lower_bound,
const number  upper_bound,
const number  abs_accuracy,
Vector< number > &  eigenvalues,
std::vector< Vector< number > > &  eigenvectors,
const int  itype = 1 
)

Compute generalized eigenvalues and eigenvectors of a real generalized symmetric eigenproblem of the form itype = 1: $Ax=\lambda B x$ itype = 2: $ABx=\lambda x$ itype = 3: $BAx=\lambda x$, where A is this matrix. A and B are assumed to be symmetric, and B has to be positive definite. Only eigenvalues in the interval (lower_bound, upper_bound] are computed with the absolute tolerance abs_accuracy. An approximate eigenvalue is accepted as converged when it is determined to lie in an interval [a,b] of width less than or equal to abs_accuracy + eps * max( |a|,|b| ), where eps is the machine precision. If abs_accuracy is less than or equal to zero, then eps*|t| will be used in its place, where |t| is the 1-norm of the tridiagonal matrix obtained by reducing A to tridiagonal form. Eigenvalues will be computed most accurately when abs_accuracy is set to twice the underflow threshold, not zero. After this routine has been called, all eigenvalues in (lower_bound, upper_bound] will be stored in eigenvalues and the corresponding eigenvectors will be stored in eigenvectors, whose dimension is set accordingly.

Note
Calls the LAPACK function Xsygvx. For this to work, ./configure has to be told to use LAPACK.
template<typename number>
void LAPACKFullMatrix< number >::compute_generalized_eigenvalues_symmetric ( LAPACKFullMatrix< number > &  B,
std::vector< Vector< number > > &  eigenvectors,
const int  itype = 1 
)

Same as the other compute_generalized_eigenvalues_symmetric function except that all eigenvalues are computed and the tolerance is set automatically. Note that this function does not return the computed eigenvalues right away since that involves copying data around between the output arrays of the LAPACK functions and any return array. This is often unnecessary since one may not be interested in all eigenvalues at once, but for example only the extreme ones. In that case, it is cheaper to just have this function compute the eigenvalues and have a separate function that returns whatever eigenvalue is requested. Eigenvalues can be retrieved using the eigenvalue() function. The number of computed eigenvectors is equal to eigenvectors.size()

Note
Calls the LAPACK function Xsygv. For this to work, ./configure has to be told to use LAPACK.
template<typename number>
void LAPACKFullMatrix< number >::compute_svd ( )

Compute the singular value decomposition of the matrix using LAPACK function Xgesdd.

Requires that the state is LAPACKSupport::matrix, fills the data members wr, svd_u, and svd_vt, and leaves the object in the state LAPACKSupport::svd.

template<typename number>
void LAPACKFullMatrix< number >::compute_inverse_svd ( const double  threshold = 0.)

Compute the inverse of the matrix by singular value decomposition.

Requires that state is either LAPACKSupport::matrix or LAPACKSupport::svd. In the first case, this function calls compute_svd(). After this function, the object will have the state LAPACKSupport::inverse_svd.

For a singular value decomposition, the inverse is simply computed by replacing all singular values by their reciprocal values. If the matrix does not have maximal rank, singular values 0 are not touched, thus computing the minimal norm right inverse of the matrix.

The parameter threshold determines, when a singular value should be considered zero. It is the ratio of the smallest to the largest nonzero singular value smax. Thus, the inverses of all singular values less than smax/threshold will be set to zero.

template<typename number >
std::complex< number > LAPACKFullMatrix< number >::eigenvalue ( const size_type  i) const
inline

Retrieve eigenvalue after compute_eigenvalues() was called.

Definition at line 807 of file lapack_full_matrix.h.

template<typename number >
number LAPACKFullMatrix< number >::singular_value ( const size_type  i) const
inline

Retrieve singular values after compute_svd() or compute_inverse_svd() was called.

Definition at line 820 of file lapack_full_matrix.h.

template<typename number>
void LAPACKFullMatrix< number >::print_formatted ( std::ostream &  out,
const unsigned int  presicion = 3,
const bool  scientific = true,
const unsigned int  width = 0,
const char *  zero_string = " ",
const double  denominator = 1.,
const double  threshold = 0. 
) const

Print the matrix and allow formatting of entries.

The parameters allow for a flexible setting of the output format:

  • precision denotes the number of trailing digits.
  • scientific is used to determine the number format, where scientific = false means fixed point notation.
  • width denotes the with of each column. A zero entry for width makes the function compute a width, but it may be changed to a positive value, if output is crude.
  • zero_string specifies a string printed for zero entries.
  • denominator Multiply the whole matrix by this common denominator to get nicer numbers.
  • threshold: all entries with absolute value smaller than this are considered zero.

Member Data Documentation

template<typename number>
LAPACKSupport::State LAPACKFullMatrix< number >::state
private

Since LAPACK operations notoriously change the meaning of the matrix entries, we record the current state after the last operation here.

Definition at line 607 of file lapack_full_matrix.h.

template<typename number>
LAPACKSupport::Properties LAPACKFullMatrix< number >::properties
private

Additional properties of the matrix which may help to select more efficient LAPACK functions.

Definition at line 614 of file lapack_full_matrix.h.

template<typename number>
std::vector<number> LAPACKFullMatrix< number >::work
mutableprivate

The working array used for some LAPACK functions.

Definition at line 620 of file lapack_full_matrix.h.

template<typename number>
std::vector<int> LAPACKFullMatrix< number >::ipiv
private

The vector storing the permutations applied for pivoting in the LU-factorization.

Also used as the scratch array IWORK for LAPACK functions needing it.

Definition at line 632 of file lapack_full_matrix.h.

template<typename number>
std::vector<number> LAPACKFullMatrix< number >::inv_work
private

Workspace for calculating the inverse matrix from an LU factorization.

Definition at line 639 of file lapack_full_matrix.h.

template<typename number>
std::vector<number> LAPACKFullMatrix< number >::wr
private

Real parts of eigenvalues or the singular values. Filled by compute_eigenvalues() or compute_svd().

Definition at line 646 of file lapack_full_matrix.h.

template<typename number>
std::vector<number> LAPACKFullMatrix< number >::wi
private

Imaginary parts of eigenvalues. Filled by compute_eigenvalues.

Definition at line 653 of file lapack_full_matrix.h.

template<typename number>
std::vector<number> LAPACKFullMatrix< number >::vl
private

Space where left eigenvectors can be stored.

Definition at line 659 of file lapack_full_matrix.h.

template<typename number>
std::vector<number> LAPACKFullMatrix< number >::vr
private

Space where right eigenvectors can be stored.

Definition at line 665 of file lapack_full_matrix.h.

template<typename number>
std_cxx1x::shared_ptr<LAPACKFullMatrix<number> > LAPACKFullMatrix< number >::svd_u
private

The matrix U in the singular value decomposition USVT.

Definition at line 672 of file lapack_full_matrix.h.

template<typename number>
std_cxx1x::shared_ptr<LAPACKFullMatrix<number> > LAPACKFullMatrix< number >::svd_vt
private

The matrix VT in the singular value decomposition USVT.

Definition at line 679 of file lapack_full_matrix.h.


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