Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Thyra_MultiVectorPreconditionerFactory.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_MultiVectorPreconditionerFactory_hpp
11#define Thyra_MultiVectorPreconditionerFactory_hpp
12
13#include "Thyra_PreconditionerFactoryBase.hpp"
14#include "Teuchos_ConstNonconstObjectContainer.hpp"
17#include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
18
19namespace Thyra {
20
24template <class Scalar>
26 : virtual public PreconditionerFactoryBase<Scalar> {
27 public:
30
33
35 const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac,
36 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
37 &multiVecRange,
38 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
39 &multiVecDomain)
40 {
41 validateInitialize(prec_fac, multiVecRange, multiVecDomain);
42 prec_fac_ = prec_fac;
43 multiVecRange_ = multiVecRange;
44 multiVecDomain_ = multiVecDomain;
45 }
46
47 void initialize(const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac,
48 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
49 &multiVecRange,
50 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
51 &multiVecDomain)
52 {
53 validateInitialize(prec_fac, multiVecRange, multiVecDomain);
54 prec_fac_ = prec_fac;
55 multiVecRange_ = multiVecRange;
56 multiVecDomain_ = multiVecDomain;
57 }
58
59 RCP<PreconditionerFactoryBase<Scalar> > getNonconstPreconditionerFactory()
60 {
61 return prec_fac_.getNonconstObj();
62 }
63
64 RCP<const PreconditionerFactoryBase<Scalar> > getPreconditionerFactory() const
65 {
66 return prec_fac_.getConstObj();
67 }
68
70 {
71 prec_fac_.uninitialize();
72 multiVecRange_ = Teuchos::null;
73 multiVecDomain_ = Teuchos::null;
74 }
75
78
79 std::string description() const
80 {
81 std::ostringstream oss;
82 oss << this->Teuchos::Describable::description() << "{"
83 << "prec_fac=";
84 if (!is_null(prec_fac_.getConstObj()))
85 oss << prec_fac_.getConstObj()->description();
86 else
87 oss << "NULL";
88 oss << "}";
89 return oss.str();
90 }
91
93
97
98 void setParameterList(RCP<ParameterList> const &paramList)
99 {
100 prec_fac_.getNonconstObj()->setParameterList(paramList);
101 }
102
103 RCP<ParameterList> getNonconstParameterList()
104 {
105 return prec_fac_.getNonconstObj()->getNonconstParameterList();
106 }
107
108 RCP<ParameterList> unsetParameterList()
109 {
110 return prec_fac_.getNonconstObj()->unsetParameterList();
111 }
112
113 RCP<const ParameterList> getParameterList() const
114 {
115 return prec_fac_.getConstObj()->getParameterList();
116 }
117
118 RCP<const ParameterList> getValidParameters() const
119 {
120 return prec_fac_.getConstObj()->getValidParameters();
121 }
122
124
126
129
130 bool isCompatible(const LinearOpSourceBase<Scalar> &fwdOpSrc) const
131 {
132 return prec_fac_.getConstObj()->isCompatible(fwdOpSrc);
133 }
134
135 RCP<PreconditionerBase<Scalar> > createPrec() const
136 {
137 return nonconstMultiVectorPreconditioner(
138 prec_fac_.getConstObj()->createPrec(), multiVecRange_, multiVecDomain_);
139 }
140
142 const RCP<const LinearOpSourceBase<Scalar> > &fwdOpSrc,
144 const ESupportSolveUse supportSolveUse = SUPPORT_SOLVE_UNSPECIFIED) const
145 {
146 using Teuchos::dyn_cast;
147 using Teuchos::rcp_dynamic_cast;
148
149 typedef MultiVectorLinearOp<Scalar> MVLO;
151 const RCP<const MVLO> mvlo =
152 rcp_dynamic_cast<const MVLO>(fwdOpSrc->getOp().assert_not_null());
153 MVP &mvp = dyn_cast<MVP>(*precOp);
154 prec_fac_.getConstObj()->initializePrec(
155 defaultLinearOpSource<Scalar>(mvlo->getLinearOp()),
156 mvp.getNonconstPreconditioner().get(), supportSolveUse);
157 }
158
160 RCP<const LinearOpSourceBase<Scalar> > *fwdOpSrc = NULL,
161 ESupportSolveUse *supportSolveUse = NULL) const
162 {
163 using Teuchos::dyn_cast;
164
165#ifdef TEUCHOS_DEBUG
166 TEUCHOS_TEST_FOR_EXCEPT(0 == precOp);
167#endif
169 MVP &mvp = dyn_cast<MVP>(*precOp);
170 RCP<const LinearOpSourceBase<Scalar> > inner_fwdOpSrc;
171 prec_fac_.getConstObj()->uninitializePrec(
172 mvp.getNonconstPreconditioner().get(),
173 fwdOpSrc ? &inner_fwdOpSrc : NULL, supportSolveUse);
174 if (fwdOpSrc)
175 *fwdOpSrc = defaultLinearOpSource<Scalar>(multiVectorLinearOp(
176 inner_fwdOpSrc->getOp(), multiVecRange_, multiVecDomain_));
177 }
178
180
181 private:
182 // //////////////////////////////
183 // Private types
184
185 typedef Teuchos::ConstNonconstObjectContainer<
188
189 // //////////////////////////////
190 // Private data members
191
193 RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecRange_;
194 RCP<const DefaultMultiVectorProductVectorSpace<Scalar> > multiVecDomain_;
195
196 // //////////////////////////////
197 // Private member functions
198
200 const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac,
201 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
202 &multiVecRange,
203 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
204 &multiVecDomain)
205 {
206#ifdef TEUCHOS_DEBUG
207 TEUCHOS_TEST_FOR_EXCEPT(is_null(prec_fac));
208 TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecRange));
209 TEUCHOS_TEST_FOR_EXCEPT(is_null(multiVecDomain));
210 TEUCHOS_TEST_FOR_EXCEPT(multiVecRange->numBlocks() !=
211 multiVecDomain->numBlocks());
212#else
213 (void)prec_fac;
214 (void)multiVecRange;
215 (void)multiVecDomain;
216#endif
217 }
218};
219
224template <class Scalar>
225RCP<MultiVectorPreconditionerFactory<Scalar> >
230
235template <class Scalar>
236RCP<MultiVectorPreconditionerFactory<Scalar> >
238 const RCP<PreconditionerFactoryBase<Scalar> > &prec_fac,
239 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
240 &multiVecRange,
241 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
242 &multiVecDomain)
243{
244 RCP<MultiVectorPreconditionerFactory<Scalar> > mvfac =
246 mvfac->nonconstInitialize(prec_fac, multiVecRange, multiVecDomain);
247 return mvfac;
248}
249
254template <class Scalar>
255RCP<MultiVectorPreconditionerFactory<Scalar> > multiVectorPreconditionerFactory(
256 const RCP<const PreconditionerFactoryBase<Scalar> > &prec_fac,
257 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
258 &multiVecRange,
259 const RCP<const DefaultMultiVectorProductVectorSpace<Scalar> >
260 &multiVecDomain)
261{
262 RCP<MultiVectorPreconditionerFactory<Scalar> > mvfac =
264 mvfac->initialize(prec_fac, multiVecRange, multiVecDomain);
265 return mvfac;
266}
267
268} // end namespace Thyra
269
270#endif
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
Concrete PreconditionerFactoryBase subclass that wraps a preconditioner in MultiVectorPreconditioner.
RCP< MultiVectorPreconditionerFactory< Scalar > > multiVectorPreconditionerFactory()
Nonmember constructor function.
RCP< const PreconditionerFactoryBase< Scalar > > getPreconditionerFactory() const
static void validateInitialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecRange_
RCP< PreconditionerBase< Scalar > > createPrec() const
RCP< MultiVectorPreconditionerFactory< Scalar > > nonconstMultiVectorPreconditionerFactory(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
void initialize(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > multiVecDomain_
void nonconstInitialize(const RCP< PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
bool isCompatible(const LinearOpSourceBase< Scalar > &fwdOpSrc) const
void setParameterList(RCP< ParameterList > const &paramList)
Teuchos::ConstNonconstObjectContainer< PreconditionerFactoryBase< Scalar > > CNPFB
RCP< MultiVectorPreconditionerFactory< Scalar > > multiVectorPreconditionerFactory(const RCP< const PreconditionerFactoryBase< Scalar > > &prec_fac, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecRange, const RCP< const DefaultMultiVectorProductVectorSpace< Scalar > > &multiVecDomain)
Nonmember constructor function.
RCP< PreconditionerFactoryBase< Scalar > > getNonconstPreconditionerFactory()
void uninitializePrec(PreconditionerBase< Scalar > *precOp, RCP< const LinearOpSourceBase< Scalar > > *fwdOpSrc=NULL, ESupportSolveUse *supportSolveUse=NULL) const
void initializePrec(const RCP< const LinearOpSourceBase< Scalar > > &fwdOpSrc, PreconditionerBase< Scalar > *precOp, const ESupportSolveUse supportSolveUse=SUPPORT_SOLVE_UNSPECIFIED) const
Concrete PreconditionerBase subclass that wraps a preconditioner operator in MultiVectorLinearOp.