All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages
single_contact.h
1 /* Copyright (C) 2004-2014 MBSim Development Team
2  *
3  * This library is free software; you can redistribute it and/or
4  * modify it under the terms of the GNU Lesser General Public
5  * License as published by the Free Software Foundation; either
6  * version 2.1 of the License, or (at your option) any later version.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public
14  * License along with this library; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16  *
17  * Contact: martin.o.foerg@googlemail.com
18  */
19 
20 #ifndef _SINGLE_CONTACT_H_
21 #define _SINGLE_CONTACT_H_
22 
23 #include <mbsim/links/contour_link.h>
24 
25 namespace MBSim {
26 
27  class ContactKinematics;
28  class GeneralizedForceLaw;
29  class GeneralizedImpactLaw;
30  class FrictionForceLaw;
31  class FrictionImpactLaw;
32 
47  class SingleContact: public ContourLink {
48 
49  friend class Contact;
50 
51  public:
56  SingleContact(const std::string &name="");
57 
58  void resetUpToDate();
59 
60  const double& evalGeneralizedNormalForce() { if(updlaN) updateGeneralizedNormalForce(); return lambdaN; }
61  const fmatvec::VecV& evalGeneralizedTangentialForce() { if(updlaT) updateGeneralizedTangentialForce(); return lambdaT; }
62 
63  double& getGeneralizedNormalForce(bool check=true) { assert((not check) or (not updlaN)); return lambdaN; }
64 
65  const double& evallaN();
66  const fmatvec::Vec& evallaT();
67 
68  const double& evalLaN();
69  const fmatvec::Vec& evalLaT();
70 
71  const double& evalgdnN();
72  const fmatvec::Vec& evalgdnT();
73 
74  const double& evalgddN();
75  const fmatvec::Vec& evalgddT();
76 
77  /* INHERITED INTERFACE OF LINKINTERFACE */
78  virtual void updatewb();
79  virtual void updateV(int i=0);
80  void updateGeneralizedNormalForce() { (this->*updateGeneralizedNormalForce_)(); updlaN = false; }
81  void updateGeneralizedTangentialForce() { (this->*updateGeneralizedTangentialForce_)(); updlaT = false; }
82  void updateGeneralizedNormalForceS();
83  void updateGeneralizedNormalForceM();
84  void updateGeneralizedNormalForceP();
85  void updateGeneralizedTangentialForceS();
86  void updateGeneralizedTangentialForceM();
87  void updateGeneralizedTangentialForce0() { }
88  void (SingleContact::*updateGeneralizedNormalForce_)();
89  void (SingleContact::*updateGeneralizedTangentialForce_)();
90  virtual void updateGeneralizedForces();
91  virtual void updateGeneralizedPositions();
92  virtual void updateGeneralizedVelocities();
93  virtual void updatePositions();
94  virtual void updatePositions(Frame *frame);
95  virtual void updateVelocities();
96  virtual void updateg();
97  virtual void updategd();
98  virtual void updateh(int i=0);
99  virtual void updateW(int i=0);
100  virtual void updateStopVector();
101  /***************************************************/
102 
103  /* INHERITED INTERFACE OF LINK */
104  virtual void updatelaRef(const fmatvec::Vec& ref);
105  virtual void updateLaRef(const fmatvec::Vec& ref);
106  virtual void updategdRef(const fmatvec::Vec& ref);
107  virtual void calcxSize();
108  virtual void calclaSize(int j);
109  virtual void calcgSize(int j);
110  virtual void calcgdSize(int j);
111  virtual void calcrFactorSize(int j);
112  virtual void calcsvSize();
113  virtual void calcLinkStatusSize();
114  virtual void calcLinkStatusRegSize();
115  virtual void init(InitStage stage);
116  virtual bool isSetValued() const;
117  virtual bool isSingleValued() const;
118  virtual void updateLinkStatus();
119  virtual void updateLinkStatusReg();
120  virtual bool isActive() const;
121  virtual bool gActiveChanged();
122  virtual bool detectImpact();
123  virtual void solveImpactsFixpointSingle();
124  virtual void solveConstraintsFixpointSingle();
125  virtual void solveImpactsGaussSeidel();
126  virtual void solveConstraintsGaussSeidel();
127  virtual void solveImpactsRootFinding();
128  virtual void solveConstraintsRootFinding();
129  virtual void jacobianConstraints();
130  virtual void jacobianImpacts();
131  virtual void updaterFactors();
132  virtual void checkConstraintsForTermination();
133  virtual void checkImpactsForTermination();
134  virtual void checkActive(int j);
135  virtual void LinearImpactEstimation(double t, fmatvec::Vec &gInActive_,fmatvec::Vec &gdInActive_,int *IndInActive_,fmatvec::Vec &gAct_,int *IndActive_);
136  virtual void SizeLinearImpactEstimation(int *sizeInActive_, int *sizeActive_);
137 
138  /***************************************************/
139 
140  /* INHERITED INTERFACE OF ELEMENT */
141  virtual std::string getType() const { return "Contact"; }
142  virtual void plot();
143  virtual void closePlot();
144  /***************************************************/
145 
152  BOOST_PARAMETER_MEMBER_FUNCTION( (void), enableOpenMBVContactPoints, tag, (optional (size,(double),1)(offset,(double),1)(transparency,(double),0))) {
153  OpenMBVFrame ombv(size,offset,"[-1;1;1]",transparency);
154  setOpenMBVContactPoints(ombv.createOpenMBV());
155  }
156  void setOpenMBVContactPoints(const std::shared_ptr<OpenMBV::Frame> &frame) {
157  openMBVContactFrame[0]=frame;
159  }
160 
166  BOOST_PARAMETER_MEMBER_FUNCTION( (void), enableOpenMBVNormalForce, tag, (optional (scaleLength,(double),1)(scaleSize,(double),1)(referencePoint,(OpenMBV::Arrow::ReferencePoint),OpenMBV::Arrow::toPoint)(diffuseColor,(const fmatvec::Vec3&),"[-1;1;1]")(transparency,(double),0))) {
167  OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
168  contactArrow=ombv.createOpenMBV();
169  }
170  void setOpenMBVNormalForce(const std::shared_ptr<OpenMBV::Arrow> &arrow) { contactArrow=arrow; }
171 
179  BOOST_PARAMETER_MEMBER_FUNCTION( (void), enableOpenMBVTangentialForce, tag, (optional (scaleLength,(double),1)(scaleSize,(double),1)(referencePoint,(OpenMBV::Arrow::ReferencePoint),OpenMBV::Arrow::toPoint)(diffuseColor,(const fmatvec::Vec3&),"[-1;1;1]")(transparency,(double),0))) {
180  OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
181  frictionArrow=ombv.createOpenMBV();
182  }
183  void setOpenMBVTangentialForce(const std::shared_ptr<OpenMBV::Arrow> &arrow) { frictionArrow=arrow; }
184 
185  /* GETTER / SETTER */
186  void setNormalForceLaw(GeneralizedForceLaw *fcl_);
187  GeneralizedForceLaw * getNormalForceLaw() const {return fcl; }
188  void setNormalImpactLaw(GeneralizedImpactLaw *fnil_);
189  void setTangentialForceLaw(FrictionForceLaw *fdf_);
190  void setTangentialImpactLaw(FrictionImpactLaw *ftil_);
191  void setContactKinematics(ContactKinematics* ck) { contactKinematics = ck; }
192  ContactKinematics* getContactKinematics() const { return contactKinematics; }
193  /***************************************************/
194 
198  virtual int getFrictionDirections() const;
199 
207 // void connect(Contour *contour1, Contour* contour2, ContactKinematics* contactKinematics = 0);
208 
209  virtual void initializeUsingXML(xercesc::DOMElement *element);
210 
211  void calccorrSize(int j);
212  void updatecorr(int j);
213 
214  void checkRoot();
215 
216  protected:
221 
226 
231 
236 
241 
248 
255 
261 
268 
272  unsigned int gActive, gActive0;
273 
274  enum Direction {
275  normal,
276  tangential,
277  DirectionDIM
278  };
279 
285  std::array<unsigned int, DirectionDIM> gdActive;
286 
292  std::array<unsigned int, DirectionDIM> gddActive;
293 
298 
303 
308 
309  double lambdaN;
310  fmatvec::VecV lambdaT;
311 
312  bool updlaN, updlaT;
313 
317  std::shared_ptr<OpenMBV::Group> openMBVContactGrp;
318 
322  std::vector<std::shared_ptr<OpenMBV::Frame> > openMBVContactFrame;
323 
327  std::shared_ptr<OpenMBV::Arrow> contactArrow, frictionArrow;
328 
336  int rootID;
337  };
338 
339 }
340 
341 #endif /* _SINGLE_CONTACT_H_ */
GeneralizedImpactLaw * fnil
force law defining relation between penetration velocity and resulting normal impulses ...
Definition: single_contact.h:235
virtual void solveImpactsGaussSeidel()
Definition: single_contact.cc:820
basic force law on acceleration level for constraint description
Definition: generalized_force_law.h:32
virtual void calcLinkStatusSize()
calculates size of vector LinkStatus
Definition: single_contact.cc:474
virtual void solveConstraintsRootFinding()
Definition: single_contact.cc:922
fmatvec::Vec gddN
gap acceleration for event driven scheme on acceleration level
Definition: single_contact.h:302
FrictionForceLaw * fdf
force law defining relation between tangential velocities and tangential forces
Definition: single_contact.h:230
virtual void checkConstraintsForTermination()
verify underlying force laws concerning given tolerances
Definition: single_contact.cc:1119
class for contacts
Definition: contact.h:48
virtual bool isSingleValued() const
asks the link if it contains single valued force laws that contribute to the right-hand side vector h...
Definition: single_contact.cc:627
std::array< unsigned int, DirectionDIM > gddActive
boolean flag symbolising activity of contact on acceleration level
Definition: single_contact.h:292
virtual void updatelaRef(const fmatvec::Vec &ref)
references to contact force parameter of dynamic system parent
Definition: single_contact.cc:252
virtual void checkImpactsForTermination()
verify underlying force laws on velocity level concerning given tolerances
Definition: single_contact.cc:1158
virtual void init(InitStage stage)
plots time series header
Definition: single_contact.cc:488
fmatvec::Vec gdnN
new gap velocity after an impact for event driven scheme
Definition: single_contact.h:297
Definition: openmbv_utils.h:54
virtual bool isSetValued() const
asks the link if it contains force laws that contribute to the lagrange multiplier and is therefore s...
Definition: single_contact.cc:620
virtual bool isActive() const
Definition: single_contact.cc:659
virtual void jacobianImpacts()
computes JACOBIAN and mass action matrix of nonlinear contact equations on velocity level ...
Definition: single_contact.cc:1006
virtual void solveImpactsFixpointSingle()
Definition: single_contact.cc:758
fmatvec::Vec gdN
relative velocity in normal direction
Definition: single_contact.h:260
int rootID
type of detected root
Definition: single_contact.h:336
virtual void calcLinkStatusRegSize()
calculates size of vector LinkStatusReg
Definition: single_contact.cc:481
virtual void solveConstraintsFixpointSingle()
Definition: single_contact.cc:789
GeneralizedForceLaw * fcl
force laws in normal and tangential direction on acceleration and velocity level
Definition: single_contact.h:225
Definition: openmbv_utils.h:66
BOOST_PARAMETER_MEMBER_FUNCTION((void), enableOpenMBVTangentialForce, tag,(optional(scaleLength,(double), 1)(scaleSize,(double), 1)(referencePoint,(OpenMBV::Arrow::ReferencePoint), OpenMBV::Arrow::toPoint)(diffuseColor,(const fmatvec::Vec3 &),"[-1;1;1]")(transparency,(double), 0)))
Sets the OpenMBV::Arrow to be used for drawing the friction force vector. This vector is the friction...
Definition: single_contact.h:179
fmatvec::Vec gdT
relative velocity in tangential direction
Definition: single_contact.h:267
virtual void SizeLinearImpactEstimation(int *sizeInActive_, int *sizeActive_)
calculates the number of active and inactive unilateral constraints and increments sizeActive/sizeInA...
Definition: single_contact.cc:1464
ContactKinematics * contactKinematics
used contact kinematics
Definition: single_contact.h:220
virtual int getFrictionDirections() const
Definition: single_contact.cc:1299
virtual void LinearImpactEstimation(double t, fmatvec::Vec &gInActive_, fmatvec::Vec &gdInActive_, int *IndInActive_, fmatvec::Vec &gAct_, int *IndActive_)
get gap distance and calculate gap velocity of unilateral links to estimate impacts within the next s...
Definition: single_contact.cc:1448
virtual void solveImpactsRootFinding()
Definition: single_contact.cc:889
virtual bool detectImpact()
Definition: single_contact.cc:669
virtual void calcgSize(int j)
calculates size of relative distances
Definition: single_contact.cc:368
std::vector< std::shared_ptr< OpenMBV::Frame > > openMBVContactFrame
container of ContactFrames to draw
Definition: single_contact.h:322
virtual void initializeUsingXML(xercesc::DOMElement *element)
Definition: single_contact.cc:1306
virtual void plot()
plots time dependent data
Definition: single_contact.cc:673
virtual void updateLaRef(const fmatvec::Vec &ref)
references to contact force parameter of dynamic system parent
Definition: single_contact.cc:266
basic friction force law on velocity level for constraint description
Definition: friction_impact_law.h:32
InitStage
The stages of the initialization.
Definition: element.h:97
basic friction force law on acceleration level for constraint description
Definition: friction_force_law.h:32
BOOST_PARAMETER_MEMBER_FUNCTION((void), enableOpenMBVNormalForce, tag,(optional(scaleLength,(double), 1)(scaleSize,(double), 1)(referencePoint,(OpenMBV::Arrow::ReferencePoint), OpenMBV::Arrow::toPoint)(diffuseColor,(const fmatvec::Vec3 &),"[-1;1;1]")(transparency,(double), 0)))
Sets the OpenMBV::Arrow to be used for drawing the normal force vector. This vector is the force whic...
Definition: single_contact.h:166
fmatvec::Vec laN
force in normal direction
Definition: single_contact.h:247
std::shared_ptr< OpenMBV::Arrow > contactArrow
pointer to memory of normal and friction forces to draw
Definition: single_contact.h:327
virtual void calcrFactorSize(int j)
calculates size of rfactors
Definition: single_contact.cc:444
basic force law on velocity level for constraint description
Definition: generalized_impact_law.h:32
BOOST_PARAMETER_MEMBER_FUNCTION((void), enableOpenMBVContactPoints, tag,(optional(size,(double), 1)(offset,(double), 1)(transparency,(double), 0)))
Draw two OpenMBV::Frame&#39;s of size &#39;size&#39; at the contact points if &#39;enable&#39;==true, otherwise the objec...
Definition: single_contact.h:152
std::string name
name of element
Definition: element.h:298
fmatvec::Vec gddNBuf
gap acceleration buffer
Definition: single_contact.h:307
virtual void updategdRef(const fmatvec::Vec &ref)
references to contact relative velocities of dynamic system parent
Definition: single_contact.cc:280
fmatvec::Vec laT
force in tangential direction
Definition: single_contact.h:254
cartesian frame on bodies used for application of e.g. links and loads
Definition: frame.h:37
virtual void updaterFactors()
update relaxation factors for contact equations
Definition: single_contact.cc:1056
virtual bool gActiveChanged()
Definition: single_contact.cc:663
virtual void calclaSize(int j)
calculates size of contact force parameters
Definition: single_contact.cc:298
virtual void calcgdSize(int j)
calculates size of gap velocities
Definition: single_contact.cc:383
virtual std::string getType() const
Definition: single_contact.h:141
class for contacts
Definition: single_contact.h:47
virtual void calcsvSize()
calculates size of stopvector (root function for event driven integration)
Definition: single_contact.cc:463
basic class for contact kinematical calculations
Definition: contact_kinematics.h:39
std::array< unsigned int, DirectionDIM > gdActive
boolean flag symbolising activity of contact on velocity level
Definition: single_contact.h:285
virtual void solveConstraintsGaussSeidel()
Definition: single_contact.cc:854
FrictionImpactLaw * ftil
force law defining relation between tangential velocities and forces impulses
Definition: single_contact.h:240
unsigned int gActive
boolean flag symbolising activity of contact on position level with possibility to save previous time...
Definition: single_contact.h:272
virtual void checkActive(int j)
check if set-valued contacts are active and set corresponding attributes
Definition: single_contact.cc:1193
std::shared_ptr< OpenMBV::Group > openMBVContactGrp
contact group to draw
Definition: single_contact.h:317
virtual void closePlot()
closes plot file
Definition: single_contact.cc:728
static std::shared_ptr< CreateType > create()
SingleContact(const std::string &name="")
constructor
Definition: single_contact.cc:48
virtual void jacobianConstraints()
computes JACOBIAN and mass action matrix of nonlinear contact equations
Definition: single_contact.cc:955

Impressum / Disclaimer / Datenschutz Generated by doxygen 1.8.5 Valid HTML