20#ifndef _GENERIC_FLEXIBLE_FFR_BODY_H_
21#define _GENERIC_FLEXIBLE_FFR_BODY_H_
23#include "mbsimFlexibleBody/node_based_body.h"
24#include "mbsimFlexibleBody/utils/openmbv_utils.h"
25#include "mbsim/functions/time_dependent_function.h"
26#include "mbsim/functions/state_dependent_function.h"
27#include "mbsim/utils/index.h"
33namespace MBSimFlexibleBody {
35 template<
typename Dep>
39 struct BaseType<fmatvec::Vector<fmatvec::Fixed<N>, double>> {
40 using type = fmatvec::VecV;
45 using type = fmatvec::MatVx3;
50 using type = fmatvec::MatV;
54 struct BaseType<fmatvec::Matrix<fmatvec::General, fmatvec::Fixed<N>, fmatvec::Var, double>> {
55 using type = fmatvec::MatV;
65 enum GeneralizedVelocityOfRotation {
66 derivativeOfGeneralizedPositionOfRotation=0,
67 coordinatesOfAngularVelocityWrtFrameOfReference,
68 coordinatesOfAngularVelocityWrtFrameForKinematics,
78 void updateqd()
override;
79 void updateT()
override;
80 void updateh(
int j=0)
override;
81 void updateM()
override;
82 void updateGeneralizedPositions()
override;
83 void updateGeneralizedVelocities()
override;
84 void updateDerivativeOfGeneralizedPositions()
override;
85 void updateGeneralizedAccelerations()
override;
86 void updatePositions();
87 void updateVelocities();
88 void updateAccelerations();
89 void updateJacobians()
override;
90 void updateGyroscopicAccelerations();
99 void updateKJ(
int j=0) { (this->*updateKJ_[j])(); }
103 void calcSize()
override;
104 void calcqSize()
override;
105 void calcuSize(
int j=0)
override;
108 void init(
InitStage stage,
const MBSim::InitConfigSet &config)
override;
109 void setUpInverseKinetics()
override;
113 void plot()
override;
117 int getNumberOfModeShapes() {
if(updSize) calcSize();
return ne; }
126 fPrPK->setParent(
this);
154 fAPK->setParent(
this);
171 void setTranslationDependentRotation(
bool dep) { translationDependentRotation = dep; }
172 void setGeneralizedVelocityOfRotation(GeneralizedVelocityOfRotation generalizedVelocityOfRotation_) { generalizedVelocityOfRotation = generalizedVelocityOfRotation_; }
187 const fmatvec::Vec3& getNodalRelativePosition(
int i)
const {
return KrKP[i]; }
188 const fmatvec::SqrMat3& getNodalRelativeOrientation(
int i)
const {
return ARP[i]; }
189 const fmatvec::Mat3xV& getNodalShapeMatrixOfTranslation(
int i)
const {
return Phi[i]; }
190 const fmatvec::Mat3xV& getNodalShapeMatrixOfRotation(
int i)
const {
return Psi[i]; }
195 void initializeUsingXML(xercesc::DOMElement *element)
override;
197 void setqRel(
const fmatvec::VecV &
q);
198 void setuRel(
const fmatvec::VecV &u);
200 bool transformCoordinates()
const {
return fTR!=
nullptr;}
202 void resetUpToDate()
override;
203 const fmatvec::VecV& evalqTRel() {
if(updq) updateGeneralizedPositions();
return qTRel; }
204 const fmatvec::VecV& evalqRRel() {
if(updq) updateGeneralizedPositions();
return qRRel; }
205 const fmatvec::VecV& evalqERel() {
if(updq) updateGeneralizedPositions();
return qERel; }
206 const fmatvec::VecV& evaluTRel() {
if(updu) updateGeneralizedVelocities();
return uTRel; }
207 const fmatvec::VecV& evaluRRel() {
if(updu) updateGeneralizedVelocities();
return uRRel; }
208 const fmatvec::VecV& evaluERel() {
if(updu) updateGeneralizedVelocities();
return uERel; }
209 const fmatvec::VecV& evalqdTRel() {
if(updqd) updateDerivativeOfGeneralizedPositions();
return qdTRel; }
210 const fmatvec::VecV& evalqdRRel() {
if(updqd) updateDerivativeOfGeneralizedPositions();
return qdRRel; }
211 const fmatvec::VecV& evalqdERel() {
if(updqd) updateDerivativeOfGeneralizedPositions();
return qdERel; }
212 const fmatvec::VecV& evaludERel() {
if(updud) updateGeneralizedAccelerations();
return udERel; }
213 const fmatvec::Vec3& evalGlobalRelativePosition() {
if(updPos) updatePositions();
return WrPK; }
214 const fmatvec::Vec3& evalGlobalRelativeVelocity() {
if(updVel) updateVelocities();
return WvPKrel; }
215 const fmatvec::Vec3& evalGlobalRelativeAngularVelocity() {
if(updVel) updateVelocities();
return WomPK; }
216 const fmatvec::Mat3xV& evalPJTT() {
if(updPJ) updateJacobians();
return PJTT; }
217 const fmatvec::Mat3xV& evalPJRR() {
if(updPJ) updateJacobians();
return PJRR; }
218 const fmatvec::Vec3& evalPjhT() {
if(updPJ) updateJacobians();
return PjhT; }
219 const fmatvec::Vec3& evalPjhR() {
if(updPJ) updateJacobians();
return PjhR; }
220 const fmatvec::Vec3& evalPjbT() {
if(updPjb) updateGyroscopicAccelerations();
return PjbT; }
221 const fmatvec::Vec3& evalPjbR() {
if(updPjb) updateGyroscopicAccelerations();
return PjbR; }
222 const fmatvec::SymMatV& evalMb() {
if(updMb) updateMb();
return M_; }
223 const fmatvec::VecV& evalhb() {
if(updMb) updateMb();
return h_; }
224 const fmatvec::MatV& evalKJ(
int j=0) {
if(updKJ[j]) updateKJ(j);
return KJ[j]; }
225 const fmatvec::VecV& evalKi() {
if(updKJ[0]) updateKJ(0);
return Ki; }
226 const fmatvec::Vec3& evalGlobalRelativePosition(
int i) {
if(updNodalPos[i]) updatePositions(i);
return WrRP[i]; }
227 const fmatvec::Vec3& evalGlobalRelativeAngularVelocity(
int i) {
if(updNodalVel[i]) updateVelocities(i);
return Womrel[i]; }
229 fmatvec::Vec3& getGlobalRelativeVelocity(
bool check=
true) { assert((not check) or (not updVel));
return WvPKrel; }
230 fmatvec::SqrMat3& getRelativeOrientation(
bool check=
true) { assert((not check) or (not updPos));
return APK; }
231 fmatvec::Vec3& getPjbT(
bool check=
true) { assert((not check) or (not updPjb));
return PjbT; }
232 fmatvec::Vec3& getPjbR(
bool check=
true) { assert((not check) or (not updPjb));
return PjbR; }
234 fmatvec::VecV& getqTRel(
bool check=
true) { assert((not check) or (not updq));
return qTRel; }
235 fmatvec::VecV& getqRRel(
bool check=
true) { assert((not check) or (not updq));
return qRRel; }
236 fmatvec::VecV& getqERel(
bool check=
true) { assert((not check) or (not updq));
return qERel; }
237 fmatvec::VecV& getuTRel(
bool check=
true) { assert((not check) or (not updu));
return uTRel; }
238 fmatvec::VecV& getuRRel(
bool check=
true) { assert((not check) or (not updu));
return uRRel; }
239 fmatvec::VecV& getuERel(
bool check=
true) { assert((not check) or (not updu));
return uERel; }
240 fmatvec::VecV& getqdTRel(
bool check=
true) { assert((not check) or (not updqd));
return qdTRel; }
241 fmatvec::VecV& getqdRRel(
bool check=
true) { assert((not check) or (not updqd));
return qdRRel; }
242 fmatvec::VecV& getqdERel(
bool check=
true) { assert((not check) or (not updqd));
return qdERel; }
243 fmatvec::VecV& getudERel(
bool check=
true) { assert((not check) or (not updud));
return udERel; }
245 fmatvec::Vec3& getNodalRelativeVelocity(
int i,
bool check=
true) { assert((not check) or (not updNodalVel[i]));
return Wvrel[i]; }
247 void updateStresses(
int i)
override;
248 void updatePositions(
int i)
override;
249 void updateVelocities(
int i)
override;
250 void updateAccelerations(
int i)
override;
251 void updateJacobians(
int i,
int j=0)
override;
252 void updateGyroscopicAccelerations(
int i)
override;
255 static std::vector<T> getCellArray1D(xercesc::DOMElement *element) {
256 std::vector<T> array;
257 xercesc::DOMElement* e=element->getFirstElementChild();
258 if(MBXMLUtils::E(e)->getTagName()==MBSIMFLEX%
"ele") {
260 array.push_back(MBXMLUtils::E(e)->getText<T>());
261 e=e->getNextElementSibling();
268 static std::vector<T> getCellArray1D(
int m,
const typename BaseType<T>::type &A) {
269 std::vector<T> array;
272 for(
int i=0; i<
M; i++)
273 array.push_back(
T(A(fmatvec::RangeV(i*m,i*m+m-1),fmatvec::RangeV(0,n-1))));
278 static std::vector<std::vector<T>> getCellArray2D(xercesc::DOMElement *element) {
279 std::vector<std::vector<T>> array;
280 xercesc::DOMElement *e=element->getFirstElementChild();
281 if(MBXMLUtils::E(e)->getTagName()==MBSIMFLEX%
"row") {
283 array.push_back(std::vector<T>());
284 xercesc::DOMElement *ee=e->getFirstElementChild();
286 array[array.size()-1].push_back(MBXMLUtils::E(ee)->getText<T>());
287 ee=ee->getNextElementSibling();
289 e=e->getNextElementSibling();
296 static std::vector<std::vector<T>> getCellArray2D(
int m,
int N,
const typename BaseType<T>::type &A) {
297 int M = A.rows()/(m*N);
299 std::vector<std::vector<T>> array(
M);
300 for(
int i=0, k=0; i<
M; i++) {
301 for(
int j=0; j<N; j++) {
302 array[i].push_back(
T(A(fmatvec::RangeV(k*m,k*m+m-1),fmatvec::RangeV(0,n-1))));
312 fmatvec::SymMat3 rrdm, mmi0;
314 std::vector<std::vector<fmatvec::SqrMatV>> PPdm, Knl2;
315 std::vector<std::vector<fmatvec::SqrMatV>> Ke2;
316 std::vector<fmatvec::Mat3xV> rPdm;
317 std::vector<std::vector<fmatvec::SqrMat3>> mmi2, Gr1;
318 std::vector<fmatvec::SqrMatV> Knl1, K0t, K0r, K0om, Ct1, Cr1, Ge, Oe1, Ke1, De1;
319 fmatvec::VecV ksigma0;
320 fmatvec::SqrMatV ksigma1;
321 std::vector<fmatvec::SymMat3> mmi1;
322 fmatvec::MatVx3 Ct0, Cr0;
323 fmatvec::SymMatV Me, Ke0, De0;
324 std::vector<fmatvec::SqrMat3> Gr0;
325 fmatvec::Matrix<fmatvec::General,fmatvec::Var,fmatvec::Fixed<6>,
double> Oe0;
327 std::vector<fmatvec::Vec3> KrKP, WrRP, Wvrel, Womrel;
328 std::vector<fmatvec::SqrMat3> ARP;
329 std::vector<fmatvec::Mat3xV> Phi, Psi;
330 std::vector<std::vector<fmatvec::SqrMatV>> K0F, K0M;
331 std::vector<fmatvec::Vector<fmatvec::Fixed<6>,
double>> sigma0;
332 std::vector<fmatvec::Matrix<fmatvec::General, fmatvec::Fixed<6>, fmatvec::Var,
double>> sigmahel;
333 std::vector<std::vector<fmatvec::Matrix<fmatvec::General, fmatvec::Fixed<6>, fmatvec::Var,
double>> > sigmahen;
340 fmatvec::Vec3 PjhT, PjhR, PjbT, PjbR;
373 fmatvec::VecV qTRel, qRRel, qERel, uTRel, uRRel, uERel, qdTRel, qdRRel, qdERel, udERel;
374 fmatvec::Mat3xV WJTrel, WJRrel, PJTT, PJRR;
378 fmatvec::Range<fmatvec::Var,fmatvec::Var> i02, iqT, iqR, iqE, iuT, iuR, iuE;
380 bool translationDependentRotation{
false}, constJT{
false}, constJR{
false}, constjT{
false}, constjR{
false};
382 bool updPjb{
true}, updGC{
true}, updMb{
true}, updKJ[2];
390 void prefillMassMatrix();
392 GeneralizedVelocityOfRotation generalizedVelocityOfRotation{derivativeOfGeneralizedPositionOfRotation};
394 OpenMBVFlexibleBody::ColorRepresentation ombvColorRepresentation{OpenMBVFlexibleBody::none};
396 std::vector<int> plotNodes, visuNodes;
399 double (GenericFlexibleFfrBody::*evalOMBVColorRepresentation[12])(
int i);
400 double evalNone(
int i) {
return 0; }
401 double evalXDisplacement(
int i) {
return evalNodalDisplacement(i)(0); }
402 double evalYDisplacement(
int i) {
return evalNodalDisplacement(i)(1); }
403 double evalZDisplacement(
int i) {
return evalNodalDisplacement(i)(2); }
404 double evalTotalDisplacement(
int i) {
return fmatvec::nrm2(evalNodalDisplacement(i)); }
405 double evalXXStress(
int i) {
return evalNodalStress(i)(0); }
406 double evalYYStress(
int i) {
return evalNodalStress(i)(1); }
407 double evalZZStress(
int i) {
return evalNodalStress(i)(2); }
408 double evalXYStress(
int i) {
return evalNodalStress(i)(3); }
409 double evalYZStress(
int i) {
return evalNodalStress(i)(4); }
410 double evalZXStress(
int i) {
return evalNodalStress(i)(5); }
411 double evalEquivalentStress(
int i);
Generic flexible body using a floating frame of reference formulation.
Definition: generic_flexible_ffr_body.h:62
void setStateDependentRotation(MBSim::Function< fmatvec::RotMat3(fmatvec::VecV)> *fAPK_)
set Kinematic for only state dependent rotational motion
Definition: generic_flexible_ffr_body.h:166
void setStateDependentTranslation(MBSim::Function< fmatvec::Vec3(fmatvec::VecV)> *fPrPK_)
set Kinematic for only state dependent translational motion
Definition: generic_flexible_ffr_body.h:140
void setGeneralRotation(MBSim::Function< fmatvec::RotMat3(fmatvec::VecV, double)> *fAPK_)
set Kinematic for general rotational motion
Definition: generic_flexible_ffr_body.h:152
fmatvec::Vec3 WvPKrel
translational and angular velocity from parent to kinematic Frame in world system
Definition: generic_flexible_ffr_body.h:355
~GenericFlexibleFfrBody() override
destructor
Definition: generic_flexible_ffr_body.cc:86
fmatvec::SqrMat3 APK
rotation matrix from kinematic Frame to parent Frame
Definition: generic_flexible_ffr_body.h:345
void setTimeDependentRotation(MBSim::Function< fmatvec::RotMat3(double)> *fAPK_)
set Kinematic for only time dependent rotational motion
Definition: generic_flexible_ffr_body.h:161
MBSim::Function< fmatvec::Vec3(fmatvec::VecV, double)> * getTranslation()
get Kinematic for translational motion
Definition: generic_flexible_ffr_body.h:178
MBSim::Function< fmatvec::Vec3(fmatvec::VecV, double)> * fPrPK
translation from parent Frame to kinematic Frame in parent system
Definition: generic_flexible_ffr_body.h:362
void setGeneralTranslation(MBSim::Function< fmatvec::Vec3(fmatvec::VecV, double)> *fPrPK_)
set Kinematic for genral translational motion
Definition: generic_flexible_ffr_body.h:124
MBSim::Function< fmatvec::RotMat3(fmatvec::VecV, double)> * fAPK
rotation from kinematic Frame to parent Frame
Definition: generic_flexible_ffr_body.h:367
MBSim::Function< fmatvec::RotMat3(fmatvec::VecV, double)> * getRotation()
get Kinematic for rotational motion
Definition: generic_flexible_ffr_body.h:183
void setTimeDependentTranslation(MBSim::Function< fmatvec::Vec3(double)> *fPrPK_)
set Kinematic for only time dependent translational motion
Definition: generic_flexible_ffr_body.h:133
fmatvec::Vec3 PrPK
translation from parent to kinematic Frame in parent and world system
Definition: generic_flexible_ffr_body.h:350
Definition: node_based_body.h:30
void addFrame(NodeBasedFrame *frame)
Definition: node_based_body.cc:70
std::vector< Frame * > frame
virtual void addContour(Contour *contour)
void setName(const std::string &str)
Definition: generic_flexible_ffr_body.h:36