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
406// #define CNetStructure_DO_PROFILE
407
408// Includes
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"
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 const double* outExternalNodeForce(const double dT, const double* const adX, int extNode);
448
450
467 bool HasJacobians() const override;
468 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
469 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
470
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;
479 void OutputPortJacobian(const std::string& portName, double T, const double* X,
480 double* dPort_dX, int portSize, int nStates, int index) override;
482
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);
488#endif
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);
492
493 const virtual double* StrainEnergy(const double dT, const double* const adX);
494 const virtual double* VelNorm(const double dT, const double* const adX);
495 double m_velNorm;
496
500 void SetAddedDragPerMPS(double AddedDragPerMPS);
501
502protected:
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;
513 void CableHydrodynamicForce(double T, const double* X, double force[3]) const;
515 void AddNetAndCableForcesInParallel(double T, const double* X) const;
517 void FlowAt(double T, int point, const double pos[3], double vel[3]) const;
519 void UpdateNodeWaveVelocities(double T, const double* X, int stateBase, int begin, int end) 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);
536
542 const NetCableElement* cable,
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;
547
554 const NetCableElement* cable,
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;
560
561 void ComputeCableDragPositionJacobian(
562 const NetCableElement* cable,
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;
568
581 const NetElement3N* panel,
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;
591
592 double m_StrainEnergy;
593
595
597 net_solidity::SolidityModel m_solidityModel = net_solidity::kDefaultSolidityModel;
599
601
602 template<class> friend class NetWakePanels;
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;
608 ISimObjectLogger* m_logger = nullptr;
609 hydrodynamics::PanelClampLog m_clampLog;
611
613
614 ISignalPort** m_inExternalForces;
615 int* m_iStatePos;
616 int* m_iStateVel;
617 int m_iStateBase = 0;
618
625 int LocalIndex(int globalStateIndex) const { return globalStateIndex - m_iStateBase; }
627 // double* m_NodeExternalForces;
629
631 int m_numNodesOutputPosAndVel;
632 int m_numPanelsCalc;
633 int m_numCablesCalc;
634 int m_numNodesOriginal;
635 int m_numNodesCalc;
636 int m_numNodeOutputs;
638
640
642 mutable double m_bottomContact[6];
643
644 environment::EnvironmentProvider* m_environment;
645 environment::SeafloorForcesInterface* m_seafloor;
646 mutable bool m_inBottomContact = false;
648
650
651 std::vector<NetCableElement*> m_VpCableElements;
652 std::vector<NetElement3N*> m_VpNetElements;
653 float* m_inertia;
654 int* m_netConn;
655 int** m_aaiCableConn;
656 SAdaptationSpec_t m_SAdaptations;
657 bool m_foldingPointRefinementUsed;
659
660
662
664 VSPairStrInt m_VsNodesInputForce;
665 bool m_useTagForExternalNodes;
667
668 double* m_nodeForce;
669 int m_numThreads = 1;
670 mutable std::vector<double> m_threadNodeForces;
671 mutable std::vector<double> m_nodeWaveVelocity;
673 double m_meanTensionTime = std::numeric_limits<double>::quiet_NaN();
674
675#ifdef CNetStructure_DO_PROFILE
676 sfh::timers::ProfilerWallclock m_Profiler;
677#endif
678
679#ifdef FH_VISUALIZATION
680 bool m_lineVisualization;
681 C3DLine* m_LineVisualizationPressure;
682 C3DLine* m_LineVisualizationStrain;
683#endif
684};
Definition NetBottomContactFilter.h:7
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