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/link_mechanics.h>
24 #include <map>
25 
26 #ifdef HAVE_OPENMBVCPPINTERFACE
27 #include "mbsim/utils/boost_parameters.h"
28 #include "mbsim/utils/openmbv_utils.h"
29 #endif
30 
31 namespace MBSim {
32 
33  class ContactKinematics;
34  class GeneralizedForceLaw;
35  class GeneralizedImpactLaw;
36  class FrictionForceLaw;
37  class FrictionImpactLaw;
38  class ContourPointData;
39 
54  class SingleContact: public LinkMechanics {
55  public:
60  SingleContact(const std::string &name="");
61 
65  virtual ~SingleContact();
66 
67  /* INHERITED INTERFACE OF LINKINTERFACE */
68  virtual void updatewb(double t, int i=0);
69  virtual void updateW(double t, int i=0);
70  virtual void updateV(double t, int i=0);
71  virtual void updateh(double t, int i=0);
72  virtual void updateg(double t);
73  virtual void updategd(double t);
74  virtual void updateStopVector(double t);
75  virtual void updateJacobians(double t, int j=0);
76  /***************************************************/
77 
78  /* INHERITED INTERFACE OF LINK */
79  virtual void updateWRef(const fmatvec::Mat &ref, int j=0);
80  virtual void updateVRef(const fmatvec::Mat &ref, int j=0);
81  virtual void updatehRef(const fmatvec::Vec &hRef, int j=0);
82  virtual void updatelaRef(const fmatvec::Vec& ref);
83  virtual void updategdRef(const fmatvec::Vec& ref);
84  virtual void calcxSize();
85  virtual void calclaSize(int j);
86  virtual void calcgSize(int j);
87  virtual void calcgdSize(int j);
88  virtual void calcrFactorSize(int j);
89  virtual void calcsvSize();
90  virtual void calcLinkStatusSize();
91  virtual void calcLinkStatusRegSize();
92  virtual void init(InitStage stage);
93  virtual bool isSetValued() const;
94  virtual bool isSingleValued() const;
95  virtual void updateLinkStatus(double dt);
96  virtual void updateLinkStatusReg(double dt);
97  virtual bool isActive() const;
98  virtual bool gActiveChanged();
99  virtual bool detectImpact();
100  virtual void solveImpactsFixpointSingle(double dt);
101  virtual void solveConstraintsFixpointSingle();
102  virtual void solveImpactsGaussSeidel(double dt);
103  virtual void solveConstraintsGaussSeidel();
104  virtual void solveImpactsRootFinding(double dt);
105  virtual void solveConstraintsRootFinding();
106  virtual void jacobianConstraints();
107  virtual void jacobianImpacts();
108  virtual void updaterFactors();
109  virtual void checkConstraintsForTermination();
110  virtual void checkImpactsForTermination(double dt);
112  virtual void checkActive(int j);
113  virtual void LinearImpactEstimation(fmatvec::Vec &gInActive_,fmatvec::Vec &gdInActive_,int *IndInActive_,fmatvec::Vec &gAct_,int *IndActive_);
114  virtual void SizeLinearImpactEstimation(int *sizeInActive_, int *sizeActive_);
115 
116  /***************************************************/
117 
118  /* INHERITED INTERFACE OF ELEMENT */
119  virtual std::string getType() const { return "SingleContact"; }
120  virtual void plot(double t, double dt = 1);
121  virtual void closePlot();
122  /***************************************************/
123 
124 #ifdef HAVE_OPENMBVCPPINTERFACE
125 
131  BOOST_PARAMETER_MEMBER_FUNCTION( (void), enableOpenMBVContactPoints, tag, (optional (size,(double),1)(offset,(double),1)(transparency,(double),0))) {
132  OpenMBVFrame ombv(size,offset,"[-1;1;1]",transparency);
133  setOpenMBVContactPoints(ombv.createOpenMBV());
134  }
135  void setOpenMBVContactPoints(const boost::shared_ptr<OpenMBV::Frame> &frame) {
136  openMBVContactFrame[0]=frame;
137  openMBVContactFrame[1]=OpenMBV::ObjectFactory::create(openMBVContactFrame[0]);
138  }
139 
145  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))) {
146  OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
147  contactArrow=ombv.createOpenMBV();
148  }
149  void setOpenMBVNormalForce(const boost::shared_ptr<OpenMBV::Arrow> &arrow) { contactArrow=arrow; }
150 
158  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))) {
159  OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
160  frictionArrow=ombv.createOpenMBV();
161  }
162  void setOpenMBVTangentialForce(const boost::shared_ptr<OpenMBV::Arrow> &arrow) { frictionArrow=arrow; }
163 #endif
164 
165  /* GETTER / SETTER */
166  void setNormalForceLaw(GeneralizedForceLaw *fcl_);
167  GeneralizedForceLaw * getNormalForceLaw() const {return fcl; }
168  void setNormalImpactLaw(GeneralizedImpactLaw *fnil_);
169  void setTangentialForceLaw(FrictionForceLaw *fdf_);
170  FrictionForceLaw * getTangentialForceLaw() const {return fdf;}
171  void setTangentialImpactLaw(FrictionImpactLaw *ftil_);
172  void setContactKinematics(ContactKinematics* ck) { contactKinematics = ck; }
173  ContactKinematics* getContactKinematics() const { return contactKinematics; }
174  ContourPointData* & getcpData() { return cpData; }
175  ContourPointData* getcpData() const { return cpData; }
176  fmatvec::Vec & getlaN() { return laN; }
177  fmatvec::Vec getlaN() const { return laN; }
178  fmatvec::Vec & getlaT() { return laT; }
179  fmatvec::Vec getlaT() const { return laT; }
180  fmatvec::Vec & getgdN() { return gdN; }
181  fmatvec::Vec getgdN() const { return gdN; }
182  fmatvec::Vec & getgdT() { return gdT; }
183  fmatvec::Vec getgdT() const { return gdT; }
184  /***************************************************/
185 
189  virtual int getFrictionDirections();
190  virtual int getFrictionDirections() const;
191 
199  void connect(Contour *contour1, Contour* contour2, ContactKinematics* contactKinematics = 0);
200 
206  void applyh(double t, int j);
207 
208  void computeCurvatures(fmatvec::Vec & r) const;
209 
210  virtual void initializeUsingXML(xercesc::DOMElement *element);
211 
212  void calccorrSize(int j);
213  void updatecorr(int j);
214 
215  void checkRoot();
216 
217  protected:
221  ContactKinematics *contactKinematics;
222 
227 
232 
237 
242 
247 
254 
261 
268 
275 
279  unsigned int gActive, gActive0;
280 
286  unsigned int* gdActive;
287 
293  unsigned int* gddActive;
294 
299 
304 
309 
314 
315 #ifdef HAVE_OPENMBVCPPINTERFACE
316 
319  boost::shared_ptr<OpenMBV::Group> openMBVContactGrp;
320 
324  std::vector<boost::shared_ptr<OpenMBV::Frame> > openMBVContactFrame;
325 
329  boost::shared_ptr<OpenMBV::Arrow> contactArrow, frictionArrow;
330 #endif
331 
339  int rootID;
340 
341  private:
342  std::string saved_ref1, saved_ref2;
343  };
344 
345 }
346 
347 #endif /* _SINGLE_CONTACT_H_ */
348 
void applyh(double t, int j)
apply forces to the h-vector
Definition: single_contact.cc:1377
GeneralizedImpactLaw * fnil
force law defining relation between penetration velocity and resulting normal impulses ...
Definition: single_contact.h:236
basic force law on acceleration level for constraint description
Definition: constitutive_laws.h:41
virtual int getFrictionDirections()
Definition: single_contact.cc:1345
virtual void calcLinkStatusSize()
calculates size of vector LinkStatus
Definition: single_contact.cc:441
virtual void solveConstraintsRootFinding()
Definition: single_contact.cc:960
fmatvec::Vec gddN
gap acceleration for event driven scheme on acceleration level
Definition: single_contact.h:308
FrictionForceLaw * fdf
force law defining relation between tangential velocities and tangential forces
Definition: single_contact.h:231
virtual void checkConstraintsForTermination()
verify underlying force laws concerning given tolerances
Definition: single_contact.cc:1161
virtual void connect(Frame *frame_)
Definition: link_mechanics.cc:226
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:599
virtual void updatelaRef(const fmatvec::Vec &ref)
references to contact force parameter of dynamic system parent
Definition: single_contact.cc:223
virtual ~SingleContact()
destructor
Definition: single_contact.cc:58
virtual void init(InitStage stage)
plots time series header
Definition: single_contact.cc:455
fmatvec::Vec gdnN
new gap velocity after an impact for event driven scheme
Definition: single_contact.h:303
virtual void solveImpactsGaussSeidel(double dt)
Definition: single_contact.cc:856
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:592
virtual bool isActive() const
Definition: single_contact.cc:632
virtual void jacobianImpacts()
computes JACOBIAN and mass action matrix of nonlinear contact equations on velocity level ...
Definition: single_contact.cc:1046
fmatvec::Vec gdN
relative velocity in normal direction
Definition: single_contact.h:267
int rootID
type of detected root
Definition: single_contact.h:339
std::vector< Frame * > frame
array in which all frames are listed, connecting bodies via a link
Definition: link_mechanics.h:123
virtual void calcLinkStatusRegSize()
calculates size of vector LinkStatusReg
Definition: single_contact.cc:448
virtual void solveConstraintsFixpointSingle()
Definition: single_contact.cc:823
GeneralizedForceLaw * fcl
force laws in normal and tangential direction on acceleration and velocity level
Definition: single_contact.h:226
fmatvec::Vec gdT
relative velocity in tangential direction
Definition: single_contact.h:274
void connect(Contour *contour1, Contour *contour2, ContactKinematics *contactKinematics=0)
Definition: single_contact.cc:1359
virtual void SizeLinearImpactEstimation(int *sizeInActive_, int *sizeActive_)
calculates the number of active and inactive unilateral constraints and increments sizeActive/sizeInA...
Definition: single_contact.cc:1414
ContactKinematics * contactKinematics
used contact kinematics
Definition: single_contact.h:221
virtual bool detectImpact()
Definition: single_contact.cc:642
virtual void calcgSize(int j)
calculates size of relative distances
Definition: single_contact.cc:331
virtual void updateVRef(const fmatvec::Mat &ref, int j=0)
references to condensed contact force direction matrix of dynamic system parent
Definition: single_contact.cc:206
unsigned int * gddActive
boolean vector symbolising activity of contacts on acceleration level
Definition: single_contact.h:293
unsigned int * gdActive
boolean vector symbolising activity of contacts on velocity level
Definition: single_contact.h:286
virtual void plot(double t, double dt=1)
plots time dependent data
Definition: single_contact.cc:646
basic friction force law on velocity level for constraint description
Definition: constitutive_laws.h:547
virtual void solveImpactsFixpointSingle(double dt)
Definition: single_contact.cc:790
InitStage
The stages of the initialization.
Definition: element.h:97
virtual void updateWRef(const fmatvec::Mat &ref, int j=0)
references to contact force direction matrix of dynamic system parent
Definition: single_contact.cc:197
basic friction force law on acceleration level for constraint description
Definition: constitutive_laws.h:308
fmatvec::Vec laN
force in normal direction
Definition: single_contact.h:253
virtual void calcrFactorSize(int j)
calculates size of rfactors
Definition: single_contact.cc:411
basic force law on velocity level for constraint description
Definition: constitutive_laws.h:213
std::string name
name of element
Definition: element.h:290
fmatvec::Vec gddNBuf
gap acceleration buffer
Definition: single_contact.h:313
virtual void updategdRef(const fmatvec::Vec &ref)
references to contact relative velocities of dynamic system parent
Definition: single_contact.cc:238
fmatvec::Vec laT
force in tangential direction
Definition: single_contact.h:260
fmatvec::Index iT
index for tangential directions in projection matrices
Definition: single_contact.h:298
virtual void LinearImpactEstimation(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:1398
struct for data-management for single point on a contour to describe contact kinematics ...
Definition: contour_pdata.h:38
virtual void updaterFactors()
update relaxation factors for contact equations
Definition: single_contact.cc:1096
virtual bool gActiveChanged()
Definition: single_contact.cc:636
virtual void solveImpactsRootFinding(double dt)
Definition: single_contact.cc:927
general link to one or more objects
Definition: link_mechanics.h:48
virtual void calclaSize(int j)
calculates size of contact force parameters
Definition: single_contact.cc:257
virtual void calcgdSize(int j)
calculates size of gap velocities
Definition: single_contact.cc:346
virtual void updatehRef(const fmatvec::Vec &hRef, int j=0)
references to complete and link smooth force vector of dynamic system parent
Definition: single_contact.cc:215
virtual std::string getType() const
Definition: single_contact.h:119
class for contacts
Definition: single_contact.h:54
virtual void calcsvSize()
calculates size of stopvector (root function for event driven integration)
Definition: single_contact.cc:430
virtual void solveConstraintsGaussSeidel()
Definition: single_contact.cc:890
FrictionImpactLaw * ftil
force law defining relation between tangential velocities and forces impulses
Definition: single_contact.h:241
ContourPointData * cpData
vector of frames for definition of relative contact situation
Definition: single_contact.h:246
unsigned int gActive
boolean vector symbolising activity of contacts on position level with possibility to save previous t...
Definition: single_contact.h:279
virtual void checkActive(int j)
check if set-valued contacts are active and set corresponding attributes
Definition: single_contact.cc:1237
virtual void checkImpactsForTermination(double dt)
verify underlying force laws on velocity level concerning given tolerances
Definition: single_contact.cc:1200
virtual void closePlot()
closes plot file
Definition: single_contact.cc:760
SingleContact(const std::string &name="")
constructor
Definition: single_contact.cc:50
virtual void jacobianConstraints()
computes JACOBIAN and mass action matrix of nonlinear contact equations
Definition: single_contact.cc:995
static boost::shared_ptr< CreateType > create()

Impressum / Disclaimer / Datenschutz Generated by doxygen 1.8.5 Valid HTML