ESyS-Particle
4.0.1
|
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