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"
55 #include "Teuchos_RCP.hpp"
69 using Teuchos::rcp_dynamic_cast;
85 if(transp!=
NOTRANS)
return false;
90 if(transp!=
NOTRANS)
return false;
98 if(dA==Teuchos::null && dB!=Teuchos::null)
101 if(dA!=Teuchos::null && dB==Teuchos::null)
111 return nonconstEpetraLinearOp();
121 using Teuchos::rcp_dynamic_cast;
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 );
161 if(dA==Teuchos::null) {
162 bool exactly_one_op_must_be_diagonal__dB_neq_null = dB!=Teuchos::null;
168 else if(dB==Teuchos::null) {
169 bool exactly_one_op_must_be_diagonal__dA_neq_null = dA!=Teuchos::null;
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());
189 bool rightScale = dB!=Teuchos::null;
196 if(epetra_op==Teuchos::null)
199 *epetra_op = *epetra_A;
207 if(epetra_op==Teuchos::null)
210 *epetra_op = *epetra_B;
214 epetra_op->
Scale(A_scalar*B_scalar);