43#ifdef PANZER_HAVE_EPETRA_STACK
45#ifndef __Panzer_STK_Utilities_hpp__
46#define __Panzer_STK_Utilities_hpp__
50#include "Epetra_Vector.h"
51#include "Epetra_MultiVector.h"
78template <
typename RAContainer,
class Compare>
79void sorted_permutation(
const RAContainer & cont,std::vector<std::size_t> & permutation,
const Compare & comp);
87template <
typename RAContainer>
88void sorted_permutation(
const RAContainer & cont,std::vector<std::size_t> & permutation);
94template <
typename RAContainer,
typename Compare>
96 PermFunctor(
const RAContainer & cont,
const Compare & comp)
97 : compare(comp), values(cont) {}
98 PermFunctor(
const PermFunctor & p)
99 : compare(p.compare), values(p.values) {}
101 bool operator()(std::size_t a,std::size_t b)
const
102 {
return compare(values[a],values[b]); }
105 const Compare & compare;
106 const RAContainer & values;
111template <
typename RAContainer>
112void sorted_permutation(
const RAContainer & cont,std::vector<std::size_t> & permutation)
114 std::less<typename RAContainer::value_type> comp;
115 sorted_permutation(cont,permutation,comp);
118template <
typename RAContainer,
class Compare>
119void sorted_permutation(
const RAContainer & cont,std::vector<std::size_t> & permutation,
const Compare & comp)
121 PermFunctor<RAContainer,Compare> pf(cont,comp);
123 permutation.resize(cont.size());
124 for(std::size_t i=0;i<cont.size();i++)
127 std::sort(permutation.begin(),permutation.end(),pf);