NamedData<std_cxx1x::shared_ptr<value_type> >::subscribe;
NamedData<std_cxx1x::shared_ptr<value_type> >::unsubscribe;
NamedData<std_cxx1x::shared_ptr<value_type> >::size;
+ NamedData<std_cxx1x::shared_ptr<value_type> >::name;
};
*/
const FullMatrix<number>& inverse (unsigned int i) const;
+ /**
+ * Access to the inverse diagonal
+ * blocks if Inversion is #householder.
+ */
+ const Householder<number>& inverse_householder (unsigned int i) const;
+
+ /**
+ * Access to the inverse diagonal
+ * blocks if Inversion is #householder.
+ */
+ const LAPACKFullMatrix<number>& inverse_svd (unsigned int i) const;
+
/**
* Access to the diagonal
* blocks.
}
+template <typename number>
+inline
+const Householder<number>&
+PreconditionBlockBase<number>::inverse_householder(unsigned int i) const
+{
+ if (same_diagonal())
+ return var_inverse_householder[0];
+
+ AssertIndexRange (i, var_inverse_householder.size());
+ return var_inverse_householder[i];
+}
+
+
+template <typename number>
+inline
+const LAPACKFullMatrix<number>&
+PreconditionBlockBase<number>::inverse_svd(unsigned int i) const
+{
+ if (same_diagonal())
+ return var_inverse_svd[0];
+
+ AssertIndexRange (i, var_inverse_svd.size());
+ return var_inverse_svd[i];
+}
+
+
template <typename number>
inline
const FullMatrix<number>&
* method for the blocks.
*/
typename PreconditionBlockBase<inverse_type>::Inversion inversion;
+
+ /**
+ * The if #inversion is SVD,
+ * the threshold below which
+ * a singular value will be
+ * considered zero and thus
+ * not inverted. This
+ * parameter is used in the
+ * call to LAPACKFullMatrix::compute_inverse_svd().
+ */
+ double threshold;
};
/**
* Make function of base class public again.
*/
using RelaxationBlock<MATRIX, inverse_type>::empty;
+ /**
+ * Make function of base class public again.
+ */
+ using RelaxationBlock<MATRIX, inverse_type>::size;
+ /**
+ * Make function of base class public again.
+ */
+ using RelaxationBlock<MATRIX, inverse_type>::inverse;
+ /**
+ * Make function of base class public again.
+ */
+ using RelaxationBlock<MATRIX, inverse_type>::inverse_householder;
+ /**
+ * Make function of base class public again.
+ */
+ using RelaxationBlock<MATRIX, inverse_type>::inverse_svd;
/**
* Perform one step of the SOR
* iteration.
* Make function of base class public again.
*/
using RelaxationBlock<MATRIX, inverse_type>::empty;
+
+ /**
+ * Make function of base class public again.
+ */
+ using RelaxationBlock<MATRIX, inverse_type>::size;
+ /**
+ * Make function of base class public again.
+ */
+ using RelaxationBlock<MATRIX, inverse_type>::inverse;
+ /**
+ * Make function of base class public again.
+ */
+ using RelaxationBlock<MATRIX, inverse_type>::inverse_householder;
+ /**
+ * Make function of base class public again.
+ */
+ using RelaxationBlock<MATRIX, inverse_type>::inverse_svd;
/**
* Perform one step of the SOR
* iteration.
relaxation(1.),
invert_diagonal(true),
same_diagonal(false),
- inversion(PreconditionBlockBase<inverse_type>::gauss_jordan)
+ inversion(PreconditionBlockBase<inverse_type>::gauss_jordan),
+ threshold(0.)
{}
relaxation(relaxation),
invert_diagonal(invert_diagonal),
same_diagonal(same_diagonal),
- inversion(PreconditionBlockBase<inverse_type>::gauss_jordan)
+ inversion(PreconditionBlockBase<inverse_type>::gauss_jordan),
+ threshold(0.)
{}
case PreconditionBlockBase<inverse_type>::svd:
this->inverse_svd(block).reinit(bs, bs);
this->inverse_svd(block) = M_cell;
- this->inverse_svd(block).compute_inverse_svd(0.);
+ this->inverse_svd(block).compute_inverse_svd(additional_data.threshold);
break;
default:
Assert(false, ExcNotImplemented());