44 #include "Thyra_MultipliedLinearOpBase.hpp" 
   45 #include "Thyra_DiagonalLinearOpBase.hpp" 
   46 #include "Thyra_ScaledAdjointLinearOpBase.hpp" 
   50 #include "Epetra_Map.h" 
   51 #include "Epetra_LocalMap.h" 
   52 #include "Epetra_SerialComm.h" 
   53 #include "Epetra_CrsMatrix.h" 
   54 #include "EpetraExt_MatrixMatrix.h" 
   65       const LinearOpBase<double> &)
 const 
   75    return nonconstEpetraLinearOp();
 
   80    const LinearOpBase<double> &op_in,
 
   81    const Ptr<LinearOpBase<double> > &op_inout)
 const 
   84    using EpetraExt::MatrixMatrix;
 
   86    using Teuchos::rcp_dynamic_cast;
 
   93    const MultipliedLinearOpBase<double> &multi_op =
 
   94          dyn_cast<
const MultipliedLinearOpBase<double> >(op_in);
 
   96    bool haveDiagScaling = (multi_op.numOps()==3);
 
  100    double B_scalar = 0.0;
 
  103    unwrap( op_B, &B_scalar, &B_transp, &B );
 
  108    double D_scalar = 1.0;
 
  109    if(haveDiagScaling) {
 
  113       unwrap( op_D, &D_scalar, &D_transp, &D );
 
  114       d = rcp_dynamic_cast<
const DiagonalLinearOpBase<double> >(D, 
true)->getDiag();
 
  119    double G_scalar = 0.0;
 
  122    unwrap( op_G, &G_scalar, &G_transp, &G );
 
  136    if(haveDiagScaling) {
 
  146    const Epetra_Map op_inout_row_map 
 
  147          = (B_transp==
CONJTRANS ? epetra_B->ColMap() : epetra_B->RowMap());
 
  148    const Epetra_Map op_inout_col_map 
 
  149          = (G_transp==
CONJTRANS ? epetra_B->RowMap() : epetra_B->ColMap());
 
  161          rcp_dynamic_cast<Epetra_CrsMatrix>(thyra_epetra_op_inout.
epetra_op());
 
  164             new Epetra_CrsMatrix(::
Copy, op_inout_row_map, 0));
 
  169    if(haveDiagScaling) {
 
  175          epetra_BD_temp->LeftScale(*epetra_d);
 
  177          epetra_BD_temp->RightScale(*epetra_d);
 
  179       epetra_BD = epetra_BD_temp;
 
  182       epetra_BD = epetra_B;
 
  185    int mm_error = MatrixMatrix::Multiply( *epetra_BD,  B_transp==
CONJTRANS,
 
  186                                           *epetra_G,   G_transp==
CONJTRANS, *epetra_op);
 
  188                               "EpetraExt::MatrixMatrix::Multiply failed returning error code " << mm_error << 
".");
 
  191    if(B_scalar*G_scalar*D_scalar!=1.0)
 
  192       epetra_op->Scale(B_scalar*G_scalar*D_scalar);
 
Concrete LinearOpBase adapter subclass for Epetra_Operator object. 
 
bool is_null(const boost::shared_ptr< T > &p)
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
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. 
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
T_To & dyn_cast(T_From &from)
 
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. 
 
Teuchos::RCP< Epetra_Operator > get_Epetra_Operator(LinearOpBase< double > &op)
Full specialization for Scalar=double. 
 
#define TEUCHOS_ASSERT(assertion_test)
 
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
 
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
 
RCP< Epetra_Operator > epetra_op()