20#ifndef _FLEXIBLE_SPATIAL_NURBS_CONTOUR_H_
21#define _FLEXIBLE_SPATIAL_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;
90 void updateJacobians(
MBSim::Frame *frame,
int j=0)
override;
91 void updateGyroscopicAccelerations(
MBSim::Frame *frame)
override;
95 void setInterpolation(
bool interpolation_) { interpolation = interpolation_; }
96 void setNodeNumbers(
const fmatvec::MatVI &node) { index <<= node; }
97 void setEtaKnotVector(
const fmatvec::VecV &uKnot_) { uKnot <<= uKnot_; }
98 void setXiKnotVector(
const fmatvec::VecV &vKnot_) { vKnot <<= vKnot_; }
99 void setEtaDegree(
int etaDegree_) { etaDegree = etaDegree_; }
100 void setXiDegree(
int xiDegree_) { xiDegree = xiDegree_; }
103 void plot()
override;
105 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))) {
106 OpenMBVDynamicNurbsSurface ombv(diffuseColor,transparency,pointSize,lineWidth);
107 openMBVNurbsSurface=ombv.createOpenMBV();
110 void initializeUsingXML(xercesc::DOMElement *element)
override;
114 bool isZetaOutside(
const fmatvec::Vec2 &zeta)
override;
116 void setOpenEta(
bool openEta_) { openEta = openEta_; }
117 void setOpenXi(
bool openXi_) { openXi = openXi_; }
119 void resetUpToDate()
override { updSrfPos =
true; updSrfVel =
true; updSrfJac =
true; updSrfGA =
true; }
121 void updateSurfacePositions();
122 void updateSurfaceVelocities();
123 void updateSurfaceJacobians();
124 void updateSurfaceGyroscopicAccelerations();
127 fmatvec::Vec2 continueZeta(
const fmatvec::Vec2 &zeta_);
128 void updateHessianMatrix(
const fmatvec::Vec2 &zeta);
129 void updateHessianMatrix_t(
const fmatvec::Vec2 &zeta);
130 const fmatvec::GeneralMatrix<fmatvec::Vec4>& evalHessianMatrix(
const fmatvec::Vec2 &zeta){
if(updSrfPos or fabs(zeta(0)-zetaOld(0))>1e-13 or fabs(zeta(1)-zetaOld(1))>1e-13) updateHessianMatrix(zeta);
return hess; }
131 const fmatvec::GeneralMatrix<fmatvec::Vec4>& evalHessianMatrix_t(
const fmatvec::Vec2 &zeta){ updateHessianMatrix_t(zeta);
return hess_t; }
133 bool interpolation{
false};
134 fmatvec::MatVI index;
135 fmatvec::VecV uKnot, vKnot;
141 std::vector<MBSim::NurbsSurface> srfJac;
142 fmatvec::Vec2 zetaOld;
143 fmatvec::GeneralMatrix<fmatvec::Vec4> hess, hess_t, hessTmp;
144 bool updSrfPos{
true};
145 bool updSrfVel{
true};
146 bool updSrfJac{
true};
149 std::shared_ptr<OpenMBV::DynamicNurbsSurface> openMBVNurbsSurface;
flexible planar contour
Definition: flexible_contour.h:36
flexible spatial nurbs contour
Definition: flexible_spatial_nurbs_contour.h:43
FlexibleSpatialNurbsContour(const std::string &name="")
constructor
Definition: flexible_spatial_nurbs_contour.h:49
~FlexibleSpatialNurbsContour() override=default
destructor