ESyS-Particle  2.3
pi_storage.h
Go to the documentation of this file.
1 // //
3 // Copyright (c) 2003-2014 by The University of Queensland //
4 // Centre for Geoscience Computing //
5 // http://earth.uq.edu.au/centre-geoscience-computing //
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 __PARALLEL_INTERACTION_STORAGE_H
14 #define __PARALLEL_INTERACTION_STORAGE_H
15 
16 //--- MPI includes ---
17 #include <mpi.h>
18 
19 //--- STL includes ---
20 #include <list>
21 #include <vector>
22 #include <iostream>
23 #include <stdexcept>
24 
25 using std::list;
26 using std::vector;
27 using std::pair;
28 
29 //--- Project includes ---
30 #include "Foundation/vec3.h"
31 #include "Foundation/quintuple.h"
32 #include "Foundation/triplet.h"
34 #include "tml/comm/comm.h"
35 
36 // forward declared class to avoid circular include
37 class AFieldSlave;
39 
45 {
46  protected:
48 
49  public:
52 
53  virtual void exchange()=0;
54  virtual void rebuild()=0;
55  virtual bool update()=0;
56  // virtual void tryInsert(const vector<int>&)=0;
57  virtual bool isIn(const vector<int>&)=0;
58  virtual void calcForces()=0;
59  virtual void calcHeatFrict() {}
60  virtual void calcHeatTrans() {}
61  virtual void setTimeStepSize(double dt)=0;
62  virtual void addExIG(AParallelInteractionStorage*){}; // do nothing
63  virtual AFieldSlave* generateNewScalarFieldSlave(TML_Comm*,const string&,int,int,int,int)=0;
64  virtual AFieldSlave* generateNewVectorFieldSlave(TML_Comm*,const string&,int,int,int,int)=0;
65 
66  virtual void saveCheckPointData(std::ostream&)
67  {
68  throw std::runtime_error("saveCheckPointData not implemented in subclass.");
69  }
70 
71  virtual void loadCheckPointData(std::istream&)
72  {
73  throw std::runtime_error("loadCheckPointData not implemented in subclass.");
74  }
75 
76  virtual void saveSnapShotData(std::ostream&)
77  {
78  throw std::runtime_error(" saveSnapShotData not implemented in subclass.");
79  }
80 
81  virtual bool willSave(){ return false;};
82 };
83 
89 template <typename I>
91 {
92  public:
93  typedef I interaction_type;
94 
95  protected:
96  list<I> m_interactions;
97 
98  public:
101 
103  public:
104  typedef I Interaction;
105  typedef typename list<I>::iterator Iterator;
106 
107  InteractionIterator(Iterator begin, Iterator end, AParallelParticleArray* ppa);
108 
109  bool hasNext();
110 
111  Interaction &next();
112 
113  int getNumRemaining();
114 
115  protected:
116  bool isInner(const Iterator &it);
117 
118  private:
120  Iterator m_it;
121  Iterator m_end;
123  };
124 
126 
131 
133  template <typename P> vector<pair<Vec3,P> > forAllInnerInteractionsGetWithPos(P (I::*rdf)() const);
134  template <typename P> vector<pair<Raw2Data,P> > forAllInnerInteractionsGetRaw2(P (I::*rdf)() const);
135  template <typename P> vector<pair<DataWithID,P> > forAllInnerInteractionsGetDataWithID(P (I::*rdf)() const);
136  template <typename P> vector<pair<DataWithPosID,P> > forAllInnerInteractionsGetDataWithPosID(P (I::*rdf)() const);
137  template <typename P> void forAllInnerInteractionsGet(P&,typename P::value_type (I::*rdf)() const);
138 
140  template <typename P> vector<pair<Vec3,P> > forAllTaggedInnerInteractionsGetWithPos(P (I::*rdf)() const,int,int);
141  template <typename P> void forAllTaggedInnerInteractionsGet(P&,typename P::value_type (I::*rdf)() const,int,int);
142 
144  virtual AFieldSlave* generateNewScalarFieldSlave(TML_Comm*,const string&,int,int,int,int); // const ?
145  virtual AFieldSlave* generateNewVectorFieldSlave(TML_Comm*,const string&,int,int,int,int);
146 
147 };
148 
149 #include "pis/pi_storage.hpp"
150 
151 #endif //__PARALLEL_INTERACTION_STORAGE_H
vector< pair< DataWithPosID, P > > forAllInnerInteractionsGetDataWithPosID(P(I::*rdf)() const)
virtual AFieldSlave * generateNewVectorFieldSlave(TML_Comm *, const string &, int, int, int, int)
Definition: pi_storage.hpp:316
virtual void calcForces()=0
AParallelParticleArray * m_ppa
Definition: pi_storage.h:47
InteractionIterator(Iterator begin, Iterator end, AParallelParticleArray *ppa)
Definition: pi_storage.hpp:29
InteractionIterator getInnerInteractionIterator()
types
Definition: pi_storage.hpp:76
I interaction_type
Definition: pi_storage.h:93
int getNumRemaining()
Definition: pi_storage.hpp:69
list< I > m_interactions
Definition: pi_storage.h:96
vector< pair< DataWithID, P > > forAllInnerInteractionsGetDataWithID(P(I::*rdf)() const)
vector< pair< Vec3, P > > forAllInnerInteractionsGetWithPos(P(I::*rdf)() const)
Definition: pi_storage.hpp:91
templated abstract base class for parallel interaction storage array. Adds the vector of interactions...
Definition: CheckedScalarInteractionFieldSlave.h:19
virtual void setTimeStepSize(double dt)=0
vector< pair< Vec3, P > > forAllTaggedInnerInteractionsGetWithPos(P(I::*rdf)() const, int, int)
Definition: pi_storage.hpp:231
list< I >::iterator Iterator
Definition: pi_storage.h:105
TParallelInteractionStorage(AParallelParticleArray *ppa)
Definition: pi_storage.h:99
Iterator m_it
Definition: pi_storage.h:120
int m_numRemaining
Definition: pi_storage.h:119
virtual void addExIG(AParallelInteractionStorage *)
Definition: pi_storage.h:62
virtual void rebuild()=0
virtual void calcHeatFrict()
Definition: pi_storage.h:59
void forAllTaggedInnerInteractionsGet(P &, typename P::value_type(I::*rdf)() const, int, int)
generate FieldSlave of correct type
Definition: pi_storage.hpp:258
virtual AFieldSlave * generateNewVectorFieldSlave(TML_Comm *, const string &, int, int, int, int)=0
I Interaction
Definition: pi_storage.h:104
esys::lsm::quintuple< int, int, Vec3, Vec3, Vec3 > DataWithPosID
access functions
Definition: pi_storage.h:130
bool isInner(const Iterator &it)
Definition: pi_storage.hpp:23
virtual ~AParallelInteractionStorage()
Definition: pi_storage.h:51
esys::lsm::triplet< int, int, Vec3 > DataWithID
Definition: pi_storage.h:129
Definition: triplet.h:23
AParallelInteractionStorage(AParallelParticleArray *ppa)
Definition: pi_storage.h:50
abstract base class for parallel interaction storage array
Definition: pi_storage.h:44
virtual void calcHeatTrans()
Definition: pi_storage.h:60
bool hasNext()
Definition: pi_storage.hpp:50
abstract base class for communicator
Definition: comm.h:46
vector< pair< Raw2Data, P > > forAllInnerInteractionsGetRaw2(P(I::*rdf)() const)
virtual void saveCheckPointData(std::ostream &)
Definition: pi_storage.h:66
virtual bool isIn(const vector< int > &)=0
virtual void loadCheckPointData(std::istream &)
Definition: pi_storage.h:71
Definition: quintuple.h:24
abstract base class for parallel particle storage array
Definition: pp_array.h:41
Definition: CheckPointable.h:26
virtual void saveSnapShotData(std::ostream &)
Definition: pi_storage.h:76
esys::lsm::quintuple< Vec3, double, Vec3, double, Vec3 > Raw2Data
Definition: pi_storage.h:128
Interaction & next()
Definition: pi_storage.hpp:57
Abstract base class for slave part of field.
Definition: FieldSlave.h:22
void forAllInnerInteractionsGet(P &, typename P::value_type(I::*rdf)() const)
access functions with tags
Definition: pi_storage.hpp:209
virtual AFieldSlave * generateNewScalarFieldSlave(TML_Comm *, const string &, int, int, int, int)=0
virtual AFieldSlave * generateNewScalarFieldSlave(TML_Comm *, const string &, int, int, int, int)
Definition: pi_storage.hpp:281
virtual bool willSave()
Definition: pi_storage.h:81
virtual ~TParallelInteractionStorage()
Definition: pi_storage.h:100
AParallelParticleArray * m_ppa
Definition: pi_storage.h:122
Iterator m_end
Definition: pi_storage.h:121
virtual void exchange()=0