Stratimikos Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
MyOperator.hpp
Go to the documentation of this file.
00001 /*
00002 // @HEADER
00003 // ***********************************************************************
00004 // 
00005 //         Stratimikos: Thyra-based strategies for linear solvers
00006 //                Copyright (2006) Sandia Corporation
00007 // 
00008 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00009 // license for use of this work by or on behalf of the U.S. Government.
00010 // 
00011 // Redistribution and use in source and binary forms, with or without
00012 // modification, are permitted provided that the following conditions are
00013 // met:
00014 //
00015 // 1. Redistributions of source code must retain the above copyright
00016 // notice, this list of conditions and the following disclaimer.
00017 //
00018 // 2. Redistributions in binary form must reproduce the above copyright
00019 // notice, this list of conditions and the following disclaimer in the
00020 // documentation and/or other materials provided with the distribution.
00021 //
00022 // 3. Neither the name of the Corporation nor the names of the
00023 // contributors may be used to endorse or promote products derived from
00024 // this software without specific prior written permission.
00025 //
00026 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00027 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00029 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00030 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00031 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00032 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00033 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00034 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00035 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00036 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00037 //
00038 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov) 
00039 // 
00040 // ***********************************************************************
00041 // @HEADER
00042 */
00043 
00044 #ifndef MY_OPERATOR_HPP
00045 #define MY_OPERATOR_HPP
00046 
00047 #include "Tpetra_Operator.hpp"
00048 #include "Tpetra_Vector.hpp"
00049 #include "Tpetra_VectorSpace.hpp"
00050 #include "Teuchos_BLAS.hpp"
00051 
00053 
00062 template <class OrdinalType, class ScalarType>
00063 class MyOperator : public Tpetra::Operator<OrdinalType,ScalarType> 
00064 {
00065 
00066 public:
00067 
00069   MyOperator(const Tpetra::VectorSpace<OrdinalType,ScalarType>& vs,
00070        const int nrows, const int *colptr,
00071        const int nnz, const int *rowin, const ScalarType *vals)
00072     : _vs(vs), _nr(nrows), _nnz(nnz), _cptr(nrows+1), _rind(nnz), _vals(nnz)
00073   {
00074     std::copy<const int*,IntIter>(colptr,colptr+nrows+1,_cptr.begin());
00075     std::copy<const int*,IntIter>(rowin,rowin+nnz,_rind.begin());
00076     std::copy<const ScalarType*,STIter>(vals,vals+nnz,_vals.begin());
00077   }
00078   
00080   ~MyOperator()
00081   {
00082   }
00083 
00086   
00088   Tpetra::VectorSpace<OrdinalType,ScalarType> const& getDomainDist() const { return _vs; };
00089   
00091   Tpetra::VectorSpace<OrdinalType,ScalarType> const& getRangeDist() const { return _vs; };
00092   
00094   void apply(Tpetra::Vector<OrdinalType,ScalarType> const& x, 
00095        Tpetra::Vector<OrdinalType, ScalarType> & y, 
00096        bool transpose=false) const 
00097   {
00098     // Get the indexes of the rows on this processor
00099     const int numMyElements = _vs.getNumMyEntries();
00100     const std::vector<int> &myGlobalElements = _vs.elementSpace().getMyGlobalElements();
00101     
00102     // Initialize output std::vector to zero.
00103     y.setAllToScalar( Teuchos::ScalarTraits<ScalarType>::zero() );
00104 
00105     assert (x.getNumGlobalEntries() == y.getNumGlobalEntries());
00106     assert (x.getNumGlobalEntries() == y.getNumGlobalEntries());
00107     
00108     // Apply operator
00109     int IA1, IA2, ri;
00110     int i,j;
00111     for (int myRow = 0; myRow < numMyElements; ++myRow ) {
00112 
00113       // For each row this processor owns, compute the value of A*x[myRow]
00114       const int rowIndex = myGlobalElements[myRow];
00115       for (j=0; j<_nr; j++) {   
00116   IA1 = _cptr[j]-1;
00117   IA2 = _cptr[j+1]-1;
00118   for (i=IA1; i<IA2; i++) {
00119     ri = _rind[i]-1;
00120     if (ri == rowIndex) 
00121       y[rowIndex] += _vals[i]*x[j];
00122   } // end for (i= ...)
00123       } // end for (j= ...)
00124     } // end for (myRow= ...)
00125     
00126   };
00127   
00129   
00130 private:
00131 
00132   typedef typename std::vector<ScalarType>::iterator STIter;
00133   typedef std::vector<int>::iterator        IntIter;
00134 
00136   Tpetra::VectorSpace<OrdinalType,ScalarType> _vs;
00137 
00139   int _nr, _nnz;
00141   std::vector<int> _cptr;
00143   std::vector<int> _rind;
00145   std::vector<ScalarType> _vals;
00146 };
00147 
00148 #endif //MY_OPERATOR_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines