MercuryDPM  Trunk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AngledPeriodicBoundary Class Reference

#include <AngledPeriodicBoundary.h>

+ Inheritance diagram for AngledPeriodicBoundary:

Public Member Functions

AngledPeriodicBoundarycopy () const final
 Used to create a copy of the object NB: purely virtual function. More...
 
void set (Vec3D normalLeft, Vec3D normalRight, Vec3D origin)
 Defines a periodic wall. More...
 
Mdouble distance (const BaseParticle &P)
 Returns the distance of the wall to the particle and sets left_wall = true, if the left wall is the wall closest to the particle. More...
 
Mdouble distance (const Vec3D &P)
 
void shiftPosition (BaseParticle *P)
 shifts the particle (after distance set the left_wall value) More...
 
void shiftPositions (Vec3D &P1, Vec3D &P2)
 only needed in StatisticsVector More...
 
void read (std::istream &is) override
 reads wall More...
 
void oldRead (std::istream &is)
 
void write (std::ostream &os) const override
 outputs wall More...
 
std::string getName () const override
 Returns the name of the object. More...
 
Vec3DgetNormal ()
 
Mdouble getOpeningAngle ()
 angle between walls in radians More...
 
void createPeriodicParticle (BaseParticle *p, ParticleHandler &pH) override
 
void createPeriodicParticles (ParticleHandler &pH) override
 
void checkBoundaryAfterParticleMoved (BaseParticle *P)
 
void checkBoundaryAfterParticlesMove (ParticleHandler &pH) override
 Virtual function that does things to particles, each time step after particles have moved. More...
 
- Public Member Functions inherited from BaseBoundary
 BaseBoundary ()
 default constructor. More...
 
 BaseBoundary (const BaseBoundary &b)
 copy constructor More...
 
 ~BaseBoundary () override
 destructor More...
 
virtual void createPeriodicParticle (BaseParticle *p UNUSED, ParticleHandler &pH UNUSED)
 Creates a periodic particle in case of periodic boundaries in serial build. More...
 
virtual void createPeriodicParticles (ParticleHandler &pH UNUSED)
 Creates periodic copies of given particle in case of periodic boundaries. More...
 
virtual void checkBoundaryBeforeTimeStep (DPMBase *md)
 Virtual function that does things before each time step. More...
 
virtual void actionsBeforeTimeLoop ()
 Virtual function that does something after DPMBase::setupInitialConditions but before the first time step. More...
 
virtual void modifyGhostAfterCreation (BaseParticle *particle, int i)
 
virtual void writeVTK (std::fstream &file)
 
void setHandler (BoundaryHandler *handler)
 Sets the boundary's BoundaryHandler. More...
 
BoundaryHandlergetHandler () const
 Returns the boundary's BoundaryHandler. More...
 
- Public Member Functions inherited from BaseObject
 BaseObject ()=default
 Default constructor. More...
 
 BaseObject (const BaseObject &p)=default
 Copy constructor, copies all the objects BaseObject contains. More...
 
virtual ~BaseObject ()=default
 virtual destructor More...
 
virtual void moveInHandler (unsigned int index)
 Except that it is virtual, it does the same thing as setIndex() does. More...
 
void setIndex (unsigned int index)
 Allows one to assign an index to an object in the handler/container. More...
 
void setId (unsigned long id)
 Assigns a unique identifier to each object in the handler (container) which remains constant even after the object is deleted from the container/handler. More...
 
unsigned int getIndex () const
 Returns the index of the object in the handler. More...
 
unsigned int getId () const
 Returns the unique identifier of any particular object. More...
 
void setGroupId (unsigned groupId)
 
unsigned getGroupId () const
 

Private Attributes

Vec3D leftNormal_
 
Vec3D rightNormal_
 outward unit normal vector for right wall More...
 
Vec3D origin_
 common point of both walls More...
 
bool leftWall_
 true if closest wall is the left wall More...
 
Vec3D leftRadialAxis_
 outward unit normal vector for left wall More...
 
Vec3D rightRadialAxis_
 outward unit normal vector for right wall More...
 
Vec3D differenceRadialAxis_
 
Vec3D differenceNormal_
 
Matrix3D rotateLeft
 
Matrix3D rotateRight
 
Vec3D commonAxis_
 The normalized cross product of the left and right normal vector. This vector points in the direction around which the particle is rotated when it is moved from one boundary to the other. This is an internal variable set in the constructor, thus cannot be changed directly by the user. More...
 

