9 #ifndef Thyra_BlockedTriangularLinearOpWithSolveFactory_hpp
10 #define Thyra_BlockedTriangularLinearOpWithSolveFactory_hpp
12 #include "Thyra_LinearOpWithSolveBase.hpp"
13 #include "Thyra_DefaultBlockedLinearOp.hpp"
14 #include "Thyra_DefaultBlockedTriangularLinearOpWithSolve.hpp"
15 #include "Thyra_LinearOpSourceBase.hpp"
60 template <
class Scalar>
128 const std::string &precFactoryName);
137 std::string *precFactoryName);
141 virtual RCP<LinearOpWithSolveBase<Scalar> >
createOp()
const;
199 template <
class Scalar>
200 RCP<BlockedTriangularLinearOpWithSolveFactory<Scalar> >
212 template <
class Scalar>
213 RCP<BlockedTriangularLinearOpWithSolveFactory<Scalar> >
223 template <
class Scalar>
227 : lowsf_(lowsf.size())
229 for (
Ordinal i = 0; i < lowsf.size(); ++i) {
233 lowsf_[i].initialize(lowsf[i]);
237 template <
class Scalar>
241 : lowsf_(lowsf.size())
243 for (
Ordinal i = 0; i < lowsf.size(); ++i) {
247 lowsf_[i].initialize(lowsf[i]);
251 template <
class Scalar>
252 Array<RCP<LinearOpWithSolveFactoryBase<Scalar> > >
255 Array<RCP<LinearOpWithSolveFactoryBase<Scalar> > > lowsf(lowsf_.size());
256 for (
Ordinal i = 0; i < lowsf_.size(); ++i) {
257 lowsf[i] = lowsf_[i].getNonconstObj();
262 template <
class Scalar>
263 Array<RCP<const LinearOpWithSolveFactoryBase<Scalar> > >
266 Array<RCP<const LinearOpWithSolveFactoryBase<Scalar> > > lowsf(lowsf_.size());
267 for (
Ordinal i = 0; i < lowsf_.size(); ++i) {
268 lowsf[i] = lowsf_[i].getConstObj();
275 template <
class Scalar>
279 std::ostringstream oss;
281 for (
Ordinal i = 0; i < lowsf_.size(); ++i) {
283 if (!
is_null(lowsf_[i].getConstObj()))
284 oss << lowsf_[i].getConstObj()->description();
296 template <
class Scalar>
298 RCP<ParameterList>
const ¶mList)
300 for (
Ordinal i = 0; i < lowsf_.size(); ++i) {
301 lowsf_[i].getNonconstObj()->setParameterList(paramList);
305 template <
class Scalar>
309 return lowsf_[0].getNonconstObj()->getNonconstParameterList();
312 template <
class Scalar>
316 RCP<ParameterList> pl;
317 for (
Ordinal i = 0; i < lowsf_.size(); ++i) {
318 pl = lowsf_[i].getNonconstObj()->unsetParameterList();
323 template <
class Scalar>
324 RCP<const ParameterList>
327 return lowsf_[0].getConstObj()->getParameterList();
330 template <
class Scalar>
331 RCP<const ParameterList>
334 return lowsf_[0].getConstObj()->getValidParameters();
339 template <
class Scalar>
341 Scalar>::acceptsPreconditionerFactory()
const
346 template <
class Scalar>
354 true, std::logic_error,
355 "Error, we don't support a preconditioner factory!");
358 template <
class Scalar>
359 RCP<PreconditionerFactoryBase<Scalar> >
363 return Teuchos::null;
366 template <
class Scalar>
374 true, std::logic_error,
375 "Error, we don't support a preconditioner factory!");
378 template <
class Scalar>
387 template <
class Scalar>
388 RCP<LinearOpWithSolveBase<Scalar> >
391 return defaultBlockedTriangularLinearOpWithSolve<Scalar>();
394 template <
class Scalar>
402 using Teuchos::rcp_dynamic_cast;
409 for (
Ordinal i = 0; i < lowsf_.size(); ++i) {
410 lowsf_[i].getConstObj()->setOStream(this->getOStream());
411 lowsf_[i].getConstObj()->setVerbLevel(this->getVerbLevel());
416 const RCP<const PBLOB> blo =
417 rcp_dynamic_cast<
const PBLOB>(fwdOpSrc->getOp().assert_not_null());
423 DBTLOWS &btlows =
dyn_cast<DBTLOWS>(*Op);
428 const bool firstTime =
is_null(btlows.range());
433 btlows.beginBlockFill(blo->productRange(), blo->productDomain());
435 const int N = blo->productRange()->numBlocks();
436 for (
int k = 0; k < N; ++k) {
437 const RCP<const LinearOpBase<Scalar> > fwdOp_k =
438 blo->getBlock(k, k).assert_not_null();
442 btlows.setNonconstLOWSBlock(
443 k, k, linearOpWithSolve<Scalar>(*lowsf_[k].getConstObj(), fwdOp_k));
449 RCP<LinearOpWithSolveBase<Scalar> > invOp_k =
450 btlows.getNonconstLOWSBlock(k, k).assert_not_null();
451 Thyra::initializeOp<Scalar>(*lowsf_[k].getConstObj(), fwdOp_k,
458 if (firstTime) btlows.endBlockFill();
463 btlows.setBlocks(blo);
466 btlows.setOStream(this->getOStream());
467 btlows.setVerbLevel(this->getVerbLevel());
470 template <
class Scalar>
479 template <
class Scalar>
489 using Teuchos::rcp_dynamic_cast;
490 using Teuchos::rcp_implicit_cast;
493 DBTLOWS &btlowsOp =
dyn_cast<DBTLOWS>(*Op);
495 const RCP<const LinearOpBase<Scalar> > fwdOp = btlowsOp.getBlocks();
497 *fwdOpSrc = defaultLinearOpSource<Scalar>(fwdOp);
499 *fwdOpSrc = Teuchos::null;
501 if (prec) *prec = Teuchos::null;
502 if (approxFwdOpSrc) *approxFwdOpSrc = Teuchos::null;
505 template <
class Scalar>
519 template <
class Scalar>
529 true, std::logic_error,
530 "Error, we don't support an external preconditioner!");
533 template <
class Scalar>
543 true, std::logic_error,
544 "Error, we don't support an external preconditioner!");
549 template <
class Scalar>
551 Scalar>::informUpdatedVerbosityState()
const
553 for (
Ordinal i = 0; i < lowsf_.size(); ++i) {
554 lowsf_[i].getConstObj()->setVerbLevel(this->getVerbLevel());
555 lowsf_[i].getConstObj()->setOStream(this->getOStream());
561 #endif // Thyra_BlockedTriangularLinearOpWithSolveFactory_hpp
bool is_null(const boost::shared_ptr< T > &p)
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
RCP< const ParameterList > getParameterList() const
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
BlockedTriangularLinearOpWithSolveFactory()
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
RCP< ParameterList > getNonconstParameterList()
T_To & dyn_cast(T_From &from)
RCP< BlockedTriangularLinearOpWithSolveFactory< Scalar > > blockedTriangularLinearOpWithSolveFactory(const Array< RCP< const LinearOpWithSolveFactoryBase< Scalar > > > &lowsf)
Nonmember constructor.
RCP< ParameterList > unsetParameterList()
virtual bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
virtual void uninitializeOp(LinearOpWithSolveBase< Scalar > *Op, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc, RCP< const PreconditionerBase< Scalar > > *prec, RCP< const LinearOpSourceBase< Scalar > > *approxFwdOpSrc, ESupportSolveUse *supportSolveUse) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
RCP< const ParameterList > getValidParameters() const
virtual bool acceptsPreconditionerFactory() const
returns false.
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
virtual std::string description() const
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
Array< RCP< LinearOpWithSolveFactoryBase< Scalar > > > getUnderlyingLOWSF()
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
void setParameterList(RCP< ParameterList > const ¶mList)
virtual void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
RCP< BlockedTriangularLinearOpWithSolveFactory< Scalar > > blockedTriangularLinearOpWithSolveFactory(const Array< RCP< LinearOpWithSolveFactoryBase< Scalar > > > &lowsf)
Nonmember constructor.
Implicit subclass that takes a blocked triangular LOWB object and turns it into a LOWSB object...
std::string description() const