AxisymmetricIntersectionOfWalls Class Reference

Use AxisymmetricIntersectionOfWalls to Screw Screw::read Screw::read Screw::read define axisymmetric walls, such as cylinders, cones, etc. More...

#include <AxisymmetricIntersectionOfWalls.h>

+ Inheritance diagram for AxisymmetricIntersectionOfWalls:

Public Member Functions

 AxisymmetricIntersectionOfWalls ()
 Default constructor. More...
 
 AxisymmetricIntersectionOfWalls (const AxisymmetricIntersectionOfWalls &p)
 Copy constructor. More...
 
 AxisymmetricIntersectionOfWalls (Vec3D position, Vec3D normal, std::vector< normalAndPosition > walls, const ParticleSpecies *species)
 Constructor setting values. More...
 
 ~AxisymmetricIntersectionOfWalls () override
 Destructor. More...
 
AxisymmetricIntersectionOfWallsoperator= (const AxisymmetricIntersectionOfWalls &other)
 Copy assignment operator. More...
 
AxisymmetricIntersectionOfWallscopy () 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 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 writeVTK (VTKContainer &vtk, Vec3D min, Vec3D max) const
 
const std::vector< Mdouble > & getDisplayedSegments () const
 Gets the displayed segments. More...
 
void setDisplayedSegments (const std::vector< Mdouble > &displayedSegments)
 Sets the displayed segments. More...
 
- 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)
 
IntersectionOfWallscopy () const override
 Wall copy method. It calls the copy constructor of this Wall, useful for polymorphism. More...
 
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)
 
MERCURYDPM_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 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 &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...
 
void read (std::istream &is) override
 Move the IntersectionOfWalls to a new position, which is a Vec3D from the old position. 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. 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...
 
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

std::vector< MdoubledisplayedSegments_
 The starting end ending points of segments that are displayed in VTK. 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 AxisymmetricIntersectionOfWalls to Screw Screw::read Screw::read Screw::read define axisymmetric walls, such as cylinders, cones, etc.

An AxisymmetricIntersectionOfWalls 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 AxisymmetricIntersectionOfWalls, 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 axisymmetric 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.

A cylindric wall that repels particles

The following code defines such a cylinder:

w.setSpecies(species);
w.setPosition(Vec3D(0,0,0));
w.setOrientation(Vec3D(0,0,1));
//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);
RowVector3d w
Definition: Matrix_resize_int.cpp:3
Use AxisymmetricIntersectionOfWalls to Screw Screw::read Screw::read Screw::read define axisymmetric ...
Definition: AxisymmetricIntersectionOfWalls.h:105
Definition: Kernel/Math/Vector.h:30

