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#include <string>
9#include <vector>
10
11#include <Eigen/Dense>
12
13#include <fhsim/simobject/SimObject.h>
14#include <memory>
15
16struct CableSegmentStructuralForces; // cable/CableSegmentStructuralJacobian.h
17
99class HydroCable : public SimObject
100{
101 public:
102 HydroCable(const std::string& simObjectName, ISimObjectCreator* const creator);
103 void OdeFcn(const double T, const double* const X, double* const XDot) const;
104 void InitialConditionSetup(const double T, const double* const currentIC, double* const updatedIC, ISimObjectCreator* const creator);
105
106 bool HasJacobians() const override;
107 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
108 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
109
110#ifdef FH_VISUALIZATION
111 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
112 void RenderUpdate(const double T, const double* const X);
113#endif
114
115 protected:
116 void SetOutputPortValues(const double T, const double* const X) const;
118 Eigen::Vector3d NodePosition(int k, const double T, const double* const X) const;
120 Eigen::Vector3d NodeVelocity(int k, const double T, const double* const X) const;
121 Eigen::Vector3d Drag(int k, int l, const double T, const double* const X) const;
122 Eigen::Vector3d Spring(int k, int l, const double T, const double* const X) const;
123 Eigen::Vector3d Damp(int k, int l, const double T, const double* const X) const;
125 CableSegmentStructuralForces StructuralForce(int k, int l, const double T, const double* const X) const;
126
127 const double* ForceA(const double T, const double* const X);
128 const double* ForceB(const double T, const double* const X);
129 const double* PosA(const double T, const double* const X);
130 const double* PosB(const double T, const double* const X);
131
132 ICommonComputation* m_SetOutputPortValues;
133 ISignalPort* m_PositionA;
134 ISignalPort* m_PositionB;
135 ISignalPort* m_VelocityA;
136 ISignalPort* m_VelocityB;
137 ISignalPort* m_Current;
138
139 std::vector<int> m_PositionIndex, m_VelocityIndex;
140 int m_stateBase = 0;
141
142 int m_NumPoints;
143 mutable double m_ForceA[3];
144 mutable double m_ForceB[3];
145 // NEW START
146 mutable double m_PosA[3];
147 mutable double m_PosB[3];
148 // NEW END
149
150 double m_ElementMass, m_ElementLength0;
151 double m_SpringCoef, m_DamperCoef, m_GravYancy;
152 double m_RhoWater;
153 double m_Mass, m_Length, m_Diameter, m_RhoCable, m_Modulus;
154
155#ifdef FH_VISUALIZATION
156 Ogre::ManualObject* m_Line;
157#endif
158};
159
160#endif
Definition HydroCable.h:100
CableSegmentStructuralForces StructuralForce(int k, int l, const double T, const double *const X) const
Spring and Damp of the segment k-l with one evaluation of the law.
Eigen::Vector3d NodeVelocity(int k, const double T, const double *const X) const
Velocity of node k, numbered as NodePosition.
int m_stateBase
Global index of this object's first state, Position1; cached in the constructor.
Definition HydroCable.h:140
Eigen::Vector3d NodePosition(int k, const double T, const double *const X) const
Position of node k: 0 is end A, 1..n are the cable's states, n+1 is end B.
The spring force and the damper force on node k of a segment k-l, each along the segment (towards l w...
Definition CableSegmentStructuralJacobian.h:9