FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
HydroCable.h
1#ifndef HYDRO_CABLE_H
2#define HYDRO_CABLE_H
3
4#include "sfh/constants.h"
5#include "sfh/math.h"
6#include "sfh/text.h"
7#include "sfh/util.h"
8
9#include <Eigen/Dense>
10
11#include <fhsim/simobject/SimObject.h>
12#include <memory>
13
92class HydroCable : public SimObject
93{
94 public:
95 HydroCable(const std::string& simObjectName, ISimObjectCreator* const creator);
96 void OdeFcn(const double T, const double* const X, double* const XDot) const;
97 void InitialConditionSetup(const double T, const double* const currentIC, double* const updatedIC, ISimObjectCreator* const creator);
98
99 bool HasJacobians() const override;
100 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
101 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
102
103#ifdef FH_VISUALIZATION
104 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
105 void RenderUpdate(const double T, const double* const X);
106#endif
107
108 protected:
109 void SetOutputPortValues(const double T, const double* const X) const;
110 Eigen::Vector3d Drag(int k, int l, const double T, const double* const X) const;
111 Eigen::Vector3d Spring(int k, int l, const double T, const double* const X) const;
112 Eigen::Vector3d Damp(int k, int l, const double T, const double* const X) const;
113
120 const double* pk, const double* pl,
121 const double* vk, const double* vl,
122 double* dF_dpk, double* dF_dpl,
123 double* dF_dvk, double* dF_dvl) const;
124 const double* ForceA(const double T, const double* const X);
125 const double* ForceB(const double T, const double* const X);
126 const double* PosA(const double T, const double* const X);
127 const double* PosB(const double T, const double* const X);
128
129 ICommonComputation* m_SetOutputPortValues;
130 ISignalPort* m_PositionA;
131 ISignalPort* m_PositionB;
132 ISignalPort* m_VelocityA;
133 ISignalPort* m_VelocityB;
134 ISignalPort* m_Current;
135
136 std::vector<int> m_PositionIndex, m_VelocityIndex;
137 int m_stateBase = 0;
138
146 int LocalIndex(int globalStateIndex) const { return globalStateIndex - m_stateBase; }
147
148 int m_NumPoints;
149 mutable double m_ForceA[3];
150 mutable double m_ForceB[3];
151 // NEW START
152 mutable double m_PosA[3];
153 mutable double m_PosB[3];
154 // NEW END
155
156 double m_ElementMass, m_ElementLength0;
157 double m_SpringCoef, m_DamperCoef, m_GravYancy;
158 double m_CrossDragCoef, m_AlongDragCoef, m_RhoWater;
159 double m_Mass, m_Length, m_Diameter, m_RhoCable, m_Modulus;
160
161#ifdef FH_VISUALIZATION
162 Ogre::ManualObject* m_Line;
163#endif
164};
165
166#endif
Definition HydroCable.h:93
int m_stateBase
Global index of this object's first state, Position1; cached in the constructor.
Definition HydroCable.h:137
int LocalIndex(int globalStateIndex) const
Definition HydroCable.h:146
void computeSegmentJacobian(const double *pk, const double *pl, const double *vk, const double *vl, double *dF_dpk, double *dF_dpl, double *dF_dvk, double *dF_dvl) const