ESyS-Particle  4.0.1
mpisgvbuf.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 __MPISGVBUF_H
00014 #define __MPISGVBUF_H
00015 
00016 #include "Parallel/mpisgbuf.h"
00017 #include <string>
00018 
00027 class CMPIVarSGBufferRoot: public AMPISGBufferRoot
00028 { 
00029 private:
00030   char* m_vbuffer;
00031   char* m_dummy_vbuffer; 
00032   int m_vbuffersize; 
00033   int *m_position; 
00034   int *m_rpos;     
00035 
00036   int *m_recvcount;
00037   int *m_displ; //<! the diplacements of the slices in the buffer
00038   int m_ndummy;
00039  
00040 
00041  protected:
00042   void grow();
00043   void growTo(int);
00044 
00045  public:
00046   CMPIVarSGBufferRoot(MPI_Comm,int isize=16);
00047   virtual ~CMPIVarSGBufferRoot();
00048 
00049   virtual void clear();
00050   virtual void gather();
00051   virtual void scatter();
00052   virtual void append(int,int);
00053   virtual void append(double,int);
00054   virtual void append(const char*,int);
00055   virtual int pop_int(int);
00056   virtual double pop_double(int);
00057   virtual void pop_doubles(int,double *,int);
00058 };
00059 
00068 class CMPIVarSGBufferLeaf: public AMPISGBufferLeaf
00069 {
00070  private:
00071   char* m_vbuffer; 
00072   int m_vbuffersize; 
00073   int m_position; 
00074   int m_data_size;
00075 
00076  protected:
00077   void grow();
00078   void growTo(int);
00079 
00080  public:
00081   CMPIVarSGBufferLeaf(MPI_Comm,int,int isize=16);
00082   virtual ~CMPIVarSGBufferLeaf();
00083 
00084   virtual void clear();
00085   virtual void send();
00086   virtual void receive();
00087   virtual void append(int);
00088   virtual void append(double);
00089   virtual void append(const char*);
00090   virtual int pop_int();
00091   virtual double pop_double();
00092   virtual void pop_doubles(double *,int);
00093   virtual std::string pop_string();
00094 };
00095 
00096 
00097 
00098 #endif // __MPISGVBUF_H