PeriodicBoundary.h
Go to the documentation of this file.
1 //Copyright (c) 2013-2023, The MercuryDPM Developers Team. All rights reserved.
2 //For the list of developers, see <http://www.MercuryDPM.org/Team>.
3 //
4 //Redistribution and use in source and binary forms, with or without
5 //modification, are permitted provided that the following conditions are met:
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above copyright
9 // notice, this list of conditions and the following disclaimer in the
10 // documentation and/or other materials provided with the distribution.
11 // * Neither the name MercuryDPM nor the
12 // names of its contributors may be used to endorse or promote products
13 // derived from this software without specific prior written permission.
14 //
15 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 //ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 //WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 //DISCLAIMED. IN NO EVENT SHALL THE MERCURYDPM DEVELOPERS TEAM BE LIABLE FOR ANY
19 //DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 //(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 //LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 //ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 //(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 //SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 
26 #ifndef PeriodicBoundary_H
27 #define PeriodicBoundary_H
28 
29 #include "BasePeriodicBoundary.h"
30 #include "ParticleHandler.h"
31 #include "Math/Vector.h"
32 #include "MpiDataClass.h"
33 
41 {
42 public:
43 
48 
52  ~PeriodicBoundary() override;
53 
57  PeriodicBoundary* copy() const override;
58 
62  PeriodicBoundary(const PeriodicBoundary& other);
63 
67  void set(Vec3D normal, Mdouble distanceLeft, Mdouble distanceRight);
68 
73  void set(Vec3D normal, Vec3D positionLeft, Vec3D positionRight);
74 
78  void set(Vec3D normal, Mdouble distanceLeft, Mdouble distanceRight, Vec3D shiftDirection);
79 
84  void setPlanewiseShift(Vec3D planewiseShift);
85 
89  Vec3D getNormal() const;
90 
94  Mdouble getDistanceLeft() const;
95 
99  Mdouble getDistanceRight() const;
100 
104  Vec3D getShift() const;
105 
109  void moveLeft(Mdouble distanceLeft);
110 
114  void moveRight(Mdouble distanceRight);
115 
119  Mdouble getDistance(const BaseParticle& p) const override;
120 
124  Mdouble getDistance(const Vec3D& position) const override;
125 
130  virtual void shiftPosition(BaseParticle* p) const override;
131  void shiftPosition(Vec3D& p) const;
132 
136  virtual void shiftPositions(Vec3D& postition1, Vec3D& postion2) const;
137 
142  virtual bool isClosestToLeftBoundary(const BaseParticle& p) const;
143 
148  bool isClosestToLeftBoundary(const Vec3D& p) const override;
149 
154  virtual void createPeriodicParticles(ParticleHandler &pH) override;
155 
159  void createGhostParticle(BaseParticle *pReal);
160 
164  void createPeriodicParticle(BaseParticle* p, ParticleHandler &pH) override;
165 
170  virtual void checkBoundaryAfterParticlesMove(ParticleHandler& pH) override;
171 
175  virtual void read(std::istream& is) override;
180  void oldRead(std::istream& is);
181 
185  void write(std::ostream& os) const override;
186 
190  std::string getName() const override;
191 
192 
193 protected:
202 
207 
212 
217 
218 };
219 
220 #endif
#define MERCURYDPM_DEPRECATED
Definition: GeneralDefine.h:37
Definition: BaseParticle.h:54
Definition: BasePeriodicBoundary.h:41
Container to store all BaseParticle.
Definition: ParticleHandler.h:48
Defines a pair of periodic walls. Inherits from BaseBoundary.
Definition: PeriodicBoundary.h:41
Vec3D normal_
outward unit normal vector for right edge
Definition: PeriodicBoundary.h:197
void moveLeft(Mdouble distanceLeft)
Sets the distance from the origin of the 'left' periodic wall.
Definition: PeriodicBoundary.cc:170
PeriodicBoundary * copy() const override
copy method
Definition: PeriodicBoundary.cc:58
Vec3D getShift() const
Returns the vector going from the left to the right side of the periodic boundary.
Definition: PeriodicBoundary.cc:159
void createGhostParticle(BaseParticle *pReal)
Creates and adds a ghost particle from a given real particle.
Definition: PeriodicBoundary.cc:314
Mdouble scaleFactor_
This is the normal to rescale the normal vector to a unit vectors.
Definition: PeriodicBoundary.h:211
Mdouble getDistanceRight() const
Returns the distance of the right wall to the origin, in normal direction.
Definition: PeriodicBoundary.cc:151
Mdouble getDistance(const BaseParticle &p) const override
Returns the distance of the edge to the particle.
Definition: PeriodicBoundary.cc:197
virtual void shiftPosition(BaseParticle *p) const override
shifts the particle
Definition: PeriodicBoundary.cc:219
Mdouble getDistanceLeft() const
Returns the distance of the left wall to the origin, in normal direction.
Definition: PeriodicBoundary.cc:143
Mdouble distanceLeft_
position of left edge, s.t. normal*x = distanceLeft_
Definition: PeriodicBoundary.h:201
virtual void createPeriodicParticles(ParticleHandler &pH) override
Checks distance of particle to closer edge and creates a periodic copy if necessary.
Definition: PeriodicBoundary.cc:349
Vec3D shift_
shift from left to right boundary
Definition: PeriodicBoundary.h:216
virtual bool isClosestToLeftBoundary(const BaseParticle &p) const
Returns TRUE if particle checked is closest to the 'left' edge, and FALSE if it is closest to the 'ri...
Definition: PeriodicBoundary.cc:275
void setPlanewiseShift(Vec3D planewiseShift)
Set the planewise shift (projected onto the planewise direction, and zero by default).
Definition: PeriodicBoundary.cc:126
virtual void checkBoundaryAfterParticlesMove(ParticleHandler &pH) override
Loops over particles, checks if each particle has crossed either boundary edge, and applies a shift i...
Definition: PeriodicBoundary.cc:374
Vec3D getNormal() const
returns the vector normal to the periodic boundary
Definition: PeriodicBoundary.cc:135
MERCURYDPM_DEPRECATED void oldRead(std::istream &is)
deprecated version of CubeInsertionBoundary::read().
Definition: PeriodicBoundary.cc:412
virtual void read(std::istream &is) override
reads boundary properties from istream
Definition: PeriodicBoundary.cc:397
virtual void shiftPositions(Vec3D &postition1, Vec3D &postion2) const
shifts two positions
Definition: PeriodicBoundary.cc:255
void write(std::ostream &os) const override
writes boundary properties to ostream
Definition: PeriodicBoundary.cc:426
PeriodicBoundary()
default constructor
Definition: PeriodicBoundary.cc:37
~PeriodicBoundary() override
destructor
Definition: PeriodicBoundary.cc:50
Mdouble distanceRight_
position of right edge, s.t. normal*x = distanceRight_
Definition: PeriodicBoundary.h:206
void set(Vec3D normal, Mdouble distanceLeft, Mdouble distanceRight)
Defines a PeriodicBoundary by its normal and positions.
Definition: PeriodicBoundary.cc:84
void createPeriodicParticle(BaseParticle *p, ParticleHandler &pH) override
Creates a single periodic particle if required from a given particle.
Definition: PeriodicBoundary.cc:304
void moveRight(Mdouble distanceRight)
Sets the distance from the origin of the 'right' periodic wall.
Definition: PeriodicBoundary.cc:182
std::string getName() const override
Returns the name of the object.
Definition: PeriodicBoundary.cc:440
Definition: Vector.h:51