libMesh
parallel_sort.h
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2017 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 #ifndef LIBMESH_PARALLEL_SORT_H
20 #define LIBMESH_PARALLEL_SORT_H
21 
22 // Local Includes
23 #include "libmesh/parallel.h"
24 #include "libmesh/libmesh_common.h"
25 #include "libmesh/parallel_object.h"
26 
27 // C++ Includes
28 #include <vector>
29 
30 namespace libMesh
31 {
32 
33 
34 namespace Parallel
35 {
52 template <typename KeyType, typename IdxType=unsigned int>
53 class Sort : public ParallelObject
54 {
55 public:
65  std::vector<KeyType> & d);
66 
67 
74  void sort();
75 
81  const std::vector<KeyType> & bin();
82 
83 private:
84 
89 
94 
99 
105  std::vector<KeyType> & _data;
106 
112  std::vector<IdxType> _local_bin_sizes;
113 
120  std::vector<KeyType> _my_bin;
121 
127  void binsort ();
128 
135  void communicate_bins();
136 
142  void sort_local_bin();
143 
144 };
145 }
146 
147 } // namespace libMesh
148 
149 #endif // LIBMESH_PARALLEL_SORT_H
Encapsulates the MPI_Comm object.
Definition: parallel.h:657
const std::vector< KeyType > & bin()
Return a constant reference to _my_bin.
const processor_id_type _proc_id
The identity of this processor.
Definition: parallel_sort.h:93
void sort()
This is the only method which needs to be called by the user.
Definition: parallel_sort.C:58
uint8_t processor_id_type
Definition: id_types.h:99
std::vector< KeyType > & _data
The raw, unsorted data which will need to be sorted (in parallel) across all processors.
std::vector< IdxType > _local_bin_sizes
Vector which holds the size of each bin on this processor.
The libMesh namespace provides an interface to certain functionality in the library.
void sort_local_bin()
After all the bins have been communicated, we can sort our local bin.
void communicate_bins()
Communicates the bins from each processor to the appropriate processor.
const processor_id_type _n_procs
The number of processors to work with.
Definition: parallel_sort.h:88
std::vector< KeyType > _my_bin
The bin which will eventually be held by this processor.
This class forms the base class for all other classes that are expected to be implemented in parallel...
The parallel sorting method is templated on the type of data which is to be sorted.
Definition: parallel_sort.h:53
const Parallel::Communicator & comm() const
Sort(const Parallel::Communicator &comm, std::vector< KeyType > &d)
Constructor takes the number of processors, the processor id, and a reference to a vector of data to ...
Definition: parallel_sort.C:41
bool _bin_is_sorted
Flag which lets you know if sorting is complete.
Definition: parallel_sort.h:98
void binsort()
Sorts the local data into bins across all processors.
Definition: parallel_sort.C:96