44 #ifndef MY_OPERATOR_HPP
45 #define MY_OPERATOR_HPP
47 #include "Tpetra_Operator.hpp"
48 #include "Tpetra_Vector.hpp"
49 #include "Tpetra_VectorSpace.hpp"
62 template <
class OrdinalType,
class ScalarType>
63 class MyOperator :
public Tpetra::Operator<OrdinalType,ScalarType>
69 MyOperator(
const Tpetra::VectorSpace<OrdinalType,ScalarType>& vs,
70 const int nrows,
const int *colptr,
71 const int nnz,
const int *rowin,
const ScalarType *vals)
74 std::copy<const int*,IntIter>(colptr,colptr+nrows+1,
_cptr.begin());
75 std::copy<const int*,IntIter>(rowin,rowin+nnz,
_rind.begin());
76 std::copy<const ScalarType*,STIter>(vals,vals+nnz,
_vals.begin());
88 Tpetra::VectorSpace<OrdinalType,ScalarType>
const&
getDomainDist()
const {
return _vs; };
91 Tpetra::VectorSpace<OrdinalType,ScalarType>
const&
getRangeDist()
const {
return _vs; };
94 void apply(Tpetra::Vector<OrdinalType,ScalarType>
const& x,
95 Tpetra::Vector<OrdinalType, ScalarType> & y,
96 bool transpose=
false)
const
99 const int numMyElements =
_vs.getNumMyEntries();
100 const std::vector<int> &myGlobalElements =
_vs.elementSpace().getMyGlobalElements();
105 assert (x.getNumGlobalEntries() == y.getNumGlobalEntries());
106 assert (x.getNumGlobalEntries() == y.getNumGlobalEntries());
111 for (
int myRow = 0; myRow < numMyElements; ++myRow ) {
114 const int rowIndex = myGlobalElements[myRow];
115 for (j=0; j<
_nr; j++) {
118 for (i=IA1; i<IA2; i++) {
121 y[rowIndex] +=
_vals[i]*x[j];
132 typedef typename std::vector<ScalarType>::iterator
STIter;
136 Tpetra::VectorSpace<OrdinalType,ScalarType>
_vs;
148 #endif //MY_OPERATOR_HPP