Marine systems simulation
CCable Class Reference

#include <CCable.h>

+ Inheritance diagram for CCable:
+ Collaboration diagram for CCable:

Public Member Functions

 CCable (const string &simObjectName, ISimObjectCreator *const creator)
 Reads parameters, registers states, input/output ports and shared resources. More...
 
void OdeFcn (const double T, const double *const X, double *const XDot, const bool bIsMajorTimeStep)
 free allocated memory More...
 
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. More...
 
void FinalSetup (const double T, const double *const X, ISimObjectCreator *const creator)
 
const double * ForceA (const double T, const double *const X)
 retrieves pointer to environment object
 
const double * ForceB (const double T, const double *const X)
 output port. See PortDefs.h. Returns force at point A
 
void computeEndForces (const double T, const double *const X)
 output port. See PortDefs.h. Returns force at point B
 
 CCable (std::string sSimObjectName, ISimObjectCreator *pCreator)
 The constructor sets the pointer to the output object and the parser object.
 
 ~CCable ()
 The destructor deletes dynamically allocated memory.
 
void OdeFcn (const double dT, const double *const adX, double *const adXDot, const bool bIsMajorTimeStep)
 
void InitialConditionSetup (const double dT, const double *const adCurrentIC, double *const adUpdatedIC, ISimObjectCreator *const pCreator)
 functionality for setting initialconditions based on input port results.
 
void FinalSetup (const double dT, const double *const adX, ISimObjectCreator *const pCreator)
 
void CalcOutput (const double dT, const double *const adX)
 
const double * OutForceA (const double dT, const double *const adX)
 
const double * OutForceB (const double dT, const double *const adX)
 
const double * OutPosA (const double dT, const double *const adX)
 
const double * OutPosB (const double dT, const double *const adX)
 

Protected Member Functions

void computeSegmentForces (const double T, const double *X, const double *pA, const double *pB, const double *vA, const double *vB, double *FA, double *FB)
 computes free nodes and both end forces More...
 
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)
 Computes position and velocity of the virtual point. More...
 
void testPositiveParam (double value, ISimObjectCreator *creator, string valueName)
 
void computeElementTension (const double *prev, const double *curr, double *force)
 test if a parameter is positive, and reports error if not.
 
void UpdateLength (double dNewLength, double dDeltaT)
 
void UpdateStiffness (const double *const adForceA, const double *const adForceB)
 Updates the stiffness of the cable to ensure that this is not too large.
 
void UpdateInertia ()
 Updates the inertia of the cable according to the changing length.
 

Protected Attributes

double m_cableLength
 compute structural tension for a single element
 
double m_cableWeight
 total cable length [m]
 
double m_Emodulus
 cable weight [kg/m]
 
double m_tensileCrossSectionArea
 Young's modulus of load bearing material [Pa].
 
double m_displacementCrossSectionArea
 cross section area of load bearing material [m^2]
 
double m_diameter
 displaced fluid volume per meter cable [m^2]
 
double m_hydrodynamicDiameter
 cable diameter [m]
 
double m_submergedWeight
 effective hydrodynamic diameter [m]
 
double m_internalDamping
 weight of cable underwater [kg/m]
 
int m_numElements
 structural axial damping. [N*s/m]
 
