FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
CablePendulum.h
1#pragma once
2
3#include "sfh/constants.h"
4#include "sfh/math.h"
5#include "sfh/text.h"
6#include "sfh/util.h"
7
8#include <Eigen/Dense>
9
10#include <fhsim/simobject/SimObject.h>
11#include <fhsim_environment/EnvironmentProvider.h>
12#include <memory>
81class CablePendulum : public SimObject
82{
83 public:
84 CablePendulum(const std::string& simObjectName, ISimObjectCreator* const creator);
85 void OdeFcn(const double T, const double* const X, double* const XDot) const;
86 void InitialConditionSetup(const double T, const double* const currentIC, double* const updatedIC, ISimObjectCreator* const creator);
87 void FinalSetup(const double T, const double* const X, ISimObjectCreator* const creator);
88
89#ifdef FH_VISUALIZATION
90 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
91 void RenderUpdate(const double T, const double* const X);
92#endif
93
94 protected:
95 void SetOutputPortValues(const double T, const double* const X) const;
96 const double* MidpointPosition(const double T, const double* const X);
97 const double* BallPosition(const double T, const double* const X);
98 const double* BallVelocity(const double T, const double* const X);
99
100 public:
101 bool HasJacobians() const override;
102 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
103 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
104
105 protected:
111 void segmentJacobian(const double* pk, const double* pl,
112 const double* vk, const double* vl,
113 double dF_dpk[9], double dF_dpl[9],
114 double dF_dvk[9], double dF_dvl[9]) const;
115 Eigen::Vector3d Drag(int k, int l, const double T, const double* const X) const;
116 Eigen::Vector3d Spring(int k, int l, const double T, const double* const X) const;
117 Eigen::Vector3d Damp(int k, int l, const double T, const double* const X) const;
118 const double* SuspensionForce(const double T, const double* const X);
119 const double* CableOnBallForce(const double T, const double* const X);
120
121
122 ICommonComputation* m_SetOutputPortValues;
123 ISignalPort* m_SuspensionPos;
124 ISignalPort* m_SuspensionVel;
125
126 environment::EnvironmentProvider* Environment;
127 std::vector<int> m_PositionIndex, m_VelocityIndex;
128 int m_BallPositionIndex, m_BallVelocityIndex;
129 int m_NumPoints;
130 mutable double m_MidpointPosition[3];
131 mutable double m_BallPosition[3];
132 mutable double m_BallVelocity[3];
133 mutable double m_SuspensionForce[3];
134 mutable double m_CableOnBallForce[3];
135
136 double m_BallMass, m_BallRadius, m_BallDragCoef, m_RhoWater, m_BallRho;
137 double m_ElementMass, m_ElementLength0;
138 double m_SpringCoef, m_DamperCoef, m_GravYancy;
139 double m_CrossDragCoef, m_AlongDragCoef;
140 double m_Mass, m_Length, m_Diameter, m_RhoCable, m_Modulus;
141
142#ifdef FH_VISUALIZATION
143 Ogre::ManualObject* m_Line;
144 Ogre::SceneNode* m_RenderNode;
145 std::string m_MaterialName;
146 std::string m_MeshName;
147 double m_Scale;
148#endif
149};
Definition CablePendulum.h:82
void segmentJacobian(const double *pk, const double *pl, const double *vk, const double *vl, double dF_dpk[9], double dF_dpl[9], double dF_dvk[9], double dF_dvl[9]) const