Tpetra Matrix/Vector Services  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
Tpetra_KokkosRefactor_Vector_def.hpp
00001 // @HEADER
00002 // ***********************************************************************
00003 //
00004 //          Tpetra: Templated Linear Algebra Services Package
00005 //                 Copyright (2008) Sandia Corporation
00006 //
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00038 //
00039 // ************************************************************************
00040 // @HEADER
00041 
00042 #ifndef TPETRA_KOKKOS_REFACTOR_VECTOR_DEF_HPP
00043 #define TPETRA_KOKKOS_REFACTOR_VECTOR_DEF_HPP
00044 
00045 #include <Kokkos_DefaultArithmetic.hpp>
00046 #include <Kokkos_NodeTrace.hpp>
00047 #include <Tpetra_MultiVector.hpp>
00048 #include <Tpetra_Vector.hpp>
00049 
00050 #ifdef DOXYGEN_USE_ONLY
00051   #include "Tpetra_Vector_decl.hpp"
00052 #endif
00053 #include <KokkosCompat_View.hpp>
00054 #include <Kokkos_MV.hpp>
00055 #include <KokkosCompat_ClassicNodeAPI_Wrapper.hpp>
00056 
00057 namespace Tpetra {
00058 
00059   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00060   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00061   Vector (const Teuchos::RCP<const map_type>& map,
00062           const bool zeroOut)
00063     : base_type (map, 1, zeroOut)
00064   {}
00065 
00066   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00067   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00068   Vector (const Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >& source)
00069     : base_type (source)
00070   {}
00071 
00072   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00073   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00074   Vector (const Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >& source,
00075           const Teuchos::DataAccess copyOrView)
00076     : base_type (source, copyOrView)
00077   {}
00078 
00079   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00080   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00081   Vector (const Teuchos::RCP<const map_type>& map,
00082           const Teuchos::ArrayView<const Scalar> &values)
00083     : base_type (map, values, values.size (), 1)
00084   {}
00085 
00086   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00087   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00088   Vector (const Teuchos::RCP<const map_type>& map,
00089           const dual_view_type& view)
00090     : base_type (map, view)
00091   {}
00092 
00093   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00094   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00095   Vector (const Teuchos::RCP<const map_type>& map,
00096           const dual_view_type& view,
00097           const dual_view_type& origView)
00098     : base_type (map, view, origView)
00099   {}
00100 
00101   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00102   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00103   ~Vector ()
00104   {}
00105 
00106   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00107   void Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::replaceGlobalValue(GlobalOrdinal globalRow, const Scalar &value) {
00108     this->base_type::replaceGlobalValue(globalRow,0,value);
00109   }
00110 
00111   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00112   void Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::sumIntoGlobalValue(GlobalOrdinal globalRow, const Scalar &value) {
00113     this->base_type::sumIntoGlobalValue(globalRow,0,value);
00114   }
00115 
00116   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00117   void Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::replaceLocalValue(LocalOrdinal myRow, const Scalar &value) {
00118     this->base_type::replaceLocalValue(myRow,0,value);
00119   }
00120 
00121   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00122   void Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::sumIntoLocalValue(LocalOrdinal myRow, const Scalar &value) {
00123     this->base_type::sumIntoLocalValue(myRow,0,value);
00124   }
00125 
00126   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00127   void Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::get1dCopy(ArrayView<Scalar> A) const {
00128     size_t lda = this->getLocalLength();
00129     this->get1dCopy(A,lda);
00130   }
00131 
00132   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00133   typename Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::dot_type
00134   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00135   dot (const Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> > &a) const
00136   {
00137     using Teuchos::outArg;
00138     using Teuchos::REDUCE_SUM;
00139     using Teuchos::reduceAll;
00140 #ifdef HAVE_TPETRA_DEBUG
00141     TEUCHOS_TEST_FOR_EXCEPTION( !this->getMap()->isCompatible(*a.getMap()), std::runtime_error,
00142         "Tpetra::Vector::dots(): Vectors do not have compatible Maps:" << std::endl
00143         << "this->getMap(): " << std::endl << *this->getMap()
00144         << "a.getMap(): " << std::endl << *a.getMap() << std::endl);
00145 #else
00146     TEUCHOS_TEST_FOR_EXCEPTION( this->getLocalLength() != a.getLocalLength(), std::runtime_error,
00147         "Tpetra::Vector::dots(): Vectors do not have the same local length.");
00148 #endif
00149     dot_type gbldot;
00150     //gbldot = MVT::Dot(this->lclMV_,a.lclMV_);
00151     Kokkos::MV_Dot(&gbldot,this->view_.d_view,a.view_.d_view);
00152     if (this->isDistributed()) {
00153       dot_type lcldot = gbldot;
00154       reduceAll<int, dot_type> (* (this->getMap ()->getComm ()), REDUCE_SUM,
00155                                 lcldot, outArg (gbldot));
00156     }
00157     return gbldot;
00158   }
00159 
00160   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00161   Scalar
00162   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00163   meanValue () const
00164   {
00165     Scalar mean;
00166     this->meanValue (Teuchos::arrayView (&mean, 1));
00167     return mean;
00168   }
00169 
00170   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00171   typename Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::mag_type
00172   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00173   norm1 () const
00174   {
00175     mag_type norm;
00176     this->norm1 (Teuchos::arrayView (&norm, 1));
00177     return norm;
00178   }
00179 
00180   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00181   typename Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::mag_type
00182   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00183   norm2 () const
00184   {
00185     mag_type norm;
00186     this->norm2 (Teuchos::arrayView (&norm, 1));
00187     return norm;
00188   }
00189 
00190   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00191   typename Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::mag_type
00192   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00193   normInf () const
00194   {
00195     mag_type norm;
00196     this->normInf (Teuchos::arrayView (&norm, 1));
00197     return norm;
00198   }
00199 
00200   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00201   typename Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::mag_type
00202   Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00203   normWeighted (const Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >& weights) const
00204   {
00205     mag_type norm;
00206     this->normWeighted (weights, Teuchos::arrayView (&norm, 1));
00207     return norm;
00208   }
00209 
00210   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00211   std::string Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00212   description () const
00213   {
00214     using Teuchos::TypeNameTraits;
00215 
00216     std::ostringstream out;
00217     out << "\"Tpetra::Vector\": {";
00218     out << "Template parameters: {Scalar: " << TypeNameTraits<Scalar>::name ()
00219         << ", LocalOrdinal: " << TypeNameTraits<LocalOrdinal>::name ()
00220         << ", GlobalOrdinal: " << TypeNameTraits<GlobalOrdinal>::name ()
00221         << ", Node" << Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType>::name ()
00222         << "}, ";
00223     if (this->getObjectLabel () != "") {
00224       out << "Label: \"" << this->getObjectLabel () << "\", ";
00225     }
00226     out << "Global length: " << this->getGlobalLength ();
00227     out << "}";
00228 
00229     return out.str ();
00230   }
00231 
00232   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00233   void Vector<Scalar,LocalOrdinal,GlobalOrdinal,Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00234   describe (Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
00235   {
00236     using std::endl;
00237     using std::setw;
00238     using Teuchos::VERB_DEFAULT;
00239     using Teuchos::VERB_NONE;
00240     using Teuchos::VERB_LOW;
00241     using Teuchos::VERB_MEDIUM;
00242     using Teuchos::VERB_HIGH;
00243     using Teuchos::VERB_EXTREME;
00244 
00245     const Teuchos::EVerbosityLevel vl =
00246       (verbLevel == VERB_DEFAULT) ? VERB_LOW : verbLevel;
00247     const Teuchos::Comm<int>& comm = * (this->getMap ()->getComm ());
00248     const int myImageID = comm.getRank ();
00249     const int numImages = comm.getSize ();
00250 
00251     size_t width = 1;
00252     for (size_t dec=10; dec<this->getGlobalLength(); dec *= 10) {
00253       ++width;
00254     }
00255     Teuchos::OSTab tab(out);
00256     if (vl != VERB_NONE) {
00257       // VERB_LOW and higher prints description()
00258       if (myImageID == 0) out << this->description() << std::endl;
00259       for (int imageCtr = 0; imageCtr < numImages; ++imageCtr) {
00260         if (myImageID == imageCtr) {
00261           if (vl != VERB_LOW) {
00262             // VERB_MEDIUM and higher prints getLocalLength()
00263             out << "node " << setw(width) << myImageID << ": local length=" << this->getLocalLength() << endl;
00264             if (vl != VERB_MEDIUM) {
00265               // VERB_HIGH and higher prints isConstantStride() and stride()
00266               if (vl == VERB_EXTREME && this->getLocalLength() > 0) {
00267                 /*RCP<Node> node = this->lclMV_.getNode();
00268                 KOKKOS_NODE_TRACE("Vector::describe()")
00269                 ArrayRCP<const Scalar> myview = node->template viewBuffer<Scalar>(
00270                                                                this->getLocalLength(),
00271                                                                MVT::getValues(this->lclMV_) );
00272                 // VERB_EXTREME prints values
00273                 for (size_t i=0; i<this->getLocalLength(); ++i) {
00274                   out << setw(width) << this->getMap()->getGlobalElement(i)
00275                       << ": "
00276                       << myview[i] << endl;
00277                 }
00278                 myview = Teuchos::null;*/
00279               }
00280             }
00281             else {
00282               out << endl;
00283             }
00284           }
00285         }
00286         comm.barrier();
00287       }
00288     }
00289   }
00290 
00291   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00292   Vector<Scalar, LocalOrdinal, GlobalOrdinal,
00293          Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >
00294   createCopy (const Vector<Scalar, LocalOrdinal, GlobalOrdinal,
00295                            Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >& src)
00296   {
00297     typedef Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> NT;
00298 
00299     // The 2-argument copy constructor with second argument =
00300     // Teuchos::Copy does a deep copy of its input.
00301     Vector<Scalar, LocalOrdinal, GlobalOrdinal, NT> dst (src, Teuchos::Copy);
00302 
00303     // The Kokkos refactor version of Vector has view semantics, so
00304     // returning the Vector directly, rather than through RCP, only
00305     // does a shallow copy.
00306     return dst;
00307   }
00308 
00309 
00310   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00311   Teuchos::RCP<const Vector<
00312     Scalar,
00313     LocalOrdinal,
00314     GlobalOrdinal,
00315     Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> > >
00316   Vector<Scalar,
00317     LocalOrdinal,
00318     GlobalOrdinal,
00319     Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00320   offsetView (const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> > >& subMap,
00321               size_t offset) const
00322   {
00323     using Kokkos::ALL;
00324     using Kokkos::subview;
00325     using Teuchos::rcp;
00326     typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal,
00327       Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> > V;
00328 
00329     const size_t newNumRows = subMap->getNodeNumElements ();
00330     const bool tooManyElts = newNumRows + offset > this->getOrigNumLocalRows ();
00331     if (tooManyElts) {
00332       const int myRank = this->getMap ()->getComm ()->getRank ();
00333       TEUCHOS_TEST_FOR_EXCEPTION(
00334         newNumRows + offset > this->getLocalLength (), std::runtime_error,
00335         "Tpetra::Vector::offsetView(NonConst): Invalid input Map.  The input "
00336         "Map owns " << newNumRows << " entries on process " << myRank << ".  "
00337         "offset = " << offset << ".  Yet, the Vector contains only "
00338         << this->getOrigNumLocalRows () << " rows on this process.");
00339     }
00340 
00341     const std::pair<size_t, size_t> offsetPair (offset, offset + newNumRows);
00342     // Need 'this->' to get view_ and origView_ from parent class.
00343     return rcp (new V (subMap,
00344                        subview<dual_view_type> (this->view_, offsetPair, ALL ()),
00345                        this->origView_));
00346   }
00347 
00348 
00349   template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class DeviceType>
00350   Teuchos::RCP<Vector<
00351     Scalar,
00352     LocalOrdinal,
00353     GlobalOrdinal,
00354     Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> > >
00355   Vector<Scalar,
00356     LocalOrdinal,
00357     GlobalOrdinal,
00358     Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> >::
00359   offsetViewNonConst (const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> > >& subMap,
00360                       size_t offset)
00361   {
00362     typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal,
00363       Kokkos::Compat::KokkosDeviceWrapperNode<DeviceType> > V;
00364     return Teuchos::rcp_const_cast<V> (this->offsetView (subMap, offset));
00365   }
00366 
00367 } // namespace Tpetra
00368 
00369 
00370 #endif // TPETRA_VECTOR_DEF_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines