#ifndef MPI_SIMULATION_HPP #define MPI_SIMULATION_HPP #include <mpi.h> #include <Simulation.hpp> #include <BarnesHutTree.hpp> #include <vector> namespace nbody { using namespace std; typedef struct _SendStore { Body* bodies; MPI_Request request; int size; } SendStore; class MpiSimulation : public Simulation { protected: MPI_Datatype bodyType; MPI_Datatype boxType; Box* domains; Box overallDomain; vector<SendStore> sendStores; virtual SendStore* availableSendStore(int numElems); virtual void send(vector<Body> bodies, int target); virtual void recv(vector<Body>& bodies); public: MpiSimulation(int& argc, char**& argv); virtual ~MpiSimulation(); virtual void cleanup(); virtual int getNumberOfProcesses(); virtual int getProcessId(); virtual bool stateCorrect(); virtual void distributeBodies(); virtual void distributeDomains(vector<Body> localBodies); virtual void distributeDomains(Box localDomain); virtual void distributeDomains(); virtual void distributeLETs(); virtual void rebuildTree(); virtual void buildTree(); virtual void runStep(); virtual MPI_Datatype* getDatatype(); }; } #endif