Detailed Description

Definition at line 46 of file AngledPeriodicBoundary.h.

Member Function Documentation

void AngledPeriodicBoundary::checkBoundaryAfterParticleMoved ( BaseParticle P)
Todo:
TW: can't we do the shift in the createPeriodicParticles function only? We are checking the distance three times!

Definition at line 317 of file AngledPeriodicBoundary.cc.

References distance(), and shiftPosition().

Referenced by checkBoundaryAfterParticlesMove().

318 {
319  if (distance(*P) < 0)
320  {
321  shiftPosition(P);
322  }
323 }
Mdouble distance(const BaseParticle &P)
Returns the distance of the wall to the particle and sets left_wall = true, if the left wall is the w...
void shiftPosition(BaseParticle *P)
shifts the particle (after distance set the left_wall value)
void AngledPeriodicBoundary::checkBoundaryAfterParticlesMove ( ParticleHandler pH)
overridevirtual

Virtual function that does things to particles, each time step after particles have moved.

checks whether given particle passed the boundary, and if so, does something special with it. This is called after the particles moved, but before the force-computation. NB: virtual function

Parameters
[in]PParticle checked
[out]pHthe particle handler.
Returns
returns TRUE if given particle actually did pass the boundary

Reimplemented from BaseBoundary.

Definition at line 325 of file AngledPeriodicBoundary.cc.

References BaseHandler< T >::begin(), checkBoundaryAfterParticleMoved(), and BaseHandler< T >::end().

326 {
327  for (auto p = pH.begin(); p != pH.end(); ++p)
328  {
330  }
331 }
const std::vector< T * >::const_iterator end() const
Gets the end of the const_iterator over all BaseBoundary in this BaseHandler.
Definition: BaseHandler.h:704
const std::vector< T * >::const_iterator begin() const
Gets the begin of the const_iterator over all Object in this BaseHandler.
Definition: BaseHandler.h:690
void checkBoundaryAfterParticleMoved(BaseParticle *P)
AngledPeriodicBoundary * AngledPeriodicBoundary::copy ( ) const
finalvirtual

Used to create a copy of the object NB: purely virtual function.

Implements BaseBoundary.

Definition at line 35 of file AngledPeriodicBoundary.cc.

References MPIContainer::getNumberOfProcessors(), MPIContainer::Instance(), logger, and WARN.

36 {
37 #ifdef DEBUG_CONSTRUCTOR
38  std::cout << "AngledPeriodicBoundary::copy() const finished" << std::endl;
39 #endif
40  return new AngledPeriodicBoundary(*this);
41 #ifdef MERCURY_USE_MPI
42  MPIContainer& communicator = MPIContainer::Instance();
43  if (communicator.getNumberOfProcessors() > 1)
44  {
45  logger(WARN,"AngledPeriodicBoundaries are currently not implemented in parallel MercuryDPM");
46  }
47 #endif
48 
49 }
This class contains all information and functions required for communication between processors...
Definition: MpiContainer.h:129
static MPIContainer & Instance()
fetch the instance to be used for communication
Definition: MpiContainer.h:134
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here...
std::size_t getNumberOfProcessors() const
Get the total number of processors participating in this simulation.
void AngledPeriodicBoundary::createPeriodicParticle ( BaseParticle p,
ParticleHandler pH 
)
override

Definition at line 273 of file AngledPeriodicBoundary.cc.

References ParticleHandler::addObject(), BaseParticle::copy(), BaseInteractable::copyInteractionsForPeriodicParticles(), distance(), ParticleHandler::getLargestParticle(), BaseParticle::getMaxInteractionRadius(), BaseParticle::getPeriodicFromParticle(), BaseParticle::setPeriodicFromParticle(), and shiftPosition().

Referenced by createPeriodicParticles().

