5#include "CommonTypes.h"
409#include "NetBottomContactFilter.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 const double* outExternalNodeForce(
const double dT,
const double*
const adX,
int extNode);
468 void OdeJacobian(
double T,
const double* X,
double* J,
int nStates)
override;
469 int GetJacobianSparsity(
int nStates,
int* rowPtr,
int* colIdx)
override;
471 bool HasPortJacobians()
const override;
472 void InputPortJacobian(
const std::string& portName,
double T,
const double* X,
473 double* dF_dInput,
int portSize,
int nStates)
override;
480 double* dPort_dX,
int portSize,
int nStates,
int index)
override;
483#ifdef FH_VISUALIZATION
485 virtual void RenderInit(Ogre::Root*
const ogreRoot, ISimObjectCreator*
const creator);
487 virtual void RenderUpdate(
const double dT,
const double*
const adX);
489 const virtual double* NodePos(
const double dT,
const double*
const adX,
int extNode);
490 const virtual double* NodeVel(
const double dT,
const double*
const adX,
int extNode);
491 const virtual double* BottomContact(
const double dT,
const double*
const adX);
493 const virtual double* StrainEnergy(
const double dT,
const double*
const adX);
494 const virtual double* VelNorm(
const double dT,
const double*
const adX);
503 virtual void CalcStateDerivatives(
const double*
const adX,
double*
const adXDot)
const;
504 virtual void AddExternalForces(
const double dT,
const double*
const adX)
const;
505 virtual void AddNetForces(
const double dT,
const double*
const adX)
const;
506 virtual void AddCableForces(
const double dT,
const double*
const adX)
const;
508 void AddNetForceRange(
double T,
const double* X,
int begin,
int end,
double* nodeForce)
const;
511 void AddCableForceRange(
double T,
const double* X,
int begin,
int end,
double* nodeForce,
bool waterFollowsElement =
false)
const;
517 void FlowAt(
double T,
int point,
const double pos[3],
double vel[3])
const;
520 virtual bool AddNodeBottomForce(
const double*
const adX,
int node,
double diam,
double adForceInOut[3])
const;
521 virtual void AddBottomForces(
const double*
const adX)
const;
525 virtual void AddInputPorts(ISimObjectCreator* creator);
526 virtual void CreateNetPanels(std::vector<const NetElementDef*> VNetElementDefs, ISimObjectCreator* creator);
527 virtual void CreateNetCables(std::vector<const NetCableElementSpec*> VCableElements, ISimObjectCreator* creator);
528 virtual void CreateDataStructures();
529 virtual void CreateOutputPorts(ISimObjectCreator* creator);
530 std::string PosPortName(
int extNode)
const;
531 std::string VelPortName(
int extNode)
const;
532 void VelNormJacobian(
const double* X,
double* dPort_dX)
const;
533 void StrainEnergyJacobian(
const double* X,
double* dPort_dX)
const;
534 VSPairStrInt CreateExternalNodeMap(std::string tag,
int* piUsed,
NetStructureSpec& NetSpec, ISimObjectCreator* creator);
535 void PRINTALLNODEFORCES(std::string spec,
double dT);
543 const double pA[3],
const double pB[3],
544 const double vA[3],
const double vB[3],
545 double dFA_dpA[9],
double dFA_dpB[9],
546 double dFA_dvA[9],
double dFA_dvB[9])
const;
555 const double pA[3],
const double pB[3],
556 const double vA[3],
const double vB[3],
557 const double vFluid[3],
double rhoWater,
558 double dFA_dvA[9],
double dFA_dvB[9],
559 double dFB_dvA[9],
double dFB_dvB[9])
const;
561 void ComputeCableDragPositionJacobian(
563 const double pA[3],
const double pB[3],
564 const double vA[3],
const double vB[3],
565 const double vFluid[3],
double rhoWater,
566 double dFA_dpA[9],
double dFA_dpB[9],
567 double dFB_dpA[9],
double dFB_dpB[9])
const;
582 const double pA[3],
const double pB[3],
const double pC[3],
583 const double vA[3],
const double vB[3],
const double vC[3],
584 const double vWater[3],
double addedLinearDrag,
585 double dFA_dpA[9],
double dFA_dpB[9],
double dFA_dpC[9],
586 double dFB_dpA[9],
double dFB_dpB[9],
double dFB_dpC[9],
587 double dFC_dpA[9],
double dFC_dpB[9],
double dFC_dpC[9],
588 double dFA_dvA[9],
double dFA_dvB[9],
double dFA_dvC[9],
589 double dFB_dvA[9],
double dFB_dvB[9],
double dFB_dvC[9],
590 double dFC_dvA[9],
double dFC_dvB[9],
double dFC_dvC[9])
const;
592 double m_StrainEnergy;
597 net_solidity::SolidityModel m_solidityModel = net_solidity::kDefaultSolidityModel;
604 const double*
NodePositionState(
const double* X,
int node)
const {
return X + m_iStatePos[node]; }
606 const double*
NodeVelocityState(
const double* X,
int node)
const {
return X + m_iStateVel[node]; }
607 std::unique_ptr<NetFlowInteraction>
m_flow;
631 int m_numNodesOutputPosAndVel;
634 int m_numNodesOriginal;
636 int m_numNodeOutputs;
644 environment::EnvironmentProvider* m_environment;
645 environment::SeafloorForcesInterface* m_seafloor;
652 std::vector<NetElement3N*> m_VpNetElements;
655 int** m_aaiCableConn;
657 bool m_foldingPointRefinementUsed;
664 VSPairStrInt m_VsNodesInputForce;
665 bool m_useTagForExternalNodes;
675#ifdef CNetStructure_DO_PROFILE
676 sfh::timers::ProfilerWallclock m_Profiler;
679#ifdef FH_VISUALIZATION
680 bool m_lineVisualization;
681 C3DLine* m_LineVisualizationPressure;
682 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:37
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:607
int LocalIndex(int globalStateIndex) const
Definition NetStructure.h:625
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:609
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:669
void OutputPortJacobian(const std::string &portName, double T, const double *X, double *dPort_dX, int portSize, int nStates, int index) override
NetBottomContactFilter m_BottomContactFilter
Environment.
Definition NetStructure.h:641
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:617
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:606
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:614
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:651
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
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:604
std::vector< double > m_threadNodeForces
One node-force buffer per chunk of the parallel loops, set in FinalSetup.
Definition NetStructure.h:670
int m_numNodesInputForce
Node counts.
Definition NetStructure.h:630
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]
The summed seafloor force [N] and its moment about the NED origin [N m] at the last OdeFcn state (MAR...
Definition NetStructure.h:642
VSPairStrInt m_VsNodesOutputPosAndVel
Nodes reachable directly through input or output ports.
Definition NetStructure.h:663
std::vector< double > m_nodeWaveVelocity
Definition NetStructure.h:671
bool HasJacobianConfiguration() const
bool m_inBottomContact
Whether AddBottomForces gave an original node a force at the last OdeFcn state.
Definition NetStructure.h:646
double m_meanTensionTime
The time of the last per-step mean-tension update of the cable elements (owner ruling R64),...
Definition NetStructure.h:673
net_panel_setup::PanelHydrodynamics m_panelHydrodynamics
Panel hydrodynamics (MARE-0094)
Definition NetStructure.h:596
ISimObjectLogger * m_logger
The FhSim log, kept from FinalSetup for the clamp lines.
Definition NetStructure.h:608
Definition NetWakePanels.h:27
Class containing the specification for a net object.
Definition NetStructureSpec.h:22
The panel load law and the fluid shared by all panels of a structure.
Definition NetPanelSetup.h:38