Ifpack2 Templated Preconditioning Package Version 1.0
Loading...
Searching...
No Matches
Ifpack2_Condest.hpp
1// @HEADER
2// *****************************************************************************
3// Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
4//
5// Copyright 2009 NTESS and the Ifpack2 contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef IFPACK2_CONDEST_HPP
11#define IFPACK2_CONDEST_HPP
12
13#include "Ifpack2_ConfigDefs.hpp"
14#include "Ifpack2_CondestType.hpp"
16#include <Teuchos_Ptr.hpp>
17
18namespace Ifpack2 {
19
59template<class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
60typename Teuchos::ScalarTraits<Scalar>::magnitudeType
61Condest (const Ifpack2::Preconditioner<Scalar, LocalOrdinal, GlobalOrdinal, Node>& TIFP,
62 const Ifpack2::CondestType CT,
63 const int MaxIters = 1550,
64 const typename Teuchos::ScalarTraits<Scalar>::magnitudeType& Tol = Teuchos::as<Scalar> (1e-9),
65 const Teuchos::Ptr<const Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> >& matrix_in = Teuchos::null)
66{
67 using Teuchos::Ptr;
68 typedef Teuchos::ScalarTraits<Scalar> STS;
69 typedef typename STS::magnitudeType MT;
70 typedef Teuchos::ScalarTraits<MT> STM;
71 typedef Tpetra::RowMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> row_matrix_type;
72 typedef Tpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node> vec_type;
73
74 MT condNumEst = -STS::magnitude( STS::one() );
75
76 // Users may either provide a matrix for which to estimate the
77 // condition number, or use the Preconditioner's built-in matrix.
78 Ptr<const row_matrix_type> matrix = matrix_in;
79 if (matrix_in == Teuchos::null) {
80 matrix = TIFP.getMatrix ().ptr ();
81 TEUCHOS_TEST_FOR_EXCEPTION(
82 matrix == Teuchos::null,
83 std::logic_error,
84 "Ifpack2::Condest: Both the input matrix (matrix_in) and the Ifpack2 "
85 "preconditioner's matrix are null, so we have no matrix with which to "
86 "compute a condition number estimate. This probably indicates a bug "
87 "in Ifpack2, since no Ifpack2::Preconditioner subclass should accept a"
88 "null matrix.");
89 }
90
91 if (CT == Ifpack2::Cheap) {
92 vec_type ones (TIFP.getDomainMap ()); // Vector of ones
93 ones.putScalar (STS::one ());
94 vec_type onesResult (TIFP.getRangeMap ()); // A*ones
95 onesResult.putScalar (STS::zero ());
96 TIFP.apply (ones, onesResult);
97 condNumEst = onesResult.normInf (); // max (abs (A*ones))
98 TEUCHOS_TEST_FOR_EXCEPTION(
99 STM::isnaninf (condNumEst),
100 std::runtime_error,
101 "Ifpack2::Condest: $\\|A*[1, ..., 1]^T\\|_{\\infty}$ = " << condNumEst << " is NaN or Inf.");
102 } else if (CT == Ifpack2::CG) {
103 TEUCHOS_TEST_FOR_EXCEPTION(
104 true, std::logic_error,
105 "Ifpack2::Condest: Condition number estimation using CG is not currently supported.");
106 } else if (CT == Ifpack2::GMRES) {
107 TEUCHOS_TEST_FOR_EXCEPTION(
108 true, std::logic_error,
109 "Ifpack2::Condest: Condition number estimation using GMRES is not currently supported.");
110 }
111 return condNumEst;
112}
113
114}//namespace Ifpack2
115
116#endif // IFPACK2_CONDEST_HPP
117
virtual Teuchos::RCP< const Tpetra::RowMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getMatrix() const =0
The input matrix given to the constructor.
virtual void apply(const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=Teuchos::ScalarTraits< Scalar >::one(), Scalar beta=Teuchos::ScalarTraits< Scalar >::zero()) const =0
Apply the preconditioner to X, putting the result in Y.
virtual Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getRangeMap() const =0
The range Map of this operator.
virtual Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getDomainMap() const =0
The domain Map of this operator.
Preconditioners and smoothers for Tpetra sparse matrices.
Definition Ifpack2_AdditiveSchwarz_decl.hpp:41
CondestType
Ifpack2::CondestType: enum to define the type of condition number estimate.
Definition Ifpack2_CondestType.hpp:17
@ CG
Uses AztecOO's CG.
Definition Ifpack2_CondestType.hpp:19
@ Cheap
cheap estimate
Definition Ifpack2_CondestType.hpp:18
@ GMRES
Uses AztecOO's GMRES.
Definition Ifpack2_CondestType.hpp:20