MercuryDPM
Alpha
|
A IntersectionOfWalls is convex polygon defined as an intersection of InfiniteWall's. More...
#include <IntersectionOfWalls.h>
Classes | |
struct | normalAndPosition |
Public Member Functions | |
IntersectionOfWalls () | |
Default constructor. More... | |
IntersectionOfWalls (const IntersectionOfWalls &other) | |
Copy constructor. More... | |
IntersectionOfWalls (std::vector< normalAndPosition > walls, const ParticleSpecies *species) | |
Constructor setting values. More... | |
virtual | ~IntersectionOfWalls () |
Destructor. More... | |
IntersectionOfWalls & | operator= (const IntersectionOfWalls &other) |
IntersectionOfWalls * | copy () const override |
Wall copy method. It calls the copy constructor of this Wall, useful for polymorphism. More... | |
MERCURY_DEPRECATED void | clear () override |
Removes all parts of the walls. More... | |
void | setSpecies (const ParticleSpecies *species) |
sets species of subwalls as well More... | |
void | setHandler (WallHandler *wallHandler) override |
A function which sets the WallHandler for this BaseWall. More... | |
void | addObject (Vec3D normal, Vec3D point) |
Adds a wall to the set of infinite walls, given an outward normal vector s.t. normal*x=normal*point. More... | |
MERCURY_DEPRECATED void | addObject (Vec3D normal, Mdouble position) |
Adds a wall to the set of finite walls, given an outward normal vector s. t. normal*x=position. More... | |
void | createOpenPrism (std::vector< Vec3D > points, Vec3D prismAxis) |
Creates an open prism which is a polygon between the points, except the first and last point, and extends infinitely in the PrismAxis direction. More... | |
void | createPrism (std::vector< Vec3D > points, Vec3D prismAxis) |
Creates an open prism which is a polygon between the points and extends infinitely in the PrismAxis direction. More... | |
void | createOpenPrism (std::vector< Vec3D > points) |
Creates an open prism which is a polygon between the points, except the first and last point, and extends infinitely in the direction perpendicular to the first and second wall. More... | |
void | createPrism (std::vector< Vec3D > points) |
Creates an open prism which is a polygon between the points and extends infinitely in the direction perpendicular to the first and second wall. More... | |
bool | getDistanceAndNormal (const BaseParticle &p, Mdouble &distance, Vec3D &normal_return) const override |
Compute the distance from the wall for a given BaseParticle and return if there is a collision. If there is a collision, also return the normal vector. More... | |
bool | getDistanceAndNormal (const Vec3D &postition, Mdouble wallInteractionRadius, Mdouble &distance, Vec3D &normal_return) const |
Compute the distance from the wall for a given BaseParticle and return if there is an interaction. If there is an interaction, also return the normal vector. More... | |
void | move (const Vec3D &move) override |
Move the IntersectionOfWalls to a new position, which is a Vec3D from the old position. More... | |
void | read (std::istream &is) override |
Reads an IntersectionOfWalls from an input stream, for example a restart file. More... | |
void | write (std::ostream &os) const override |
Writes an IntersectionOfWalls to an output stream, for example a restart file. More... | |
std::string | getName () const override |
Returns the name of the object, here the string "IntersectionOfWalls". More... | |
void | writeVTK (VTKContainer &vtk) const override |
Public Member Functions inherited from BaseWall | |
BaseWall () | |
Default constructor. It makes an empty BaseWall. More... | |
BaseWall (const BaseWall &w) | |
Copy constructor. More... | |
virtual | ~BaseWall () |
Default destructor. More... | |
WallHandler * | getHandler () const |
A function which returns the WallHandler that handles this BaseWall. More... | |
void | setIndSpecies (unsigned int indSpecies) |
Define the species of this wall using the index of the species in the SpeciesHandler in this DPMBase. More... | |
void | setSpecies (const ParticleSpecies *species) |
Define the species of this wall. More... | |
bool | getLinePlaneIntersect (Vec3D &intersect, const Vec3D &p0, const Vec3D &p1, const Vec3D &n, const Vec3D &p) |
bool | isInsideWallVTK (const Vec3D &point, const Vec3D &normal, const Vec3D &position) const |
void | projectOntoWallVTK (Vec3D &point0, const Vec3D &point1, const Vec3D &normal, const Vec3D &position) const |
void | intersectVTK (std::vector< Vec3D > &points, const Vec3D normal, const Vec3D position) const |
virtual std::vector < BaseInteraction * > | getInteractionWith (BaseParticle *p, Mdouble timeStamp, InteractionHandler *interactionHandler) |
Public Member Functions inherited from BaseInteractable | |
BaseInteractable () | |
Default BaseInteractable constructor, it simply creates an empty BaseInteractable. More... | |
BaseInteractable (const BaseInteractable &p) | |
Copy constructor. It copies the BaseInteractable and all objects it contains. More... | |
virtual | ~BaseInteractable () |
Destructor, it simply destructs the BaseInteractable and all the objects it contains. More... | |
unsigned int | getIndSpecies () const |
Returns the index of the Species of this BaseInteractable. More... | |
const ParticleSpecies * | getSpecies () const |
Returns a pointer to the species of this BaseInteractable. More... | |
void | setSpecies (const ParticleSpecies *species) |
Sets the species of this BaseInteractable. More... | |
const Vec3D & | getForce () const |
Returns the force on this BaseInteractable. More... | |
const Vec3D & | getTorque () const |
Returns the torque on this BaseInteractable. More... | |
void | setForce (const Vec3D &force) |
Sets the force on this BaseInteractable. More... | |
void | setTorque (const Vec3D &torque) |
Sets the torque on this BaseInteractable. More... | |
void | addForce (const Vec3D &addForce) |
Adds an amount to the force on this BaseInteractable. More... | |
void | addTorque (const Vec3D &addTorque) |
Adds an amount to the torque on this BaseInteractable. More... | |
const Vec3D & | getPosition () const |
Returns the position of this BaseInteractable. More... | |
const Vec3D & | getOrientation () const |
Returns the orientation of this BaseInteractable. More... | |
void | setPosition (const Vec3D &position) |
Sets the position of this BaseInteractable. More... | |
void | setOrientation (const Vec3D &orientation) |
Sets the orientation of this BaseInteractable. More... | |
void | rotate (const Vec3D &rotate) |
Rotates this BaseInteractable. More... | |
const std::list < BaseInteraction * > & | getInteractions () const |
Returns a reference to the list of interactions in this BaseInteractable. More... | |
void | addInteraction (BaseInteraction *I) |
Adds an interaction to this BaseInteractable. More... | |
bool | removeInteraction (BaseInteraction *I) |
Removes an interaction from this BaseInteractable. More... | |
void | copyInteractionsForPeriodicParticles (const BaseInteractable &p) |
Copies interactions to this BaseInteractable whenever a periodic copy made. More... | |
void | setVelocity (const Vec3D &velocity) |
set the velocity of the BaseInteractable. More... | |
void | setAngularVelocity (const Vec3D &angularVelocity) |
set the angular velocity of the BaseInteractble. More... | |
void | addVelocity (const Vec3D &velocity) |
adds an increment to the velocity. More... | |
void | addAngularVelocity (const Vec3D &angularVelocity) |
add an increment to the angular velocity. More... | |
virtual const Vec3D & | getVelocity () const |
Returns the velocity of this interactable. More... | |
virtual const Vec3D & | getAngularVelocity () const |
Returns the angular velocity of this interactable. More... | |
void | setPrescribedPosition (const std::function< Vec3D(double)> &prescribedPosition) |
Allows the position of an infinite mass interactable to be prescribed. More... | |
void | applyPrescribedPosition (double time) |
Computes the position from the user defined prescribed position function. More... | |
void | setPrescribedVelocity (const std::function< Vec3D(double)> &prescribedVelocity) |
Allows the velocity of an infinite mass interactable to be prescribed. More... | |
void | applyPrescribedVelocity (double time) |
Computes the velocity from the user defined prescribed velocity function. More... | |
void | setPrescribedOrientation (const std::function< Vec3D(double)> &prescribedOrientation) |
Allows the orientation of the infinite mass interactbale to be prescribed. More... | |
void | applyPrescribedOrientation (double time) |
Computes the orientation from the user defined prescribed orientation function. More... | |
void | setPrescribedAngularVelocity (const std::function< Vec3D(double)> &prescribedAngularVelocity) |
Allows the angular velocity of the infinite mass interactable to be prescribed. More... | |
void | applyPrescribedAngularVelocity (double time) |
Computes the angular velocity from the user defined prescribed angular velocity. More... | |
virtual const Vec3D | getVelocityAtContact (const Vec3D &contact) const |
Returns the velocity at the contact point, use by many force laws. More... | |
void | integrateBeforeForceComputation (double time, double timeStep) |
This is part of integrate routine for objects with infinite mass. More... | |
void | integrateAfterForceComputation (double time, double timeStep) |
This is part of the integration routine for objects with infinite mass. More... | |
Public Member Functions inherited from BaseObject | |
BaseObject () | |
Default constructor. More... | |
BaseObject (const BaseObject &p) | |
Copy constructor, copies all the objects BaseObject contains. More... | |
virtual | ~BaseObject () |
virtual destructor More... | |
virtual void | moveInHandler (const unsigned int index) |
Except that it is virtual, it does the same thing as setIndex() does. More... | |
void | setIndex (const unsigned int index) |
Allows one to assign an index to an object in the handler/container. More... | |
void | setId (const unsigned int 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... | |
Protected Attributes | |
std::vector< InfiniteWall > | wallObjects_ |
The wall "segments"/directions that together make up the finite wall. More... | |
Private Attributes | |
std::vector< Vec3D > | A_ |
A vector that stores a point for each intersecting line between two different InfiniteWall. More... | |
std::vector< Vec3D > | AB_ |
A vector that stores the direction of the intersecting lines between two different InfiniteWall. More... | |
std::vector< Vec3D > | C_ |
A vector that stores the intersection point of three different InfiniteWall. More... | |
Additional Inherited Members | |
Static Public Member Functions inherited from BaseWall | |
static void | addToVTK (const std::vector< Vec3D > &points, VTKContainer &vtk) |
Public Attributes inherited from BaseWall | |
WallHandler * | handler_ |
A IntersectionOfWalls is convex polygon defined as an intersection of InfiniteWall's.
It can be defined as the intersection of a set of #InfiniteWalls, defined by the normal vector into the wall and a point on the wall:
A particle of radius r and position x touches an InfiniteWall with normal n and position p if (note 'touching particles' also includes particles that are completely enclosed inside the wall). A particle touches an IntersectionOfWalls if it touches all InfiniteWall objects (shown in the image below).
For a demonstration on how to use this class, see T8: Motion of a particle in a box with an obstacle and Flow through a 3D hourglass/silo (shown in the image below).
Definition at line 55 of file IntersectionOfWalls.h.
IntersectionOfWalls::IntersectionOfWalls | ( | ) |
Default constructor.
Definition at line 30 of file IntersectionOfWalls.cc.
Referenced by copy().
IntersectionOfWalls::IntersectionOfWalls | ( | const IntersectionOfWalls & | other | ) |
Copy constructor.
[in] | other | The IntersectionOfWalls that must be copied. |
Definition at line 38 of file IntersectionOfWalls.cc.
References A_, AB_, C_, DEBUG, BaseWall::getHandler(), logger, and wallObjects_.
IntersectionOfWalls::IntersectionOfWalls | ( | std::vector< normalAndPosition > | walls, |
const ParticleSpecies * | species | ||
) |
Constructor setting values.
Definition at line 53 of file IntersectionOfWalls.cc.
References addObject(), and setSpecies().
|
virtual |
Destructor.
Definition at line 63 of file IntersectionOfWalls.cc.
Adds a wall to the set of infinite walls, given an outward normal vector s.t. normal*x=normal*point.
[in] | normal | The normal to this wallObject. |
[in] | point | One of the points of the wallObject. |
Adds a wall to the set of finite walls, given an outward unit normal vector s.t. normal*x=normal*point for all x of the wallObject. First make the InfiniteWall, then compute all intersections, which are then stored in A_, AB_ and C_.
Definition at line 123 of file IntersectionOfWalls.cc.
References A_, AB_, C_, Vec3D::cross(), Vec3D::dot(), InfiniteWall::getNormal(), BaseInteractable::getPosition(), BaseInteractable::getSpecies(), logger, Vec3D::normalize(), InfiniteWall::set(), BaseWall::setSpecies(), VERBOSE, wallObjects_, X, Y, and Z.
Referenced by ChuteWithHopper::addHopper(), addObject(), createOpenPrism(), createPrism(), IntersectionOfWalls(), read(), and WallHandler::readOldObject().
Adds a wall to the set of finite walls, given an outward normal vector s. t. normal*x=position.
[in] | normal | The normal to the wallObject. |
[in] | position | The position of the wallObject in the direction of the normal vector. |
Definition at line 198 of file IntersectionOfWalls.cc.
References addObject(), logger, and WARN.
|
overridevirtual |
Removes all parts of the walls.
Reimplemented from BaseWall.
Definition at line 98 of file IntersectionOfWalls.cc.
References A_, AB_, C_, and wallObjects_.
Referenced by createOpenPrism().
|
overridevirtual |
Wall copy method. It calls the copy constructor of this Wall, useful for polymorphism.
Implements BaseWall.
Definition at line 93 of file IntersectionOfWalls.cc.
References IntersectionOfWalls().
Referenced by operator=().
Creates an open prism which is a polygon between the points, except the first and last point, and extends infinitely in the PrismAxis direction.
[in] | points | A vector of 3D-vectors which contains the points between which the polygon is drawn. |
[in] | prismAxis | A 3D-vector which represents the direction in which the prism is extended infinitely. |
Create an open prism which is a polygon with no connection between the first and last point, and extending infinitely in the other direction, which is defined as PrismAxis. Do this by adding the walls between the consecutive points one by one.
Definition at line 212 of file IntersectionOfWalls.cc.
References addObject(), clear(), and Vec3D::cross().
Referenced by createOpenPrism(), and createPrism().
void IntersectionOfWalls::createOpenPrism | ( | std::vector< Vec3D > | points | ) |
Creates an open prism which is a polygon between the points, except the first and last point, and extends infinitely in the direction perpendicular to the first and second wall.
[in] | points | A vector of 3D-vectors which contains the points between which the polygon is drawn. |
Create an open prism which is a polygon with no connection between the first and last point, and extending infinitely in the direction perpendicular to the first and second wall. Do this by first computing in which direction the wall must be extended infinitely, then call createOpenPrism(points, prismAxis).
Definition at line 240 of file IntersectionOfWalls.cc.
References createOpenPrism(), Vec3D::cross(), and Vec3D::getUnitVector().
Creates an open prism which is a polygon between the points and extends infinitely in the PrismAxis direction.
[in] | points | A vector of 3D-vectors which contains the points between which the polygon is drawn. |
[in] | prismAxis | A 3D-vector which represents the direction in which the prism is extended infinitely. |
Create an open prism which is a polygon and extending infinitely in the other direction, which is defined as PrismAxis. Do this by first creating an open prism and then connect the last and the first point.
Definition at line 227 of file IntersectionOfWalls.cc.
References addObject(), createOpenPrism(), and Vec3D::cross().
Referenced by createPrism().
void IntersectionOfWalls::createPrism | ( | std::vector< Vec3D > | points | ) |
Creates an open prism which is a polygon between the points and extends infinitely in the direction perpendicular to the first and second wall.
[in] | points | A vector of 3D-vectors which contains the points between which the polygon is drawn. |
Create an open prism which is a polygon, and extending infinitely in the direction perpendicular to the first and second wall. Do this by first computing in which direction the wall must be extended infinitely, then call createOpenPrism(points, prismAxis).
Definition at line 255 of file IntersectionOfWalls.cc.
References createPrism(), Vec3D::cross(), and Vec3D::getUnitVector().
|
overridevirtual |
Compute the distance from the wall for a given BaseParticle and return if there is a collision. If there is a collision, also return the normal vector.
[in] | p | BaseParticle we want to calculate the distance and whether it collided of. |
[out] | distance | The distance of the BaseParticle to this wall. |
[out] | normal_return | If there was a collision, the normal vector to this wall will be placed here. |
This function computes whether or not there is a collision between a given BaseParticle and this IntersectionOfWalls. If there is a collision, this function also computes the distance between the BaseParticle and IntersectionOfWalls and the normal of the IntersectionOfWalls at the intersection point. It does this by calling IntersectionOfWalls::getDistanceAndNormal(const Vec3D& , Mdouble , Mdouble&, Vec3D&) const. Since this function should be called before calculating any Particle-Wall interactions, it can also be used to set the normal vector in case of curved walls.
Implements BaseWall.
Definition at line 277 of file IntersectionOfWalls.cc.
References BaseParticle::getInteractionRadius(), and BaseInteractable::getPosition().
Referenced by AxisymmetricIntersectionOfWalls::getDistanceAndNormal().
bool IntersectionOfWalls::getDistanceAndNormal | ( | const Vec3D & | position, |
Mdouble | wallInteractionRadius, | ||
Mdouble & | distance, | ||
Vec3D & | normal_return | ||
) | const |
Compute the distance from the wall for a given BaseParticle and return if there is an interaction. If there is an interaction, also return the normal vector.
[in] | position | The position of the object there is possible an interaction with. |
[in] | wallInteractionRadius | The maximum distance between the IntersectionOfWalls and the input argument position for which there is an interaction. |
[out] | distance | The distance of the object at position to this wall. |
[out] | normal_return | If there was an interaction, the normal vector to this wall will be placed here. |
This function computes whether or not there is an interaction between an object at the given distance and this IntersectionOfWalls. If there is an interaction, this function also computes the distance between the BaseParticle and IntersectionOfWalls and the normal of the IntersectionOfWalls at the intersection point. First check if the distance between the object at position and the IntersectionOfWalls is smaller or greater than the wallInteractionRadius. If there is no interaction, return false, the output parameters then have no meaning. If there is an interaction, find out which (one or more) of the InfiniteWall there is an interaction with. Then compute the distance between the particle and InfiniteWall and the normal to the interaction point. Since this function should be called before calculating any Particle-Wall interactions, it can also be used to set the normal vector in case of curved walls.
Definition at line 304 of file IntersectionOfWalls.cc.
References A_, AB_, C_, DEBUG, Vec3D::dot(), Vec3D::getLengthSquared(), logger, and wallObjects_.
|
overridevirtual |
Returns the name of the object, here the string "IntersectionOfWalls".
Implements BaseObject.
Definition at line 483 of file IntersectionOfWalls.cc.
|
overridevirtual |
Move the IntersectionOfWalls to a new position, which is a Vec3D from the old position.
[in] | move | A reference to a Vec3D that denotes the direction and length it should be moved with. |
A function that moves the InterSectionOfWalls in a certain direction by both moving the walls and all intersections. Note that the directions of the intersections are not moved since they don't change when moving the IntersectionOfWalls as a whole.
Reimplemented from BaseInteractable.
Definition at line 430 of file IntersectionOfWalls.cc.
References A_, C_, BaseInteractable::move(), and wallObjects_.
IntersectionOfWalls & IntersectionOfWalls::operator= | ( | const IntersectionOfWalls & | other | ) |
Copy assignment operator.
[in] | other | The IntersectionOfWalls that must be copied. |
Definition at line 80 of file IntersectionOfWalls.cc.
References copy(), DEBUG, and logger.
|
overridevirtual |
Reads an IntersectionOfWalls from an input stream, for example a restart file.
[in] | is | The input stream from which the IntersectionOfWalls is read, usually a restart file. |
Reimplemented from BaseWall.
Definition at line 450 of file IntersectionOfWalls.cc.
References addObject(), and BaseWall::read().
Referenced by AxisymmetricIntersectionOfWalls::read().
|
overridevirtual |
A function which sets the WallHandler for this BaseWall.
[in] | handler | A pointer to the BaseHandler that handles this wall. |
Reimplemented from BaseWall.
Definition at line 106 of file IntersectionOfWalls.cc.
References BaseWall::setHandler(), and wallObjects_.
void IntersectionOfWalls::setSpecies | ( | const ParticleSpecies * | species | ) |
sets species of subwalls as well
Definition at line 68 of file IntersectionOfWalls.cc.
References BaseWall::setSpecies(), and wallObjects_.
Referenced by ChuteWithHopper::addHopper(), IntersectionOfWalls(), WallHandler::readObject(), and WallHandler::readOldObject().
|
overridevirtual |
Writes an IntersectionOfWalls to an output stream, for example a restart file.
[in] | os | The output stream where the IntersectionOfWalls must be written to, usually a restart file. |
Reimplemented from BaseWall.
Definition at line 470 of file IntersectionOfWalls.cc.
References wallObjects_, and BaseWall::write().
Referenced by AxisymmetricIntersectionOfWalls::write().
|
overridevirtual |
adds extra information to the points and triangleStrips vectors needed to plot the wall in vtk format
points | Coordinates of the vertices of the triangulated surfaces (in the VTK file this is called POINTS) |
triangleStrips | Indices of three vertices forming one triangulated surface (in the VTK file this is called CELL) |
Reimplemented from BaseWall.
Definition at line 488 of file IntersectionOfWalls.cc.
References BaseWall::intersectVTK(), and wallObjects_.
|
private |
A vector that stores a point for each intersecting line between two different InfiniteWall.
A[n*(n-1)/2+m] is a point on the intersecting line between walls m and n, m<n.
Definition at line 184 of file IntersectionOfWalls.h.
Referenced by addObject(), clear(), getDistanceAndNormal(), IntersectionOfWalls(), and move().
|
private |
A vector that stores the direction of the intersecting lines between two different InfiniteWall.
AB[n*(n-1)/2+m] is the direction of the intersecting line between walls m and n, m<n.
Definition at line 191 of file IntersectionOfWalls.h.
Referenced by addObject(), clear(), getDistanceAndNormal(), and IntersectionOfWalls().
|
private |
A vector that stores the intersection point of three different InfiniteWall.
C[(n-2)*(n-1)*n/6+(m-1)*m/2+l] is a point intersecting walls l, m and n, l<m<n
Definition at line 198 of file IntersectionOfWalls.h.
Referenced by addObject(), clear(), getDistanceAndNormal(), IntersectionOfWalls(), and move().
|
protected |
The wall "segments"/directions that together make up the finite wall.
An intersection of walls exists of a number of infinite walls that are cut of at the intersection points. These InfiniteWall are saved in this vector called iWObjects_.
Definition at line 176 of file IntersectionOfWalls.h.
Referenced by addObject(), clear(), getDistanceAndNormal(), IntersectionOfWalls(), move(), setHandler(), setSpecies(), write(), AxisymmetricIntersectionOfWalls::writeVTK(), and writeVTK().