274 {
276  if (distance(*p) < maxDistance)
277  {
278  //std::cout << "Copy particle " << p->getIndex() << " to new ghost particle" << std::endl;
279  //Step 1: Copy the particle to new ghost particle.
280  BaseParticle* pGhost = p->copy();
281 
282  //std::cout << "pGhostInteractions " << pGhost->getInteractions().size();
283  //Step 2: Copy the interactions to the ghost particle.
285  //std::cout << "-> " << pGhost->getInteractions().size() << std::endl;
286 
287  //Step 3: Shift the ghost to the 'reflected' location.
288  shiftPosition(pGhost);
289  //rotateHistory
290  //std::cout << "pGhostPosition " << pGhost->getPosition() << std::endl;
291 
292  // BaseParticle* F0 = P->copy();
293  // shiftPosition(F0);
294 
295  //Step 4: If Particle is double shifted, get correct original particle
296  BaseParticle* from = p;
297  while (from->getPeriodicFromParticle() != nullptr)
298  from = from->getPeriodicFromParticle();
299  pGhost->setPeriodicFromParticle(from);
300 
301  pH.addObject(pGhost);
302  }
303 }
BaseParticle * getLargestParticle() const
Returns the pointer of the largest particle in the particle handler. When mercury is running in paral...
void addObject(BaseParticle *P) override
Adds a BaseParticle to the ParticleHandler.
double Mdouble
Definition: GeneralDefine.h:34
Mdouble getMaxInteractionRadius() const
Returns the particle's interaction radius, which might be different from radius_ (e.g., when dealing with wet particles)
Definition: BaseParticle.h:362
void setPeriodicFromParticle(BaseParticle *p)
Assigns the pointer to the 'original' particle this one's a periodic copy of (used in periodic bounda...
Definition: BaseParticle.h:441
BaseParticle * getPeriodicFromParticle() const
Returns the 'original' particle this one's a periodic copy of.
Definition: BaseParticle.h:341
virtual BaseParticle * copy() const =0
Particle copy method. It calls to copy constructor of this Particle, useful for polymorphism.
Mdouble distance(const BaseParticle &P)
Returns the distance of the wall to the particle and sets left_wall = true, if the left wall is the w...
void copyInteractionsForPeriodicParticles(const BaseInteractable &p)
Copies interactions to this BaseInteractable whenever a periodic copy made.
void shiftPosition(BaseParticle *P)
shifts the particle (after distance set the left_wall value)
void AngledPeriodicBoundary::createPeriodicParticles ( ParticleHandler pH)
override

Definition at line 305 of file AngledPeriodicBoundary.cc.

References createPeriodicParticle(), BaseHandler< T >::getObject(), BaseHandler< T >::getSize(), and constants::i.

306 {
307  unsigned numberOfParticles = pH.getSize();
308  for (unsigned i = 0; i < numberOfParticles; i++)
309  {
311  }
312 }
unsigned int getSize() const
Gets the size of the particleHandler (including mpi and periodic particles)
Definition: BaseHandler.h:655
const std::complex< Mdouble > i
Definition: ExtendedMath.h:51
void createPeriodicParticle(BaseParticle *p, ParticleHandler &pH) override
T * getObject(const unsigned int id)
Gets a pointer to the Object at the specified index in the BaseHandler.
Definition: BaseHandler.h:613
Mdouble AngledPeriodicBoundary::distance ( const BaseParticle P)

Returns the distance of the wall to the particle and sets left_wall = true, if the left wall is the wall closest to the particle.

Since this function should be called before calculating any Particle-Wall interactions, it can also be used to set the shift vector in case of curved walls.

Definition at line 93 of file AngledPeriodicBoundary.cc.

References BaseInteractable::getPosition().

Referenced by checkBoundaryAfterParticleMoved(), and createPeriodicParticle().

94 {
95  return distance(P.getPosition());
96 }
const Vec3D & getPosition() const
Returns the position of this BaseInteractable.
Mdouble distance(const BaseParticle &P)
Returns the distance of the wall to the particle and sets left_wall = true, if the left wall is the w...
Mdouble AngledPeriodicBoundary::distance ( const Vec3D P)

Definition at line 101 of file AngledPeriodicBoundary.cc.

References Vec3D::dot(), leftNormal_, leftWall_, origin_, and rightNormal_.

102 {
103  Vec3D position = P - origin_;
104  Mdouble distance_left = Vec3D::dot(position, leftNormal_);
105  Mdouble distance_right = -Vec3D::dot(position, rightNormal_);
106 
107  if (distance_left < distance_right)
108  {
109  leftWall_ = true;
110  //std::cout << "left wall, " << position << ", distance " << distance_left << "<" << distance_right << std::endl;
111  return distance_left;
112  }
113  else
114  {
115  leftWall_ = false;
116  //std::cout << "right wall, " << position << ", distance " << distance_right << "<" << distance_left << std::endl;
117  return distance_right;
118  }
119 }
Vec3D origin_
common point of both walls
double Mdouble
Definition: GeneralDefine.h:34
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:76
bool leftWall_
true if closest wall is the left wall
Vec3D rightNormal_
outward unit normal vector for right wall
Definition: Vector.h:49
std::string AngledPeriodicBoundary::getName ( ) const
overridevirtual

