typename Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node, classic>::mag_type TPETRA_DEPRECATED Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node, classic>:: normWeighted (const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node, classic>& weights) const { using Kokkos::ALL; using Kokkos::subview; using Teuchos::Comm; using Teuchos::RCP; using Teuchos::reduceAll; using Teuchos::REDUCE_SUM; typedef Kokkos::Details::ArithTraits<impl_scalar_type> ATS; typedef Kokkos::Details::ArithTraits<mag_type> ATM; typedef Kokkos::View<mag_type, device_type> norm_view_type; // just one const char tfecfFuncName[] = "normWeighted: "; #ifdef HAVE_TPETRA_DEBUG TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC( ! this->getMap ()->isCompatible (*weights.getMap ()), std::runtime_error, "Vectors do not have compatible Maps:" << std::endl << "this->getMap(): " << std::endl << *this->getMap() << "weights.getMap(): " << std::endl << *weights.getMap() << std::endl); #else const size_t lclNumRows = this->getLocalLength (); TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC( lclNumRows != weights.getLocalLength (), std::runtime_error, "Vectors do not have the same local length."); #endif // HAVE_TPETRA_DEBUG norm_view_type lclNrm ("lclNrm"); // local norm mag_type gblNrm = ATM::zero (); // return value auto X_lcl = this->template getLocalView<device_type> (); auto W_lcl = this->template getLocalView<device_type> (); KokkosBlas::nrm2w_squared (lclNrm, subview (X_lcl, ALL (), 0), subview (W_lcl, ALL (), 0)); const mag_type OneOverN = ATM::one () / static_cast<mag_type> (this->getGlobalLength ()); RCP<const Comm<int> > comm = this->getMap ().is_null () ? Teuchos::null : this->getMap ()->getComm (); if (! comm.is_null () && this->isDistributed ()) { // Assume that MPI can access device memory. reduceAll<int, mag_type> (*comm, REDUCE_SUM, 1, lclNrm.ptr_on_device (), &gblNrm); gblNrm = ATM::sqrt (gblNrm * OneOverN); } else { auto lclNrm_h = Kokkos::create_mirror_view (lclNrm); Kokkos::deep_copy (lclNrm_h, lclNrm); gblNrm = ATM::sqrt (ATS::magnitude (lclNrm_h()) * OneOverN); } return gblNrm; }
Teuchos::RCP<const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node, classic> > Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node, classic>:: offsetView (const Teuchos::RCP<const map_type>& subMap, const size_t offset) const { using Kokkos::ALL; using Kokkos::subview; using Teuchos::rcp; typedef Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node, classic> V; const size_t newNumRows = subMap->getNodeNumElements (); const bool tooManyElts = newNumRows + offset > this->getOrigNumLocalRows (); if (tooManyElts) { const int myRank = this->getMap ()->getComm ()->getRank (); TEUCHOS_TEST_FOR_EXCEPTION( newNumRows + offset > this->getLocalLength (), std::runtime_error, "Tpetra::Vector::offsetView(NonConst): Invalid input Map. The input " "Map owns " << newNumRows << " entries on process " << myRank << ". " "offset = " << offset << ". Yet, the Vector contains only " << this->getOrigNumLocalRows () << " rows on this process."); } const std::pair<size_t, size_t> offsetPair (offset, offset + newNumRows); // Need 'this->' to get view_ and origView_ from parent class. return rcp (new V (subMap, subview (this->view_, offsetPair, ALL ()), this->origView_)); }