Example 2

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

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.setOrientation(Vec3D(0,0,1));
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);
A infinite wall fills the half-space {point: (position_-point)*normal_<=0}.
Definition: InfiniteWall.h:27
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: InfiniteWall.cc:97

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
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));
w.setOrientation(Vec3D(0,0,1));
//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);
MatrixXf H
Definition: HessenbergDecomposition_matrixH.cpp:4
@ R
Definition: StatisticsVector.h:21
virtual void setOrientation(const Quaternion &orientation)
Sets the orientation of this BaseInteractable.
Definition: BaseInteractable.h:239
virtual void setPosition(const Vec3D &position)
Sets the position of this BaseInteractable.
Definition: BaseInteractable.h:218
void addObject(Vec3D normal, Vec3D point)
Adds a wall to the set of infinite walls, given a normal vector pointing into the wall (i....
Definition: IntersectionOfWalls.cc:117
void setSpecies(const ParticleSpecies *species)
sets species of subwalls as well
Definition: IntersectionOfWalls.cc:51
r
Definition: UniformPSDSelfTest.py:20

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

Constructor & Destructor Documentation

◆ AxisymmetricIntersectionOfWalls() [1/3]

AxisymmetricIntersectionOfWalls::AxisymmetricIntersectionOfWalls ( )

Default constructor.

11 {
12  logger(DEBUG, "AxisymmetricIntersectionOfWalls() finished");
13 }
Logger< MERCURYDPM_LOGLEVEL > logger("MercuryKernel")
Definition of different loggers with certain modules. A user can define its own custom logger here.
@ DEBUG

References DEBUG, and logger.

Referenced by copy().

◆ AxisymmetricIntersectionOfWalls() [2/3]

AxisymmetricIntersectionOfWalls::AxisymmetricIntersectionOfWalls ( const AxisymmetricIntersectionOfWalls other)

Copy constructor.

Parameters
[in]otherThe AxisymmetricIntersectionOfWalls that must be copied.
19  : IntersectionOfWalls(other)
20 {
22  logger(DEBUG, "AxisymmetricIntersectionOfWalls(const AxisymmetricIntersectionOfWalls &p) finished");
23 }
std::vector< Mdouble > displayedSegments_
The starting end ending points of segments that are displayed in VTK.
Definition: AxisymmetricIntersectionOfWalls.h:203
IntersectionOfWalls()
Default constructor.
Definition: IntersectionOfWalls.cc:12

References DEBUG, displayedSegments_, and logger.

◆ AxisymmetricIntersectionOfWalls() [3/3]

AxisymmetricIntersectionOfWalls::AxisymmetricIntersectionOfWalls ( Vec3D  position,
Vec3D  normal,
std::vector< normalAndPosition walls,
const ParticleSpecies species 
)

Constructor setting values.

28  : IntersectionOfWalls(walls, species)
29 {
30  setPosition(position);
31  setOrientationViaNormal(orientation);
32 }
void setOrientationViaNormal(Vec3D normal)
Sets the orientation of this BaseInteractable by defining the vector that results from the rotation o...
Definition: BaseInteractable.cc:177

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

◆ ~AxisymmetricIntersectionOfWalls()

AxisymmetricIntersectionOfWalls::~AxisymmetricIntersectionOfWalls ( )
override

Destructor.

35 {
36  logger(DEBUG, "~AxisymmetricIntersectionOfWalls() finished.");
37 }

References DEBUG, and logger.

Member Function Documentation

◆ convertLimits()

void AxisymmetricIntersectionOfWalls::convertLimits ( Vec3D min,
Vec3D max 
) const

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

155 {
157  Vec3D rMin = min - getPosition();
158  q.rotateBack(rMin); //set min/max initial values to values of first corner point
159  Vec3D rMax = max - getPosition();
160  q.rotateBack(rMax); //set min/max initial values to values of first corner point
161 
162  Mdouble r = std::sqrt(std::max(rMax.Y * rMax.Y + rMax.Z * rMax.Z, rMin.Y * rMin.Y + rMin.Z * rMin.Z));
163  max = Vec3D(r, 0.001, std::max(rMin.X,rMax.X));
164  min = Vec3D(0, 0, std::min(rMin.X,rMax.X));
165  //std::cout << "r=" << r << std::endl;
166 }
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
const Quaternion & getOrientation() const
Returns the orientation of this BaseInteractable.
Definition: BaseInteractable.h:209
const Vec3D & getPosition() const
Returns the position of this BaseInteractable.
Definition: BaseInteractable.h:197
This class contains the 4 components of a quaternion and the standard operators and functions needed ...
Definition: Kernel/Math/Quaternion.h:42
Mdouble Y
Definition: Kernel/Math/Vector.h:45
Mdouble Z
Definition: Kernel/Math/Vector.h:45
Mdouble X
the vector components
Definition: Kernel/Math/Vector.h:45
#define min(a, b)
Definition: datatypes.h:22
#define max(a, b)
Definition: datatypes.h:23
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019

References BaseInteractable::getOrientation(), BaseInteractable::getPosition(), max, min, Eigen::numext::q, UniformPSDSelfTest::r, sqrt(), Vec3D::X, Vec3D::Y, and Vec3D::Z.

Referenced by writeVTK().

◆ copy()

AxisymmetricIntersectionOfWalls * AxisymmetricIntersectionOfWalls::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.

59 {
60  return new AxisymmetricIntersectionOfWalls(*this);
61 }
AxisymmetricIntersectionOfWalls()
Default constructor.
Definition: AxisymmetricIntersectionOfWalls.cc:10

References AxisymmetricIntersectionOfWalls().

Referenced by operator=().

◆ getDisplayedSegments()

const std::vector<Mdouble>& AxisymmetricIntersectionOfWalls::getDisplayedSegments ( ) const
inline

Gets the displayed segments.

See also
setDisplayedSegments for more information
178 { return displayedSegments_; }

References displayedSegments_.

◆ getDistanceAndNormal()

bool AxisymmetricIntersectionOfWalls::getDistanceAndNormal ( const BaseParticle p,
Mdouble distance,
Vec3D normalReturn 
) 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 AxisymmetricIntersectionOfWalls would be a simple IntersectionOfWalls. Finally, the object and the normal is rotated back to the original position.

See also AxisymmetricIntersectionOfWalls for details.

Todo:
check, maybe orientation has to be normalized differently for axisymmetric walls (or axis needs to be normalized)

Implements BaseWall.

75 {
76  //transform to axisymmetric coordinates
77  //move the coordinate system to the axis origin, so pOrigin=(xhat,yhat,zhat)
78  Vec3D pOrigin = p.getPosition() - getPosition();
80  Vec3D axis = getOrientation().getAxis();
81  Mdouble a = Vec3D::dot(pOrigin, axis);
82  //Vec3D(r,a) is the projection into the radial-axial plane
83  Vec3D radialDirection = pOrigin - a * axis;
84  Mdouble r = radialDirection.getLength();
85  Vec3D normal;
86  //determine wall distance, normal and contact in axissymmetric coordinates
87  //and transform from axisymmetric coordinates
88  if (!IntersectionOfWalls::getDistanceAndNormal(Vec3D(r, 0, a), p.getWallInteractionRadius(this), distance, normal))
89  {
90  //if not in contact
91  return false;
92  }
93  else
94  {
95  //if in contact
96  if (r != 0)
97  radialDirection /= r;
98  else //in this case the tangential vector is irrelevant
99  logger(WARN, "Warning: Particle % is exactly on the symmetry axis of wall %", p.getIndex(), getIndex());
100  normalReturn = normal.Z * axis + normal.X * radialDirection;
101  //logger.assert_debug(normalReturn.Y==0,"Error");
102  return true;
103  }
104 }
@ WARN
float * p
Definition: Tutorial_Map_using.cpp:9
unsigned int getIndex() const
Returns the index of the object in the handler.
Definition: BaseObject.h:97
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....
Definition: IntersectionOfWalls.cc:511
Vec3D getAxis() const
Converts the quaternions into a normal vector by rotating the vector x=(1,0,0); see See Wiki for deta...
Definition: Quaternion.cc:481
static Mdouble getLength(const Vec3D &a)
Calculates the length of a Vec3D: .
Definition: Vector.cc:350
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:56
const Scalar * a
Definition: level2_cplx_impl.h:32
void normal(const Vector< double > &x, Vector< double > &normal)
Definition: free_surface_rotation.cc:65

References a, Vec3D::dot(), Quaternion::getAxis(), IntersectionOfWalls::getDistanceAndNormal(), BaseObject::getIndex(), Vec3D::getLength(), BaseInteractable::getOrientation(), BaseInteractable::getPosition(), logger, WallFunction::normal(), p, UniformPSDSelfTest::r, and WARN.

◆ getName()

std::string AxisymmetricIntersectionOfWalls::getName ( ) const
finalvirtual

Returns the name of the object.

Returns
The string "AxisymmetricIntersectionOfWalls".

Implements BaseObject.

145 {
146  return "AxisymmetricIntersectionOfWalls";
147 }

◆ operator=()

AxisymmetricIntersectionOfWalls & AxisymmetricIntersectionOfWalls::operator= ( const AxisymmetricIntersectionOfWalls other)

Copy assignment operator.

Parameters
[in]otherThe AxisymmetricIntersectionOfWalls that must be copied.
44 {
45  if (this == &other)
46  {
47  return *this;
48  }
49  else
50  {
51  return *(other.copy());
52  }
53 }
AxisymmetricIntersectionOfWalls * copy() const final
Wall copy method. It calls the copy constructor of this Wall, useful for polymorphism.
Definition: AxisymmetricIntersectionOfWalls.cc:58

References copy().

◆ read()

void AxisymmetricIntersectionOfWalls::read ( std::istream &  is)
finalvirtual

reads wall

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

Reimplemented from BaseInteractable.

111 {
113 
114  unsigned int nSegments = 0;
115  helpers::readOptionalVariable(is, "displaySegments", nSegments);
116  displayedSegments_.resize(nSegments);
117  for (unsigned int i = 0; i < nSegments; i++)
118  {
119  is >> displayedSegments_[i];
120  }
121 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
void read(std::istream &is) override
Move the IntersectionOfWalls to a new position, which is a Vec3D from the old position.
Definition: IntersectionOfWalls.cc:725
bool readOptionalVariable(std::istream &is, const std::string &name, T &variable)
Reads optional variables in the restart file.
Definition: FileIOHelpers.h:68

References displayedSegments_, i, IntersectionOfWalls::read(), and helpers::readOptionalVariable().

◆ setAxis()

◆ setDisplayedSegments()

void AxisymmetricIntersectionOfWalls::setDisplayedSegments ( const std::vector< Mdouble > &  displayedSegments)
inline

Sets the displayed segments.

The array of displayed segments consists of 2*n values, where n is the number of segments. For each segment, the starting and ending points are stored in the array. Each value corresponds to a distance from the walls' position in the direction of the normal vector.

E.g. if two segments from z=-0.2 to -0.1 and from z=0.1 to 0.2 are displayed, the array would be displayedSegments = {-0.2, -0.1, 0.1, 0.2}.

190  {
191  logger.assert_always(displayedSegments.size() % 2 == 0, "AxisymmetricIntersectionOfWalls::setDisplayedSegments: The vector displayedSegments must have a length divisible by 2.");
192  displayedSegments_ = displayedSegments;
193  }

References displayedSegments_, and logger.

Referenced by HourGlass::setupInitialConditions(), and Tutorial11::setupInitialConditions().

◆ write()

void AxisymmetricIntersectionOfWalls::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 BaseInteractable.

128 {
130 
131  if (!displayedSegments_.empty())
132  {
133  os << " displaySegments " << displayedSegments_.size();
134  for (auto segment : displayedSegments_)
135  {
136  os << " " << segment;
137  }
138  }
139 }
void write(std::ostream &os) const override
Writes an IntersectionOfWalls to an output stream, for example a restart file.
Definition: IntersectionOfWalls.cc:755

References displayedSegments_, and IntersectionOfWalls::write().

◆ writeVTK() [1/2]

void AxisymmetricIntersectionOfWalls::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)

Reimplemented from BaseWall.

169 {
170  // Determine the limits of the VTK plotting area
174 
175  if (displayedSegments_.empty())
176  {
177  writeVTK(vtk, min, max);
178  }
179  else
180  {
181  Vec3D segmentMin, segmentMax;
182  for (unsigned int segmentIdx = 0; segmentIdx +1 < displayedSegments_.size(); segmentIdx += 2)
183  {
184  segmentMax = max;
185  segmentMin = min;
186 
187  // Limit the VTK plotting area to the current segment
188  segmentMin.Z = std::max(min.Z, displayedSegments_[segmentIdx]);
189  segmentMax.Z = std::min(max.Z, displayedSegments_[segmentIdx + 1]);
190 
191  writeVTK(vtk, segmentMin, segmentMax);
192  }
193  }
194 }
void writeVTK(VTKContainer &vtk) const override
Definition: AxisymmetricIntersectionOfWalls.cc:168
void convertLimits(Vec3D &min, Vec3D &max) const
Definition: AxisymmetricIntersectionOfWalls.cc:154
DPMBase * getDPMBase()
Gets the problem that is solved using this handler.
Definition: BaseHandler.h:733
WallHandler * getHandler() const
A function which returns the WallHandler that handles this BaseWall.
Definition: BaseWall.cc:113
Vec3D getMax() const
Returns the maximum coordinates of the problem domain.
Definition: DPMBase.h:659
Vec3D getMin() const
Returns the minimum coordinates of the problem domain.
Definition: DPMBase.h:653

References convertLimits(), displayedSegments_, BaseHandler< T >::getDPMBase(), BaseWall::getHandler(), DPMBase::getMax(), DPMBase::getMin(), max, min, and Vec3D::Z.

◆ writeVTK() [2/2]

void AxisymmetricIntersectionOfWalls::writeVTK ( VTKContainer vtk,
Vec3D  min,
Vec3D  max 
) const
Bug:
once the quaternions are implemented, we can orient these walls properly
197 {
198 
199  for (auto wall = wallObjects_.begin(); wall != wallObjects_.end(); wall++)
200  {
201  //plot each of the intersecting walls
202  std::vector<Vec3D> myPoints;
203 
204  //create the basic slice for the first wall using the InfiniteWall routine
205  wall->createVTK(myPoints, min, max);
206 
207  //create intersections with the other walls, similar to the IntersectionOfWalls routine
208  for (auto other = wallObjects_.begin(); other != wallObjects_.end(); other++)
209  {
210  if (other != wall)
211  {
212  intersectVTK(myPoints, -other->getNormal(), other->getPosition());
213  }
214  }
215 
216  //only keep the y=0 values
217  std::vector<Vec3D> rzVec;
218  for (auto& p: myPoints)
219  {
220  if (p.Y == 0)
221  {
222  rzVec.push_back(p);
223  }
224  }
225  if (rzVec.empty())
226  return;
227 
228  //create points on the unit circle
229  unsigned nr = 180;
230  struct XY
231  {
232  double X;
233  double Y;
234  };
235  std::vector<XY> xyVec;
236  for (unsigned ir = 0; ir < nr; ir++)
237  {
238  Mdouble angle = 2.0 * constants::pi * ir / nr;
239  xyVec.push_back({cos(angle), sin(angle)});
240  }
241 
242  //now create rings of points on the axisym. shape
244  unsigned long nPoints = vtk.points.size();
245  Vec3D p;
246  //Vec3D o = getOrientation().getAxis();
247  for (auto rz : rzVec)
248  {
249  for (auto xy : xyVec)
250  {
251  p = Vec3D(rz.Z, rz.X * xy.X, rz.X * xy.Y);
253  p += getPosition();
254  vtk.points.push_back(p);
255  }
256  }
257 
258  //finally create the connectivity matri to plot shell-like triangle strips.
259  unsigned long nz = rzVec.size();
260  for (unsigned iz = 0; iz < nz - 1; iz++)
261  {
262  std::vector<double> cell;
263  cell.reserve(2 * nr + 2);
264  for (unsigned ir = 0; ir < nr; ir++)
265  {
266  cell.push_back(nPoints + ir + iz * nr);
267  cell.push_back(nPoints + ir + (iz + 1) * nr);
268  }
269  cell.push_back(nPoints + iz * nr);
270  cell.push_back(nPoints + (iz + 1) * nr);
271  vtk.triangleStrips.push_back(cell);
272  }
273  }
274 
275 }
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
Matrix< float, 2, 1 > xy
Definition: LLT_solve.cpp:6
@ XY
Definition: StatisticsVector.h:21
void intersectVTK(std::vector< Vec3D > &points, Vec3D normal, Vec3D position) const
Definition: BaseWall.cc:220
std::vector< InfiniteWall > wallObjects_
The wall "segments"/directions that together make up the finite wall.
Definition: IntersectionOfWalls.h:198
void rotate(Vec3D &position) const
Definition: Quaternion.cc:550
#define X
Definition: icosphere.cpp:20
double angle(const double &t)
Angular position as a function of time t.
Definition: jeffery_orbit.cc:98
const unsigned nz
Definition: ConstraintElementsUnitTest.cpp:32
const Mdouble pi
Definition: ExtendedMath.h:23
std::vector< std::vector< double > > triangleStrips
Definition: BaseWall.h:19
std::vector< Vec3D > points
Definition: BaseWall.h:18
const char Y
Definition: test/EulerAngles.cpp:32

References Jeffery_Solution::angle(), cos(), BaseInteractable::getOrientation(), BaseInteractable::getPosition(), BaseWall::intersectVTK(), max, min, Mesh_Parameters::nz, p, constants::pi, VTKContainer::points, Quaternion::rotate(), sin(), VTKContainer::triangleStrips, IntersectionOfWalls::wallObjects_, X, xy, XY, and Y.

Member Data Documentation

◆ displayedSegments_

std::vector<Mdouble> AxisymmetricIntersectionOfWalls::displayedSegments_
private

The starting end ending points of segments that are displayed in VTK.

This variable influence only the display of the wall in VTK, and has no effect on the physics of the wall.

Referenced by AxisymmetricIntersectionOfWalls(), getDisplayedSegments(), read(), setDisplayedSegments(), write(), and writeVTK().


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