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

A drum in xz-direction with centre at the origin with a certain radius. Usable with superquadric particles. More...

#include <SimpleDrumSuperquadrics.h>

+ Inheritance diagram for SimpleDrumSuperquadrics:

Public Member Functions

 SimpleDrumSuperquadrics ()
 Default constructor. More...
 
 SimpleDrumSuperquadrics (const SimpleDrumSuperquadrics &p)
 Copy constructor. More...
 
 ~SimpleDrumSuperquadrics () override
 Destructor. More...
 
SimpleDrumSuperquadricsoperator= (const SimpleDrumSuperquadrics &other)
 Copy assignment operator. More...
 
SimpleDrumSuperquadricscopy () const final
 Wall copy method. It calls the copy constructor of this Wall, useful for polymorphism. More...
 
bool getDistanceAndNormal (const BaseParticle &P, Mdouble &distance, Vec3D &normal_return) const override
 Computes the distance from the wall for a given BaseParticle and returns true if there is a collision. If there is a collision, also return the normal vector. More...
 
bool getDistanceNormalOverlapSuperquadric (const SuperQuadricParticle &p, Mdouble &distance, Vec3D &normal_return, Mdouble &overlap) const override
 
void read (std::istream &is) final
 reads wall More...
 
void write (std::ostream &os) const final
 outputs wall More...
 
std::string getName () const final
 Returns the name of the object. More...
 
void setAxis (Vec3D a)
 
void setRadius (const Mdouble &radius)
 
BaseInteractiongetInteractionWithSuperQuad (SuperQuadricParticle *p, unsigned timeStamp, InteractionHandler *interactionHandler) override
 
Vec3D getFurthestPointSuperQuadric (const Vec3D &normalBodyFixed, const Vec3D &axes, Mdouble eps1, Mdouble eps2) const override
 
- Public Member Functions inherited from BaseWall
 BaseWall ()
 Default constructor. More...
 
 BaseWall (const BaseWall &w)
 Copy constructor. More...
 
 ~BaseWall () override
 Default destructor. More...
 
virtual bool getDistanceNormalOverlap (const BaseParticle &P, Mdouble &distance, Vec3D &normal_return, Mdouble &overlap) const
 
virtual void setHandler (WallHandler *handler)
 A function which sets the WallHandler for this BaseWall. More...
 
WallHandlergetHandler () const
 A function which returns the WallHandler that handles this BaseWall. More...
 
void setIndSpecies (unsigned int indSpecies) override
 Define the species of this wall using the index of the species in the SpeciesHandler in this DPMBase. More...
 
void setSpecies (const ParticleSpecies *species)
 Defines the species of the current wall. More...
 
bool isFixed () const override
 
void setForceControl (Vec3D forceGoal, Vec3D gainFactor, Vec3D baseVelocity={0, 0, 0})
 Slowly adjusts the force on a wall towards a specified goal, by adjusting (prescribing) the velocity of the wall. More...
 
virtual bool isLocal (Vec3D &min, Vec3D &max) const
 
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, Vec3D normal, Vec3D position) const
 
virtual void writeVTK (VTKContainer &vtk) const
 
void getVTK (std::vector< Vec3D > &points, std::vector< std::vector< double >> &triangleStrips)
 
const Vec3D getAxis () const
 
BaseInteractiongetInteractionWith (BaseParticle *p, unsigned timeStamp, InteractionHandler *interactionHandler) override
 Returns the interaction between this wall and a given particle, nullptr if there is no interaction. More...
 
virtual void actionsOnRestart ()
 No implementation but can be overidden in its derived classes. More...
 
virtual void actionsAfterParticleGhostUpdate ()
 No implementation but can be overidden in its derived classes. More...
 
virtual void handleParticleAddition (unsigned int id, BaseParticle *p)
 Handles the addition of particles to the particleHandler. More...
 
virtual void handleParticleRemoval (unsigned int id)
 Handles the addition of particles to the particleHandler. More...
 
virtual void checkInteractions (InteractionHandler *interactionHandler, unsigned int timeStamp)
 Check if all interactions are valid. More...
 
bool getVTKVisibility () const
 
void setVTKVisibility (bool vtkVisibility)
 
void addRenderedWall (BaseWall *w)
 
BaseWallgetRenderedWall (size_t i) const
 
void removeRenderedWalls ()
 
void renderWall (VTKContainer &vtk)
 
void addParticlesAtWall (unsigned numElements=50)
 
void setVelocityControl (Vec3D forceGoal, Vec3D gainFactor, Vec3D baseVelocity)
 
