Nemo  2.2.0
MPImanager.h
Go to the documentation of this file.
00001 
00029 #ifndef __MPIMANAGER_H
00030 #define __MPIMANAGER_H
00031 
00032 #include <queue>
00033 #include <string>
00034 #include <map>
00035 #include "MPStatHandler.h"
00036 
00037 #ifdef USE_MPI
00038 #include <mpi.h>
00039 #endif
00040 
00047 class MPImanager {
00048 
00049  public:
00050     MPImanager() {}
00051     virtual ~MPImanager() {}
00052     virtual unsigned int init( MPStatHandler *SH ) = 0;
00053     virtual void finish( MPStatHandler *SH, unsigned int *_gen, unsigned int _repl );
00054     virtual void iterate( Metapop *_pop, MPStatHandler *SH, unsigned int *_gen, unsigned int *_repl ) = 0;
00055 
00056  protected:
00057     double **buf_dbl;
00058     unsigned int **buf_int;
00059     unsigned int buf_stride, size;
00060 
00061 };
00062 
00063 #ifdef USE_MPI
00064 
00076 class MPImaster : public MPImanager {
00077 
00078  public:
00079     MPImaster( const unsigned int count );
00080     ~MPImaster()                   { delete[] _request; }
00081     unsigned int init( MPStatHandler *SH );
00082     void finish( MPStatHandler *SH, unsigned int *_gen, unsigned int _repl );
00083     void iterate( Metapop *_pop, MPStatHandler *SH, unsigned int *_gen, unsigned int *_repl );
00084 
00085  private:
00086     MPI::Request *_request;
00087     std::vector< unsigned int > slave_job;
00088     unsigned int waitSlave();
00089     unsigned int assign( const unsigned int job, const unsigned int slave );
00090     
00091 };
00092 
00103 class MPIslave : public MPImanager {
00104 
00105  public:
00106     MPIslave() {}
00107     unsigned int init( MPStatHandler *SH );
00108     void iterate( Metapop *_pop, MPStatHandler *SH, unsigned int *_gen, unsigned int *_repl );
00109 
00110 };
00111 #endif
00112 
00120 class MPIenv {
00121 
00122  public:
00123     MPIenv( int &argc, char **&argv, MPImanager *&_p );
00124     static void  abort( int i );
00125     static void  finish( MPImanager *p ); 
00126     bool         isMaster() const   { return (rank==0); }
00127     unsigned int slaveCount() const { return size-1; }
00128     unsigned int slaveRank() const  { return rank; }
00129     std::string  hostName() const   { return host; }
00130 
00131  private:
00132     unsigned int size;
00133     unsigned int rank;
00134     std::string  host;
00135 
00136 };
00137 
00138 #endif

Generated for Nemo v2.2.0 by  doxygen 1.7.5.1 -- Nemo is hosted by  SourceForge.net Logo