double m_elementMass
 number of elements in the cable [#]
 
double m_elementMassInverse
 mass of each element [kg]
 
double m_segmentMass
 inverse mass of each element [kg^-1]
 
double m_segmentSubmergedMass
 mass of each segment [kg]
 
double m_segmentLength
 submerged weight of each element [kg]
 
double m_segmentStiffness
 length of spring between elements [m]
 
int * m_elementPositionIndex
 spring stiffness [N/m]
 
int * m_elementVelocityIndex
 The relative index of the position state in the state array for each element [#].
 
ISignalPort * m_PositionA
 The relative index of the velocity state in the state array for each element [#].
 
ISignalPort * m_PositionB
 input port. Position of point A [m]
 
ISignalPort * m_VelocityA
 input port. Position of point B [m]
 
ISignalPort * m_VelocityB
 input port. Velocity of point A [m/s]
 
ISignalPort * m_retractedLengthPortA
 input port. Velocity of point B [m/s]
 
ISignalPort * m_retractedLengthPortB
 amount of retracted cable at endpoint A [m]
 
ISignalPort * m_retractedSpeedPortA
 amount of retracted cable at endpoint B [m]
 
ISignalPort * m_retractedSpeedPortB
 retraction rate at endpoint A [m/s]
 
double m_endForceA [3]
 retraction rate at endpoint B [m/s]
 
double m_endForceB [3]
 reactive force at endpoint A [N]
 
double m_nodeForceA [3]
 reactive force at endpoint A [N]
 
double m_nodeForceB [3]
 force on first free node at endpoint A [N]
 
double m_retractedLengthA
 force on first free node at endpoint A [N]
 
double m_retractedLengthB
 amount of retracted cable at endpoint A [m]
 
int m_retractedNodesA
 amount of retracted cable at endpoint B [m]
 
int m_retractedNodesB
 number of nodes currently on winch A
 
double m_virtualPointA [3]
 number of nodes currently on winch B
 
double m_virtualPointB [3]
 when cable is winched, the closest free node is attracted towards a ghost point "beyond" the actual endpoint [m]
 
double m_virtualPointVelocityA [3]
 when cable is winched, the closest free node is attracted towards a ghost point "beyond" the actual endpoint [m]
 
double m_virtualPointVelocityB [3]
 when cable is winched, the closest free node is attracted towards a ghost point "beyond" the actual endpoint [m/s]
 
double m_residualA
 when cable is winched, the closest free node is attracted towards a ghost point "beyond" the actual endpoint [m/s]
 
double m_residualB
 free length of closest free node [m]
 
ICommonComputation * m_computeEndForces
 free length of closest free node [m]
 
const double * m_posA
 computation node for endpoint reaction forces
 
const double * m_posB
 Position of point A [m].
 
const double * m_velA
 Position of point B [m].
 
const double * m_velB
 Velocity of point A [m].
 
CEnvironmentm_environment
 Velocity of point B [m].
 
ISignalPort * m_pInLength
 The cable length input port.
 
ISignalPort * m_pInVelA
 The velocity A input port.
 
ISignalPort * m_pInVelB
 The velocity B input port.
 
ISignalPort * m_pInPosA
 The position A input port.
 
ISignalPort * m_pInPosB
 The position B input port.
 
int m_IStates
 The index to the internal states of the cable.
 
ICommonComputation * m_pCommonCalc
 Calculations necessary for more than one output port.
 
int m_iNumElements
 The number of elements to divide the cable into.
 
int m_iNumNodes
 The number of nodes of the cable.
 
double m_dInertiaA
 The inertia of the end A.
 
double m_dInertiaB
 The inertia of the end B.
 
double m_adForceA [3]
 The force on the end A.
 
double m_adForceB [3]
 The force on the end B.
 
double * m_adLengths
 The lengths of the cable elements.
 
std::string m_sCableName
 The identification name of the cable;.
 
CInternalCableWithBottomContactm_pInternalCable
 
SCableSpec m_CableSpec
 The cable specification.
 
IBasicBottom ** m_ppBottom
 
ICurrentVel ** m_ppCurrentVel
 

Detailed Description

This class simulates a cable object consisting of one or more elements. Each element is of type CCableElDynStiff. Each element has methods to make it possible to use larger time steps in the integration. This is done by decreasing the stiffness of the element until the eigenfrequency of the element is low enough for the integration to be performed with the defined maximum step size.

Each element is regarded as a straight segment, responsible for calculating the forces acting on each of its ends, as well as the mass associated with each end node. The forces and mass from each element is added to the corresponding nodes of the cable, and the acceleration of each node is calculated in the OdeFcn.

The cable is influenced by:

  • Internal stiffness
  • Internal damping
  • Hydrodynamic normal and tangential forces
  • Buoyancy and gravity
  • Added mass

The calculation of these forces are more thoroughly explained in CCableElDynStiff.

Properties
PropertyDefaultComment
NumElements2The number of cable elements.
Length100Not used, as it is now read from an input port.
Density-The density of the cable (kg/m^3).
NumericalDamping0Added numerical damping on each node. The damping force is calculated as \(\vec F_i = -k m_i \vec v_i\), where \(\vec F_i\) is the added damping force, \(k\) is the numerical damping factor, \(m_i\) is the node inertia and \(\vec v_i\) is the velocity of the node.
Diameter-The diameter of the cable.
E-The Young's modulus (elasticity) of the cable.
DampingRatio1The relative axial damping of the cable. 0 is no damping, 1 is critical damping.
FluidRho1025The density of the ambient fluid.
MaxStepLength0.01Controls the stiffness of the cable to allow integration with step lengths up to this value.
MaxTension-The maximum tension. If above this value, the tension is set to this this value.
MaxAcceleration1000The maximum acceleration. If above this value, the acceleration is set to this this value.
StepSafetyFactor50A safety factor between the MaxStepLength and the one used for calculating the stiffness of the cable.
MeanTension0Possibility to add a mean tension to correct for decreased stiffness of the cable.
AdaptationPeriod0If above zero, this tells the cable to correct its initial length to avoid length errors because of decreased stiffness.
MaterialNameTrawl/Wire2The material to use for visualizing the cable.
NumFaces5The number of planes to visualize the cable surface.
DrawScale2The scale of the visual appearance of the cable. This is used to make it more visible.
Input ports
TagSizeComment
Length1The length of the cable.
PosA3The position of end A.
PosB3The position of end B.
VelA3The velocity of end A.
VelB3The velocity of end B.
VelWater3The velocity of the water.
Output ports
TagSizeComment
ForceA3The force from end A of the cable.
ForceB3The force from end B of the cable.
PosA3The position of end A.
PosB3The position of end B.
Revision history:
  • 24.07.2007 KJR: Initial version.
  • 24.11.2010 KJR: Added some class documentation.

Constructor & Destructor Documentation

◆ CCable()

CCable::CCable ( const string &  simObjectName,
ISimObjectCreator *const  creator 
)

This constructor performs all initial setup for a point mass simobject. Reading in parameters, setting up communication interface i.e. output ports, input ports, and states, plus additional 'one time only' resource setup.

Parameters
[in]simObjectName-> The name of the simobject. Used primarily by superclass constructor
[in]creator-> Retrieve parameters. Register states, ports and shared resources

Member Function Documentation

◆ computeSegmentForces()

void CCable::computeSegmentForces ( const double  T,
const double *  X,
const double *  pA,
const double *  pB,
const double *  vA,
const double *  vB,
double *  FA,
double *  FB 
)
protected

Computes all forces acting on an element

Computes structural and environmental forces acting on an element i.e. the cable length between two cable nodes, and distributes the total force on the two nodes.

Parameters
[in]T-> current simulation time
[in]X-> current simulation state
[in]pA-> position of element A
[in]pB-> position of element B
[in]vA-> velocity of element A
[in]vB-> velocity of element B
[out]FA-> force on element A
[out]FB-> force on element B

◆ computeVirtualPoint()

void CCable::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 
)
protected

Winch functionality is implemented by pulling the closest free node towards a virtual point rather than the actual endpoint.

Parameters
[in]target-> actual endpoint position
[in]point-> position of free node
[in]targetVel-> actual endpoint velocity
[in]pointVel-> velocity of free node
[in]residual-> free element length
[in]dResidual-> rate of change in free element length
[out]virtualPoint-> position of virtual point
[out]virtualPointVel-> velocity of virtual point

◆ InitialConditionSetup()

void CCable::InitialConditionSetup ( const double  T,
const double *const  currentIC,
double *const  updatedIC,
ISimObjectCreator *const  creator 
)

Sets initial conditions based on the value of input ports. Element positions of free nodes are equally distributed between endpoint positions. Element Velocity are linearly interpolated between endpoint velocity

Parameters
[in]T-> The time at the beginning of the simulation. Usually but not necessarily zero
[in]currentIC-> Array of initial conditions. If the value is QNAN, the value is not set yet and can be set by the SimObject, otherwise the value is set, and can not be changed. Trying to change an already set value will trigger an error
[in]creator-> Report back to creator if output port are not ready
[out]updatedIC-> Array of ONAN. Any initial condition that are ready to be set, should be written to this array.

◆ OdeFcn()

void CCable::OdeFcn ( const double  T,
const double *const  X,
double *const  XDot,
const bool  bIsMajorTimeStep 
)

Computes object derivatives as a function of time, states and input ports

Returns state derivatives. Velocity as derivative of position, external-force/mass and gravity as derivative of velocity. Adjusts position of not-free nodes.

Parameters
[in]T-> current simulation time
[in]X-> current simulation state
[out]XDot-> state derivatives
[in]bIsMajorTimeStep-> Is this a major time step?

The documentation for this class was generated from the following files: