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

Use ScrewsymmetricIntersectionOfWalls to define screwsymmetric walls, such as cylinders, cones, etc. More...

#include <ScrewsymmetricIntersectionOfWalls.h>

+ Inheritance diagram for ScrewsymmetricIntersectionOfWalls:

Public Member Functions

 ScrewsymmetricIntersectionOfWalls ()
 Default constructor. More...
 
 ScrewsymmetricIntersectionOfWalls (const ScrewsymmetricIntersectionOfWalls &p)
 Copy constructor. More...
 
 ScrewsymmetricIntersectionOfWalls (Vec3D position, Vec3D normal, std::vector< normalAndPosition > walls, const ParticleSpecies *species)
 Constructor setting values. More...
 
 ~ScrewsymmetricIntersectionOfWalls () override
 Destructor. More...
 
ScrewsymmetricIntersectionOfWallsoperator= (const ScrewsymmetricIntersectionOfWalls &other)
 Copy assignment operator. More...
 
ScrewsymmetricIntersectionOfWallscopy () 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 final
 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...
 
void computeNormalRadialDeltaN (const Vec3D &positionLabFrame, Vec3D &normalVector, Vec3D &radialVector, Mdouble &deltaN) const
 
Mdouble computeDeltaZ (const Vec3D &positionLabFrame, Mdouble h, Mdouble pitch) const
 
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 convertLimits (Vec3D &min, Vec3D &max) const
 
void writeVTK (VTKContainer &vtk) const override
 
void setRightHandedness (bool rightHandedness)
 
bool getRightHandedness () const
 
void setPitch (Mdouble pitch)
 
Mdouble getPitch () const
 
void setThickness (Mdouble thickness)
 
Mdouble getThickness () const
 
void setLength (Mdouble length)
 
Mdouble getLength () const
 
- Public Member Functions inherited from IntersectionOfWalls
 IntersectionOfWalls ()
 Default constructor. More...
 
 IntersectionOfWalls (const IntersectionOfWalls &other)
 Copy constructor. More...
 
 IntersectionOfWalls (const std::vector< normalAndPosition > &walls, const ParticleSpecies *species)
 Constructor setting values. More...
 
 ~IntersectionOfWalls () override
 Destructor. More...
 
IntersectionOfWallsoperator= (const IntersectionOfWalls &other)
 
void clear ()
 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...
 
unsigned int getNumberOfObjects ()
 Returns the number of objects. More...
 
void addObject (Vec3D normal, Vec3D point)
 Adds a wall to the set of infinite walls, given a normal vector pointing into the wall (i.e. out of the simulation domain), going through the point, so that normal*x=normal*point. More...
 
void addObject (Quaternion orientation, Vec3D position)
 
void add3PointObject (Vec3D PointA, Vec3D PointB, Vec3D PointC)
 
void setPointsAndLines (unsigned int n)
 
void addTetraSTL (Vec3D PointA, Vec3D PointB, Vec3D PointC, Vec3D WallNormal, Mdouble Thickness, int wallidentifier)
 constructs a tetrahedron for an STL file input More...
 
void addTetra (const Vec3D &PointA, const Vec3D &PointB, const Vec3D &PointC, Mdouble &Thickness)
 constructs a tetrahedron from 3 input coordinates More...
 
void addPlate (const Vec3D &PointA, const Vec3D &PointB, const Vec3D &PointC, const Vec3D &WallNormal, const Mdouble &Thickness, int wallidentifier)
 
MERCURY_DEPRECATED void addObject (Vec3D normal, Mdouble position)
 Adds a wall to the set of finite walls, given an normal vector pointing into the wall (i.e. out of the flow domain), to give a plane defined by 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. Note that if you view from inside of your geometry, the shape formed by points has to be convex, otherwise it will not create the wall correctly. 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. Note that if you view from inside of your geometry, the shape formed by points has to be convex, otherwise it will not create the wall correctly. 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. Note that if you view from inside of your geometry, the shape formed by points has to be convex, otherwise it will not create the wall correctly. 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. Note that if you view from inside of your geometry, the shape formed by points has to be convex, otherwise it will not create the wall correctly. More...
 
bool 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. More...
 
- 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 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
 
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)
 
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...
 
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
 

Public Attributes

bool rightHandedness_ = true
 The right handedness of the screw, i.e. the direction of the screw-blade. More...
 

Private Attributes

Mdouble pitch_ = 1
 axial length of one rotation More...
 
