ArcWall Class Reference

A wall that is the inside (concave side) of an arc of a cylinder, like a pipe or half-pipe. More...

#include <ArcWall.h>

+ Inheritance diagram for ArcWall:

Public Member Functions

 ArcWall ()
 Default constructor. More...
 
 ArcWall (const ArcWall &aw)
 Copy constructor. More...
 
 ~ArcWall () override=default
 Default destructor. More...
 
void set (Vec3D axis, Vec3D pos, Mdouble radius, Vec3D centreline, Mdouble semiangle)
 Set parameters of the ArcWall. More...
 
ArcWallcopy () const override
 Pure virtual function that can be overwritten in inherited classes in order to copy a BaseWall. More...
 
bool getDistanceAndNormal (const BaseParticle &p, Mdouble &distance, Vec3D &normal) const override
 Pure virtual function that computes the distance of a BaseParticle to this wall and returns the normal of this wall if there is a collision. More...
 
BaseInteractiongetInteractionWith (BaseParticle *p, unsigned timeStamp, InteractionHandler *interactionHandler) override
 Returns the interaction between this object and a given BaseParticle. More...
 
void read (std::istream &is) override
 Reads a BaseInteractable from an input stream. More...
 
void write (std::ostream &os) const override
 Write a BaseInteractable to an output stream. More...
 
std::string getName () const override
 A purely virtual function. More...
 
- Public Member Functions inherited from BaseWall
 BaseWall ()
 Default constructor. More...
 
 BaseWall (const BaseWall &w)
 Copy constructor. More...
 
 ~BaseWall () override
 Default destructor. More...
 
void read (std::istream &is) override
 Function that reads a BaseWall from an input stream, usually a restart file. More...
 
void write (std::ostream &os) const override
 Function that writes a BaseWall to an output stream, usually a restart file. More...
 
virtual bool getDistanceNormalOverlap (const BaseParticle &P, Mdouble &distance, Vec3D &normal_return, Mdouble &overlap) const
 
virtual bool getDistanceNormalOverlapSuperquadric (const SuperQuadricParticle &p, Mdouble &distance, Vec3D &normal_return, Mdouble &overlap) const
 
virtual Vec3D getFurthestPointSuperQuadric (const Vec3D &normalBodyFixed, const Vec3D &axes, Mdouble eps1, Mdouble eps2) 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 BaseInteractiongetInteractionWithSuperQuad (SuperQuadricParticle *p, unsigned timeStamp, InteractionHandler *interactionHandler)
 
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
 
std::vector< BaseWall * > getRenderedWalls () const
 
void removeRenderedWalls ()
 
void renderWall (VTKContainer &vtk)
 
void addParticlesAtWall (unsigned numElements=50)
 
void setVelocityControl (Vec3D forceGoal, Vec3D gainFactor, Vec3D baseVelocity)
 
virtual void writeWallDetailsVTK (VTKData &data) const
 
virtual void computeWear ()
 
- 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...
 
virtual 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...
 
virtual 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...
 
virtual 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
 
virtual bool isFaceContact (const Vec3D &normal) 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

Vec3D axis_
 
Vec3D pos_
 
Mdouble radius_
 
Vec3D centreline_
 
Mdouble semiangle_
 

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 wall that is the inside (concave side) of an arc of a cylinder, like a pipe or half-pipe.

The ArcWall is specified by the cylinder's axis (in turn by a position vector and a direction vector), its radius, a 'centreline direction' (pointing from a point on the axis to a point on the middle of the arc), and the semiangle of the arc.

The semiangle is stored and specified in radians.

For a wall that is the outside of an arc, use AxisymmetricIntersectionOfWalls or Combtooth instead.

Constructor & Destructor Documentation

◆ ArcWall() [1/2]

ArcWall::ArcWall ( )

Default constructor.

32 {
33  axis_ = Vec3D(0, 0, 1);
34  pos_ = Vec3D(0, 1, 0);
35  radius_ = 1;
36  centreline_ = Vec3D(0, -1, 0);
38 }
Mdouble radius_
Definition: ArcWall.h:103
Vec3D pos_
Definition: ArcWall.h:102
Vec3D centreline_
Definition: ArcWall.h:104
Mdouble semiangle_
Definition: ArcWall.h:105
Vec3D axis_
Definition: ArcWall.h:101
Definition: Vector.h:51
const Mdouble degree
Definition: ExtendedMath.h:52

References axis_, centreline_, constants::degree, pos_, radius_, and semiangle_.

Referenced by copy().

◆ ArcWall() [2/2]

