106 const Teuchos::RCP<
const LinearOpSourceBase<double> > &fwdOpSrc
107 ,PreconditionerBase<double> *prec
108 ,
const ESupportSolveUse
111 using Teuchos::outArg;
112 using Teuchos::OSTab;
113 using Teuchos::dyn_cast;
117 using Teuchos::rcp_dynamic_cast;
118 using Teuchos::rcp_const_cast;
119 using Teuchos::set_extra_data;
120 using Teuchos::get_optional_extra_data;
121 using Teuchos::implicit_cast;
122 Teuchos::Time totalTimer(
""), timer(
"");
123 totalTimer.start(
true);
124#ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
125 Teuchos::TimeMonitor overallTimeMonitor(*overallTimer);
127 const Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
128 const Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
129 Teuchos::OSTab tab(out);
130 if(out.get() && implicit_cast<int>(verbLevel) > implicit_cast<int>(Teuchos::VERB_LOW))
131 *out <<
"\nEntering Thyra::IfpackPreconditionerFactory::initializePrec(...) ...\n";
133 TEUCHOS_TEST_FOR_EXCEPT(fwdOpSrc.get()==NULL);
134 TEUCHOS_TEST_FOR_EXCEPT(prec==NULL);
136 Teuchos::RCP<const LinearOpBase<double> >
137 fwdOp = fwdOpSrc->getOp();
139 TEUCHOS_TEST_FOR_EXCEPT(fwdOp.get()==NULL);
144 Teuchos::RCP<const Epetra_Operator> epetraFwdOp;
145 EOpTransp epetraFwdOpTransp;
146 EApplyEpetraOpAs epetraFwdOpApplyAs;
147 EAdjointEpetraOp epetraFwdOpAdjointSupport;
148 double epetraFwdOpScalar;
149 epetraFwdOpViewExtractor_->getEpetraOpView(
151 outArg(epetraFwdOp), outArg(epetraFwdOpTransp),
152 outArg(epetraFwdOpApplyAs), outArg(epetraFwdOpAdjointSupport),
153 outArg(epetraFwdOpScalar)
156 RCP<const Epetra_RowMatrix>
157 epetraFwdRowMat = rcp_dynamic_cast<const Epetra_RowMatrix>(epetraFwdOp,
true);
158 TEUCHOS_TEST_FOR_EXCEPTION(
159 epetraFwdOpApplyAs != EPETRA_OP_APPLY_APPLY, std::logic_error
160 ,
"Error, incorrect apply mode for an Epetra_RowMatrix"
165 DefaultPreconditioner<double>
166 *defaultPrec = &Teuchos::dyn_cast<DefaultPreconditioner<double> >(*prec);
171 epetra_precOp = rcp_dynamic_cast<EpetraLinearOp>(defaultPrec->getNonconstUnspecifiedPrecOp(),
true);
175 Teuchos::RCP<Ifpack_Preconditioner>
177 if(epetra_precOp.get())
178 ifpack_precOp = rcp_dynamic_cast<Ifpack_Preconditioner>(epetra_precOp->epetra_op(),
true);
182 if(ifpack_precOp.get()) {
190 const bool startingOver =
true;
197 if(out.get() && implicit_cast<int>(verbLevel) >= implicit_cast<int>(Teuchos::VERB_LOW))
198 *out <<
"\nCreating the initial Ifpack_Preconditioner object of type \'"<<
Ifpack::toString(precType_)<<
"\' ...\n";
200#ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
201 Teuchos::TimeMonitor creationTimeMonitor(*creationTimer);
212 if(out.get() && implicit_cast<int>(verbLevel) >= implicit_cast<int>(Teuchos::VERB_LOW))
213 OSTab(out).o() <<
"=> Creation time = "<<timer.totalElapsedTime()<<
" sec\n";
215 if(paramList_.get()) {
216 Teuchos::ParameterList
217 &ifpackSettingsPL = paramList_->sublist(IfpackSettings_name);
219 TEUCHOS_TEST_FOR_EXCEPT(0!=ifpack_precOp->SetParameters(ifpackSettingsPL));
224 TEUCHOS_TEST_FOR_EXCEPT(0!=ifpack_precOp->Initialize());
229 set_extra_data(epetraFwdOp,
"IFPF::epetraFwdOp", Teuchos::inOutArg(ifpack_precOp),
230 Teuchos::POST_DESTROY,
false);
235 if(out.get() && implicit_cast<int>(verbLevel) >= implicit_cast<int>(Teuchos::VERB_LOW))
236 *out <<
"\nComputing the preconditioner ...\n";
237#ifdef STRATIMIKOS_TEUCHOS_TIME_MONITOR
238 Teuchos::TimeMonitor factorizationTimeMonitor(*factorizationTimer);
241 TEUCHOS_TEST_FOR_EXCEPT(0!=ifpack_precOp->Compute());
243 if(out.get() && implicit_cast<int>(verbLevel) >= implicit_cast<int>(Teuchos::VERB_LOW))
244 OSTab(out).o() <<
"=> Setup time = "<<timer.totalElapsedTime()<<
" sec\n";
255 set_extra_data(fwdOpSrc,
"IFPF::fwdOpSrc", Teuchos::inOutArg(ifpack_precOp),
256 Teuchos::POST_DESTROY,
false);
261 epetra_precOp = rcp(
new EpetraLinearOp);
263 epetra_precOp->initialize(
266 ,EPETRA_OP_APPLY_APPLY_INVERSE
267 ,EPETRA_OP_ADJOINT_SUPPORTED
269 if(out.get() && implicit_cast<int>(verbLevel) >= implicit_cast<int>(Teuchos::VERB_MEDIUM)) {
270 *out <<
"\nDescription of created preconditioner:\n";
272 ifpack_precOp->Print(*out);
278 defaultPrec->initializeUnspecified(
279 Teuchos::rcp_implicit_cast<LinearOpBase<double> >(epetra_precOp)
282 if(out.get() && implicit_cast<int>(verbLevel) >= implicit_cast<int>(Teuchos::VERB_LOW))
283 *out <<
"\nTotal time in IfpackPreconditionerFactory = "<<totalTimer.totalElapsedTime()<<
" sec\n";
284 if(out.get() && implicit_cast<int>(verbLevel) > implicit_cast<int>(Teuchos::VERB_LOW))
285 *out <<
"\nLeaving Thyra::IfpackPreconditionerFactory::initializePrec(...) ...\n";
345 using Teuchos::rcp_implicit_cast;
346 typedef Teuchos::ParameterEntryValidator PEV;
347 static Teuchos::RCP<Teuchos::ParameterList> validParamList;
348 if(validParamList.get()==NULL) {
349 validParamList = Teuchos::rcp(
new Teuchos::ParameterList(Ifpack_name));
352 Teuchos::Array<std::string>
354 precTypeNames.insert(
355 precTypeNames.begin(),
359 Teuchos::Array<Ifpack::EPrecType>
361 precTypeValues.insert(
362 precTypeValues.begin(),
366 precTypeValidator = rcp(
367 new Teuchos::StringToIntegralParameterEntryValidator<Ifpack::EPrecType>(
368 precTypeNames,precTypeValues,PrecType_name
373 PrecType_name, PrecTypeName_default,
374 "Type of Ifpack preconditioner to use.",
375 rcp_implicit_cast<const PEV>(precTypeValidator)
378 Overlap_name, Overlap_default,
379 "Number of rows/columns overlapped between subdomains in different"
380 "\nprocesses in the additive Schwarz-type domain-decomposition preconditioners."
383 IfpackSettings_name, Ifpack_GetValidParameters(),
384 "Preconditioner settings that are passed onto the Ifpack preconditioners themselves."
391 Teuchos::setupVerboseObjectSublist(&*validParamList);
393 return validParamList;