110 const Teuchos::RCP<
const Thyra::LinearOpSourceBase<double> > &fwdOpSrc,
111 Thyra::PreconditionerBase<double> *prec,
112 const Thyra::ESupportSolveUse )
const {
113 using Teuchos::implicit_cast;
116 using Teuchos::rcp_dynamic_cast;
117 using Thyra::LinearOpBase;
119 Teuchos::Time totalTimer(
""), timer(
"");
120 totalTimer.start(
true);
122 const RCP<Teuchos::FancyOStream> out = this->getOStream();
123 const Teuchos::EVerbosityLevel verbLevel = this->getVerbLevel();
125 bool mediumVerbosity =
126 (out.get() && implicit_cast<int>(verbLevel) > implicit_cast<int>(Teuchos::VERB_LOW));
128 Teuchos::OSTab tab(out);
130 *out <<
"\nEntering Teko::StratimikosFactory::initializePrec_Thyra(...) ...\n";
132 Teuchos::RCP<const LinearOpBase<double> > fwdOp = fwdOpSrc->getOp();
135 StratimikosFactoryPreconditioner &defaultPrec =
136 Teuchos::dyn_cast<StratimikosFactoryPreconditioner>(*prec);
137 Teuchos::RCP<LinearOpBase<double> > prec_Op = defaultPrec.getNonconstUnspecifiedPrecOp();
140 const bool startingOver = (prec_Op == Teuchos::null);
142 invLib_ = Teuchos::null;
143 invFactory_ = Teuchos::null;
145 if (mediumVerbosity) *out <<
"\nCreating the initial Teko Operator object...\n";
150 invLib_ = Teko::InverseLibrary::buildFromParameterList(
151 paramList_->sublist(
"Inverse Factory Library"), builder_);
152 invLib_->setRequestHandler(reqHandler_);
155 invFactory_ = invLib_->getInverseFactory(paramList_->get<std::string>(
"Inverse Type"));
159 Teuchos::OSTab(out).o() <<
"> Creation time = " << timer.totalElapsedTime() <<
" sec\n";
162 if (mediumVerbosity) *out <<
"\nComputing the preconditioner ...\n";
167 std::stringstream ss;
168 ss << paramList_->get<std::string>(
"Strided Blocking",
"1");
174 TEUCHOS_ASSERT(num > 0);
175 decomp_.push_back(num);
179 if (decomp_.empty()) decomp_.push_back(1);
182 std::string reorderType = paramList_->get<std::string>(
"Reorder Type");
185 if (decomp_.size() == 1) {
186 if (reorderType !=
"") {
187 Teuchos::RCP<const Thyra::BlockedLinearOpBase<double> > blkFwdOp =
188 Teuchos::rcp_dynamic_cast<const Thyra::BlockedLinearOpBase<double> >(fwdOp,
true);
191 Teko::LinearOp blockedFwdOp = Teko::buildReorderedLinearOp(*brm, blkFwdOp);
193 if (prec_Op == Teuchos::null) {
194 Teko::ModifiableLinearOp reorderedPrec =
Teko::buildInverse(*invFactory_, blockedFwdOp);
197 Teko::ModifiableLinearOp reorderedPrec =
198 Teuchos::rcp_dynamic_cast<ReorderedLinearOp>(prec_Op,
true)->getBlockedOp();
202 if (prec_Op == Teuchos::null)
212 RCP<const Thyra::TpetraLinearOp<ST, LO, GO, NT> > tpetraThyraOp =
213 rcp_dynamic_cast<const Thyra::TpetraLinearOp<ST, LO, GO, NT> >(fwdOp,
true);
214 RCP<const Tpetra::Operator<ST, LO, GO, NT> > tpetraOp = tpetraThyraOp->getConstTpetraOperator();
217 std::vector<std::vector<GO> > vars;
219 const auto rangeMap = tpetraOp->getRangeMap();
222 for (std::size_t i = 0; i < decomp_.size(); i++) numVars += decomp_[i];
224 TEUCHOS_ASSERT((rangeMap->getLocalNumElements() % numVars) == 0);
225 TEUCHOS_ASSERT((rangeMap->getGlobalNumElements() % numVars) == 0);
227 vars.resize(decomp_.size());
229 const LO numMyElts = rangeMap->getLocalNumElements();
231 while (i < numMyElts) {
232 for (std::size_t d = 0; d < decomp_.size(); d++) {
233 const int current = decomp_[d];
234 for (
int v = 0; v < current; v++, i++) {
235 vars[d].push_back(rangeMap->getGlobalElement(i));
242 Teuchos::RCP<Teko::TpetraHelpers::BlockedTpetraOperator> wrappedFwdOp =
246 if (reorderType !=
"") {
248 wrappedFwdOp->Reorder(*brm);
252 Teuchos::RCP<Teko::TpetraHelpers::InverseFactoryOperator> teko_precOp =
254 teko_precOp->initInverse(
true);
255 teko_precOp->buildInverseOperator(
256 Teuchos::rcp_dynamic_cast<Tpetra::Operator<ST, LO, GO, NT> >(wrappedFwdOp));
258 prec_Op = Thyra::tpetraLinearOp<double, LO, GO, NT>(
259 Thyra::tpetraVectorSpace<double, LO, GO, NT>(teko_precOp->getRangeMap()),
260 Thyra::tpetraVectorSpace<double, LO, GO, NT>(teko_precOp->getDomainMap()),
261 Teuchos::rcp_dynamic_cast<Tpetra::Operator<ST, LO, GO, NT> >(teko_precOp));
265 Teuchos::OSTab(out).o() <<
"> Blocked Tpetra construction time = " << timer.totalElapsedTime()
269 if (mediumVerbosity) *out <<
"\nFinished computing the preconditioner ...\n";
271 defaultPrec.initializeUnspecified(prec_Op);
272 defaultPrec.incrIter();
275 if (out.get() && implicit_cast<int>(verbLevel) >= implicit_cast<int>(Teuchos::VERB_LOW))
276 *out <<
"\nTotal time in Teko::StratimikosFactory = " << totalTimer.totalElapsedTime()
279 *out <<
"\nLeaving Teko::StratimikosFactory::initializePrec_Thyra(...) ...\n";