PFASST++
particle_cloud.hpp
Go to the documentation of this file.
1 
5 #ifndef _EXAMPLES__BORIS__PARTICLE_CLOUD_HPP_
6 #define _EXAMPLES__BORIS__PARTICLE_CLOUD_HPP_
7 
8 #include <memory>
9 #include <vector>
10 using namespace std;
11 
12 #include <pfasst/logging.hpp>
14 #ifdef WITH_MPI
16 #endif
17 
18 #include "particle.hpp"
19 
20 
21 namespace pfasst
22 {
23  namespace examples
24  {
25  namespace boris
26  {
30  template<typename precision>
31  using ParticleCloudComponent = vector<precision>;
32 
33 
37  template<typename precision>
39  : public encap::Encapsulation<precision>
40  , public el::Loggable
41  {
42  private:
43  size_t _dim;
47  vector<precision> _charges;
48  vector<precision> _masses;
49 
50  precision _default_charge;
51  precision _default_mass;
52 
53 #ifdef WITH_MPI
54  vector<MPI_Request> recv_request;
56  vector<MPI_Request> send_request;
58 
60  inline mpi::MPICommunicator& as_mpi(ICommunicator* comm);
62 #endif
63 
64  public:
65  explicit ParticleCloud(const size_t num_particles = 0,
66  const size_t dim = 3,
67  const precision default_charge = precision(1.0),
68  const precision default_mass = precision(1.0));
69  virtual ~ParticleCloud();
70 
71  virtual void zero() override;
72  virtual void copy(shared_ptr<const encap::Encapsulation<precision>> other);
73 
74  inline size_t size() const;
75  inline size_t dim() const;
77  const ParticleCloudComponent<precision>& positions() const;
79  const ParticleCloudComponent<precision>& velocities() const;
80  vector<precision>& charges();
81  const vector<precision>& charges() const;
82  vector<precision>& masses();
83  const vector<precision>& masses() const;
84 
85  ParticleComponent<precision> center_of_mass() const;
86  // !! EXPENSIVE !!
87  shared_ptr<Particle<precision>> operator[](const size_t index) const;
88  // !! EXPENSIVE !!
89  shared_ptr<Particle<precision>> at(const size_t index) const;
90  void set_at(const size_t index, const shared_ptr<Particle<precision>>& particle);
91 
92  // !! VERY !! EXPENSIVE !! (i.e. never use for production code)
93  vector<shared_ptr<Particle<precision>>> particles() const;
94 
95  void distribute_around_center(const shared_ptr<Particle<precision>>& center);
96 
97  // TODO: unify behaviour with particle_util::norm0 (e.g. norm_max vs. norm0 (==sqrt(^2))
98  virtual precision norm0() const;
99 
100 #ifdef WITH_MPI
101  virtual void post(ICommunicator* comm, int tag) override;
103  virtual void recv(ICommunicator* comm, int tag, bool blocking) override;
104  virtual void send(ICommunicator* comm, int tag, bool blocking) override;
105  virtual void broadcast(ICommunicator* comm) override;
107 #endif
108 
109  virtual void log(el::base::type::ostream_t& os) const;
110  };
111 
112 
116  template<typename precision>
117  static precision distance(const Particle<precision>& first,
118  const Particle<precision>& second);
122  template<typename precision>
123  static precision distance(const shared_ptr<Particle<precision>>& first,
124  const shared_ptr<Particle<precision>>& second);
125 
129  template<typename precision>
130  static vector<precision> distance_to_reference(const ParticleCloud<precision>& cloud,
131  const Particle<precision>& reference);
135  template<typename precision>
136  static vector<precision> distance_to_reference(const shared_ptr<ParticleCloud<precision>>& cloud,
137  const shared_ptr<Particle<precision>>& reference);
138 
139 
143  template<typename precision>
144  inline MAKE_LOGGABLE(shared_ptr<ParticleCloud<precision>>, sp_cloud, os);
148  template<typename precision>
149  inline MAKE_LOGGABLE(shared_ptr<const ParticleCloud<precision>>, sp_cloud, os);
150 
151 
155  template<typename precision>
157  : public encap::EncapFactory<precision>
158  {
159  private:
161  size_t _dim;
162  precision _default_charge;
163  precision _default_mass;
164 
165  public:
166  ParticleCloudFactory(const size_t num_particles, const size_t dim, const precision default_charge,
167  const precision default_mass);
168  inline size_t num_particles() const;
169  inline size_t dim() const;
170  virtual shared_ptr<encap::Encapsulation<precision>> create(const encap::EncapType);
171  };
172  } // ::pfasst::examples::boris
173  } // ::pfasst::examples
174 } // ::pfasst
175 
176 
177 // #include "particle_util.hpp"
178 #include "particle_cloud_impl.hpp"
179 
180 #endif // _EXAMPLES__BORIS__PARTICLE_CLOUD_HPP_
MAKE_LOGGABLE(shared_ptr< ParticleCloud< precision >>, sp_cloud, os)
static void zero(vector< precision > &data)
STL namespace.
static vector< precision > distance_to_reference(const shared_ptr< ParticleCloud< precision >> &cloud, const shared_ptr< Particle< precision >> &reference)
static precision distance(const shared_ptr< Particle< precision >> &first, const shared_ptr< Particle< precision >> &second)
vector< precision > ParticleCloudComponent
vector< precision > ParticleComponent
Definition: particle.hpp:27
Abstract interface of factory for creating Encapsulation objects.
ParticleCloudComponent< precision > _velocities
Data/solution encapsulation.
ParticleCloudComponent< precision > _positions
Abstract interface for communicators.
Definition: interfaces.hpp:70
static precision norm0(const vector< precision > &data)