FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
Disk.h
1#pragma once
104#include "DiskBase.h"
105
106#include <fhsim/simobject/SimObject.h>
107#include <fhsim_environment/BodyFlowInteraction.h>
108#include <fhsim_environment/SeafloorForcesInterface.h>
109#include <fhsim_environment/hydrodynamics/DiskHydro.h>
110
111#include <optional>
112#include <string>
113
114class Disk : public SimObject
115{
116public:
117 Disk(const std::string& SimObjectName, ISimObjectCreator* const Creator);
118 ~Disk() override;
119 void FinalSetup(const double T, const double* const X, ISimObjectCreator* const Creator);
121 void PreOdeFcn(double T, const double* X) override;
122 const double* Position(const double T, const double* const X);
123 const double* Velocity(const double T, const double* const X);
124 void OdeFcn(const double T, const double* const X, double* const XDot) const;
125
137 bool HasJacobians() const override;
138 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
139 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
140
142 const environment::wake::BodyWake* Wake() const { return m_flow.Wake(); }
143
144private:
146 environment::disk_hydro::DragFactors DiskDragFactors() const;
147
148 ISignalPort* m_IForce;
149
150 int m_PosIdx;
151 int m_VelIdx;
152
153 double m_DiskD;
154 double m_DiskT;
155 double m_DiskMass;
156 double m_Rho;
157 double m_lift;
158
159 mutable bool m_onSeabed = false;
160 environment::SeafloorForcesInterface* m_seafloor = nullptr;
161
163 double AxialInertiaShare(double fraction) const;
164
172 void ApplyInverseInertia(const double axis[3], double fraction, const double force[3], double acceleration[3]) const;
173
174 double m_axialAddedMass = 0.0;
175
177 const environment::disk_hydro::Disk& Shape() const { return m_caster->Shape(); }
178
179 std::optional<environment::disk_hydro::DiskCaster> m_caster;
180 environment::wake::BodyFlowInteraction m_flow;
181
182#ifdef FH_VISUALIZATION
183public:
184 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
185 void RenderUpdate(const double dT, const double* const adX);
186
187private:
188 Ogre::SceneNode* m_Node;
189 Ogre::Entity* m_Entity;
190 Ogre::String m_Material;
191 std::string m_DiskMesh;
192#endif
193};
Definition Disk.h:115
bool HasJacobians() const override
const environment::wake::BodyWake * Wake() const
The wake: null without an Environment or before FinalSetup.
Definition Disk.h:142
void PreOdeFcn(double T, const double *X) override
With CastWake: takes the disk axis from the Force input and rebuilds the wake when due.