Molecular Dynamics  v0.4
Project for the Practical hosted by the Scientific Computing Chair
Particle.h
Go to the documentation of this file.
1 /*
2  * Particle.h
3  *
4  * Created on: 23.02.2010
5  * Author: eckhardw
6  */
7 
8 #pragma once
9 
10 #include <array>
11 #include <string>
12 #include <algorithm>
13 #include "spdlog/spdlog.h"
14 #include "utils/ArrayUtils.h"
15 
16 class Particle {
17 
18 private:
22  static int nextId;
23 
27  std::array<double, 3> x{};
28 
32  std::array<double, 3> v{};
33 
37  std::array<double, 3> f{};
38 
42  std::array<double, 3> old_f{};
43 
47  double m{};
48 
53  int type;
54 
58  double epsilon;
59 
64  double sigma;
65 
70  bool marked;
71 
75  int id;
76 
80  std::vector<int> directNeighbors;
81 
85  std::vector<int> diagonalNeighbors;
86 
90  bool fixed;
91 
95  std::vector<bool> forceMarker;
96 
100  std::vector<std::array<double,3>> forceAccumulator;
101 
102 
103 public:
104 
105  explicit Particle(int type = 0);
106 
107  Particle(const Particle &other);
108 
109  Particle(
110  // for visualization, we need always 3 coordinates
111  // -> in case of 2d, we use only the first and the second
112  std::array<double, 3> x_arg, std::array<double, 3> v_arg, double m_arg, int type = 0, double epsilon_arg = 5, double sigma_arg = 1);
113 
117  void resetForce();
118 
124  double calculateEKin() const;
125 
133  double calculateEKinFlow(std::array<double, 3>& avgVelocity) const;
134 
140  void addDirectNeighbor(int idToAdd);
141 
147  void addDiagonalNeighbor(int idToAdd);
148 
155  bool isDirectNeighbor(Particle& neighbor);
156 
163  bool isDiagonalNeighbor(Particle& neighbor);
164 
165  virtual ~Particle();
166 
167  //Only needed for parallelization strategy "Reduction"
168 
169 #ifdef _OPENMP
174  void initializeForceAccumulator(int numberThreads);
175 
182  void addForceToAccumulator(std::array<double, 3>& force, int threadId);
183 
190  void subForceFromAccumulator(std::array<double, 3>& force, int threadId);
191 
195  void reduceForce();
196 #endif
197 
198  //Getter and setter
199 
200  [[nodiscard]] const std::array<double, 3> &getX() const;
201 
202  [[nodiscard]] const std::array<double, 3> &getV() const;
203 
204  [[nodiscard]] const std::array<double, 3> &getF() const;
205 
206  [[nodiscard]] const std::array<double, 3> &getOldF() const;
207 
208  [[nodiscard]] double getM() const;
209 
210  [[nodiscard]] int getType() const;
211 
212  [[nodiscard]] double getEpsilon() const;
213 
214  [[nodiscard]] double getSigma() const;
215 
216  [[nodiscard]] int getId() const;
217 
218  [[nodiscard]] bool isMarked()const;
219 
220  [[nodiscard]] std::vector<int> & getDirectNeighbors();
221 
222  [[nodiscard]] std::vector<int> & getDiagonalNeighbors();
223 
224  [[nodiscard]] bool isFixed() const;
225 
226  void setOldF(const std::array<double, 3> &oldF);
227 
228  void setF(const std::array<double, 3> &f);
229 
230  void setX(const std::array<double, 3> &x);
231 
232  void setV(const std::array<double, 3> &v);
233 
234  void setType(int type);
235 
236  void setMarked(bool status);
237 
238  void setFixed(bool status);
239 
240  bool operator==(Particle &other) const;
241 
242  [[nodiscard]] std::string toString() const;
243 
247  static void resetID();
248 };
249 
250 std::ostream &operator<<(std::ostream &stream, Particle &p);
std::ostream & operator<<(std::ostream &stream, Particle &p)
Definition: Particle.cpp:199
Definition: Particle.h:16
void setF(const std::array< double, 3 > &f)
Definition: Particle.cpp:158
std::array< double, 3 > x
Definition: Particle.h:27
std::vector< std::array< double, 3 > > forceAccumulator
Definition: Particle.h:100
bool isFixed() const
Definition: Particle.cpp:150
double epsilon
Definition: Particle.h:58
std::array< double, 3 > v
Definition: Particle.h:32
std::vector< int > diagonalNeighbors
Definition: Particle.h:85
bool isDirectNeighbor(Particle &neighbor)
Check, if particle neighbor is a direct neighbor of this particle.
Definition: Particle.cpp:67
double getSigma() const
Definition: Particle.cpp:130
bool isMarked() const
Definition: Particle.cpp:138
const std::array< double, 3 > & getOldF() const
Definition: Particle.cpp:120
bool fixed
Definition: Particle.h:90
int type
Definition: Particle.h:53
void addDirectNeighbor(int idToAdd)
Definition: Particle.cpp:59
std::vector< bool > forceMarker
Definition: Particle.h:95
std::string toString() const
Definition: Particle.cpp:182
int getId() const
Definition: Particle.cpp:134
std::vector< int > directNeighbors
Definition: Particle.h:80
int id
Definition: Particle.h:75
std::vector< int > & getDiagonalNeighbors()
Definition: Particle.cpp:146
std::vector< int > & getDirectNeighbors()
Definition: Particle.cpp:142
void setMarked(bool status)
Definition: Particle.cpp:174
bool operator==(Particle &other) const
Definition: Particle.cpp:193
const std::array< double, 3 > & getF() const
Definition: Particle.cpp:118
std::array< double, 3 > f
Definition: Particle.h:37
double calculateEKinFlow(std::array< double, 3 > &avgVelocity) const
Calculate the current kinetic energy of the particle within a flow simulation.
Definition: Particle.cpp:54
int getType() const
Definition: Particle.cpp:124
Particle(int type=0)
Definition: Particle.cpp:14
static int nextId
Definition: Particle.h:22
static void resetID()
Reset Id for testing purposes.
Definition: Particle.cpp:189
std::array< double, 3 > old_f
Definition: Particle.h:42
void resetForce()
Set force to oldForce and set force to 0.
Definition: Particle.cpp:45
void setOldF(const std::array< double, 3 > &oldF)
Definition: Particle.cpp:154
double getM() const
Definition: Particle.cpp:122
double sigma
Definition: Particle.h:64
double calculateEKin() const
Calculate the current kinetic energy of the particle.
Definition: Particle.cpp:50
void setX(const std::array< double, 3 > &x)
Definition: Particle.cpp:162
void setV(const std::array< double, 3 > &v)
Definition: Particle.cpp:166
double getEpsilon() const
Definition: Particle.cpp:126
virtual ~Particle()
Definition: Particle.cpp:82
bool isDiagonalNeighbor(Particle &neighbor)
Check, if particle neighbor is a diagonal neighbor of this particle.
Definition: Particle.cpp:74
void setFixed(bool status)
Definition: Particle.cpp:178
const std::array< double, 3 > & getX() const
Definition: Particle.cpp:114
void setType(int type)
Definition: Particle.cpp:170
bool marked
Definition: Particle.h:70
void addDiagonalNeighbor(int idToAdd)
Definition: Particle.cpp:63
double m
Definition: Particle.h:47
const std::array< double, 3 > & getV() const
Definition: Particle.cpp:116
Enumeration class corresponding to the force schema type.
Definition: ConfigurationFile.h:6026
Enumeration class corresponding to the type schema type.
Definition: vtk-unstructured.h:2287
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
Definition: vtk-unstructured.h:270