10#ifndef THYRA_DEFAULT_SERIAL_DENSE_LINEAR_OP_WITH_SOLVE_HPP
11#define THYRA_DEFAULT_SERIAL_DENSE_LINEAR_OP_WITH_SOLVE_HPP
14#include "Thyra_DefaultSerialDenseLinearOpWithSolve_decl.hpp"
15#include "Thyra_LinearOpWithSolveBase.hpp"
16#include "Thyra_DetachedMultiVectorView.hpp"
17#include "Thyra_MultiVectorStdOps.hpp"
18#include "Thyra_AssertOp.hpp"
19#include "Teuchos_Assert.hpp"
37 using Teuchos::outArg;
45 factorize(*M, outArg(LU_), outArg(ipiv_));
86 EOpTransp M_trans)
const
94 const EOpTransp M_trans,
108template<
class Scalar>
110 EOpTransp M_trans)
const
113 return ( ST::isComplex ? ( M_trans!=CONJ ) :
true );
117template<
class Scalar>
126template<
class Scalar>
129 const EOpTransp M_trans,
137 "DefaultSerialDenseLinearOpWithSolve<Scalar>::solve(...)",
138 *
this, M_trans, *X, &B );
140 backsolve( LU_, ipiv_, M_trans, B, X );
150template<
class Scalar>
151void DefaultSerialDenseLinearOpWithSolve<Scalar>::factorize(
157 using Teuchos::outArg;
159 const int dim = dM.subDim();
162 RTOpPack::assign_entries<Scalar>( outArg(LU_tmp), dM.smv() );
164 RTOpPack::getrf<Scalar>( LU_tmp, (*ipiv)(), outArg(rank) );
170template<
class Scalar>
171void DefaultSerialDenseLinearOpWithSolve<Scalar>::backsolve(
173 const ArrayView<const int> ipiv,
174 const EOpTransp transp,
175 const MultiVectorBase<Scalar> &B,
176 const Ptr<MultiVectorBase<Scalar> > &X
179 using Teuchos::outArg;
181 DetachedMultiVectorView<Scalar> dX(*X);
182 RTOpPack::getrs<Scalar>( LU, ipiv, convertToRTOpPackETransp(transp),
Create an explicit non-mutable (const) view of a MultiVectorBase object.
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
bool opSupportedImpl(EOpTransp M_trans) const
bool solveSupportsSolveMeasureTypeImpl(EOpTransp M_trans, const SolveMeasureType &solveMeasureType) const
void initialize(const RCP< const MultiVectorBase< Scalar > > &M)
RCP< const VectorSpaceBase< Scalar > > range() const
bool solveSupportsImpl(EOpTransp M_trans) const
RCP< const VectorSpaceBase< Scalar > > domain() const
SolveStatus< Scalar > solveImpl(const EOpTransp transp, const MultiVectorBase< Scalar > &B, const Ptr< MultiVectorBase< Scalar > > &X, const Ptr< const SolveCriteria< Scalar > > solveCriteria) const
RCP< const LinearOpBase< Scalar > > getFwdOp() const
DefaultSerialDenseLinearOpWithSolve()
bool isFullyInitialized(const LinearOpBase< Scalar > &M)
Determines if a linear operator is in the "Fully Initialized" state or not.
void apply(const LinearOpBase< Scalar > &M, const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha=static_cast< Scalar >(1.0), const Scalar beta=static_cast< Scalar >(0.0))
Non-member function call for M.apply(...).
bool opSupported(const LinearOpBase< Scalar > &M, EOpTransp M_trans)
Determines if an operation is supported for a single scalar type.
Interface for a collection of column vectors called a multi-vector.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)
@ SOLVE_STATUS_CONVERGED
The requested solution criteria has likely been achieved.
#define THYRA_ASSERT_VEC_SPACES(FUNC_NAME, VS1, VS2)
This is a very useful macro that should be used to validate that two vector spaces are compatible.
#define THYRA_ASSERT_LINEAR_OP_MULTIVEC_APPLY_SPACES(FUNC_NAME, M, M_T, X, Y)
This is a very useful macro that should be used to validate that the spaces for the multi-vector vers...
Simple struct that defines the requested solution criteria for a solve.
Simple struct for the return status from a solve.
ESolveStatus solveStatus
The return status of the solve.