5#include "CommonTypes.h"
410#include "NetCableElement.h"
411#include "NetCableElementSpec.h"
412#include "NetElement3N.h"
413#include "NetElementDef.h"
414#include "NetPanelSetup.h"
415#include "NetStructureSpec.h"
416#include "NetFlowInteraction.h"
418#include "sfh/math/math.h"
419#include "sfh/timers/ProfilerWallclock.h"
421#include <fhsim/simobject/SimObject.h>
422#include <fhsim_environment/EnvironmentProvider.h>
423#include <fhsim_environment/SeafloorForcesInterface.h>
428#ifdef FH_VISUALIZATION
429# include "sfh/ogre/C3DLine.h"
430# include "sfh/ogre/NMeshGenerators.h"
442 virtual void OdeFcn(
const double dT,
const double*
const adX,
double*
const adXDot)
const;
443 virtual void InitialConditionSetup(
const double dT,
const double*
const adCurrentIC,
double*
const adUpdatedIC, ISimObjectCreator*
const creator);
444 virtual void FinalSetup(
const double dT,
const double*
const adX, ISimObjectCreator*
const creator);
446 void PreOdeFcn(
double T,
const double* X, IStateUpdater* updater)
override;
447 void AcceptedStep(
const double T,
const double*
const X)
override;
448 const double* outExternalNodeForce(
const double dT,
const double*
const adX,
int extNode);
469 void OdeJacobian(
double T,
const double* X,
double* J,
int nStates)
override;
470 int GetJacobianSparsity(
int nStates,
int* rowPtr,
int* colIdx)
override;
472 bool HasPortJacobians()
const override;
473 void InputPortJacobian(
const std::string& portName,
double T,
const double* X,
474 double* dF_dInput,
int portSize,
int nStates)
override;
481 double* dPort_dX,
int portSize,
int nStates,
int index)
override;
484#ifdef FH_VISUALIZATION
486 virtual void RenderInit(Ogre::Root*
const ogreRoot, ISimObjectCreator*
const creator);
488 virtual void RenderUpdate(
const double dT,
const double*
const adX);
490 const virtual double* NodePos(
const double dT,
const double*
const adX,
int extNode);
491 const virtual double* NodeVel(
const double dT,
const double*
const adX,
int extNode);
492 const virtual double* BottomContact(
const double dT,
const double*
const adX);
494 const virtual double* StrainEnergy(
const double dT,
const double*
const adX);
495 const virtual double* VelNorm(
const double dT,
const double*
const adX);
504 virtual void CalcStateDerivatives(
const double*
const adX,
double*
const adXDot)
const;
505 virtual void AddExternalForces(
const double dT,
const double*
const adX)
const;
506 virtual void AddNetForces(
const double dT,
const double*
const adX)
const;
507 virtual void AddCableForces(
const double dT,
const double*
const adX)
const;
509 void AddNetForceRange(
double T,
const double* X,
int begin,
int end,
double* nodeForce)
const;
512 void AddCableForceRange(
double T,
const double* X,
int begin,
int end,
double* nodeForce,
bool waterFollowsElement =
false)
const;
518 void FlowAt(
double T,
int point,
const double pos[3],
double vel[3])
const;
521 virtual bool AddNodeBottomForce(
const double*
const adX,
int node,
double diam,
double adForceInOut[3])
const;
522 virtual void AddBottomForces(
const double*
const adX)
const;
526 virtual void AddInputPorts(ISimObjectCreator* creator);
527 virtual void CreateNetPanels(std::vector<const NetElementDef*> VNetElementDefs, ISimObjectCreator* creator);
528 virtual void CreateNetCables(std::vector<const NetCableElementSpec*> VCableElements, ISimObjectCreator* creator);
529 virtual void CreateDataStructures();
530 virtual void CreateOutputPorts(ISimObjectCreator* creator);
531 std::string PosPortName(
int extNode)
const;
532 std::string VelPortName(
int extNode)
const;
533 void VelNormJacobian(
const double* X,
double* dPort_dX)
const;
534 void StrainEnergyJacobian(
const double* X,
double* dPort_dX)
const;
535 VSPairStrInt CreateExternalNodeMap(std::string tag,
int* piUsed,
NetStructureSpec& NetSpec, ISimObjectCreator* creator);
536 void PRINTALLNODEFORCES(std::string spec,
double dT);
544 const double pA[3],
const double pB[3],
545 const double vA[3],
const double vB[3],
546 double dFA_dpA[9],
double dFA_dpB[9],
547 double dFA_dvA[9],
double dFA_dvB[9])
const;
556 const double pA[3],
const double pB[3],
557 const double vA[3],
const double vB[3],
558 const double vFluid[3],
double rhoWater,
559 double dFA_dvA[9],
double dFA_dvB[9],
560 double dFB_dvA[9],
double dFB_dvB[9])
const;
562 void ComputeCableDragPositionJacobian(
564 const double pA[3],
const double pB[3],
565 const double vA[3],
const double vB[3],
566 const double vFluid[3],
double rhoWater,
567 double dFA_dpA[9],
double dFA_dpB[9],
568 double dFB_dpA[9],
double dFB_dpB[9])
const;
583 const double pA[3],
const double pB[3],
const double pC[3],
584 const double vA[3],
const double vB[3],
const double vC[3],
585 const double vWater[3],
double addedLinearDrag,
586 double dFA_dpA[9],
double dFA_dpB[9],
double dFA_dpC[9],
587 double dFB_dpA[9],
double dFB_dpB[9],
double dFB_dpC[9],
588 double dFC_dpA[9],
double dFC_dpB[9],
double dFC_dpC[9],
589 double dFA_dvA[9],
double dFA_dvB[9],
double dFA_dvC[9],
590 double dFB_dvA[9],
double dFB_dvB[9],
double dFB_dvC[9],
591 double dFC_dvA[9],
double dFC_dvB[9],
double dFC_dvC[9])
const;
593 double m_StrainEnergy;
598 net_solidity::SolidityModel m_solidityModel = net_solidity::kDefaultSolidityModel;
605 const double*
NodePositionState(
const double* X,
int node)
const {
return X + m_iStatePos[node]; }
607 const double*
NodeVelocityState(
const double* X,
int node)
const {
return X + m_iStateVel[node]; }
608 std::unique_ptr<NetFlowInteraction>
m_flow;
632 int m_numNodesOutputPosAndVel;
635 int m_numNodesOriginal;
637 int m_numNodeOutputs;
646 bool m_hasAcceptedStep =
false;
648 environment::EnvironmentProvider* m_environment;
649 environment::SeafloorForcesInterface* m_seafloor;
656 std::vector<NetElement3N*> m_VpNetElements;
659 int** m_aaiCableConn;
661 bool m_foldingPointRefinementUsed;
668 VSPairStrInt m_VsNodesInputForce;
669 bool m_useTagForExternalNodes;
679#ifdef CNetStructure_DO_PROFILE
680 sfh::timers::ProfilerWallclock m_Profiler;
683#ifdef FH_VISUALIZATION
684 bool m_lineVisualization;
685 C3DLine* m_LineVisualizationPressure;
686 C3DLine* m_LineVisualizationStrain;
Class containing a cable element object, allowing for disks and spheres to be connected.
Definition NetCableElement.h:34
Definition NetElement3N.h:37
Definition NetStructureSpec.h:39
Definition NetStructure.h:436
std::unique_ptr< NetFlowInteraction > m_flow
The wakes cast and received and the water velocity at the panels and cables (MARE-0333); from the con...
Definition NetStructure.h:608
int LocalIndex(int globalStateIndex) const
Definition NetStructure.h:626
void ComputeCableDragVelocityJacobian(const NetCableElement *cable, const double pA[3], const double pB[3], const double vA[3], const double vB[3], const double vFluid[3], double rhoWater, double dFA_dvA[9], double dFA_dvB[9], double dFB_dvA[9], double dFB_dvB[9]) const
void PreOdeFcn(double T, const double *X, IStateUpdater *updater) override
Rebuilds the cast wake when due (with CastWake) and takes the wakes at the panel centroids and cable ...
hydrodynamics::PanelClampLog m_clampLog
Which clamps of the load law the panels have hit; reported once each in PreOdeFcn (MARE-0140).
Definition NetStructure.h:610
virtual ~NetStructure()
The destructor deletes dynamically allocated memory.
void AddCableForceRange(double T, const double *X, int begin, int end, double *nodeForce, bool waterFollowsElement=false) const
int m_numThreads
Threads of the panel and cable loops (NumThreads, R63).
Definition NetStructure.h:673
void OutputPortJacobian(const std::string &portName, double T, const double *X, double *dPort_dX, int portSize, int nStates, int index) override
NetStructure(std::string simObjectName, ISimObjectCreator *creator)
The constructor sets the pointer to the output object and the parser object.
int m_iStateBase
Global index of this SimObject's first state, set in the constructor.
Definition NetStructure.h:618
void FlowAt(double T, int point, const double pos[3], double vel[3]) const
The water velocity at a panel centroid (point = panel) or a cable midpoint (point = number of panels ...
const double * NodeVelocityState(const double *X, int node) const
The velocity of a calculation node, 3 states in X.
Definition NetStructure.h:607
void AddNetAndCableForcesInParallel(double T, const double *X) const
The panel and cable loops on m_numThreads threads, deterministic for a fixed count (owner ruling R63)...
ISignalPort ** m_inExternalForces
Interface member variables.
Definition NetStructure.h:615
void ComputeCableStructuralJacobian(const NetCableElement *cable, const double pA[3], const double pB[3], const double vA[3], const double vB[3], double dFA_dpA[9], double dFA_dpB[9], double dFA_dvA[9], double dFA_dvB[9]) const
bool HasJacobians() const override
std::vector< NetCableElement * > m_VpCableElements
Element properties.
Definition NetStructure.h:655
void CableHydrodynamicForce(double T, const double *X, double force[3]) const
The sum of the cables' hydrodynamic forces on the nodes, N (MARE-0141); for the wake caster's log.
void ComputePanelJacobianAD(const NetElement3N *panel, const double pA[3], const double pB[3], const double pC[3], const double vA[3], const double vB[3], const double vC[3], const double vWater[3], double addedLinearDrag, double dFA_dpA[9], double dFA_dpB[9], double dFA_dpC[9], double dFB_dpA[9], double dFB_dpB[9], double dFB_dpC[9], double dFC_dpA[9], double dFC_dpB[9], double dFC_dpC[9], double dFA_dvA[9], double dFA_dvB[9], double dFA_dvC[9], double dFB_dvA[9], double dFB_dvB[9], double dFB_dvC[9], double dFC_dvA[9], double dFC_dvB[9], double dFC_dvC[9]) const
double m_bottomContactTimeConstant
Time constant of that filter [s].
Definition NetStructure.h:644
void SetAddedDragPerMPS(double AddedDragPerMPS)
void AddNetForceRange(double T, const double *X, int begin, int end, double *nodeForce) const
Adds the loads of panels [begin, end) to nodeForce (3 per node).
const double * NodePositionState(const double *X, int node) const
The position of a calculation node, 3 states in X.
Definition NetStructure.h:605
std::vector< double > m_threadNodeForces
One node-force buffer per chunk of the parallel loops, set in FinalSetup.
Definition NetStructure.h:674
int m_numNodesInputForce
Node counts.
Definition NetStructure.h:631
void UpdateNodeWaveVelocities(double T, const double *X, int stateBase, int begin, int end) const
Sets m_nodeWaveVelocity of nodes [begin, end) at state X, positions at X + m_iStatePos - stateBase (R...
double m_bottomContact[6]
Environment.
Definition NetStructure.h:642
double m_lastAcceptedTime
Time of the last accepted step.
Definition NetStructure.h:645
VSPairStrInt m_VsNodesOutputPosAndVel
Nodes reachable directly through input or output ports.
Definition NetStructure.h:667
std::vector< double > m_nodeWaveVelocity
Definition NetStructure.h:675
bool HasJacobianConfiguration() const
bool m_inBottomContact
Whether AddBottomForces gave an original node a force at the last OdeFcn state.
Definition NetStructure.h:650
double m_bottomContactFiltered[6]
m_bottomContact low-pass filtered at the accepted steps: the BottomContact port (MARE-0355).
Definition NetStructure.h:643
double m_meanTensionTime
The time of the last per-step mean-tension update of the cable elements (owner ruling R64),...
Definition NetStructure.h:677
net_panel_setup::PanelHydrodynamics m_panelHydrodynamics
Panel hydrodynamics (MARE-0094)
Definition NetStructure.h:597
ISimObjectLogger * m_logger
The FhSim log, kept from FinalSetup for the clamp lines.
Definition NetStructure.h:609
Definition NetWakePanels.h:27
Class containing the specification for a net object.
Definition NetStructureSpec.h:24
The panel load law and the fluid shared by all panels of a structure.
Definition NetPanelSetup.h:38