Returns the name of the object.

Implements BaseObject.

Definition at line 246 of file AngledPeriodicBoundary.cc.

247 {
248  return "AngledPeriodicBoundary";
249 }
Vec3D & AngledPeriodicBoundary::getNormal ( )

Definition at line 254 of file AngledPeriodicBoundary.cc.

References leftNormal_, leftWall_, and rightNormal_.

255 {
256  if (leftWall_)
257  return leftNormal_;
258  else
259  return rightNormal_;
260 }
bool leftWall_
true if closest wall is the left wall
Vec3D rightNormal_
outward unit normal vector for right wall
Mdouble AngledPeriodicBoundary::getOpeningAngle ( )

angle between walls in radians

Definition at line 265 of file AngledPeriodicBoundary.cc.

References Vec3D::dot(), leftNormal_, and rightNormal_.

266 {
267  return acos(Vec3D::dot(leftNormal_, rightNormal_));
268 }
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:76
Vec3D rightNormal_
outward unit normal vector for right wall
void AngledPeriodicBoundary::oldRead ( std::istream &  is)

Definition at line 225 of file AngledPeriodicBoundary.cc.

References leftNormal_, origin_, rightNormal_, and set().

226 {
227  std::string dummy;
228  is >> dummy >> leftNormal_ >> dummy >> rightNormal_ >> dummy >> origin_;
229  set(leftNormal_, rightNormal_, origin_);
230 }
Vec3D origin_
common point of both walls
void set(Vec3D normalLeft, Vec3D normalRight, Vec3D origin)
Defines a periodic wall.
Vec3D rightNormal_
outward unit normal vector for right wall
void AngledPeriodicBoundary::read ( std::istream &  is)
overridevirtual

reads wall

Implements BaseBoundary.

Definition at line 214 of file AngledPeriodicBoundary.cc.

References leftNormal_, origin_, BaseBoundary::read(), rightNormal_, and set().

215 {
216  BaseBoundary::read(is);
217  std::string dummy;
218  is >> dummy >> leftNormal_ >> dummy >> rightNormal_ >> dummy >> origin_;
219  set(leftNormal_, rightNormal_, origin_);
220 }
Vec3D origin_
common point of both walls
void read(std::istream &is) override=0
Reads the object's id_ from given istream NB: purely virtual function, overriding the version of Base...
Definition: BaseBoundary.cc:61
void set(Vec3D normalLeft, Vec3D normalRight, Vec3D origin)
Defines a periodic wall.
Vec3D rightNormal_
outward unit normal vector for right wall
void AngledPeriodicBoundary::set ( Vec3D  normalLeft,
Vec3D  normalRight,
Vec3D  origin 
)

Defines a periodic wall.

given a normal vector s.t. all particles are within {x: position_left<=normal*x<position_right}. The shift vector is set assuming that the domain is rectangular (shift parallel to normal).

Parameters
[in]normalLeft
[in]normalRight
[in]origin
Todo:
TW: Note, I cannot calculate angular shift; this needs to be revisited when we complete quaternion implementation

Definition at line 59 of file AngledPeriodicBoundary.cc.

References commonAxis_, Vec3D::cross(), differenceNormal_, differenceRadialAxis_, Vec3D::dot(), Vec3D::getLength(), leftNormal_, leftRadialAxis_, origin_, rightNormal_, rightRadialAxis_, rotateLeft, rotateRight, Vec3D::X, Vec3D::Y, and Vec3D::Z.

Referenced by oldRead(), and read().

