42#ifndef THYRA_DEFAULT_INVERSE_LINEAR_OP_DEF_HPP
43#define THYRA_DEFAULT_INVERSE_LINEAR_OP_DEF_HPP
45#include "Thyra_DefaultInverseLinearOp_decl.hpp"
46#include "Thyra_MultiVectorStdOps.hpp"
47#include "Thyra_AssertOp.hpp"
73 lows,fwdSolveCriteria,throwOnFwdSolveFailure
74 ,adjSolveCriteria,throwOnAdjSolveFailure
89 lows,fwdSolveCriteria,throwOnFwdSolveFailure
90 ,adjSolveCriteria,throwOnAdjSolveFailure
105 lows,fwdSolveCriteria,throwOnFwdSolveFailure
106 ,adjSolveCriteria,throwOnAdjSolveFailure
111template<
class Scalar>
121 lows,fwdSolveCriteria,throwOnFwdSolveFailure
122 ,adjSolveCriteria,throwOnAdjSolveFailure
127template<
class Scalar>
130 lows_.uninitialize();
139template<
class Scalar>
142 return lows_.isConst();
146template<
class Scalar>
150 return lows_.getNonconstObj();
154template<
class Scalar>
158 return lows_.getConstObj();
165template<
class Scalar>
170 return lows_.getConstObj()->domain();
174template<
class Scalar>
179 return lows_.getConstObj()->range();
183template<
class Scalar>
194template<
class Scalar>
198 std::ostringstream oss;
201 <<
"lows="<<lows_.getConstObj()->description()
202 <<
",fwdSolveCriteria="<<(fwdSolveCriteria_.get()?
"...":
"DEFAULT")
203 <<
",adjSolveCriteria="<<(adjSolveCriteria_.get()?
"...":
"DEFAULT")
209template<
class Scalar>
222 out << this->description() << std::endl;
230 <<
"rangeDim=" << this->range()->dim()
231 <<
",domainDim=" << this->domain()->dim() <<
"}:\n";
234 if(!lows_.getConstObj().get()) {
238 out << Teuchos::describe(*lows_.getConstObj(),verbLevel);
254template<
class Scalar>
257 if (nonnull(lows_)) {
258 return solveSupports(*lows_.getConstObj(),M_trans);
264template<
class Scalar>
285 if(beta==ST::zero()) {
286 T = Teuchos::rcpFromPtr(Y);
289 T = createMembers(Y->range(),Y->domain()->dim());
296 ? fwdSolveCriteria_.ptr()
297 : adjSolveCriteria_.ptr()
299 assign(T.
ptr(), ST::zero());
301 Thyra::solve<Scalar>(*lows_.getConstObj(), M_trans, X, T.
ptr(), solveCriteria);
309 ,
"Error, the LOWS object " << lows_.getConstObj()->description() <<
" returned an unconverged"
314 if(beta==ST::zero()) {
318 update( alpha, *T, Y );
326template<
class Scalar>
345 throwOnFwdSolveFailure_ = throwOnFwdSolveFailure;
346 throwOnAdjSolveFailure_ = throwOnAdjSolveFailure;
347 const std::string lowsLabel = lows_.getConstObj()->getObjectLabel();
348 if(lowsLabel.length())
349 this->setObjectLabel(
"inv("+lowsLabel+
")" );
359template<
class Scalar>
361Thyra::nonconstInverse(
362 const RCP<LinearOpWithSolveBase<Scalar> > &A,
363 const Ptr<
const SolveCriteria<Scalar> > &fwdSolveCriteria,
364 const EThrowOnSolveFailure throwOnFwdSolveFailure,
365 const Ptr<
const SolveCriteria<Scalar> > &adjSolveCriteria,
366 const EThrowOnSolveFailure throwOnAdjSolveFailure
370 new DefaultInverseLinearOp<Scalar>(
371 A, fwdSolveCriteria.get(), throwOnFwdSolveFailure,
372 adjSolveCriteria.get(), throwOnAdjSolveFailure
377template<
class Scalar>
380 const RCP<
const LinearOpWithSolveBase<Scalar> > &A,
381 const Ptr<
const SolveCriteria<Scalar> > &fwdSolveCriteria,
382 const EThrowOnSolveFailure throwOnFwdSolveFailure,
383 const Ptr<
const SolveCriteria<Scalar> > &adjSolveCriteria,
384 const EThrowOnSolveFailure throwOnAdjSolveFailure
388 new DefaultInverseLinearOp<Scalar>(
389 A, fwdSolveCriteria.get(), throwOnFwdSolveFailure,
390 adjSolveCriteria.get(), throwOnAdjSolveFailure
403#define THYRA_DEFAULT_INVERSE_LINEAR_OP_INSTANT(SCALAR) \
405 template class DefaultInverseLinearOp<SCALAR >; \
407 template RCP<LinearOpBase<SCALAR > > \
409 const RCP<LinearOpWithSolveBase<SCALAR > > &A, \
410 const Ptr<const SolveCriteria<SCALAR > > &fwdSolveCriteria, \
411 const EThrowOnSolveFailure throwOnFwdSolveFailure, \
412 const Ptr<const SolveCriteria<SCALAR > > &adjSolveCriteria, \
413 const EThrowOnSolveFailure throwOnAdjSolveFailure \
416 template RCP<LinearOpBase<SCALAR > > \
418 const RCP<const LinearOpWithSolveBase<SCALAR > > &A, \
419 const Ptr<const SolveCriteria<SCALAR > > &fwdSolveCriteria, \
420 const EThrowOnSolveFailure throwOnFwdSolveFailure, \
421 const Ptr<const SolveCriteria<SCALAR > > &adjSolveCriteria, \
422 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.