ESyS-Particle  4.0.1
mpisgbuf.h
00001 
00002 //                                                         //
00003 // Copyright (c) 2003-2011 by The University of Queensland //
00004 // Earth Systems Science Computational Centre (ESSCC)      //
00005 // http://www.uq.edu.au/esscc                              //
00006 //                                                         //
00007 // Primary Business: Brisbane, Queensland, Australia       //
00008 // Licensed under the Open Software License version 3.0    //
00009 // http://www.opensource.org/licenses/osl-3.0.php          //
00010 //                                                         //
00012 
00013 #ifndef __MPISGBUF_H
00014 #define __MPISGBUF_H
00015 
00016 #include <mpi.h>
00017 #include <string>
00018 #include "Parallel/mpibuf.h"
00019 
00028 class AMPISGBufferRoot
00029 {
00030 protected:
00031   MPI_Comm m_comm; 
00032   int m_rank; 
00033   int m_size; 
00034   int m_int_increment,m_dbl_increment; 
00035   MPI_Status m_status;
00036   
00037 public:
00038   AMPISGBufferRoot(MPI_Comm);
00039   virtual ~AMPISGBufferRoot(){};
00040 
00041   virtual void clear()=0;
00042   virtual void gather()=0;
00043   virtual void scatter()=0;
00044   virtual void append(int,int)=0;
00045   virtual void append(double,int)=0;
00046   virtual void append(const char*,int)=0;
00047   virtual void append(const Vec3 &,int);
00048   virtual int pop_int(int)=0;
00049   virtual double pop_double(int)=0;
00050   virtual void pop_doubles(int,double *,int)=0;
00051   virtual Vec3 pop_vector(int);
00052   const MPI_Status& status(){return m_status;};  
00053 };
00054 
00063 class AMPISGBufferLeaf : public AMPIBuffer
00064 {
00065  protected:
00066   int m_root; 
00067   int m_int_increment,m_dbl_increment; 
00068 
00069 public:
00070   AMPISGBufferLeaf(MPI_Comm,int);
00071   virtual ~AMPISGBufferLeaf(){};
00072 
00073   virtual void clear()=0;
00074   virtual void send()=0;
00075   virtual void receive()=0;
00076   virtual void append(int)=0;
00077   virtual void append(double)=0;
00078   virtual int pop_int()=0;
00079   virtual double pop_double()=0;
00080   virtual void pop_doubles(double *,int)=0;
00081   virtual std::string pop_string()=0;
00082   const MPI_Status& status(){return m_status;};  
00083 };
00084 
00093 class CMPISGBufferRoot : public AMPISGBufferRoot
00094 {
00095 private:
00096   char* m_buffer;
00097   char* m_dummy_buffer; 
00098   int m_buffersize; 
00099   int *m_position; 
00100 
00101 public:
00102   CMPISGBufferRoot(MPI_Comm,int);
00103   virtual ~CMPISGBufferRoot();
00104 
00105   virtual void clear();
00106   virtual void gather();
00107   virtual void scatter();
00108   virtual void append(int,int);
00109   virtual void append(double,int);
00110   virtual void append(const char*,int);
00111   virtual int pop_int(int);
00112   virtual double pop_double(int);
00113   virtual void pop_doubles(int,double *,int);
00114 };
00115 
00124 class CMPISGBufferLeaf : public AMPISGBufferLeaf
00125 {
00126 private:
00127   char* m_buffer; 
00128   int m_buffersize; 
00129   int m_position; 
00130 
00131 public:
00132   CMPISGBufferLeaf(MPI_Comm,int,int);
00133   virtual ~CMPISGBufferLeaf();
00134 
00135   virtual void clear();
00136   virtual void send();
00137   virtual void receive();
00138   virtual void append(int);
00139   virtual void append(double);
00140   virtual void append(const char*);
00141   virtual int pop_int();
00142   virtual double pop_double();
00143   virtual void pop_doubles(double *,int);
00144   virtual std::string pop_string();
00145 };
00146 
00147 #endif // __MPISGBUF_H