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) {
104 epetra_d = (B_transp==CONJTRANS ?
get_Epetra_Vector(epetra_B->OperatorRangeMap(), d)
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) {
141 if(B_transp==CONJTRANS)
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);
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.
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.