|
| KDDecomposition (double cutoffRadius, int numParticleTypes, int updateFrequency=100, int fullSearchThreshold=2) |
| create an initial decomposition tree More...
|
|
void | init (Domain *domain) |
|
virtual void | readXML (XMLfileUnits &xmlconfig) override |
| Read in XML configuration for KDDecomposition and all its included objects. More...
|
|
virtual void | prepareNonBlockingStage (bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain, unsigned int stageNumber) override |
|
virtual void | finishNonBlockingStage (bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain, unsigned int stageNumber) override |
|
bool | queryBalanceAndExchangeNonBlocking (bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain, double etime) override |
| Checks whether the balance and exchange step can be performed non-blocking. More...
|
|
void | balanceAndExchange (double lastTraversalTime, bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain) override |
| balance the load (and optimize communication) and exchange boundary particles More...
|
|
double | getBoundingBoxMin (int dimension, Domain *domain) override |
|
double | getBoundingBoxMax (int dimension, Domain *domain) override |
|
int | getUpdateFrequency () const |
|
void | setUpdateFrequency (int frequency) |
|
std::vector< int > | getNeighbourRanks () override |
|
std::vector< int > | getNeighbourRanksFullShell () override |
|
std::vector< CommunicationPartner > | getNeighboursFromHaloRegion (Domain *domain, const HaloRegion &haloRegion, double cutoff) override |
|
void | fillTimeVecs (CellProcessor **cellProc) |
|
void | printTree (std::ostream &ostream) |
|
Public Member Functions inherited from DomainDecompMPIBase |
void | barrier () const override |
| synchronizes all processes More...
|
|
unsigned | Ndistribution (unsigned localN, float *minrnd, float *maxrnd) |
| returns total number of molecules More...
|
|
void | assertIntIdentity (int IX) |
| checks identity of random number generators More...
|
|
void | assertDisjunctivity (ParticleContainer *moleculeContainer) const override |
|
void | collCommInit (int numValues, int key=0) override |
| has to call init method of a CollComm class More...
|
|
void | collCommFinalize () override |
| has to call finalize method of a CollComm class More...
|
|
void | collCommAppendInt (int intValue) override |
| has to call appendInt method of a CollComm class More...
|
|
void | collCommAppendUnsLong (unsigned long unsLongValue) override |
| has to call appendUnsLong method of a CollComm class More...
|
|
void | collCommAppendFloat (float floatValue) override |
| has to call appendFloat method of a CollComm class More...
|
|
void | collCommAppendDouble (double doubleValue) override |
| has to call appendDouble method of a CollComm class More...
|
|
void | collCommAppendLongDouble (long double longDoubleValue) override |
| has to call appendLongDouble method of a CollComm class More...
|
|
int | collCommGetInt () override |
| has to call getInt method of a CollComm class More...
|
|
unsigned long | collCommGetUnsLong () override |
| has to call getUnsLong method of a CollComm class More...
|
|
float | collCommGetFloat () override |
| has to call getFloat method of a CollComm class More...
|
|
double | collCommGetDouble () override |
| has to call getDouble method of a CollComm class More...
|
|
long double | collCommGetLongDouble () override |
| has to call getLongDouble method of a CollComm class More...
|
|
void | collCommAllreduceSum () override |
| has to call allreduceSum method of a CollComm class (none in sequential version) More...
|
|
void | collCommAllreduceSumAllowPrevious () override |
| has to call allreduceSum method of a CollComm class (none in sequential version), allows for values of previous iteration. More...
|
|
void | collCommAllreduceCustom (ReduceType type) override |
| has to call allreduceCustom method of a CollComm class (none in sequential version) More...
|
|
void | collCommScanSum () override |
| has to call scanSum method of a CollComm class (none in sequential version) More...
|
|
void | collCommBroadcast (int root=0) override |
| has to call broadcast method of a CollComm class (none in sequential version) More...
|
|
virtual void | balanceAndExchangeInitNonBlocking (bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain) |
|
void | exchangeMoleculesMPI (ParticleContainer *moleculeContainer, Domain *domain, MessageType msgType, bool doHaloPositionCheck=true, bool removeRecvDuplicates=false) |
| exchange molecules between processes More...
|
|
void | exchangeForces (ParticleContainer *moleculeContainer, Domain *domain) override |
| Exchanges forces at the domain boundaries if it's required by the cell container. More...
|
|
MPI_Datatype | getMPIParticleType () |
|
MPI_Datatype | getMPIParticleForceType () |
|
MPI_Comm | getCommunicator () override |
|
virtual void | setCommunicationScheme (const std::string &scheme, const std::string &comScheme) |
|
virtual int | getNonBlockingStageCount () override |
|
virtual size_t | getTotalSize () override |
|
virtual void | printSubInfo (int offset) override |
|
virtual void | printDecomp (const std::string &filename, Domain *domain, ParticleContainer *particleContainer) override |
| writes information about the current decomposition into the given file More...
|
|
virtual std::string | getName () override |
|
void | printCommunicationPartners (std::string filename) const override |
|
Public Member Functions inherited from DomainDecompBase |
| DomainDecompBase () |
| The Constructor determines the own rank and the number of the neighbours */.
|
|
| ~DomainDecompBase () override |
| The Destructor finalizes MPI.
|
|
void | exchangeMolecules (ParticleContainer *moleculeContainer, Domain *domain) |
| exchange molecules between processes More...
|
|
virtual bool | procOwnsPos (double x, double y, double z, Domain *domain) final |
| find out whether the given position belongs to the domain of this process More...
|
|
void | getBoundingBoxMinMax (Domain *domain, double *min, double *max) |
| get the minimum and maximum coordinate of the bounding box of this process' domain More...
|
|
virtual int | getRank () const |
| returns the own rank More...
|
|
virtual int | getNumProcs () const |
| returns the number of processes More...
|
|
virtual double | getTime () const |
| returns the time in seconds since some time in the past
|
|
double | getIOCutoffRadius (int dim, Domain *domain, ParticleContainer *moleculeContainer) |
| returns an cutoff radius for a dimension for a global linked cells datastructure More...
|
|
void | writeMoleculesToMPIFileBinary (const std::string &filename, ParticleContainer *moleculeContainer) const |
| appends molecule data to the file. The format is the same as that of the input file This version uses, MPI IO. More...
|
|
void | writeMoleculesToFile (const std::string &filename, ParticleContainer *moleculeContainer, bool binary=false) const |
| appends molecule data to the file. The format is the same as that of the input file If MPI is enabled and binary files are supposed to be written this function will call writeMoleculesToMPIFileBinary(). Otherwise, to ensure that not more than one process writes to the file at any time, there is a loop over all processes with a barrier in between. More...
|
|
void | updateSendLeavingWithCopies (bool sendTogether) |
|
bool | sendLeavingWithCopies () const |
|
virtual std::vector< std::vector< std::vector< int > > > | getAllRanks () |
|
|
Protected Member Functions inherited from DomainDecompMPIBase |
virtual void | prepareNonBlockingStageImpl (ParticleContainer *moleculeContainer, Domain *domain, unsigned int stageNumber, MessageType msgType, bool removeRecvDuplicates=false) |
|
virtual void | finishNonBlockingStageImpl (ParticleContainer *moleculeContainer, Domain *domain, unsigned int stageNumber, MessageType msgType, bool removeRecvDuplicates=false) |
|
Protected Member Functions inherited from DomainDecompBase |
void | addLeavingMolecules (std::vector< Molecule > &&invalidMolecules, ParticleContainer *moleculeContainer) |
|
void | handleDomainLeavingParticles (unsigned dim, ParticleContainer *moleculeContainer) const |
|
void | handleDomainLeavingParticlesDirect (const HaloRegion &haloRegion, ParticleContainer *moleculeContainer, std::vector< Molecule > &invalidParticles) const |
|
void | handleForceExchange (unsigned dim, ParticleContainer *moleculeContainer) const |
| Does the force exchange for each dimension. Will be called for dim=0, 1 and 2. More...
|
|
virtual void | handleForceExchangeDirect (const HaloRegion &haloRegion, ParticleContainer *moleculeContainer) const |
|
void | populateHaloLayerWithCopies (unsigned dim, ParticleContainer *moleculeContainer) const |
|
void | populateHaloLayerWithCopiesDirect (const HaloRegion &haloRegion, ParticleContainer *moleculeContainer, bool positionCheck=true) const |
|
Protected Attributes inherited from DomainDecompMPIBase |
MPI_Datatype | _mpiParticleType |
|
MPI_Datatype | _mpiParticleForceType |
|
MPI_Comm | _comm |
|
std::unique_ptr< NeighbourCommunicationScheme > | _neighbourCommunicationScheme |
|
bool | _forceDirectPP {false} |
|
Protected Attributes inherited from DomainDecompBase |
int | _rank |
| the id of the current process
|
|
int | _numProcs |
| total number of processes in the simulation
|
|
KD tree based domain decomposition for better load balancing.
The basic idea is to build up all possible subdivisions and do a A*-like search of the best subdivision.
The function to minimize is the load imbalance:
During the downward pass an estimate is the expected load imbalance, which is averaged over all children, in the upward pass, the exact imbalance is calculated.
- Note
- It is important for the A*-search that the estimate is an underestimation (<=) of the load imbalance.
-
Some computation of the deviation / expected deviation is done in KDNode.