SPHinXsys  alpha version
base_particles.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  * --------------------------------------------------------------------------*/
31 #ifndef BASE_PARTICLES_H
32 #define BASE_PARTICLES_H
33 
34 #include "base_data_package.h"
35 #include "sph_data_containers.h"
36 #include "base_material.h"
37 #include "xml_engine.h"
38 
39 #include <fstream>
40 
41 namespace SPH
42 {
43 
44  class SPHBody;
45  class BaseMaterial;
46  class ParticleGenerator;
47  class BodySurface;
48  template <class ReturnType>
49  class ParticleDynamics;
50 
82  {
83  private:
84  UniquePtrKeepers<ParticleDynamics<void>> derived_particle_data_;
85 
86  public:
87  explicit BaseParticles(SPHBody &sph_body, BaseMaterial *base_material);
88  virtual ~BaseParticles(){};
89 
98  //----------------------------------------------------------------------
99  // Global information for all particles
100  //----------------------------------------------------------------------
101  Real rho0_;
102  Real sigma0_;
103  Real speed_max_;
105  //----------------------------------------------------------------------
106  // Global information for defining particle groups
107  //----------------------------------------------------------------------
108  size_t total_real_particles_;
110  size_t total_ghost_particles_;
111  //----------------------------------------------------------------------
112  // Generalized particle data for parameterized management
113  //----------------------------------------------------------------------
114  ParticleData all_particle_data_;
115  ParticleDataMap all_variable_maps_;
116  StdVec<ParticleDynamics<void> *> derived_variables_;
117  ParticleVariableList variables_to_write_;
118 
120  template <typename VariableType>
121  void registerVariable(StdLargeVec<VariableType> &variable_addrs,
122  const std::string &variable_name, VariableType initial_value = VariableType(0));
123 
125  template <typename VariableType, class InitializationFunction>
126  void registerVariable(StdLargeVec<VariableType> &variable_addrs, const std::string &variable_name,
127  const InitializationFunction &initialization);
128 
130  template <typename VariableType>
131  StdLargeVec<VariableType> *getVariableByName(const std::string &variable_name);
132 
134  template <typename VariableType>
135  void addVariableNameToList(ParticleVariableList &variable_name_list, const std::string &variable_name);
136 
138  template <typename VariableType>
139  void addVariableToWrite(const std::string &variable_name);
140 
142  template <class DerivedVariableMethod>
144 
146  template <typename VariableType>
147  void addVariableToRestart(const std::string &variable_name);
148 
150  template <typename VariableType>
151  void addVariableToReload(const std::string &variable_name);
152 
153  //----------------------------------------------------------------------
154  // Particle data for sorting
155  //----------------------------------------------------------------------
156  StdLargeVec<size_t> unsorted_id_;
157  StdLargeVec<size_t> sorted_id_;
158  StdLargeVec<size_t> sequence_;
159  ParticleData sortable_data_;
160  ParticleDataMap sortable_variable_maps_;
161 
163  template <typename VariableType>
164  void registerSortableVariable(const std::string &variable_name);
165 
166  SPHBody *getSPHBody() { return sph_body_; };
168  virtual void initializeOtherVariables();
169  void addBufferParticles(size_t buffer_size);
170  void copyFromAnotherParticle(size_t this_index, size_t another_index);
171  void updateFromAnotherParticle(size_t this_index, size_t another_index);
172  size_t insertAGhostParticle(size_t index_i);
173  void switchToBufferParticle(size_t index_i);
174 
176  template <typename OutStreamType>
177  void writeParticlesToVtk(OutStreamType &output_stream);
179  void writeParticlesToPltFile(std::ofstream &output_file);
181  virtual void writeSurfaceParticlesToVtuFile(std::ostream &output_file, BodySurface &surface_particles);
182 
183  void resizeXmlDocForParticles(XmlEngine &xml_engine);
184  void writeParticlesToXmlForRestart(std::string &filefullpath);
185  void readParticleFromXmlForRestart(std::string &filefullpath);
186  XmlEngine *getReloadXmlEngine() { return &reload_xml_engine_; };
187  void writeToXmlForReloadParticle(std::string &filefullpath);
188  void readFromXmlForReloadParticle(std::string &filefullpath);
189 
190  virtual BaseParticles *ThisObjectPtr() { return this; };
191 
193  virtual Vecd getKernelGradient(size_t index_i, size_t index_j, Real dW_ij, Vecd &e_ij)
194  {
195  return dW_ij * e_ij;
196  };
197 
198  virtual Vecd ParticleTotalAcceleration(size_t index_i) { return acc_[index_i] + acc_prior_[index_i]; }
199  virtual Real ParticleVolume(size_t index_i) { return Vol_[index_i]; }
200  virtual Real ParticleMass(size_t index_i) { return mass_[index_i]; }
201 
202  protected:
204  std::string body_name_;
205  XmlEngine restart_xml_engine_;
206  XmlEngine reload_xml_engine_;
207  ParticleVariableList variables_to_restart_;
208  ParticleVariableList variables_to_reload_;
209  void addAParticleEntry();
210 
211  virtual void writePltFileHeader(std::ofstream &output_file);
212  virtual void writePltFileParticleData(std::ofstream &output_file, size_t index_i);
213 
215  template <typename VariableType>
217  {
218  void operator()(ParticleData &particle_data, size_t new_size) const;
219  };
220 
222  template <typename VariableType>
224  {
225  void operator()(ParticleData &particle_data) const;
226  };
227 
229  template <typename VariableType>
231  {
232  void operator()(ParticleData &particle_data, size_t this_index, size_t another_index) const;
233  };
234 
235  DataAssembleOperation<resizeParticleData> resize_particle_data_;
236  DataAssembleOperation<addAParticleDataValue> add_a_particle_value_;
237  DataAssembleOperation<copyAParticleDataValue> copy_a_particle_value_;
238  };
239 
241  {
242  XmlEngine &xml_engine_;
243  size_t &total_real_particles_;
244  WriteAParticleVariableToXml(XmlEngine &xml_engine, size_t &total_real_particles)
245  : xml_engine_(xml_engine), total_real_particles_(total_real_particles){};
246 
247  template <typename VariableType>
248  void operator()(std::string &variable_name, StdLargeVec<VariableType> &variable) const;
249  };
250 
252  {
253  XmlEngine &xml_engine_;
254  size_t &total_real_particles_;
255  ReadAParticleVariableFromXml(XmlEngine &xml_engine, size_t &total_real_particles)
256  : xml_engine_(xml_engine), total_real_particles_(total_real_particles){};
257 
258  template <typename VariableType>
259  void operator()(std::string &variable_name, StdLargeVec<VariableType> &variable) const;
260  };
261 
266  template <typename VariableType>
268  {
269  public:
271  std::string variable_name_;
272 
273  BaseDerivedVariable(const SPHBody &sph_body, const std::string &variable_name);
274  virtual ~BaseDerivedVariable(){};
275 
276  protected:
277  StdLargeVec<VariableType> derived_variable_;
278  };
279 }
280 #endif // BASE_PARTICLES_H
Definition: base_particles.h:216
Particles with essential (geometric and kinematic) data. There are three types of particles, all par...
Definition: base_particles.h:81
StdLargeVec< Real > rho_
Definition: base_particles.h:96
A body part with the collection of particles at surface of a body.
Definition: base_body_part.h:138
Definition: base_particles.h:251
std::array< StdVec< std::pair< std::string, size_t > >, 4 > ParticleVariableList
Definition: sph_data_containers.h:63
GeneralDataAssemble< StdLargeVec > ParticleData
Definition: sph_data_containers.h:59
void registerSortableVariable(const std::string &variable_name)
Definition: base_particles.hpp:143
Definition: base_data_package.h:46
virtual void initializeOtherVariables()
Definition: base_particles.cpp:39
Base of all materials.
Definition: base_material.h:52
StdLargeVec< Real > mass_
Definition: base_particles.h:97
void writeParticlesToPltFile(std::ofstream &output_file)
Definition: base_particles.cpp:188
StdLargeVec< Vecd > acc_prior_
Definition: base_particles.h:93
void addVariableToRestart(const std::string &variable_name)
Definition: base_particles.hpp:131
XML class for xml input and output, this is GUI of simbody xml parser.
SPHBody * sph_body_
Definition: base_particles.h:203
StdLargeVec< Vecd > vel_
Definition: base_particles.h:91
void addVariableToReload(const std::string &variable_name)
Definition: base_particles.hpp:137
virtual void writeSurfaceParticlesToVtuFile(std::ostream &output_file, BodySurface &surface_particles)
Definition: base_particles.cpp:207
This is the base classes of all materials. A function in a derived material class returns a value wit...
size_t insertAGhostParticle(size_t index_i)
Definition: base_particles.cpp:100
StdLargeVec< VariableType > * getVariableByName(const std::string &variable_name)
Definition: base_particles.hpp:74
Definition: base_particles.h:223
void addVariableToWrite(const std::string &variable_name)
Definition: base_particles.hpp:116
void registerVariable(StdLargeVec< VariableType > &variable_addrs, const std::string &variable_name, VariableType initial_value=VariableType(0))
Definition: base_particles.hpp:40
void addDerivedVariableToWrite()
Definition: base_particles.hpp:122
StdLargeVec< Real > Vol_
Definition: base_particles.h:95
Real rho0_
Definition: base_particles.h:101
StdLargeVec< Vecd > acc_
Definition: base_particles.h:92
A wrapper to provide an ownership for a vector of base class pointers which point to derived objects...
Definition: ownership.h:127
computing displacement from current and initial particle position
Definition: base_particles.h:267
void addVariableNameToList(ParticleVariableList &variable_name_list, const std::string &variable_name)
Definition: base_particles.hpp:89
Set up of basic data structure.
StdLargeVec< size_t > sequence_
Definition: base_particles.h:158
Real signal_speed_max_
Definition: base_particles.h:104
SPHBody is a base body with basic data and functions. Its derived class can be a real fluid body...
Definition: base_body.h:61
void writeParticlesToVtk(OutStreamType &output_stream)
size_t real_particles_bound_
Definition: base_particles.h:109
std::array< std::map< std::string, size_t >, 4 > ParticleDataMap
Definition: sph_data_containers.h:61
Definition: xml_engine.h:56
Real speed_max_
Definition: base_particles.h:103
Definition: base_particles.h:230
StdLargeVec< size_t > unsorted_id_
Definition: base_particles.h:156
Definition: base_particles.h:240
Real sigma0_
Definition: base_particles.h:102
StdLargeVec< Vecd > pos_
Definition: base_particles.h:88
StdLargeVec< size_t > sorted_id_
Definition: base_particles.h:157
Definition: solid_body_supplementary.cpp:9
virtual Vecd getKernelGradient(size_t index_i, size_t index_j, Real dW_ij, Vecd &e_ij)
Definition: base_particles.h:193