54 #include <Ifpack_config.h> 56 #ifdef HAVE_IFPACK_DYNAMIC_FACTORY 57 #include "Ifpack_DynamicFactory.h" 64 IQRSolver::IQRSolver(
const Teuchos::ParameterList& pList)
65 : gmresStateManager_(),
73 precAmesosType_(
"Amesos_Klu")
76 Teuchos::ParameterList params = pList;
79 useFullIQR_ = params.get<
bool>(
"Use full IQR",
true);
82 krylovDim_ = params.get<
double>(
"IQR Krylov Dim", 0.5);
83 numIter_ = params.get<
int>(
"IQR Number Iterations", 0);
84 doScaling_ = params.get<
bool>(
"IQR Scaling",
false);
85 precType_ = params.get<
string>(
"IQR Initial Prec Type",
"Amesos");
86 precAmesosType_ = params.get<
string>(
"IQR Initial Prec Amesos Type",
"Amesos_Klu");
89 IQRSolver::~IQRSolver()
94 const Epetra_MultiVector& B,
95 Epetra_MultiVector & X)
98 Epetra_CrsMatrix* G = S.G_;
99 #ifdef HAVE_IFPACK_DYNAMIC_FACTORY 100 Ifpack_DynamicFactory Factory;
104 prec_ = Teuchos::rcp(Factory.Create(precType_, G, 1));
105 Teuchos::ParameterList pList;
106 pList.set(
"amesos: solver type", precAmesosType_,
"");
107 pList.set(
"Reindex",
true);
108 prec_->SetParameters(pList);
110 IFPACK_CHK_ERR(prec_->Initialize());
111 IFPACK_CHK_ERR(prec_->Compute());
116 int sSize = S.OperatorDomainMap().NumGlobalElements();
117 int kSize = std::floor(krylovDim_ * sSize);
119 gmresStateManager_ = Teuchos::rcp(
120 new GMRESStateManager(S.OperatorDomainMap(),
121 kSize,
false, doScaling_));
122 gmresStateManager_->isFirst =
true;
126 IQR::GMRES<Epetra_Operator,
129 Ifpack_Preconditioner,
131 std::vector<double>,
double>
132 (S, X, B, &L, &(*prec_), *(gmresStateManager_), kSize, tol);
133 gmresStateManager_->P2 = &(*prec_);
147 const Epetra_MultiVector& B,
148 Epetra_MultiVector & X)
151 IFPACK_CHK_ERR(Compute(S, B, X));
155 IFPACK_CHK_ERR(prec_->ApplyInverse(B, X));
158 GMRESStateManager newGmresManager(S.OperatorDomainMap(),
162 IQR::GMRES<Epetra_Operator, Epetra_MultiVector,
164 std::vector<double>,
double>
165 (S, X, B, &L, &*(gmresStateManager_), newGmresManager, numIter_, tol);
167 IFPACK_CHK_ERR(gmresStateManager_->ApplyInverse(B, X));
Encapsulates the IQR inexact solver functionality.