ESyS-Particle  4.0.1
mpibuf.h
1 
2 // //
3 // Copyright (c) 2003-2011 by The University of Queensland //
4 // Earth Systems Science Computational Centre (ESSCC) //
5 // http://www.uq.edu.au/esscc //
6 // //
7 // Primary Business: Brisbane, Queensland, Australia //
8 // Licensed under the Open Software License version 3.0 //
9 // http://www.opensource.org/licenses/osl-3.0.php //
10 // //
12 
13 #ifndef __MPIBUF_H
14 #define __MPIBUF_H
15 
16 //--- MPI includes ---
17 #include <mpi.h>
18 
19 //--- Project includes ---
20 #include "Foundation/vec3.h"
21 
22 // --- STL includes ---
23 #include <string>
24 
34 {
35  protected:
36  MPI_Comm m_comm;
37  MPI_Status m_status;
38 
39 public:
40  AMPIBuffer(MPI_Comm comm){m_comm=comm;};
41  virtual ~AMPIBuffer(){};
42 
43  virtual void clear()=0;
44  virtual void append(int)=0;
45  virtual void append(double)=0;
46  virtual void append(const char*)=0;
47  virtual void append(const Vec3 &) ;
48  virtual int pop_int()=0;
49  virtual double pop_double()=0;
50  virtual void pop_doubles(double*,int)=0;
51  virtual std::string pop_string()=0;
52  virtual Vec3 pop_vector() ;
53  const MPI_Status& status(){return m_status;};
54 };
55 
65 class AMPIBufferPP : public AMPIBuffer
66 {
67 public:
68  AMPIBufferPP(MPI_Comm comm);
69  virtual ~AMPIBufferPP(){};
70  virtual void sendTo(int,int)=0;
71  virtual void receiveFrom(int src=MPI_ANY_SOURCE,int tag=MPI_ANY_TAG)=0;
72 };
73 
85 class CMPIBuffer : public AMPIBufferPP
86 {
87  private:
88 
89  char* m_buffer;
90  int m_buffersize;
91  int m_position;
92  int m_int_increment,m_dbl_increment;
93 
94 
95  public:
96  CMPIBuffer(MPI_Comm,int);
97  virtual ~CMPIBuffer();
98 
99  virtual void clear(){m_position=0;};
100  virtual void sendTo(int,int);
101  virtual void receiveFrom(int src=MPI_ANY_SOURCE,int tag=MPI_ANY_TAG);
102  virtual void append(int);
103  virtual void append(double);
104  virtual void append(const char*);
105  bool append_checked(int);
106  bool append_checked(double);
107  virtual int pop_int();
108  virtual double pop_double();
109  virtual void pop_doubles(double*,int);
110  virtual std::string pop_string();
111 };
112 
113 #endif //__MPIBUF_H