FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
Cable.h
1
140#ifndef CABLE_H
141#define CABLE_H
142#include <fhsim/simobject/StateFrame.h>
143#include <string>
144
145#include <fhsim/simobject/SimObject.h>
146#include <fhsim_environment/ElementFlowInteraction.h>
147#include <fhsim_environment/SeafloorForcesInterface.h>
148#include <optional>
149#include <vector>
150namespace environment
151{
152class EnvironmentProvider;
153}
154class C3DLine;
155
156class CCable : public SimObject
157{
158 public:
170 CCable(const std::string& simObjectName, ISimObjectCreator* const creator);
171
172 ~CCable();
173
186 void OdeFcn(const double T, const double* const X, double* const XDot) const;
187
188
204 void InitialConditionSetup(const double T, const double* const currentIC, double* const updatedIC, ISimObjectCreator* const creator);
205
206 void FinalSetup(const double T, const double* const X, ISimObjectCreator* const creator);
207
216 void PreOdeFcn(const double T, const double* const X) override;
217
218 const double* ForceA(const double T, const double* const X);
219 const double* ForceB(const double T, const double* const X);
220
221 void computeEndForces(const double T, const double* const X) const;
222
229 void computeEndpoints(const double T, const StateFrame& frame) const;
230
231#ifdef FH_VISUALIZATION
232 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
233 void RenderUpdate(const double T, const double* const X);
234#endif
235
236 protected:
257 void computeSegmentForces(const double T, int segment, const double* X, const double* pA, const double* pB, const double* vA, const double* vB, double* FA, double* FB, double waveBound, double* wetOut = nullptr, bool* inSeabedContactOut = nullptr) const;
260 double nodeMass(double wetHalves) const;
271 std::optional<double> surfaceElevation(const double T, const double* pA, const double* pB, double waveBound) const;
283 double wetFraction(const double* pA, const double* pB, std::optional<double> seaElevation, double* dWet_dpA = nullptr, double* dWet_dpB = nullptr) const;
284
285
301 void computeVirtualPoint(const double* const target, const double* const point, const double* const targetVel, const double* const pointVel, double* virtualPoint, double* virtualPointVel, double residual, double dResidual) const;
302
303 void testPositiveParam(double value, ISimObjectCreator* creator, std::string valueName);
304
314 static constexpr int kLiveSegment = -1;
315
317 {
318 double L = 0.0;
319 double Q[3] = {0.0, 0.0, 0.0};
320 double midPosition[3] = {0.0, 0.0, 0.0};
321 double wet = 0.0;
322 double jacobianWet = 0.0;
323 double dWet_dpA[3] = {0.0, 0.0, 0.0};
324 double dWet_dpB[3] = {0.0, 0.0, 0.0};
325 bool hasAcceleration = false;
326 double acceleration[3] = {0.0, 0.0, 0.0};
327 double depth = 0.0;
328 double relativeHeight = 0.0;
329 bool hasCurrent = false;
330 double seabedRamp = 0.0;
331 double current[3] = {0.0, 0.0, 0.0};
332 };
333
336 SegmentSample sampleSegment(const double T, int segment, const double* pA, const double* pB, double waveBound, bool withWetDerivatives) const;
337
339 void segmentForces(const SegmentSample& sample, const double* pA, const double* pB, const double* vA, const double* vB, double* FA, double* FB, double* wetOut = nullptr, bool* inSeabedContactOut = nullptr) const;
340
343 {
344 double dFA_dpA[9], dFA_dpB[9], dFA_dvA[9], dFA_dvB[9];
345 double dFB_dpA[9], dFB_dpB[9], dFB_dvA[9], dFB_dvB[9];
346 };
347
349 void computeSegmentJacobian(const double T, int segment, const double* pA, const double* pB, const double* vA, const double* vB, SegmentJacobian& jac, double waveBound) const;
351 void segmentJacobian(const SegmentSample& sample, const double* pA, const double* pB, const double* vA, const double* vB, SegmentJacobian& jac) const;
352
356 void addSegmentHydrodynamicJacobian(const SegmentSample& sample, const double* vA, const double* vB, SegmentJacobian& jac) const;
357
358 double m_cableLength;
360 double m_Emodulus;
363 double m_diameter;
370
377 int m_stateBase = 0;
378
379 ISignalPort* m_PositionA;
380 ISignalPort* m_PositionB;
381 ISignalPort* m_VelocityA;
382 ISignalPort* m_VelocityB;
387
388 mutable double m_endForceA[3];
389 mutable double m_endForceB[3];
390 mutable double m_nodeForceA[3];
391 mutable double m_nodeForceB[3];
392 mutable double m_wetEndA = 1.0;
393 mutable double m_wetEndB = 1.0;
394 mutable std::vector<double> m_nodeWetHalves;
395 mutable double m_retractedLengthA;
396 mutable double m_retractedLengthB;
397 mutable int m_retractedNodesA;
398 mutable int m_retractedNodesB;
399 mutable double m_virtualPointA[3];
400 mutable double m_virtualPointB[3];
401 mutable double m_virtualPointVelocityA[3];
402 mutable double m_virtualPointVelocityB[3];
403 mutable double m_residualA;
404 mutable double m_residualB;
405 ICommonComputation* m_computeEndForces;
406
407 mutable const double* m_posA;
408 mutable const double* m_posB;
409 mutable const double* m_velA;
410 mutable const double* m_velB;
411
412 environment::wake::ElementFlowInteraction m_flow;
413 environment::EnvironmentProvider* m_environment;
414 environment::SeafloorForcesInterface* m_seafloorForces = nullptr;
415 mutable bool m_endSegmentsInSeabedContact = false;
416 mutable bool m_inSeabedContact = false;
417
418 public:
419 bool HasJacobians() const override;
420 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
421 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
422
423#ifdef FH_VISUALIZATION
424 C3DLine* m_lines1 = nullptr;
425 C3DLine* m_lines2 = nullptr;
426#endif
427};
428#endif
Definition Cable.h:157
void segmentForces(const SegmentSample &sample, const double *pA, const double *pB, const double *vA, const double *vB, double *FA, double *FB, double *wetOut=nullptr, bool *inSeabedContactOut=nullptr) const
computeSegmentForces of a segment already sampled; pA and pB are the positions it was sampled at.
ISignalPort * m_VelocityB
input port. Velocity of point A [m/s]
Definition Cable.h:382
const double * ForceB(const double T, const double *const X)
output port. See PortDefs.h. Returns force at point A
double m_wetEndB
wetted fraction of the segment from virtual point A to the first free node
Definition Cable.h:393
double nodeMass(double wetHalves) const
double m_hydrodynamicDiameter
cable diameter [m]
Definition Cable.h:364
void computeEndForces(const double T, const double *const X) const
output port. See PortDefs.h. Returns force at point B
double m_endForceB[3]
reactive force at endpoint A [N]
Definition Cable.h:389
static constexpr int kLiveSegment
test if a parameter is positive, and reports error if not.
Definition Cable.h:314
environment::EnvironmentProvider * m_environment
m_flow's Environment, from FinalSetup.
Definition Cable.h:413
double wetFraction(const double *pA, const double *pB, std::optional< double > seaElevation, double *dWet_dpA=nullptr, double *dWet_dpB=nullptr) const
void computeEndpoints(const double T, const StateFrame &frame) const
computes free nodes and both end forces
double m_waterDensity
weight of cable underwater [kg/m]
Definition Cable.h:366
environment::wake::ElementFlowInteraction m_flow
Velocity of point B [m].
Definition Cable.h:412
double m_submergedWeight
effective hydrodynamic diameter [m]
Definition Cable.h:365
double m_segmentStiffness
length of spring between elements [m]
Definition Cable.h:374
const double * m_posA
computation node for endpoint reaction forces
Definition Cable.h:407
ISignalPort * m_retractedSpeedPortB
retraction rate at endpoint A [m/s]
Definition Cable.h:386
double m_wetEndA
force on first free node at endpoint A [N]
Definition Cable.h:392
double m_segmentMass
mass of each free node: its two half-segments, one segment's mass (R96) [kg]
Definition Cable.h:371
void OdeFcn(const double T, const double *const X, double *const XDot) const
free allocated memory
void computeSegmentJacobian(const double T, int segment, const double *pA, const double *pB, const double *vA, const double *vB, SegmentJacobian &jac, double waveBound) const
Computes the derivatives of all forces computeSegmentForces differentiates: structural and drag.
double m_elementMass
number of elements in the cable [#]
Definition Cable.h:369
ISignalPort * m_PositionB
input port. Position of point A [m]
Definition Cable.h:380
double m_retractedLengthA
per node, the summed wetted fractions of its two half-segments
Definition Cable.h:395
void computeSegmentForces(const double T, int segment, const double *X, const double *pA, const double *pB, const double *vA, const double *vB, double *FA, double *FB, double waveBound, double *wetOut=nullptr, bool *inSeabedContactOut=nullptr) const
Computes all forces acting on an element.
double m_virtualPointVelocityB[3]
when cable is winched, the closest free node is attracted towards a ghost point "beyond" the actual e...
Definition Cable.h:402
double m_Emodulus
cable weight [kg/m]
Definition Cable.h:360
double waveInertiaCoefficient() const
(1 + Ca) rho A L of a segment, the factor of the wave excitation on the normal particle acceleration ...
void segmentJacobian(const SegmentSample &sample, const double *pA, const double *pB, const double *vA, const double *vB, SegmentJacobian &jac) const
computeSegmentJacobian of a segment sampled with the wetted fraction's derivatives.
void InitialConditionSetup(const double T, const double *const currentIC, double *const updatedIC, ISimObjectCreator *const creator)
Sets initial conditions based on the value of input ports.
void PreOdeFcn(const double T, const double *const X) override
retrieves pointer to environment object
double m_virtualPointVelocityA[3]
when cable is winched, the closest free node is attracted towards a ghost point "beyond" the actual e...
Definition Cable.h:401
environment::SeafloorForcesInterface * m_seafloorForces
The shared resource SeafloorForces, from FinalSetup.
Definition Cable.h:414
CCable(const std::string &simObjectName, ISimObjectCreator *const creator)
Reads parameters, registers states, input/output ports and shared resources.
double m_virtualPointA[3]
number of nodes currently on winch B
Definition Cable.h:399
double m_virtualPointB[3]
when cable is winched, the closest free node is attracted towards a ghost point "beyond" the actual e...
Definition Cable.h:400
double m_diameter
displaced fluid volume per meter cable [m^2]
Definition Cable.h:363
double m_displacementCrossSectionArea
cross section area of load bearing material [m^2]
Definition Cable.h:362
double m_endForceA[3]
retraction rate at endpoint B [m/s]
Definition Cable.h:388
int m_retractedNodesA
amount of retracted cable at endpoint B [m]
Definition Cable.h:397
int * m_elementVelocityIndex
The relative index of the position state in the state array for each element [#].
Definition Cable.h:376
const double * m_velA
Position of point B [m].
Definition Cable.h:409
double m_tensileCrossSectionArea
Young's modulus of load bearing material [Pa].
Definition Cable.h:361
int m_retractedNodesB
number of nodes currently on winch A
Definition Cable.h:398
void addSegmentHydrodynamicJacobian(const SegmentSample &sample, const double *vA, const double *vB, SegmentJacobian &jac) const
double m_residualB
free length of closest free node [m]
Definition Cable.h:404
double m_residualA
when cable is winched, the closest free node is attracted towards a ghost point "beyond" the actual e...
Definition Cable.h:403
ISignalPort * m_retractedLengthPortA
input port. Velocity of point B [m/s]
Definition Cable.h:383
double m_cableWeight
total cable length [m]
Definition Cable.h:359
ISignalPort * m_retractedSpeedPortA
amount of retracted cable at endpoint B [m]
Definition Cable.h:385
ISignalPort * m_VelocityA
input port. Position of point B [m]
Definition Cable.h:381
int * m_elementPositionIndex
spring stiffness [N/m]
Definition Cable.h:375
bool m_inSeabedContact
Whether any segment was in contact at the last OdeFcn: the cable has no Jacobian then.
Definition Cable.h:416
int m_numElements
structural axial damping. [N*s/m]
Definition Cable.h:368
std::optional< double > surfaceElevation(const double T, const double *pA, const double *pB, double waveBound) const
double m_internalDamping
water density, the parameter Rho [kg/m^3]
Definition Cable.h:367
std::vector< double > m_nodeWetHalves
wetted fraction of the segment from the last free node to virtual point B
Definition Cable.h:394
double m_nodeForceB[3]
force on first free node at endpoint A [N]
Definition Cable.h:391
double m_retractedLengthB
amount of retracted cable at endpoint A [m]
Definition Cable.h:396
const double * m_velB
Velocity of point A [m].
Definition Cable.h:410
void computeVirtualPoint(const double *const target, const double *const point, const double *const targetVel, const double *const pointVel, double *virtualPoint, double *virtualPointVel, double residual, double dResidual) const
Computes position and velocity of the virtual point.
ISignalPort * m_retractedLengthPortB
amount of retracted cable at endpoint A [m]
Definition Cable.h:384
double m_segmentSubmergedMass
mass of each segment [kg]
Definition Cable.h:372
const double * m_posB
Position of point A [m].
Definition Cable.h:408
int m_stateBase
The relative index of the velocity state in the state array for each element [#].
Definition Cable.h:377
double m_segmentLength
submerged weight of each element [kg]
Definition Cable.h:373
ICommonComputation * m_computeEndForces
free length of closest free node [m]
Definition Cable.h:405
bool m_endSegmentsInSeabedContact
Whether either end segment was in contact at the last end-force computation.
Definition Cable.h:415
double m_nodeForceA[3]
reactive force at endpoint A [N]
Definition Cable.h:390
SegmentSample sampleSegment(const double T, int segment, const double *pA, const double *pB, double waveBound, bool withWetDerivatives) const
Derivatives of one segment's node forces FA and FB, each a row-major [3 x 3] matrix.
Definition Cable.h:343
Definition Cable.h:317
bool hasAcceleration
Whether there are waves and the environment gave an acceleration.
Definition Cable.h:325
bool hasCurrent
Whether the current was sampled: relativeHeight > -1.
Definition Cable.h:329
double dWet_dpA[3]
Only when sampled with the wetted fraction's derivatives.
Definition Cable.h:323
double wet
The wetted fraction the forces take.
Definition Cable.h:321
double jacobianWet
The wetted fraction the Jacobian takes, that of dWet_dpA and dWet_dpB; wet without them.
Definition Cable.h:322