10#ifndef Thyra_BlockedTriangularLinearOpWithSolveFactory_hpp
11#define Thyra_BlockedTriangularLinearOpWithSolveFactory_hpp
13#include "Thyra_LinearOpWithSolveBase.hpp"
14#include "Thyra_DefaultBlockedLinearOp.hpp"
15#include "Thyra_DefaultBlockedTriangularLinearOpWithSolve.hpp"
16#include "Thyra_LinearOpSourceBase.hpp"
17#include "Teuchos_Array.hpp"
61template <
class Scalar>
129 const std::string &precFactoryName);
138 std::string *precFactoryName);
140 virtual bool isCompatible(
const LinearOpSourceBase<Scalar> &fwdOpSrc)
const;
142 virtual RCP<LinearOpWithSolveBase<Scalar> >
createOp()
const;
145 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
147 const ESupportSolveUse supportSolveUse)
const;
150 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
155 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
157 RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
158 ESupportSolveUse *supportSolveUse)
const;
161 const EPreconditionerInputType precOpType)
const;
164 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
167 const ESupportSolveUse supportSolveUse)
const;
170 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
171 const RCP<
const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
173 const ESupportSolveUse supportSolveUse)
const;
186 typedef Teuchos::ConstNonconstObjectContainer<
200template <
class Scalar>
201RCP<BlockedTriangularLinearOpWithSolveFactory<Scalar> >
213template <
class Scalar>
214RCP<BlockedTriangularLinearOpWithSolveFactory<Scalar> >
224template <
class Scalar>
228 : lowsf_(lowsf.size())
230 for (Ordinal i = 0; i < lowsf.size(); ++i) {
232 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf[i]));
234 lowsf_[i].initialize(lowsf[i]);
238template <
class Scalar>
242 : lowsf_(lowsf.size())
244 for (Ordinal i = 0; i < lowsf.size(); ++i) {
246 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf[i]));
248 lowsf_[i].initialize(lowsf[i]);
252template <
class Scalar>
253Array<RCP<LinearOpWithSolveFactoryBase<Scalar> > >
256 Array<RCP<LinearOpWithSolveFactoryBase<Scalar> > > lowsf(lowsf_.size());
257 for (Ordinal i = 0; i < lowsf_.size(); ++i) {
258 lowsf[i] = lowsf_[i].getNonconstObj();
263template <
class Scalar>
264Array<RCP<const LinearOpWithSolveFactoryBase<Scalar> > >
267 Array<RCP<const LinearOpWithSolveFactoryBase<Scalar> > > lowsf(lowsf_.size());
268 for (Ordinal i = 0; i < lowsf_.size(); ++i) {
269 lowsf[i] = lowsf_[i].getConstObj();
276template <
class Scalar>
280 std::ostringstream oss;
281 oss << this->Teuchos::Describable::description() <<
"{";
282 for (Ordinal i = 0; i < lowsf_.size(); ++i) {
284 if (!is_null(lowsf_[i].getConstObj()))
285 oss << lowsf_[i].getConstObj()->description();
297template <
class Scalar>
299 RCP<ParameterList>
const ¶mList)
301 for (Ordinal i = 0; i < lowsf_.size(); ++i) {
302 lowsf_[i].getNonconstObj()->setParameterList(paramList);
306template <
class Scalar>
310 return lowsf_[0].getNonconstObj()->getNonconstParameterList();
313template <
class Scalar>
317 RCP<ParameterList> pl;
318 for (Ordinal i = 0; i < lowsf_.size(); ++i) {
319 pl = lowsf_[i].getNonconstObj()->unsetParameterList();
324template <
class Scalar>
325RCP<const ParameterList>
328 return lowsf_[0].getConstObj()->getParameterList();
331template <
class Scalar>
332RCP<const ParameterList>
335 return lowsf_[0].getConstObj()->getValidParameters();
340template <
class Scalar>
342 Scalar>::acceptsPreconditionerFactory()
const
347template <
class Scalar>
354 TEUCHOS_TEST_FOR_EXCEPTION(
355 true, std::logic_error,
356 "Error, we don't support a preconditioner factory!");
359template <
class Scalar>
360RCP<PreconditionerFactoryBase<Scalar> >
364 return Teuchos::null;
367template <
class Scalar>
374 TEUCHOS_TEST_FOR_EXCEPTION(
375 true, std::logic_error,
376 "Error, we don't support a preconditioner factory!");
379template <
class Scalar>
381 const LinearOpSourceBase<Scalar> &
384 TEUCHOS_TEST_FOR_EXCEPT(
true);
385 TEUCHOS_UNREACHABLE_RETURN(
false);
388template <
class Scalar>
389RCP<LinearOpWithSolveBase<Scalar> >
392 return defaultBlockedTriangularLinearOpWithSolve<Scalar>();
395template <
class Scalar>
397 const RCP<
const LinearOpSourceBase<Scalar> > &fwdOpSrc,
399 const ESupportSolveUse
402 using Teuchos::dyn_cast;
403 using Teuchos::rcp_dynamic_cast;
406 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
410 for (Ordinal i = 0; i < lowsf_.size(); ++i) {
411 lowsf_[i].getConstObj()->setOStream(this->getOStream());
412 lowsf_[i].getConstObj()->setVerbLevel(this->getVerbLevel());
416 typedef PhysicallyBlockedLinearOpBase<Scalar> PBLOB;
417 const RCP<const PBLOB> blo =
418 rcp_dynamic_cast<const PBLOB>(fwdOpSrc->getOp().assert_not_null());
423 typedef DefaultBlockedTriangularLinearOpWithSolve<Scalar> DBTLOWS;
424 DBTLOWS &btlows = dyn_cast<DBTLOWS>(*Op);
429 const bool firstTime = is_null(btlows.range());
434 btlows.beginBlockFill(blo->productRange(), blo->productDomain());
436 const int N = blo->productRange()->numBlocks();
437 for (
int k = 0; k < N; ++k) {
438 const RCP<const LinearOpBase<Scalar> > fwdOp_k =
439 blo->getBlock(k, k).assert_not_null();
443 btlows.setNonconstLOWSBlock(
444 k, k, linearOpWithSolve<Scalar>(*lowsf_[k].getConstObj(), fwdOp_k));
450 RCP<LinearOpWithSolveBase<Scalar> > invOp_k =
451 btlows.getNonconstLOWSBlock(k, k).assert_not_null();
452 Thyra::initializeOp<Scalar>(*lowsf_[k].getConstObj(), fwdOp_k,
459 if (firstTime) btlows.endBlockFill();
464 btlows.setBlocks(blo);
467 btlows.setOStream(this->getOStream());
468 btlows.setVerbLevel(this->getVerbLevel());
471template <
class Scalar>
473 const RCP<
const LinearOpSourceBase<Scalar> > & ,
477 TEUCHOS_TEST_FOR_EXCEPT(
true);
480template <
class Scalar>
483 RCP<
const LinearOpSourceBase<Scalar> > *fwdOpSrc,
485 RCP<
const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
489 using Teuchos::dyn_cast;
490 using Teuchos::rcp_dynamic_cast;
491 using Teuchos::rcp_implicit_cast;
492 typedef DefaultBlockedTriangularLinearOpWithSolve<Scalar> DBTLOWS;
493 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
494 DBTLOWS &btlowsOp = dyn_cast<DBTLOWS>(*Op);
496 const RCP<const LinearOpBase<Scalar> > fwdOp = btlowsOp.getBlocks();
498 *fwdOpSrc = defaultLinearOpSource<Scalar>(fwdOp);
500 *fwdOpSrc = Teuchos::null;
502 if (prec) *prec = Teuchos::null;
503 if (approxFwdOpSrc) *approxFwdOpSrc = Teuchos::null;
506template <
class Scalar>
509 const EPreconditionerInputType
520template <
class Scalar>
523 const RCP<
const LinearOpSourceBase<Scalar> > & ,
526 const ESupportSolveUse
529 TEUCHOS_TEST_FOR_EXCEPTION(
530 true, std::logic_error,
531 "Error, we don't support an external preconditioner!");
534template <
class Scalar>
537 const RCP<
const LinearOpSourceBase<Scalar> > & ,
538 const RCP<
const LinearOpSourceBase<Scalar> > & ,
540 const ESupportSolveUse
543 TEUCHOS_TEST_FOR_EXCEPTION(
544 true, std::logic_error,
545 "Error, we don't support an external preconditioner!");
550template <
class Scalar>
552 Scalar>::informUpdatedVerbosityState()
const
554 for (Ordinal i = 0; i < lowsf_.size(); ++i) {
555 lowsf_[i].getConstObj()->setVerbLevel(this->getVerbLevel());
556 lowsf_[i].getConstObj()->setOStream(this->getOStream());
Implicit subclass that takes a blocked triangular LOWB object and turns it into a LOWSB object.
BlockedTriangularLinearOpWithSolveFactory()
RCP< BlockedTriangularLinearOpWithSolveFactory< Scalar > > blockedTriangularLinearOpWithSolveFactory(const Array< RCP< const LinearOpWithSolveFactoryBase< Scalar > > > &lowsf)
Nonmember constructor.
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
RCP< const ParameterList > getParameterList() const
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
RCP< BlockedTriangularLinearOpWithSolveFactory< Scalar > > blockedTriangularLinearOpWithSolveFactory(const Array< RCP< LinearOpWithSolveFactoryBase< Scalar > > > &lowsf)
Nonmember constructor.
void setParameterList(RCP< ParameterList > const ¶mList)
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
virtual bool acceptsPreconditionerFactory() const
returns false.
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
virtual bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
Array< RCP< LinearOpWithSolveFactoryBase< Scalar > > > getUnderlyingLOWSF()
RCP< ParameterList > getNonconstParameterList()
std::string description() const
RCP< const ParameterList > getValidParameters() 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
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
RCP< ParameterList > unsetParameterList()
virtual void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.