TimeDependentPeriodicBoundary.h
Go to the documentation of this file.
1 // This file is part of the MercuryDPM project (https://www.mercurydpm.org).
2 // Copyright (c), The MercuryDPM Developers Team. All rights reserved.
3 // License: BSD 3-Clause License; see the LICENSE file in the root directory.
4 
5 #ifndef TimeDependentPeriodicBoundary_H
6 #define TimeDependentPeriodicBoundary_H
7 
8 #include "BasePeriodicBoundary.h"
9 #include "ParticleHandler.h"
10 #include "Math/Vector.h"
11 #include "MpiDataClass.h"
12 #include <functional>
13 
33 {
34 public:
35 
40 
45 
49  TimeDependentPeriodicBoundary* copy() const override;
50 
55 
71  void set(Vec3D normal, Mdouble distanceLeft, Mdouble distanceRight,
72  std::function<Vec3D(Mdouble)> planewiseShift, std::function<Vec3D(Mdouble)> boost);
73 
78  void set(Vec3D normal, Vec3D positionLeft, Vec3D positionRight,
79  std::function<Vec3D(Mdouble)> shift, std::function<Vec3D(Mdouble)> boost);
80 
87  std::function<Vec3D(Mdouble)> shift, std::function<Vec3D(Mdouble)> boost);
88 
92  void setMaxShift(Mdouble maxShift);
93 
97  Vec3D getNormal() const;
98 
102  Mdouble getDistanceLeft() const;
103 
107  Mdouble getDistanceRight() const;
108 
112  Vec3D getShift(Mdouble time) const;
113 
117  Vec3D getPlanewiseShift(Mdouble time) const;
118 
122  Vec3D getBoost(Mdouble time) const;
123 
127  void moveLeft(Mdouble distanceLeft);
128 
132  void moveRight(Mdouble distanceRight);
133 
137  Mdouble getDistance(const BaseParticle& p) const override;
138 
142  Mdouble getDistance(const Vec3D &position) const override;
143 
150  virtual void shiftPosition(BaseParticle* p) const override;
151 
152  virtual void shiftAndBoostParticle(BaseParticle* p, Mdouble time) const;
153 
157  virtual void shiftPositions(Vec3D &position1, Vec3D &position2) const;
158 
163  virtual bool isClosestToLeftBoundary(const BaseParticle& p) const;
164 
169  virtual bool isClosestToLeftBoundary(const Vec3D& p) const override;
170 
175  virtual void createPeriodicParticles(ParticleHandler &pH) override;
176 
182  void createGhostParticle(BaseParticle *pReal);
183 
188 
193  virtual void checkBoundaryAfterParticlesMove(ParticleHandler& pH) override;
194 
198  virtual void read(std::istream& is) override;
199 
203  virtual void write(std::ostream& os) const override;
204 
208  virtual std::string getName() const override;
209 
210 protected:
215 
220 
225 
230  std::function<Vec3D (Mdouble)> planewiseShift_;
231 
235  std::function<Vec3D (Mdouble)> boost_;
236 
241 
242 };
243 #endif
float * p
Definition: Tutorial_Map_using.cpp:9
Definition: BaseParticle.h:33
Definition: BasePeriodicBoundary.h:20
Container to store pointers to all particles.
Definition: ParticleHandler.h:28
Class which creates a boundary with Lees-Edwards type periodic boundary conditions.
Definition: TimeDependentPeriodicBoundary.h:33
void moveLeft(Mdouble distanceLeft)
Sets the distance from the origin of the 'left' periodic wall.
Definition: TimeDependentPeriodicBoundary.cc:151
virtual void write(std::ostream &os) const override
writes boundary properties to ostream
Definition: TimeDependentPeriodicBoundary.cc:337
void setMaxShift(Mdouble maxShift)
Set the maximum shift (will take fmod w.r.t. this)
Definition: TimeDependentPeriodicBoundary.cc:89
TimeDependentPeriodicBoundary()
default constructor
Definition: TimeDependentPeriodicBoundary.cc:16
~TimeDependentPeriodicBoundary()
destructor
Definition: TimeDependentPeriodicBoundary.cc:37
void moveRight(Mdouble distanceRight)
Sets the distance from the origin of the 'right' periodic wall.
Definition: TimeDependentPeriodicBoundary.cc:162
virtual void shiftPosition(BaseParticle *p) const override
shifts and boosts the particle
Definition: TimeDependentPeriodicBoundary.cc:188
Mdouble distanceRight_
position of right edge, s.t. normal*x = distanceRight_
Definition: TimeDependentPeriodicBoundary.h:224
virtual void createPeriodicParticles(ParticleHandler &pH) override
Checks distance of particle to closer edge and creates a periodic copy if necessary.
Definition: TimeDependentPeriodicBoundary.cc:243
void createGhostParticle(BaseParticle *pReal)
Creates and adds a ghost particle from a given real particle.
Definition: TimeDependentPeriodicBoundary.cc:260
Vec3D getBoost(Mdouble time) const
Returns the planewise boost as a function of time.
Definition: TimeDependentPeriodicBoundary.cc:139
void setPlanewiseShiftAndBoost(std::function< Vec3D(Mdouble)> shift, std::function< Vec3D(Mdouble)> boost)
Set the planewise shift and boost (projected onto the planewise direction) as functions of time....
Definition: TimeDependentPeriodicBoundary.cc:82
virtual void checkBoundaryAfterParticlesMove(ParticleHandler &pH) override
Loops over particles, checks if each particle has crossed either boundary edge, and applies a shift i...
Definition: TimeDependentPeriodicBoundary.cc:299
Vec3D normal_
outward unit normal vector for right edge
Definition: TimeDependentPeriodicBoundary.h:214
Mdouble getDistanceRight() const
Returns the distance of the right wall to the origin, in normal direction.
Definition: TimeDependentPeriodicBoundary.cc:113
Mdouble distanceLeft_
position of left edge, s.t. normal*x = distanceLeft_
Definition: TimeDependentPeriodicBoundary.h:219
Mdouble getDistanceLeft() const
Returns the distance of the left wall to the origin, in normal direction.
Definition: TimeDependentPeriodicBoundary.cc:105
virtual bool isClosestToLeftBoundary(const BaseParticle &p) const
Returns true if particle checked is closer to the 'left' edge, and false if it is closer to the 'righ...
Definition: TimeDependentPeriodicBoundary.cc:226
void set(Vec3D normal, Mdouble distanceLeft, Mdouble distanceRight, std::function< Vec3D(Mdouble)> planewiseShift, std::function< Vec3D(Mdouble)> boost)
Defines a TimeDependentPeriodicBoundary by its normal and positions, and by the shifting and boosting...
Definition: TimeDependentPeriodicBoundary.cc:64
std::function< Vec3D(Mdouble)> planewiseShift_
shift from left to right boundary in the planewise direction (Note: total shift = planewiseShift_(tim...
Definition: TimeDependentPeriodicBoundary.h:230
virtual void read(std::istream &is) override
reads boundary properties from istream
Definition: TimeDependentPeriodicBoundary.cc:321
Vec3D getPlanewiseShift(Mdouble time) const
Returns the planewise shift as a function of time.
Definition: TimeDependentPeriodicBoundary.cc:123
TimeDependentPeriodicBoundary * copy() const override
copy method
Definition: TimeDependentPeriodicBoundary.cc:45
virtual std::string getName() const override
Returns the name of the object.
Definition: TimeDependentPeriodicBoundary.cc:352
std::function< Vec3D(Mdouble)> boost_
boost from the left to right boundary
Definition: TimeDependentPeriodicBoundary.h:235
void createPeriodicParticle(BaseParticle *p, ParticleHandler &pH) override
Creates a single periodic particle if required from a given particle.
Definition: TimeDependentPeriodicBoundary.cc:282
Mdouble maxShift_
Maximum shifting (will take fmod(shift, maxshift) )
Definition: TimeDependentPeriodicBoundary.h:240
virtual void shiftAndBoostParticle(BaseParticle *p, Mdouble time) const
Definition: TimeDependentPeriodicBoundary.cc:192
virtual void shiftPositions(Vec3D &position1, Vec3D &position2) const
shifts two positions (JMFT: Why, what is this for?)
Definition: TimeDependentPeriodicBoundary.cc:206
Vec3D getNormal() const
returns the vector normal to the periodic boundary
Definition: TimeDependentPeriodicBoundary.cc:97
Mdouble getDistance(const BaseParticle &p) const override
Returns the distance of the edge to the particle.
Definition: TimeDependentPeriodicBoundary.cc:167
Vec3D getShift(Mdouble time) const
Returns the vector going from the left to the right side of the periodic boundary.
Definition: TimeDependentPeriodicBoundary.cc:118
Definition: Kernel/Math/Vector.h:30
void normal(const Vector< double > &x, Vector< double > &normal)
Definition: free_surface_rotation.cc:65
Definition: boostmultiprec.cpp:107
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286