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#if KOKKOS_VERSION >= 40799 
   27#include "KokkosKernels_ArithTraits.hpp" 
   29#include "Kokkos_ArithTraits.hpp" 
   31#include "Kokkos_InnerProductSpaceTraits.hpp" 
   32#include "Tpetra_KokkosRefactor_Details_MultiVectorLocalDeepCopy.hpp" 
   33#include "Tpetra_Access.hpp" 
   34#include "Tpetra_Details_WrappedDualView.hpp" 
   37#ifdef HAVE_TPETRACORE_TEUCHOSNUMERICS 
   38#ifndef DOXYGEN_SHOULD_SKIP_THIS 
   40template <
class OrdinalType, 
class ScalarType>
 
   41class SerialDenseMatrix;  
 
   68template <
class DS, 
class DL, 
class DG, 
class DN,
 
   69          class SS, 
class SL, 
class SG, 
class SN>
 
   73#ifdef HAVE_TPETRACORE_TEUCHOSNUMERICS 
   80template <
class ST, 
class LO, 
class GO, 
class NT>
 
   82               const Teuchos::SerialDenseMatrix<int, ST>& src);
 
   90template <
class ST, 
class LO, 
class GO, 
class NT>
 
   91void deep_copy(Teuchos::SerialDenseMatrix<int, ST>& dst,
 
  102template <
class ST, 
class LO, 
class GO, 
class NT>
 
  115template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  116Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
  123template <
class SC, 
class LO, 
class GO, 
class NT>
 
  124Teuchos::ArrayView<const size_t>
 
  373#if KOKKOS_VERSION >= 40799 
  374      typename KokkosKernels::ArithTraits<Scalar>::val_type;
 
  376      typename Kokkos::ArithTraits<Scalar>::val_type;
 
  396      typename Kokkos::Details::InnerProductSpaceTraits<impl_scalar_type>::dot_type;
 
  404#if KOKKOS_VERSION >= 40799 
  405  using mag_type = 
typename KokkosKernels::ArithTraits<impl_scalar_type>::mag_type;
 
  407  using mag_type = 
typename Kokkos::ArithTraits<impl_scalar_type>::mag_type;
 
  443  using host_view_type   = 
typename dual_view_type::t_host;
 
  444  using device_view_type = 
typename dual_view_type::t_dev;
 
  492              const Teuchos::ArrayView<const Scalar>& 
A,
 
  510              const Teuchos::ArrayView<
const Teuchos::ArrayView<const Scalar>>& 
ArrayOfPtrs,
 
  567              const typename dual_view_type::t_dev& 
d_view);
 
  750              const Teuchos::RCP<const map_type>& 
subMap,
 
  812#ifdef KOKKOS_ENABLE_SERIAL 
  813      !std::is_same<execution_space, Kokkos::Serial>::value;
 
  885  template <
typename T>
 
  886  typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value, 
void>::type
 
  951  template <
typename T>
 
  952  typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value, 
void>::type
 
 1027  template <
typename T>
 
 1028  typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value, 
void>::type
 
 1091  template <
typename T>
 
 1092  typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value, 
void>::type
 
 1111  template <
typename T>
 
 1112  typename std::enable_if<!std::is_same<T, impl_scalar_type>::value && std::is_convertible<T, impl_scalar_type>::value, 
void>::type
 
 1251  Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1255  Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1256  subCopy(
const Teuchos::ArrayView<const size_t>& 
cols) 
const;
 
 1259  Teuchos::RCP<const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1263  Teuchos::RCP<const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1264  subView(
const Teuchos::ArrayView<const size_t>& 
cols) 
const;
 
 1267  Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1271  Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1336  Teuchos::RCP<const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1338             const size_t offset) 
const;
 
 1357  Teuchos::RCP<MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1362  Teuchos::RCP<const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1366  Teuchos::RCP<Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
 
 1370  Teuchos::ArrayRCP<const Scalar> 