Mdouble thickness_ = 0
 The thickness of the screw blade. More...
 
Mdouble length_ = 1
 The length of the screw. More...
 

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...
 
- Protected Attributes inherited from IntersectionOfWalls
std::vector< InfiniteWallwallObjects_
 The wall "segments"/directions that together make up the finite wall. More...
 
std::vector< Vec3DC_
 A vector that stores the intersection point of three different InfiniteWall. More...
 

Detailed Description

Use ScrewsymmetricIntersectionOfWalls to define screwsymmetric walls, such as cylinders, cones, etc.

An ScrewsymmetricIntersectionOfWalls is equivalent to an IntersectionOfWalls where the Cartesian coordinate system (x,y,z) is replaced by a cylindrical coordinate system \((\hat{r},\theta,\hat{z})\). The origin and orientation of the cylindrical coordinate system is defined by the position and orientation of the wall, respectively.

In other words, a particle touches an ScrewsymmetricIntersectionOfWalls, if it touches the IntersectionOfWalls object in the \((r,\theta,z)\) coordinate system.

Thus, you need to define:

  • the position p of the wall, which is also the origin of the cylindrical coordinate system
  • the orientation o of the wall, which is the \(\hat{z}\) direction of the cylindrical coordinate system
  • a set of walls in the \((\hat{r},\theta,\hat{z})\) coordinate system, defined by a normal n and position p. Only screwsymmetric objects can be defined, thus the \(\theta \) value of the normals has to be zero.

Example 1

Say you want to define a cylindrical wall as in the left image below. If you define the origin and orientation of the cylindrical coordinate system as *(0,0,0)* and *(0,0,1)*, respectively, then the cylinder is a rectangle in the cylindrical coordinate system. Thus, you need to intersect three walls, with normals and position as indicated in the right figure below.

ScrewsymmetricWalls.png
A cylindric wall that repels particles

The following code defines such a cylinder:

w.setSpecies(species);
w.setPosition(Vec3D(0,0,0));
//arguments of addObject are normal and position of the intersected walls
w.addObject(Vec3D(-1,0,0), Vec3D(1,0,0)); //Cylindric wall
w.addObject(Vec3D(0,0,1), Vec3D(.5,0,-1)); //Bottom wall
w.addObject(Vec3D(0,0,-1), Vec3D(.5,0,1)); //Top wall
wallHandler.copyAndAddObject(w);

Example 2

Note, one can also define a cylindric casing that can be filled with particles, see image below.

ScrewsymmetricWallsOuter.png
A cylindric casing that can be filled with particles

In this case, you don't have to intersect the walls; instead you need to create three separate walls. A sample code:

w.setSpecies(species);
w.setPosition(Vec3D(0,0,0));
w.addObject(Vec3D(1,0,0), Vec3D(1,0,0)); //Cylindric wall
wallHandler.copyAndAddObject(w);
w1.set(Vec3D(0,0,-1), Vec3D(0,0,-1)); //Bottom wall
wallHandler.copyAndAddObject(w1);
w1.set(Vec3D(0,0,1), Vec3D(0,0,1)); //Top wall
wallHandler.copyAndAddObject(w1);

Example 3

Say you want a cylindrical casing with an outflow at the base. In this case, you need to define three walls:

  • The outer cylinder of radius R, height H
  • The flat top wall
  • A bottom wall which is a outer cylinder of radius r<R, with a flat top wall at z=0
ScrewsymmetricWallsSilo.png
A cylindric casing that can be filled with particles

This can be done as follows:

double R = 2;
double H = 1;
double r = 1;
w.setSpecies(species);
w.setPosition(Vec3D(0,0,0));
//normal and position of the outer shell in cylindrical coordinates
w.addObject(Vec3D(1,0,0), Vec3D(R,0,0));
wallHandler.copyAndAddObject(w);
w1.set(Vec3D(0,0,1), Vec3D(0,0,H)); //Top wall
w0.setSpecies(species);
w0.setPosition(Vec3D(0,0,0));
w0.setOrientation(Vec3D(0,0,1));
// bottom wall is an intersection of two walls, an outer cylinder of radius r and a flat top wall at z=0
w0.addObject(Vec3D(1,0,0), Vec3D(r,0,0));
w0.addObject(Vec3D(0,0,1), Vec3D(r,0,0));
wallHandler.copyAndAddObject(w0);

For a demonstration on how to use this class, see Flow through a 3D hourglass/silo.