- Public Member Functions inherited from BaseInteractable
 BaseInteractable ()
 Default BaseInteractable constructor. More...
 
 BaseInteractable (const BaseInteractable &p)
 Copy constructor. More...
 
 ~BaseInteractable () override
 Destructor, it simply destructs the BaseInteractable and all the objects it contains. More...
 
unsigned int getIndSpecies () const
 Returns the index of the species associated with the interactable object. More...
 
const ParticleSpeciesgetSpecies () const
 Returns a pointer to the species of this BaseInteractable. More...
 
void setSpecies (const ParticleSpecies *species)
 Sets the species of this BaseInteractable. More...
 
const Vec3DgetForce () const
 Returns the force on this BaseInteractable. More...
 
const Vec3DgetTorque () 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...
 
void resetForceTorque (int numberOfOMPthreads)
 
void sumForceTorqueOMP ()
 
const Vec3DgetPosition () const
 Returns the position of this BaseInteractable. More...
 
const QuaterniongetOrientation () const
 Returns the orientation of this BaseInteractable. More...
 
void setPosition (const Vec3D &position)
 Sets the position of this BaseInteractable. More...
 
void setOrientationViaNormal (Vec3D normal)
 Sets the orientation of this BaseInteractable by defining the vector that results from the rotation of the (1,0,0) vector. More...
 
void setOrientationViaEuler (Vec3D eulerAngle)
 Sets the orientation of this BaseInteractable by defining the euler angles. More...
 
void setOrientation (const Quaternion &orientation)
 Sets the orientation of this BaseInteractable. More...
 
virtual void move (const Vec3D &move)
 Moves this BaseInteractable by adding an amount to the position. More...
 
virtual void rotate (const Vec3D &angularVelocityDt)
 Rotates this BaseInteractable. More...
 
const std::vector
< BaseInteraction * > & 
getInteractions () const
 Returns a list of interactions which belong to this interactable. 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 Vec3DgetVelocity () const
 Returns the velocity of this interactable. More...
 