ArcWall::ArcWall ( const ArcWall aw)

Copy constructor.

40  : BaseWall(other)
41 {
42  axis_ = other.axis_;
43  pos_ = other.pos_;
44  radius_ = other.radius_;
45  centreline_ = other.centreline_;
46  semiangle_ = other.semiangle_;
47 }
BaseWall()
Default constructor.
Definition: BaseWall.cc:36

References axis_, centreline_, pos_, radius_, and semiangle_.

◆ ~ArcWall()

ArcWall::~ArcWall ( )
overridedefault

Default destructor.

Member Function Documentation

◆ copy()

ArcWall * ArcWall::copy ( ) const
overridevirtual

Pure virtual function that can be overwritten in inherited classes in order to copy a BaseWall.

Returns
A pointer to the new BaseWall.

Implements BaseWall.

64 {
65  return new ArcWall(*this);
66 }
ArcWall()
Default constructor.
Definition: ArcWall.cc:31

References ArcWall().

◆ getDistanceAndNormal()

bool ArcWall::getDistanceAndNormal ( const BaseParticle P,
Mdouble distance,
Vec3D normal_return 
) const
overridevirtual

Pure virtual function that computes the distance of a BaseParticle to this wall and returns the normal of this wall if there is a collision.

Beware, the distance and normal are output parameters, not return values!

Parameters
[in]PReference to the BaseParticle we want to compute the distance to the BaseWall of.
[out]distanceDistance of the BaseParticle to the BaseWall.
[out]normal_returnThe normal of the wall. Is only given if there is a collision.
Returns
A boolean which indicates if there is a collision between the BaseParticle and the wall.

Implements BaseWall.

71 {
72  Vec3D nearestPointOnAxis = pos_ + Vec3D::dot(p.getPosition() - pos_, axis_) * axis_;
73  Mdouble distanceFromAxis = (p.getPosition() - nearestPointOnAxis).getLength();
74  // distance between x0 and the surface
75  distance = radius_ - distanceFromAxis;
76  if (distance >= p.getWallInteractionRadius(this))
77  return false;
78 
79  // the normal points into the wall, i.e. out from the axis
80  normal = p.getPosition() - nearestPointOnAxis;
81  normal.normalise();
82 
83  // If the arc is actually a full circle then there is definitely an
84  // interaction, regardless of direction.
85  if (semiangle_ >= 180. * constants::degree)
86  return true;
87 
88  // Otherwise it depends on whether the interaction direction is
89  // sufficiently aligned with the centreline.
90  return acos(Vec3D::dot(normal, centreline_)) < semiangle_;
91 }
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
void normalise()
Makes this Vec3D unit length.
Definition: Vector.cc:123

References axis_, centreline_, constants::degree, Vec3D::dot(), BaseInteractable::getPosition(), BaseParticle::getWallInteractionRadius(), Vec3D::normalise(), pos_, radius_, and semiangle_.

Referenced by getInteractionWith().

◆ getInteractionWith()

BaseInteraction * ArcWall::getInteractionWith ( BaseParticle P,
unsigned  timeStamp,
InteractionHandler interactionHandler 
)
overridevirtual

Returns the interaction between this object and a given BaseParticle.

Todo:

TW make sure this function sets normal, distance, overlap, contact point

AT why is this a BaseParticle and not a BaseInteratable.

Todo:
Hacked please fix @Thomas

Implements BaseInteractable.

96 {
97  Mdouble distance;
98  Vec3D normal;
99  if (getDistanceAndNormal(*p, distance, normal))
100  {
101  BaseInteraction* c = interactionHandler->getInteraction(p, this, timeStamp);
102  c->setNormal(-normal);
103  c->setDistance(distance);
104  c->setOverlap(p->getRadius() - distance);
105  c->setContactPoint(p->getPosition() - (p->getRadius() - 0.5 * c->getOverlap()) * c->getNormal());
107  return c;
108  }
109  else
110  return nullptr;
111 }
bool getDistanceAndNormal(const BaseParticle &p, Mdouble &distance, Vec3D &normal) const override
Pure virtual function that computes the distance of a BaseParticle to this wall and returns the norma...
Definition: ArcWall.cc:68
Stores information about interactions between two interactable objects; often particles but could be ...
Definition: BaseInteraction.h:60
void setDistance(Mdouble distance)
Sets the interaction distance between the two interacting objects.
Definition: BaseInteraction.cc:221
void setContactPoint(Vec3D contactPoint)
Set the location of the contact point between the two interacting objects.
Definition: BaseInteraction.cc:240
const Vec3D & getNormal() const
Gets the normal vector between the two interacting objects.
Definition: BaseInteraction.h:226
void setNormal(Vec3D normal)
Sets the normal vector between the two interacting objects.
Definition: BaseInteraction.cc:212
Mdouble getOverlap() const
Returns a Mdouble with the current overlap between the two interacting objects.
Definition: BaseInteraction.h:240
void setOverlap(Mdouble overlap)
Set the overlap between the two interacting object.
Definition: BaseInteraction.cc:231
BaseInteraction * getInteraction(BaseInteractable *P, BaseInteractable *I, unsigned timeStamp)
Returns the Interaction between the BaseInteractable's P and I.
Definition: InteractionHandler.cc:146

