ESyS-Particle  4.0.1
mpisgbuf.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 __MPISGBUF_H
14 #define __MPISGBUF_H
15 
16 #include <mpi.h>
17 #include <string>
18 #include "Parallel/mpibuf.h"
19 
29 {
30 protected:
31  MPI_Comm m_comm;
32  int m_rank;
33  int m_size;
34  int m_int_increment,m_dbl_increment;
35  MPI_Status m_status;
36 
37 public:
38  AMPISGBufferRoot(MPI_Comm);
39  virtual ~AMPISGBufferRoot(){};
40 
41  virtual void clear()=0;
42  virtual void gather()=0;
43  virtual void scatter()=0;
44  virtual void append(int,int)=0;
45  virtual void append(double,int)=0;
46  virtual void append(const char*,int)=0;
47  virtual void append(const Vec3 &,int);
48  virtual int pop_int(int)=0;
49  virtual double pop_double(int)=0;
50  virtual void pop_doubles(int,double *,int)=0;
51  virtual Vec3 pop_vector(int);
52  const MPI_Status& status(){return m_status;};
53 };
54 
64 {
65  protected:
66  int m_root;
67  int m_int_increment,m_dbl_increment;
68 
69 public:
70  AMPISGBufferLeaf(MPI_Comm,int);
71  virtual ~AMPISGBufferLeaf(){};
72 
73  virtual void clear()=0;
74  virtual void send()=0;
75  virtual void receive()=0;
76  virtual void append(int)=0;
77  virtual void append(double)=0;
78  virtual int pop_int()=0;
79  virtual double pop_double()=0;
80  virtual void pop_doubles(double *,int)=0;
81  virtual std::string pop_string()=0;
82  const MPI_Status& status(){return m_status;};
83 };
84 
94 {
95 private:
96  char* m_buffer;
97  char* m_dummy_buffer;
98  int m_buffersize;
99  int *m_position;
100 
101 public:
102  CMPISGBufferRoot(MPI_Comm,int);
103  virtual ~CMPISGBufferRoot();
104 
105  virtual void clear();
106  virtual void gather();
107  virtual void scatter();
108  virtual void append(int,int);
109  virtual void append(double,int);
110  virtual void append(const char*,int);
111  virtual int pop_int(int);
112  virtual double pop_double(int);
113  virtual void pop_doubles(int,double *,int);
114 };
115 
125 {
126 private:
127  char* m_buffer;
128  int m_buffersize;
129  int m_position;
130 
131 public:
132  CMPISGBufferLeaf(MPI_Comm,int,int);
133  virtual ~CMPISGBufferLeaf();
134 
135  virtual void clear();
136  virtual void send();
137  virtual void receive();
138  virtual void append(int);
139  virtual void append(double);
140  virtual void append(const char*);
141  virtual int pop_int();
142  virtual double pop_double();
143  virtual void pop_doubles(double *,int);
144  virtual std::string pop_string();
145 };
146 
147 #endif // __MPISGBUF_H