44 #include "Thyra_DetachedSpmdVectorView.hpp"
45 #include "Thyra_DefaultProductVector.hpp"
46 #include "Thyra_ProductVectorSpaceBase.hpp"
47 #include "Thyra_SpmdVectorBase.hpp"
51 # include "Epetra_MpiComm.h"
53 #include "Epetra_SerialComm.h"
54 #include "Epetra_Vector.h"
69 const RCP<
const LinearOpBase<double> > &thyraOp
71 : useTranspose_(false),
73 range_(thyraOp->range()),
74 domain_(thyraOp->domain()),
75 comm_(getEpetraComm(*thyraOp)),
78 label_(thyraOp->description())
83 const Ptr<VectorBase<double> > &thyraVec)
const
86 using Teuchos::rcpFromPtr;
87 using Teuchos::rcp_dynamic_cast;
89 const int numVecs = x.NumVectors();
92 "epetraToThyra does not work with MV dimension != 1");
95 castOrCreateNonconstProductVectorBase(rcpFromPtr(thyraVec));
103 const int numBlocks = prodThyraVec->productSpace()->numBlocks();
104 for (
int b = 0; b < numBlocks; ++b) {
107 rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(vec_b->space(),
true);
108 DetachedSpmdVectorView<double> view(vec_b);
109 const ArrayRCP<double> thyraData = view.sv().values();
110 const int localNumElems = spmd_vs_b->localSubDim();
111 for (
int i=0; i < localNumElems; ++i) {
112 thyraData[i] = epetraData[i+offset];
114 offset += localNumElems;
121 const VectorBase<double>& thyraVec, Epetra_MultiVector& x)
const
124 using Teuchos::rcpFromRef;
125 using Teuchos::rcp_dynamic_cast;
127 const int numVecs = x.NumVectors();
130 "epetraToThyra does not work with MV dimension != 1");
133 castOrCreateProductVectorBase(rcpFromRef(thyraVec));
139 const int numBlocks = prodThyraVec->productSpace()->numBlocks();
140 for (
int b = 0; b < numBlocks; ++b) {
143 rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(vec_b->space(),
true);
144 ConstDetachedSpmdVectorView<double> view(vec_b);
145 const ArrayRCP<const double> thyraData = view.sv().values();
146 const int localNumElems = spmd_vs_b->localSubDim();
147 for (
int i=0; i < localNumElems; ++i) {
148 epetraData[i+offset] = thyraData[i];
150 offset += localNumElems;
160 Epetra_MultiVector& Y)
const
182 Epetra_MultiVector& Y)
const
185 "EpetraOperatorWrapper::ApplyInverse not implemented");
193 "EpetraOperatorWrapper::NormInf not implemated");
206 using Teuchos::rcp_dynamic_cast;
209 using Teuchos::MpiComm;
215 rcp_dynamic_cast<
const ProductVectorSpaceBase<double> >(vs);
218 vs = prod_vs->getBlock(0);
221 rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(vs,
true);
232 Thyra::makeEpetraWrapper(
const RCP<
const LinearOpBase<double> > &thyraOp)