47 #include "Teko_SolveInverseFactory.hpp"
50 #include "Thyra_DefaultLinearOpSource.hpp"
51 #include "Thyra_DefaultInverseLinearOp.hpp"
52 #include "Thyra_DefaultPreconditioner.hpp"
55 #include "Stratimikos_DefaultLinearSolverBuilder.hpp"
59 #include "Teko_BlockPreconditionerFactory.hpp"
60 #include "Teko_Preconditioner.hpp"
61 #include "Teko_PreconditionerLinearOp.hpp"
65 using Teuchos::rcp_const_cast;
66 using Teuchos::rcp_dynamic_cast;
79 SolveInverseFactory::SolveInverseFactory(
80 const Teuchos::RCP<Thyra::LinearOpWithSolveFactoryBase<double> >& lowsFactory)
81 : lowsFactory_(lowsFactory) {}
84 SolveInverseFactory::SolveInverseFactory(
const SolveInverseFactory& siFactory)
85 : lowsFactory_(siFactory.lowsFactory_) {}
96 InverseLinearOp SolveInverseFactory::buildInverse(
const LinearOp& linearOp)
const {
97 Teko_DEBUG_SCOPE(
"SolveInverseFactory::buildInverse(linearOp)", 10);
100 Teuchos::RCP<Thyra::LinearOpWithSolveBase<double> > invLOWS = lowsFactory_->createOp();
101 lowsFactory_->initializeOp(Thyra::defaultLinearOpSource(linearOp), &*invLOWS,
102 Thyra::SUPPORT_SOLVE_FORWARD_ONLY);
104 return Thyra::nonconstInverse<double>(invLOWS);
119 InverseLinearOp SolveInverseFactory::buildInverse(
const LinearOp& linearOp,
120 const LinearOp& precOp)
const {
121 Teko_DEBUG_SCOPE(
"SolveInverseFactory::buildInverse(linearOp,precOp)", 10);
124 Teuchos::RCP<Thyra::LinearOpWithSolveBase<double> > invLOWS = lowsFactory_->createOp();
125 lowsFactory_->initializePreconditionedOp(Thyra::defaultLinearOpSource(linearOp),
126 Thyra::unspecifiedPrec(precOp), &*invLOWS,
127 Thyra::SUPPORT_SOLVE_FORWARD_ONLY);
129 return Thyra::nonconstInverse<double>(invLOWS);
143 void SolveInverseFactory::rebuildInverse(
const LinearOp& source, InverseLinearOp& dest)
const {
144 RCP<Thyra::DefaultInverseLinearOp<double> > invDest =
145 rcp_dynamic_cast<Thyra::DefaultInverseLinearOp<double> >(dest);
146 RCP<Thyra::LinearOpWithSolveBase<double> > lows = invDest->getNonconstLows();
151 lowsFactory_->initializeOp(Thyra::defaultLinearOpSource(source), &*lows);
166 void SolveInverseFactory::rebuildInverse(
const LinearOp& source,
const LinearOp& precOp,
167 InverseLinearOp& dest)
const {
168 RCP<Thyra::DefaultInverseLinearOp<double> > invDest =
169 rcp_dynamic_cast<Thyra::DefaultInverseLinearOp<double> >(dest);
170 RCP<Thyra::LinearOpWithSolveBase<double> > lows = invDest->getNonconstLows();
173 lowsFactory_->initializePreconditionedOp(Thyra::defaultLinearOpSource(source),
174 Thyra::unspecifiedPrec(precOp), &*lows,
175 Thyra::SUPPORT_SOLVE_FORWARD_ONLY);
186 Teuchos::RCP<const Teuchos::ParameterList> SolveInverseFactory::getParameterList()
const {
187 return lowsFactory_->getParameterList();