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/links/single_contact.h>
24 #include <map>
25 
26 namespace MBSim {
27 
28  class ContactKinematics;
29  class GeneralizedForceLaw;
30  class GeneralizedImpactLaw;
31  class FrictionForceLaw;
32  class FrictionImpactLaw;
33 
48  class Contact : public Link {
49  public:
54  Contact(const std::string &name = "");
55 
59  virtual ~Contact();
60 
61  std::shared_ptr<OpenMBV::Group> getOpenMBVGrp();
62  /********************************/
63 
64  /* INHERITED INTERFACE OF LINKINTERFACE */
65  virtual void updatewb();
66  virtual void updateW(int i = 0);
67  virtual void updateV(int i = 0);
68  virtual void updateh(int i = 0);
69  virtual void updateg();
70  virtual void updategd();
71  virtual void updateStopVector();
72  virtual void updateJacobians(int j = 0);
73  /***************************************************/
74 
75  /* INHERITED INTERFACE OF LINK */
76  virtual void updateWRef(const fmatvec::Mat &ref, int j = 0);
77  virtual void updateVRef(const fmatvec::Mat &ref, int j = 0);
78  virtual void updatehRef(const fmatvec::Vec &hRef, int j = 0);
79  virtual void updaterRef(const fmatvec::Vec &hRef, int j = 0);
80  virtual void updatewbRef(const fmatvec::Vec &ref);
81  virtual void updatelaRef(const fmatvec::Vec& ref);
82  virtual void updateLaRef(const fmatvec::Vec& ref);
83  virtual void updategRef(const fmatvec::Vec& ref);
84  virtual void updategdRef(const fmatvec::Vec& ref);
85  virtual void updateresRef(const fmatvec::Vec& ref);
86  virtual void updaterFactorRef(const fmatvec::Vec &ref);
87  virtual void updatesvRef(const fmatvec::Vec &ref);
88  virtual void updatejsvRef(const fmatvec::VecInt &ref);
89  virtual void updateLinkStatusRef(const fmatvec::VecInt &LinkStatusParent);
90  virtual void updateLinkStatusRegRef(const fmatvec::VecInt &LinkStatusRegParent);
91  virtual void calcxSize();
92  virtual void calclaSize(int j);
93  virtual void calcgSize(int j);
94  virtual void calcgdSize(int j);
95  virtual void calcrFactorSize(int j);
96  virtual void calcsvSize();
97  virtual void calcLinkStatusSize();
98  virtual void calcLinkStatusRegSize();
99  virtual void init(InitStage stage);
100  virtual bool isSetValued() const;
101  virtual bool isSingleValued() const;
102  virtual void updateLinkStatus();
103  virtual void updateLinkStatusReg();
104  virtual bool isActive() const;
105  virtual bool gActiveChanged();
106  virtual bool detectImpact();
107  virtual void solveImpactsFixpointSingle();
108  virtual void solveConstraintsFixpointSingle();
109  virtual void solveImpactsGaussSeidel();
110  virtual void solveConstraintsGaussSeidel();
111  virtual void solveImpactsRootFinding();
112  virtual void solveConstraintsRootFinding();
113  virtual void jacobianConstraints();
114  virtual void jacobianImpacts();
115  virtual void updaterFactors();
116  virtual void checkConstraintsForTermination();
117  virtual void checkImpactsForTermination();
118  virtual void checkActive(int j);
119  virtual void setlaTol(double tol);
120  virtual void setLaTol(double tol);
121  virtual void setgTol(double tol);
122  virtual void setgdTol(double tol);
123  virtual void setgddTol(double tol);
124  virtual void setrMax(double rMax_);
125  virtual void setLinkStatusInd(int LinkStatusInd_);
126  virtual void setLinkStatusRegInd(int LinkStatusRegInd_);
127  virtual void setsvInd(int svInd_);
128  virtual void setlaInd(int laInd_);
129  virtual void setgInd(int gInd_);
130  virtual void setgdInd(int gdInd_);
131  virtual void setrFactorInd(int rFactorInd_);
132  virtual void LinearImpactEstimation(double t, fmatvec::Vec &gInActive_, fmatvec::Vec &gdInActive_, int *IndInActive_, fmatvec::Vec &gAct_, int *IndActive_);
133  virtual void SizeLinearImpactEstimation(int *sizeInActive_, int *sizeActive_);
134  virtual void updatecorrRef(const fmatvec::Vec& ref);
135  virtual void updatecorr(int j);
136  virtual void calccorrSize(int j);
137  virtual void setcorrInd(int corrInd_);
138  virtual void checkRoot();
139  virtual void updateGeneralizedNormalForce();
140 
141  std::shared_ptr<OpenMBV::Frame>& getOpenMBVFrame() {return openMBVFrame;}
142  std::shared_ptr<OpenMBV::Arrow>& getOpenMBVNormalForceArrow() {return contactArrow;}
143  std::shared_ptr<OpenMBV::Arrow>& getOpenMBVTangentialForceArrow() {return frictionArrow;}
144  /***************************************************/
145 
146  /* INHERITED INTERFACE OF ELEMENT */
147  virtual std::string getType() const {
148  return "Contact";
149  }
150  virtual void plot();
151  virtual void closePlot();
152  /***************************************************/
153 
154  void resetUpToDate();
155 
162  BOOST_PARAMETER_MEMBER_FUNCTION( (void), enableOpenMBVContactPoints, tag, (optional (size,(double),1)(offset,(double),1)(transparency,(double),0))) {
163  OpenMBVFrame ombv(size,offset,"[-1;1;1]",transparency);
164  openMBVFrame=ombv.createOpenMBV();
165  }
166 
172  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))) {
173  OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
174  contactArrow=ombv.createOpenMBV();
175  }
176 
184  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))) {
185  OpenMBVArrow ombv(diffuseColor,transparency,OpenMBV::Arrow::toHead,referencePoint,scaleLength,scaleSize);
186  frictionArrow=ombv.createOpenMBV();
187  }
188 
189  /* GETTER / SETTER */
190 
191  void setNormalForceLaw(GeneralizedForceLaw *fcl_);
192  GeneralizedForceLaw * getNormalForceLaw() const { return fcl; }
193  void setNormalImpactLaw(GeneralizedImpactLaw *fnil_);
194  void setTangentialForceLaw(FrictionForceLaw *fdf_);
195  void setTangentialImpactLaw(FrictionImpactLaw *ftil_);
196  void setContactKinematics(ContactKinematics* ck, size_t index = 0) {
197  assert(index < contactKinematics.size());
198  contactKinematics[index] = ck;
199  }
200  ContactKinematics* getContactKinematics(size_t index = 0) const {
201  assert(index < contactKinematics.size());
202  return contactKinematics[index];
203  }
204 
205  ContactKinematics* findContactKinematics(std::string cKName) const {
206  int pos = find(ckNames.begin(), ckNames.end(), cKName) - ckNames.begin();
207  if (pos < static_cast<int>(ckNames.size())) {
208  return contactKinematics[pos];
209  }
210  throw MBSimError("Name of contact Kinematics is not valid");
211  return NULL;
212  }
213 
214  const std::vector<std::vector<SingleContact> > & getSubcontacts() const {
215  return contacts;
216  }
217 
218  virtual void setPlotFeatureContactKinematics(std::string cKName, PlotFeature pf, PlotFeatureStatus value);
219  /***************************************************/
220 
224  virtual int getFrictionDirections();
225 
233  void connect(Contour *contour1, Contour* contour2, ContactKinematics* contactKinematics = 0, const std::string & name = "");
234 
235  Contour* getContour(int i, int j=0) { return contour[i][j]; }
236 
237  virtual void initializeUsingXML(xercesc::DOMElement *element);
238 
239  void setSearchAllContactPoints(bool searchAllCP_) { searchAllCP = searchAllCP_; }
240  void setInitialGuess(const fmatvec::VecV &zeta0_) { zeta0 = zeta0_; }
241 
242  protected:
246  std::vector<std::vector<SingleContact> > contacts;
247 
251  std::vector<ContactKinematics*> contactKinematics;
252 
253  std::vector<std::vector<Contour*> > contour;
254 
260  std::vector<std::string> ckNames;
261 
267  std::map<std::pair<std::string, PlotFeature>, PlotFeatureStatus> plotFeatureMap;
268 
273 
278 
283 
288 
289  bool searchAllCP;
290 
291  fmatvec::VecV zeta0;
292 
296  std::shared_ptr<OpenMBV::Group> openMBVGrp;
297 
301  std::shared_ptr<OpenMBV::Frame> openMBVFrame;
302 
306  std::shared_ptr<OpenMBV::Arrow> contactArrow, frictionArrow;
307 
308  private:
310  std::string name1;
311  std::string name2;
312  std::string contourPairingName;
313  };
314  std::vector<saved_references> saved_ref;
315  };
316 
317 }
318 
319 #endif /* _CONTACT_H_ */
320 
virtual void updatejsvRef(const fmatvec::VecInt &ref)
references to stopvector evaluation of dynamic system parent (root detection with corresponding bool ...
Definition: contact.cc:221
basic force law on acceleration level for constraint description
Definition: generalized_force_law.h:32
virtual void updaterFactorRef(const fmatvec::Vec &ref)
references to rfactors of dynamic system parent
Definition: contact.cc:205
virtual void solveConstraintsGaussSeidel()
Definition: contact.cc:644
virtual void updategRef(const fmatvec::Vec &ref)
references to contact relative distances of dynamic system parent
Definition: contact.cc:180
class for contacts
Definition: contact.h:48
virtual void updateLinkStatusRef(const fmatvec::VecInt &LinkStatusParent)
reference to vector of link status (for set valued links with piecewise link equations) ...
Definition: contact.cc:229
virtual void calclaSize(int j)
calculates size of contact force parameters
Definition: contact.cc:250
virtual std::string getType() const
Definition: contact.h:147
std::vector< std::string > ckNames
names for the contact kinematics
Definition: contact.h:260
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:437
virtual void solveImpactsRootFinding()
Definition: contact.cc:651
virtual void jacobianConstraints()
computes JACOBIAN and mass action matrix of nonlinear contact equations
Definition: contact.cc:665
virtual bool isActive() const
Definition: contact.cc:470
Definition: openmbv_utils.h:54
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: contact.h:162
void connect(Contour *contour1, Contour *contour2, ContactKinematics *contactKinematics=0, const std::string &name="")
Definition: contact.cc:714
std::vector< std::vector< SingleContact > > contacts
list of the single sub-contact(-points)
Definition: contact.h:246
virtual void checkActive(int j)
check if set-valued contacts are active and set corresponding attributes
Definition: contact.cc:700
virtual void updatesvRef(const fmatvec::Vec &ref)
references to stopvector of dynamic system parent (root function for event driven integration) ...
Definition: contact.cc:213
virtual void calcgSize(int j)
calculates size of relative distances
Definition: contact.cc:260
virtual void solveImpactsFixpointSingle()
Definition: contact.cc:623
virtual ~Contact()
destructor
Definition: contact.cc:50
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: contact.h:184
virtual void plot()
plots time dependent data
Definition: contact.cc:499
virtual void SizeLinearImpactEstimation(int *sizeInActive_, int *sizeActive_)
calculates the number of active and inactive unilateral constraints and increments sizeActive/sizeInA...
Definition: contact.cc:752
virtual void updatewbRef(const fmatvec::Vec &ref)
references to TODO of dynamic system parent
Definition: contact.cc:156
FrictionForceLaw * fdf
force law defining relation between tangential velocities and tangential forces
Definition: contact.h:277
Definition: openmbv_utils.h:66
virtual void solveConstraintsRootFinding()
Definition: contact.cc:658
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:444
virtual void updateWRef(const fmatvec::Mat &ref, int j=0)
references to contact force direction matrix of dynamic system parent
Definition: contact.cc:128
std::shared_ptr< OpenMBV::Frame > openMBVFrame
Frame of ContactFrames to draw.
Definition: contact.h:301
virtual void calcrFactorSize(int j)
calculates size of rfactors
Definition: contact.cc:280
std::shared_ptr< OpenMBV::Group > openMBVGrp
group for the plotting of the openMBV sub elements
Definition: contact.h:296
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: contact.cc:745
virtual void solveImpactsGaussSeidel()
Definition: contact.cc:637
virtual bool gActiveChanged()
Definition: contact.cc:479
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
virtual void updatelaRef(const fmatvec::Vec &ref)
references to contact force parameter of dynamic system parent
Definition: contact.cc:164
basic friction force law on acceleration level for constraint description
Definition: friction_force_law.h:32
virtual void updaterFactors()
update relaxation factors for contact equations
Definition: contact.cc:679
std::map< std::pair< std::string, PlotFeature >, PlotFeatureStatus > plotFeatureMap
plotFeatures of sub-contacts
Definition: contact.h:267
basic force law on velocity level for constraint description
Definition: generalized_impact_law.h:32
GeneralizedImpactLaw * fnil
force law defining relation between penetration velocity and resulting normal impulses ...
Definition: contact.h:282
std::string name
name of element
Definition: element.h:298
virtual void updateLaRef(const fmatvec::Vec &ref)
references to contact force parameter of dynamic system parent
Definition: contact.cc:172
virtual void checkImpactsForTermination()
verify underlying force laws on velocity level concerning given tolerances
Definition: contact.cc:693
std::vector< ContactKinematics * > contactKinematics
list of the single contact kinematics
Definition: contact.h:251
virtual void init(InitStage stage)
plots time series header
Definition: contact.cc:322
virtual void checkConstraintsForTermination()
verify underlying force laws concerning given tolerances
Definition: contact.cc:686
virtual void calcLinkStatusSize()
calculates size of vector LinkStatus
Definition: contact.cc:300
virtual void calcsvSize()
calculates size of stopvector (root function for event driven integration)
Definition: contact.cc:290
virtual void updateVRef(const fmatvec::Mat &ref, int j=0)
references to condensed contact force direction matrix of dynamic system parent
Definition: contact.cc:135
virtual void solveConstraintsFixpointSingle()
Definition: contact.cc:630
virtual void calcLinkStatusRegSize()
calculates size of vector LinkStatusReg
Definition: contact.cc:311
virtual void updateresRef(const fmatvec::Vec &ref)
references to residuum of nonlinear contact equations of dynamic system parent
Definition: contact.cc:197
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: contact.h:172
std::shared_ptr< OpenMBV::Arrow > contactArrow
pointer to memory of normal and friction forces to draw
Definition: contact.h:306
Definition: contact.h:309
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:189
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:142
virtual void jacobianImpacts()
computes JACOBIAN and mass action matrix of nonlinear contact equations on velocity level ...
Definition: contact.cc:672
virtual bool detectImpact()
Definition: contact.cc:489
FrictionImpactLaw * ftil
force law defining relation between tangential velocities and forces impulses
Definition: contact.h:287
virtual void calcgdSize(int j)
calculates size of gap velocities
Definition: contact.cc:270
virtual void closePlot()
closes plot file
Definition: contact.cc:506
virtual void updaterRef(const fmatvec::Vec &hRef, int j=0)
references to nonsmooth force vector of dynamic system parent
Definition: contact.cc:149
GeneralizedForceLaw * fcl
force laws in normal and tangential direction on acceleration and velocity level
Definition: contact.h:272
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:237
virtual int getFrictionDirections()
Definition: contact.cc:707
Contact(const std::string &name="")
constructor
Definition: contact.cc:47

Impressum / Disclaimer / Datenschutz Generated by doxygen 1.8.5 Valid HTML