ESyS-Particle  2.3.4
pp_array.h
Go to the documentation of this file.
1 // //
3 // Copyright (c) 2003-2017 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.apache.org/licenses/LICENSE-2.0 //
10 // //
12 
13 #ifndef __PARALLEL_PARTICLE_ARRAY_H
14 #define __PARALLEL_PARTICLE_ARRAY_H
15 
16 //--- MPI ---
17 #include <mpi.h>
18 
19 //--- project includes ---
20 #include "ntable/src/ntable.h"
21 #include "ntable/src/nt_block.h"
22 #include "tml/comm/comm.h"
23 #include "tml/comm/cart_comm.h"
24 #include "Foundation/vec3.h"
25 #include "Geometry/Triangle.h"
26 #include "Geometry/AEdge.h"
27 
28 //--- STL includes ---
29 #include <vector>
30 #include <set>
31 
32 using std::vector;
33 using std::set;
34 
35 //--- IO includes ---
36 
42 {
43  protected:
46 
47  public:
48  AParallelParticleArray(TML_Comm *comm, const std::vector<unsigned int> &dims);
49  AParallelParticleArray(TML_Comm *comm, const std::vector<unsigned int> &dims, const std::vector<bool> &circ);
50  // virtual destructor
52 
53  // get communicator
54  TML_CartComm getComm() const {return m_comm;};
55 
57  int getTimeStamp(){return m_timestamp;};
58 
59  // get ids of boundary particles
60  virtual set<int> getBoundarySlabIds(int,int) const=0;
61  virtual set<int> get2ndSlabIds(int,int) const=0;
62 
63  // check if pos is in inner part
64  virtual bool isInInner(const Vec3&)=0;
65 };
66 
67 
73 template<typename T>
75 {
76  public: // types
81 
82  private:
87  static const int m_exchg_tag;
88 
89  // helper fnc
90  template<typename P> void exchange_single(P (T::*rdf)(),void (T::*wrtf)(const P&),NTSlab<T>,NTSlab<T>,int,int);
91 
92  protected:
93 
94  public:
95  ParallelParticleArray(TML_Comm *comm, const vector<unsigned int> &dims,const Vec3 &min,const Vec3 &max, double rmax,double alpha);
96  ParallelParticleArray(TML_Comm *comm, const vector<unsigned int> &dims, const vector<bool> &circ,const Vec3 &min,const Vec3 &max, double rmax,double alpha);
98 
99  // info func
100  Vec3 getMinPos()const {return m_minpos;};
101  Vec3 getMaxPos()const {return m_maxpos;};
102  vector<int> getCommCoords() const {return m_comm.get_coords();};
103  vector<int> getCommDims() const {return m_comm.get_all_dims();};
104  int size(){return m_nt->size();};
105  int getInnerSize(){return (m_nt->inner()).size();};
106 
107  // particle insert ops
108  void insert(const T&);
109  void insert(const vector<T>&);
110 
111  // check if pos is in inner part
112  virtual bool isInInner(const Vec3&);
113 
114  // particle access (ugly!)
115  T* getParticlePtrByIndex(int);
116  T* getParticlePtrByPosition(const Vec3&);
117 
118  // rebuild
119  void rebuild();
120 
121  //--- collective particle ops ---
122  // variable exchange
123  template<typename P> void exchange(P (T::*rdf)(),void (T::*wrtf)(const P&));
124 
125  // call member func for single particle by id
126  void forParticle(int,void (T::*rdf)());
127  template <typename P> void forParticle(int,void (T::*rdf)(P),const P&);
128 
129  // call member func for single particle by tag
130  void forParticleTag(int,void (T::*rdf)());
131  template <typename P> void forParticleTag(int,void (T::*rdf)(P),const P&);
132  void forParticleTagMask(int,int,void (T::*rdf)());
133  template <typename P> void forParticleTagMask(int,int,void (T::*rdf)(P),const P&);
134 
135  // call member func for all particles, different nr. of params
136  void forAllParticles(void (T::*rdf)());
137  void forAllParticles(void (T::*rdf)()const);
138  template <typename P> void forAllParticles(void (T::*rdf)(P),const P&);
139 
140  // call member func for all inner particles
141  template <typename P> void forAllInnerParticles(void (T::*rdf)(P&),P&);
142 
144  {
145  public:
147  typedef T Particle;
149 
150  ParticleIterator(const NtBlock &ntBlock);
151 
152  bool hasNext() const;
153 
154  Particle &next();
155 
156  int getNumRemaining() const;
157 
158  private:
162  };
163 
165 
166  // particle data access functions
167  template <typename P> void forAllParticlesGet(P&,typename P::value_type (T::*rdf)() const);
168  template <typename P> void forAllInnerParticlesGet(P&,typename P::value_type (T::*rdf)() const);
169  template <typename P> vector<pair<int,P> > forAllParticlesGetIndexed(P (T::*rdf)() const);
170  template <typename P> vector<pair<int,P> > forAllInnerParticlesGetIndexed(P (T::*rdf)() const);
171 
172  // particle data access functions with tag check
173  template <typename P> void forAllTaggedParticlesGet(P&,typename P::value_type (T::*rdf)() const,int,int);
174  template <typename P> void forAllTaggedInnerParticlesGet(P&,typename P::value_type (T::*rdf)() const,int,int);
175  template <typename P> vector<pair<int,P> > forAllTaggedParticlesGetIndexed(P (T::*rdf)() const,int,int);
176  template <typename P> vector<pair<int,P> > forAllInnerTaggedParticlesGetIndexed(P (T::*rdf)() const,int,int);
177 
178  // geometric data access function
179  template <typename P> void forPointsGetNearest(P&,typename P::value_type (T::*rdf)() const,const Vec3&,double,double,double,int,int,int);
180 
181  // get ids of boundary particles
182  virtual set<int> getBoundarySlabIds(int,int) const;
183  virtual set<int> get2ndSlabIds(int,int) const;
184 
185  //--- get neigborlist stuff ---
187  PairListHandle getFullPairList(){return m_nt->getFullList();};
189  PairListHandle getNewPairList(){return m_nt->getNewList();};
191  ParticleListHandle getParticlesAtPlane(Vec3 o,Vec3 n){return m_nt->getParticlesAtPlane(o,n);};
193  ParticleListHandle getParticlesNearSphere(Vec3 c,double r){return m_nt->getParticlesNearSphere(c,r);};
195  ParticleListHandle getParticlesNearTriangle(const Triangle& t){return m_nt->getParticlesNearTriangle(t);};
197  ParticleListHandle getParticlesNearEdge(const AEdge* e){return m_nt->getParticlesNearEdge(e);};
199  ParticleListHandle getParticlesNearPoint(const Vec3& v){return m_nt->getParticlesNearPoint(v);};
201  ParticleListHandle getAllParticles(){return m_nt->getAllParticles();};
202 
204  void getAllInnerParticles(vector<T>&);
205 
206  //--- checkpointing ---
207  void saveCheckPointData(std::ostream&);
208  void loadCheckPointData(std::istream&);
209 
210  //--- output (for debugging)---
211  template <typename TT>
212  friend ostream& operator<<(ostream &, const ParallelParticleArray<TT> &);
213 };
214 
215 #include "ppa/src/pp_array.hpp"
216 
217 #endif //__PARALLEL_PARTICLE_ARRAY_H
AParallelParticleArray::~AParallelParticleArray
virtual ~AParallelParticleArray()
Definition: pp_array.h:51
ParallelParticleArray::m_minpos
Vec3 m_minpos
Definition: pp_array.h:84
ParallelParticleArray::~ParallelParticleArray
~ParallelParticleArray()
Definition: pp_array.hpp:171
ParallelParticleArray::getMinPos
Vec3 getMinPos() const
Definition: pp_array.h:100
AParallelParticleArray::getTimeStamp
int getTimeStamp()
return time stamp of last rebuild
Definition: pp_array.h:57
ParallelParticleArray::PairListIterator
NeighborTable< T >::pairlist::iterator PairListIterator
Definition: pp_array.h:78
NTBlock
representation of a slab of the search array of a NeigborTable
Definition: nt_block.h:33
Triangle
Class representing a Triangle.
Definition: Triangle.h:48
ParallelParticleArray::m_exchg_tag
static const int m_exchg_tag
Definition: pp_array.h:87
ParallelParticleArray::forAllParticles
void forAllParticles(void(T::*rdf)() const)
ParallelParticleArray::ParticleIterator
Definition: pp_array.h:144
ParallelParticleArray::getFullPairList
PairListHandle getFullPairList()
Get list of all pairs. Forwards to NTable::getFullList().
Definition: pp_array.h:187
ParallelParticleArray::m_circ_edge_x_up
bool m_circ_edge_x_up
Definition: pp_array.h:86
ParallelParticleArray::m_yshift
double m_yshift
Definition: pp_array.h:85
ParallelParticleArray::getParticlesNearSphere
ParticleListHandle getParticlesNearSphere(Vec3 c, double r)
Get list of particles near a sphere body. Forwards to NTable::getParticlesNearSphere.
Definition: pp_array.h:193
AParallelParticleArray::m_comm
TML_CartComm m_comm
Definition: pp_array.h:44
ParallelParticleArray::ParticleIterator::m_numRemaining
int m_numRemaining
Definition: pp_array.h:161
ParallelParticleArray::forAllInnerParticles
void forAllInnerParticles(void(T::*rdf)(P &), P &)
Definition: pp_array.hpp:617
ParallelParticleArray::getAllParticles
ParticleListHandle getAllParticles()
Get list of all particles. Forwards to NTable.
Definition: pp_array.h:201
ntable.h
ParallelParticleArray::getCommCoords
vector< int > getCommCoords() const
Definition: pp_array.h:102
ParallelParticleArray::m_zshift
double m_zshift
circular shift values
Definition: pp_array.h:85
ParallelParticleArray::getParticlesNearPoint
ParticleListHandle getParticlesNearPoint(const Vec3 &v)
Get list of particles near a point. Forwards to NTable::getParticlesNearEdge.
Definition: pp_array.h:199
ParallelParticleArray::ParticleIterator::m_ntBlock
NtBlock m_ntBlock
Definition: pp_array.h:159
ParallelParticleArray::getParticlesNearTriangle
ParticleListHandle getParticlesNearTriangle(const Triangle &t)
Get list of particles near a triangle. Forwards to NTable::getParticlesNearTriangle.
Definition: pp_array.h:195
ParallelParticleArray::ParticleIterator::ParticleIterator
ParticleIterator(const NtBlock &ntBlock)
Definition: pp_array.hpp:652
ParallelParticleArray::getParticlePtrByIndex
T * getParticlePtrByIndex(int)
Definition: pp_array.hpp:220
pp_array.h
ParallelParticleArray::getAllInnerParticles
void getAllInnerParticles(vector< T > &)
get all particles in inner block and put them into a vector
Definition: pp_array.hpp:1006
ParallelParticleArray::ParticleIterator::BlockIterator
NtBlock::iterator BlockIterator
Definition: pp_array.h:148
ParallelParticleArray::size
int size()
Definition: pp_array.h:104
pp_array.hpp
ParallelParticleArray::forParticleTagMask
void forParticleTagMask(int, int, void(T::*rdf)())
Definition: pp_array.hpp:532
AParallelParticleArray::isInInner
virtual bool isInInner(const Vec3 &)=0
ParallelParticleArray::forAllTaggedInnerParticlesGet
void forAllTaggedInnerParticlesGet(P &, typename P::value_type(T::*rdf)() const, int, int)
Definition: pp_array.hpp:790
AEdge
abstract base class for edges in mesh (2D or 3D)
Definition: AEdge.h:28
ParallelParticleArray::forAllInnerParticlesGet
void forAllInnerParticlesGet(P &, typename P::value_type(T::*rdf)() const)
Definition: pp_array.hpp:698
ParallelParticleArray::forAllParticlesGet
void forAllParticlesGet(P &, typename P::value_type(T::*rdf)() const)
Definition: pp_array.hpp:642
ParallelParticleArray::ParallelParticleArray
ParallelParticleArray(TML_Comm *comm, const vector< unsigned int > &dims, const Vec3 &min, const Vec3 &max, double rmax, double alpha)
Definition: pp_array.hpp:62
ParallelParticleArray::operator<<
friend ostream & operator<<(ostream &, const ParallelParticleArray< TT > &)
AParallelParticleArray::AParallelParticleArray
AParallelParticleArray(TML_Comm *comm, const std::vector< unsigned int > &dims)
Definition: app_array.cpp:21
ParallelParticleArray::getBoundarySlabIds
virtual set< int > getBoundarySlabIds(int, int) const
Definition: pp_array.hpp:902
ParallelParticleArray::forParticle
void forParticle(int, void(T::*rdf)())
Definition: pp_array.hpp:456
ParallelParticleArray::getNewPairList
PairListHandle getNewPairList()
Get list of new pairs. Forwards to NTable::getNewList().
Definition: pp_array.h:189
ParallelParticleArray::insert
void insert(const T &)
particle insertion
Definition: pp_array.hpp:182
ParallelParticleArray::ParticleListIterator
NeighborTable< T >::particlelist::iterator ParticleListIterator
Definition: pp_array.h:80
ParallelParticleArray::getInnerSize
int getInnerSize()
Definition: pp_array.h:105
ParallelParticleArray::ParticleIterator::next
Particle & next()
Definition: pp_array.hpp:669
ParallelParticleArray
parrallel particle storage array with neighborsearch and variable exchange
Definition: pp_array.h:75
ParallelParticleArray::ParticleIterator::NtBlock
NTBlock< T > NtBlock
Definition: pp_array.h:146
ParallelParticleArray::getParticlePtrByPosition
T * getParticlePtrByPosition(const Vec3 &)
Definition: pp_array.hpp:232
NTSlab
representation of a slab of the search array of a NeigborTable
Definition: nt_slab.h:35
ParallelParticleArray::ParticleIterator::getNumRemaining
int getNumRemaining() const
Definition: pp_array.hpp:678
Triangle.h
NTBlock_iter
iterator for a NTBlock
Definition: ntb_iter.h:39
AParallelParticleArray::getBoundarySlabIds
virtual set< int > getBoundarySlabIds(int, int) const =0
ParallelParticleArray::forPointsGetNearest
void forPointsGetNearest(P &, typename P::value_type(T::*rdf)() const, const Vec3 &, double, double, double, int, int, int)
Definition: pp_array.hpp:875
ParallelParticleArray::PairListHandle
T_Handle< typename NeighborTable< T >::pairlist > PairListHandle
Definition: pp_array.h:77
AParallelParticleArray
abstract base class for parallel particle storage array
Definition: pp_array.h:42
cart_comm.h
ParallelParticleArray::exchange
void exchange(P(T::*rdf)(), void(T::*wrtf)(const P &))
Definition: pp_array.hpp:373
ParallelParticleArray::getParticlesAtPlane
ParticleListHandle getParticlesAtPlane(Vec3 o, Vec3 n)
Get list of particles along a plane. Forwards to NTable::getParticlesAtPlane.
Definition: pp_array.h:191
TML_CartComm
class for a cartesian communicator
Definition: cart_comm.h:34
ParallelParticleArray::rebuild
void rebuild()
Definition: pp_array.hpp:242
ParallelParticleArray::m_maxpos
Vec3 m_maxpos
local minimum and maximum positions
Definition: pp_array.h:84
ParallelParticleArray::ParticleIterator::hasNext
bool hasNext() const
Definition: pp_array.hpp:663
ParallelParticleArray::ParticleListHandle
T_Handle< typename NeighborTable< T >::particlelist > ParticleListHandle
Definition: pp_array.h:79
comm.h
nt_block.h
T_Handle
Template class for a handle/ref. counted pointer.
Definition: handle.h:27
NeighborTable
class for neighbor search
Definition: ntable.h:68
ParallelParticleArray::forAllTaggedParticlesGet
void forAllTaggedParticlesGet(P &, typename P::value_type(T::*rdf)() const, int, int)
Definition: pp_array.hpp:768
ParallelParticleArray::m_xshift
double m_xshift
Definition: pp_array.h:85
ParallelParticleArray::isInInner
virtual bool isInInner(const Vec3 &)
Definition: pp_array.hpp:208
Vec3
Definition: vec3.h:47
ParallelParticleArray::forAllTaggedParticlesGetIndexed
vector< pair< int, P > > forAllTaggedParticlesGetIndexed(P(T::*rdf)() const, int, int)
Definition: pp_array.hpp:813
ParallelParticleArray::forAllParticlesGetIndexed
vector< pair< int, P > > forAllParticlesGetIndexed(P(T::*rdf)() const)
Definition: pp_array.hpp:716
AParallelParticleArray::get2ndSlabIds
virtual set< int > get2ndSlabIds(int, int) const =0
TML_Comm
abstract base class for communicator
Definition: comm.h:47
ParallelParticleArray::loadCheckPointData
void loadCheckPointData(std::istream &)
Definition: pp_array.hpp:1050
vec3.h
ParallelParticleArray::forAllInnerTaggedParticlesGetIndexed
vector< pair< int, P > > forAllInnerTaggedParticlesGetIndexed(P(T::*rdf)() const, int, int)
Definition: pp_array.hpp:841
ParallelParticleArray::getInnerParticleIterator
ParticleIterator getInnerParticleIterator()
Definition: pp_array.hpp:684
ParallelParticleArray::getCommDims
vector< int > getCommDims() const
Definition: pp_array.h:103
AEdge.h
ParallelParticleArray::m_circ_edge_x_down
bool m_circ_edge_x_down
circular edge flags
Definition: pp_array.h:86
ParallelParticleArray::forAllParticles
void forAllParticles(void(T::*rdf)())
Definition: pp_array.hpp:570
ParallelParticleArray::get2ndSlabIds
virtual set< int > get2ndSlabIds(int, int) const
Definition: pp_array.hpp:960
ParallelParticleArray::ParticleIterator::m_it
BlockIterator m_it
Definition: pp_array.h:160
ParallelParticleArray::ParticleIterator::Particle
T Particle
Definition: pp_array.h:147
ParallelParticleArray::getParticlesNearEdge
ParticleListHandle getParticlesNearEdge(const AEdge *e)
Get list of particles near an edge. Forwards to NTable::getParticlesNearEdge.
Definition: pp_array.h:197
ParallelParticleArray::saveCheckPointData
void saveCheckPointData(std::ostream &)
Definition: pp_array.hpp:1023
AParallelParticleArray::getComm
TML_CartComm getComm() const
Definition: pp_array.h:54
ParallelParticleArray::exchange_single
void exchange_single(P(T::*rdf)(), void(T::*wrtf)(const P &), NTSlab< T >, NTSlab< T >, int, int)
Definition: pp_array.hpp:413
ParallelParticleArray::forParticleTag
void forParticleTag(int, void(T::*rdf)())
Definition: pp_array.hpp:491
AParallelParticleArray::m_timestamp
int m_timestamp
Definition: pp_array.h:45
ParallelParticleArray::getMaxPos
Vec3 getMaxPos() const
Definition: pp_array.h:101
ParallelParticleArray::m_nt
NeighborTable< T > * m_nt
Definition: pp_array.h:83
ParallelParticleArray::forAllInnerParticlesGetIndexed
vector< pair< int, P > > forAllInnerParticlesGetIndexed(P(T::*rdf)() const)
Definition: pp_array.hpp:737