10#ifndef THYRA_DEFAULT_INVERSE_LINEAR_OP_DEF_HPP
11#define THYRA_DEFAULT_INVERSE_LINEAR_OP_DEF_HPP
13#include "Thyra_DefaultInverseLinearOp_decl.hpp"
14#include "Thyra_MultiVectorStdOps.hpp"
15#include "Thyra_AssertOp.hpp"
16#include "Teuchos_Utils.hpp"
17#include "Teuchos_TypeNameTraits.hpp"
41 lows,fwdSolveCriteria,throwOnFwdSolveFailure
42 ,adjSolveCriteria,throwOnAdjSolveFailure
57 lows,fwdSolveCriteria,throwOnFwdSolveFailure
58 ,adjSolveCriteria,throwOnAdjSolveFailure
73 lows,fwdSolveCriteria,throwOnFwdSolveFailure
74 ,adjSolveCriteria,throwOnAdjSolveFailure
89 lows,fwdSolveCriteria,throwOnFwdSolveFailure
90 ,adjSolveCriteria,throwOnAdjSolveFailure
107template<
class Scalar>
110 return lows_.isConst();
114template<
class Scalar>
118 return lows_.getNonconstObj();
122template<
class Scalar>
126 return lows_.getConstObj();
133template<
class Scalar>
138 return lows_.getConstObj()->domain();
142template<
class Scalar>
147 return lows_.getConstObj()->range();
151template<
class Scalar>
162template<
class Scalar>
166 std::ostringstream oss;
169 <<
"lows="<<lows_.getConstObj()->description()
170 <<
",fwdSolveCriteria="<<(fwdSolveCriteria_.get()?
"...":
"DEFAULT")
171 <<
",adjSolveCriteria="<<(adjSolveCriteria_.get()?
"...":
"DEFAULT")
177template<
class Scalar>
190 out << this->description() << std::endl;
198 <<
"rangeDim=" << this->range()->dim()
199 <<
",domainDim=" << this->domain()->dim() <<
"}:\n";
202 if(!lows_.getConstObj().get()) {
206 out << Teuchos::describe(*lows_.getConstObj(),verbLevel);
222template<
class Scalar>
225 if (nonnull(lows_)) {
226 return solveSupports(*lows_.getConstObj(),M_trans);
232template<
class Scalar>
253 if(beta==ST::zero()) {
254 T = Teuchos::rcpFromPtr(Y);
257 T = createMembers(Y->range(),Y->domain()->dim());
264 ? fwdSolveCriteria_.ptr()
265 : adjSolveCriteria_.ptr()
267 assign(T.
ptr(), ST::zero());
269 Thyra::solve<Scalar>(*lows_.getConstObj(), M_trans, X, T.
ptr(), solveCriteria);
277 ,
"Error, the LOWS object " << lows_.getConstObj()->description() <<
" returned an unconverged"
282 if(beta==ST::zero()) {
286 update( alpha, *T, Y );
294template<
class Scalar>
313 throwOnFwdSolveFailure_ = throwOnFwdSolveFailure;
314 throwOnAdjSolveFailure_ = throwOnAdjSolveFailure;
315 const std::string lowsLabel = lows_.getConstObj()->getObjectLabel();
316 if(lowsLabel.length())
317 this->setObjectLabel(
"inv("+lowsLabel+
")" );
327template<
class Scalar>
329Thyra::nonconstInverse(
330 const RCP<LinearOpWithSolveBase<Scalar> > &A,
331 const Ptr<
const SolveCriteria<Scalar> > &fwdSolveCriteria,
332 const EThrowOnSolveFailure throwOnFwdSolveFailure,
333 const Ptr<
const SolveCriteria<Scalar> > &adjSolveCriteria,
334 const EThrowOnSolveFailure throwOnAdjSolveFailure
338 new DefaultInverseLinearOp<Scalar>(
339 A, fwdSolveCriteria.get(), throwOnFwdSolveFailure,
340 adjSolveCriteria.get(), throwOnAdjSolveFailure
345template<
class Scalar>
348 const RCP<
const LinearOpWithSolveBase<Scalar> > &A,
349 const Ptr<
const SolveCriteria<Scalar> > &fwdSolveCriteria,
350 const EThrowOnSolveFailure throwOnFwdSolveFailure,
351 const Ptr<
const SolveCriteria<Scalar> > &adjSolveCriteria,
352 const EThrowOnSolveFailure throwOnAdjSolveFailure
356 new DefaultInverseLinearOp<Scalar>(
357 A, fwdSolveCriteria.get(), throwOnFwdSolveFailure,
358 adjSolveCriteria.get(), throwOnAdjSolveFailure
371#define THYRA_DEFAULT_INVERSE_LINEAR_OP_INSTANT(SCALAR) \
373 template class DefaultInverseLinearOp<SCALAR >; \
375 template RCP<LinearOpBase<SCALAR > > \
377 const RCP<LinearOpWithSolveBase<SCALAR > > &A, \
378 const Ptr<const SolveCriteria<SCALAR > > &fwdSolveCriteria, \
379 const EThrowOnSolveFailure throwOnFwdSolveFailure, \
380 const Ptr<const SolveCriteria<SCALAR > > &adjSolveCriteria, \
381 const EThrowOnSolveFailure throwOnAdjSolveFailure \
384 template RCP<LinearOpBase<SCALAR > > \
386 const RCP<const LinearOpWithSolveBase<SCALAR > > &A, \
387 const Ptr<const SolveCriteria<SCALAR > > &fwdSolveCriteria, \
388 const EThrowOnSolveFailure throwOnFwdSolveFailure, \
389 const Ptr<const SolveCriteria<SCALAR > > &adjSolveCriteria, \
390 const EThrowOnSolveFailure throwOnAdjSolveFailure \
virtual std::string description() const
Exception type thrown on an catastrophic solve failure.
Concrete LinearOpBase subclass that creates an implicit LinearOpBase object using the inverse action ...
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
RCP< const LinearOpWithSolveBase< Scalar > > getLows() const
RCP< const LinearOpBase< Scalar > > clone() const
std::string description() const
void initialize(const RCP< LinearOpWithSolveBase< Scalar > > &lows, const SolveCriteria< Scalar > *fwdSolveCriteria=NULL, const EThrowOnSolveFailure throwOnFwdSolveFailure=THROW_ON_SOLVE_FAILURE, const SolveCriteria< Scalar > *adjSolveCriteria=NULL, const EThrowOnSolveFailure throwOnAdjSolveFailure=THROW_ON_SOLVE_FAILURE)
Initialize given a non-const LinearOpWithSolveBase object and an optional .
DefaultInverseLinearOp()
Constructs to uninitialized (see postconditions for uninitialize()).
void uninitialize()
Set to uninitialized.
RCP< const VectorSpaceBase< Scalar > > domain() const
Returns this->getLows()->range() if <t>this->getLows().get()!=NULL and returns Teuchos::null otherwis...
RCP< const VectorSpaceBase< Scalar > > range() const
Returns this->getLows()->domain() if <t>this->getLows().get()!=NULL and returns Teuchos::null otherwi...
void describe(FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
RCP< LinearOpWithSolveBase< Scalar > > getNonconstLows()
bool opSupportedImpl(EOpTransp M_trans) const
Returns true only if all constituent operators support M_trans.
Base class for all linear operators that can support a high-level solve operation.
Interface for a collection of column vectors called a multi-vector.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
@ SOLVE_STATUS_CONVERGED
The requested solution criteria has likely been achieved.
EThrowOnSolveFailure
Determines what to do if inverse solve fails.
@ THROW_ON_SOLVE_FAILURE
Throw an exception if a solve fails to converge.
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
const char * toString(EConj conj)
Return a string name for a EOpTransp value. `*.
EOpTransp real_trans(EOpTransp transp)
Return NOTRANS or TRANS for real scalar valued operators and this also is used for determining struct...
@ NOTRANS
Use the non-transposed operator.
T_To & dyn_cast(T_From &from)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Simple struct that defines the requested solution criteria for a solve.
Simple struct for the return status from a solve.
std::string message
A simple one-line message (i.e. no newlines) returned from the solver.
ESolveStatus solveStatus
The return status of the solve.