getData(
size_t j) 
const;
 
 1383  get1dCopy(
const Teuchos::ArrayView<Scalar>& 
A,
 
 1384            const size_t LDA) 
const;
 
 1400  Teuchos::ArrayRCP<const Scalar> 
get1dView() 
const;
 
 1403  Teuchos::ArrayRCP<Teuchos::ArrayRCP<const Scalar>> 
get2dView() 
const;
 
 1417  typename dual_view_type::t_host::const_type 
getLocalViewHost(Access::ReadOnlyStruct) 
const;
 
 1425  typename dual_view_type::t_host 
getLocalViewHost(Access::OverwriteAllStruct);
 
 1429  typename dual_view_type::t_dev::const_type 
getLocalViewDevice(Access::ReadOnlyStruct) 
const;
 
 1446  template <
class TargetDeviceType>
 
 1485  template <
class TargetDeviceType>
 
 1486  typename std::remove_reference<decltype(std::declval<dual_view_type>().template 
view<TargetDeviceType>())>::type::const_type
 
 1491  template <
class TargetDeviceType>
 
 1492  typename std::remove_reference<decltype(std::declval<dual_view_type>().template 
view<TargetDeviceType>())>::type
 
 1497  template <
class TargetDeviceType>
 
 1498  typename std::remove_reference<decltype(std::declval<dual_view_type>().template view<TargetDeviceType>())>::type
 
 1500    return view_.template getView<TargetDeviceType>(s);
 
 1521  dot(
const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
 
 1522      const Teuchos::ArrayView<dot_type>& dots) 
const;
 
 1535  template <
typename T>
 
 1536  typename std::enable_if<!(std::is_same<dot_type, T>::value), 
void>::type
 
 1538      const Teuchos::ArrayView<T>& 
