All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages
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 _CONTACT_H_
21 #define _CONTACT_H_
22 
23 #include <mbsim/link_mechanics.h>
24 #include <mbsim/single_contact.h>
25 #include <map>
26 
27 #ifdef HAVE_OPENMBVCPPINTERFACE
28 #include "mbsim/utils/boost_parameters.h"
29 #include "mbsim/utils/openmbv_utils.h"
30 #endif
31 
32 namespace MBSim {
33 
34  class ContactKinematics;
35  class GeneralizedForceLaw;
36  class GeneralizedImpactLaw;
37  class FrictionForceLaw;
38  class FrictionImpactLaw;
39 
54  class Contact : public LinkMechanics {
55  public:
60  Contact(const std::string &name = "");
61 
65  virtual ~Contact();
66 
67  /*INHERITED INTERFACE OF ELEMENT*/
69 #ifdef HAVE_OPENMBVCPPINTERFACE
70  boost::shared_ptr<OpenMBV::Group> getOpenMBVGrp();
71 #endif
72  /********************************/
73 
74  /* INHERITED INTERFACE OF LINKINTERFACE */
75  virtual void updatewb(double t, int i = 0);
76  virtual void updateW(double t, int i = 0);
77  virtual void updateV(double t, int i = 0);
78  virtual void updateh(double t, int i = 0);
79  virtual void updateg(double t);
80  virtual void updategd(double t);
81  virtual void updateStopVector(double t);
82  virtual void updateJacobians(double t, int j = 0);
83  /***************************************************/
84 
85  /* INHERITED INTERFACE OF LINK */
86  virtual void updateWRef(const fmatvec::Mat &ref, int j = 0);
87  virtual void updateVRef(const fmatvec::Mat &ref, int j = 0);
88  virtual void updatehRef(const fmatvec::Vec &hRef, int j = 0);
89  virtual void updatewbRef(const fmatvec::Vec &ref);
90  virtual void updatelaRef(const fmatvec::Vec& ref);
91  virtual void updategRef(const fmatvec::Vec& ref);
92  virtual void updategdRef(const fmatvec::Vec& ref);
93  virtual void updateresRef(const fmatvec::Vec& ref);
94  virtual void updaterFactorRef(const fmatvec::Vec &ref);
95  virtual void updatesvRef(const fmatvec::Vec &ref);
96  virtual void updatejsvRef(const fmatvec::VecInt &ref);
97  virtual void updateLinkStatusRef(const fmatvec::VecInt &LinkStatusParent);
98  virtual void updateLinkStatusRegRef(const fmatvec::VecInt &LinkStatusRegParent);
99  virtual void calcxSize();
100  virtual void calclaSize(int j);
101  virtual void calcgSize(int j);
102  virtual void calcgdSize(int j);
103  virtual void calcrFactorSize(int j);
104  virtual void calcsvSize();
105  virtual void calcLinkStatusSize();
106  virtual void calcLinkStatusRegSize();
107  virtual void init(InitStage stage);
108  virtual bool isSetValued() const;
109  virtual bool isSingleValued() const;
110  virtual void updateLinkStatus(double dt);
111  virtual void updateLinkStatusReg(double dt);
112  virtual bool isActive() const;
113  virtual bool gActiveChanged();
114  virtual bool detectImpact();
115  virtual void solveImpactsFixpointSingle(double dt);
116  virtual void solveConstraintsFixpointSingle();
117  virtual void solveImpactsGaussSeidel(double dt);
118  virtual void solveConstraintsGaussSeidel();
119  virtual void solveImpactsRootFinding(double dt);
120  virtual void solveConstraintsRootFinding();
121  virtual void jacobianConstraints();
122  virtual void jacobianImpacts();
123  virtual void updaterFactors();
124  virtual void checkConstraintsForTermination();
125  virtual void checkImpactsForTermination(double dt);
127  virtual void checkActive(int j);
128  virtual void setlaTol(double tol);
129  virtual void setLaTol(double tol);
130  virtual void setgTol(double tol);
131  virtual void setgdTol(double tol);
132  virtual void setgddTol(double tol);
133  virtual void setrMax(double rMax_);
134  virtual void setLinkStatusInd(int LinkStatusInd_);
135  virtual void setLinkStatusRegInd(int LinkStatusRegInd_);
136  virtual void setsvInd(int svInd_);
137  virtual void setlaInd(int laInd_);
138  virtual void setgInd(int gInd_);
139  virtual void setgdInd(int gdInd_);
140  virtual void setrFactorInd(int rFactorInd_);
141  virtual void LinearImpactEstimation(fmatvec::Vec &gInActive_, fmatvec::Vec &gdInActive_, int *IndInActive_, fmatvec::Vec &gAct_, int *IndActive_);
142  virtual void SizeLinearImpactEstimation(int *sizeInActive_, int *sizeActive_);
143  virtual void updatecorrRef(const fmatvec::Vec& ref);
144  virtual void updatecorr(int j);
145  virtual void calccorrSize(int j);
146  virtual void setcorrInd(int corrInd_);
147  virtual void checkRoot();
148 
149 #ifdef HAVE_OPENMBVCPPINTERFACE
150  boost::shared_ptr<OpenMBV::Frame>& getOpenMBVFrame() {return openMBVFrame;}
151  boost::shared_ptr<OpenMBV::Arrow>& getOpenMBVNormalForceArrow() {return contactArrow;}
152  boost::shared_ptr<OpenMBV::Arrow>& getOpenMBVTangentialForceArrow() {return frictionArrow;}
153 #endif
154  /***************************************************/
155 
156  /* INHERITED INTERFACE OF ELEMENT */
157  virtual std::string getType() const {
158  return "Contact";
159  }
160  virtual void plot(double t, double dt = 1);
161  virtual void closePlot();
162  /***************************************************/
163 
164 #ifdef HAVE_OPENMBVCPPINTERFACE
165 
171  BOOST_PARAMETER_MEMBER_FUNCTION( (void), enableOpenMBVContactPoints, tag, (optional (size,(double),1)(offset,(double),1)(transparency,(double),0))) {
172  OpenMBVFrame ombv(size,offset,"[-1;1;1]",transparency);
173  openMBVFrame=ombv.createOpenMBV();
174  }
175 
181  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))) {
182  OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
183  contactArrow=ombv.createOpenMBV();
184  }
185 
193  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))) {
194  OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
195  frictionArrow=ombv.createOpenMBV();
196  }
197 #endif
198 
199  /* GETTER / SETTER */
200 
201  void setNormalForceLaw(GeneralizedForceLaw *fcl_);
202  GeneralizedForceLaw * getNormalForceLaw() const { return fcl; }
203  void setNormalImpactLaw(GeneralizedImpactLaw *fnil_);
204  void setTangentialForceLaw(FrictionForceLaw *fdf_);
205  void setTangentialImpactLaw(FrictionImpactLaw *ftil_);
206  void setContactKinematics(ContactKinematics* ck, size_t index = 0) {
207  assert(index < contactKinematics.size());
208  contactKinematics[index] = ck;
209  }
210  ContactKinematics* getContactKinematics(size_t index = 0) const {
211  assert(index < contactKinematics.size());
212  return contactKinematics[index];
213  }
214 
215  ContactKinematics* findContactKinematics(std::string cKName) const {
216  int pos = find(ckNames.begin(), ckNames.end(), cKName) - ckNames.begin();
217  if (pos < static_cast<int>(ckNames.size())) {
218  return contactKinematics[pos];
219  }
220  throw MBSimError("Name of contact Kinematics is not valid");
221  return NULL;
222  }
223 
224  const std::vector<std::vector<SingleContact> > & getSubcontacts() const {
225  return contacts;
226  }
227 
228  virtual void setPlotFeatureContactKinematics(std::string cKName, PlotFeature pf, PlotFeatureStatus value);
229  /***************************************************/
230 
234  virtual int getFrictionDirections();
235 
243  void connect(Contour *contour1, Contour* contour2, ContactKinematics* contactKinematics = 0, const std::string & name = "");
244 
245  void computeCurvatures(fmatvec::Vec & r, int contactKinematicsIndex) const;
246 
247  virtual void initializeUsingXML(xercesc::DOMElement *element);
248  virtual xercesc::DOMElement* writeXMLFile(xercesc::DOMNode *element);
249 
250  protected:
254  std::vector<std::vector<SingleContact> > contacts;
255 
259  std::vector<ContactKinematics*> contactKinematics;
260 
266  std::vector<std::string> ckNames;
267 
273  std::map<std::pair<std::string, PlotFeature>, PlotFeatureStatus> plotFeatureMap;
274 
279 
284 
289 
294 
295 #ifdef HAVE_OPENMBVCPPINTERFACE
296 
299  boost::shared_ptr<OpenMBV::Group> openMBVGrp;
300 
304  boost::shared_ptr<OpenMBV::Frame> openMBVFrame;
305 
309  boost::shared_ptr<OpenMBV::Arrow> contactArrow, frictionArrow;
310 #endif
311 
312  private:
314  std::string name1;
315  std::string name2;
316  std::string contourPairingName;
317  };
318  std::vector<saved_references> saved_ref;
319  };
320 
321 }
322 
323 #endif /* _CONTACT_H_ */
324 
virtual void updatejsvRef(const fmatvec::VecInt &ref)
references to stopvector evaluation of dynamic system parent (root detection with corresponding bool ...
Definition: contact.cc:228
basic force law on acceleration level for constraint description
Definition: constitutive_laws.h:41
virtual void updaterFactorRef(const fmatvec::Vec &ref)
references to rfactors of dynamic system parent
Definition: contact.cc:212
virtual void solveConstraintsGaussSeidel()
Definition: contact.cc:662
virtual void updategRef(const fmatvec::Vec &ref)
references to contact relative distances of dynamic system parent
Definition: contact.cc:187
class for contacts
Definition: contact.h:54
virtual void connect(Frame *frame_)
Definition: link_mechanics.cc:226
virtual void updateLinkStatusRef(const fmatvec::VecInt &LinkStatusParent)
reference to vector of link status (for set valued links with piecewise link equations) ...
Definition: contact.cc:236
virtual void calclaSize(int j)
calculates size of contact force parameters
Definition: contact.cc:257
virtual std::string getType() const
Definition: contact.h:157
std::vector< std::string > ckNames
names for the contact kinematics
Definition: contact.h:266
solver interface for modelling and simulation of dynamic systems
Definition: dynamic_system_solver.h:49
virtual bool isSetValued() const
asks the link if it contains force laws that contribute to the lagrange multiplier and is therefore s...
Definition: contact.cc:455
virtual void jacobianConstraints()
computes JACOBIAN and mass action matrix of nonlinear contact equations
Definition: contact.cc:683
virtual bool isActive() const
Definition: contact.cc:488
void connect(Contour *contour1, Contour *contour2, ContactKinematics *contactKinematics=0, const std::string &name="")
Definition: contact.cc:732
std::vector< std::vector< SingleContact > > contacts
list of the single sub-contact(-points)
Definition: contact.h:254
virtual void checkActive(int j)
check if set-valued contacts are active and set corresponding attributes
Definition: contact.cc:718
virtual void updatesvRef(const fmatvec::Vec &ref)
references to stopvector of dynamic system parent (root function for event driven integration) ...
Definition: contact.cc:220
virtual void calcgSize(int j)
calculates size of relative distances
Definition: contact.cc:267
virtual void solveImpactsGaussSeidel(double dt)
Definition: contact.cc:655
virtual ~Contact()
destructor
Definition: contact.cc:57
virtual void SizeLinearImpactEstimation(int *sizeInActive_, int *sizeActive_)
calculates the number of active and inactive unilateral constraints and increments sizeActive/sizeInA...
Definition: contact.cc:770
virtual void updatewbRef(const fmatvec::Vec &ref)
references to TODO of dynamic system parent
Definition: contact.cc:171
FrictionForceLaw * fdf
force law defining relation between tangential velocities and tangential forces
Definition: contact.h:283
virtual void solveConstraintsRootFinding()
Definition: contact.cc:676
virtual bool isSingleValued() const
asks the link if it contains single valued force laws that contribute to the right-hand side vector h...
Definition: contact.cc:462
virtual void updateWRef(const fmatvec::Mat &ref, int j=0)
references to contact force direction matrix of dynamic system parent
Definition: contact.cc:147
virtual void calcrFactorSize(int j)
calculates size of rfactors
Definition: contact.cc:287
virtual void solveImpactsFixpointSingle(double dt)
Definition: contact.cc:641
virtual bool gActiveChanged()
Definition: contact.cc:497
virtual void setDynamicSystemSolver(DynamicSystemSolver *sys)
sets the used dynamics system solver to the element
Definition: contact.cc:69
basic friction force law on velocity level for constraint description
Definition: constitutive_laws.h:547
InitStage
The stages of the initialization.
Definition: element.h:97
virtual void updatelaRef(const fmatvec::Vec &ref)
references to contact force parameter of dynamic system parent
Definition: contact.cc:179
basic friction force law on acceleration level for constraint description
Definition: constitutive_laws.h:308
virtual void updaterFactors()
update relaxation factors for contact equations
Definition: contact.cc:697
std::map< std::pair< std::string, PlotFeature >, PlotFeatureStatus > plotFeatureMap
plotFeatures of sub-contacts
Definition: contact.h:273
virtual void solveImpactsRootFinding(double dt)
Definition: contact.cc:669
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: contact.cc:763
basic force law on velocity level for constraint description
Definition: constitutive_laws.h:213
GeneralizedImpactLaw * fnil
force law defining relation between penetration velocity and resulting normal impulses ...
Definition: contact.h:288
std::string name
name of element
Definition: element.h:290
std::vector< ContactKinematics * > contactKinematics
list of the single contact kinematics
Definition: contact.h:259
virtual void init(InitStage stage)
plots time series header
Definition: contact.cc:329
general link to one or more objects
Definition: link_mechanics.h:48
virtual void checkImpactsForTermination(double dt)
verify underlying force laws on velocity level concerning given tolerances
Definition: contact.cc:711
virtual void checkConstraintsForTermination()
verify underlying force laws concerning given tolerances
Definition: contact.cc:704
virtual void calcLinkStatusSize()
calculates size of vector LinkStatus
Definition: contact.cc:307
virtual void plot(double t, double dt=1)
plots time dependent data
Definition: contact.cc:517
virtual void calcsvSize()
calculates size of stopvector (root function for event driven integration)
Definition: contact.cc:297
virtual void updateVRef(const fmatvec::Mat &ref, int j=0)
references to condensed contact force direction matrix of dynamic system parent
Definition: contact.cc:155
virtual void solveConstraintsFixpointSingle()
Definition: contact.cc:648
virtual void calcLinkStatusRegSize()
calculates size of vector LinkStatusReg
Definition: contact.cc:318
virtual void updateresRef(const fmatvec::Vec &ref)
references to residuum of nonlinear contact equations of dynamic system parent
Definition: contact.cc:204
Definition: contact.h:313
PlotFeatureStatus
Plot feature status.
Definition: element.h:61
virtual void updategdRef(const fmatvec::Vec &ref)
references to contact relative velocities of dynamic system parent
Definition: contact.cc:196
virtual void updatehRef(const fmatvec::Vec &hRef, int j=0)
references to complete and link smooth force vector of dynamic system parent
Definition: contact.cc:163
virtual void jacobianImpacts()
computes JACOBIAN and mass action matrix of nonlinear contact equations on velocity level ...
Definition: contact.cc:690
virtual bool detectImpact()
Definition: contact.cc:507
FrictionImpactLaw * ftil
force law defining relation between tangential velocities and forces impulses
Definition: contact.h:293
virtual void calcgdSize(int j)
calculates size of gap velocities
Definition: contact.cc:277
virtual void closePlot()
closes plot file
Definition: contact.cc:524
GeneralizedForceLaw * fcl
force laws in normal and tangential direction on acceleration and velocity level
Definition: contact.h:278
PlotFeature
Plot Features.
Definition: element.h:74
virtual void updateLinkStatusRegRef(const fmatvec::VecInt &LinkStatusRegParent)
reference to vector of link status (for single-valued links)
Definition: contact.cc:244
virtual int getFrictionDirections()
Definition: contact.cc:725
Contact(const std::string &name="")
constructor
Definition: contact.cc:52

Impressum / Disclaimer / Datenschutz Generated by doxygen 1.8.5 Valid HTML