47 #ifndef __Teko_NeumannSeriesPreconditionerFactory_hpp__
48 #define __Teko_NeumannSeriesPreconditionerFactory_hpp__
50 #include "Teko_NeumannSeriesPreconditionerFactoryDecl.hpp"
52 #include "Thyra_DefaultPreconditioner.hpp"
53 #include "Thyra_DefaultPreconditioner.hpp"
54 #include "Thyra_DefaultScaledAdjointLinearOp.hpp"
55 #include "Thyra_DefaultAddedLinearOp.hpp"
56 #include "Thyra_DefaultMultipliedLinearOp.hpp"
57 #include "Thyra_DefaultIdentityLinearOp.hpp"
59 #include "Teuchos_Array.hpp"
60 #include "Teuchos_StandardParameterEntryValidators.hpp"
67 static RCP<Teuchos::StringToIntegralParameterEntryValidator<Teko::DiagonalType> > scalingTypeVdtor;
69 template <
typename ScalarT>
70 NeumannSeriesPreconditionerFactory<ScalarT>::NeumannSeriesPreconditionerFactory()
71 : numberOfTerms_(1), scalingType_(Teko::NotDiag) {}
74 template <
typename ScalarT>
75 bool NeumannSeriesPreconditionerFactory<ScalarT>::isCompatible(
76 const Thyra::LinearOpSourceBase<ScalarT> & )
const {
81 template <
typename ScalarT>
82 RCP<Thyra::PreconditionerBase<ScalarT> > NeumannSeriesPreconditionerFactory<ScalarT>::createPrec()
84 return rcp(
new Thyra::DefaultPreconditioner<ScalarT>());
95 template <
typename ScalarT>
96 void NeumannSeriesPreconditionerFactory<ScalarT>::initializePrec(
97 const RCP<
const Thyra::LinearOpSourceBase<ScalarT> > &fwdOpSrc,
98 Thyra::PreconditionerBase<ScalarT> *prec,
99 const Thyra::ESupportSolveUse )
const {
101 using Thyra::multiply;
104 RCP<const Thyra::LinearOpBase<ScalarT> > M;
105 RCP<const Thyra::LinearOpBase<ScalarT> > A = fwdOpSrc->getOp();
106 if (scalingType_ != Teko::NotDiag) {
107 M = Teko::getInvDiagonalOp(A, scalingType_);
108 A = Thyra::multiply(M, A);
111 RCP<const Thyra::LinearOpBase<ScalarT> >
id = Thyra::identity<ScalarT>(A->range());
112 RCP<const Thyra::LinearOpBase<ScalarT> > idMA = add(
id, scale(-1.0, A));
114 RCP<const Thyra::LinearOpBase<ScalarT> > precOp;
115 if (numberOfTerms_ == 1) {
119 int iters = numberOfTerms_ - 1;
121 precOp = add(scale(2.0,
id), scale(-1.0, A));
122 for (
int i = 0; i < iters; i++) precOp = add(
id, multiply(idMA, precOp));
126 if (M != Teuchos::null) precOp = Thyra::multiply(precOp, M);
129 Thyra::DefaultPreconditioner<ScalarT> &dPrec =
130 Teuchos::dyn_cast<Thyra::DefaultPreconditioner<ScalarT> >(*prec);
133 dPrec.initializeUnspecified(Teuchos::rcp_const_cast<Thyra::LinearOpBase<ScalarT> >(precOp));
137 template <
typename ScalarT>
138 void NeumannSeriesPreconditionerFactory<ScalarT>::uninitializePrec(
139 Thyra::PreconditionerBase<ScalarT> *prec,
140 RCP<
const Thyra::LinearOpSourceBase<ScalarT> > * ,
141 Thyra::ESupportSolveUse * )
const {
142 Thyra::DefaultPreconditioner<ScalarT> &dPrec =
143 Teuchos::dyn_cast<Thyra::DefaultPreconditioner<ScalarT> >(*prec);
146 dPrec.uninitialize();
152 template <
typename ScalarT>
153 void NeumannSeriesPreconditionerFactory<ScalarT>::setParameterList(
154 const RCP<Teuchos::ParameterList> ¶mList) {
155 TEUCHOS_TEST_FOR_EXCEPT(paramList == Teuchos::null);
158 paramList->validateParametersAndSetDefaults(*getValidParameters(), 0);
161 paramList_ = paramList;
163 numberOfTerms_ = paramList_->get<
int>(
"Number of Terms");
166 scalingType_ = Teko::NotDiag;
167 const Teuchos::ParameterEntry *entry = paramList_->getEntryPtr(
"Scaling Type");
168 if (entry != NULL) scalingType_ = scalingTypeVdtor->getIntegralValue(*entry);
172 template <
typename ScalarT>
173 RCP<const Teuchos::ParameterList> NeumannSeriesPreconditionerFactory<ScalarT>::getValidParameters()
175 static RCP<Teuchos::ParameterList> validPL;
178 if (validPL == Teuchos::null) {
179 RCP<Teuchos::ParameterList> pl = rcp(
new Teuchos::ParameterList());
182 scalingTypeVdtor = Teuchos::stringToIntegralParameterEntryValidator<DiagonalType>(
183 Teuchos::tuple<std::string>(
"Diagonal",
"Lumped",
"AbsRowSum",
"None"),
184 Teuchos::tuple<Teko::DiagonalType>(Teko::Diagonal, Teko::Lumped, Teko::AbsRowSum,
188 pl->set<
int>(
"Number of Terms", 1,
189 "The number of terms to use in the Neumann series expansion.");
190 pl->set(
"Scaling Type",
"None",
"The number of terms to use in the Neumann series expansion.",
200 template <
typename ScalarT>
201 RCP<Teuchos::ParameterList> NeumannSeriesPreconditionerFactory<ScalarT>::unsetParameterList() {
202 Teuchos::RCP<Teuchos::ParameterList> oldList = paramList_;
203 paramList_ = Teuchos::null;
208 template <
typename ScalarT>
209 RCP<const Teuchos::ParameterList> NeumannSeriesPreconditionerFactory<ScalarT>::getParameterList()
215 template <
typename ScalarT>
216 RCP<Teuchos::ParameterList>
217 NeumannSeriesPreconditionerFactory<ScalarT>::getNonconstParameterList() {
221 template <
typename ScalarT>
222 std::string NeumannSeriesPreconditionerFactory<ScalarT>::description()
const {
223 std::ostringstream oss;
224 oss <<
"Teko::NeumannSeriesPreconditionerFactory";