FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
CableElBasics.h
1
9
10#ifndef CCableElBasics_H
11#define CCableElBasics_H
12
13// Includes
14#include <fhsim_environment/hydrodynamics/CylinderHydro.h>
15#include <fhsim_environment/hydrodynamics/WetCylinderLaw.h>
16
17#include <assert.h>
18#include <fhsim/Exceptions.h>
19#include <string>
20
21#ifdef FH_VISUALIZATION
22# undef ATTACH_SPHERE
23// #define SIMPLE_LINE_RENDERING
24# pragma warning(push)
25# pragma warning(disable : 4251)
26# include <Ogre.h>
27# pragma warning(pop)
28# include "sfh/ogre/CDynamicLines.h"
29#endif
30
31// kMaxCompressionSpeedSaturation, kMinLengthSaturation and kMaxLengthSaturation: CalcFoundation bounds
32// the stored length (the drag uses it too) and compression speed with them.
33#include "cable/subroutines/CableAxialLaw.h"
34
35// Class definition
36
38{
39public:
42
45
47 virtual void AddEndForces(
48 const double adPosA[3],
49 const double adVelA[3],
50 const double adPosB[3],
51 const double adVelB[3],
52 const double adFluidVel[3],
53 const double rhoWater,
54 double adForceA[3],
55 double adForceB[3]);
56
58 virtual void SetConstants();
59
61 virtual void CalcMassAndWeight();
62
64 virtual bool CheckAndInitialize();
65
67 double GetDampingCoeff() const { return ma_dDampingCoeff; }
68
70 virtual void UpdateLength(double newLength);
71
72 double GetLength();
73#ifdef FH_VISUALIZATION
75 virtual void RenderInit(Ogre::Root* ogreRoot);
76
78 virtual void RenderUpdate(const double adPosA[3], const double adPosB[3]);
79
80 const double* const GetDirection() { return ma_adDirection; }
81#endif
82 unsigned long m_iD;
83 std::string m_cableName;
84 double m_dL0;
85 double m_dD;
86 double m_dE;
87 double m_rho;
91 double m_rhoWater;
92 double m_rhoWaterFull = 1025.0;
93 double m_rhoAir = 1.2;
94
102 void SetSurfaceElevation(double etaA, double etaB)
103 {
104 m_surfaceElevation[0] = etaA;
105 m_surfaceElevation[1] = etaB;
106 }
107
109 virtual double SurfaceHalfSize() const { return 0.5 * m_dD; }
110
115 void SetWaveAcceleration(const double acceleration[3])
116 {
117 for (int k = 0; k < 3; k++)
118 m_waveAcceleration[k] = acceleration[k];
119 }
120
124
126 double InertiaShare() const;
127
138 void WaveExcitationPositionJacobian(const double posA[3], const double posB[3], const double acceleration[3], double dF_dpB[9]) const;
139
153 const double posA[3], const double posB[3],
154 const double velA[3], const double velB[3],
155 const double vFluid[3], double rhoWater,
156 double dFA_dvA[9], double dFA_dvB[9],
157 double dFB_dvA[9], double dFB_dvB[9]) const;
158
171 const double posA[3], const double posB[3],
172 const double velA[3], const double velB[3],
173 const double vFluid[3], double rhoWater,
174 double dFA_dpA[9], double dFA_dpB[9],
175 double dFB_dpA[9], double dFB_dpB[9]) const;
176
185 double BlendedFluidDensity(const double posA[3], const double posB[3]) const;
186 double m_minLength;
189
190 // Calculated properties.
191 double m_eA;
192 double m_dA;
193 double m_weightInWater[2];
194 double m_massInWater[2];
197#ifdef FH_VISUALIZATION
198 std::string m_materialName;
199 unsigned short m_cableFaces;
200 double m_drawScale;
201#endif
202protected:
204 virtual bool AppendagesNearTheSurface() { return false; }
205
206 double m_surfaceElevation[2] = {0.0, 0.0};
207 double m_submergence[2] = {1e10, 1e10};
208 double m_axisVertical = 0.0;
209 double m_wetFraction = 1.0;
210 double m_waveAcceleration[3] = {0.0, 0.0, 0.0};
211
219 double WetFractionAt(const double posA[3], const double posB[3], double submergence[2], double& axisVertical) const;
220
222 void AddWaveExcitationCable(double adForceA[3], double adForceB[3]) const;
223
226 void CalcFoundation(const double adPosA[3],
227 const double adVelA[3],
228 const double adPosB[3],
229 const double adVelB[3],
230 const double adFluidVel[3],
231 const double rhoWater);
232
235 virtual void AddStructuralForces(double adForceA[3], double adForceB[3]) = 0;
236
238 void AddGravityBuoyancy(double adForceA[3], double adForceB[3], const double adPosA[3], const double adPosB[3]);
239
241 void AddHydroForcesCable(double adForceA[3], double adForceB[3]);
242
243
244 // For computational efficiency.
245 double ma_adDirection[3];
247 double ma_adVel[3];
248 double ma_dVelAmp;
249 double ma_adVt[3];
250 double ma_dVtAmp;
251 double ma_adVn[3];
252 double ma_dVnAmp;
253 double ma_adVn_A[3];
254 double ma_adVn_B[3];
255 double ma_dVnAmp_A;
256 double ma_dVnAmp_B;
257 double ma_adVt_A[3];
258 double ma_adVt_B[3];
259 double ma_dVtAmp_A;
260 double ma_dVtAmp_B;
261 double ma_dLength;
263
264#ifdef FH_VISUALIZATION
265 Ogre::Root* m_ogreRoot;
266 Ogre::SceneManager* m_sceneMgr;
267 Ogre::Entity* m_renderElement;
268 Ogre::SceneNode* m_renderNode;
269 CDynamicLines* m_lines;
270 Ogre::ManualObject* m_cableRenderObj;
271 double m_drawDiam;
272# ifdef ATTACH_SPHERE
273 Ogre::Entity* m_renderSphere;
274 Ogre::SceneNode* m_renderNodeSphere;
275# endif
276
277#endif
278};
279
280
281#endif
Class containing a fundamental cable element object.
Definition CableElBasics.h:38
virtual double SurfaceHalfSize() const
The half-size the surface gate needs: the element's radius; larger with floats (NetCableElement).
Definition CableElBasics.h:109
double ma_dDampingCoeff
A intermediate damping calculation to increase the computational efficiency.
Definition CableElBasics.h:246
double m_waveAcceleration[3]
The water particle acceleration at the element (SetWaveAcceleration) [m/s²].
Definition CableElBasics.h:210
void AddHydroForcesCable(double adForceA[3], double adForceB[3])
Calculates the hydrodynamic forces on the cable and the spheres and disks attached to it....
double ma_dVnAmp_A
The scalar hydrodynamic normal velocity of the end A (saturated with the vector).
Definition CableElBasics.h:255
double m_submergence[2]
z + η at the ends at the last CalcFoundation [m]; deep before the first.
Definition CableElBasics.h:207
~CableElBasics()
The destructor.
void SetSurfaceElevation(double etaA, double etaB)
Definition CableElBasics.h:102
double m_rhoWaterFull
The water density the owner passed, unblended [kg/m³]; also that of the stiffness factor (CableElDynS...
Definition CableElBasics.h:92
double InertiaShare() const
The inertia force factor of one end node: half of (1 + Ca) rho V f (environment::cylinder_hydro::Iner...
CableElBasics()
The constructor.
double ma_adVt_B[3]
The hydrodynamic axial velocity of the end B.
Definition CableElBasics.h:258
double ma_dCompressionSpeed
The speed at which the distance between the two ends decreases.
Definition CableElBasics.h:262
double ma_adVt_A[3]
The hydrodynamic axial velocity of the end A: its own velocity against the water, the part along the ...
Definition CableElBasics.h:257
double m_rhoWater
The density of the surrounding fluid: the water density blended with the air density by the submerged...
Definition CableElBasics.h:91
double ma_dVtAmp_A
The speed of the hydrodynamic axial velocity of the end A (unsigned, saturated with the vector).
Definition CableElBasics.h:259
double ma_dVelAmp
The scalar average hydrodynamic velocity of the element.
Definition CableElBasics.h:248
double m_surfaceElevation[2]
η above the ends [m] (SetSurfaceElevation).
Definition CableElBasics.h:206
double ma_dVnAmp
The scalar average normal hydrodynamic velocity of the element.
Definition CableElBasics.h:252
double m_dE
The Young modulus of the element.
Definition CableElBasics.h:86
double WetFractionAt(const double posA[3], const double posB[3], double submergence[2], double &axisVertical) const
double m_wetFraction
The element's wet fraction at the last CalcFoundation (CylinderWetFraction).
Definition CableElBasics.h:209
void DragPositionJacobian(const double posA[3], const double posB[3], const double velA[3], const double velB[3], const double vFluid[3], double rhoWater, double dFA_dpA[9], double dFA_dpB[9], double dFB_dpA[9], double dFB_dpB[9]) const
double m_rhoAir
The air density, kg/m³; the owner sets the environment's (cable_air::EnvironmentAirDensity,...
Definition CableElBasics.h:93
double m_normalDragCoeff
The normal drag coefficient of the cable element.
Definition CableElBasics.h:90
double ma_dVtAmp_B
The speed of the hydrodynamic axial velocity of the end B.
Definition CableElBasics.h:260
double ma_adDirection[3]
Memory allocation to increase the computational efficiency.
Definition CableElBasics.h:245
double BlendedFluidDensity(const double posA[3], const double posB[3]) const
double m_massInWaterPerMeter[2]
The mass in water distributed to each node, per meter cable.
Definition CableElBasics.h:196
double ma_adVel[3]
The average hydrodynamic velocity of the element.
Definition CableElBasics.h:247
double m_dD
The diameter of the element.
Definition CableElBasics.h:85
double ma_adVt[3]
The average tangential hydrodynamic velocity of the element.
Definition CableElBasics.h:249
double m_weightInWaterPerMeter[2]
The weight in water distributed to each node, per meter cable.
Definition CableElBasics.h:195
void AddWaveExcitationCable(double adForceA[3], double adForceB[3]) const
Adds the rope's Froude-Krylov and added-mass wave excitation (owner rulings R67, R104)....
void SetWaveAcceleration(const double acceleration[3])
Definition CableElBasics.h:115
virtual void UpdateLength(double newLength)
Upates the length of the cable element, and its dependant properties.
double ma_dVnAmp_B
The scalar hydrodynamic normal velocity of the end B.
Definition CableElBasics.h:256
double m_minLength
The minimum length of the element.
Definition CableElBasics.h:186
virtual bool CheckAndInitialize()
Does the initialization and checking to make sure that the element is ready for simulation.
virtual bool AppendagesNearTheSurface()
True when a float on the element is near the surface, so its weight must be recomputed every call; no...
Definition CableElBasics.h:204
void CalcFoundation(const double adPosA[3], const double adVelA[3], const double adPosB[3], const double adVelB[3], const double adFluidVel[3], const double rhoWater)
double m_addedWeightInWater
The weight in water added to the element.
Definition CableElBasics.h:88
double m_weightInWater[2]
The weight in water distributed to each node.
Definition CableElBasics.h:193
double m_eA
The linear stiffness of the element.
Definition CableElBasics.h:191
double ma_adVn_B[3]
The hydrodynamic normal velocity of the end B.
Definition CableElBasics.h:254
double ma_dLength
The actual distance between the ends.
Definition CableElBasics.h:261
double m_maxTension
The maximum tension in the element.
Definition CableElBasics.h:187
virtual void AddStructuralForces(double adForceA[3], double adForceB[3])=0
double m_dL0
The relaxed length of the element.
Definition CableElBasics.h:84
double m_axisVertical
The vertical component of the unit axis A→B at the last CalcFoundation.
Definition CableElBasics.h:208
double m_dA
The cross sectional area of the cable.
Definition CableElBasics.h:192
virtual void AddEndForces(const double adPosA[3], const double adVelA[3], const double adPosB[3], const double adVelB[3], const double adFluidVel[3], const double rhoWater, double adForceA[3], double adForceB[3])
Calculates the end forces on the cable element.
double ma_adVn_A[3]
The hydrodynamic normal velocity of the end A: its own velocity against the water,...
Definition CableElBasics.h:253
double ma_dVtAmp
The scalar average tangential hydrodynamic velocity of the element.
Definition CableElBasics.h:250
double m_massInWater[2]
The mass in water distributed to each node.
Definition CableElBasics.h:194
double ma_adVn[3]
The average normal hydrodynamic velocity of the element.
Definition CableElBasics.h:251
unsigned long m_iD
The ID of the element.
Definition CableElBasics.h:82
virtual void CalcMassAndWeight()
Calculates the mass and weight of the element in water.
void AddGravityBuoyancy(double adForceA[3], double adForceB[3], const double adPosA[3], const double adPosB[3])
Adds the forces from gravity and buoyancy to the nodes. CalcFoundation must be run first.
void WaveExcitationPositionJacobian(const double posA[3], const double posB[3], const double acceleration[3], double dF_dpB[9]) const
void DragVelocityJacobian(const double posA[3], const double posB[3], const double velA[3], const double velB[3], const double vFluid[3], double rhoWater, double dFA_dvA[9], double dFA_dvB[9], double dFB_dvA[9], double dFB_dvB[9]) const
virtual void SetConstants()
Calculates parameters and sets physical constants.
double m_tangentialFrictionCoeff
The tangential drag coefficient of the cable element.
Definition CableElBasics.h:89
double GetDampingCoeff() const
Returns the structural damping coefficient (negative value: -2*dampRatio*area*sqrt(E*rho)).
Definition CableElBasics.h:67
double m_rho
The density of the element material.
Definition CableElBasics.h:87
std::string m_cableName
The name of the parent cable.
Definition CableElBasics.h:83
double m_dampingRatio
The relative damping ratio of the cable.
Definition CableElBasics.h:188