10#ifndef TPETRA_UTIL_HPP 
   11#define TPETRA_UTIL_HPP 
   22#include "Tpetra_ConfigDefs.hpp" 
   23#include "Kokkos_DualView.hpp" 
   24#include "KokkosCompat_View.hpp" 
   25#include "Teuchos_Assert.hpp" 
   26#include "Teuchos_CommHelpers.hpp" 
   27#include "Teuchos_OrdinalTraits.hpp" 
   28#include "Teuchos_TypeNameTraits.hpp" 
   29#include "Teuchos_Utils.hpp" 
   37#if defined(HAVE_TPETRA_PRINT_EFFICIENCY_WARNINGS) 
   62#define TPETRA_EFFICIENCY_WARNING(throw_exception_test, msg)                     \ 
   64    const bool tpetraEfficiencyWarningTest = (throw_exception_test);             \ 
   65    if (tpetraEfficiencyWarningTest) {                                           \ 
   66      std::ostringstream errStream;                                              \ 
   67      errStream << Teuchos::typeName(*this) << ":" << std::endl;                 \ 
   68      errStream << "Efficiency warning: " << #throw_exception_test << std::endl; \ 
   70      std::string err = errStream.str();                                         \ 
   71      if (TPETRA_PRINTS_EFFICIENCY_WARNINGS && tpetraEfficiencyWarningTest) {    \ 
   72        std::cerr << err << std::endl;                                           \ 
  101#define TPETRA_EFFICIENCY_WARNING(throw_exception_test, msg) 
  105#if defined(HAVE_TPETRA_THROW_ABUSE_WARNINGS) || defined(HAVE_TPETRA_PRINT_ABUSE_WARNINGS) 
  107#define TPETRA_ABUSE_WARNING(throw_exception_test, Exception, msg)                                      \ 
  109    std::ostringstream errStream;                                                                       \ 
  110    errStream << Teuchos::typeName(*this) << msg;                                                       \ 
  111    std::string err = errStream.str();                                                                  \ 
  112    if (TPETRA_PRINTS_ABUSE_WARNINGS && (throw_exception_test)) {                                       \ 
  113      std::cerr << err << std::endl;                                                                    \ 
  115    TEUCHOS_TEST_FOR_EXCEPTION(TPETRA_THROWS_ABUSE_WARNINGS && (throw_exception_test), Exception, err); \ 
  119#define TPETRA_ABUSE_WARNING(throw_exception_test, Exception, msg) 
  151#define SHARED_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg, comm)                                                       \ 
  153    using Teuchos::outArg;                                                                                                          \ 
  154    const int lcl_throw_exception = (throw_exception_test) ? Teuchos::rank(comm) + 1 : 0;                                           \ 
  156    Teuchos::reduceAll(comm, Teuchos::REDUCE_MAX, lcl_throw_exception, outArg(gbl_throw));                                          \ 
  157    TEUCHOS_TEST_FOR_EXCEPTION(gbl_throw, Exception,                                                                                \ 
  158                               msg << " Failure on at least one process, including process " << gbl_throw - 1 << "." << std::endl); \ 
 
  174template <
typename MapType, 
typename KeyArgType, 
typename ValueArgType>
 
  178  typename MapType::iterator 
lb = 
m.lower_bound(
k);
 
  179  if (
lb != 
m.end() && !(
m.key_comp()(
k, 
lb->first))) {
 
  183    typedef typename MapType::value_type 
MVT;
 
 
  207  typedef typename std::iterator_traits<IT1>::difference_type DT;
 
  208  DT 
myit     = Teuchos::OrdinalTraits<DT>::one();
 
 
  251template <
class IT1, 
class IT2>
 
  258  typename std::iterator_traits<IT1>::value_type 
piv(*
pivot);
 
 
  290template <
class IT1, 
class IT2, 
class IT3>
 
  299  typename std::iterator_traits<IT1>::value_type 
piv(*
pivot);
 
 
  328template <
class IT1, 
class IT2>
 
  334  typedef typename std::iterator_traits<IT1>::difference_type DT;
 
  335  DT 
DT1 = Teuchos::OrdinalTraits<DT>::one();
 
 
  356template <
class IT1, 
class IT2, 
class IT3>
 
  364  typedef typename std::iterator_traits<IT1>::difference_type DT;
 
  365  DT 
DT1 = Teuchos::OrdinalTraits<DT>::one();
 
 
  380template <
class IT1, 
class IT2, 
class IT3>
 
  388  typedef typename std::iterator_traits<IT1>::difference_type DT;
 
  391  DT 
z = Teuchos::OrdinalTraits<DT>::zero();
 
  394    for (DT 
j = 0; 
j < 
max; 
j++) {
 
  395      for (DT 
k = 
j; 
k >= 0; 
k -= 
m) {
 
 
  413template <
class IT1, 
class IT2>
 
  419  typedef typename std::iterator_traits<IT1>::difference_type DT;
 
  422  DT 
z = Teuchos::OrdinalTraits<DT>::zero();
 
  425    for (DT 
j = 0; 
j < 
max; 
j++) {
 
  426      for (DT 
k = 
j; 
k >= 0; 
k -= 
m) {
 
 
  441template <
typename IT1>
 
  443  typedef typename std::iterator_traits<IT1>::difference_type DT;
 
  446  std::vector<DT> idx(
length);
 
  447  std::iota(idx.begin(), idx.end(), 0);
 
  449  std::stable_sort(idx.begin(), idx.end(),
 
  450                   [&
first](
size_t i1, 
size_t i2) { return first[i1] < first[i2]; });
 
 
  458template <
typename IT1, 
typename IT2>
 
  463  typedef typename std::iterator_traits<IT1>::difference_type DT;
 
  464  typedef typename std::iterator_traits<IT1>::value_type 
T;
 
  468  Kokkos::View<T*, Kokkos::HostSpace> 
tmp(Kokkos::view_alloc(Kokkos::WithoutInitializing, 
"tmp"), 
n);
 
  470  Kokkos::parallel_for(
"apply_permutation_1",
 
  471                       Kokkos::RangePolicy<Kokkos::DefaultHostExecutionSpace>(0, 
n),
 
  475  Kokkos::parallel_for(
"apply_permutation_2",
 
  476                       Kokkos::RangePolicy<Kokkos::DefaultHostExecutionSpace>(0, 
n),
 
 
  488template <
class IT1, 
class IT2>
 
  504template <
class IT1, 
class IT2, 
class IT3>
 
  538template <
class IT1, 
class IT2>
 
  551#ifdef HAVE_TPETRA_DEBUG 
  552  if (!SortDetails::isAlreadySorted(
first1, 
last1)) {
 
  553    std::cout << 
"Trouble: sort() did not sort !!" << std::endl;
 
 
  575template <
class View1, 
class View2>
 
  580  Teuchos::ArrayRCP<typename View1::non_const_value_type> 
view1_rcp = Kokkos::Compat::persistingView(
view1, 0, 
size);
 
  581  Teuchos::ArrayRCP<typename View2::non_const_value_type> 
view2_rcp = Kokkos::Compat::persistingView(
view2, 0, 
size);
 
 
  599  Teuchos::ArrayRCP<typename View::non_const_value_type> 
view_rcp = Kokkos::Compat::persistingView(view, 0, 
size);
 
 
  616  Teuchos::ArrayRCP<typename View::non_const_value_type> 
view_rcp = Kokkos::Compat::persistingView(view, 0, 
size);
 
 
  636template <
class IT1, 
class IT2, 
class IT3>
 
  652#ifdef HAVE_TPETRA_DEBUG 
  653  if (!SortDetails::isAlreadySorted(
first1, 
last1)) {
 
  654    std::cout << 
" Trouble sort did not actually sort... !!!!!!" << std::endl;
 
 
  703template <
class IT1, 
class IT2>
 
  789template <
class IT1, 
class IT2, 
class BinaryFunction>
 
  851template <
class KeyInputIterType, 
class ValueInputIterType,
 
  852          class KeyOutputIterType, 
class ValueOutputIterType,
 
  853          class BinaryFunction>
 
  883template <
class KeyInputIterType>
 
  885keyMergeCount(KeyInputIterType keyBeg1, KeyInputIterType keyEnd1,
 
  886              KeyInputIterType keyBeg2, KeyInputIterType keyEnd2) {
 
  888  while (keyBeg1 != keyEnd1 && keyBeg2 != keyEnd2) {
 
  889    if (*keyBeg1 < *keyBeg2) {
 
  891    } 
else if (*keyBeg1 > *keyBeg2) {
 
  900  count += 
static_cast<size_t>(keyEnd1 - keyBeg1) +
 
  901           static_cast<size_t>(keyEnd2 - keyBeg2);
 
  925bool congruent(
const Teuchos::Comm<int>& comm1,
 
  926               const Teuchos::Comm<int>& comm2);
 
  937template <
class DualViewType>
 
  938Teuchos::ArrayView<typename DualViewType::t_dev::value_type>
 
  940  static_assert(
static_cast<int>(DualViewType::t_dev::rank) == 1,
 
  941                "The input DualView must have rank 1.");
 
  944                             "input Kokkos::DualView was most recently modified on device, but this " 
  945                             "function needs the host view of the data to be the most recently " 
  949  typedef typename DualViewType::t_dev::value_type value_type;
 
  954  return Teuchos::ArrayView<value_type>(
len != 0 ? 
x_host.data() : 
nullptr,
 
 
  974template <
class T, 
class DT>
 
  975Kokkos::DualView<T*, DT>
 
  979  using Kokkos::MemoryUnmanaged;
 
  980  typedef typename DT::memory_space 
DMS;
 
  981  typedef typename DT::execution_space execution_space;
 
  982  typedef Kokkos::HostSpace 
HMS;
 
  984  const size_t len = 
static_cast<size_t>(
x_av.size());
 
  985  Kokkos::View<const T*, HMS, MemoryUnmanaged> 
x_in(
x_av.getRawPtr(), 
len);
 
  986  Kokkos::DualView<T*, DT> 
x_out(label, 
len);
 
  990    Kokkos::deep_copy(
x_out.view_host(), 
x_in);
 
 
 1006template <
class DualViewType>
 
 1008  const auto host = 
dv.need_sync_device();
 
 1009  const auto dev  = 
dv.need_sync_host();
 
 1011  std::ostringstream 
os;
 
 1012  os << name << 
": {size: " << 
dv.extent(0)
 
 1013     << 
", sync: {host: " << 
host << 
", dev: " << 
dev << 
"}";
 
 
 1021template <
class ArrayType>
 
 1026  out << name << 
": [";
 
 1028  const size_t numEnt(
x.size());
 
 
 1052std::unique_ptr<std::string>
 
 1063std::unique_ptr<std::string>
 
 1073std::unique_ptr<std::string>
 
void std_sort3(const IT1 &first1, const IT1 &last1, const IT2 &first2, const IT2 &last2, const IT3 &first3, const IT3 &last3)
Sort the first array using std sort, and apply the resulting permutation to the second and third arra...
 
void sh_sort3(const IT1 &first1, const IT1 &last1, const IT2 &first2, const IT2 &, const IT3 &first3, const IT3 &)
Sort the first array using shell sort, and apply the resulting permutation to the second and third ar...
 
void std_sort2(const IT1 &first1, const IT1 &last1, const IT2 &first2, const IT2 &last2)
Sort the first array using std sort, and apply the resulting permutation to the second array.
 
IT1 partition2(const IT1 &first1, const IT1 &last1, const IT2 &first2, const IT2 &last2, const IT1 &pivot)
Partition operation for quicksort2().
 
void quicksort2(const IT1 &first1, const IT1 &last1, const IT2 &first2, const IT2 &last2)
Sort the first array using Quicksort, and apply the resulting permutation to the second array.
 
void apply_permutation(IT1 first, IT1 last, IT2 indices)
Apply a permutation of the ordering of an array in place.
 
IT getPivot(const IT &first, const IT &last)
Determines the pivot point as part of the quicksort routine.
 
std::vector< typename std::iterator_traits< IT1 >::difference_type > sort_indexes(IT1 first, IT1 last)
Compute the permutation of the ordering that sorts the array using a stable sort.
 
IT1 partition3(const IT1 &first1, const IT1 &last1, const IT2 &first2, const IT2 &last2, const IT3 &first3, const IT3 &last3, const IT1 &pivot)
Partition operation for quicksort3().
 
void sh_sort2(const IT1 &first1, const IT1 &last1, const IT2 &first2, const IT2 &)
Sort the first array using shell sort, and apply the resulting permutation to the second array.
 
bool isAlreadySorted(const IT1 &first, const IT1 &last)
Determines whether or not a random access sequence is already sorted.
 
void quicksort3(const IT1 &first1, const IT1 &last1, const IT2 &first2, const IT2 &last2, const IT3 &first3, const IT3 &last3)
Sort the first array using Quicksort, and apply the resulting permutation to the second and third arr...
 
Struct that holds views of the contents of a CrsMatrix.
 
Implementation details of Tpetra.
 
Implementation details of sort routines used by Tpetra.
 
void verbosePrintArray(std::ostream &out, const ArrayType &x, const char name[], const size_t maxNumToPrint)
Print min(x.size(), maxNumToPrint) entries of x.
 
Teuchos::ArrayView< typename DualViewType::t_dev::value_type > getArrayViewFromDualView(const DualViewType &x)
Get a Teuchos::ArrayView which views the host Kokkos::View of the input 1-D Kokkos::DualView.
 
std::unique_ptr< std::string > createPrefix(const int myRank, const char prefix[])
Create string prefix for each line of verbose output.
 
bool congruent(const Teuchos::Comm< int > &comm1, const Teuchos::Comm< int > &comm2)
Whether the two communicators are congruent.
 
Kokkos::DualView< T *, DT > getDualViewCopyFromArrayView(const Teuchos::ArrayView< const T > &x_av, const char label[], const bool leaveOnHost)
Get a 1-D Kokkos::DualView which is a deep copy of the input Teuchos::ArrayView (which views host mem...
 
std::string dualViewStatusToString(const DualViewType &dv, const char name[])
Return the status of the given Kokkos::DualView, as a human-readable string.
 
Namespace Tpetra contains the class and methods constituting the Tpetra library.
 
void sort(View &view, const size_t &size)
Convenience wrapper for std::sort for host-accessible views.
 
void reverse_sort(View &view, const size_t &size)
Convenience wrapper for a reversed std::sort for host-accessible views.
 
void sort2(const IT1 &first1, const IT1 &last1, const IT2 &first2, const bool stableSort=false)
Sort the first array, and apply the resulting permutation to the second array.
 
MapType::iterator efficientAddOrUpdate(MapType &m, const KeyArgType &k, const ValueArgType &v)
Efficiently insert or replace an entry in an std::map.
 
void merge2(IT1 &indResultOut, IT2 &valResultOut, IT1 indBeg, IT1 indEnd, IT2 valBeg, IT2)
Merge values in place, additively, with the same index.
 
void keyValueMerge(KeyInputIterType keyBeg1, KeyInputIterType keyEnd1, ValueInputIterType valBeg1, ValueInputIterType valEnd1, KeyInputIterType keyBeg2, KeyInputIterType keyEnd2, ValueInputIterType valBeg2, ValueInputIterType valEnd2, KeyOutputIterType keyOut, ValueOutputIterType valOut, BinaryFunction f)
Merge two sorted (by keys) sequences of unique (key,value) pairs by combining pairs with equal keys.
 
void sort3(const IT1 &first1, const IT1 &last1, const IT2 &first2, const IT3 &first3, const bool stableSort=false)
Sort the first array, and apply the same permutation to the second and third arrays.