Reference documentation for deal.II version 8.4.2
lapack_full_matrix.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2005 - 2015 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE at
12 // the top level of the deal.II distribution.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii__lapack_full_matrix_h
17 #define dealii__lapack_full_matrix_h
18 
19 
20 #include <deal.II/base/config.h>
21 #include <deal.II/base/smartpointer.h>
22 #include <deal.II/base/table.h>
23 #include <deal.II/lac/lapack_support.h>
24 #include <deal.II/lac/vector_memory.h>
25 
26 #include <deal.II/base/std_cxx11/shared_ptr.h>
27 #include <vector>
28 #include <complex>
29 
30 DEAL_II_NAMESPACE_OPEN
31 
32 // forward declarations
33 template<typename number> class Vector;
34 template<typename number> class BlockVector;
35 template<typename number> class FullMatrix;
36 template<typename number> class SparseMatrix;
37 
38 
51 template <typename number>
52 class LAPACKFullMatrix : public TransposeTable<number>
53 {
54 public:
55 
60 
70  explicit LAPACKFullMatrix (const size_type size = 0);
71 
72 
76  LAPACKFullMatrix (const size_type rows,
77  const size_type cols);
78 
79 
90 
96 
103  template <typename number2>
106 
113  template <typename number2>
116 
122  operator = (const double d);
123 
130  template <typename MatrixType>
131  void copy_from (const MatrixType &);
132 
138  void reinit (const size_type size);
139 
145  void reinit (const size_type rows,
146  const size_type cols);
147 
153  unsigned int m () const;
154 
160  unsigned int n () const;
161 
175  template<typename MatrixType>
176  void fill (const MatrixType &src,
177  const size_type dst_offset_i = 0,
178  const size_type dst_offset_j = 0,
179  const size_type src_offset_i = 0,
180  const size_type src_offset_j = 0,
181  const number factor = 1.,
182  const bool transpose = false);
183 
184 
213  template <typename number2>
214  void vmult (Vector<number2> &w,
215  const Vector<number2> &v,
216  const bool adding = false) const;
217 
221  void vmult (Vector<number> &w,
222  const Vector<number> &v,
223  const bool adding = false) const;
224 
230  template <typename number2>
231  void vmult_add (Vector<number2> &w,
232  const Vector<number2> &v) const;
233 
237  void vmult_add (Vector<number> &w,
238  const Vector<number> &v) const;
239 
252  template <typename number2>
253  void Tvmult (Vector<number2> &w,
254  const Vector<number2> &v,
255  const bool adding=false) const;
256 
260  void Tvmult (Vector<number> &w,
261  const Vector<number> &v,
262  const bool adding=false) const;
263 
270  template <typename number2>
271  void Tvmult_add (Vector<number2> &w,
272  const Vector<number2> &v) const;
273 
277  void Tvmult_add (Vector<number> &w,
278  const Vector<number> &v) const;
279 
280 
297  const LAPACKFullMatrix<number> &B,
298  const bool adding=false) const;
299 
304  void mmult (FullMatrix<number> &C,
305  const LAPACKFullMatrix<number> &B,
306  const bool adding=false) const;
307 
324  const LAPACKFullMatrix<number> &B,
325  const bool adding=false) const;
326 
331  void Tmmult (FullMatrix<number> &C,
332  const LAPACKFullMatrix<number> &B,
333  const bool adding=false) const;
334 
351  const LAPACKFullMatrix<number> &B,
352  const bool adding=false) const;
353 
358  void mTmult (FullMatrix<number> &C,
359  const LAPACKFullMatrix<number> &B,
360  const bool adding=false) const;
361 
379  const LAPACKFullMatrix<number> &B,
380  const bool adding=false) const;
381 
386  void TmTmult (FullMatrix<number> &C,
387  const LAPACKFullMatrix<number> &B,
388  const bool adding=false) const;
389 
393  void compute_lu_factorization ();
394 
399  void invert ();
400 
410  const bool transposed) const;
411 
422  const bool transposed) const;
423 
442  void compute_eigenvalues (const bool right_eigenvectors = false,
443  const bool left_eigenvectors = false);
444 
463  void compute_eigenvalues_symmetric (const number lower_bound,
464  const number upper_bound,
465  const number abs_accuracy,
466  Vector<number> &eigenvalues,
467  FullMatrix<number> &eigenvectors);
468 
491  const number lower_bound,
492  const number upper_bound,
493  const number abs_accuracy,
494  Vector<number> &eigenvalues,
495  std::vector<Vector<number> > &eigenvectors,
496  const int itype = 1);
497 
515  std::vector<Vector<number> > &eigenvectors,
516  const int itype = 1);
517 
526  void compute_svd ();
527 
547  void compute_inverse_svd (const double threshold = 0.);
548 
552  std::complex<number>
553  eigenvalue (const size_type i) const;
554 
559  number
560  singular_value (const size_type i) const;
561 
584  void print_formatted (std::ostream &out,
585  const unsigned int precision = 3,
586  const bool scientific = true,
587  const unsigned int width = 0,
588  const char *zero_string = " ",
589  const double denominator = 1.,
590  const double threshold = 0.) const;
591 
592 private:
593 
598  LAPACKSupport::State state;
599 
604  LAPACKSupport::Properties properties;
605 
609  mutable std::vector<number> work;
610 
617  std::vector<int> ipiv;
618 
622  std::vector<number> inv_work;
623 
628  std::vector<number> wr;
629 
633  std::vector<number> wi;
634 
638  std::vector<number> vl;
639 
643  std::vector<number> vr;
644 
649  std_cxx11::shared_ptr<LAPACKFullMatrix<number> > svd_u;
650 
655  std_cxx11::shared_ptr<LAPACKFullMatrix<number> > svd_vt;
656 };
657 
658 
659 
666 template <typename number>
668  :
669  public Subscriptor
670 {
671 public:
672  void initialize(const LAPACKFullMatrix<number> &);
673  void initialize(const LAPACKFullMatrix<number> &,
675  void vmult(Vector<number> &, const Vector<number> &) const;
676  void Tvmult(Vector<number> &, const Vector<number> &) const;
677  void vmult(BlockVector<number> &,
678  const BlockVector<number> &) const;
680  const BlockVector<number> &) const;
681 private:
684 };
685 
686 /*---------------------- Inline functions -----------------------------------*/
687 
688 template <typename number>
689 inline
690 unsigned int
692 {
693  return this->n_rows ();
694 }
695 
696 template <typename number>
697 inline
698 unsigned int
700 {
701  return this->n_cols ();
702 }
703 
704 template <typename number>
705 template <typename MatrixType>
706 inline void
708 {
709  this->reinit (M.m(), M.n());
710 
711  // loop over the elements of the argument matrix row by row, as suggested
712  // in the documentation of the sparse matrix iterator class, and
713  // copy them into the current object
714  for (size_type row = 0; row < M.m(); ++row)
715  {
716  const typename MatrixType::const_iterator end_row = M.end(row);
717  for (typename MatrixType::const_iterator entry = M.begin(row);
718  entry != end_row; ++entry)
719  this->el(row, entry->column()) = entry->value();
720  }
721 
722  state = LAPACKSupport::matrix;
723 }
724 
725 
726 
727 template <typename number>
728 template <typename MatrixType>
729 inline void
730 LAPACKFullMatrix<number>::fill (const MatrixType &M,
731  const size_type dst_offset_i,
732  const size_type dst_offset_j,
733  const size_type src_offset_i,
734  const size_type src_offset_j,
735  const number factor,
736  const bool transpose)
737 {
738  // loop over the elements of the argument matrix row by row, as suggested
739  // in the documentation of the sparse matrix iterator class
740  for (size_type row = src_offset_i; row < M.m(); ++row)
741  {
742  const typename MatrixType::const_iterator end_row = M.end(row);
743  for (typename MatrixType::const_iterator entry = M.begin(row);
744  entry != end_row; ++entry)
745  {
746  const size_type i = transpose ? entry->column() : row;
747  const size_type j = transpose ? row : entry->column();
748 
749  const size_type dst_i=dst_offset_i+i-src_offset_i;
750  const size_type dst_j=dst_offset_j+j-src_offset_j;
751  if (dst_i<this->n_rows() && dst_j<this->n_cols())
752  (*this)(dst_i, dst_j) = factor * entry->value();
753  }
754  }
755 
756  state = LAPACKSupport::matrix;
757 }
758 
759 
760 template <typename number>
761 template <typename number2>
762 void
764  const Vector<number2> &,
765  const bool) const
766 {
767  Assert(false,
768  ExcMessage("LAPACKFullMatrix<number>::vmult must be called with a "
769  "matching Vector<double> vector type."));
770 }
771 
772 
773 template <typename number>
774 template <typename number2>
775 void
777  const Vector<number2> &) const
778 {
779  Assert(false,
780  ExcMessage("LAPACKFullMatrix<number>::vmult_add must be called with a "
781  "matching Vector<double> vector type."));
782 }
783 
784 
785 template <typename number>
786 template <typename number2>
787 void
789  const Vector<number2> &,
790  const bool) const
791 {
792  Assert(false,
793  ExcMessage("LAPACKFullMatrix<number>::Tvmult must be called with a "
794  "matching Vector<double> vector type."));
795 }
796 
797 
798 template <typename number>
799 template <typename number2>
800 void
802  const Vector<number2> &) const
803 {
804  Assert(false,
805  ExcMessage("LAPACKFullMatrix<number>::Tvmult_add must be called with a "
806  "matching Vector<double> vector type."));
807 }
808 
809 
810 template <typename number>
811 inline std::complex<number>
813 {
814  Assert (state & LAPACKSupport::eigenvalues, ExcInvalidState());
815  Assert (wr.size() == this->n_rows(), ExcInternalError());
816  Assert (wi.size() == this->n_rows(), ExcInternalError());
817  Assert (i<this->n_rows(), ExcIndexRange(i,0,this->n_rows()));
818 
819  return std::complex<number>(wr[i], wi[i]);
820 }
821 
822 
823 template <typename number>
824 inline number
826 {
827  Assert (state == LAPACKSupport::svd || state == LAPACKSupport::inverse_svd, LAPACKSupport::ExcState(state));
828  AssertIndexRange(i,wr.size());
829 
830  return wr[i];
831 }
832 
833 
834 
835 DEAL_II_NAMESPACE_CLOSE
836 
837 #endif
LAPACKFullMatrix(const size_type size=0)
std_cxx11::shared_ptr< LAPACKFullMatrix< number > > svd_u
std::vector< number > work
void TmTmult(LAPACKFullMatrix< number > &C, const LAPACKFullMatrix< number > &B, const bool adding=false) const
void Tvmult(Vector< number2 > &w, const Vector< number2 > &v, const bool adding=false) const
LAPACKSupport::State state
const TableIndices< N > & size() const
AlignedVector< number >::reference el(const unsigned int i, const unsigned int j)
::ExceptionBase & ExcMessage(std::string arg1)
std::complex< number > eigenvalue(const size_type i) const
#define AssertIndexRange(index, range)
Definition: exceptions.h:1081
LAPACKSupport::Properties properties
std::vector< number > vr
void compute_eigenvalues_symmetric(const number lower_bound, const number upper_bound, const number abs_accuracy, Vector< number > &eigenvalues, FullMatrix< number > &eigenvectors)
unsigned int n_cols() const
void reinit(const size_type size)
void Tmmult(LAPACKFullMatrix< number > &C, const LAPACKFullMatrix< number > &B, const bool adding=false) const
types::global_dof_index size_type
void mTmult(LAPACKFullMatrix< number > &C, const LAPACKFullMatrix< number > &B, const bool adding=false) const
TableBase< 2, T >::size_type size_type
Definition: table.h:1510
std::vector< int > ipiv
std::vector< number > wr
unsigned int global_dof_index
Definition: types.h:88
std_cxx11::shared_ptr< LAPACKFullMatrix< number > > svd_vt
#define Assert(cond, exc)
Definition: exceptions.h:294
void copy_from(const MatrixType &)
std::vector< number > inv_work
unsigned int n_rows() const
std::vector< number > vl
std::vector< number > wi
void vmult(Vector< number2 > &w, const Vector< number2 > &v, const bool adding=false) const
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 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 double threshold=0.) const
number singular_value(const size_type i) const
void compute_inverse_svd(const double threshold=0.)
LAPACKFullMatrix< number > & operator=(const LAPACKFullMatrix< number > &)
void fill(const MatrixType &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)
void Tvmult_add(Vector< number2 > &w, const Vector< number2 > &v) const
unsigned int m() const
unsigned int n() const
void compute_eigenvalues(const bool right_eigenvectors=false, const bool left_eigenvectors=false)
void apply_lu_factorization(Vector< number > &v, const bool transposed) const
void vmult_add(Vector< number2 > &w, const Vector< number2 > &v) const
void mmult(LAPACKFullMatrix< number > &C, const LAPACKFullMatrix< number > &B, const bool adding=false) const