84 using EpetraExt::MatrixMatrix;
86 using Teuchos::rcp_dynamic_cast;
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 );
131 rcp_dynamic_cast<const Epetra_CrsMatrix>(get_Epetra_Operator(*B),
true);
136 if(haveDiagScaling) {
137 epetra_d = (B_transp==CONJTRANS ?
get_Epetra_Vector(epetra_B->OperatorRangeMap(), d)
143 rcp_dynamic_cast<const Epetra_CrsMatrix>(get_Epetra_Operator(*G),
true);
147 = (B_transp==CONJTRANS ? epetra_B->ColMap() : epetra_B->RowMap());
149 = (G_transp==CONJTRANS ? epetra_B->RowMap() : epetra_B->ColMap());
159 EpetraLinearOp &thyra_epetra_op_inout = dyn_cast<EpetraLinearOp>(*op_inout);
161 rcp_dynamic_cast<Epetra_CrsMatrix>(thyra_epetra_op_inout.
epetra_op());
162 if(is_null(epetra_op)) {
169 if(haveDiagScaling) {
174 if(B_transp==CONJTRANS)
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);
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.