10#ifndef TPETRA_MULTIVECTOR_DECL_HPP
11#define TPETRA_MULTIVECTOR_DECL_HPP
19#include "Tpetra_DistObject.hpp"
22#include "Kokkos_DualView.hpp"
23#include "Teuchos_BLAS_types.hpp"
24#include "Teuchos_DataAccess.hpp"
25#include "Teuchos_Range1D.hpp"
26#include "KokkosKernels_ArithTraits.hpp"
27#include "KokkosKernels_InnerProductSpaceTraits.hpp"
28#include "Tpetra_KokkosRefactor_Details_MultiVectorLocalDeepCopy.hpp"
29#include "Tpetra_Access.hpp"
30#include "Tpetra_Details_WrappedDualView.hpp"
33#ifdef HAVE_TPETRACORE_TEUCHOSNUMERICS
34#ifndef DOXYGEN_SHOULD_SKIP_THIS
36template <
class OrdinalType,
class ScalarType>
37class SerialDenseMatrix;
64template <
class DS,
class DL,
class DG,
class DN,
65 class SS,
class SL,
class SG,
class SN>
69#ifdef HAVE_TPETRACORE_TEUCHOSNUMERICS
76template <
class ST,
class LO,
class GO,
class NT>
78 const Teuchos::SerialDenseMatrix<int, ST>& src);
86template <
class ST,
class LO,
class GO,
class NT>
87void deep_copy(Teuchos::SerialDenseMatrix<int, ST>& dst,
98template <
class ST,
class LO,
class GO,
class NT>
111template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
112Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
114 const size_t numVectors);
119template <
class SC,
class LO,
class GO,
class NT>
120Teuchos::ArrayView<const size_t>
342template <
class Scalar,
369 typename KokkosKernels::ArithTraits<Scalar>::val_type;
388 typename KokkosKernels::Details::InnerProductSpaceTraits<impl_scalar_type>::dot_type;
396 using mag_type =
typename KokkosKernels::ArithTraits<impl_scalar_type>::mag_type;
431 using host_view_type =
typename dual_view_type::t_host;
432 using device_view_type =
typename dual_view_type::t_dev;
448 const size_t numVecs,
449 const bool zeroOut =
true);
462 const Teuchos::DataAccess copyOrView);
480 const Teuchos::ArrayView<const Scalar>& A,
482 const size_t NumVectors);
498 const Teuchos::ArrayView<
const Teuchos::ArrayView<const Scalar>>& ArrayOfPtrs,
499 const size_t NumVectors);
555 const typename dual_view_type::t_dev& d_view);
592 const wrapped_dual_view_type& d_view);
622 const Teuchos::ArrayView<const size_t>& whichVectors);
642 const wrapped_dual_view_type& view,
643 const Teuchos::ArrayView<const size_t>& whichVectors);
675 const Teuchos::ArrayView<const size_t>& whichVectors);
738 const Teuchos::RCP<const map_type>& subMap,
749 const size_t offset = 0);
800#ifdef KOKKOS_ENABLE_SERIAL
801 !std::is_same<execution_space, Kokkos::Serial>::value;
873 template <
typename T>
874 typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value,
void>::type
939 template <
typename T>
940 typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value,
void>::type
1015 template <
typename T>
1016 typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value,
void>::type
1079 template <
typename T>
1080 typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value,
void>::type
1099 template <
typename T>
1100 typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value,
void>::type
1239 Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1243 Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1244 subCopy(
const Teuchos::ArrayView<const size_t>& cols)
const;
1247 Teuchos::RCP<const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1251 Teuchos::RCP<const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1252 subView(
const Teuchos::ArrayView<const size_t>& cols)
const;
1255 Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1259 Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1324 Teuchos::RCP<const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1326 const size_t offset)
const;
1345 Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1347 const size_t offset);
1350 Teuchos::RCP<const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1354 Teuchos::RCP<Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
1358 Teuchos::ArrayRCP<const Scalar>
getData(
size_t j)
const;
1372 const size_t LDA)
const;
1381 get2dCopy(
const Teuchos::ArrayView<
const Teuchos::ArrayView<Scalar>>& ArrayOfPtrs)
const;
1391 Teuchos::ArrayRCP<Teuchos::ArrayRCP<const Scalar>>
get2dView()
const;
1434 template <
class TargetDeviceType>
1473 template <
class TargetDeviceType>
1474 typename std::remove_reference<decltype(std::declval<dual_view_type>().template view<TargetDeviceType>())>::type::const_type
1476 return view_.template getView<TargetDeviceType>(s);
1479 template <
class TargetDeviceType>
1480 typename std::remove_reference<decltype(std::declval<dual_view_type>().template view<TargetDeviceType>())>::type
1482 return view_.template getView<TargetDeviceType>(s);
1485 template <
class TargetDeviceType>
1486 typename std::remove_reference<decltype(std::declval<dual_view_type>().template view<TargetDeviceType>())>::type
1488 return view_.template getView<TargetDeviceType>(s);
1510 const Teuchos::ArrayView<dot_type>& dots)
const;
1523 template <
typename T>
1524 typename std::enable_if<!(std::is_same<dot_type, T>::value),
void>::type
1526 const Teuchos::ArrayView<T>& dots)
const {
1527 const size_t sz =
static_cast<size_t>(dots.size());
1528 Teuchos::Array<dot_type> dts(sz);
1530 for (
size_t i = 0; i < sz; ++i) {
1537 template <
typename T>
1538 typename std::enable_if<!(std::is_same<dot_type, T>::value),
void>::type
1540 std::vector<T>& dots)
const {
1541 const size_t sz = dots.size();
1542 Teuchos::Array<dot_type> dts(sz);
1544 for (
size_t i = 0; i < sz; ++i) {
1569 const Kokkos::View<dot_type*, Kokkos::HostSpace>& dots)
const;
1571 template <
class ViewType>
1573 dot(
typename std::enable_if<std::is_same<typename ViewType::value_type, dot_type>::value &&
1574 std::is_same<typename ViewType::memory_space, typename device_type::memory_space>::value,
1576 const ViewType& dots)
const {
1577 const Kokkos::View<dot_type*, Kokkos::HostSpace> h_dots(
"Tpetra::Dots", dots.extent(0));
1578 this->
dot(A, h_dots);
1580 Kokkos::deep_copy(dots, h_dots);
1595 template <
typename T>
1596 typename std::enable_if<!(std::is_same<dot_type, T>::value),
void>::type
1598 const Kokkos::View<T*, device_type>& dots)
const {
1599 const size_t numDots = dots.extent(0);
1600 Kokkos::View<dot_type*, device_type> dts(
"MV::dot tmp", numDots);
1611 Kokkos::deep_copy(dots, dts);
1637 void scale(
const Teuchos::ArrayView<const Scalar>& alpha);
1647 void scale(
const Kokkos::View<const impl_scalar_type*, device_type>& alpha);
1670 const Scalar& beta);
1683 const Scalar& gamma);
1697 norm1(
const Kokkos::View<mag_type*, Kokkos::HostSpace>& norms)
const;
1699 template <
class ViewType>
1700 typename std::enable_if<std::is_same<typename ViewType::value_type, mag_type>::value &&
1701 std::is_same<typename ViewType::memory_space, typename device_type::memory_space>::value>::type
1702 norm1(
const ViewType& norms)
const {
1706 using host_norms_view_type = Kokkos::View<mag_type*, Kokkos::HostSpace>;
1707 host_norms_view_type h_norms(
"Tpetra::MV::h_norms", norms.extent(0));
1708 this->
norm1(h_norms);
1728 template <
typename T>
1729 typename std::enable_if<!(std::is_same<mag_type, T>::value),
void>::type
1730 norm1(
const Kokkos::View<T*, device_type>& norms)
const {
1731 const size_t numNorms = norms.extent(0);
1732 Kokkos::View<mag_type*, device_type> tmpNorms(
"MV::norm1 tmp", numNorms);
1734 this->
norm1(tmpNorms);
1741 Kokkos::deep_copy(norms, tmpNorms);
1747 void norm1(
const Teuchos::ArrayView<mag_type>& norms)
const;
1763 template <
typename T>
1764 typename std::enable_if<!(std::is_same<mag_type, T>::value),
void>::type
1765 norm1(
const Teuchos::ArrayView<T>& norms)
const {
1766 typedef typename Teuchos::ArrayView<T>::size_type size_type;
1767 const size_type sz = norms.size();
1768 Teuchos::Array<mag_type> theNorms(sz);
1769 this->
norm1(theNorms);
1770 for (size_type i = 0; i < sz; ++i) {
1772 norms[i] = theNorms[i];
1789 norm2(
const Kokkos::View<mag_type*, Kokkos::HostSpace>& norms)
const;
1791 template <
class ViewType>
1792 typename std::enable_if<std::is_same<typename ViewType::value_type, mag_type>::value &&
1793 std::is_same<typename ViewType::memory_space, typename device_type::memory_space>::value>::type
1794 norm2(
const ViewType& norms)
const {
1798 using host_norms_view_type = Kokkos::View<mag_type*, Kokkos::HostSpace>;
1799 host_norms_view_type h_norms(
"Tpetra::MV::h_norms", norms.extent(0));
1800 this->
norm2(h_norms);
1802 Kokkos::deep_copy(norms, h_norms);
1818 template <
typename T>
1819 typename std::enable_if<!(std::is_same<mag_type, T>::value),
void>::type
1820 norm2(
const Kokkos::View<T*, device_type>& norms)
const {
1821 const size_t numNorms = norms.extent(0);
1822 Kokkos::View<mag_type*, device_type> theNorms(
"MV::norm2 tmp", numNorms);
1824 this->
norm2(theNorms);
1831 Kokkos::deep_copy(norms, theNorms);
1837 void norm2(
const Teuchos::ArrayView<mag_type>& norms)
const;
1853 template <
typename T>
1854 typename std::enable_if<!(std::is_same<mag_type, T>::value),
void>::type
1855 norm2(
const Teuchos::ArrayView<T>& norms)
const {
1856 typedef typename Teuchos::ArrayView<T>::size_type size_type;
1857 const size_type sz = norms.size();
1858 Teuchos::Array<mag_type> theNorms(sz);
1859 this->
norm2(theNorms);
1860 for (size_type i = 0; i < sz; ++i) {
1862 norms[i] = theNorms[i];
1872 void normInf(
const Kokkos::View<mag_type*, Kokkos::HostSpace>& norms)
const;
1874 template <
class ViewType>
1875 typename std::enable_if<std::is_same<typename ViewType::value_type, mag_type>::value &&
1876 std::is_same<typename ViewType::memory_space, typename device_type::memory_space>::value>::type
1877 normInf(
const ViewType& norms)
const {
1881 using host_norms_view_type = Kokkos::View<mag_type*, Kokkos::HostSpace>;
1882 host_norms_view_type h_norms(
"Tpetra::MV::h_norms", norms.extent(0));
1901 template <
typename T>
1902 typename std::enable_if<!(std::is_same<mag_type, T>::value),
void>::type
1903 normInf(
const Kokkos::View<T*, device_type>& norms)
const {
1904 const size_t numNorms = norms.extent(0);
1905 Kokkos::View<mag_type*, device_type> theNorms(
"MV::normInf tmp", numNorms);
1914 Kokkos::deep_copy(norms, theNorms);
1921 void normInf(
const Teuchos::ArrayView<mag_type>& norms)
const;
1938 template <
typename T>
1939 typename std::enable_if<!(std::is_same<mag_type, T>::value),
void>::type
1940 normInf(
const Teuchos::ArrayView<T>& norms)
const {
1941 typedef typename Teuchos::ArrayView<T>::size_type size_type;
1942 const size_type sz = norms.size();
1943 Teuchos::Array<mag_type> theNorms(sz);
1944 this->
norm2(theNorms);
1945 for (size_type i = 0; i < sz; ++i) {
1947 norms[i] = theNorms[i];
1955 void meanValue(
const Teuchos::ArrayView<impl_scalar_type>& means)
const;
1957 template <
typename T>
1958 typename std::enable_if<!std::is_same<impl_scalar_type, T>::value,
void>::type
1959 meanValue(
const Teuchos::ArrayView<T>& means)
const {
1960 typedef typename Teuchos::Array<T>::size_type size_type;
1961 const size_type numMeans = means.size();
1963 Teuchos::Array<impl_scalar_type> theMeans(numMeans);
1965 for (size_type k = 0; k < numMeans; ++k) {
1966 means[k] =
static_cast<T
>(theMeans[k]);
1977 Teuchos::ETransp transB,
1978 const Scalar& alpha,
1981 const Scalar& beta);
2076 const Teuchos::EVerbosityLevel verbLevel =
2077 Teuchos::Describable::verbLevel_default)
const override;
2107 TEUCHOS_TEST_FOR_EXCEPTION(
2108 copyOrView == Teuchos::Copy, std::invalid_argument,
2109 "Tpetra::MultiVector::setCopyOrView: The Kokkos refactor version of "
2110 "MultiVector _only_ implements view semantics. You may not call this "
2111 "method with copyOrView = Teuchos::Copy. The only valid argument is "
2124 return Teuchos::View;
2147 Teuchos::RCP<MultiVector<T, LocalOrdinal, GlobalOrdinal, Node>>
2166 template <
class DS,
class DL,
class DG,
class DN,
2167 class SS,
class SL,
class SG,
class SN>
2193 template <
class SC,
class LO,
class GO,
class NT>
2194 friend ::Teuchos::ArrayView<const size_t> getMultiVectorWhichVectors(const ::Tpetra::MultiVector<SC, LO, GO, NT>& X);
2233 const std::string& className,
2234 const Teuchos::EVerbosityLevel verbLevel =
2235 Teuchos::Describable::verbLevel_default)
const;
2238 bool vectorIndexOutOfRange(
const size_t VectorIndex)
const;
2245 Teuchos::ArrayRCP<T>
2280 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs,
2281 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs,
2286 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteToLIDs,
2287 const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& permuteFromLIDs,
2292 const Kokkos::DualView<
2301 size_t& constantNumPackets,
2306 const Kokkos::DualView<
2315 size_t& constantNumPackets)
override;
2318 unpackAndCombine(
const Kokkos::DualView<
2328 const size_t constantNumPackets,
2333 unpackAndCombine(
const Kokkos::DualView<
2343 const size_t constantNumPackets,
2349 template <
class NO = Node>
2350 typename std::enable_if<std::is_same<typename Tpetra::Details::DefaultTypes::CommBufferMemorySpace<typename NO::execution_space>::type,
2351 typename NO::device_type::memory_space>::value,
2353 reallocImportsIfNeededImpl(
const size_t newSize,
2355 const std::string* prefix,
2356 const bool areRemoteLIDsContiguous,
2361 template <
class NO = Node>
2362 typename std::enable_if<!std::is_same<typename Tpetra::Details::DefaultTypes::CommBufferMemorySpace<typename NO::execution_space>::type,
2363 typename NO::device_type::memory_space>::value,
2365 reallocImportsIfNeededImpl(
const size_t newSize,
2367 const std::string* prefix,
2368 const bool areRemoteLIDsContiguous,
2375 const std::string* prefix,
2376 const bool areRemoteLIDsContiguous =
false,
2380 bool importsAreAliased();
2383 Kokkos::DualView<impl_scalar_type*, buffer_device_type> unaliased_imports_;
2388template <
class SC,
class LO,
class GO,
class NT>
2389Teuchos::ArrayView<const size_t>
2396template <
class ST,
class LO,
class GO,
class NT>
2406template <
class DS,
class DL,
class DG,
class DN,
2407 class SS,
class SL,
class SG,
class SN>
2410 using ::Tpetra::getMultiVectorWhichVectors;
2412 TEUCHOS_TEST_FOR_EXCEPTION(
2415 std::invalid_argument,
2416 "Tpetra::deep_copy: Global dimensions of the two Tpetra::MultiVector "
2417 "objects do not match. src has dimensions ["
2419 <<
"," << src.
getNumVectors() <<
"], and dst has dimensions ["
2423 TEUCHOS_TEST_FOR_EXCEPTION(
2425 "Tpetra::deep_copy: The local row counts of the two Tpetra::MultiVector "
2426 "objects do not match. src has "
2433 if (srcMostUpToDateOnDevice) {
2443 auto dstWhichVecs = getMultiVectorWhichVectors(dst);
2444 auto srcWhichVecs = getMultiVectorWhichVectors(src);
2446 if (srcMostUpToDateOnDevice) {
2469template <
class SC,
class LO,
class GO,
class NT>
2470class TypeNameTraits<
Tpetra::MultiVector<SC, LO, GO, NT>> {
2472 static std::string name() {
2473 return std::string(
"Tpetra::MultiVector<") +
2474 TypeNameTraits<SC>::name() +
"," +
2475 TypeNameTraits<LO>::name() +
"," +
2476 TypeNameTraits<GO>::name() +
"," +
2477 TypeNameTraits<NT>::name() +
">";
2481 concreteName(
const Tpetra::MultiVector<SC, LO, GO, NT>&) {
Declaration of Tpetra::Details::Behavior, a class that describes Tpetra's behavior.
Forward declaration of Tpetra::FEMultiVector.
Forward declaration of Tpetra::Map.
Forward declaration of Tpetra::MultiVector.
Forward declaration of Tpetra::Vector.
A wrapper around Kokkos::DualView to safely manage data that might be replicated between host and dev...
DistObject(const Teuchos::RCP< const map_type > &map)
A parallel distribution of indices over processes.
typename node_type::device_type device_type
One or more distributed dense vectors.
MultiVector(const Teuchos::RCP< const map_type > &map, const Teuchos::ArrayView< const Scalar > &A, const size_t LDA, const size_t NumVectors)
Create multivector by copying two-dimensional array of local data.
typename map_type::global_ordinal_type global_ordinal_type
MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > & operator=(MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &&)=default
Move assigment (shallow move).
void reciprocal(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A)
Put element-wise reciprocal values of input Multi-vector in target, this(i,j) = 1/A(i,...
void normInf(const Kokkos::View< mag_type *, Kokkos::HostSpace > &norms) const
Compute the infinity-norm of each vector (column), storing the result in a host View.
void get1dCopy(const Teuchos::ArrayView< Scalar > &A, const size_t LDA) const
Fill the given array with a copy of this multivector's local values.
size_t getStride() const
Stride between columns in the multivector.
typename map_type::node_type node_type
void scale(const Scalar &alpha, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A)
Scale in place: this = alpha * A.
std::enable_if<!(std::is_same< dot_type, T >::value), void >::type dot(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Teuchos::ArrayView< T > &dots) const
Compute the dot product of each corresponding pair of vectors (columns) in A and B.
Teuchos::RCP< const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > subView(const Teuchos::ArrayView< const size_t > &cols) const
Return a const MultiVector with const views of selected columns.
virtual bool reallocImportsIfNeeded(const size_t newSize, const bool verbose, const std::string *prefix, const bool areRemoteLIDsContiguous=false, const CombineMode CM=INSERT) override
Reallocate imports_ if needed.
std::enable_if<!(std::is_same< mag_type, T >::value), void >::type norm1(const Teuchos::ArrayView< T > &norms) const
Compute the one-norm of each vector (column).
std::enable_if<!(std::is_same< mag_type, T >::value), void >::type norm2(const Kokkos::View< T *, device_type > &norms) const
Compute the two-norm of each vector (column), storing the result in a device view.
void reduce()
Sum values of a locally replicated multivector across all processes.
virtual bool checkSizes(const SrcDistObject &sourceObj) override
Whether data redistribution between sourceObj and this object is legal.
void randomize()
Set all values in the multivector to pseudorandom numbers.
typename map_type::local_ordinal_type local_ordinal_type
void deep_copy(MultiVector< DS, DL, DG, DN > &dst, const MultiVector< SS, SL, SG, SN > &src)
Copy the contents of the MultiVector src into dst.
void scale(const Scalar &alpha)
Scale in place: this = alpha*this.
Teuchos::RCP< const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > subView(const Teuchos::Range1D &colRng) const
Return a const MultiVector with const views of selected columns.
MultiVector(const Teuchos::RCP< const map_type > &map, const dual_view_type &view, const Teuchos::ArrayView< const size_t > &whichVectors)
Expert mode constructor for noncontiguous views.
std::enable_if<!std::is_same< T, impl_scalar_type >::value &&std::is_convertible< T, impl_scalar_type >::value, void >::type replaceGlobalValue(GlobalOrdinal globalRow, size_t col, const T &value)
Like the above replaceGlobalValue, but only enabled if T differs from impl_scalar_type.
void dot(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Teuchos::ArrayView< dot_type > &dots) const
Compute the dot product of each corresponding pair of vectors (columns) in A and B.
void describeImpl(Teuchos::FancyOStream &out, const std::string &className, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Implementation of describe() for this class, and its subclass Vector.
Teuchos::RCP< const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > offsetView(const Teuchos::RCP< const map_type > &subMap, const size_t offset) const
Return a const view of a subset of rows.
dual_view_type::t_dev getLocalViewDevice(Access::ReadWriteStruct)
Return a mutable, up-to-date view of this MultiVector's local data on device. This requires that ther...
virtual void removeEmptyProcessesInPlace(const Teuchos::RCP< const map_type > &newMap) override
Remove processes owning zero rows from the Map and their communicator.
Teuchos::ArrayRCP< Scalar > get1dViewNonConst()
Nonconst persisting (1-D) view of this multivector's local values.
void assign(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &src)
Copy the contents of src into *this (deep copy).
std::enable_if<!(std::is_same< mag_type, T >::value), void >::type normInf(const Teuchos::ArrayView< T > &norms) const
Compute the infinity-norm of each vector (column), storing the result in a Teuchos::ArrayView.
MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > & operator=(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &)=default
Copy assigment (shallow copy).
MultiVector(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &source, const Teuchos::DataAccess copyOrView)
Copy constructor, with option to do deep or shallow copy.
Teuchos::RCP< Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getVectorNonConst(const size_t j)
Return a Vector which is a nonconst view of column j.
void meanValue(const Teuchos::ArrayView< impl_scalar_type > &means) const
Compute mean (average) value of each column.
Kokkos::DualView< impl_scalar_type **, Kokkos::LayoutLeft, device_type > dual_view_type
std::string descriptionImpl(const std::string &className) const
Implementation of description() for this class, and its subclass Vector.
void multiply(Teuchos::ETransp transA, Teuchos::ETransp transB, const Scalar &alpha, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, const Scalar &beta)
Matrix-matrix multiplication: this = beta*this + alpha*op(A)*op(B).
std::enable_if<!(std::is_same< mag_type, T >::value), void >::type normInf(const Kokkos::View< T *, device_type > &norms) const
Compute the infinity-norm of each vector (column), storing the result in a device view.
bool need_sync_device() const
Whether this MultiVector needs synchronization to the device.
wrapped_dual_view_type view_
MultiVector(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const map_type &subMap, const size_t offset=0)
"Offset view" constructor, that takes the new Map as a const Map& rather than by RCP.
void replaceLocalValue(const LocalOrdinal lclRow, const size_t col, const impl_scalar_type &value)
Replace value in host memory, using local (row) index.
typename KokkosKernels::ArithTraits< Scalar >::val_type impl_scalar_type
virtual void copyAndPermute(const SrcDistObject &sourceObj, const size_t numSameIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteToLIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteFromLIDs, const CombineMode CM) override
Perform copies and permutations that are local to the calling (MPI) process.
std::remove_reference< decltype(std::declval< dual_view_type >().templateview< TargetDeviceType >())>::type::const_type getLocalView(Access::ReadOnlyStruct s) const
Return a view of the local data on a specific device, with the given access mode. The return type is ...
std::enable_if<!std::is_same< T, impl_scalar_type >::value &&std::is_convertible< T, impl_scalar_type >::value, void >::type putScalar(const T &value)
Set all values in the multivector with the given value.
void swap(MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &mv)
Swap contents of mv with contents of *this.
typename DistObject< scalar_type, local_ordinal_type, global_ordinal_type, node_type >::buffer_device_type buffer_device_type
size_t getLocalLength() const
Local number of rows on the calling process.
std::enable_if<!std::is_same< T, impl_scalar_type >::value &&std::is_convertible< T, impl_scalar_type >::value, void >::type sumIntoGlobalValue(const GlobalOrdinal gblRow, const size_t col, const T &val, const bool atomic=useAtomicUpdatesByDefault)
Like the above sumIntoGlobalValue, but only enabled if T differs from impl_scalar_type.
Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > subCopy(const Teuchos::Range1D &colRng) const
Return a MultiVector with copies of selected columns.
Teuchos::ArrayRCP< const Scalar > getData(size_t j) const
Const view of the local values in a particular vector of this multivector.
bool need_sync_host() const
Whether this MultiVector needs synchronization to the host.
Teuchos::RCP< const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getVector(const size_t j) const
Return a Vector which is a const view of column j.
virtual void copyAndPermute(const SrcDistObject &sourceObj, const size_t numSameIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteToLIDs, const Kokkos::DualView< const local_ordinal_type *, buffer_device_type > &permuteFromLIDs, const CombineMode CM, const execution_space &space) override
Same as copyAndPermute, but do operations in space.
bool need_sync() const
Whether this MultiVector needs synchronization to the given space.
std::enable_if<!(std::is_same< mag_type, T >::value), void >::type norm1(const Kokkos::View< T *, device_type > &norms) const
Compute the one-norm of each vector (column), storing the result in a device view.
void norm2(const Kokkos::View< mag_type *, Kokkos::HostSpace > &norms) const
Compute the two-norm of each vector (column), storing the result in a host View.
MultiVector(const Teuchos::RCP< const map_type > &map, const wrapped_dual_view_type &d_view)
Expert mode constructor, that takes a WrappedDualView of the MultiVector's data.
global_size_t getGlobalLength() const
Global number of rows in the multivector.
Teuchos::ArrayRCP< const Scalar > get1dView() const
Const persisting (1-D) view of this multivector's local values.
dual_view_type::t_host getLocalViewHost(Access::ReadWriteStruct)
Return a mutable, up-to-date view of this MultiVector's local data on host. This requires that there ...
Teuchos::ArrayRCP< T > getSubArrayRCP(Teuchos::ArrayRCP< T > arr, size_t j) const
Persisting view of j-th column in the given ArrayRCP.
void replaceGlobalValue(const GlobalOrdinal gblRow, const size_t col, const impl_scalar_type &value)
Replace value in host memory, using global row index.
typename map_type::device_type device_type
typename KokkosKernels::ArithTraits< impl_scalar_type >::mag_type mag_type
void elementWiseMultiply(Scalar scalarAB, const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, Scalar scalarThis)
Multiply a Vector A elementwise by a MultiVector B.
std::enable_if<!(std::is_same< mag_type, T >::value), void >::type norm2(const Teuchos::ArrayView< T > &norms) const
Compute the two-norm of each vector (column).
void setCopyOrView(const Teuchos::DataAccess copyOrView)
Set whether this has copy (copyOrView = Teuchos::Copy) or view (copyOrView = Teuchos::View) semantics...
size_t getNumVectors() const
Number of columns in the multivector.
MultiVector(const Teuchos::RCP< const map_type > &map, const wrapped_dual_view_type &view, const Teuchos::ArrayView< const size_t > &whichVectors)
Expert mode constructor for noncontiguous views.
Map< LO, GO, node_type > map_type
std::enable_if<!(std::is_same< dot_type, T >::value), void >::type dot(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Kokkos::View< T *, device_type > &dots) const
Compute the dot product of each corresponding pair of vectors (columns) in A and B,...
virtual size_t constantNumberOfPackets() const override
Number of packets to send per LID.
wrapped_dual_view_type getWrappedDualView() const
Return the wrapped dual view holding this MultiVector's local data.
void dot(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Kokkos::View< dot_type *, Kokkos::HostSpace > &dots) const
Compute the dot product of each corresponding pair of vectors (columns) in A and B,...
void sumIntoLocalValue(const LocalOrdinal lclRow, const size_t col, const impl_scalar_type &val, const bool atomic=useAtomicUpdatesByDefault)
Update (+=) a value in host memory, using local row index.
void norm1(const Teuchos::ArrayView< mag_type > &norms) const
Compute the one-norm of each vector (column).
typename KokkosKernels::Details::InnerProductSpaceTraits< impl_scalar_type >::dot_type dot_type
void replaceMap(const Teuchos::RCP< const map_type > &map)
Replace the underlying Map in place.
Teuchos::DataAccess getCopyOrView() const
Get whether this has copy (copyOrView = Teuchos::Copy) or view (copyOrView = Teuchos::View) semantics...
Teuchos::RCP< MultiVector< T, LocalOrdinal, GlobalOrdinal, Node > > convert() const
Return another MultiVector with the same entries, but converted to a different Scalar type T.
MultiVector(const Teuchos::RCP< const map_type > &map, const Teuchos::ArrayView< const Teuchos::ArrayView< const Scalar > > &ArrayOfPtrs, const size_t NumVectors)
Create multivector by copying array of views of local data.
void scale(const Kokkos::View< const impl_scalar_type *, device_type > &alpha)
Scale each column in place: this[j] = alpha[j]*this[j].
dual_view_type::t_dev::const_type getLocalViewDevice(Access::ReadOnlyStruct) const
Return a read-only, up-to-date view of this MultiVector's local data on device. This requires that th...
typename device_type::execution_space execution_space
void norm2(const Teuchos::ArrayView< mag_type > &norms) const
Compute the two-norm of each vector (column).
void abs(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A)
Put element-wise absolute values of input Multi-vector in target: A = abs(this).
MultiVector(const Teuchos::RCP< const map_type > &map, const dual_view_type &view)
Constructor, that takes a Kokkos::DualView of the MultiVector's data, and returns a MultiVector that ...
void norm1(const Kokkos::View< mag_type *, Kokkos::HostSpace > &norms) const
Compute the one-norm of each vector (column), storing the result in a host view.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const override
Print the object with the given verbosity level to a FancyOStream.
void scale(const Teuchos::ArrayView< const Scalar > &alpha)
Scale each column in place: this[j] = alpha[j]*this[j].
void get2dCopy(const Teuchos::ArrayView< const Teuchos::ArrayView< Scalar > > &ArrayOfPtrs) const
Fill the given array with a copy of this multivector's local values.
void sumIntoGlobalValue(const GlobalOrdinal gblRow, const size_t col, const impl_scalar_type &value, const bool atomic=useAtomicUpdatesByDefault)
Update (+=) a value in host memory, using global row index.
void normInf(const Teuchos::ArrayView< mag_type > &norms) const
Compute the infinity-norm of each vector (column), storing the result in a Teuchos::ArrayView.
bool aliases(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &other) const
Whether this multivector's memory might alias other. This is conservative: if either this or other is...
dual_view_type::t_dev getLocalViewDevice(Access::OverwriteAllStruct)
Return a mutable view of this MultiVector's local data on device, assuming all existing data will be ...
dual_view_type::t_host::const_type getLocalViewHost(Access::ReadOnlyStruct) const
Return a read-only, up-to-date view of this MultiVector's local data on host. This requires that ther...
Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > subViewNonConst(const Teuchos::Range1D &colRng)
Return a MultiVector with views of selected columns.
MultiVector(const Teuchos::RCP< const map_type > &map, const dual_view_type &view, const dual_view_type &origView)
Expert mode constructor, that takes a Kokkos::DualView of the MultiVector's data and the "original" K...
MultiVector(MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &&)=default
Move constructor (shallow move).
MultiVector(const Teuchos::RCP< const map_type > &map, const dual_view_type &view, const dual_view_type &origView, const Teuchos::ArrayView< const size_t > &whichVectors)
Expert mode constructor for noncontiguous views, with original view.
Teuchos::Array< size_t > whichVectors_
MultiVector(const Teuchos::RCP< const map_type > &map, const size_t numVecs, const bool zeroOut=true)
Basic constuctor.
Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > subCopy(const Teuchos::ArrayView< const size_t > &cols) const
Return a MultiVector with copies of selected columns.
Teuchos::ArrayRCP< Scalar > getDataNonConst(size_t j)
View of the local values in a particular vector of this multivector.
bool isConstantStride() const
Whether this multivector has constant stride between columns.
size_t getOrigNumLocalCols() const
"Original" number of columns in the (local) data.
MultiVector(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const Teuchos::RCP< const map_type > &subMap, const local_ordinal_type rowOffset=0)
"Offset view" constructor; make a view of a contiguous subset of rows on each process.
Teuchos::ArrayRCP< Teuchos::ArrayRCP< Scalar > > get2dViewNonConst()
Return non-const persisting pointers to values.
virtual std::string description() const override
A simple one-line description of this object.
std::enable_if<!(std::is_same< dot_type, T >::value), void >::type dot(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, std::vector< T > &dots) const
Like the above dot() overload, but for std::vector output.
std::enable_if<!std::is_same< T, impl_scalar_type >::value &&std::is_convertible< T, impl_scalar_type >::value, void >::type replaceLocalValue(const LocalOrdinal lclRow, const size_t col, const T &val)
Like the above replaceLocalValue, but only enabled if T differs from impl_scalar_type.
Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > subViewNonConst(const Teuchos::ArrayView< const size_t > &cols)
Return a MultiVector with views of selected columns.
Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > offsetViewNonConst(const Teuchos::RCP< const map_type > &subMap, const size_t offset)
Return a nonconst view of a subset of rows.
MultiVector(const Teuchos::RCP< const map_type > &map, const typename dual_view_type::t_dev &d_view)
Constructor, that takes a Kokkos::View of the MultiVector's data (living in the Device's memory space...
void randomize(const Scalar &minVal, const Scalar &maxVal)
Set all values in the multivector to pseudorandom numbers in the given range.
dual_view_type::t_host getLocalViewHost(Access::OverwriteAllStruct)
Return a mutable view of this MultiVector's local data on host, assuming all existing data will be ov...
std::string localDescribeToString(const Teuchos::EVerbosityLevel vl) const
Print the calling process' verbose describe() information to the returned string.
std::enable_if<!std::is_same< T, impl_scalar_type >::value &&std::is_convertible< T, impl_scalar_type >::value, void >::type sumIntoLocalValue(const LocalOrdinal lclRow, const size_t col, const T &val, const bool atomic=useAtomicUpdatesByDefault)
Like the above sumIntoLocalValue, but only enabled if T differs from impl_scalar_type.
bool isSameSize(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &vec) const
size_t getOrigNumLocalRows() const
"Original" number of rows in the (local) data.
MultiVector(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &)=default
Copy constructor (shallow copy).
Teuchos::ArrayRCP< Teuchos::ArrayRCP< const Scalar > > get2dView() const
Return const persisting pointers to values.
virtual ~MultiVector()=default
Destructor (virtual for memory safety of derived classes).
MultiVector(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &X, const size_t j)
Single-column subview constructor, for derived classes ONLY.
static const bool useAtomicUpdatesByDefault
void update(const Scalar &alpha, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Scalar &beta, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &B, const Scalar &gamma)
Update: this = gamma*this + alpha*A + beta*B.
void putScalar(const Scalar &value)
Set all values in the multivector with the given value.
void update(const Scalar &alpha, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Scalar &beta)
Update: this = beta*this + alpha*A.
Abstract base class for objects that can be the source of an Import or Export operation.
A distributed dense vector.
Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > createMultiVector(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map, const size_t numVectors)
Nonmember MultiVector "constructor": Create a MultiVector from a given Map.
void localDeepCopyConstStride(const DstViewType &dst, const SrcViewType &src)
Implementation of Tpetra::MultiVector deep copy of local data, for when both the source and destinati...
void localDeepCopy(const DstViewType &dst, const SrcViewType &src, const bool dstConstStride, const bool srcConstStride, const DstWhichVecsType &dstWhichVecs, const SrcWhichVecsType &srcWhichVecs)
Implementation of Tpetra::MultiVector deep copy of local data.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
void deep_copy(MultiVector< DS, DL, DG, DN > &dst, const MultiVector< SS, SL, SG, SN > &src)
Copy the contents of the MultiVector src into dst.
size_t global_size_t
Global size_t object.
MultiVector< ST, LO, GO, NT > createCopy(const MultiVector< ST, LO, GO, NT > &src)
Return a deep copy of the given MultiVector.
CombineMode
Rule for combining data in an Import or Export.
@ INSERT
Insert new values that don't currently exist.