ls1-MarDyn
ls1-MarDyn molecular dynamics code
Public Member Functions | Friends | List of all members
GeneralDomainDecomposition Class Reference

#include <GeneralDomainDecomposition.h>

Inheritance diagram for GeneralDomainDecomposition:
DomainDecompMPIBase DomainDecompBase MemoryProfilable

Public Member Functions

 GeneralDomainDecomposition (double interactionLength, Domain *domain, bool forceGrid)
 
void readXML (XMLfileUnits &xmlconfig) override
 Read in XML configuration for DomainDecomposition and all its included objects. More...
 
double getBoundingBoxMin (int dimension, Domain *domain) override
 get the minimum of the bounding box of this process' domain in the given dimension (0,1,2) More...
 
double getBoundingBoxMax (int dimension, Domain *domain) override
 get the maximum of the bounding box of this process' domain in the given dimension (0,1,2) More...
 
void balanceAndExchange (double lastTraversalTime, bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain) override
 balance the load (and optimize communication) and exchange boundary particles More...
 
std::vector< int > getNeighbourRanks () override
 
std::vector< int > getNeighbourRanksFullShell () override
 
void prepareNonBlockingStage (bool forceRebalancing, ParticleContainer *moleculeContainer, Domain *domain, unsigned int stageNumber) override
 
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...
 
std::vector< CommunicationPartnergetNeighboursFromHaloRegion (Domain *domain, const HaloRegion &haloRegion, double cutoff) override
 
- 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 ()
 

Friends

class GeneralDomainDecompositionTest
 

Additional Inherited Members

- 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
 

Detailed Description

This decomposition is meant to be able to call arbitrary load balancers.

Constructor & Destructor Documentation

◆ GeneralDomainDecomposition()

GeneralDomainDecomposition::GeneralDomainDecomposition ( double  interactionLength,
Domain domain,
bool  forceGrid 
)

Constructor for the GeneralDomainDecomposition.

Parameters
interactionLength
domain
forceGrid

Member Function Documentation

◆ balanceAndExchange()

void GeneralDomainDecomposition::balanceAndExchange ( double  lastTraversalTime,
bool  forceRebalancing,
ParticleContainer moleculeContainer,
Domain domain 
)
overridevirtual

balance the load (and optimize communication) and exchange boundary particles

This method is used to perform a new decomposition of the global domain with the goal of getting the equal load (and possibly additional goals) on each process. This method is then also responsible for redistributing all particles, so after the method was called, each process has a domain with all particles belonging to this domain (as if exchangeParticles was called after the new decomposition).

Parameters
balanceif true, a rebalancing is forced; otherwise automatic balancing of Decomposition is applied
moleculeContainerneeded for calculating load and to get the particles
domainis e.g. needed to get the size of the local domain

Reimplemented from DomainDecompBase.

◆ finishNonBlockingStage()

void GeneralDomainDecomposition::finishNonBlockingStage ( bool  forceRebalancing,
ParticleContainer moleculeContainer,
Domain domain,
unsigned int  stageNumber 
)
inlineoverridevirtual

Finishes the stageNumber'th stage. This includes receiving the particles, that have to be received in that stage.

Parameters
forceRebalancingtrue if rebalancing should be forced
moleculeContainerpointer to the molecule container
domainpointer to the domain
stageNumberthe number of the stage, the communication is in.

Implements DomainDecompMPIBase.

◆ getBoundingBoxMax()

double GeneralDomainDecomposition::getBoundingBoxMax ( int  dimension,
Domain domain 
)
overridevirtual

get the maximum of the bounding box of this process' domain in the given dimension (0,1,2)

Parameters
dimensioncoordinate direction for which the maximum of the bounding box is returned
domainhere the bounding box is stored

Reimplemented from DomainDecompBase.

◆ getBoundingBoxMin()

double GeneralDomainDecomposition::getBoundingBoxMin ( int  dimension,
Domain domain 
)
overridevirtual

get the minimum of the bounding box of this process' domain in the given dimension (0,1,2)

Parameters
dimensioncoordinate direction for which the minimum of the bounding box is returned
domainhere the bounding box is stored

Reimplemented from DomainDecompBase.

◆ getNeighbourRanks()

std::vector<int> GeneralDomainDecomposition::getNeighbourRanks ( )
inlineoverridevirtual

Implements DomainDecompMPIBase.

◆ getNeighbourRanksFullShell()

std::vector<int> GeneralDomainDecomposition::getNeighbourRanksFullShell ( )
inlineoverridevirtual

Implements DomainDecompMPIBase.

◆ getNeighboursFromHaloRegion()

std::vector<CommunicationPartner> GeneralDomainDecomposition::getNeighboursFromHaloRegion ( Domain domain,
const HaloRegion haloRegion,
double  cutoff 
)
inlineoverridevirtual

Implements DomainDecompMPIBase.

◆ prepareNonBlockingStage()

void GeneralDomainDecomposition::prepareNonBlockingStage ( bool  forceRebalancing,
ParticleContainer moleculeContainer,
Domain domain,
unsigned int  stageNumber 
)
inlineoverridevirtual

Prepares the stageNumber'th stage. This includes sending particles, that have to be send in that stage.

Parameters
forceRebalancingtrue if rebalancing should be forced
moleculeContainerpointer to the molecule container
domainpointer to the domain
stageNumberthe number of the stage, the communication is in.

Implements DomainDecompMPIBase.

◆ queryBalanceAndExchangeNonBlocking()

bool GeneralDomainDecomposition::queryBalanceAndExchangeNonBlocking ( bool  forceRebalancing,
ParticleContainer moleculeContainer,
Domain domain,
double  etime 
)
inlineoverridevirtual

Checks whether the balance and exchange step can be performed non-blocking.

A non-blocking behaviour is typically possible, as long as no rebalancing has to be done.

Parameters
forceRebalancingif true, a rebalancing is forced; otherwise automatic balancing of Decomposition is applied
moleculeContainerneeded for calculating load and to get the particles
domainis e.g. needed to get the size of the local domain

Reimplemented from DomainDecompBase.

◆ readXML()

void GeneralDomainDecomposition::readXML ( XMLfileUnits xmlconfig)
overridevirtual

Read in XML configuration for DomainDecomposition and all its included objects.

The following xml object structure is handled by this method:

<parallelisation type="GeneralDomainDecomposition">
<updateFrequency>INTEGER</updateFrequency>
<initialPhaseTime>INTEGER</initialPhaseTime><!--time for initial rebalancing phase-->
<initialPhaseFrequency>INTEGER</initialPhaseFrequency><!--frequency for initial rebalancing phase-->
<gridSize>STRING</gridSize><!--default: 0; if non-zero, the process boundaries are fixed to multiples of
gridSize. Comma separated string to define three different grid sizes for the different dimensions is
possible.-->
<loadBalancer type="STRING"><!--STRING...type of the load balancer, currently supported: ALL-->
<!--options for the load balancer-->
<!--for detailed information see the readXML functions from ALLLoadBalancer.-->
</loadBalancer>
</parallelisation>

Reimplemented from DomainDecompMPIBase.


The documentation for this class was generated from the following files: