MercuryDPM  Alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MindlinRollingTorsionInteraction.cc
Go to the documentation of this file.
1 //Copyright (c) 2013-2017, The MercuryDPM Developers Team. All rights reserved.
2 //For the list of developers, see <http://www.MercuryDPM.org/Team>.
3 //
4 //Redistribution and use in source and binary forms, with or without
5 //modification, are permitted provided that the following conditions are met:
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above copyright
9 // notice, this list of conditions and the following disclaimer in the
10 // documentation and/or other materials provided with the distribution.
11 // * Neither the name MercuryDPM nor the
12 // names of its contributors may be used to endorse or promote products
13 // derived from this software without specific prior written permission.
14 //
15 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 //ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 //WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 //DISCLAIMED. IN NO EVENT SHALL THE MERCURYDPM DEVELOPERS TEAM BE LIABLE FOR ANY
19 //DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 //(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 //LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 //ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 //(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 //SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 
26 
29 #include "Particles/BaseParticle.h"
30 #include "InteractionHandler.h"
31 #include <iomanip>
32 #include <fstream>
33 #include <DPMBase.h>
34 
41  : BaseInteraction(P, I, timeStamp), MindlinInteraction(P, I, timeStamp)
42 {
45 #ifdef DEBUG_CONSTRUCTOR
46  std::cout<<"MindlinRollingTorsionInteraction::MindlinRollingTorsionInteraction() finished"<<std::endl;
47 #endif
48 }
49 
50 //used for mpi
53 {
56 #ifdef DEBUG_CONSTRUCTOR
57  std::cout<<"MindlinRollingTorsionInteraction::MindlinRollingTorsionInteraction() finished"<<std::endl;
58 #endif
59 }
60 
66 {
69 #ifdef DEBUG_CONSTRUCTOR
70  std::cout<<"MindlinRollingTorsionInteraction::MindlinRollingTorsionInteraction(const MindlinRollingTorsionInteraction& p) finished"<<std::endl;
71 #endif
72 }
77 {
78 #ifdef DEBUG_DESTRUCTOR
79  std::cout<<"MindlinRollingTorsionInteraction::~MindlinRollingTorsionInteraction() finished"<<std::endl;
80 #endif
81 }
85 void MindlinRollingTorsionInteraction::write(std::ostream& os) const
86 {
88  os << " rollingSpring " << rollingSpring_;
89  os << " torsionSpring " << torsionSpring_;
90 }
95 {
97  std::string dummy;
98  is >> dummy >> rollingSpring_;
99  is >> dummy >> torsionSpring_;
100 }
105 {
107 
108  const MindlinRollingTorsionSpecies* species = getSpecies();
109  //If tangential forces are present
110  if (getAbsoluteNormalForce() == 0.0) return;
111 
112  if (species->getRollingFrictionCoefficient() != 0.0) {
113  Mdouble rollingStiffness = tangentialStiffnessZero_;
114  Mdouble effectiveDiameter = 2.0 * getEffectiveRadius();
115 
116  //From Luding2008, objective rolling velocity (eq 15) w/o 2.0!
117  Vec3D rollingRelativeVelocity = -effectiveDiameter *
119  getP()->getAngularVelocity() - getI()->getAngularVelocity());
120 
121  if (dynamic_cast<BaseParticle *>(getI()) == 0) //if particle-wall
122  rollingSpringVelocity_ = rollingRelativeVelocity;
123  else //if particle-particle
124  {
125  const Vec3D relativeVelocity = getP()->getVelocity() - getI()->getVelocity();
126  rollingSpringVelocity_ = rollingRelativeVelocity
127  - Vec3D::dot(rollingSpring_, relativeVelocity) / getDistance() * getNormal();
128  }
129 
130  //used to Integrate the spring
131  //rollingSpringVelocity_= rollingRelativeVelocity;
132  //integrate(getHandler()->timeStep_);
134 
135  //Calculate test force acting on P including viscous force
136  Vec3D rollingForce = -rollingStiffness * rollingSpring_ -
137  species->getRollingDissipation() * rollingRelativeVelocity;
138 
139  //tangential forces are modelled by a spring-damper of elasticity kt and viscosity dispt (sticking),
140  //but the force is limited by Coulomb friction (rolling):
141  Mdouble rollingForceSquared = rollingForce.getLengthSquared();
142  if (rollingForceSquared <=
144  //if sticking (|ft|<=mu*|fn|), apply the force
145  } else {
146  //if rolling, resize the tangential force such that |ft|=mu*|fn|
147  rollingForce *= species->getRollingFrictionCoefficient() * getAbsoluteNormalForce() /
148  std::sqrt(rollingForceSquared);
149  //resize the tangential spring accordingly such ft=-k*delta-nu*relVel
150  rollingSpring_ = -(rollingForce + species->getRollingDissipation() * rollingRelativeVelocity) /
151  rollingStiffness;
152  }
153  //Add (virtual) rolling force to torque
154  addTorque(effectiveDiameter * Vec3D::cross(getNormal(), rollingForce));
155  } //end if rolling force
156 
157  if (species->getTorsionFrictionCoefficient() != 0.0) {
158  Mdouble torsionStiffness = tangentialStiffnessZero_;
160  Mdouble effectiveDiameter = 2.0 * getEffectiveRadius();
161 
162  //From Luding2008, spin velocity (eq 16) w/o 2.0!
163  Vec3D torsionRelativeVelocity = effectiveDiameter * Vec3D::dot(getNormal(), getP()->getAngularVelocity() -
164  getI()->getAngularVelocity()) *
165  getNormal();
166 
167  //Integrate the spring
168  torsionSpringVelocity_ = torsionRelativeVelocity;
169  //integrate(getHandler()->timeStep_);
170  torsionSpring_ +=
171  Vec3D::dot(torsionSpring_ + torsionSpringVelocity_ * getHandler()->getDPMBase()->getTimeStep(),
172  getNormal()) * getNormal();
173 
174  //Calculate test force acting on P including viscous force
175  Vec3D torsionForce = -torsionStiffness * torsionSpring_ -
176  species->getTorsionDissipation() * torsionRelativeVelocity;
177 
178  //tangential forces are modelled by a spring-damper of elasticity kt and viscosity dispt (sticking),
179  //but the force is limited by Coulomb friction (torsion):
180  Mdouble torsionForceSquared = torsionForce.getLengthSquared();
181  if (torsionForceSquared <=
183  //if sticking (|ft|<=mu*|fn|), apply the force
184  } else {
185  //if torsion, resize the tangential force such that |ft|=mu*|fn|
186  torsionForce *= species->getTorsionFrictionCoefficient() * getAbsoluteNormalForce() /
187  std::sqrt(torsionForceSquared);
188  //resize the tangential spring accordingly such ft=-k*delta-nu*relVel
189  torsionSpring_ = -(torsionForce + species->getTorsionDissipation() * torsionRelativeVelocity) /
190  torsionStiffness;
191  }
192  //Add (virtual) rolling force to torque
193  addTorque(effectiveDiameter * torsionForce);
194  } //end if torsion force
195 }
200 {
204 }
209 {
213 }
218 {
219  return dynamic_cast<const MindlinRollingTorsionSpecies*>(getBaseSpecies());
220 }
225 {
226  return "Friction";
227 }
232 {
234  //rollingSpring_=-rollingSpring_;
235  //rollingSpringVelocity_=-rollingSpringVelocity_;
238 }
239 
244 {
245  MindlinInteraction::rotateHistory(rotationMatrix);
246  rollingSpring_=rotationMatrix*rollingSpring_;
248  torsionSpring_=rotationMatrix*torsionSpring_;
250 }
251 
253 {
254  return rollingSpring_;
255 }
256 
258 {
259  return torsionSpring_;
260 }
261 
263 {
264  rollingSpring_ = rollingSpring;
265 }
266 
268 {
269  torsionSpring_ = torsionSpring;
270 }
271 
272 
273 
274 
275 
static Mdouble getLengthSquared(const Vec3D &a)
Calculates the squared length of a Vec3D: .
Definition: Vector.cc:291
Vec3D rollingSpringVelocity_
Stores the rate at which the rolling spring compresses or relaxes. Set in computeFrictionForce(), used in computing the amount of compression in rolling spring. Used in integrate().
void reverseHistory() override
A useful feature if one wants to return to the initial state of the springs. However, reverse history decrements the current state to the state corresponding to previous time step. Decrements the state or value of rollingSpring_, torsionSpring_ and slidingSpring_.
Mdouble getEffectiveRadius() const
Returns a Mdouble to the effective radius of the interaction. (Not corrected for the overlap) ...
void write(std::ostream &os) const override
Interaction print function, which accepts an std::ostream as input.
InteractionHandler * getHandler() const
Gets a point to the interaction handlers to which this interaction belongs.
double Mdouble
Computes the forces corresponding to sliding friction.
Vec3D torsionSpring_
Stores the amount of torsional spring compression. Set in integrate(), used in computing frictional f...
Mdouble getTorsionFrictionCoefficient() const
Allows the (dynamic) Coulomb torsion friction coefficient to be accessed.
void setZero()
Sets all elements to zero.
Definition: Vector.cc:52
void addTorque(Vec3D torque)
const MindlinRollingTorsionSpecies * getSpecies() const
Returns a const pointer of type FrictionSpecies*.
Mdouble getRollingFrictionCoefficient() const
Allows the (dynamic) Coulomb friction coefficient to be accessed.
static Mdouble dot(const Vec3D &a, const Vec3D &b)
Calculates the dot product of two Vec3D: .
Definition: Vector.cc:167
Vec3D rollingSpring_
Stores the amount of rolling spring compression. Set in integrate(), used in computing frictional for...
Mdouble getRollingDissipation() const
Allows the tangential viscosity to be accessed.
T square(T val)
squares a number
Definition: ExtendedMath.h:91
void integrate(Mdouble timeStep) override
Increments the amount of compression in sliding spring.
Stores information about interactions between two interactable objects; often particles but could be ...
void computeFrictionForce()
Computes the forces arising due to all three types of friction, i.e., sliding, rolling and torsional...
Mdouble getElasticEnergy() const override
Returns the global amount of energy stored in all the springs (rolling, sliding and torsional)...
void reverseHistory() override
A useful feature if one wants to return to the initial state of the spring. However, reverse history decrements the current state to the state corresponding to previous time step. Decrements the value of slidingSpring_.
const BaseSpecies * getBaseSpecies() const
Return a constant point to BaseSpecies of the interaction.
void rotateHistory(Matrix3D &rotationMatrix) override
When periodic particles are used, some interactions need certain history properties rotated (e...
void rotateHistory(Matrix3D &rotationMatrix) override
When periodic particles are used, some interactions need certain history properties rotated (e...
Vec3D torsionSpringVelocity_
Stores the rate at which the torsional spring compresses or relaxes. Set in computeFrictionForce(), used in computing the amount of compression in torsion spring. Used in integrate().
void computeFrictionForce()
Computes the tangential force generated due to compression in the sliding spring. Does take into acco...
const Vec3D & getNormal() const
Gets the normal vector between the two interacting objects.
Mdouble getElasticEnergy() const override
Returns the amount of elastic energy stored in sliding spring.
Mdouble getTorsionFrictionCoefficientStatic() const
Allows the static Coulomb torsion friction coefficient to be accessed.
void read(std::istream &is) override
Interaction read function, which accepts an std::istream as input.
static Vec3D cross(const Vec3D &a, const Vec3D &b)
Calculates the cross product of two Vec3D: .
Definition: Vector.cc:255
void integrate(Mdouble timeStep) override
Computes the amount of compression in all the springs, i.e., increments the rollingSpring_, slidingSpring_ (see MindlinInteraction.cc) and torsionSpring_.
std::string getBaseName() const
Returns interaction name/type.
This class allows one to take all three types of frictional interactions into account. The sliding, rolling and torsional frictional interaction. See.
BaseInteractable * getI()
Mdouble getDistance() const
Returns an Mdouble which is the norm (length) of distance vector.
Mdouble getTorsionDissipation() const
Allows the torsion viscosity to be accessed.
Mdouble getRollingFrictionCoefficientStatic() const
Allows the static Coulomb rolling friction coefficient to be accessed.
Defines the basic properties that a interactable object can have.
BaseInteractable * getP()
Returns a pointer to first object involved in the interaction (normally a particle).
Implementation of a 3D matrix.
Definition: Matrix.h:36
virtual const Vec3D & getVelocity() const
Returns the velocity of this interactable.
Implementation of a 3D vector (by Vitaliy).
Definition: Vector.h:45
DPMBase * getDPMBase()
Gets the problem that is solved using this handler.
Definition: BaseHandler.h:543
Mdouble getTimeStep() const
Allows the time step dt to be accessed.
Definition: DPMBase.cc:465
MindlinRollingTorsionSpecies contains the parameters used to describe sliding, rolling and torsional ...
void write(std::ostream &os) const override
Interaction write function, which accepts an std::ostream as input.
void read(std::istream &is) override
Interaction read function, which accepts an std::istream as input.
Mdouble getAbsoluteNormalForce() const
Returns the absolute value of the norm (length) of the Normal force vector.