42 #ifndef THYRA_DEFAULT_BLOCKED_TRIANGULAR_LINEAR_OP_WITH_SOLVE_FACTORY_HPP 43 #define THYRA_DEFAULT_BLOCKED_TRIANGULAR_LINEAR_OP_WITH_SOLVE_FACTORY_HPP 46 #include "Thyra_DefaultBlockedTriangularLinearOpWithSolveFactory_decl.hpp" 47 #include "Thyra_LinearOpWithSolveBase.hpp" 48 #include "Thyra_LinearOpWithSolveFactoryHelpers.hpp" 49 #include "Thyra_PhysicallyBlockedLinearOpBase.hpp" 50 #include "Thyra_PhysicallyBlockedLinearOpWithSolveBase.hpp" 51 #include "Thyra_DefaultBlockedTriangularLinearOpWithSolve.hpp" 52 #include "Thyra_DefaultLinearOpSource.hpp" 61 template<
class Scalar>
67 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
69 lowsf_.initialize(lowsf);
73 template<
class Scalar>
79 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
81 lowsf_.initialize(lowsf);
85 template<
class Scalar>
86 RCP<LinearOpWithSolveFactoryBase<Scalar> >
89 return lowsf_.getNonconstObj();
93 template<
class Scalar>
94 RCP<const LinearOpWithSolveFactoryBase<Scalar> >
97 return lowsf_.getConstObj();
104 template<
class Scalar>
108 std::ostringstream oss;
109 oss << this->Teuchos::Describable::description()
112 if (!is_null(lowsf_.getConstObj()))
113 oss << lowsf_.getConstObj()->description();
124 template<
class Scalar>
127 RCP<ParameterList>
const& paramList
130 lowsf_.getNonconstObj()->setParameterList(paramList);
134 template<
class Scalar>
138 return lowsf_.getNonconstObj()->getNonconstParameterList();
142 template<
class Scalar>
146 return lowsf_.getNonconstObj()->unsetParameterList();
150 template<
class Scalar>
151 RCP<const ParameterList>
154 return lowsf_.getConstObj()->getParameterList();
158 template<
class Scalar>
159 RCP<const ParameterList>
162 return lowsf_.getConstObj()->getValidParameters();
169 template<
class Scalar>
177 template<
class Scalar>
181 const std::string &precFactoryName
184 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
185 "Error, we don't support a preconditioner factory!");
189 template<
class Scalar>
190 RCP<PreconditionerFactoryBase<Scalar> >
193 return Teuchos::null;
197 template<
class Scalar>
200 std::string *precFactoryName
203 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
204 "Error, we don't support a preconditioner factory!");
208 template<
class Scalar>
214 TEUCHOS_TEST_FOR_EXCEPT(
true);
219 template<
class Scalar>
220 RCP<LinearOpWithSolveBase<Scalar> >
223 return defaultBlockedTriangularLinearOpWithSolve<Scalar>();
227 template<
class Scalar>
236 using Teuchos::dyn_cast;
237 using Teuchos::rcp_dynamic_cast;
240 TEUCHOS_TEST_FOR_EXCEPT(0==Op);
244 lowsf_.getConstObj()->setOStream(this->getOStream());
245 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
249 const RCP<const PBLOB> blo =
250 rcp_dynamic_cast<
const PBLOB>(fwdOpSrc->getOp().assert_not_null());
256 DBTLOWS &btlows = dyn_cast<DBTLOWS>(*Op);
261 const bool firstTime = is_null(btlows.range());
268 const int N = blo->productRange()->numBlocks();
269 for (
int k = 0; k < N; ++k ) {
270 const RCP<const LinearOpBase<Scalar> > fwdOp_k =
271 blo->getBlock(k,k).assert_not_null();
275 btlows.setNonconstLOWSBlock( k, k,
276 linearOpWithSolve<Scalar>(*lowsf_.getConstObj(),fwdOp_k)
283 RCP<LinearOpWithSolveBase<Scalar> >
284 invOp_k = btlows.getNonconstLOWSBlock(k,k).assert_not_null();
285 Thyra::initializeOp<Scalar>(*lowsf_.getConstObj(), fwdOp_k, invOp_k.ptr());
292 btlows.endBlockFill();
297 btlows.setBlocks(blo);
300 btlows.setOStream(this->getOStream());
301 btlows.setVerbLevel(this->getVerbLevel());
306 template<
class Scalar>
313 TEUCHOS_TEST_FOR_EXCEPT(
true);
317 template<
class Scalar>
327 using Teuchos::dyn_cast;
328 using Teuchos::rcp_implicit_cast;
329 using Teuchos::rcp_dynamic_cast;
331 TEUCHOS_TEST_FOR_EXCEPT(0==Op);
332 DBTLOWS &btlowsOp = dyn_cast<DBTLOWS>(*Op);
334 const RCP<const LinearOpBase<Scalar> > fwdOp = btlowsOp.getBlocks();
336 *fwdOpSrc = defaultLinearOpSource<Scalar>(fwdOp);
338 *fwdOpSrc = Teuchos::null;
340 if (prec) *prec = Teuchos::null;
341 if (approxFwdOpSrc) *approxFwdOpSrc = Teuchos::null;
345 template<
class Scalar>
360 template<
class Scalar>
369 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
370 "Error, we don't support an external preconditioner!");
374 template<
class Scalar>
383 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
384 "Error, we don't support an external preconditioner!");
391 template<
class Scalar>
395 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
396 lowsf_.getConstObj()->setOStream(this->getOStream());
403 #endif // THYRA_DEFAULT_BLOCKED_TRIANGULAR_LINEAR_OP_WITH_SOLVE_FACTORY_HPP virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
Base class for all linear operators that can support a high-level solve operation.
virtual bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
Concrete composite LinearOpWithSolveBase subclass that creates single upper or lower block triangular...
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
Simple interface class to access a precreated preconditioner as one or more linear operators objects ...
std::string description() const
Implicit subclass that takes a blocked triangular LOWB object and turns it into a LOWSB object...
RCP< ParameterList > getNonconstParameterList()
virtual bool acceptsPreconditionerFactory() const
returns false.
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
RCP< const ParameterList > getValidParameters() const
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
Factory interface for creating LinearOpWithSolveBase objects from compatible LinearOpBase objects...
RCP< LinearOpWithSolveFactoryBase< Scalar > > getUnderlyingLOWSF()
RCP< const ParameterList > getParameterList() const
Base interface for physically blocked linear operators.
Factory interface for creating preconditioner objects from LinearOpBase objects.
Base interface for objects that can return a linear operator.
ESupportSolveUse
Enum that specifies how a LinearOpWithSolveBase object will be used for solves after it is constructe...
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.
virtual void uninitializeOp(LinearOpWithSolveBase< Scalar > *Op, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc, RCP< const PreconditionerBase< Scalar > > *prec, RCP< const LinearOpSourceBase< Scalar > > *approxFwdOpSrc, ESupportSolveUse *supportSolveUse) const
virtual void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
EPreconditionerInputType
Enum defining the status of a preconditioner object.
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
void setParameterList(RCP< ParameterList > const ¶mList)
RCP< ParameterList > unsetParameterList()