20#ifndef _FLEXIBLE_SPATIAL_FFR_NURBS_CONTOUR_H_
21#define _FLEXIBLE_SPATIAL_FFR_NURBS_CONTOUR_H_
23#include "mbsimFlexibleBody/contours/flexible_contour.h"
25#include "mbsim/utils/boost_parameters.h"
26#include <mbsimFlexibleBody/utils/openmbv_utils.h>
27#include <mbsim/numerics/nurbs/nurbs_surface.h>
30 class DynamicNurbsSurface;
37namespace MBSimFlexibleBody {
60 void init(
InitStage stage,
const MBSim::InitConfigSet &config)
override;
62 double getCurvature(
const fmatvec::Vec2 &zeta);
63 fmatvec::Vec3 evalWn_t(
const fmatvec::Vec2 &zeta)
override;
64 fmatvec::Vec3 evalWs_t(
const fmatvec::Vec2 &zeta)
override;
65 fmatvec::Vec3 evalWt_t(
const fmatvec::Vec2 &zeta)
override;
66 fmatvec::Vec3 evalWu_t(
const fmatvec::Vec2 &zeta)
override;
67 fmatvec::Vec3 evalWv_t(
const fmatvec::Vec2 &zeta)
override;
68 fmatvec::Vec3 evalPosition(
const fmatvec::Vec2 &zeta)
override;
69 fmatvec::Vec3 evalWs(
const fmatvec::Vec2 &zeta)
override;
70 fmatvec::Vec3 evalWt(
const fmatvec::Vec2 &zeta)
override;
71 fmatvec::Vec3 evalParDer1Ws(
const fmatvec::Vec2 &zeta);
72 fmatvec::Vec3 evalParDer2Ws(
const fmatvec::Vec2 &zeta);
73 fmatvec::Vec3 evalParDer1Wt(
const fmatvec::Vec2 &zeta);
74 fmatvec::Vec3 evalParDer2Wt(
const fmatvec::Vec2 &zeta);
75 fmatvec::Vec3 evalParDer1Wu(
const fmatvec::Vec2 &zeta)
override;
76 fmatvec::Vec3 evalParDer2Wu(
const fmatvec::Vec2 &zeta)
override;
77 fmatvec::Vec3 evalParDer1Wv(
const fmatvec::Vec2 &zeta)
override;
78 fmatvec::Vec3 evalParDer2Wv(
const fmatvec::Vec2 &zeta)
override;
79 fmatvec::Vec3 evalParDer1Wn(
const fmatvec::Vec2 &zeta)
override;
80 fmatvec::Vec3 evalParDer2Wn(
const fmatvec::Vec2 &zeta)
override;
81 fmatvec::Vec3 evalParWvCParEta(
const fmatvec::Vec2 &zeta)
override;
82 fmatvec::Vec3 evalParWvCParXi(
const fmatvec::Vec2 &zeta)
override;
83 fmatvec::Vec3 evalParWuPart(
const fmatvec::Vec2 &zeta)
override;
84 fmatvec::Vec3 evalParWvPart(
const fmatvec::Vec2 &zeta)
override;
85 fmatvec::Vec3 evalParWnPart(
const fmatvec::Vec2 &zeta)
override;
87 fmatvec::Vec3 evalKn_t(
const fmatvec::Vec2 &zeta);
88 fmatvec::Vec3 evalKs_t(
const fmatvec::Vec2 &zeta);
89 fmatvec::Vec3 evalKt_t(
const fmatvec::Vec2 &zeta);
90 fmatvec::Vec3 evalKu_t(
const fmatvec::Vec2 &zeta);
91 fmatvec::Vec3 evalKv_t(
const fmatvec::Vec2 &zeta);
92 fmatvec::Vec3 evalKrPS(
const fmatvec::Vec2 &zeta);
93 fmatvec::Vec3 evalKn(
const fmatvec::Vec2 &zeta);
94 fmatvec::Vec3 evalKs(
const fmatvec::Vec2 &zeta);
95 fmatvec::Vec3 evalKt(
const fmatvec::Vec2 &zeta);
96 fmatvec::Vec3 evalKu(
const fmatvec::Vec2 &zeta);
97 fmatvec::Vec3 evalKv(
const fmatvec::Vec2 &zeta);
98 fmatvec::Vec3 evalParDer1Kn(
const fmatvec::Vec2 &zeta);
99 fmatvec::Vec3 evalParDer2Kn(
const fmatvec::Vec2 &zeta);
100 fmatvec::Vec3 evalParDer1Ks(
const fmatvec::Vec2 &zeta);
101 fmatvec::Vec3 evalParDer2Ks(
const fmatvec::Vec2 &zeta);
102 fmatvec::Vec3 evalParDer1Kt(
const fmatvec::Vec2 &zeta);
103 fmatvec::Vec3 evalParDer2Kt(
const fmatvec::Vec2 &zeta);
104 fmatvec::Vec3 evalParDer1Ku(
const fmatvec::Vec2 &zeta);
105 fmatvec::Vec3 evalParDer2Ku(
const fmatvec::Vec2 &zeta);
106 fmatvec::Vec3 evalParDer1Kv(
const fmatvec::Vec2 &zeta);
107 fmatvec::Vec3 evalParDer2Kv(
const fmatvec::Vec2 &zeta);
112 void updateJacobians(
MBSim::Frame *frame,
int j=0)
override;
113 void updateGyroscopicAccelerations(
MBSim::Frame *frame)
override;
117 void setInterpolation(
bool interpolation_) { interpolation = interpolation_; }
118 void setNodeNumbers(
const fmatvec::MatVI &node) { index <<= node; }
119 void setEtaKnotVector(
const fmatvec::VecV &uKnot_) { uKnot <<= uKnot_; }
120 void setXiKnotVector(
const fmatvec::VecV &vKnot_) { vKnot <<= vKnot_; }
121 void setEtaDegree(
int etaDegree_) { etaDegree = etaDegree_; }
122 void setXiDegree(
int xiDegree_) { xiDegree = xiDegree_; }
125 void plot()
override;
127 BOOST_PARAMETER_MEMBER_FUNCTION( (
void), enableOpenMBV, MBSim::tag, (optional (diffuseColor,(
const fmatvec::Vec3&),
"[-1;1;1]")(transparency,(
double),0)(pointSize,(
double),0)(lineWidth,(
double),0))) {
128 OpenMBVDynamicNurbsSurface ombv(diffuseColor,transparency,pointSize,lineWidth);
129 openMBVNurbsSurface=ombv.createOpenMBV();
132 void initializeUsingXML(xercesc::DOMElement *element)
override;
136 bool isZetaOutside(
const fmatvec::Vec2 &zeta)
override;
138 void setOpenEta(
bool openEta_) { openEta = openEta_; }
139 void setOpenXi(
bool openXi_) { openXi = openXi_; }
141 void resetUpToDate()
override { updPos =
true; updVel =
true; }
144 fmatvec::Vec2 continueZeta(
const fmatvec::Vec2 &zeta_);
145 void updateHessianMatrix(
const fmatvec::Vec2 &zeta);
146 void updateGlobalRelativePosition(
const fmatvec::Vec2 &zeta);
147 void updateGlobalRelativeVelocity(
const fmatvec::Vec2 &zeta);
148 const fmatvec::GeneralMatrix<fmatvec::Vec4>& evalHessianMatrixPos(
const fmatvec::Vec2 &zeta) {
if(fabs(zeta(0)-zetaOld(0))>1e-13 or fabs(zeta(1)-zetaOld(1))>1e-13) updateHessianMatrix(zeta);
return hessPos; }
149 const std::vector<fmatvec::GeneralMatrix<fmatvec::Vec4>>& evalHessianMatrixPhi(
const fmatvec::Vec2 &zeta) {
if(fabs(zeta(0)-zetaOld(0))>1e-13 or fabs(zeta(1)-zetaOld(1))>1e-13) updateHessianMatrix(zeta);
return hessPhi; }
150 const fmatvec::Vec3& evalGlobalRelativePosition(
const fmatvec::Vec2 &zeta) {
if(updPos) updateGlobalRelativePosition(zeta);
return WrPS; }
151 const fmatvec::Vec3& evalGlobalRelativeVelocity(
const fmatvec::Vec2 &zeta) {
if(updVel) updateGlobalRelativeVelocity(zeta);
return Wvrel; }
154 bool interpolation{
false};
155 fmatvec::MatVI index;
156 fmatvec::VecV uKnot, vKnot;
162 std::vector<MBSim::NurbsSurface> srfPhi;
163 fmatvec::Vec2 zetaOld;
164 fmatvec::GeneralMatrix<fmatvec::Vec4> hessPos;
165 std::vector<fmatvec::GeneralMatrix<fmatvec::Vec4>> hessPhi;
166 fmatvec::Vec3 WrPS, Wvrel;
170 std::shared_ptr<OpenMBV::DynamicNurbsSurface> openMBVNurbsSurface;
flexible planar contour
Definition: flexible_contour.h:36
flexible spatial nurbs contour
Definition: flexible_spatial_ffr_nurbs_contour.h:43
~FlexibleSpatialFfrNurbsContour() override=default
destructor
FlexibleSpatialFfrNurbsContour(const std::string &name="")
constructor
Definition: flexible_spatial_ffr_nurbs_contour.h:49