dots) 
const {
 
 1539    const size_t sz = 
static_cast<size_t>(
dots.size());
 
 1540    Teuchos::Array<dot_type> 
dts(
sz);
 
 1542    for (
size_t i = 0; 
i < 
sz; ++
i) {
 
 
 1549  template <
typename T>
 
 1550  typename std::enable_if<!(std::is_same<dot_type, T>::value), 
void>::type
 
 1552      std::vector<T>& 
dots) 
const {
 
 1553    const size_t sz = 
dots.size();
 
 1554    Teuchos::Array<dot_type> 
dts(
sz);
 
 1556    for (
size_t i = 0; 
i < 
sz; ++
i) {
 
 
 1581      const Kokkos::View<dot_type*, Kokkos::HostSpace>& 
norms) 
const;
 
 1583  template <
class ViewType>
 
 1585  dot(
typename std::enable_if<std::is_same<typename ViewType::value_type, dot_type>::value &&
 
 1586                                  std::is_same<typename ViewType::memory_space, typename device_type::memory_space>::value,
 
 1589    const Kokkos::View<dot_type*, Kokkos::HostSpace> 
h_dots(
"Tpetra::Dots", 
dots.extent(0));
 
 1607  template <
typename T>
 
 1608  typename std::enable_if<!(std::is_same<dot_type, T>::value), 
void>::type
 
 1610      const Kokkos::View<T*, device_type>& 
dots) 
const {
 
 1612    Kokkos::View<dot_type*, device_type> 
dts(
"MV::dot tmp", 
numDots);
 
 
 1649  void scale(
const Teuchos::ArrayView<const Scalar>& 
alpha);
 
 1659  void scale(
const Kokkos::View<const impl_scalar_type*, device_type>& 
alpha);
 
 1709  norm1(
const Kokkos::View<mag_type*, Kokkos::HostSpace>& 
norms) 
const;
 
 1711  template <
class ViewType>
 
 1712  typename std::enable_if<std::is_same<typename ViewType::value_type, mag_type>::value &&
 
 1713                          std::is_same<typename ViewType::memory_space, typename device_type::memory_space>::value>::type
 
 1740  template <
typename T>
 
 1741  typename std::enable_if<!(std::is_same<mag_type, T>::value), 
void>::type
 
 1746    this->
norm1(tmpNorms);
 
 
 1759  void norm1(
const Teuchos::ArrayView<mag_type>& 
norms) 
const;
 
 1775  template <
typename T>
 
 1776  typename std::enable_if<!(std::is_same<mag_type, T>::value), 
void>::type
 
 1778    typedef typename Teuchos::ArrayView<T>::size_type size_type;
 
 1779    const size_type 
sz = 
norms.size();
 
 1781    this->
norm1(theNorms);
 
 1782    for (size_type 
i = 0; 
i < 
sz; ++
i) {
 
 
 1801  norm2(
const Kokkos::View<mag_type*, Kokkos::HostSpace>& 
norms) 
const;
 
 1803  template <
class ViewType>
 
 1804  typename std::enable_if<std::is_same<typename ViewType::value_type, mag_type>::value &&
 
 1805                          std::is_same<typename ViewType::memory_space, typename device_type::memory_space>::value>::type
 
 1830  template <
typename T>
 
 1831  typename std::enable_if<!(std::is_same<mag_type, T>::value), 
void>::type
 
 1836    this->
norm2(theNorms);
 
 
 1849  void norm2(
const Teuchos::ArrayView<mag_type>& 
norms) 
const;
 
 1865  template <
typename T>
 
 1866  typename std::enable_if<!(std::is_same<mag_type, T>::value), 
void>::type
 
 1868    typedef typename Teuchos::ArrayView<T>::size_type size_type;
 
 1869    const size_type 
sz = 
norms.size();
 
 1871    this->
norm2(theNorms);
 
 1872    for (size_type 
i = 0; 
i < 
sz; ++
i) {
 
 
 1884  void normInf(
const Kokkos::View<mag_type*, Kokkos::HostSpace>& 
norms) 
const;
 
 1886  template <
class ViewType>
 
 1887  typename std::enable_if<std::is_same<typename ViewType::value_type, mag_type>::value &&
 
 1888                          std::is_same<typename ViewType::memory_space, typename device_type::memory_space>::value>::type
 
 1913  template <
typename T>
 
 1914  typename std::enable_if<!(std::is_same<mag_type, T>::value), 
void>::type
 
 1917    Kokkos::View<mag_type*, device_type> 
theNorms(
"MV::normInf tmp", 
numNorms);
 
 
 1933  void normInf(
const Teuchos::ArrayView<mag_type>& 
norms) 
const;
 
 1950  template <
typename T>
 
 1951  typename std::enable_if<!(std::is_same<mag_type, T>::value), 
void>::type
 
 1953    typedef typename Teuchos::ArrayView<T>::size_type size_type;
 
 1954    const size_type 
sz = 
norms.size();
 
 1956    this->
norm2(theNorms);
 
 1957    for (size_type 
i = 0; 
i < 
sz; ++
i) {
 
 
 1967  void meanValue(
const Teuchos::ArrayView<impl_scalar_type>& 
means) 
const;
 
 1969  template <
typename T>
 
 1970  typename std::enable_if<!std::is_same<impl_scalar_type, T>::value, 
void>::type
 
 1972    typedef typename Teuchos::Array<T>::size_type size_type;
 
 1989           Teuchos::ETransp transB,
 
 1990           const Scalar& alpha,
 
 1991           const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
 
 1992           const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
 
 1993           const Scalar& beta);
 
 2017                      const Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
 
 2018                      const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B,
 
 2048  bool aliases(
const MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& other) 
const;
 
 2087  describe(Teuchos::FancyOStream& out,
 
 2088           const Teuchos::EVerbosityLevel verbLevel =
 
 2089               Teuchos::Describable::verbLevel_default) 
const override;
 
 2120        copyOrView == Teuchos::Copy, std::invalid_argument,
 
 2121        "Tpetra::MultiVector::setCopyOrView: The Kokkos refactor version of " 
 2122        "MultiVector _only_ implements view semantics.  You may not call this " 
 2123        "method with copyOrView = Teuchos::Copy.  The only valid argument is " 
 
 2136    return Teuchos::View;
 
 
 2159  Teuchos::RCP<MultiVector<T, LocalOrdinal, GlobalOrdinal, Node>>
 
 2178  template <
class DS, 
class DL, 
class DG, 
class DN,
 
 2179            class SS, 
class SL, 
class SG, 
class SN>
 
 2205  template <
class SC, 
class LO, 
class GO, 
class NT>
 
 2206  friend ::Teuchos::ArrayView<const size_t> getMultiVectorWhichVectors(const ::Tpetra::MultiVector<SC, LO, GO, NT>& 
X);
 
 2246               const Teuchos::EVerbosityLevel 
verbLevel =
 
 2247                   Teuchos::Describable::verbLevel_default) 
const;
 
 2250  bool vectorIndexOutOfRange(
const size_t VectorIndex) 
const;
 
 2257  Teuchos::ArrayRCP<T>
 
 2292      const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& 
permuteToLIDs,
 
 2293      const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& 
permuteFromLIDs,
 
 2298      const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& 
permuteToLIDs,
 
 2299      const Kokkos::DualView<const local_ordinal_type*, buffer_device_type>& 
permuteFromLIDs,
 
 2304                 const Kokkos::DualView<
 
 2318                 const Kokkos::DualView<
 
 2330  unpackAndCombine(
const Kokkos::DualView<
 
 2345  unpackAndCombine(
const Kokkos::DualView<
 
 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,
 
 2373  template <
class NO = Node>
 
 2374  typename std::enable_if<!std::is_same<typename Tpetra::Details::DefaultTypes::CommBufferMemorySpace<typename NO::execution_space>::type,
 
 2375                                        typename NO::device_type::memory_space>::value,
 
 2377  reallocImportsIfNeededImpl(
const size_t newSize,
 
 2379                             const std::string* 
prefix,
 
 2380                             const bool areRemoteLIDsContiguous,
 
 2387                         const std::string* 
prefix,
 
 2388                         const bool areRemoteLIDsContiguous = 
false,
 
 2392  bool importsAreAliased();
 
 2395  Kokkos::DualView<impl_scalar_type*, buffer_device_type> unaliased_imports_;
 
 
 2400template <
class SC, 
class LO, 
class GO, 
class NT>
 
 2401Teuchos::ArrayView<const size_t>
 
 2403  return X.whichVectors_();
 
 2408template <
class ST, 
class LO, 
class GO, 
class NT>
 
 2418template <
class DS, 
class DL, 
class DG, 
class DN,
 
 2419          class SS, 
class SL, 
class SG, 
class SN>
 
 2422  using ::Tpetra::getMultiVectorWhichVectors;
 
 2425      dst.getGlobalLength() != src.getGlobalLength() ||
 
 2426          dst.getNumVectors() != src.getNumVectors(),
 
 2427      std::invalid_argument,
 
 2428      "Tpetra::deep_copy: Global dimensions of the two Tpetra::MultiVector " 
 2429      "objects do not match.  src has dimensions [" 
 2430          << src.getGlobalLength()
 
 2431          << 
"," << src.getNumVectors() << 
"], and dst has dimensions [" 
 2432          << dst.getGlobalLength() << 
"," << dst.getNumVectors() << 
"].");
 
 2436      dst.getLocalLength() != src.getLocalLength(), std::invalid_argument,
 
 2437      "Tpetra::deep_copy: The local row counts of the two Tpetra::MultiVector " 
 2438      "objects do not match.  src has " 
 2439          << src.getLocalLength() << 
" row(s) " 
 2440          << 
" and dst has " << dst.getLocalLength() << 
" row(s).");
 
 2444  if (src.isConstantStride() && dst.isConstantStride()) {
 
 2447          dst.getLocalViewDevice(Access::OverwriteAll),
 
 2448          src.getLocalViewDevice(Access::ReadOnly));
 
 2451          dst.getLocalViewDevice(Access::OverwriteAll),
 
 2452          src.getLocalViewHost(Access::ReadOnly));
 
 2460                             src.getLocalViewDevice(Access::ReadOnly),
 
 2461                             dst.isConstantStride(),
 
 2462                             src.isConstantStride(),
 
 2467                             src.getLocalViewHost(Access::ReadOnly),
 
 2468                             dst.isConstantStride(),
 
 2469                             src.isConstantStride(),
 
 
 
 2481template <
class SC, 
class LO, 
class GO, 
class NT>
 
 2482class TypeNameTraits<
Tpetra::MultiVector<SC, LO, GO, NT>> {
 
 2484  static std::string name() {
 
 2485    return std::string(
"Tpetra::MultiVector<") +
 
 2486           TypeNameTraits<SC>::name() + 
"," +
 
 2487           TypeNameTraits<LO>::name() + 
"," +
 
 2488           TypeNameTraits<GO>::name() + 
"," +
 
 2489           TypeNameTraits<NT>::name() + 
">";
 
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.
 
Struct that holds views of the contents of a CrsMatrix.
 
Base class for distributed Tpetra objects that support data redistribution.
 
A parallel distribution of indices over processes.
 
Node node_type
Legacy typedef that will go away at some point.
 
GlobalOrdinal global_ordinal_type
The type of global indices.
 
LocalOrdinal local_ordinal_type
The type of local indices.
 
typename Node::device_type device_type
This class' Kokkos::Device specialization.
 
One or more distributed dense vectors.
 
typename map_type::global_ordinal_type global_ordinal_type
The type of global indices that this class uses.
 
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
Legacy thing that you should not use any more.
 
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.
 
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
The type of local indices that this class uses.
 
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.
 
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.
 
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).
 
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.
 
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_
The Kokkos::DualView containing the MultiVector's data.
 
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.
 
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.
 
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.
 
typename DistObject< scalar_type, local_ordinal_type, global_ordinal_type, node_type >::buffer_device_type buffer_device_type
Kokkos::Device specialization for communication buffers.
 
Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > subCopy(const Teuchos::Range1D &colRng) const
Return a MultiVector with copies of selected columns.
 
typename Kokkos::Details::InnerProductSpaceTraits< impl_scalar_type >::dot_type dot_type
Type of an inner ("dot") product result.
 
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.
 
Scalar scalar_type
The type of each entry in the MultiVector.
 
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.
 
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.
 
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.
 
Kokkos::DualView< impl_scalar_type **, Kokkos::LayoutLeft, device_type > dual_view_type
Kokkos::DualView specialization used by this class.
 
typename map_type::device_type device_type
This class' preferred Kokkos device 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.
 
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,...
 
typename Kokkos::ArithTraits< Scalar >::val_type impl_scalar_type
The type used internally in place of Scalar.
 
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 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 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()
Default constructor: makes a MultiVector with no rows or columns.
 
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
Type of the (new) Kokkos execution space.
 
void abs(const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A)
Put element-wise absolute values of input Multi-vector in target: A = abs(this)
 
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 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.
 
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_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(MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &&)=default
Move constructor (shallow move).
 
Teuchos::Array< size_t > whichVectors_
Indices of columns this multivector is viewing.
 
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.
 
typename Kokkos::ArithTraits< impl_scalar_type >::mag_type mag_type
Type of a norm result.
 
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 > > offsetViewNonConst(const Teuchos::RCP< const map_type > &subMap, const size_t offset)
Return a nonconst view of a subset of rows.
 
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).
 
static const bool useAtomicUpdatesByDefault
Whether sumIntoLocalValue and sumIntoGlobalValue should use atomic updates by default.
 
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.
 
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.