Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Thyra_MultiVectorLinearOpWithSolveFactory.hpp
Go to the documentation of this file.
1//@HEADER
2// *****************************************************************************
3// Tempus: Time Integration and Sensitivity Analysis Package
4//
5// Copyright 2017 NTESS and the Tempus contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8//@HEADER
9
10#ifndef Thyra_MultiVectorLinearOpWithSolveFactory_hpp
11#define Thyra_MultiVectorLinearOpWithSolveFactory_hpp
12
13#include "Thyra_LinearOpWithSolveFactoryBase.hpp"
17#include "Thyra_DefaultMultiVectorLinearOpWithSolve.hpp"
18#include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
19#include "Thyra_DefaultLinearOpSource.hpp"
20
21namespace Thyra {
22
25template <class Scalar>
27 : virtual public LinearOpWithSolveFactoryBase<Scalar> {
28 public:
31
34
48 const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
49 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
50 &multiVecRange,
51 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
52 &multiVecDomain);
53
66 void initialize(const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
67 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
68 &multiVecRange,
69 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
70 &multiVecDomain);
71
72 RCP<LinearOpWithSolveFactoryBase<Scalar> > getUnderlyingLOWSF();
73
74 RCP<const LinearOpWithSolveFactoryBase<Scalar> > getUnderlyingLOWSF() const;
75
77
80
81 std::string description() const;
82
84
88
89 void setParameterList(RCP<ParameterList> const &paramList);
90 RCP<ParameterList> getNonconstParameterList();
91 RCP<ParameterList> unsetParameterList();
92 RCP<const ParameterList> getParameterList() const;
93 RCP<const ParameterList> getValidParameters() const;
94
96
99
101 virtual bool acceptsPreconditionerFactory() const;
102
104 virtual void setPreconditionerFactory(
105 const RCP<PreconditionerFactoryBase<Scalar> > &precFactory,
106 const std::string &precFactoryName);
107
109 virtual RCP<PreconditionerFactoryBase<Scalar> > getPreconditionerFactory()
110 const;
111
113 virtual void unsetPreconditionerFactory(
114 RCP<PreconditionerFactoryBase<Scalar> > *precFactory,
115 std::string *precFactoryName);
116
117 virtual bool isCompatible(const LinearOpSourceBase<Scalar> &fwdOpSrc) const;
118
119 virtual RCP<LinearOpWithSolveBase<Scalar> > createOp() const;
120
121 virtual void initializeOp(
122 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
124 const ESupportSolveUse supportSolveUse) const;
125
126 virtual void initializeAndReuseOp(
127 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
129
130 virtual void uninitializeOp(
132 RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc,
133 RCP<const PreconditionerBase<Scalar> > *prec,
134 RCP<const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
135 ESupportSolveUse *supportSolveUse) const;
136
138 const EPreconditionerInputType precOpType) const;
139
140 virtual void initializePreconditionedOp(
141 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
142 const RCP<const PreconditionerBase<Scalar> > &prec,
144 const ESupportSolveUse supportSolveUse) const;
145
147 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
148 const RCP<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
150 const ESupportSolveUse supportSolveUse) const;
151
153
154 protected:
157
158 void informUpdatedVerbosityState() const;
159
161
162 private:
163 typedef Teuchos::ConstNonconstObjectContainer<
166
168 RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecRange_;
169 RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecDomain_;
170};
171
176template <class Scalar>
177RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
179 const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
180 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
181 &multiVecRange,
182 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
183 &multiVecDomain)
184{
185 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> > mvlowsf =
187 mvlowsf->nonconstInitialize(lowsf, multiVecRange, multiVecDomain);
188 return mvlowsf;
189}
190
195template <class Scalar>
196RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
198 const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
199 const int num_blocks)
200{
201 RCP<LinearOpWithSolveBase<Scalar> > op = lowsf->createOp();
202 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
203 Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
204 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
205 Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
206 return nonconstMultiVectorLinearOpWithSolveFactory(lowsf, mv_range,
207 mv_domain);
208}
209
214template <class Scalar>
215RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
217 const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
218 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
219 &multiVecRange,
220 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
221 &multiVecDomain)
222{
223 RCP<MultiVectorLinearOpWithSolveFactory<Scalar> > mvlowsf =
225 mvlowsf->initialize(lowsf, multiVecRange, multiVecDomain);
226 return mvlowsf;
227}
228
233template <class Scalar>
234RCP<MultiVectorLinearOpWithSolveFactory<Scalar> >
236 const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
237 const int num_blocks)
238{
239 RCP<LinearOpWithSolveBase<Scalar> > op = lowsf->createOp();
240 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_domain =
241 Thyra::multiVectorProductVectorSpace(op->domain(), num_blocks);
242 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar> > mv_range =
243 Thyra::multiVectorProductVectorSpace(op->range(), num_blocks);
244 return multiVectorLinearOpWithSolveFactory(lowsf, mv_range, mv_domain);
245}
246
247// Overridden from Constructors/Initializers/Accessors
248
249template <class Scalar>
251 const RCP<LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
252 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
253 &multiVecRange,
254 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
255 &multiVecDomain)
256{
257#ifdef TEUCHOS_DEBUG
258 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
259#endif
260 lowsf_.initialize(lowsf);
261 multiVecRange_ = multiVecRange;
262 multiVecDomain_ = multiVecDomain;
263}
264
265template <class Scalar>
267 const RCP<const LinearOpWithSolveFactoryBase<Scalar> > &lowsf,
268 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
269 &multiVecRange,
270 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
271 &multiVecDomain)
272{
273#ifdef TEUCHOS_DEBUG
274 TEUCHOS_TEST_FOR_EXCEPT(is_null(lowsf));
275#endif
276 lowsf_.initialize(lowsf);
277 multiVecRange_ = multiVecRange;
278 multiVecDomain_ = multiVecDomain;
279}
280
281template <class Scalar>
282RCP<LinearOpWithSolveFactoryBase<Scalar> >
284{
285 return lowsf_.getNonconstObj();
286}
287
288template <class Scalar>
289RCP<const LinearOpWithSolveFactoryBase<Scalar> >
291{
292 return lowsf_.getConstObj();
293}
294
295// Overridden from Teuchos::Describable
296
297template <class Scalar>
299{
300 std::ostringstream oss;
301 oss << this->Teuchos::Describable::description() << "{"
302 << "lowsf=";
303 if (!is_null(lowsf_.getConstObj()))
304 oss << lowsf_.getConstObj()->description();
305 else
306 oss << "NULL";
307 oss << "}";
308 return oss.str();
309}
310
311// Overridden from ParameterListAcceptor
312
313template <class Scalar>
315 RCP<ParameterList> const &paramList)
316{
317 lowsf_.getNonconstObj()->setParameterList(paramList);
318}
319
320template <class Scalar>
321RCP<ParameterList>
323{
324 return lowsf_.getNonconstObj()->getNonconstParameterList();
325}
326
327template <class Scalar>
328RCP<ParameterList>
330{
331 return lowsf_.getNonconstObj()->unsetParameterList();
332}
333
334template <class Scalar>
335RCP<const ParameterList>
337{
338 return lowsf_.getConstObj()->getParameterList();
339}
340
341template <class Scalar>
342RCP<const ParameterList>
344{
345 return lowsf_.getConstObj()->getValidParameters();
346}
347
348// Overridden from LinearOpWithSolveFactoyBase
349
350template <class Scalar>
352 const
353{
354 return lowsf_.getConstObj()->acceptsPreconditionerFactory();
355}
356
357template <class Scalar>
359 const RCP<PreconditionerFactoryBase<Scalar> > &precFactory,
360 const std::string &precFactoryName)
361{
363 RCP<MVPF> mvpf = Teuchos::rcp_dynamic_cast<MVPF>(precFactory);
364 lowsf_.getNonconstObj()->setPreconditionerFactory(
365 mvpf->getNonconstPreconditionerFactory(), precFactoryName);
366}
367
368template <class Scalar>
369RCP<PreconditionerFactoryBase<Scalar> >
371{
372 RCP<PreconditionerFactoryBase<Scalar> > prec_fac =
373 lowsf_.getConstObj()->getPreconditionerFactory();
374 if (prec_fac == Teuchos::null)
375 return Teuchos::null;
376 else
377 return nonconstMultiVectorPreconditionerFactory(prec_fac, multiVecRange_,
378 multiVecDomain_);
379}
380
381template <class Scalar>
383 RCP<PreconditionerFactoryBase<Scalar> > *precFactory,
384 std::string *precFactoryName)
385{
386 RCP<PreconditionerFactoryBase<Scalar> > inner_precFactory;
387 lowsf_.getNonconstObj()->unsetPreconditionerFactory(
388 precFactory ? &inner_precFactory : NULL, precFactoryName);
389 if (precFactory)
390 *precFactory = nonconstMultiVectorPreconditionerFactory(
391 inner_precFactory, multiVecRange_, multiVecDomain_);
392}
393
394template <class Scalar>
396 const LinearOpSourceBase<Scalar> &fwdOpSrc) const
397{
398 typedef MultiVectorLinearOp<Scalar> MVLO;
399 RCP<const MVLO> mvlo =
400 Teuchos::rcp_dynamic_cast<const MVLO>(fwdOpSrc.getOp().assert_not_null());
401 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc =
402 defaultLinearOpSource<Scalar>(mvlo->getLinearOp());
403 return lowsf_.getConstObj()->isCompatible(*inner_fwdOpSrc);
404}
405
406template <class Scalar>
407RCP<LinearOpWithSolveBase<Scalar> >
409{
410 return nonconstMultiVectorLinearOpWithSolve<Scalar>(
411 lowsf_.getConstObj()->createOp(), multiVecRange_, multiVecDomain_);
412}
413
414template <class Scalar>
416 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
418 const ESupportSolveUse supportSolveUse) const
419{
420 using Teuchos::dyn_cast;
421 using Teuchos::rcp_dynamic_cast;
422
423#ifdef TEUCHOS_DEBUG
424 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
425#endif
426
427 // Set the verbosity settings for the wrapped LOWSF object!
428 lowsf_.getConstObj()->setOStream(this->getOStream());
429 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
430
431 typedef MultiVectorLinearOp<Scalar> MVLO;
432 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
433 const RCP<const MVLO> mvlo =
434 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
435 MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
436
437 lowsf_.getConstObj()->initializeOp(
438 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
439 mvlows.getNonconstLinearOpWithSolve().get(), supportSolveUse);
440}
441
442template <class Scalar>
444 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
446{
447 using Teuchos::dyn_cast;
448 using Teuchos::rcp_dynamic_cast;
449
450#ifdef TEUCHOS_DEBUG
451 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
452#endif
453
454 // Set the verbosity settings for the wrapped LOWSF object!
455 lowsf_.getConstObj()->setOStream(this->getOStream());
456 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
457
458 typedef MultiVectorLinearOp<Scalar> MVLO;
459 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
460 const RCP<const MVLO> mvlo =
461 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
462 MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
463
464 lowsf_.getConstObj()->initializeAndReuseOp(
465 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
466 mvlows.getNonconstLinearOpWithSolve().get());
467}
468
469template <class Scalar>
472 RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc,
473 RCP<const PreconditionerBase<Scalar> > *prec,
474 RCP<const LinearOpSourceBase<Scalar> > *approxFwdOpSrc,
475 ESupportSolveUse *supportSolveUse) const
476{
477 using Teuchos::dyn_cast;
478
479#ifdef TEUCHOS_DEBUG
480 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
481#endif
482 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
483 MVLOWS &mvlowsOp = dyn_cast<MVLOWS>(*Op);
484 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
485 RCP<const PreconditionerBase<Scalar> > inner_prec;
486 RCP<const LinearOpSourceBase<Scalar> > inner_approxFwdOpSrc;
487 lowsf_.getConstObj()->uninitializeOp(
488 mvlowsOp.getNonconstLinearOpWithSolve().get(),
489 fwdOpSrc ? &inner_fwdOpSrc : NULL, prec ? &inner_prec : NULL,
490 approxFwdOpSrc ? &inner_approxFwdOpSrc : NULL, supportSolveUse);
491 if (fwdOpSrc)
492 *fwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
493 inner_fwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
494 if (prec)
495 *prec =
496 multiVectorPreconditioner(inner_prec, multiVecRange_, multiVecDomain_);
497 if (fwdOpSrc)
498 *approxFwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
499 inner_approxFwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
500}
501
502template <class Scalar>
504 Scalar>::supportsPreconditionerInputType(const EPreconditionerInputType
505 precOpType) const
506{
507 return lowsf_.getConstObj()->supportsPreconditionerInputType(precOpType);
508}
509
510template <class Scalar>
512 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
513 const RCP<const PreconditionerBase<Scalar> > &prec,
515 const ESupportSolveUse supportSolveUse) const
516{
517 using Teuchos::dyn_cast;
518 using Teuchos::rcp_dynamic_cast;
519
520#ifdef TEUCHOS_DEBUG
521 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
522#endif
523
524 // Set the verbosity settings for the wrapped LOWSF object!
525 lowsf_.getConstObj()->setOStream(this->getOStream());
526 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
527
528 typedef MultiVectorLinearOp<Scalar> MVLO;
530 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
531 const RCP<const MVLO> mvlo =
532 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
533 const RCP<const MVP> mvp = rcp_dynamic_cast<const MVP>(prec);
534 MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
535
536 lowsf_.getConstObj()->initializePreconditionedOp(
537 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
538 mvp->getPreconditioner(), mvlows.getNonconstLinearOpWithSolve().get(),
539 supportSolveUse);
540}
541
542template <class Scalar>
545 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
546 const RCP<const LinearOpSourceBase<Scalar> > &approxFwdOpSrc,
548 const ESupportSolveUse supportSolveUse) const
549{
550 using Teuchos::dyn_cast;
551 using Teuchos::rcp_dynamic_cast;
552
553#ifdef TEUCHOS_DEBUG
554 TEUCHOS_TEST_FOR_EXCEPT(0 == Op);
555#endif
556
557 // Set the verbosity settings for the wrapped LOWSF object!
558 lowsf_.getConstObj()->setOStream(this->getOStream());
559 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
560
561 typedef MultiVectorLinearOp<Scalar> MVLO;
562 typedef DefaultMultiVectorLinearOpWithSolve<Scalar> MVLOWS;
563 const RCP<const MVLO> mvlo =
564 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
565 const RCP<const MVLO> amvlo =
566 rcp_dynamic_cast<const MVLO>(approxFwdOpSrc->getOp().assert_not_null());
567 MVLOWS &mvlows = dyn_cast<MVLOWS>(*Op);
568
569 lowsf_.getConstObj()->initializeApproxPreconditionedOp(
570 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
571 defaultLinearOpSource<Scalar>(amvlo->getLinearOp()),
572 mvlows.getNonconstLinearOpWithSolve().get(), supportSolveUse);
573}
574
575// protected
576
577template <class Scalar>
579 const
580{
581 lowsf_.getConstObj()->setVerbLevel(this->getVerbLevel());
582 lowsf_.getConstObj()->setOStream(this->getOStream());
583}
584
585} // namespace Thyra
586
587#endif
Create a LinearOpWithSolveFactory for a flattened-out multi-vector.
void informUpdatedVerbosityState() const
Overridden from Teuchos::VerboseObjectBase.
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > nonconstMultiVectorLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const int num_blocks)
Nonmember constructor.
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > multiVectorLinearOpWithSolveFactory(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const int num_blocks)
Nonmember constructor.
virtual void initializeOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
Teuchos::ConstNonconstObjectContainer< LinearOpWithSolveFactoryBase< Scalar > > LOWSF_t
virtual void unsetPreconditionerFactory(RCP< PreconditionerFactoryBase< Scalar > > *precFactory, std::string *precFactoryName)
Throws exception.
void initialize(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Initialize given a single const LOWSFB object.
RCP< LinearOpWithSolveFactoryBase< Scalar > > getUnderlyingLOWSF()
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
virtual void initializeAndReuseOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, LinearOpWithSolveBase< Scalar > *Op) const
virtual bool supportsPreconditionerInputType(const EPreconditionerInputType precOpType) const
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > nonconstMultiVectorLinearOpWithSolveFactory(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor.
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
virtual RCP< LinearOpWithSolveBase< Scalar > > createOp() const
virtual void initializeApproxPreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const LinearOpSourceBase< Scalar > > &approxFwdOpSrc, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
virtual RCP< PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
Returns null .
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 bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
RCP< MultiVectorLinearOpWithSolveFactory< Scalar > > multiVectorLinearOpWithSolveFactory(const RCP< const LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor.
virtual void initializePreconditionedOp(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, const RCP< const PreconditionerBase< Scalar > > &prec, LinearOpWithSolveBase< Scalar > *Op, const ESupportSolveUse supportSolveUse) const
void nonconstInitialize(const RCP< LinearOpWithSolveFactoryBase< Scalar > > &lowsf, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Initialize given a single non-const LOWSFB object.
virtual void setPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &precFactory, const std::string &precFactoryName)
Throws exception.
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in MultiVectorPreconditioner.
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.