|
Tpetra Matrix/Vector Services
Version of the Day
|
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
1.7.6.1