10#include "Thyra_EpetraExtDiagScaledMatProdTransformer.hpp" 
   11#include "Thyra_MultipliedLinearOpBase.hpp" 
   12#include "Thyra_DiagonalLinearOpBase.hpp" 
   13#include "Thyra_ScaledAdjointLinearOpBase.hpp" 
   14#include "Thyra_EpetraLinearOp.hpp" 
   15#include "Thyra_get_Epetra_Operator.hpp" 
   17#include "Epetra_Map.h" 
   18#include "Epetra_LocalMap.h" 
   19#include "Epetra_SerialComm.h" 
   20#include "Epetra_CrsMatrix.h" 
   21#include "EpetraExt_MatrixMatrix.h" 
   22#include "Teuchos_Assert.hpp" 
   42   return nonconstEpetraLinearOp();
 
 
   51   using EpetraExt::MatrixMatrix;
 
   53   using Teuchos::rcp_dynamic_cast;
 
   61         dyn_cast<const MultipliedLinearOpBase<double> >(op_in);
 
   63   bool haveDiagScaling = (multi_op.
numOps()==3);
 
   67   double B_scalar = 0.0;
 
   70   unwrap( op_B, &B_scalar, &B_transp, &B );
 
   75   double D_scalar = 1.0;
 
   80      unwrap( op_D, &D_scalar, &D_transp, &D );
 
   81      d = rcp_dynamic_cast<const DiagonalLinearOpBase<double> >(D, 
true)->getDiag();
 
   86   double G_scalar = 0.0;
 
   89   unwrap( op_G, &G_scalar, &G_transp, &G );
 
   98         rcp_dynamic_cast<const Epetra_CrsMatrix>(get_Epetra_Operator(*B), 
true);
 
  103   if(haveDiagScaling) {
 
  110     rcp_dynamic_cast<const Epetra_CrsMatrix>(get_Epetra_Operator(*G), 
true);
 
  114         = (B_transp==
CONJTRANS ? epetra_B->ColMap() : epetra_B->RowMap());
 
  116         = (G_transp==
CONJTRANS ? epetra_B->RowMap() : epetra_B->ColMap());
 
  126   EpetraLinearOp &thyra_epetra_op_inout = dyn_cast<EpetraLinearOp>(*op_inout);
 
  128         rcp_dynamic_cast<Epetra_CrsMatrix>(thyra_epetra_op_inout.
epetra_op());
 
  129   if(is_null(epetra_op)) {
 
  136   if(haveDiagScaling) {
 
  142         epetra_BD_temp->LeftScale(*epetra_d);
 
  144         epetra_BD_temp->RightScale(*epetra_d);
 
  146      epetra_BD = epetra_BD_temp;
 
  149      epetra_BD = epetra_B;
 
  152   int mm_error = MatrixMatrix::Multiply( *epetra_BD,  B_transp==
CONJTRANS,
 
  153                                          *epetra_G,   G_transp==
CONJTRANS, *epetra_op);
 
  155                              "EpetraExt::MatrixMatrix::Multiply failed returning error code " << mm_error << 
".");
 
  158   if(B_scalar*G_scalar*D_scalar!=1.0)
 
  159      epetra_op->Scale(B_scalar*G_scalar*D_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)
 
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
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).
 
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
 
T_To & dyn_cast(T_From &from)
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)