|
Stratimikos Package Browser (Single Doxygen Collection)
Version of the Day
|
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
1.7.6.1