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
113class Disk : public SimObject
114{
115public:
116 Disk(const std::string& SimObjectName, ISimObjectCreator* const Creator);
117 ~Disk() override;
118 void FinalSetup(const double T, const double* const X, ISimObjectCreator* const Creator);
120 void PreOdeFcn(double T, const double* X) override;
121 const double* Position(const double T, const double* const X);
122 const double* Velocity(const double T, const double* const X);
123 void OdeFcn(const double T, const double* const X, double* const XDot) const;
124
136 bool HasJacobians() const override;
137 void OdeJacobian(double T, const double* X, double* J, int nStates) override;
138 int GetJacobianSparsity(int nStates, int* rowPtr, int* colIdx) override;
139
141 const environment::wake::BodyWake* Wake() const { return m_flow.Wake(); }
142
143private:
145 environment::disk_hydro::DragFactors DiskDragFactors() const;
146
147 ISignalPort* m_IForce;
148
149 int m_PosIdx;
150 int m_VelIdx;
151
152 double m_DiskD;
153 double m_DiskT;
154 double m_DiskMass;
155 double m_Rho;
156 double m_lift;
157
158 mutable bool m_onSeabed = false;
159 environment::SeafloorForcesInterface* m_seafloor = nullptr;
160
162 double AxialInertiaShare(double fraction) const;
163
171 void ApplyInverseInertia(const double axis[3], double fraction, const double force[3], double acceleration[3]) const;
172
173 double m_axialAddedMass = 0.0;
174
176 const environment::disk_hydro::Disk& Shape() const { return m_caster->Shape(); }
177
178 std::optional<environment::disk_hydro::DiskCaster> m_caster;
179 environment::wake::BodyFlowInteraction m_flow;
180
181#ifdef FH_VISUALIZATION
182public:
183 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator);
184 void RenderUpdate(const double dT, const double* const adX);
185
186private:
187 Ogre::SceneNode* m_Node;
188 Ogre::Entity* m_Entity;
189 Ogre::String m_Material;
190 std::string m_DiskMesh;
191#endif
192};
Definition Disk.h:114
bool HasJacobians() const override
const environment::wake::BodyWake * Wake() const
The wake: null without an Environment or before FinalSetup.
Definition Disk.h:141
void PreOdeFcn(double T, const double *X) override
With CastWake: takes the disk axis from the Force input and rebuilds the wake when due.