References getDistanceAndNormal(), InteractionHandler::getInteraction(), BaseInteraction::getNormal(), BaseInteraction::getOverlap(), BaseInteractable::getPosition(), BaseParticle::getRadius(), BaseInteraction::setContactPoint(), BaseInteraction::setDistance(), BaseInteraction::setNormal(), and BaseInteraction::setOverlap().

◆ getName()

std::string ArcWall::getName ( ) const
overridevirtual

A purely virtual function.

Implements BaseObject.

135 {
136  return "ArcWall";
137 }

◆ read()

void ArcWall::read ( std::istream &  is)
overridevirtual

Reads a BaseInteractable from an input stream.

BaseInteacatable read functions. Reads in all the information about an interacatable. Note, this can be from any istream but would normally be a file See also BaseInteractable::write

Parameters
[in]isstd::istream to which the information is read from.

Reimplemented from BaseInteractable.

114 {
115  BaseWall::read(is);
116  std::string dummy;
117  is >> dummy >> axis_
118  >> dummy >> pos_
119  >> dummy >> radius_
120  >> dummy >> centreline_
121  >> dummy >> semiangle_;
122 }
void read(std::istream &is) override
Function that reads a BaseWall from an input stream, usually a restart file.
Definition: BaseWall.cc:78

References axis_, centreline_, pos_, radius_, BaseWall::read(), and semiangle_.

◆ set()

void ArcWall::set ( Vec3D  axis,
Vec3D  pos,
Mdouble  radius,
Vec3D  centreline,
Mdouble  semiangle 
)

Set parameters of the ArcWall.

\detail The axis vector is normalized. The centreline vector is also treated to remove any component parallel to the axis, and the remaining component is normalized.

Parameters
axisThe lengthwise direction of the cylinder. For a 2D simulation this should be Vec3D(0, 0, 1).
posA position along the axis.
radiusThe radius of the arc.
centrelineA vector pointing from the axis to the middle of the arc.
semiangleThe extent of the arc from either side of the centre, in radians. For a half-pipe this is pi/2 (90 degrees).
50 {
51  axis_ = axis;
52  pos_ = pos;
53  radius_ = radius;
54  centreline_ = centreline;
55  semiangle_ = semiangle;
56 
57  /* Normalise axis_ and centreline_, and make centreline_ perpendicular to axis_ */
58  axis_.normalise();
61 }

References axis_, centreline_, Vec3D::dot(), Vec3D::normalise(), pos_, radius_, and semiangle_.

◆ write()

void ArcWall::write ( std::ostream &  os) const
overridevirtual

Write a BaseInteractable to an output stream.

Parameters
[in]osThe output stream to which the BaseInteractable is written.

BaseInteractable write function. Writes out all the information required to recreate this interactable. To write this interactable to the screen call write(std::cout). See also BaseInteractable::read

Parameters
[in]osstd::ostream to which the information is written. Note, is any ostream is can be file or screen.
Todo:
take the zero out

Reimplemented from BaseInteractable.

125 {
126  BaseWall::write(os);
127  os << " axis " << axis_
128  << " pos " << pos_
129  << " radius " << radius_
130  << " centreline " << centreline_
131  << " semiangle " << semiangle_;
132 }
void write(std::ostream &os) const override
Function that writes a BaseWall to an output stream, usually a restart file.
Definition: BaseWall.cc:100

References axis_, centreline_, pos_, radius_, semiangle_, and BaseWall::write().

Member Data Documentation

◆ axis_

Vec3D ArcWall::axis_
private

◆ centreline_

Vec3D ArcWall::centreline_
private

◆ pos_

Vec3D ArcWall::pos_
private

◆ radius_

Mdouble ArcWall::radius_
private

◆ semiangle_

Mdouble ArcWall::semiangle_
private

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