60 {
61  origin_ = origin;
62  leftNormal_ = normalLeft / Vec3D::getLength(normalLeft);
63  rightNormal_ = normalRight / Vec3D::getLength(normalRight);
64  //http://math.stackexchange.com/questions/180418/calculate-rotation-matrix-to-align-vector-a-to-vector-b-in-3d
68  Matrix3D vx = {0, -v.Z, v.Y,
69  v.Z, 0, -v.X,
70  -v.Y, v.X, 0};
71  Matrix3D eye = {1, 0, 0, 0, 1, 0, 0, 0, 1};
72  rotateLeft = eye - vx + vx * vx * ((1 - c) / s / s);
73  rotateRight = eye + vx + vx * vx * ((1 - c) / s / s);
74  //std::cout << "rotationMatrix" << rotationMatrix << std::endl;
75  commonAxis_ = v / s;
81  // walls; maybe this has to wait till quaternions are implemented.}
82  //angularShift = 0;
83  // std::cout << "common_axis " << common_axis
84  // << ", radialAxis_left " << radialAxis_left
85  // << ", radialAxis_right " << radialAxis_right
86  // << ", angularShift " << angularShift
87  // << std::endl;
88 }
Vec3D origin_
common point of both walls
Mdouble X
the vector components
Definition: Vector.h:65
double Mdouble
Definition: GeneralDefine.h:34
Vec3D leftRadialAxis_
outward unit normal vector for left wall
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:76
Vec3D commonAxis_
The normalized cross product of the left and right normal vector. This vector points in the direction...
static Vec3D cross(const Vec3D &a, const Vec3D &b)
Calculates the cross product of two Vec3D: .
Definition: Vector.cc:163
Mdouble Y
Definition: Vector.h:65
Vec3D rightRadialAxis_
outward unit normal vector for right wall
Mdouble getLength() const
Calculates the length of this Vec3D: .
Definition: Vector.cc:320
Vec3D rightNormal_
outward unit normal vector for right wall
Implementation of a 3D matrix.
Definition: Matrix.h:37
Definition: Vector.h:49
Mdouble Z
Definition: Vector.h:65
void AngledPeriodicBoundary::shiftPosition ( BaseParticle P)

shifts the particle (after distance set the left_wall value)

Todo:
add velocity, angular, springs shift
Todo:
TW: not sure how to calculate the angular position in common_axis direction; this needs to be revisited when we complete quaternion implementation
Todo:
TW: recalculate the orientation here

Definition at line 124 of file AngledPeriodicBoundary.cc.

References BaseParticle::accelerate(), BaseParticle::angularAccelerate(), differenceNormal_, differenceRadialAxis_, Vec3D::dot(), BaseInteractable::getAngularVelocity(), Quaternion::getAxis(), BaseObject::getIndex(), BaseInteractable::getInteractions(), BaseInteractable::getOrientation(), BaseInteractable::getPosition(), BaseInteractable::getVelocity(), constants::i, leftNormal_, leftRadialAxis_, leftWall_, BaseInteractable::move(), origin_, rightNormal_, rightRadialAxis_, BaseInteractable::rotate(), rotateLeft, and rotateRight.

Referenced by checkBoundaryAfterParticleMoved(), and createPeriodicParticle().

