10#ifndef IFPACK2_HEAP_HPP
11#define IFPACK2_HEAP_HPP
14#include "Teuchos_Array.hpp"
15#include "Teuchos_ScalarTraits.hpp"
19template<
typename Scalar,
typename Ordinal>
20struct greater_indirect {
21 greater_indirect(
const Teuchos::Array<Scalar>& vals)
25 bool operator()(
const Ordinal& lhs,
const Ordinal& rhs)
const
26 {
return Teuchos::ScalarTraits<Scalar>::magnitude(m_vals[lhs]) >
27 Teuchos::ScalarTraits<Scalar>::magnitude(m_vals[rhs]); }
30 const Teuchos::Array<Scalar>& m_vals;
36template<
typename Ordinal,
typename SizeType>
37void add_to_heap(
const Ordinal& idx, Teuchos::Array<Ordinal>& heap, SizeType& heap_len)
39 if (heap.size() == heap_len) heap.push_back(idx);
40 else heap[heap_len] = idx;
42 std::push_heap(heap.begin(), heap.begin()+heap_len, std::greater<Ordinal>());
48template<
typename Ordinal,
typename SizeType,
class Compare>
49void add_to_heap(
const Ordinal& idx, Teuchos::Array<Ordinal>& heap, SizeType& heap_len, Compare comp)
51 if (heap.size() == heap_len) heap.push_back(idx);
52 else heap[heap_len] = idx;
54 std::push_heap(heap.begin(), heap.begin()+heap_len, comp);
58template<
typename Ordinal,
typename SizeType>
59void rm_heap_root(Teuchos::Array<Ordinal>& heap, SizeType& heap_len)
61 std::pop_heap(heap.begin(), heap.begin()+heap_len, std::greater<Ordinal>());
68template<
typename Ordinal,
typename SizeType,
class Compare>
69void rm_heap_root(Teuchos::Array<Ordinal>& heap, SizeType& heap_len, Compare comp)
71 std::pop_heap(heap.begin(), heap.begin()+heap_len, comp);
Preconditioners and smoothers for Tpetra sparse matrices.
Definition Ifpack2_AdditiveSchwarz_decl.hpp:41
void add_to_heap(const Ordinal &idx, Teuchos::Array< Ordinal > &heap, SizeType &heap_len)
Definition Ifpack2_Heap.hpp:37
void rm_heap_root(Teuchos::Array< Ordinal > &heap, SizeType &heap_len)
Definition Ifpack2_Heap.hpp:59