Definition at line 125 of file ScrewsymmetricIntersectionOfWalls.h.

Constructor & Destructor Documentation

ScrewsymmetricIntersectionOfWalls::ScrewsymmetricIntersectionOfWalls ( )

Default constructor.

Definition at line 32 of file ScrewsymmetricIntersectionOfWalls.cc.

References DEBUG, ERROR, and logger.

Referenced by copy().

33 {
34  logger(ERROR, "ScrewsymmetricIntersectionOfWalls() is not yet completely implemented");
35  logger(DEBUG, "ScrewsymmetricIntersectionOfWalls() finished");
36 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
ScrewsymmetricIntersectionOfWalls::ScrewsymmetricIntersectionOfWalls ( const ScrewsymmetricIntersectionOfWalls other)

Copy constructor.

Parameters
[in]otherThe ScrewsymmetricIntersectionOfWalls that must be copied.

Definition at line 41 of file ScrewsymmetricIntersectionOfWalls.cc.

References DEBUG, ERROR, and logger.

42  : IntersectionOfWalls(other)
43 {
44  logger(ERROR, "ScrewsymmetricIntersectionOfWalls() is not yet completely implemented");
45  logger(DEBUG, "ScrewsymmetricIntersectionOfWalls(const ScrewsymmetricIntersectionOfWalls &p) finished");
46 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
IntersectionOfWalls()
Default constructor.
ScrewsymmetricIntersectionOfWalls::ScrewsymmetricIntersectionOfWalls ( Vec3D  position,
Vec3D  normal,
std::vector< normalAndPosition walls,
const ParticleSpecies species 
)

Constructor setting values.

Definition at line 48 of file ScrewsymmetricIntersectionOfWalls.cc.

References ERROR, logger, BaseInteractable::setOrientationViaNormal(), and BaseInteractable::setPosition().

51  : IntersectionOfWalls(walls, species)
52 {
53  logger(ERROR, "ScrewsymmetricIntersectionOfWalls() is not yet completely implemented");
54  setPosition(position);
55  setOrientationViaNormal(orientation);
56 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
IntersectionOfWalls()
Default constructor.
void setPosition(const Vec3D &position)
Sets the position of this BaseInteractable.
void setOrientationViaNormal(Vec3D normal)
Sets the orientation of this BaseInteractable by defining the vector that results from the rotation o...
ScrewsymmetricIntersectionOfWalls::~ScrewsymmetricIntersectionOfWalls ( )
override

Destructor.

Definition at line 58 of file ScrewsymmetricIntersectionOfWalls.cc.

References DEBUG, and logger.

59 {
60  logger(DEBUG, "~ScrewsymmetricIntersectionOfWalls() finished.");
61 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")

Member Function Documentation

Mdouble ScrewsymmetricIntersectionOfWalls::computeDeltaZ ( const Vec3D positionLabFrame,
Mdouble  h,
Mdouble  pitch 
) const

Auxiliary function that computes the oriented axial distance between the particle's centre and the blade centre

Parameters
[in]positionLabFramedistance between the starting point of the screw, start_, and the particle position (Vec3D)
[in]hThe rescaled length of the screw (length_/(2*pi*numberOfTurns_)) (Mdouble > 0)
[in]pitchThe pitch length of the screw (length_/numberOfTurns_) (Mdouble > 0)
Returns
oriented axial distance between the particle's centre and the blade centre

Definition at line 209 of file ScrewsymmetricIntersectionOfWalls.cc.

References DEBUG, BaseWall::getAxis(), BaseInteractable::getOrientation(), logger, constants::pi, rightHandedness_, Vec3D::X, Vec3D::Y, Z, and Vec3D::Z.

Referenced by computeNormalRadialDeltaN().

210 {
211  // oriented axial distance between the particle's centre and the blade centre
212  Mdouble deltaZ;
213 
214  // normal to the blade at the particle position
215  if (rightHandedness_) // right-handed thread
216  {
217  // angular coordinate of the particle
218  // IMPORTANT: this angle needs to be defined in the interval [0, +2*pi[ radians!
219  Mdouble xi = atan2(positionLabFrame.Y, positionLabFrame.X);
220  if (xi < 0.0)
221  xi += 2.0 * constants::pi;
222 
223  deltaZ = fmod(positionLabFrame.Z - h * (xi + getOrientation().getAxis().Z) -
224  static_cast<int> (positionLabFrame.Z / pitch), pitch);
225  logger(DEBUG, "xi: %, deltaZ: %", xi, deltaZ);
226  }
227  else // left-handed thread
228  {
229  // angular coordinate of the particle
230  // IMPORTANT: this angle needs to be defined in the interval [0, +2*pi[ radians!
231  Mdouble xi = atan2(-positionLabFrame.Y, positionLabFrame.X);
232  if (xi < 0.0)
233  xi += 2.0 * constants::pi;
234  xi += 0.5 * constants::pi;
235  xi = fmod(xi, 2.0 * constants::pi);
236 
237  deltaZ = fmod(positionLabFrame.Z - h * (xi + 0.5 * constants::pi - getOrientation().getAxis().Z) -
238  static_cast<int> (positionLabFrame.Z / pitch), pitch);
239  logger(DEBUG, "xi: %, deltaZ: %", xi, deltaZ);
240  }
241 
242  if (deltaZ > 0.5 * pitch)
243  {
244  deltaZ -= pitch;
245  }
246  else if (deltaZ < -0.5 * pitch)
247  {
248  deltaZ += pitch;
249  }
250  return deltaZ;
251 }
const Vec3D getAxis() const
Definition: BaseWall.cc:503
Mdouble X
the vector components
Definition: Vector.h:65
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
double Mdouble
Definition: GeneralDefine.h:34
const Mdouble pi
Definition: ExtendedMath.h:45
Mdouble Y
Definition: Vector.h:65
bool rightHandedness_
The right handedness of the screw, i.e. the direction of the screw-blade.
const Quaternion & getOrientation() const
Returns the orientation of this BaseInteractable.
Mdouble Z
Definition: Vector.h:65
void ScrewsymmetricIntersectionOfWalls::computeNormalRadialDeltaN ( const Vec3D positionLabFrame,
Vec3D normalVector,
Vec3D radialVector,
Mdouble deltaN 
) const

Computes the normal and radial vector for the screw at the position of the particle. Furthermore, it also computes deltaN, which is component of the particle-blade centre distance normal to the blade surface

Parameters
[in]pparticle whose position is used to compute the vectors and distance to the blade
[out]normalVectorthe vector in (x,y,z)-direction that points perpendicular to the screw blade
[out]radialVectorthe vector in (x,y)-direction that points outward from shaft to particle
[out]deltaNcomponent of the particle-blade_center distance normal to the blade surface

Definition at line 152 of file ScrewsymmetricIntersectionOfWalls.cc.

References computeDeltaZ(), Vec3D::getLength(), constants::pi, pitch_, rightHandedness_, thickness_, Vec3D::X, Vec3D::Y, and Vec3D::Z.

Referenced by getDistanceAndNormal().

154 {
155  // radial position of the particle
156  const Mdouble rho = std::sqrt(positionLabFrame.X * positionLabFrame.X
157  + positionLabFrame.Y * positionLabFrame.Y);
158 
159  // The rescaled length of the screw (length_/(2*pi*numberOfTurns_)).
160  const Mdouble h = 0.5 * pitch_ / constants::pi;
161 
162  // The pitch length of the screw (length_/numberOfTurns_).
163  const Mdouble deltaZ = computeDeltaZ(positionLabFrame, h, pitch_);
164 
165 
166  // trigonometric functions relative to the particle angle
167  const Mdouble cosXi = positionLabFrame.X / rho;
168  const Mdouble sinXi = positionLabFrame.Y / rho;
169  if (rightHandedness_)
170  {
171  normalVector.X = h * sinXi;
172  normalVector.Y = -h * cosXi;
173  normalVector.Z = rho;
174  }
175  else
176  {
177  normalVector.X = -h * cosXi;
178  normalVector.Y = h * sinXi;
179  normalVector.Z = rho;
180  }
181 
182  // takes the right direction (+/-) of the vector and normalizes
183  normalVector *= -deltaZ;
184  normalVector /= normalVector.getLength();
185 
186  // radial vector at the particle position
187  radialVector.X = cosXi;
188  radialVector.Y = sinXi;
189  radialVector.Z = 0.0;
190 
191  // The half-thickness of the screw.
192  const Mdouble delta = 0.5 * thickness_;
193 
194  // cosine of the helix angle at the particle position
195  const Mdouble cosEta = 1.0 / std::sqrt(1.0 + (h * h / rho / rho));
196 
197  // component of the particle-blade_center distance normal to the blade surface
198  deltaN = fabs(deltaZ) * cosEta - delta;
199 }
Mdouble X
the vector components
Definition: Vector.h:65
double Mdouble
Definition: GeneralDefine.h:34
Mdouble pitch_
axial length of one rotation
static Mdouble getLength(const Vec3D &a)
Calculates the length of a Vec3D: .
Definition: Vector.cc:331
const Mdouble pi
Definition: ExtendedMath.h:45
Mdouble computeDeltaZ(const Vec3D &positionLabFrame, Mdouble h, Mdouble pitch) const
Mdouble Y
Definition: Vector.h:65
Mdouble thickness_
The thickness of the screw blade.
bool rightHandedness_
The right handedness of the screw, i.e. the direction of the screw-blade.
Mdouble Z
Definition: Vector.h:65
void ScrewsymmetricIntersectionOfWalls::convertLimits ( Vec3D min,
Vec3D max 
) const

converts XYZ limits into RZ limits, to properly limit the VTK plotting area.

Definition at line 284 of file ScrewsymmetricIntersectionOfWalls.cc.

References BaseInteractable::getOrientation(), BaseInteractable::getPosition(), Quaternion::rotateBack(), Vec3D::X, Vec3D::Y, and Vec3D::Z.

Referenced by writeVTK().

285 {
287  Vec3D rMin = min - getPosition();
288  q.rotateBack(rMin); //set min/max initial values to values of first corner point
289  Vec3D rMax = max - getPosition();
290  q.rotateBack(rMax); //set min/max initial values to values of first corner point
291 
292  Mdouble r = std::sqrt(std::max(rMax.Y * rMax.Y + rMax.Z * rMax.Z, rMin.Y * rMin.Y + rMin.Z * rMin.Z));
293  max = Vec3D(r, 0.001, std::max(rMin.X,rMax.X));
294  min = Vec3D(0, 0, std::min(rMin.X,rMax.X));
295  //std::cout << "r=" << r << std::endl;
296 }
Implementation of a 3D quaternion (by Vitaliy).
Definition: Quaternion.h:62
const Vec3D & getPosition() const
Returns the position of this BaseInteractable.
Mdouble X
the vector components
Definition: Vector.h:65
void rotateBack(Vec3D &position) const
Applies the inverse rotation to a position.
Definition: Quaternion.cc:592
double Mdouble
Definition: GeneralDefine.h:34
Mdouble Y
Definition: Vector.h:65
Definition: Vector.h:49
const Quaternion & getOrientation() const
Returns the orientation of this BaseInteractable.
Mdouble Z
Definition: Vector.h:65
ScrewsymmetricIntersectionOfWalls * ScrewsymmetricIntersectionOfWalls::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.

Reimplemented from IntersectionOfWalls.

Definition at line 82 of file ScrewsymmetricIntersectionOfWalls.cc.

References ScrewsymmetricIntersectionOfWalls().

Referenced by operator=().

83 {
84  return new ScrewsymmetricIntersectionOfWalls(*this);
85 }
bool ScrewsymmetricIntersectionOfWalls::getDistanceAndNormal ( const BaseParticle p,
Mdouble distance,
Vec3D normal_return 
) const
finalvirtual

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 ScrewsymmetricIntersectionOfWalls would be a simple IntersectionOfWalls. Finally, the object and the normal is rotated back to the original position.

See also ScrewsymmetricIntersectionOfWalls for details.

Reimplemented from IntersectionOfWalls.

Definition at line 97 of file ScrewsymmetricIntersectionOfWalls.cc.

References computeNormalRadialDeltaN(), IntersectionOfWalls::getDistanceAndNormal(), BaseObject::getIndex(), BaseInteractable::getPosition(), BaseParticle::getWallInteractionRadius(), length_, logger, Vec3D::normalise(), thickness_, WARN, Vec3D::X, Vec3D::Y, and Vec3D::Z.

98 {
99  // squared radial position of the particle
100  const Vec3D positionLabFrame = p.getPosition() - getPosition();
101  const Mdouble rho2 = positionLabFrame.X * positionLabFrame.X + positionLabFrame.Y * positionLabFrame.Y;
102 
103  // should thickness be added here?
104  const Mdouble wallInteractionRadius = p.getWallInteractionRadius(this) + thickness_;
105 
106  // if the particle is outside the cylinder containing the screw there is no collision
107  if (//rho2 > square(rMax_ + wallInteractionRadius) ||
108  positionLabFrame.Z > length_ + p.getWallInteractionRadius(this) ||
109  positionLabFrame.Z < -p.getWallInteractionRadius(this))
110  {
111  return false;
112  }
113  Vec3D normalVector;
114  Vec3D radialVector;
115  Mdouble deltaN;
116  // positionLabFrame = normalVector + radialVector + axialVector
117  computeNormalRadialDeltaN(positionLabFrame, normalVector, radialVector, deltaN);
118 
119  // radial position of the particle
120  const Mdouble r = std::sqrt(rho2);
121 
122  //determine wall distance, normal and contact in axissymmetric coordinates
123  //and transform from axisymmetric coordinates
124  Vec3D normalRN;
125  if (!IntersectionOfWalls::getDistanceAndNormal(Vec3D(r, 0, deltaN), p.getWallInteractionRadius(this), distance, normalRN))
126  {
127  //if not in contact
128  return false;
129  }
130  else
131  {
132  //if in contact
133  if (r != 0)
134  radialVector /= r;
135  else //in this case the tangential vector is irrelevant
136  logger(WARN, "Warning: Particle % is exactly on the symmetry axis of wall %", p.getIndex(), getIndex());
137  //normal_Return = normalVector.Z * deltaN + normalVector.X * r;
138  normal_return = normalRN.Z * normalVector + normalRN.X * radialVector;
139  normal_return.normalise();
140  return true;
141  }
142 }
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.
Mdouble X
the vector components
Definition: Vector.h:65
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
double Mdouble
Definition: GeneralDefine.h:34
void normalise()
Makes this Vec3D unit length.
Definition: Vector.cc:123
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...
Mdouble getWallInteractionRadius(const BaseWall *wall) const
returns the radius plus the interactionDistance
Definition: BaseParticle.h:383
void computeNormalRadialDeltaN(const Vec3D &positionLabFrame, Vec3D &normalVector, Vec3D &radialVector, Mdouble &deltaN) const
Mdouble Y
Definition: Vector.h:65
Mdouble thickness_
The thickness of the screw blade.
Definition: Vector.h:49
Mdouble Z
Definition: Vector.h:65
Mdouble ScrewsymmetricIntersectionOfWalls::getLength ( ) const
inline

Definition at line 202 of file ScrewsymmetricIntersectionOfWalls.h.

References length_.

202 {return length_;}
std::string ScrewsymmetricIntersectionOfWalls::getName ( ) const
finalvirtual

Returns the name of the object.

Returns
The string "ScrewsymmetricIntersectionOfWalls".

Reimplemented from IntersectionOfWalls.

Definition at line 274 of file ScrewsymmetricIntersectionOfWalls.cc.

275 {
276  return "ScrewsymmetricIntersectionOfWalls";
277 }
Mdouble ScrewsymmetricIntersectionOfWalls::getPitch ( ) const
inline

Definition at line 196 of file ScrewsymmetricIntersectionOfWalls.h.

References pitch_.

196 {return pitch_;}
Mdouble pitch_
axial length of one rotation
bool ScrewsymmetricIntersectionOfWalls::getRightHandedness ( ) const
inline

Definition at line 193 of file ScrewsymmetricIntersectionOfWalls.h.

References rightHandedness_.

193 {return rightHandedness_;}
bool rightHandedness_
The right handedness of the screw, i.e. the direction of the screw-blade.
Mdouble ScrewsymmetricIntersectionOfWalls::getThickness ( ) const
inline

Definition at line 199 of file ScrewsymmetricIntersectionOfWalls.h.

References thickness_.

199 {return thickness_;}
Mdouble thickness_
The thickness of the screw blade.
ScrewsymmetricIntersectionOfWalls & ScrewsymmetricIntersectionOfWalls::operator= ( const ScrewsymmetricIntersectionOfWalls other)

Copy assignment operator.

Parameters
[in]otherThe ScrewsymmetricIntersectionOfWalls that must be copied.

Definition at line 67 of file ScrewsymmetricIntersectionOfWalls.cc.

References copy().

68 {
69  if (this == &other)
70  {
71  return *this;
72  }
73  else
74  {
75  return *(other.copy());
76  }
77 }
ScrewsymmetricIntersectionOfWalls * copy() const final
Wall copy method. It calls the copy constructor of this Wall, useful for polymorphism.
void ScrewsymmetricIntersectionOfWalls::read ( std::istream &  is)
finalvirtual

reads wall

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

Reimplemented from IntersectionOfWalls.

Definition at line 257 of file ScrewsymmetricIntersectionOfWalls.cc.

References IntersectionOfWalls::read().

258 {
260 }
void read(std::istream &is) override
Move the IntersectionOfWalls to a new position, which is a Vec3D from the old position.
void ScrewsymmetricIntersectionOfWalls::setAxis ( Vec3D  a)

Definition at line 279 of file ScrewsymmetricIntersectionOfWalls.cc.

References BaseInteractable::setOrientationViaNormal().

280 {
282 }
void setOrientationViaNormal(Vec3D normal)
Sets the orientation of this BaseInteractable by defining the vector that results from the rotation o...
void ScrewsymmetricIntersectionOfWalls::setLength ( Mdouble  length)
inline

Definition at line 201 of file ScrewsymmetricIntersectionOfWalls.h.

References length_.

201 {length_=length;}
void ScrewsymmetricIntersectionOfWalls::setPitch ( Mdouble  pitch)
inline

Definition at line 195 of file ScrewsymmetricIntersectionOfWalls.h.

References pitch_.

195 {pitch_=pitch;}
Mdouble pitch_
axial length of one rotation
void ScrewsymmetricIntersectionOfWalls::setRightHandedness ( bool  rightHandedness)
inline

Definition at line 192 of file ScrewsymmetricIntersectionOfWalls.h.

References rightHandedness_.

192 {rightHandedness_=rightHandedness;}
bool rightHandedness_
The right handedness of the screw, i.e. the direction of the screw-blade.
void ScrewsymmetricIntersectionOfWalls::setThickness ( Mdouble  thickness)
inline

Definition at line 198 of file ScrewsymmetricIntersectionOfWalls.h.

References thickness_.

198 {thickness_=thickness;}
Mdouble thickness_
The thickness of the screw blade.
void ScrewsymmetricIntersectionOfWalls::write ( std::ostream &  os) const
finalvirtual

outputs wall

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

Reimplemented from IntersectionOfWalls.

Definition at line 266 of file ScrewsymmetricIntersectionOfWalls.cc.

References IntersectionOfWalls::write().

267 {
269 }
void write(std::ostream &os) const override
Writes an IntersectionOfWalls to an output stream, for example a restart file.
void ScrewsymmetricIntersectionOfWalls::writeVTK ( VTKContainer vtk) const
overridevirtual

adds extra information to the points and triangleStrips vectors needed to plot the wall in vtk format

Parameters
pointsCoordinates of the vertices of the triangulated surfaces (in the VTK file this is called POINTS)
triangleStripsIndices of three vertices forming one triangulated surface (in the VTK file this is called CELL)
Bug:
once the quaternions are implemented, we can orient these walls properly

Reimplemented from IntersectionOfWalls.

Definition at line 298 of file ScrewsymmetricIntersectionOfWalls.cc.

References convertLimits(), mathsFunc::cos(), BaseHandler< T >::getDPMBase(), BaseWall::getHandler(), DPMBase::getMax(), DPMBase::getMin(), BaseInteractable::getOrientation(), BaseInteractable::getPosition(), BaseWall::intersectVTK(), constants::pi, VTKContainer::points, Quaternion::rotate(), mathsFunc::sin(), VTKContainer::triangleStrips, IntersectionOfWalls::wallObjects_, X, XY, and Y.

299 {
300  for (auto wall = wallObjects_.begin(); wall != wallObjects_.end(); wall++)
301  {
302  //plot each of the intersecting walls
303  std::vector<Vec3D> myPoints;
304 
305  //first create a slice of non-rotated wall in the xz plane, 0<y<1
306  Vec3D min = getHandler()->getDPMBase()->getMin();
307  Vec3D max = getHandler()->getDPMBase()->getMax();
308  convertLimits(min, max);
309 
310  //create the basic slice for the first wall using the InfiniteWall routine
311  wall->createVTK(myPoints, min, max);
312 
313  //create intersections with the other walls, similar to the IntersectionOfWalls routine
314  for (auto other = wallObjects_.begin(); other != wallObjects_.end(); other++)
315  {
316  if (other != wall)
317  {
318  intersectVTK(myPoints, -other->getNormal(), other->getPosition());
319  }
320  }
321 
322  //only keep the y=0 values
323  std::vector<Vec3D> rzVec;
324  for (auto& p: myPoints)
325  {
326  if (p.Y == 0)
327  {
328  rzVec.push_back(p);
329  }
330  }
331  if (rzVec.empty())
332  return;
333 
334  //create points on the unit circle
335  unsigned nr = 180;
336  struct XY
337  {
338  double X;
339  double Y;
340  };
341  std::vector<XY> xyVec;
342  for (unsigned ir = 0; ir < nr; ir++)
343  {
344  Mdouble angle = 2.0 * constants::pi * ir / nr;
345  xyVec.push_back({cos(angle), sin(angle)});
346  }
347 
348  //now create rings of points on the axisym. shape
350  unsigned long nPoints = vtk.points.size();
351  Vec3D p;
352  //Vec3D o = getOrientation().getAxis();
353  for (auto rz : rzVec)
354  {
355  for (auto xy : xyVec)
356  {
357  p = Vec3D(rz.Z, rz.X * xy.X, rz.X * xy.Y);
358  getOrientation().rotate(p);
359  p += getPosition();
360  vtk.points.push_back(p);
361  }
362  }
363 
364  //finally create the connectivity matri to plot shell-like triangle strips.
365  unsigned long nz = rzVec.size();
366  unsigned long nCells = vtk.triangleStrips.size();
367  for (unsigned iz = 0; iz < nz - 1; iz++)
368  {
369  std::vector<double> cell;
370  cell.reserve(2 * nr + 2);
371  for (unsigned ir = 0; ir < nr; ir++)
372  {
373  cell.push_back(nPoints + ir + iz * nr);
374  cell.push_back(nPoints + ir + (iz + 1) * nr);
375  }
376  cell.push_back(nPoints + iz * nr);
377  cell.push_back(nPoints + (iz + 1) * nr);
378  vtk.triangleStrips.push_back(cell);
379  }
380  }
381 
382 }
const Vec3D & getPosition() const
Returns the position of this BaseInteractable.
void intersectVTK(std::vector< Vec3D > &points, Vec3D normal, Vec3D position) const
Definition: BaseWall.cc:243
double Mdouble
Definition: GeneralDefine.h:34
Vec3D getMin() const
Definition: DPMBase.h:623
void rotate(Vec3D &position) const
Applies the rotation to a position.
Definition: Quaternion.cc:563
std::vector< InfiniteWall > wallObjects_
The wall "segments"/directions that together make up the finite wall.
Mdouble cos(Mdouble x)
Definition: ExtendedMath.cc:64
WallHandler * getHandler() const
A function which returns the WallHandler that handles this BaseWall.
Definition: BaseWall.cc:136
void convertLimits(Vec3D &min, Vec3D &max) const
Mdouble sin(Mdouble x)
Definition: ExtendedMath.cc:44
const Mdouble pi
Definition: ExtendedMath.h:45
std::vector< std::vector< double > > triangleStrips
Definition: BaseWall.h:39
Vec3D getMax() const
Definition: DPMBase.h:629
std::vector< Vec3D > points
Definition: BaseWall.h:38
Definition: Vector.h:49
DPMBase * getDPMBase()
Gets the problem that is solved using this handler.
Definition: BaseHandler.h:725
const Quaternion & getOrientation() const
Returns the orientation of this BaseInteractable.

Member Data Documentation

Mdouble ScrewsymmetricIntersectionOfWalls::length_ = 1
private

The length of the screw.

Definition at line 228 of file ScrewsymmetricIntersectionOfWalls.h.

Referenced by getDistanceAndNormal(), getLength(), and setLength().

Mdouble ScrewsymmetricIntersectionOfWalls::pitch_ = 1
private

axial length of one rotation

Definition at line 222 of file ScrewsymmetricIntersectionOfWalls.h.

Referenced by computeNormalRadialDeltaN(), getPitch(), and setPitch().

bool ScrewsymmetricIntersectionOfWalls::rightHandedness_ = true

The right handedness of the screw, i.e. the direction of the screw-blade.

Definition at line 205 of file ScrewsymmetricIntersectionOfWalls.h.

Referenced by computeDeltaZ(), computeNormalRadialDeltaN(), getRightHandedness(), and setRightHandedness().

Mdouble ScrewsymmetricIntersectionOfWalls::thickness_ = 0
private

The thickness of the screw blade.

Definition at line 225 of file ScrewsymmetricIntersectionOfWalls.h.

Referenced by computeNormalRadialDeltaN(), getDistanceAndNormal(), getThickness(), and setThickness().


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