1#ifndef KDDECOMPOSITION2_H_
2#define KDDECOMPOSITION2_H_
12#include "DomainDecompMPIBase.h"
13#include "parallel/CollectiveCommunication.h"
14#include "ParticleDataForwardDeclaration.h"
15#include "particleContainer/adapter/CellProcessor.h"
16#include "parallel/LoadCalc.h"
39 friend class KDDecompositionTest;
55 KDDecomposition(
double cutoffRadius,
int numParticleTypes,
int updateFrequency = 100,
int fullSearchThreshold = 2);
150 unsigned int stageNumber)
override;
155 unsigned int stageNumber)
override;
167 int getUpdateFrequency()
const {
return _frequency; }
168 void setUpdateFrequency(
int frequency) { _frequency = frequency; }
169 std::vector<int> getNeighbourRanks()
override;
170 std::vector<int> getNeighbourRanksFullShell()
override;
172 std::vector<CommunicationPartner> getNeighboursFromHaloRegion(
Domain* domain,
const HaloRegion& haloRegion,
double cutoff)
override;
204 void calculateCostsPar(
KDNode* area, std::vector<std::vector<double> >& costsLeft, std::vector<std::vector<double> >& costsRight, MPI_Comm commGroup);
220 unsigned int getGlobalIndex(
int divDim,
int dim1,
int dim2,
int index_dim,
int index_dim1,
int index_dim2,
KDNode* localArea);
228 int ownMod(
int number,
int modulo)
const;
230 void getCellBorderFromIntCoords(
double * lC,
double * hC,
int lo[3],
int hi[3])
const;
232 void getCellIntCoordsFromRegionPeriodic(
int * lo,
int * hi,
const double lC[3],
const double hC[3],
const Domain* domain)
const;
263 void getOwningProcs(
int low[KDDIM],
int high[KDDIM],
KDNode* decompTree,
KDNode* testNode, std::vector<int>* procIDs, std::vector<int>* neighbHaloAreas)
const;
270 bool decompose(
KDNode* fatherNode,
KDNode*& ownArea, MPI_Comm commGroup);
272 bool decompose(
KDNode* fatherNode,
KDNode*& ownArea, MPI_Comm commGroup,
double globalMinimalDeviation);
283 bool heteroDecompose(
KDNode* fatherNode,
KDNode*& ownArea, MPI_Comm commGroup);
291 bool calculateAllPossibleSubdivisions(
KDNode* node, std::list<KDNode*>& subdividedNodes, MPI_Comm commGroup);
299 bool calculateHeteroSubdivision(
KDNode* node,
KDNode*& subdivededNode, MPI_Comm commGroup);
301 void updateMeanProcessorSpeeds(std::vector<double>& processorSpeeds,
302 std::vector<double>& accumulatedProcessorSpeeds,
ParticleContainer* moleculeContainer);
309 void collectMoleculesInRegion(
ParticleContainer* moleculeContainer,
const double startRegion[3],
const double endRegion[3], std::vector<Molecule*>& mols)
const;
314 int calculatePartitionRank();
315 bool checkNeedRebalance(
double lastTraversalTime)
const;
322 double _cellSize[KDDIM]{};
326 int _globalCellsPerDim[KDDIM]{};
329 int _globalNumCells{};
332 KDNode* _decompTree{
nullptr};
335 KDNode* _ownArea{
nullptr};
338 std::vector<unsigned int> _numParticlesPerCell;
348 double _cutoffRadius;
349 int _cellsInCutoffRadius{1};
356 int _fullSearchThreshold;
359 std::vector<double> _processorSpeeds;
360 std::vector<double> _accumulatedProcessorSpeeds;
361 double _totalMeanProcessorSpeed{1.};
362 double _totalProcessorSpeed{1.};
363 int _processorSpeedUpdateCount{0};
364 bool _heterogeneousSystems{
false};
365 bool _clusteredHeterogeneouseSystems{
false};
366 bool _splitBiggest{
true};
367 bool _forceRatio{
false};
369 bool _doMeasureLoadCalc {
false};
370 int _measureLoadInterpolationStartsAt{1};
371 bool _measureLoadIncreasingTimeValues{
true};
377 int _splitThreshold{std::numeric_limits<int>::max()};
378 int _numParticleTypes;
387 int _maxPars{std::numeric_limits<int>::min()};
388 int _maxPars2{std::numeric_limits<int>::min()};
397 const int _partitionRank;
412 std::vector<int> _vecTunParticleNums;
413 bool _generateNewFiles{
true};
414 bool _useExistingFiles{
true};
415 bool _vecTunerAllowMPIReduce{
true};
418 double _rebalanceLimit{0.};
425 MPI_Op _deviationReductionOperation{MPI_SUM};
Definition: CellProcessor.h:29
Definition: DomainDecompMPIBase.h:30
This class is used to read in the phasespace and to handle macroscopic values.
Definition: Domain.h:47
KD tree based domain decomposition for better load balancing.
Definition: KDDecomposition.h:37
double getBoundingBoxMin(int dimension, Domain *domain) override
Definition: KDDecomposition.cpp:674
bool queryBalanceAndExchangeNonBlocking(bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain, double etime) override
Checks whether the balance and exchange step can be performed non-blocking.
Definition: KDDecomposition.cpp:235
virtual void readXML(XMLfileUnits &xmlconfig) override
Read in XML configuration for KDDecomposition and all its included objects.
Definition: KDDecomposition.cpp:101
void balanceAndExchange(double lastTraversalTime, bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain) override
balance the load (and optimize communication) and exchange boundary particles
Definition: KDDecomposition.cpp:261
void printTree(std::ostream &ostream)
Definition: KDDecomposition.cpp:1856
double getBoundingBoxMax(int dimension, Domain *domain) override
Definition: KDDecomposition.cpp:688
virtual void prepareNonBlockingStage(bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain, unsigned int stageNumber) override
Definition: KDDecomposition.cpp:206
KDDecomposition(double cutoffRadius, int numParticleTypes, int updateFrequency=100, int fullSearchThreshold=2)
create an initial decomposition tree
Definition: KDDecomposition.cpp:34
virtual void finishNonBlockingStage(bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain, unsigned int stageNumber) override
Definition: KDDecomposition.cpp:218
represents a node in the decomposition tree when using KDDecomposition
Definition: KDNode.h:28
Definition: LoadCalc.h:24
Definition: LoadCalc.h:227
This Interface is used to get access to particles and pairs of particles.
Definition: ParticleContainer.h:69
XML file with unit attributes abstraction.
Definition: xmlfileUnits.h:25
Definition: HaloRegion.h:10