13#ifndef dealii_precondition_block_base_h
14#define dealii_precondition_block_base_h
34template <
typename number>
36template <
typename number>
55template <
typename number>
146 template <
typename number2>
155 template <
typename number2>
300template <
typename number>
305 , n_diagonal_blocks(0)
306 , var_store_diagonals(store)
307 , var_same_diagonal(false)
308 , var_inverses_ready(false)
312template <
typename number>
316 if (var_inverse_full.size() != 0)
317 var_inverse_full.erase(var_inverse_full.begin(), var_inverse_full.end());
318 if (var_inverse_householder.size() != 0)
319 var_inverse_householder.erase(var_inverse_householder.begin(),
320 var_inverse_householder.end());
321 if (var_inverse_svd.size() != 0)
322 var_inverse_svd.erase(var_inverse_svd.begin(), var_inverse_svd.end());
323 if (var_diagonal.size() != 0)
324 var_diagonal.erase(var_diagonal.begin(), var_diagonal.end());
325 var_same_diagonal =
false;
326 var_inverses_ready =
false;
327 n_diagonal_blocks = 0;
330template <
typename number>
338 var_same_diagonal = compress;
339 var_inverses_ready =
false;
340 n_diagonal_blocks = n;
347 var_inverse_full.resize(1);
348 var_inverse_full[0].reinit(b, b);
351 var_inverse_householder.resize(1);
354 var_inverse_svd.resize(1);
355 var_inverse_svd[0].reinit(b, b);
361 if (store_diagonals())
363 var_diagonal.resize(1);
364 var_diagonal[0].reinit(b, b);
377 if (store_diagonals())
380 var_diagonal.swap(tmp);
388 var_inverse_full.swap(tmp);
392 var_inverse_householder.resize(n);
396 std::vector<LAPACKFullMatrix<number>> tmp(
398 var_inverse_svd.swap(tmp);
408template <
typename number>
412 return n_diagonal_blocks;
417template <
typename number>
418template <
typename number2>
424 const size_type ii = same_diagonal() ? 0U : i;
430 var_inverse_full[ii].vmult(dst, src);
434 var_inverse_householder[ii].vmult(dst, src);
438 var_inverse_svd[ii].vmult(dst, src);
446template <
typename number>
447template <
typename number2>
453 const size_type ii = same_diagonal() ? 0U : i;
459 var_inverse_full[ii].Tvmult(dst, src);
463 var_inverse_householder[ii].Tvmult(dst, src);
467 var_inverse_svd[ii].Tvmult(dst, src);
475template <
typename number>
480 return var_inverse_full[0];
483 return var_inverse_full[i];
487template <
typename number>
492 return var_inverse_householder[0];
495 return var_inverse_householder[i];
499template <
typename number>
504 return var_inverse_svd[0];
507 return var_inverse_svd[i];
511template <
typename number>
515 Assert(store_diagonals(), ExcDiagonalsNotStored());
518 return var_diagonal[0];
521 return var_diagonal[i];
525template <
typename number>
529 Assert(var_inverse_full.size() != 0, ExcInverseNotAvailable());
532 return var_inverse_full[0];
535 return var_inverse_full[i];
539template <
typename number>
543 Assert(var_inverse_householder.size() != 0, ExcInverseNotAvailable());
546 return var_inverse_householder[0];
549 return var_inverse_householder[i];
553template <
typename number>
557 Assert(var_inverse_svd.size() != 0, ExcInverseNotAvailable());
560 return var_inverse_svd[0];
563 return var_inverse_svd[i];
567template <
typename number>
571 Assert(store_diagonals(), ExcDiagonalsNotStored());
574 return var_diagonal[0];
577 return var_diagonal[i];
581template <
typename number>
585 return var_same_diagonal;
589template <
typename number>
593 return var_store_diagonals;
597template <
typename number>
601 var_inverses_ready = x;
605template <
typename number>
609 return var_inverses_ready;
613template <
typename number>
617 deallog <<
"PreconditionBlockBase: " <<
size() <<
" blocks; ";
619 if (inversion == svd)
621 unsigned int kermin = 100000000, kermax = 0;
622 double sigmin = 1.e300, sigmax = -1.e300;
623 double kappamin = 1.e300, kappamax = -1.e300;
629 while (k <= matrix.n_cols() &&
630 matrix.singular_value(matrix.n_cols() - k) == 0)
632 const double s0 = matrix.singular_value(0);
633 const double sm = matrix.singular_value(matrix.n_cols() - k);
634 const double co = sm / s0;
649 deallog <<
"dim ker [" << kermin <<
':' << kermax <<
"] sigma [" << sigmin
650 <<
':' << sigmax <<
"] kappa [" << kappamin <<
':' << kappamax
653 else if (inversion == householder)
656 else if (inversion == gauss_jordan)
666template <
typename number>
670 std::size_t mem =
sizeof(*this);
671 for (
size_type i = 0; i < var_inverse_full.size(); ++i)
673 for (
size_type i = 0; i < var_diagonal.size(); ++i)
bool same_diagonal() const
std::vector< FullMatrix< number > > var_diagonal
unsigned int n_diagonal_blocks
std::size_t memory_consumption() const
std::vector< LAPACKFullMatrix< number > > var_inverse_svd
void log_statistics() const
FullMatrix< number > & inverse(const size_type i)
const FullMatrix< number > & inverse(const size_type i) const
const FullMatrix< number > & diagonal(const size_type i) const
FullMatrix< number > & diagonal(const size_type i)
LAPACKFullMatrix< number > & inverse_svd(const size_type i)
std::vector< FullMatrix< number > > var_inverse_full
bool inverses_ready() const
unsigned int size() const
std::vector< Householder< number > > var_inverse_householder
PreconditionBlockBase(const bool store_diagonals=false, const Inversion method=gauss_jordan)
bool store_diagonals() const
void reinit(const unsigned int nblocks, const size_type blocksize, const bool compress, const Inversion method=gauss_jordan)
void inverse_vmult(const size_type i, Vector< number2 > &dst, const Vector< number2 > &src) const
void inverse_Tvmult(const size_type i, Vector< number2 > &dst, const Vector< number2 > &src) const
void inverses_computed(const bool are_they)
const Householder< number > & inverse_householder(const size_type i) const
~PreconditionBlockBase()=default
Householder< number > & inverse_householder(const size_type i)
const LAPACKFullMatrix< number > & inverse_svd(const size_type i) const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
#define DeclException0(Exception0)
static ::ExceptionBase & ExcDiagonalsNotStored()
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInverseNotAvailable()
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
unsigned int global_dof_index