125 {
126  Vec3D position = P->getPosition() - origin_;
127  if (leftWall_)
128  {
129  Mdouble normalDistance = Vec3D::dot(position, leftNormal_);
130  Mdouble radialDistance = Vec3D::dot(position, leftRadialAxis_);
131  P->move(normalDistance * differenceNormal_ + radialDistance * differenceRadialAxis_);
132  Mdouble normalVelocity = Vec3D::dot(P->getVelocity(), leftNormal_);
133  Mdouble radialVelocity = Vec3D::dot(P->getVelocity(), leftRadialAxis_);
134  P->accelerate(normalVelocity * differenceNormal_ + radialVelocity * differenceRadialAxis_);
135  Mdouble normalAngularDistance = Vec3D::dot(P->getOrientation().getAxis(), leftNormal_);
136  Mdouble radialAngularDistance = Vec3D::dot(P->getOrientation().getAxis(), leftRadialAxis_);
138  P->rotate(normalAngularDistance * differenceNormal_ + radialAngularDistance * differenceRadialAxis_);
139  Mdouble normalAngularVelocity = Vec3D::dot(P->getAngularVelocity(), leftNormal_);
140  Mdouble radialAngularVelocity = Vec3D::dot(P->getAngularVelocity(), leftRadialAxis_);
141  P->angularAccelerate(normalAngularVelocity * differenceNormal_ + radialAngularVelocity * differenceRadialAxis_);
142  leftWall_ = false;
143  //std::cout << "shift to right wall, " << P->getInteractions().size() << std::endl;
144  for (BaseInteraction* i : P->getInteractions())
145  {
146  if (i->getP()->getIndex() >= P->getIndex())
147  {
148  i->rotateHistory(rotateRight);
149  }
150  }
151  }
152  else
153  {
154  Mdouble normalDistance = Vec3D::dot(position, rightNormal_);
155  Mdouble radialDistance = Vec3D::dot(position, rightRadialAxis_);
156  P->move(-normalDistance * differenceNormal_ - radialDistance * differenceRadialAxis_);
157  Mdouble normalVelocity = Vec3D::dot(P->getVelocity(), rightNormal_);
158  Mdouble radialVelocity = Vec3D::dot(P->getVelocity(), rightRadialAxis_);
159  P->accelerate(-normalVelocity * differenceNormal_ - radialVelocity * differenceRadialAxis_);
160 
162 
163  Mdouble normalAngularVelocity = Vec3D::dot(P->getAngularVelocity(), rightNormal_);
164  Mdouble radialAngularVelocity = Vec3D::dot(P->getAngularVelocity(), rightRadialAxis_);
166  -normalAngularVelocity * differenceNormal_ - radialAngularVelocity * differenceRadialAxis_);
167  leftWall_ = true;
168  //std::cout << "shift to left wall, " << P->getPosition() << std::endl;
169  for (BaseInteraction* i : P->getInteractions())
170  {
171  if (i->getP()->getIndex() >= P->getIndex()) //if it is the deleted interaction
172  {
173  i->rotateHistory(rotateLeft);
174  }
175  }
176  }
177 }
Vec3D origin_
common point of both walls
unsigned int getIndex() const
Returns the index of the object in the handler.
Definition: BaseObject.h:118
const Vec3D & getPosition() const
Returns the position of this BaseInteractable.
double Mdouble
Definition: GeneralDefine.h:34
const std::complex< Mdouble > i
Definition: ExtendedMath.h:51
Vec3D leftRadialAxis_
outward unit normal vector for left wall
virtual const Vec3D & getAngularVelocity() const
Returns the angular velocity of this interactable.
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:76
void accelerate(const Vec3D &vel)
Increases the particle's velocity_ by the given vector.
Stores information about interactions between two interactable objects; often particles but could be ...
Vec3D getAxis() const
Converts the quaternions into a normal vector by rotating the vector x=(1,0,0); see See Wiki for deta...
Definition: Quaternion.cc:501
bool leftWall_
true if closest wall is the left wall
Vec3D rightRadialAxis_
outward unit normal vector for right wall
virtual void rotate(const Vec3D &angularVelocityDt)
Rotates this BaseInteractable.
const std::vector< BaseInteraction * > & getInteractions() const
Returns a list of interactions which belong to this interactable.
Vec3D rightNormal_
outward unit normal vector for right wall
void angularAccelerate(const Vec3D &angVel)
Increases the particle's angularVelocity_ by the given vector.
virtual const Vec3D & getVelocity() const
Returns the velocity of this interactable.
Definition: Vector.h:49
virtual void move(const Vec3D &move)
Moves this BaseInteractable by adding an amount to the position.
const Quaternion & getOrientation() const
Returns the orientation of this BaseInteractable.
void AngledPeriodicBoundary::shiftPositions ( Vec3D P1,
Vec3D P2 
)

only needed in StatisticsVector

Todo:
TW: this still doesn't shift all data

Definition at line 182 of file AngledPeriodicBoundary.cc.

References differenceNormal_, differenceRadialAxis_, Vec3D::dot(), leftNormal_, leftRadialAxis_, leftWall_, origin_, rightNormal_, and rightRadialAxis_.

