SPHinXsys  alpha version
particle_dynamics_algorithms.h
Go to the documentation of this file.
1 /* -------------------------------------------------------------------------*
2  * SPHinXsys *
3  * --------------------------------------------------------------------------*
4  * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle *
5  * Hydrodynamics for industrial compleX systems. It provides C++ APIs for *
6  * physical accurate simulation and aims to model coupled industrial dynamic *
7  * systems including fluid, solid, multi-body dynamics and beyond with SPH *
8  * (smoothed particle hydrodynamics), a meshless computational method using *
9  * particle discretization. *
10  * *
11  * SPHinXsys is partially funded by German Research Foundation *
12  * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1 *
13  * and HU1527/12-1. *
14  * *
15  * Portions copyright (c) 2017-2020 Technical University of Munich and *
16  * the authors' affiliations. *
17  * *
18  * Licensed under the Apache License, Version 2.0 (the "License"); you may *
19  * not use this file except in compliance with the License. You may obtain a *
20  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
21  * *
22  * --------------------------------------------------------------------------*/
36 #ifndef PARTICLE_DYNAMICS_ALGORITHMS_H
37 #define PARTICLE_DYNAMICS_ALGORITHMS_H
38 
39 #include "base_particle_dynamics.h"
41 
42 namespace SPH
43 {
49  {
50  public:
51  explicit ParticleDynamicsSimple(SPHBody &sph_body)
52  : ParticleDynamics<void>(sph_body),
53  functor_update_(std::bind(&ParticleDynamicsSimple::Update, this, _1, _2)){};
54  virtual ~ParticleDynamicsSimple(){};
55 
56  virtual void exec(Real dt = 0.0) override;
57  virtual void parallel_exec(Real dt = 0.0) override;
58 
59  protected:
60  virtual void Update(size_t index_i, Real dt = 0.0) = 0;
61  ParticleFunctor functor_update_;
62  };
63 
68  template <class ReturnType, typename ReduceOperation>
69  class ParticleDynamicsReduce : public ParticleDynamics<ReturnType>
70  {
71  public:
72  explicit ParticleDynamicsReduce(SPHBody &sph_body)
73  : ParticleDynamics<ReturnType>(sph_body), quantity_name_("ReducedQuantity"), initial_reference_(),
74  functor_reduce_function_(std::bind(&ParticleDynamicsReduce::ReduceFunction, this, _1, _2)){};
75  virtual ~ParticleDynamicsReduce(){};
76 
77  ReturnType InitialReference() { return initial_reference_; };
78  std::string QuantityName() { return quantity_name_; };
79 
80  virtual ReturnType exec(Real dt = 0.0) override
81  {
82  size_t total_real_particles = this->base_particles_->total_real_particles_;
83  this->setBodyUpdated();
84  SetupReduce();
85  ReturnType temp = ReduceIterator(total_real_particles,
86  initial_reference_, functor_reduce_function_, reduce_operation_, dt);
87  return OutputResult(temp);
88  };
89  virtual ReturnType parallel_exec(Real dt = 0.0) override
90  {
91  size_t total_real_particles = this->base_particles_->total_real_particles_;
92  this->setBodyUpdated();
93  SetupReduce();
94  ReturnType temp = ReduceIterator_parallel(total_real_particles,
95  initial_reference_, functor_reduce_function_, reduce_operation_, dt);
96  return this->OutputResult(temp);
97  };
98 
99  protected:
100  ReduceOperation reduce_operation_;
101  std::string quantity_name_;
102 
104  ReturnType initial_reference_;
105  virtual void SetupReduce(){};
106  virtual ReturnType ReduceFunction(size_t index_i, Real dt = 0.0) = 0;
107  virtual ReturnType OutputResult(ReturnType reduced_value) { return reduced_value; };
108  ReduceFunctor<ReturnType> functor_reduce_function_;
109  };
110 
116  {
117  public:
118  explicit InteractionDynamics(SPHBody &sph_body)
119  : ParticleDynamics<void>(sph_body),
120  functor_interaction_(std::bind(&InteractionDynamics::Interaction,
121  this, _1, _2)){};
122  virtual ~InteractionDynamics(){};
123 
125  StdVec<ParticleDynamics<void> *> pre_processes_;
127  StdVec<ParticleDynamics<void> *> post_processes_;
128 
129  virtual void exec(Real dt = 0.0) override;
130  virtual void parallel_exec(Real dt = 0.0) override;
131 
132  protected:
133  friend class CombinedInteractionDynamics;
134  virtual void Interaction(size_t index_i, Real dt = 0.0) = 0;
135  ParticleFunctor functor_interaction_;
136  };
137 
145  {
146  public:
147  explicit CombinedInteractionDynamics(InteractionDynamics &dynamics_a, InteractionDynamics &dynamics_b);
148  virtual ~CombinedInteractionDynamics(){};
149 
150  protected:
151  InteractionDynamics &dynamics_a_, &dynamics_b_;
152  virtual void setupDynamics(Real dt = 0.0) override;
153  virtual void Interaction(size_t index_i, Real dt = 0.0) override;
154  };
155 
161  {
162  public:
163  explicit InteractionDynamicsWithUpdate(SPHBody &sph_body)
164  : InteractionDynamics(sph_body),
165  functor_update_(std::bind(&InteractionDynamicsWithUpdate::Update,
166  this, _1, _2)) {}
167  virtual ~InteractionDynamicsWithUpdate(){};
168 
169  virtual void exec(Real dt = 0.0) override;
170  virtual void parallel_exec(Real dt = 0.0) override;
171 
172  protected:
173  virtual void Update(size_t index_i, Real dt = 0.0) = 0;
174  ParticleFunctor functor_update_;
175  };
176 
182  {
183  public:
184  explicit ParticleDynamics1Level(SPHBody &sph_body)
185  : InteractionDynamicsWithUpdate(sph_body),
186  functor_initialization_(std::bind(&ParticleDynamics1Level::Initialization,
187  this, _1, _2)) {}
188  virtual ~ParticleDynamics1Level(){};
189 
190  virtual void exec(Real dt = 0.0) override;
191  virtual void parallel_exec(Real dt = 0.0) override;
192 
193  protected:
194  virtual void Initialization(size_t index_i, Real dt = 0.0) = 0;
195  ParticleFunctor functor_initialization_;
196  };
197 
203  {
204  public:
205  explicit InteractionDynamicsSplitting(SPHBody &sph_body);
206  virtual ~InteractionDynamicsSplitting(){};
207 
208  virtual void exec(Real dt = 0.0) override;
209  virtual void parallel_exec(Real dt = 0.0) override;
210 
211  protected:
212  RealBody &real_body_;
213  SplitCellLists &split_cell_lists_;
214  };
215 
216  //----------------------------------------------------------------------
217  // New version particle dynamics base classes.
218  // Aiming to use template on local dynamics so that
219  // it can be used in different dynamics.
220  //----------------------------------------------------------------------
221 
223  {
224  public:
225  explicit BodyParticleDynamics(SPHBody &sph_body)
226  : ParticleDynamics<void>(sph_body){};
227 
228  virtual ~BodyParticleDynamics(){};
229 
230  virtual void exec(Real dt = 0.0) override
231  {
232  size_t total_real_particles = base_particles_->total_real_particles_;
233  ParticleIterator(total_real_particles, particle_functor_, dt);
234  };
235 
236  virtual void parallel_exec(Real dt = 0.0) override
237  {
238  size_t total_real_particles = base_particles_->total_real_particles_;
239  ParticleIterator_parallel(total_real_particles, particle_functor_, dt);
240  };
241 
242  protected:
243  ParticleFunctor particle_functor_;
244  };
245 
246  template <class BodyDynamicsType, class LocalDynamicsSimple>
248  {
249  LocalDynamicsSimple local_dynamics_;
250 
251  public:
252  template <typename... ConstructorArgs>
253  SimpleParticleDynamics(SPHBody &sph_body, ConstructorArgs &&...args)
254  : BodyDynamicsType(sph_body),
255  local_dynamics_(sph_body, std::forward<ConstructorArgs>(args)...)
256  {
257  this->particle_functor_ = std::bind(&LocalDynamicsSimple::update, &local_dynamics_, _1, _2);
258  };
259  virtual ~SimpleParticleDynamics(){};
260 
261  LocalDynamicsSimple &LocalDynamics() { return local_dynamics_; };
262 
263  virtual void exec(Real dt = 0.0) override
264  {
265  this->setBodyUpdated();
266  this->setupDynamics(dt); //TODO: this function should be in LocalDynamicsSimple
267  BodyDynamicsType::exec(dt);
268  };
269 
270  virtual void parallel_exec(Real dt = 0.0) override
271  {
272  this->setBodyUpdated();
273  this->setupDynamics(dt); //TODO: this function should be in LocalDynamicsSimple
274  BodyDynamicsType::parallel_exec(dt);
275  };
276  };
277 
278  //temporary usage before full revamping the code.
279  template <class LocalDynamicsType>
281 }
282 #endif // PARTICLE_DYNAMICS_ALGORITHMS_H
StdVec< ConcurrentCellLists > SplitCellLists
Definition: sph_data_containers.h:54
Definition: particle_dynamics_algorithms.h:222
This is the implementation of the template class for 3D build.
Simple particle dynamics without considering particle interaction.
Definition: particle_dynamics_algorithms.h:48
virtual void exec(Real dt=0.0) override
Definition: particle_dynamics_algorithms.cpp:15
virtual void exec(Real dt=0.0) override
Definition: particle_dynamics_algorithms.cpp:152
void ParticleIterator(size_t total_real_particles, const ParticleFunctor &particle_functor, Real dt)
Definition: base_particle_dynamics.cpp:12
This is the class for combining several interactions dynamics, which share the particle loop but are ...
Definition: particle_dynamics_algorithms.h:144
Definition: particle_dynamics_algorithms.h:247
virtual void exec(Real dt=0.0) override
Definition: particle_dynamics_algorithms.h:230
ReturnType ReduceIterator(size_t total_real_particles, ReturnType temp, ReduceFunctor< ReturnType > &reduce_functor, ReduceOperation &reduce_operation, Real dt=0.0)
Definition: base_particle_dynamics.hpp:43
Base abstract class for reduce.
Definition: particle_dynamics_algorithms.h:69
StdVec< ParticleDynamics< void > * > pre_processes_
Definition: particle_dynamics_algorithms.h:122
virtual void exec(Real dt=0.0) override
Definition: particle_dynamics_algorithms.cpp:90
void ParticleIterator_parallel(size_t total_real_particles, const ParticleFunctor &particle_functor, Real dt)
Definition: base_particle_dynamics.cpp:18
virtual void exec(Real dt=0.0) override
Definition: particle_dynamics_algorithms.cpp:116
This is for the splitting algorithm.
Definition: particle_dynamics_algorithms.h:202
ReturnType initial_reference_
Definition: particle_dynamics_algorithms.h:104
This is for the base classes of particle dynamics, which describe the interaction between particles...
virtual ReturnType exec(Real dt=0.0) override
Definition: particle_dynamics_algorithms.h:80
This class includes an initialization, an interaction and a update steps.
Definition: particle_dynamics_algorithms.h:181
This is the class for particle interaction with other particles.
Definition: particle_dynamics_algorithms.h:115
SPHBody is a base body with basic data and functions. Its derived class can be a real fluid body...
Definition: base_body.h:61
This class includes an interaction and a update steps.
Definition: particle_dynamics_algorithms.h:160
std::function< void(size_t, Real)> ParticleFunctor
Definition: base_particle_dynamics.h:49
ReturnType ReduceIterator_parallel(size_t total_real_particles, ReturnType temp, ReduceFunctor< ReturnType > &reduce_functor, ReduceOperation &reduce_operation, Real dt=0.0)
Definition: base_particle_dynamics.hpp:54
Derived body with inner particle configuration or inner interactions. After construction, the particle and material must be specified.
Definition: base_body.h:182
StdVec< ParticleDynamics< void > * > post_processes_
Definition: particle_dynamics_algorithms.h:127
Definition: solid_body_supplementary.cpp:9
virtual void exec(Real dt=0.0) override
Definition: particle_dynamics_algorithms.cpp:31
virtual void setupDynamics(Real dt=0.0) override
Definition: particle_dynamics_algorithms.cpp:78
The base class for all particle dynamics This class contains the only two interface functions availab...
Definition: base_particle_dynamics.h:145