43#include "Thyra_EpetraExtDiagScalingTransformer.hpp"
44#include "Thyra_MultipliedLinearOpBase.hpp"
45#include "Thyra_DiagonalLinearOpBase.hpp"
46#include "Thyra_ScaledAdjointLinearOpBase.hpp"
47#include "Thyra_EpetraLinearOp.hpp"
48#include "Thyra_get_Epetra_Operator.hpp"
50#include "Epetra_Map.h"
51#include "Epetra_LocalMap.h"
52#include "Epetra_SerialComm.h"
53#include "Epetra_CrsMatrix.h"
54#include "Teuchos_Assert.hpp"
69 using Teuchos::rcp_dynamic_cast;
73 dyn_cast<const MultipliedLinearOpBase<double> >(op_in);
85 if(transp!=
NOTRANS)
return false;
90 if(transp!=
NOTRANS)
return false;
94 = rcp_dynamic_cast<const DiagonalLinearOpBase<double> >(A);
96 = rcp_dynamic_cast<const DiagonalLinearOpBase<double> >(B);
111 return nonconstEpetraLinearOp();
121 using Teuchos::rcp_dynamic_cast;
129 dyn_cast<const MultipliedLinearOpBase<double> >(op_in);
135 double A_scalar = 0.0;
138 unwrap( op_A, &A_scalar, &A_transp, &A );
143 double B_scalar = 0.0;
146 unwrap( op_B, &B_scalar, &B_transp, &B );
155 = rcp_dynamic_cast<const DiagonalLinearOpBase<double> >(A);
157 = rcp_dynamic_cast<const DiagonalLinearOpBase<double> >(B);
162 bool exactly_one_op_must_be_diagonal__dB_neq_null = dB!=
Teuchos::null;
166 epetra_A = rcp_dynamic_cast<const Epetra_CrsMatrix>(get_Epetra_Operator(*A),
true);
169 bool exactly_one_op_must_be_diagonal__dA_neq_null = dA!=
Teuchos::null;
173 epetra_B = rcp_dynamic_cast<const Epetra_CrsMatrix>(get_Epetra_Operator(*B),
true);
176 bool exactly_one_op_must_be_diagonal=
false;
185 EpetraLinearOp & thyra_epetra_op_inout = dyn_cast<EpetraLinearOp>(*op_inout);
187 rcp_dynamic_cast<Epetra_CrsMatrix>(thyra_epetra_op_inout.
epetra_op());
199 *epetra_op = *epetra_A;
200 epetra_op->RightScale(*v);
210 *epetra_op = *epetra_B;
211 epetra_op->LeftScale(*v);
214 epetra_op->Scale(A_scalar*B_scalar);
Concrete LinearOpBase adapter subclass for Epetra_Operator object.
void initialize(const RCP< Epetra_Operator > &op, EOpTransp opTrans=NOTRANS, EApplyEpetraOpAs applyAs=EPETRA_OP_APPLY_APPLY, EAdjointEpetraOp adjointSupport=EPETRA_OP_ADJOINT_SUPPORTED, const RCP< const VectorSpaceBase< double > > &range=Teuchos::null, const RCP< const VectorSpaceBase< double > > &domain=Teuchos::null)
Fully initialize.
RCP< Epetra_Operator > epetra_op()
Base class for all linear operators.
Interface class for implicitly multiplied linear operators.
virtual int numOps() const =0
Returns the number of constituent operators.
virtual Teuchos::RCP< const LinearOpBase< Scalar > > getOp(const int k) const =0
Return the kth constant constituent operator.
RCP< Epetra_Vector > get_Epetra_Vector(const Epetra_Map &map, const RCP< VectorBase< double > > &v)
Get a non-const Epetra_Vector view from a non-const VectorBase object if possible.
#define TEUCHOS_ASSERT(assertion_test)
void unwrap(const LinearOpBase< Scalar > &Op, Scalar *scalar, EOpTransp *transp, const LinearOpBase< Scalar > **origOp)
Extract the overallScalar, overallTransp and const origOp from a const LinearOpBase object.
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
@ NOTRANS
Use the non-transposed operator.
@ CONJTRANS
Use the transposed operator with complex-conjugate clements (same as TRANS for real scalar types).
T_To & dyn_cast(T_From &from)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)