183 {
185  Vec3D position1 = P1 - origin_;
186  Vec3D position2 = P2 - origin_;
187  Mdouble normalDistance;
188  Mdouble radialDistance;
189  if (leftWall_)
190  {
191  normalDistance = Vec3D::dot(position1, leftNormal_);
192  radialDistance = Vec3D::dot(position1, leftRadialAxis_);
193  P1 += (normalDistance * differenceNormal_ + radialDistance * differenceRadialAxis_);
194  normalDistance = Vec3D::dot(position2, leftNormal_);
195  radialDistance = Vec3D::dot(position2, leftRadialAxis_);
196  P2 += (normalDistance * differenceNormal_ + radialDistance * differenceRadialAxis_);
197  leftWall_ = false;
198  }
199  else
200  {
201  normalDistance = Vec3D::dot(position1, rightNormal_);
202  radialDistance = Vec3D::dot(position1, rightRadialAxis_);
203  P1 += (-normalDistance * differenceNormal_ - radialDistance * differenceRadialAxis_);
204  normalDistance = Vec3D::dot(position2, rightNormal_);
205  radialDistance = Vec3D::dot(position2, rightRadialAxis_);
206  P2 += (-normalDistance * differenceNormal_ - radialDistance * differenceRadialAxis_);
207  leftWall_ = true;
208  }
209 }
Vec3D origin_
common point of both walls
double Mdouble
Definition: GeneralDefine.h:34
Vec3D leftRadialAxis_
outward unit normal vector for left wall
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:76
bool leftWall_
true if closest wall is the left wall
Vec3D rightRadialAxis_
outward unit normal vector for right wall
Vec3D rightNormal_
outward unit normal vector for right wall
Definition: Vector.h:49
void AngledPeriodicBoundary::write ( std::ostream &  os) const
overridevirtual

outputs wall

Implements BaseBoundary.

Definition at line 235 of file AngledPeriodicBoundary.cc.

References leftNormal_, origin_, rightNormal_, and BaseBoundary::write().

236 {
238  os << " normal_left " << leftNormal_
239  << " normal_right " << rightNormal_
240  << " origin " << origin_;
241 }
Vec3D origin_
common point of both walls
void write(std::ostream &os) const override=0
Adds object's id_ to given ostream NB: purely virtual function, overriding the version of BaseObject...
Definition: BaseBoundary.cc:70
Vec3D rightNormal_
outward unit normal vector for right wall

Member Data Documentation

Vec3D AngledPeriodicBoundary::commonAxis_
private

The normalized cross product of the left and right normal vector. This vector points in the direction around which the particle is rotated when it is moved from one boundary to the other. This is an internal variable set in the constructor, thus cannot be changed directly by the user.

Definition at line 184 of file AngledPeriodicBoundary.h.

Referenced by set().

Vec3D AngledPeriodicBoundary::differenceNormal_
private

Definition at line 171 of file AngledPeriodicBoundary.h.

Referenced by set(), shiftPosition(), and shiftPositions().

Vec3D AngledPeriodicBoundary::differenceRadialAxis_
private

Definition at line 167 of file AngledPeriodicBoundary.h.

Referenced by set(), shiftPosition(), and shiftPositions().

Vec3D AngledPeriodicBoundary::leftNormal_
private

outward unit normal vector for left wall

Definition at line 140 of file AngledPeriodicBoundary.h.

Referenced by distance(), getNormal(), getOpeningAngle(), oldRead(), read(), set(), shiftPosition(), shiftPositions(), and write().

Vec3D AngledPeriodicBoundary::leftRadialAxis_
private

outward unit normal vector for left wall

Definition at line 159 of file AngledPeriodicBoundary.h.

Referenced by set(), shiftPosition(), and shiftPositions().

bool AngledPeriodicBoundary::leftWall_
private

true if closest wall is the left wall

Definition at line 155 of file AngledPeriodicBoundary.h.

Referenced by distance(), getNormal(), shiftPosition(), and shiftPositions().

Vec3D AngledPeriodicBoundary::origin_
private

common point of both walls

Definition at line 150 of file AngledPeriodicBoundary.h.

Referenced by distance(), oldRead(), read(), set(), shiftPosition(), shiftPositions(), and write().

Vec3D AngledPeriodicBoundary::rightNormal_
private

outward unit normal vector for right wall

Definition at line 145 of file AngledPeriodicBoundary.h.

Referenced by distance(), getNormal(), getOpeningAngle(), oldRead(), read(), set(), shiftPosition(), shiftPositions(), and write().

Vec3D AngledPeriodicBoundary::rightRadialAxis_
private

outward unit normal vector for right wall

Definition at line 163 of file AngledPeriodicBoundary.h.

Referenced by set(), shiftPosition(), and shiftPositions().

Matrix3D AngledPeriodicBoundary::rotateLeft
private

Definition at line 173 of file AngledPeriodicBoundary.h.

Referenced by set(), and shiftPosition().

Matrix3D AngledPeriodicBoundary::rotateRight
private

Definition at line 175 of file AngledPeriodicBoundary.h.

Referenced by set(), and shiftPosition().


The documentation for this class was generated from the following files: