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

A HorizontalBaseScrew is a copy of AxisymmetricIntersectionOfWalls, with an additional, angle-dependent component. More...

#include <HorizontalBaseScrew.h>

+ Inheritance diagram for HorizontalBaseScrew:

Public Member Functions

 HorizontalBaseScrew ()
 Default constructor. More...
 
 HorizontalBaseScrew (const HorizontalBaseScrew &p)
 Copy constructor. More...
 
 HorizontalBaseScrew (Vec3D position, Vec3D orientation, std::vector< normalAndPosition > walls, const ParticleSpecies *species, Mdouble sinA2Max, Mdouble timeMin)
 Constructor setting values. More...
 
 ~HorizontalBaseScrew ()
 Destructor. More...
 
HorizontalBaseScrewoperator= (const HorizontalBaseScrew &other)
 Copy assignment operator. More...
 
HorizontalBaseScrewcopy () 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
 
- 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)
 
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 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...
 
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

Mdouble sinA2Max_
 
Mdouble timeMin_
 

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

A HorizontalBaseScrew is a copy of AxisymmetricIntersectionOfWalls, with an additional, angle-dependent component.

All changes w.r.t. AxisymmetricIntersectionOfWalls are encapsulated in //BEGIN CHANGE and //BEGIN CHANGE

Definition at line 38 of file HorizontalBaseScrew.h.

Constructor & Destructor Documentation

HorizontalBaseScrew::HorizontalBaseScrew ( )

Default constructor.

Definition at line 31 of file HorizontalBaseScrew.cc.

References DEBUG, logger, sinA2Max_, and timeMin_.

Referenced by copy().