virtual const Vec3DgetAngularVelocity () 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< Quaternion(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...
 
virtual Mdouble getInvMass () const
 
virtual Mdouble getCurvature (const Vec3D &labFixedCoordinates) const
 
- 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

InfiniteWall wall
 
Mdouble radius_
 

Additional Inherited Members

- Static Public Member Functions inherited from BaseWall
static void addToVTK (const std::vector< Vec3D > &points, VTKContainer &vtk)
 Takes the points provided and adds a triangle strip connecting these points to the vtk container. More...
 

Detailed Description

A drum in xz-direction with centre at the origin with a certain radius. Usable with superquadric particles.

Notice that this wall contains a mutable infinite wall. This is because for contact-detection we map the infinite wall on a point with the correct distance from the origin, thereby linearising the drum. Since this infinite wall has to change normal and position for every interaction, it must be changeable in the const method getDistanceAndNormal and therefore the infinite wall must be mutable (or volatile, but that is not necessary here).

Todo:

Document

Definitions in source-file

VTK-write function

Test

Definition at line 44 of file SimpleDrumSuperquadrics.h.

Constructor & Destructor Documentation

SimpleDrumSuperquadrics::SimpleDrumSuperquadrics ( )

Default constructor.

Definition at line 31 of file SimpleDrumSuperquadrics.cc.

References DEBUG, logger, radius_, InfiniteWall::set(), and wall.

Referenced by copy().

32 {
33  logger(DEBUG, "SimpleDrumSuperquadrics() finished");
34  radius_ = 1;
35  wall.set({1,0,0}, {1,0,0});
36 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here...
void set(Vec3D normal, Vec3D point)
Defines a standard wall, given an outward normal vector s.t. normal*x=normal*point for all x of the w...
SimpleDrumSuperquadrics::SimpleDrumSuperquadrics ( const SimpleDrumSuperquadrics other)

Copy constructor.

Parameters
[in]otherThe AxisymmetricIntersectionOfWalls that must be copied.

Definition at line 41 of file SimpleDrumSuperquadrics.cc.

References DEBUG, logger, radius_, and wall.

42  : BaseWall(other)
43 {
44  wall = other.wall;
45  radius_ = other.radius_;
46  logger(DEBUG, "AxisymmetricIntersectionOfWalls(const AxisymmetricIntersectionOfWalls &p) finished");
47 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here...
BaseWall()
Default constructor.
Definition: BaseWall.cc:36
SimpleDrumSuperquadrics::~SimpleDrumSuperquadrics ( )
override

Destructor.

Definition at line 49 of file SimpleDrumSuperquadrics.cc.

References DEBUG, and logger.

50 {
51  logger(DEBUG, "SimpleDrumSuperquadricsuadrics() finished.");
52 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here...

Member Function Documentation

SimpleDrumSuperquadrics * SimpleDrumSuperquadrics::copy ( ) const
finalvirtual

Wall copy method. It calls the copy constructor of this Wall, useful for polymorphism.

Returns
pointer to a IntersectionOfWalls object allocated using new.

Implements BaseWall.

Definition at line 73 of file SimpleDrumSuperquadrics.cc.

References SimpleDrumSuperquadrics().

Referenced by operator=().

74 {
75  return new SimpleDrumSuperquadrics(*this);
76 }
SimpleDrumSuperquadrics()
Default constructor.
bool SimpleDrumSuperquadrics::getDistanceAndNormal ( const BaseParticle p,
Mdouble distance,
Vec3D normalReturn 
) const
overridevirtual

Computes the distance from the wall for a given BaseParticle and returns true if there is a collision. If there is a collision, also return the normal vector.

First, the particle is translated by the vector position_, then the distance normal and tangential to the orientation is computed. This normal and tangential direction is interpreted as the x and z coordinate. With the particle shifted into the XZ plane, the distance and normal is computed, as if the AxisymmetricIntersectionOfWalls would be a simple IntersectionOfWalls. Finally, the object and the normal is rotated back to the original position.

See also AxisymmetricIntersectionOfWalls for details.

Implements BaseWall.

Definition at line 88 of file SimpleDrumSuperquadrics.cc.

References DEBUG, BaseInteractable::getAngularVelocity(), InfiniteWall::getDistanceAndNormal(), BaseInteractable::getPosition(), logger, Vec3D::normalise(), radius_, InfiniteWall::set(), wall, and Vec3D::Y.

90 {
91  Vec3D normalDirection = p.getPosition();
92  normalDirection.Y = 0;
93  normalDirection.normalise();
94  wall.set(normalDirection, normalDirection * radius_);
95  logger(DEBUG, "setting wall to %, %", normalDirection, normalDirection * radius_);
96  logger(DEBUG, "angular velocity of wall: %", getAngularVelocity());
97  //determine wall distance, normal and contact in axissymmetric coordinates
98  //and transform from axisymmetric coordinates
99  return (wall.getDistanceAndNormal(p, distance, normalReturn));
100 }
const Vec3D & getPosition() const
Returns the position of this BaseInteractable.
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...
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here...
void normalise()
Makes this Vec3D unit length.
Definition: Vector.cc:123
virtual const Vec3D & getAngularVelocity() const
Returns the angular velocity of this interactable.
Mdouble Y
Definition: Vector.h:65
void set(Vec3D normal, Vec3D point)
Defines a standard wall, given an outward normal vector s.t. normal*x=normal*point for all x of the w...
Definition: Vector.h:49
bool SimpleDrumSuperquadrics::getDistanceNormalOverlapSuperquadric ( const SuperQuadricParticle p,
Mdouble distance,
Vec3D normal_return,
Mdouble overlap 
) const
overridevirtual

Reimplemented from BaseWall.

Definition at line 102 of file SimpleDrumSuperquadrics.cc.

References DEBUG, InfiniteWall::getDistanceNormalOverlapSuperquadric(), Vec3D::getLengthSquared(), BaseInteractable::getPosition(), logger, Vec3D::normalise(), radius_, InfiniteWall::set(), wall, and Vec3D::Y.

104 {
105  Vec3D normalDirection = p.getPosition();
106  normalDirection.Y = 0;
107  if (normalDirection.getLengthSquared() < 1e-2)
108  return false;
109  normalDirection.normalise();
110  wall.set(normalDirection, normalDirection * radius_);
111  logger(DEBUG, "setting wall to [%], [%]", normalDirection, normalDirection * radius_);
112  return wall.getDistanceNormalOverlapSuperquadric(p, distance, normal_return, overlap);
113 }
const Vec3D & getPosition() const
Returns the position of this BaseInteractable.
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here...
void normalise()
Makes this Vec3D unit length.
Definition: Vector.cc:123
bool getDistanceNormalOverlapSuperquadric(const SuperQuadricParticle &p, Mdouble &distance, Vec3D &normal_return, Mdouble &overlap) const override
Compute the distance from the wall for a given BaseParticle and return if there is a collision...
Mdouble Y
Definition: Vector.h:65
void set(Vec3D normal, Vec3D point)
Defines a standard wall, given an outward normal vector s.t. normal*x=normal*point for all x of the w...
static Mdouble getLengthSquared(const Vec3D &a)
Calculates the squared length of a Vec3D: .
Definition: Vector.h:316
Definition: Vector.h:49
Vec3D SimpleDrumSuperquadrics::getFurthestPointSuperQuadric ( const Vec3D normalBodyFixed,
const Vec3D axes,
Mdouble  eps1,
Mdouble  eps2 
) const
inlineoverridevirtual

Reimplemented from BaseWall.

Definition at line 112 of file SimpleDrumSuperquadrics.h.

References InfiniteWall::getFurthestPointSuperQuadric(), and wall.

113  {
114  return wall.getFurthestPointSuperQuadric(normalBodyFixed, axes, eps1, eps2);
115  }
Vec3D getFurthestPointSuperQuadric(const Vec3D &normalBodyFixed, const Vec3D &axes, Mdouble eps1, Mdouble eps2) const override
Largely untested, use at your own risk for anything other than ellipsoids.
BaseInteraction* SimpleDrumSuperquadrics::getInteractionWithSuperQuad ( SuperQuadricParticle p,
unsigned  timeStamp,
InteractionHandler interactionHandler 
)
inlineoverridevirtual
Todo:
make it work with screw, coil and other weird walls

Reimplemented from BaseWall.

Definition at line 106 of file SimpleDrumSuperquadrics.h.

References BaseWall::getInteractionWithSuperQuad(), and wall.

108  {
109  return wall.getInteractionWithSuperQuad(p, timeStamp, interactionHandler);
110  }
virtual BaseInteraction * getInteractionWithSuperQuad(SuperQuadricParticle *p, unsigned timeStamp, InteractionHandler *interactionHandler)
Definition: BaseWall.cc:494
std::string SimpleDrumSuperquadrics::getName ( ) const
finalvirtual

Returns the name of the object.

Returns
The string "AxisymmetricIntersectionOfWalls".

Implements BaseObject.

Definition at line 140 of file SimpleDrumSuperquadrics.cc.

141 {
142  return "SimpleDrumSuperquadrics";
143 }
SimpleDrumSuperquadrics & SimpleDrumSuperquadrics::operator= ( const SimpleDrumSuperquadrics other)

Copy assignment operator.

Parameters
[in]otherThe AxisymmetricIntersectionOfWalls that must be copied.

Definition at line 58 of file SimpleDrumSuperquadrics.cc.

References copy().

59 {
60  if (this == &other)
61  {
62  return *this;
63  }
64  else
65  {
66  return *(other.copy());
67  }
68 }
SimpleDrumSuperquadrics * copy() const final
Wall copy method. It calls the copy constructor of this Wall, useful for polymorphism.
void SimpleDrumSuperquadrics::read ( std::istream &  is)
finalvirtual

reads wall

Parameters
[in]isThe input stream from which the AxisymmetricIntersectionOfWalls is read, usually a restart file.

Reimplemented from BaseWall.

Definition at line 119 of file SimpleDrumSuperquadrics.cc.

References radius_, BaseWall::read(), InfiniteWall::read(), and wall.

120 {
121  BaseWall::read(is);
122  wall.read(is);
123  is >> radius_;
124 }
void read(std::istream &is) override
Function that reads a BaseWall from an input stream, usually a restart file.
Definition: BaseWall.cc:80
void read(std::istream &is) override
Reads InfiniteWall from a restart file.
void SimpleDrumSuperquadrics::setAxis ( Vec3D  a)

Definition at line 145 of file SimpleDrumSuperquadrics.cc.

References BaseInteractable::setOrientationViaNormal().

146 {
148 }
void setOrientationViaNormal(Vec3D normal)
Sets the orientation of this BaseInteractable by defining the vector that results from the rotation o...
void SimpleDrumSuperquadrics::setRadius ( const Mdouble radius)
inline

Definition at line 100 of file SimpleDrumSuperquadrics.h.

References INFO, logger, and radius_.

101  {
102  radius_ = radius;
103  logger(INFO, "setting drum radius to %", radius_);
104  }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here...
void SimpleDrumSuperquadrics::write ( std::ostream &  os) const
finalvirtual

outputs wall

Parameters
[in]osThe output stream where the AxisymmetricIntersectionOfWalls must be written to, usually a restart file.

Reimplemented from BaseWall.

Definition at line 130 of file SimpleDrumSuperquadrics.cc.

References radius_, wall, and BaseWall::write().

131 {
132  BaseWall::write(os);
133  wall.write(os);
134  os << radius_;
135 }
void write(std::ostream &os) const override
Function that writes a BaseWall to an output stream, usually a restart file.
Definition: BaseWall.cc:102

Member Data Documentation

Mdouble SimpleDrumSuperquadrics::radius_
private

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