mbsim  4.0.0
MBSim Kernel
link.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 _LINK_H_
21#define _LINK_H_
22
23#include "mbsim/element.h"
24#include "mbsim/mbsim_event.h"
25
26namespace H5 {
27 class Group;
28}
29
30namespace MBSim {
31
32 extern const PlotFeatureEnum generalizedRelativePosition, generalizedRelativeVelocity, generalizedForce;
33
47 //class Link : public Element, public LinkInterface, public ExtraDynamicInterface {
48 class Link : public Element {
49 public:
54 Link(const std::string &name);
55
56 virtual void calcSize() { }
57 int getGeneralizedRelativePositionSize() { if(updSize) calcSize(); return ng; }
58 int getGeneralizedRelativeVelocitySize() { if(updSize) calcSize(); return ngd; }
59 int getGeneralizedForceSize() { if(updSize) calcSize(); return nla; }
60
61 virtual void updateg() { }
62 virtual void updategd() { }
63 virtual void updatewb() { }
64 virtual void updateW(int i=0) { }
65 virtual void updateV(int i=0) { }
66 virtual void updater(int i=0) { }
67 virtual void updateJrla(int i=0) { }
68 virtual void updateh(int i=0) { }
69 virtual void updateStopVector() { }
70 virtual void updateStopVectorParameters() { }
71 virtual void updateLinkStatus() { }
72 virtual void updateLinkStatusReg() { }
73 virtual void updateJacobians(int j=0) { }
74 virtual void updateb() { }
75
76 virtual void updatedx();
77 virtual void updatexd() { }
78 virtual void calcxSize() { xSize = 0; }
79 const fmatvec::Vec& getx() const { return x; }
80 fmatvec::Vec& getx() { return x; }
81 const fmatvec::Vec& getxd(bool check=true) const;
82 fmatvec::Vec& getxd(bool check=true);
83 int getxInd() { return xInd; }
84 virtual void setxInd(int xInd_) { xInd = xInd_; };
85 int getxSize() const { return xSize; }
86 virtual void updatexRef(fmatvec::Vec& ref);
87 virtual void updatexdRef(fmatvec::Vec& ref);
88 virtual void updatedxRef(fmatvec::Vec& ref);
89 virtual void updatebRef(fmatvec::Mat &hRef);
90 void init(InitStage stage, const InitConfigSet &config) override;
91 virtual void initz();
92 virtual void writez(H5::GroupBase *group);
93 virtual void readz0(H5::GroupBase *group);
94
95 virtual void setbInd(int bInd_) { bInd = bInd_; };
96
97 /* INHERITED INTERFACE OF ELEMENT */
98 void plot() override;
99 /***************************************************/
100
101 /* INTERFACE TO BE DEFINED IN DERIVED CLASS */
105 virtual void updateWRef(fmatvec::Mat& ref, int i=0) = 0;
106
110 virtual void updateVRef(fmatvec::Mat& ref, int i=0) = 0;
111
115 virtual void updatehRef(fmatvec::Vec &hRef, int i=0) = 0;
116
120 virtual void updaterRef(fmatvec::Vec &ref, int i=0) = 0;
121
122 virtual void updateJrlaRef(fmatvec::Mat &ref, int i=0) {}
123
127 virtual void updatewbRef(fmatvec::Vec &ref);
128
132 virtual void updatelaRef(fmatvec::Vec& ref);
133
137 virtual void updateLaRef(fmatvec::Vec& ref);
138
142 virtual void deletelaRef();
143
147 virtual void updateInternalStateRef(fmatvec::Vec& cur, fmatvec::Vec& next);
148
152 virtual void updategRef(fmatvec::Vec& ref);
153
157 virtual void updategdRef(fmatvec::Vec& ref);
158
162 virtual void updateresRef(fmatvec::Vec& ref);
163
167 virtual void updaterFactorRef(fmatvec::Vec& ref);
168
172 virtual void updatesvRef(fmatvec::Vec &sv);
173
177 virtual void updatejsvRef(fmatvec::VecInt &jsvParent);
178
182 virtual void updateLinkStatusRef(fmatvec::VecInt &LinkStatusParent);
183
187 virtual void updateLinkStatusRegRef(fmatvec::VecInt &LinkStatusRegParent);
188
192 virtual void calclaSize(int j) { laSize = 0; }
193
194 int getisInd() { return isInd; }
195 int getisSize() { return isSize; }
196 virtual void calcisSize() { isSize = 0; }
197
204
205 virtual void postprocessing() {}
206
210 virtual void calcgSize(int j) { gSize = 0; }
211
218 virtual void calcgdSize(int j) { gdSize = 0; }
219
223 virtual void calcrFactorSize(int j) { rFactorSize = 0; }
224
228 virtual void calcbSize() { bSize = 0; }
229
233 virtual void calcsvSize() { svSize = 0; }
234
238 virtual void calcLinkStatusSize() { LinkStatusSize =0;}
239
244
250 virtual bool isSetValued() const { return false; }
251
257 virtual bool isSingleValued() const { return false; }
258
262 virtual bool isActive() const = 0;
263
267 virtual bool gActiveChanged() = 0;
268
272 virtual bool detectImpact() { return false; }
273
278 virtual void solveImpactsFixpointSingle() { throwError("(Link::solveImpactsFixpointSingle): Not implemented."); }
279
283 virtual void solveConstraintsFixpointSingle() { throwError("(Link::solveConstraintsFixpointSingle): Not implemented."); }
284
289 virtual void solveImpactsGaussSeidel() { throwError("(Link::solveImpactsGaussSeidel): Not implemented."); }
290
294 virtual void solveConstraintsGaussSeidel() { throwError("(Link::solveConstraintsGaussSeidel): Not implemented."); }
295
300 virtual void solveImpactsRootFinding() { throwError("(Link::solveImpactsRootFinding): Not implemented."); }
301
305 virtual void solveConstraintsRootFinding() { throwError("(Link::solveConstraintsRootFinding): Not implemented."); }
306
310 virtual void jacobianConstraints() { throwError("(Link::jacobianConstraints): Not implemented."); }
311
315 virtual void jacobianImpacts() { throwError("(Link::jacobianImpacts): Not implemented."); }
316
320 virtual void updaterFactors() { throwError("(Link::updaterFactors): Not implemented."); }
321
325 virtual void checkImpactsForTermination() { throwError("(Link::checkImpactsForTermination): Not implemented."); }
326
330 virtual void checkConstraintsForTermination() { throwError("(Link::checkConstraintsForTermination): Not implemented."); }
331
338 virtual void checkActive(int j) { }
339
340 virtual void setGeneralizedForceTolerance(double tol) { laTol = tol; }
341 virtual void setGeneralizedImpulseTolerance(double tol) { LaTol = tol; }
342 virtual void setGeneralizedRelativePositionTolerance(double tol) { gTol = tol; }
343 virtual void setGeneralizedRelativeVelocityTolerance(double tol) { gdTol = tol; }
344 virtual void setGeneralizedRelativeAccelerationTolerance(double tol) { gddTol = tol; }
345 virtual void setGeneralizedRelativePositionCorrectionValue(double corr) { gCorr = corr; }
346 virtual void setGeneralizedRelativeVelocityCorrectionValue(double corr) { gdCorr = corr; }
347 virtual void setrMax(double rMax_) { rMax = rMax_; }
348 virtual void setLinkStatusInd(int LinkStatusInd_) { LinkStatusInd = LinkStatusInd_; };
349 virtual void setLinkStatusRegInd(int LinkStatusRegInd_) { LinkStatusRegInd = LinkStatusRegInd_; };
350 virtual void setlaInd(int laInd_) { laInd = laInd_;Ila=fmatvec::RangeV(laInd,laInd+laSize-1); }
351 virtual void setisInd(int isInd_) { isInd = isInd_; }
352 virtual void setgInd(int gInd_) { gInd = gInd_; Ig=fmatvec::RangeV(gInd,gInd+gSize-1); }
353 virtual void setgdInd(int gdInd_) { gdInd = gdInd_; }
354 virtual void setrFactorInd(int rFactorInd_) { rFactorInd = rFactorInd_; }
363 virtual void LinearImpactEstimation(double t, fmatvec::Vec &gInActive_,fmatvec::Vec &gdInActive_,int *IndInActive_,fmatvec::Vec &gAct_,int *IndActive_) { }
364
368 virtual void SizeLinearImpactEstimation(int *sizeInActive_, int *sizeActive_) { }
369 virtual void updatecorr(int j) { corr.init(0); }
370 virtual void updatecorrRef(fmatvec::Vec &ref);
371 virtual void calccorrSize(int j) { corrSize = 0; }
372 virtual void setcorrInd(int corrInd_) { corrInd = corrInd_; }
373 virtual void checkRoot() { }
374 /***************************************************/
375
376 void setx(const fmatvec::Vec &x_) { x = x_; }
377
378 virtual void setsvInd(int svInd_) { svInd = svInd_; };
379 int getsvSize() const { return svSize; }
380
381 int getLinkStatusSize() const { return LinkStatusSize; }
382
383 int getLinkStatusRegSize() const { return LinkStatusRegSize; }
384
385 const fmatvec::Vec& getla(bool check=true) const;
386 const fmatvec::Vec& getLa(bool check=true) const;
387 fmatvec::Vec& getla(bool check=true);
388 fmatvec::Vec& getLa(bool check=true);
389 fmatvec::Vec& getwb(bool check=true);
390
391 int getlaInd() const { return laInd; }
392 int getlaSize() const { return laSize; }
393 int getbSize() const { return bSize; }
394
395 const fmatvec::Vec& evalg();
396 const fmatvec::Vec& evalgd();
397 const fmatvec::Vec& evalla();
398 const fmatvec::Vec& evalLa();
399 const fmatvec::Vec& evalwb();
400 const fmatvec::Vec& evalxd();
401
402 int getgdInd() const { return gdInd; }
403 int getgSize() const { return gSize; }
404 int getgdSize() const { return gdSize; }
405
406 int getrFactorSize() const { return rFactorSize; }
407
408 const fmatvec::VecInt& getrFactorUnsure() const { return rFactorUnsure; }
409
410 void resetUpToDate() override { updrrel = true; updvrel = true; updla = true; }
411
412 virtual void updateGeneralizedPositions() { updrrel = false; }
413 virtual void updateGeneralizedVelocities() { updvrel = false; }
414 virtual void updateGeneralizedForces() { updla = false; }
415
416 const fmatvec::VecV& evalGeneralizedRelativePosition() { if(updrrel) updateGeneralizedPositions(); return rrel; }
417 const fmatvec::VecV& evalGeneralizedRelativeVelocity() { if(updvrel) updateGeneralizedVelocities(); return vrel; }
418 const fmatvec::VecV& evalGeneralizedForce() { if(updla) updateGeneralizedForces(); return lambda; }
419
420 fmatvec::VecV& getGeneralizedRelativePosition(bool check=true) { assert((not check) or (not updrrel)); return rrel; }
421 fmatvec::VecV& getGeneralizedRelativeVelocity(bool check=true) { assert((not check) or (not updvrel)); return vrel; }
422 fmatvec::VecV& getGeneralizedForce(bool check=true) { assert((not check) or (not updla)); return lambda; }
423
427 void savela();
428
432 void saveLa();
433
437 void initla();
438
442 void initLa();
443
447 void decreaserFactors();
448
449
450 int getcorrSize() const { return corrSize; }
451
452 bool getUpdaterrel() const { return updrrel; }
453
454 void createPlotGroup() override;
455
456 protected:
457 int ng, ngd, nla;
458
462 fmatvec::Vec x;
463
467 fmatvec::Vec xd;
468
469 fmatvec::Vec dx;
470
474 fmatvec::Vec x0;
475
479 int xSize, xInd;
480
484 fmatvec::Vec sv;
485
489 fmatvec::VecInt jsv;
490
494 int svSize, svInd;
495
500 fmatvec::VecInt LinkStatus;
501
505 int LinkStatusSize, LinkStatusInd;
506
511 fmatvec::VecInt LinkStatusReg;
512
516 int LinkStatusRegSize, LinkStatusRegInd;
517
518 fmatvec::Vec curis, nextis;
519
523 fmatvec::Vec g, gd, la, La;
524
528 fmatvec::Vec laS;
529
530 int isSize, isInd;
531
535 int gSize, gInd;
536
540 int gdSize, gdInd;
541
545 int laSize, laInd;
546
550 int bSize, bInd;
551
555 fmatvec::RangeV Ig, Ila;
556
560 double gTol, gdTol, gddTol, laTol, LaTol;
561
565 double gCorr, gdCorr;
566
570 fmatvec::Vec la0, La0;
571
575 fmatvec::Vec rFactor;
576
580 fmatvec::VecInt rFactorUnsure;
581
585 int rFactorSize, rFactorInd;
586
590 double rMax;
591
595 fmatvec::Vec res;
596
600 std::vector<fmatvec::Mat> W[2];
601
605 std::vector<fmatvec::Mat> V[2];
606
610 std::vector<fmatvec::Vec> h[2];
611
615 std::vector<fmatvec::Mat> dhdq;
616 std::vector<fmatvec::Mat> dhdu;
617 std::vector<fmatvec::Vec> dhdt;
618
622 std::vector<fmatvec::Vec> r[2];
623
627 std::vector<fmatvec::Mat> Jrla[2];
628
632 fmatvec::Vec wb;
633
637 fmatvec::Mat b;
638
639 int corrSize, corrInd;
640 fmatvec::Vec corr;
641
642 fmatvec::VecV rrel, vrel, lambda;
643
644 bool updSize, updrrel, updvrel, updla;
645 };
646}
647
648#endif /* _LINK_H_ */
basic class of MBSim mainly for plotting
Definition: element.h:56
InitStage
The stages of the initialization.
Definition: element.h:62
std::string name
name of element
Definition: element.h:260
namespace MBSim
Definition: bilateral_constraint.cc:30