32 {
33  //BEGIN CHANGE
34  sinA2Max_ = 0;
35  timeMin_ = 0;
36  //END CHANGE
37  logger(DEBUG, "HorizontalBaseScrew() finished");
38 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
HorizontalBaseScrew::HorizontalBaseScrew ( const HorizontalBaseScrew other)

Copy constructor.

Parameters
[in]otherThe HorizontalBaseScrew that must be copied.

Definition at line 43 of file HorizontalBaseScrew.cc.

References DEBUG, logger, sinA2Max_, and timeMin_.

44  : IntersectionOfWalls(other)
45 {
46  //BEGIN CHANGE
47  sinA2Max_ = other.sinA2Max_;
48  timeMin_ = other.timeMin_;
49  //END CHANGE
50  logger(DEBUG, "HorizontalBaseScrew(const HorizontalBaseScrew &p) finished");
51 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")
IntersectionOfWalls()
Default constructor.
HorizontalBaseScrew::HorizontalBaseScrew ( Vec3D  position,
Vec3D  orientation,
std::vector< normalAndPosition walls,
const ParticleSpecies species,
Mdouble  sinA2Max,
Mdouble  timeMin 
)

Constructor setting values.

Definition at line 53 of file HorizontalBaseScrew.cc.

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

54  : IntersectionOfWalls(walls, species), sinA2Max_(sinA2Max), timeMin_(timeMin)
55 {
56  setPosition(position);
57  setOrientationViaNormal(orientation);
58 }
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...
HorizontalBaseScrew::~HorizontalBaseScrew ( )

Destructor.

Definition at line 60 of file HorizontalBaseScrew.cc.

References DEBUG, and logger.

61 {
62  logger(DEBUG, "~HorizontalBaseScrew() finished.");
63 }
Logger< MERCURY_LOGLEVEL > logger("MercuryKernel")

Member Function Documentation

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

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

Definition at line 178 of file HorizontalBaseScrew.cc.

References Vec3D::dot(), Quaternion::getAxis(), Vec3D::getLengthSquared(), BaseInteractable::getOrientation(), BaseInteractable::getPosition(), constants::i, Quaternion::rotate(), Vec3D::X, Vec3D::Y, Z, and Vec3D::Z.

Referenced by writeVTK().

178  {
179  //define the box in the rz plane
180  double x[2] = {min.X, max.X};
181  double y[2] = {min.Y, max.Y};
182  double z[2] = {min.Z, max.Z};
184  Vec3D o = q.getAxis();
185 
186  //look at the corner points of the domain and see that the wall is displayed in the domain (possibly a bit outside as well)
187  min -= getPosition();
188  q.rotate(min); //set min/max initial values to values of first corner point
189  max = min;
190  Mdouble maxXSquared = 0;
191  //
192  for (unsigned i=0; i<2; i++)
193  for (unsigned j=0; j<2; j++)
194  for (unsigned k=0; k<2; k++) {
195  Vec3D p = Vec3D(x[i],y[j],z[k])-getPosition();
196  Mdouble Z = Vec3D::dot(p,o);
197  Mdouble XSquared = Vec3D::getLengthSquared(p-Z*o);
198  if (XSquared>maxXSquared) maxXSquared=XSquared;
199  if (Z<min.Z) min.Z=Z;
200  if (Z>max.Z) max.Z=Z;
201  }
202  min.X = 0;
203  max.X = sqrt(maxXSquared);
204  min.Y = 0;
205  max.Y = 0.001; //unused
206  //logger(ERROR,"min % max %",min,max);
207 }
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
double Mdouble
Definition: GeneralDefine.h:34
const std::complex< Mdouble > i
Definition: ExtendedMath.h:50
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:76
void rotate(Vec3D &position) const
Applies the rotation to a position.
Definition: Quaternion.cc:563
Mdouble getLengthSquared() const
Calculates the squared length of this Vec3D: .
Definition: Vector.cc:184
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:501
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
HorizontalBaseScrew * HorizontalBaseScrew::copy ( ) const
finalvirtual

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

Returns
pointer to a IntersectionOfWalls object allocated using new.

Implements BaseWall.

Definition at line 83 of file HorizontalBaseScrew.cc.

References HorizontalBaseScrew().

Referenced by operator=().

84 {
85  return new HorizontalBaseScrew(*this);
86 }
HorizontalBaseScrew()
Default constructor.
bool HorizontalBaseScrew::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 HorizontalBaseScrew would be a simple IntersectionOfWalls. Finally, the object and the normal is rotated back to the original position.

See also HorizontalBaseScrew for details.

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

Implements BaseWall.

Definition at line 98 of file HorizontalBaseScrew.cc.

References mathsFunc::cos(), Vec3D::cross(), Vec3D::dot(), BaseInteractable::getAngularVelocity(), Quaternion::getAxis(), IntersectionOfWalls::getDistanceAndNormal(), BaseHandler< T >::getDPMBase(), BaseWall::getHandler(), BaseObject::getIndex(), Vec3D::getLength(), Vec3D::getLengthSquared(), BaseInteractable::getOrientation(), BaseInteractable::getPosition(), DPMBase::getTime(), BaseParticle::getWallInteractionRadius(), logger, mathsFunc::sin(), sinA2Max_, timeMin_, WARN, Vec3D::X, and Vec3D::Z.

99 {
100  //transform to axisymmetric coordinates
101  //move the coordinate system to the axis origin, so pOrigin=(xhat,yhat,zhat)
102  Vec3D pOrigin = p.getPosition() -getPosition();
104  Vec3D axis = getOrientation().getAxis();
105  Mdouble a = Vec3D::dot(pOrigin, axis);
106  //Vec3D(r,a) is the projection into the radial-axial plane
107  Vec3D radialDirection = pOrigin - a * axis;
108  Mdouble r = radialDirection.getLength();
109 
110  //BEGIN CHANGE
111  //if in contact
112  if (r!=0)
113  radialDirection /= r;
114  else //in this case the tangential vector is irrelevant
115  logger(WARN, "Warning: Particle % is exactly on the symmetry axis of wall %", p.getIndex(), getIndex());
116 
117  //tangential is the projection into the (xhat,yhat) plane
119  Vec3D orientation = Vec3D(cos(angle),sin(angle),0);
120  Mdouble sinA2 = Vec3D::getLengthSquared(Vec3D::cross(radialDirection,orientation));
121  if (sinA2>sinA2Max_) {
122  a+=sinA2-sinA2Max_;
123  }
124  //END CHANGE
125 
126  //determine wall distance, normal and contact in axissymmetric coordinates
127  //and transform from axisymmetric coordinates
128  Vec3D normal;
129  if (!IntersectionOfWalls::getDistanceAndNormal(Vec3D(r, 0, a), p.getWallInteractionRadius(this), distance, normal))
130  {
131  //if not in contact
132  return false;
133  }
134  else
135  {
136  //if in contact
137  if (r!=0)
138  radialDirection /= r;
139  else //in this case the tangential vector is irrelevant
140  logger(WARN, "Warning: Particle % is exactly on the symmetry axis of wall %", p.getIndex(), getIndex());
141  normalReturn = normal.Z * axis + normal.X * radialDirection;
142  //logger.assert(normalReturn.Y==0,"Error");
143  return true;
144  }
145 }
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
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...
virtual const Vec3D & getAngularVelocity() const
Returns the angular velocity of this interactable.
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:76
Mdouble getLengthSquared() const
Calculates the squared length of this Vec3D: .
Definition: Vector.cc:184
static Mdouble getLength(const Vec3D &a)
Calculates the length of a Vec3D: .
Definition: Vector.cc:331
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:501
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
Mdouble getWallInteractionRadius(const BaseWall *wall) const
returns the radius plus the interactionDistance
Definition: BaseParticle.h:383
Mdouble sin(Mdouble x)
Definition: ExtendedMath.cc:44
static Vec3D cross(const Vec3D &a, const Vec3D &b)
Calculates the cross product of two Vec3D: .
Definition: Vector.cc:163
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.
Mdouble Z
Definition: Vector.h:65
Mdouble getTime() const
Returns the current simulation time.
Definition: DPMBase.cc:797
std::string HorizontalBaseScrew::getName ( ) const
finalvirtual

Returns the name of the object.

Returns
The string "HorizontalBaseScrew".

Implements BaseObject.

Definition at line 168 of file HorizontalBaseScrew.cc.

169 {
170  return "HorizontalBaseScrew";
171 }
HorizontalBaseScrew & HorizontalBaseScrew::operator= ( const HorizontalBaseScrew other)

Copy assignment operator.

Parameters
[in]otherThe HorizontalBaseScrew that must be copied.

Definition at line 68 of file HorizontalBaseScrew.cc.

References copy().

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

reads wall

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

Reimplemented from BaseWall.

Definition at line 151 of file HorizontalBaseScrew.cc.

References IntersectionOfWalls::read().

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

Definition at line 173 of file HorizontalBaseScrew.cc.

References BaseInteractable::setOrientationViaNormal().

174 {
176 }
void setOrientationViaNormal(Vec3D normal)
Sets the orientation of this BaseInteractable by defining the vector that results from the rotation o...
void HorizontalBaseScrew::write ( std::ostream &  os) const
finalvirtual

outputs wall

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

Reimplemented from BaseWall.

Definition at line 160 of file HorizontalBaseScrew.cc.

References IntersectionOfWalls::write().

161 {
163 }
void write(std::ostream &os) const override
Writes an IntersectionOfWalls to an output stream, for example a restart file.
void HorizontalBaseScrew::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 BaseWall.

Definition at line 209 of file HorizontalBaseScrew.cc.

References convertLimits(), mathsFunc::cos(), BaseInteractable::getAngularVelocity(), Quaternion::getAxis(), BaseHandler< T >::getDPMBase(), BaseWall::getHandler(), DPMBase::getMax(), DPMBase::getMin(), BaseInteractable::getOrientation(), BaseInteractable::getPosition(), DPMBase::getTime(), BaseWall::intersectVTK(), constants::pi, VTKContainer::points, mathsFunc::sin(), sinA2Max_, timeMin_, VTKContainer::triangleStrips, IntersectionOfWalls::wallObjects_, and Vec3D::Z.

210 {
211  for (auto wall=wallObjects_.begin(); wall!=wallObjects_.end(); wall++)
212  {
213  //plot each of the intersecting walls
214  std::vector<Vec3D> myPoints;
215 
216  //first create a slice of non-rotated wall in the xz plane, 0<y<1
217  Vec3D min = getHandler()->getDPMBase()->getMin();
218  Vec3D max = getHandler()->getDPMBase()->getMax();
219  convertLimits(min, max);
220 
221  //create the basic slice for the first wall using the InfiniteWall routine
222  wall->createVTK (myPoints,min,max);
223 
224  //create intersections with the other walls, similar to the IntersectionOfWalls routine
225  for (auto other=wallObjects_.begin(); other!=wallObjects_.end(); other++)
226  {
227  if (other!=wall)
228  {
229  intersectVTK(myPoints, -other->getNormal(), other->getPosition());
230  }
231  }
232 
233  //only keep the y=0 values
234  std::vector<Vec3D> rzVec;
235  for (auto& p: myPoints)
236  {
237  if (p.Y==0)
238  {
239  rzVec.push_back(p);
240  }
241  }
242  if (rzVec.size()==0)
243  return;
244 
245  //create points on the unit circle
246  unsigned nr = 180;
247  //BEGIN CHANGE
248  std::vector<Vec3D> xyVec;
250  for (unsigned ir=0; ir<nr; ir++) {
251  Mdouble angle = 2.0 * constants::pi * ir/nr;
252 
253  Mdouble sinA2 = sin(a1 - angle); sinA2 *= sinA2;
254  Mdouble dSin = sinA2-sinA2Max_;
255 
256  xyVec.push_back(Vec3D(cos(angle),sin(angle),fmax(dSin,0)));
257  }
258  //END CHANGE
259 
260  //now create rings of points on the axisym. shape
262  unsigned nPoints = vtk.points.size();
263  Vec3D p;
264  Vec3D o = getOrientation().getAxis();
265  for (auto rz : rzVec)
266  {
267  for (auto xy : xyVec)
268  {
269  //BEGIN CHANGE
270  p = Vec3D(rz.X * xy.X, rz.X * xy.Y,fmax(rz.Z - xy.Z,0.0));
271  //getOrientation().rotate(p);
272  //END CHANGE
273  p += getPosition();
274  vtk.points.push_back(p);
275  }
276  }
277 
278  //finally create the connectivity matri to plot shell-like triangle strips.
279  unsigned nz = rzVec.size();
280  unsigned nCells = vtk.triangleStrips.size();
281  for (unsigned iz=0; iz<nz-1; iz++) {
282  std::vector<double> cell;
283  cell.reserve(2*nr+2);
284  for (unsigned ir=0; ir<nr; ir++) {
285  cell.push_back(nPoints+ir+iz*nr);
286  cell.push_back(nPoints+ir+(iz+1)*nr);
287  }
288  cell.push_back(nPoints+iz*nr);
289  cell.push_back(nPoints+(iz+1)*nr);
290  vtk.triangleStrips.push_back(cell);
291  }
292  }
293 
294 }
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 convertLimits(Vec3D &min, Vec3D &max) const
virtual const Vec3D & getAngularVelocity() const
Returns the angular velocity of this interactable.
std::vector< InfiniteWall > wallObjects_
The wall "segments"/directions that together make up the finite wall.
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:501
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
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.
Mdouble Z
Definition: Vector.h:65
Mdouble getTime() const
Returns the current simulation time.
Definition: DPMBase.cc:797

Member Data Documentation

Mdouble HorizontalBaseScrew::sinA2Max_

Definition at line 101 of file HorizontalBaseScrew.h.

Referenced by getDistanceAndNormal(), HorizontalBaseScrew(), and writeVTK().

Mdouble HorizontalBaseScrew::timeMin_

Definition at line 102 of file HorizontalBaseScrew.h.

Referenced by getDistanceAndNormal(), HorizontalBaseScrew(), and writeVTK().


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