FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
NetStructure.h
1#pragma once
2
3#include <limits>
4#include <vector>
5#include "CommonTypes.h"
6
407// #define CNetStructure_DO_PROFILE
408
409// Includes
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"
417
418#include "sfh/math/math.h"
419#include "sfh/timers/ProfilerWallclock.h"
420
421#include <fhsim/simobject/SimObject.h>
422#include <fhsim_environment/EnvironmentProvider.h>
423#include <fhsim_environment/SeafloorForcesInterface.h>
424#include <memory>
425#include <string>
426
427
428#ifdef FH_VISUALIZATION
429# include "sfh/ogre/C3DLine.h"
430# include "sfh/ogre/NMeshGenerators.h"
431#endif
432
433
434// Class definition
435class NetStructure : public SimObject
436{
437public:
439 NetStructure(std::string simObjectName, ISimObjectCreator* creator);
441 virtual ~NetStructure();
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);
449
451
468 bool HasJacobians() const override;
469 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
470 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
471
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;
480 void OutputPortJacobian(const std::string& portName, double T, const double* X,
481 double* dPort_dX, int portSize, int nStates, int index) override;
483
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);
489#endif
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);
493
494 const virtual double* StrainEnergy(const double dT, const double* const adX);
495 const virtual double* VelNorm(const double dT, const double* const adX);
496 double m_velNorm;
497
501 void SetAddedDragPerMPS(double AddedDragPerMPS);
502
503protected:
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;
514 void CableHydrodynamicForce(double T, const double* X, double force[3]) const;
516 void AddNetAndCableForcesInParallel(double T, const double* X) const;
518 void FlowAt(double T, int point, const double pos[3], double vel[3]) const;
520 void UpdateNodeWaveVelocities(double T, const double* X, int stateBase, int begin, int end) 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);
537
543 const NetCableElement* cable,
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;
548
555 const NetCableElement* cable,
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;
561
562 void ComputeCableDragPositionJacobian(
563 const NetCableElement* cable,
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;
569
582 const NetElement3N* panel,
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;
592
593 double m_StrainEnergy;
594
596
598 net_solidity::SolidityModel m_solidityModel = net_solidity::kDefaultSolidityModel;
600
602
603 template<class> friend class NetWakePanels;
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;
609 ISimObjectLogger* m_logger = nullptr;
610 hydrodynamics::PanelClampLog m_clampLog;
612
614
615 ISignalPort** m_inExternalForces;
616 int* m_iStatePos;
617 int* m_iStateVel;
618 int m_iStateBase = 0;
619
626 int LocalIndex(int globalStateIndex) const { return globalStateIndex - m_iStateBase; }
628 // double* m_NodeExternalForces;
630
632 int m_numNodesOutputPosAndVel;
633 int m_numPanelsCalc;
634 int m_numCablesCalc;
635 int m_numNodesOriginal;
636 int m_numNodesCalc;
637 int m_numNodeOutputs;
639
641
642 mutable double m_bottomContact[6];
643 double m_bottomContactFiltered[6] = {};
645 double m_lastAcceptedTime = 0.0;
646 bool m_hasAcceptedStep = false;
647
648 environment::EnvironmentProvider* m_environment;
649 environment::SeafloorForcesInterface* m_seafloor;
650 mutable bool m_inBottomContact = false;
652
654
655 std::vector<NetCableElement*> m_VpCableElements;
656 std::vector<NetElement3N*> m_VpNetElements;
657 float* m_inertia;
658 int* m_netConn;
659 int** m_aaiCableConn;
660 SAdaptationSpec_t m_SAdaptations;
661 bool m_foldingPointRefinementUsed;
663
664
666
668 VSPairStrInt m_VsNodesInputForce;
669 bool m_useTagForExternalNodes;
671
672 double* m_nodeForce;
673 int m_numThreads = 1;
674 mutable std::vector<double> m_threadNodeForces;
675 mutable std::vector<double> m_nodeWaveVelocity;
677 double m_meanTensionTime = std::numeric_limits<double>::quiet_NaN();
678
679#ifdef CNetStructure_DO_PROFILE
680 sfh::timers::ProfilerWallclock m_Profiler;
681#endif
682
683#ifdef FH_VISUALIZATION
684 bool m_lineVisualization;
685 C3DLine* m_LineVisualizationPressure;
686 C3DLine* m_LineVisualizationStrain;
687#endif
688};
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