12#ifndef CD_LoadBalanceImplem_H
13#define CD_LoadBalanceImplem_H
24#include <LoadBalance.H>
31#include <CD_NamespaceHeader.H>
37 CH_TIME(
"LoadBalancing::makeBalance");
51 CH_TIME(
"LoadBalancing::makeBalance");
118 if (
boxLoads[
ibox] <= std::numeric_limits<Real>::epsilon()) {
166 return A.second > B.second;
197 CH_TIME(
"LoadBalancing::packPairs");
211 CH_TIME(
"LoadBalancing::unpackPairs");
227 CH_TIME(
"LoadBalancing::sort");
238 CH_TIME(
"LoadBalancing::sort");
241 case BoxSorting::None: {
244 case BoxSorting::Std: {
249 case BoxSorting::Shuffle: {
254 case BoxSorting::Morton: {
255 LoadBalancing::sortSFC<T, SpaceDim>(
a_boxes,
a_loads, LoadBalancing::mortonIndex<SpaceDim>);
259 case BoxSorting::Hilbert: {
260 LoadBalancing::sortSFC<T, SpaceDim>(
a_boxes,
a_loads, LoadBalancing::hilbertIndex<SpaceDim>);
265 MayDay::Abort(
"LoadBalancing::sort_boxes - unknown algorithm requested");
276 CH_TIME(
"LoadBalancing::standardSort");
282 return v1.first <
v2.first;
292 CH_TIME(
"LoadBalancing::shuffleSort");
297 int seed = std::chrono::system_clock::now().time_since_epoch().count();
304 std::shuffle(
vec.begin(),
vec.end(),
e);
310template <
class T,
int DIM>
317 CH_TIME(
"LoadBalancing::sortSFC");
335 const auto iv =
b.smallEnd();
348 return std::get<2>(a) < std::get<2>(b);
366 const int maxDim = std::pow(2, 21);
389 CH_TIME(
"LoadBalancing::hilbertIndex");
391 constexpr int nbits = 21;
395 for (
int i = 0;
i <
DIM; ++
i) {
404 for (
int i = 0;
i <
DIM; ++
i) {
417 for (
int i = 1;
i <
DIM; ++
i) {
423 if (
x[
DIM - 1] &
Q) {
428 for (
int i = 0;
i <
DIM; ++
i) {
434 for (
int b =
nbits - 1;
b >= 0; --
b) {
435 for (
int i = 0;
i <
DIM; ++
i) {
443#include <CD_NamespaceFooter.H>
BoxSorting
Enum for sorting boxes.
Definition CD_BoxSorting.H:21
Declaration of a static class for various load balancing operations.
static uint64_t mortonIndex(const std::array< uint32_t, DIM > a_coords) noexcept
Helper function for computing a Morton code using 21 bits per direction.
Definition CD_LoadBalancingImplem.H:360
static void makeBalance(Vector< int > &a_ranks, const Vector< T > &a_loads, const Vector< Box > &a_boxes)
Load balancing, assigning ranks to boxes.
Definition CD_LoadBalancingImplem.H:35
static uint64_t hilbertIndex(const std::array< uint32_t, DIM > &a_coords)
Helper function for computing a Hilbert index.
Definition CD_LoadBalancingImplem.H:387
static void standardSort(Vector< Box > &a_boxes, Vector< T > &a_loads)
Standard box sorting, calls C++ std::sort.
Definition CD_LoadBalancingImplem.H:274
static void sort(Vector< Vector< Box > > &a_boxes, Vector< Vector< T > > &a_loads, const BoxSorting a_whichSorting)
Sorts boxes and loads over a hierarchy according to some sorting criterion.
Definition CD_LoadBalancingImplem.H:225
static void unpackPairs(Vector< Box > &a_boxes, Vector< T > &a_loads, const std::vector< std::pair< Box, T > > &a_pairs)
Splits vector pair into separate boxes and loads.
Definition CD_LoadBalancingImplem.H:209
static void sortSFC(Vector< Box > &a_boxes, Vector< T > &a_loads, const std::function< uint64_t(const std::array< uint32_t, DIM >)> &a_sfcEncoder) noexcept
Generic SFC sorting function.
Definition CD_LoadBalancingImplem.H:312
static std::vector< std::pair< Box, T > > packPairs(const Vector< Box > &a_boxes, const Vector< T > &a_loads)
Utility function which packs boxes and loads into a vector of pairs.
Definition CD_LoadBalancingImplem.H:195
static void shuffleSort(Vector< Box > &a_boxes, Vector< T > &a_loads)
Randomly shuffles boxes and loads.
Definition CD_LoadBalancingImplem.H:290
Class for holding computational loads.
Definition CD_Loads.H:30
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:37
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:25